ERC-721
Overview
Max Total Supply
0 DVT
Holders
396
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 DVTLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Davitar
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-13 */ // Sources flattened with hardhat v2.9.7 https://hardhat.org // File @openzeppelin/contracts/utils/introspection/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}( data ); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require( owner != address(0), "ERC721: balance query for the zero address" ); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require( owner != address(0), "ERC721: owner query for nonexistent token" ); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require( _exists(tokenId), "ERC721: approved query for nonexistent token" ); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require( _exists(tokenId), "ERC721: operator query for nonexistent token" ); address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require( ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner" ); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert( "ERC721: transfer to non ERC721Receiver implementer" ); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721URIStorage: URI query for nonexistent token" ); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require( _exists(tokenId), "ERC721URIStorage: URI set of nonexistent token" ); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File @openzeppelin/contracts/utils/cryptography/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32( 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ├À 2 + 1, and for v in (302): v Ôêê {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if ( uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 ) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256( abi.encodePacked("\x19Ethereum Signed Message:\n32", hash) ); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256( abi.encodePacked( "\x19Ethereum Signed Message:\n", Strings.toString(s.length), s ) ); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256( abi.encodePacked("\x19\x01", domainSeparator, structHash) ); } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File hardhat/[email protected] pragma solidity >=0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall( gas(), consoleAddress, payloadStart, payloadLength, 0, 0 ) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function logUint(uint256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint256 p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); } function log(uint256 p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); } function log(uint256 p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); } function log(uint256 p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); } function log(string memory p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,address)", p0, p1) ); } function log( uint256 p0, uint256 p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2) ); } function log( uint256 p0, uint256 p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2) ); } function log( uint256 p0, uint256 p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2) ); } function log( uint256 p0, uint256 p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2) ); } function log( uint256 p0, string memory p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2) ); } function log( uint256 p0, string memory p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2) ); } function log( uint256 p0, string memory p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2) ); } function log( uint256 p0, string memory p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2) ); } function log( uint256 p0, bool p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2) ); } function log( uint256 p0, bool p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2) ); } function log( uint256 p0, bool p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2) ); } function log( uint256 p0, bool p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2) ); } function log( uint256 p0, address p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2) ); } function log( uint256 p0, address p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2) ); } function log( uint256 p0, address p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2) ); } function log( uint256 p0, address p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2) ); } function log( string memory p0, uint256 p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2) ); } function log( string memory p0, uint256 p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2) ); } function log( string memory p0, uint256 p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2) ); } function log( string memory p0, uint256 p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2) ); } function log( string memory p0, string memory p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2) ); } function log( string memory p0, string memory p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,string,string)", p0, p1, p2) ); } function log( string memory p0, string memory p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2) ); } function log( string memory p0, string memory p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,string,address)", p0, p1, p2) ); } function log( string memory p0, bool p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2) ); } function log( string memory p0, bool p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2) ); } function log( string memory p0, bool p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2) ); } function log( string memory p0, bool p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2) ); } function log( string memory p0, address p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2) ); } function log( string memory p0, address p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,address,string)", p0, p1, p2) ); } function log( string memory p0, address p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2) ); } function log( string memory p0, address p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,address,address)", p0, p1, p2) ); } function log( bool p0, uint256 p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2) ); } function log( bool p0, uint256 p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2) ); } function log( bool p0, uint256 p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2) ); } function log( bool p0, uint256 p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2) ); } function log( bool p0, string memory p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2) ); } function log( bool p0, string memory p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2) ); } function log( bool p0, string memory p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2) ); } function log( bool p0, string memory p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2) ); } function log( bool p0, bool p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2) ); } function log( bool p0, bool p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2) ); } function log( bool p0, bool p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2) ); } function log( bool p0, bool p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2) ); } function log( bool p0, address p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2) ); } function log( bool p0, address p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2) ); } function log( bool p0, address p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2) ); } function log( bool p0, address p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2) ); } function log( address p0, uint256 p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2) ); } function log( address p0, uint256 p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2) ); } function log( address p0, uint256 p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2) ); } function log( address p0, uint256 p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2) ); } function log( address p0, string memory p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2) ); } function log( address p0, string memory p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,string,string)", p0, p1, p2) ); } function log( address p0, string memory p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2) ); } function log( address p0, string memory p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,string,address)", p0, p1, p2) ); } function log( address p0, bool p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2) ); } function log( address p0, bool p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2) ); } function log( address p0, bool p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2) ); } function log( address p0, bool p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2) ); } function log( address p0, address p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2) ); } function log( address p0, address p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,address,string)", p0, p1, p2) ); } function log( address p0, address p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2) ); } function log( address p0, address p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,address,address)", p0, p1, p2) ); } function log( uint256 p0, uint256 p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3) ); } function log( uint256 p0, uint256 p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,uint,uint,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3) ); } function log( uint256 p0, uint256 p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,uint,uint,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,uint,string,uint)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,uint,string,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,uint,string,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,uint,string,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3) ); } function log( uint256 p0, uint256 p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,uint,bool,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3) ); } function log( uint256 p0, uint256 p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,uint,bool,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,uint,address,uint)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,uint,address,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,uint,address,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,uint,address,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,uint,uint)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,uint,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,uint,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,uint,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,string,uint)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,string,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,string,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,string,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,bool,uint)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,bool,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,bool,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,bool,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,address,uint)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,address,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,address,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,address,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3) ); } function log( uint256 p0, bool p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,bool,uint,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3) ); } function log( uint256 p0, bool p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,bool,uint,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,bool,string,uint)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,bool,string,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,bool,string,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,bool,string,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3) ); } function log( uint256 p0, bool p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,bool,bool,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3) ); } function log( uint256 p0, bool p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,bool,bool,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,bool,address,uint)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,bool,address,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,bool,address,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,bool,address,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,uint,uint)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,uint,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,uint,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,uint,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,string,uint)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,string,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,string,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,string,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,bool,uint)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,bool,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,bool,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,bool,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,address,uint)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,address,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,address,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,address,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,uint,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,uint,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,uint,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,uint,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,string,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,string,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,string,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,string,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,bool,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,bool,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,bool,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,bool,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,address,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,address,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,address,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,address,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,uint,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,uint,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,uint,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,uint,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,string,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,string,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,string,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,string,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,bool,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,bool,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,bool,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,bool,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,address,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,address,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,address,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,address,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,uint,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,uint,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,uint,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,uint,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,string,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,string,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,string,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,string,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,bool,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,bool,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,bool,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,bool,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,address,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,address,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,address,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,address,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,uint,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,uint,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,uint,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,uint,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,string,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,string,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,string,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,string,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,bool,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,bool,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,bool,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,bool,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,address,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,address,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,address,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,address,address)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3) ); } function log( bool p0, uint256 p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint,uint,string)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3) ); } function log( bool p0, uint256 p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint,uint,address)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint,string,uint)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint,string,string)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint,string,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint,string,address)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3) ); } function log( bool p0, uint256 p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint,bool,string)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3) ); } function log( bool p0, uint256 p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint,bool,address)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint,address,uint)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint,address,string)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint,address,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint,address,address)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,uint,uint)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,uint,string)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,uint,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,uint,address)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,string,uint)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,string,string)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,string,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,string,address)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,bool,uint)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,bool,string)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,bool,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,bool,address)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,address,uint)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,address,string)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,address,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,address,address)", p0, p1, p2, p3 ) ); } function log( bool p0, bool p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3) ); } function log( bool p0, bool p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,uint,string)", p0, p1, p2, p3 ) ); } function log( bool p0, bool p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3) ); } function log( bool p0, bool p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,uint,address)", p0, p1, p2, p3 ) ); } function log( bool p0, bool p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,string,uint)", p0, p1, p2, p3 ) ); } function log( bool p0, bool p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,string,string)", p0, p1, p2, p3 ) ); } function log( bool p0, bool p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,string,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, bool p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,string,address)", p0, p1, p2, p3 ) ); } function log( bool p0, bool p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3) ); } function log( bool p0, bool p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,bool,string)", p0, p1, p2, p3 ) ); } function log( bool p0, bool p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3) ); } function log( bool p0, bool p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,bool,address)", p0, p1, p2, p3 ) ); } function log( bool p0, bool p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,address,uint)", p0, p1, p2, p3 ) ); } function log( bool p0, bool p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,address,string)", p0, p1, p2, p3 ) ); } function log( bool p0, bool p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,address,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, bool p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,address,address)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,uint,uint)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,uint,string)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,uint,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,uint,address)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,string,uint)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,string,string)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,string,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,string,address)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,bool,uint)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,bool,string)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,bool,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,bool,address)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,address,uint)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,address,string)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,address,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,address,address)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,uint,uint)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,uint,string)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,uint,bool)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,uint,address)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,string,uint)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,string,string)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,string,bool)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,string,address)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,bool,uint)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,bool,string)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,bool,bool)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,bool,address)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,address,uint)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,address,string)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,address,bool)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,address,address)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,uint,uint)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,uint,string)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,uint,bool)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,uint,address)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,string,uint)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,string,string)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,string,bool)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,string,address)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,bool,uint)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,bool,string)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,bool,bool)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,bool,address)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,address,uint)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,address,string)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,address,bool)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,address,address)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,uint,uint)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,uint,string)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,uint,bool)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,uint,address)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,string,uint)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,string,string)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,string,bool)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,string,address)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,bool,uint)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,bool,string)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,bool,bool)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,bool,address)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,address,uint)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,address,string)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,address,bool)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,address,address)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,uint,uint)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,uint,string)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,uint,bool)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,uint,address)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,string,uint)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,string,string)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,string,bool)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,string,address)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,bool,uint)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,bool,string)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,bool,bool)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,bool,address)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,address,uint)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,address,string)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,address,bool)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,address,address)", p0, p1, p2, p3 ) ); } } // File contracts/Davitar.sol pragma solidity ^0.8.0; //The following is only for debugging contract Davitar is ERC721URIStorage, Ownable { using Strings for uint32; using ECDSA for bytes32; string private _baseTokenURI; address private _signerAddress; uint256 _mintingPrice; event TokenMinted( address indexed owner, uint32 indexed tokenId, uint256 timestamp ); constructor( string memory baseTokenURI, address signerAddress, uint256 mintingPrice ) ERC721("Davitar NFT", "DVT") { _baseTokenURI = baseTokenURI; _signerAddress = signerAddress; _mintingPrice = mintingPrice; _mintNewToken(0x94e9A5A128f7B4af0BEeFe32F411F61d244759cE, 915); _mintNewToken(0xa0b89e0466479A90164b6Ca6bB907da0195bd98F, 914); _mintNewToken(0xb9Cc86aa31c99a0123a9bf5453D5D022EcEbE106, 913); _mintNewToken(0x4F8DA0C32A5E7197d72D94FC3eb2D910B62670aF, 912); _mintNewToken(0x029c827053EfDe9C1e31D0680A586537fE9dAcfD, 911); } /*Function will be receiving a token id, a buyer address and a timestamp of the purchase petition. The backed server will provide a valid signature for the hash of the data provided, granted for a maximum of 15min. If the user takes more than expected to do the chase, the transaction will be rejected */ function mintNewToken( uint32 tokenId, uint64 timestamp, bytes memory signature ) external payable { //Check payment and return excess require(msg.value >= _mintingPrice, "ERROR: Not enough ether sent"); uint256 moneyToReturn = msg.value - _mintingPrice; if (moneyToReturn > 0) { payable(msg.sender).transfer(moneyToReturn); } //Check signature and generate NFT bytes32 dataHash = keccak256( abi.encodePacked(msg.sender, timestamp, tokenId) ); console.logBytes32(dataHash); if ( _checkValidSignature(dataHash, signature) && block.timestamp < timestamp + 15 minutes ) { _mintNewToken(msg.sender, tokenId); } else revert("ERROR: Unauthorized minting requested"); } function _checkValidSignature(bytes32 data, bytes memory signature) private view returns (bool isValid) { address signerAddress = data.toEthSignedMessageHash().recover( signature ); return signerAddress == _signerAddress; } function _mintNewToken(address newOwner, uint32 tokenId) private { _mint(newOwner, tokenId); string memory uri = string( bytes.concat( bytes(_baseTokenURI), bytes(tokenId.toString()), bytes(".json") ) ); _setTokenURI(tokenId, uri); emit TokenMinted(newOwner, tokenId, block.timestamp); } function withdrawFunds(address recipient) external onlyOwner { payable(recipient).transfer(address(this).balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"baseTokenURI","type":"string"},{"internalType":"address","name":"signerAddress","type":"address"},{"internalType":"uint256","name":"mintingPrice","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint32","name":"tokenId","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokenMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"tokenId","type":"uint32"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mintNewToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200500738038062005007833981810160405281019062000037919062000b56565b6040518060400160405280600b81526020017f44617669746172204e46540000000000000000000000000000000000000000008152506040518060400160405280600381526020017f44565400000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000bb92919062000869565b508060019080519060200190620000d492919062000869565b505050620000f7620000eb6200022960201b60201c565b6200023160201b60201c565b82600890805190602001906200010f92919062000869565b5081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600a81905550620001807394e9a5a128f7b4af0beefe32f411f61d244759ce610393620002f760201b60201c565b620001a873a0b89e0466479a90164b6ca6bb907da0195bd98f610392620002f760201b60201c565b620001d073b9cc86aa31c99a0123a9bf5453d5d022ecebe106610391620002f760201b60201c565b620001f8734f8da0c32a5e7197d72d94fc3eb2d910b62670af610390620002f760201b60201c565b6200022073029c827053efde9c1e31d0680a586537fe9dacfd61038f620002f760201b60201c565b505050620010f8565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200030f828263ffffffff16620003fe60201b60201c565b600060086200032f8363ffffffff16620005f860201b6200100c1760201c565b6040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250604051602001620003799392919062000d23565b6040516020818303038152906040529050620003a28263ffffffff16826200077260201b60201c565b8163ffffffff168373ffffffffffffffffffffffffffffffffffffffff167f04702e2d8196dbd36f2ce4a2576dae1a0166635e841f05b5f4f57f5e7fb2e69a42604051620003f1919062000d6b565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000471576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004689062000de9565b60405180910390fd5b6200048281620007f360201b60201c565b15620004c5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004bc9062000e5b565b60405180910390fd5b620004d9600083836200085f60201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200052b919062000eac565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4620005f4600083836200086460201b60201c565b5050565b6060600082141562000642576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506200076d565b600082905060005b600082146200067a578080620006609062000f09565b915050600a8262000672919062000f86565b91506200064a565b60008167ffffffffffffffff81111562000699576200069862000948565b5b6040519080825280601f01601f191660200182016040528015620006cc5781602001600182028036833780820191505090505b5090505b600085146200076657600182620006e8919062000fbe565b9150600a85620006f9919062000ff9565b603062000707919062000eac565b60f81b81838151811062000720576200071f62001031565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856200075e919062000f86565b9450620006d0565b8093505050505b919050565b6200078382620007f360201b60201c565b620007c5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007bc90620010d6565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190620007ee92919062000869565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b505050565b828054620008779062000c00565b90600052602060002090601f0160209004810192826200089b5760008555620008e7565b82601f10620008b657805160ff1916838001178555620008e7565b82800160010185558215620008e7579182015b82811115620008e6578251825591602001919060010190620008c9565b5b509050620008f69190620008fa565b5090565b5b8082111562000915576000816000905550600101620008fb565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620009828262000937565b810181811067ffffffffffffffff82111715620009a457620009a362000948565b5b80604052505050565b6000620009b962000919565b9050620009c7828262000977565b919050565b600067ffffffffffffffff821115620009ea57620009e962000948565b5b620009f58262000937565b9050602081019050919050565b60005b8381101562000a2257808201518184015260208101905062000a05565b8381111562000a32576000848401525b50505050565b600062000a4f62000a4984620009cc565b620009ad565b90508281526020810184848401111562000a6e5762000a6d62000932565b5b62000a7b84828562000a02565b509392505050565b600082601f83011262000a9b5762000a9a6200092d565b5b815162000aad84826020860162000a38565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000ae38262000ab6565b9050919050565b62000af58162000ad6565b811462000b0157600080fd5b50565b60008151905062000b158162000aea565b92915050565b6000819050919050565b62000b308162000b1b565b811462000b3c57600080fd5b50565b60008151905062000b508162000b25565b92915050565b60008060006060848603121562000b725762000b7162000923565b5b600084015167ffffffffffffffff81111562000b935762000b9262000928565b5b62000ba18682870162000a83565b935050602062000bb48682870162000b04565b925050604062000bc78682870162000b3f565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000c1957607f821691505b6020821081141562000c305762000c2f62000bd1565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815462000c658162000c00565b62000c71818662000c36565b9450600182166000811462000c8f576001811462000ca15762000cd8565b60ff1983168652818601935062000cd8565b62000cac8562000c41565b60005b8381101562000cd05781548189015260018201915060208101905062000caf565b838801955050505b50505092915050565b600081519050919050565b600062000cf98262000ce1565b62000d05818562000c36565b935062000d1781856020860162000a02565b80840191505092915050565b600062000d31828662000c56565b915062000d3f828562000cec565b915062000d4d828462000cec565b9150819050949350505050565b62000d658162000b1b565b82525050565b600060208201905062000d82600083018462000d5a565b92915050565b600082825260208201905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600062000dd160208362000d88565b915062000dde8262000d99565b602082019050919050565b6000602082019050818103600083015262000e048162000dc2565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600062000e43601c8362000d88565b915062000e508262000e0b565b602082019050919050565b6000602082019050818103600083015262000e768162000e34565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000eb98262000b1b565b915062000ec68362000b1b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000efe5762000efd62000e7d565b5b828201905092915050565b600062000f168262000b1b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000f4c5762000f4b62000e7d565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000f938262000b1b565b915062000fa08362000b1b565b92508262000fb35762000fb262000f57565b5b828204905092915050565b600062000fcb8262000b1b565b915062000fd88362000b1b565b92508282101562000fee5762000fed62000e7d565b5b828203905092915050565b6000620010068262000b1b565b9150620010138362000b1b565b92508262001026576200102562000f57565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b6000620010be602e8362000d88565b9150620010cb8262001060565b604082019050919050565b60006020820190508181036000830152620010f181620010af565b9050919050565b613eff80620011086000396000f3fe6080604052600436106101095760003560e01c8063715018a611610095578063aa55aaff11610064578063aa55aaff14610367578063b88d4fde14610383578063c87b56dd146103ac578063e985e9c5146103e9578063f2fde38b1461042657610109565b8063715018a6146102d15780638da5cb5b146102e857806395d89b4114610313578063a22cb4651461033e57610109565b806323b872dd116100dc57806323b872dd146101dc57806342842e0e146102055780636352211e1461022e57806368742da61461026b57806370a082311461029457610109565b806301ffc9a71461010e57806306fdde031461014b578063081812fc14610176578063095ea7b3146101b3575b600080fd5b34801561011a57600080fd5b50610135600480360381019061013091906124f4565b61044f565b604051610142919061253c565b60405180910390f35b34801561015757600080fd5b50610160610531565b60405161016d91906125f0565b60405180910390f35b34801561018257600080fd5b5061019d60048036038101906101989190612648565b6105c3565b6040516101aa91906126b6565b60405180910390f35b3480156101bf57600080fd5b506101da60048036038101906101d591906126fd565b610648565b005b3480156101e857600080fd5b5061020360048036038101906101fe919061273d565b610760565b005b34801561021157600080fd5b5061022c6004803603810190610227919061273d565b6107c0565b005b34801561023a57600080fd5b5061025560048036038101906102509190612648565b6107e0565b60405161026291906126b6565b60405180910390f35b34801561027757600080fd5b50610292600480360381019061028d9190612790565b610892565b005b3480156102a057600080fd5b506102bb60048036038101906102b69190612790565b610958565b6040516102c891906127cc565b60405180910390f35b3480156102dd57600080fd5b506102e6610a10565b005b3480156102f457600080fd5b506102fd610a98565b60405161030a91906126b6565b60405180910390f35b34801561031f57600080fd5b50610328610ac2565b60405161033591906125f0565b60405180910390f35b34801561034a57600080fd5b5061036560048036038101906103609190612813565b610b54565b005b610381600480360381019061037c9190612a04565b610b6a565b005b34801561038f57600080fd5b506103aa60048036038101906103a59190612a73565b610ccc565b005b3480156103b857600080fd5b506103d360048036038101906103ce9190612648565b610d2e565b6040516103e091906125f0565b60405180910390f35b3480156103f557600080fd5b50610410600480360381019061040b9190612af6565b610e80565b60405161041d919061253c565b60405180910390f35b34801561043257600080fd5b5061044d60048036038101906104489190612790565b610f14565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061051a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061052a57506105298261116d565b5b9050919050565b60606000805461054090612b65565b80601f016020809104026020016040519081016040528092919081815260200182805461056c90612b65565b80156105b95780601f1061058e576101008083540402835291602001916105b9565b820191906000526020600020905b81548152906001019060200180831161059c57829003601f168201915b5050505050905090565b60006105ce826111d7565b61060d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060490612c09565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610653826107e0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bb90612c9b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106e3611243565b73ffffffffffffffffffffffffffffffffffffffff16148061071257506107118161070c611243565b610e80565b5b610751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074890612d2d565b60405180910390fd5b61075b838361124b565b505050565b61077161076b611243565b82611304565b6107b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a790612dbf565b60405180910390fd5b6107bb8383836113e2565b505050565b6107db83838360405180602001604052806000815250610ccc565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610889576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088090612e51565b60405180910390fd5b80915050919050565b61089a611243565b73ffffffffffffffffffffffffffffffffffffffff166108b8610a98565b73ffffffffffffffffffffffffffffffffffffffff161461090e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090590612ebd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610954573d6000803e3d6000fd5b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156109c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c090612f4f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a18611243565b73ffffffffffffffffffffffffffffffffffffffff16610a36610a98565b73ffffffffffffffffffffffffffffffffffffffff1614610a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8390612ebd565b60405180910390fd5b610a966000611649565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610ad190612b65565b80601f0160208091040260200160405190810160405280929190818152602001828054610afd90612b65565b8015610b4a5780601f10610b1f57610100808354040283529160200191610b4a565b820191906000526020600020905b815481529060010190602001808311610b2d57829003601f168201915b5050505050905090565b610b66610b5f611243565b838361170f565b5050565b600a54341015610baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba690612fbb565b60405180910390fd5b6000600a5434610bbf919061300a565b90506000811115610c12573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610c10573d6000803e3d6000fd5b505b6000338486604051602001610c29939291906130f2565b604051602081830303815290604052805190602001209050610c4a8161187c565b610c548184611915565b8015610c76575061038484610c69919061312f565b67ffffffffffffffff1642105b15610c8a57610c85338661198f565b610cc5565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbc906131df565b60405180910390fd5b5050505050565b610cdd610cd7611243565b83611304565b610d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1390612dbf565b60405180910390fd5b610d2884848484611a75565b50505050565b6060610d39826111d7565b610d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6f90613271565b60405180910390fd5b6000600660008481526020019081526020016000208054610d9890612b65565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc490612b65565b8015610e115780601f10610de657610100808354040283529160200191610e11565b820191906000526020600020905b815481529060010190602001808311610df457829003601f168201915b505050505090506000610e22611ad1565b9050600081511415610e38578192505050610e7b565b600082511115610e6d578082604051602001610e559291906132cd565b60405160208183030381529060405292505050610e7b565b610e7684611ae8565b925050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610f1c611243565b73ffffffffffffffffffffffffffffffffffffffff16610f3a610a98565b73ffffffffffffffffffffffffffffffffffffffff1614610f90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8790612ebd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611000576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff790613363565b60405180910390fd5b61100981611649565b50565b60606000821415611054576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611168565b600082905060005b6000821461108657808061106f90613383565b915050600a8261107f91906133fb565b915061105c565b60008167ffffffffffffffff8111156110a2576110a16128d9565b5b6040519080825280601f01601f1916602001820160405280156110d45781602001600182028036833780820191505090505b5090505b60008514611161576001826110ed919061300a565b9150600a856110fc919061342c565b6030611108919061345d565b60f81b81838151811061111e5761111d6134b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561115a91906133fb565b94506110d8565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166112be836107e0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061130f826111d7565b61134e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134590613554565b60405180910390fd5b6000611359836107e0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061139b575061139a8185610e80565b5b806113d957508373ffffffffffffffffffffffffffffffffffffffff166113c1846105c3565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611402826107e0565b73ffffffffffffffffffffffffffffffffffffffff1614611458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144f906135e6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bf90613678565b60405180910390fd5b6114d3838383611b8f565b6114de60008261124b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461152e919061300a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611585919061345d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611644838383611b94565b505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561177e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611775906136e4565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161186f919061253c565b60405180910390a3505050565b61191281604051602401611890919061371d565b6040516020818303038152906040527f27b7cf85000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611b99565b50565b6000806119338361192586611bc2565b611bf290919063ffffffff16565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161491505092915050565b61199f828263ffffffff16611c19565b600060086119b28363ffffffff1661100c565b6040518060400160405280600581526020017f2e6a736f6e0000000000000000000000000000000000000000000000000000008152506040516020016119fa93929190613813565b6040516020818303038152906040529050611a1b8263ffffffff1682611df3565b8163ffffffff168373ffffffffffffffffffffffffffffffffffffffff167f04702e2d8196dbd36f2ce4a2576dae1a0166635e841f05b5f4f57f5e7fb2e69a42604051611a6891906127cc565b60405180910390a3505050565b611a808484846113e2565b611a8c84848484611e67565b611acb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac2906138b6565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b6060611af3826111d7565b611b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2990613948565b60405180910390fd5b6000611b3c611ad1565b90506000815111611b5c5760405180602001604052806000815250611b87565b80611b668461100c565b604051602001611b779291906132cd565b6040516020818303038152906040525b915050919050565b505050565b505050565b60008151905060006a636f6e736f6c652e6c6f679050602083016000808483855afa5050505050565b600081604051602001611bd591906139d5565b604051602081830303815290604052805190602001209050919050565b6000806000611c018585611ffe565b91509150611c0e81612081565b819250505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090613a47565b60405180910390fd5b611c92816111d7565b15611cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc990613ab3565b60405180910390fd5b611cde60008383611b8f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d2e919061345d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611def60008383611b94565b5050565b611dfc826111d7565b611e3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3290613b45565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190611e629291906123e5565b505050565b6000611e888473ffffffffffffffffffffffffffffffffffffffff16612256565b15611ff1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611eb1611243565b8786866040518563ffffffff1660e01b8152600401611ed39493929190613baf565b602060405180830381600087803b158015611eed57600080fd5b505af1925050508015611f1e57506040513d601f19601f82011682018060405250810190611f1b9190613c10565b60015b611fa1573d8060008114611f4e576040519150601f19603f3d011682016040523d82523d6000602084013e611f53565b606091505b50600081511415611f99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f90906138b6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611ff6565b600190505b949350505050565b6000806041835114156120405760008060006020860151925060408601519150606086015160001a905061203487828585612279565b9450945050505061207a565b604083511415612071576000806020850151915060408501519050612066868383612386565b93509350505061207a565b60006002915091505b9250929050565b6000600481111561209557612094613c3d565b5b8160048111156120a8576120a7613c3d565b5b14156120b357612253565b600160048111156120c7576120c6613c3d565b5b8160048111156120da576120d9613c3d565b5b141561211b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211290613cb8565b60405180910390fd5b6002600481111561212f5761212e613c3d565b5b81600481111561214257612141613c3d565b5b1415612183576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217a90613d24565b60405180910390fd5b6003600481111561219757612196613c3d565b5b8160048111156121aa576121a9613c3d565b5b14156121eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e290613db6565b60405180910390fd5b6004808111156121fe576121fd613c3d565b5b81600481111561221157612210613c3d565b5b1415612252576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224990613e48565b60405180910390fd5b5b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156122b457600060039150915061237d565b601b8560ff16141580156122cc5750601c8560ff1614155b156122de57600060049150915061237d565b6000600187878787604051600081526020016040526040516123039493929190613e84565b6020604051602081039080840390855afa158015612325573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123745760006001925092505061237d565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6123c9919061345d565b90506123d787828885612279565b935093505050935093915050565b8280546123f190612b65565b90600052602060002090601f016020900481019282612413576000855561245a565b82601f1061242c57805160ff191683800117855561245a565b8280016001018555821561245a579182015b8281111561245957825182559160200191906001019061243e565b5b509050612467919061246b565b5090565b5b8082111561248457600081600090555060010161246c565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6124d18161249c565b81146124dc57600080fd5b50565b6000813590506124ee816124c8565b92915050565b60006020828403121561250a57612509612492565b5b6000612518848285016124df565b91505092915050565b60008115159050919050565b61253681612521565b82525050565b6000602082019050612551600083018461252d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612591578082015181840152602081019050612576565b838111156125a0576000848401525b50505050565b6000601f19601f8301169050919050565b60006125c282612557565b6125cc8185612562565b93506125dc818560208601612573565b6125e5816125a6565b840191505092915050565b6000602082019050818103600083015261260a81846125b7565b905092915050565b6000819050919050565b61262581612612565b811461263057600080fd5b50565b6000813590506126428161261c565b92915050565b60006020828403121561265e5761265d612492565b5b600061266c84828501612633565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006126a082612675565b9050919050565b6126b081612695565b82525050565b60006020820190506126cb60008301846126a7565b92915050565b6126da81612695565b81146126e557600080fd5b50565b6000813590506126f7816126d1565b92915050565b6000806040838503121561271457612713612492565b5b6000612722858286016126e8565b925050602061273385828601612633565b9150509250929050565b60008060006060848603121561275657612755612492565b5b6000612764868287016126e8565b9350506020612775868287016126e8565b925050604061278686828701612633565b9150509250925092565b6000602082840312156127a6576127a5612492565b5b60006127b4848285016126e8565b91505092915050565b6127c681612612565b82525050565b60006020820190506127e160008301846127bd565b92915050565b6127f081612521565b81146127fb57600080fd5b50565b60008135905061280d816127e7565b92915050565b6000806040838503121561282a57612829612492565b5b6000612838858286016126e8565b9250506020612849858286016127fe565b9150509250929050565b600063ffffffff82169050919050565b61286c81612853565b811461287757600080fd5b50565b60008135905061288981612863565b92915050565b600067ffffffffffffffff82169050919050565b6128ac8161288f565b81146128b757600080fd5b50565b6000813590506128c9816128a3565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612911826125a6565b810181811067ffffffffffffffff821117156129305761292f6128d9565b5b80604052505050565b6000612943612488565b905061294f8282612908565b919050565b600067ffffffffffffffff82111561296f5761296e6128d9565b5b612978826125a6565b9050602081019050919050565b82818337600083830152505050565b60006129a76129a284612954565b612939565b9050828152602081018484840111156129c3576129c26128d4565b5b6129ce848285612985565b509392505050565b600082601f8301126129eb576129ea6128cf565b5b81356129fb848260208601612994565b91505092915050565b600080600060608486031215612a1d57612a1c612492565b5b6000612a2b8682870161287a565b9350506020612a3c868287016128ba565b925050604084013567ffffffffffffffff811115612a5d57612a5c612497565b5b612a69868287016129d6565b9150509250925092565b60008060008060808587031215612a8d57612a8c612492565b5b6000612a9b878288016126e8565b9450506020612aac878288016126e8565b9350506040612abd87828801612633565b925050606085013567ffffffffffffffff811115612ade57612add612497565b5b612aea878288016129d6565b91505092959194509250565b60008060408385031215612b0d57612b0c612492565b5b6000612b1b858286016126e8565b9250506020612b2c858286016126e8565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612b7d57607f821691505b60208210811415612b9157612b90612b36565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612bf3602c83612562565b9150612bfe82612b97565b604082019050919050565b60006020820190508181036000830152612c2281612be6565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612c85602183612562565b9150612c9082612c29565b604082019050919050565b60006020820190508181036000830152612cb481612c78565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612d17603883612562565b9150612d2282612cbb565b604082019050919050565b60006020820190508181036000830152612d4681612d0a565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000612da9603183612562565b9150612db482612d4d565b604082019050919050565b60006020820190508181036000830152612dd881612d9c565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000612e3b602983612562565b9150612e4682612ddf565b604082019050919050565b60006020820190508181036000830152612e6a81612e2e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612ea7602083612562565b9150612eb282612e71565b602082019050919050565b60006020820190508181036000830152612ed681612e9a565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000612f39602a83612562565b9150612f4482612edd565b604082019050919050565b60006020820190508181036000830152612f6881612f2c565b9050919050565b7f4552524f523a204e6f7420656e6f7567682065746865722073656e7400000000600082015250565b6000612fa5601c83612562565b9150612fb082612f6f565b602082019050919050565b60006020820190508181036000830152612fd481612f98565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061301582612612565b915061302083612612565b92508282101561303357613032612fdb565b5b828203905092915050565b60008160601b9050919050565b60006130568261303e565b9050919050565b60006130688261304b565b9050919050565b61308061307b82612695565b61305d565b82525050565b60008160c01b9050919050565b600061309e82613086565b9050919050565b6130b66130b18261288f565b613093565b82525050565b60008160e01b9050919050565b60006130d4826130bc565b9050919050565b6130ec6130e782612853565b6130c9565b82525050565b60006130fe828661306f565b60148201915061310e82856130a5565b60088201915061311e82846130db565b600482019150819050949350505050565b600061313a8261288f565b91506131458361288f565b92508267ffffffffffffffff0382111561316257613161612fdb565b5b828201905092915050565b7f4552524f523a20556e617574686f72697a6564206d696e74696e67207265717560008201527f6573746564000000000000000000000000000000000000000000000000000000602082015250565b60006131c9602583612562565b91506131d48261316d565b604082019050919050565b600060208201905081810360008301526131f8816131bc565b9050919050565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b600061325b603183612562565b9150613266826131ff565b604082019050919050565b6000602082019050818103600083015261328a8161324e565b9050919050565b600081905092915050565b60006132a782612557565b6132b18185613291565b93506132c1818560208601612573565b80840191505092915050565b60006132d9828561329c565b91506132e5828461329c565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061334d602683612562565b9150613358826132f1565b604082019050919050565b6000602082019050818103600083015261337c81613340565b9050919050565b600061338e82612612565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156133c1576133c0612fdb565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061340682612612565b915061341183612612565b925082613421576134206133cc565b5b828204905092915050565b600061343782612612565b915061344283612612565b925082613452576134516133cc565b5b828206905092915050565b600061346882612612565b915061347383612612565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156134a8576134a7612fdb565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061353e602c83612562565b9150613549826134e2565b604082019050919050565b6000602082019050818103600083015261356d81613531565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006135d0602583612562565b91506135db82613574565b604082019050919050565b600060208201905081810360008301526135ff816135c3565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613662602483612562565b915061366d82613606565b604082019050919050565b6000602082019050818103600083015261369181613655565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006136ce601983612562565b91506136d982613698565b602082019050919050565b600060208201905081810360008301526136fd816136c1565b9050919050565b6000819050919050565b61371781613704565b82525050565b6000602082019050613732600083018461370e565b92915050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461376581612b65565b61376f8186613738565b9450600182166000811461378a576001811461379b576137ce565b60ff198316865281860193506137ce565b6137a485613743565b60005b838110156137c6578154818901526001820191506020810190506137a7565b838801955050505b50505092915050565b600081519050919050565b60006137ed826137d7565b6137f78185613738565b9350613807818560208601612573565b80840191505092915050565b600061381f8286613758565b915061382b82856137e2565b915061383782846137e2565b9150819050949350505050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006138a0603283612562565b91506138ab82613844565b604082019050919050565b600060208201905081810360008301526138cf81613893565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613932602f83612562565b915061393d826138d6565b604082019050919050565b6000602082019050818103600083015261396181613925565b9050919050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b600061399e601c83613291565b91506139a982613968565b601c82019050919050565b6000819050919050565b6139cf6139ca82613704565b6139b4565b82525050565b60006139e082613991565b91506139ec82846139be565b60208201915081905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613a31602083612562565b9150613a3c826139fb565b602082019050919050565b60006020820190508181036000830152613a6081613a24565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613a9d601c83612562565b9150613aa882613a67565b602082019050919050565b60006020820190508181036000830152613acc81613a90565b9050919050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b6000613b2f602e83612562565b9150613b3a82613ad3565b604082019050919050565b60006020820190508181036000830152613b5e81613b22565b9050919050565b600082825260208201905092915050565b6000613b81826137d7565b613b8b8185613b65565b9350613b9b818560208601612573565b613ba4816125a6565b840191505092915050565b6000608082019050613bc460008301876126a7565b613bd160208301866126a7565b613bde60408301856127bd565b8181036060830152613bf08184613b76565b905095945050505050565b600081519050613c0a816124c8565b92915050565b600060208284031215613c2657613c25612492565b5b6000613c3484828501613bfb565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000613ca2601883612562565b9150613cad82613c6c565b602082019050919050565b60006020820190508181036000830152613cd181613c95565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000613d0e601f83612562565b9150613d1982613cd8565b602082019050919050565b60006020820190508181036000830152613d3d81613d01565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613da0602283612562565b9150613dab82613d44565b604082019050919050565b60006020820190508181036000830152613dcf81613d93565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e32602283612562565b9150613e3d82613dd6565b604082019050919050565b60006020820190508181036000830152613e6181613e25565b9050919050565b600060ff82169050919050565b613e7e81613e68565b82525050565b6000608082019050613e99600083018761370e565b613ea66020830186613e75565b613eb3604083018561370e565b613ec0606083018461370e565b9594505050505056fea26469706673582212209455b44efe0cf2427767cceca115e8a13c1b3993420cb5d8601e7f0d8d89b0c864736f6c6343000809003300000000000000000000000000000000000000000000000000000000000000600000000000000000000000009025ec9f6e9d744d6a9f2e57a241c73be452180800000000000000000000000000000000000000000000000000b1a2bc2ec500000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d504370677671526959653153596e4d477639504d68714a38314559785045746a78556e526b6b665a51376b6f2f00000000000000000000
Deployed Bytecode
0x6080604052600436106101095760003560e01c8063715018a611610095578063aa55aaff11610064578063aa55aaff14610367578063b88d4fde14610383578063c87b56dd146103ac578063e985e9c5146103e9578063f2fde38b1461042657610109565b8063715018a6146102d15780638da5cb5b146102e857806395d89b4114610313578063a22cb4651461033e57610109565b806323b872dd116100dc57806323b872dd146101dc57806342842e0e146102055780636352211e1461022e57806368742da61461026b57806370a082311461029457610109565b806301ffc9a71461010e57806306fdde031461014b578063081812fc14610176578063095ea7b3146101b3575b600080fd5b34801561011a57600080fd5b50610135600480360381019061013091906124f4565b61044f565b604051610142919061253c565b60405180910390f35b34801561015757600080fd5b50610160610531565b60405161016d91906125f0565b60405180910390f35b34801561018257600080fd5b5061019d60048036038101906101989190612648565b6105c3565b6040516101aa91906126b6565b60405180910390f35b3480156101bf57600080fd5b506101da60048036038101906101d591906126fd565b610648565b005b3480156101e857600080fd5b5061020360048036038101906101fe919061273d565b610760565b005b34801561021157600080fd5b5061022c6004803603810190610227919061273d565b6107c0565b005b34801561023a57600080fd5b5061025560048036038101906102509190612648565b6107e0565b60405161026291906126b6565b60405180910390f35b34801561027757600080fd5b50610292600480360381019061028d9190612790565b610892565b005b3480156102a057600080fd5b506102bb60048036038101906102b69190612790565b610958565b6040516102c891906127cc565b60405180910390f35b3480156102dd57600080fd5b506102e6610a10565b005b3480156102f457600080fd5b506102fd610a98565b60405161030a91906126b6565b60405180910390f35b34801561031f57600080fd5b50610328610ac2565b60405161033591906125f0565b60405180910390f35b34801561034a57600080fd5b5061036560048036038101906103609190612813565b610b54565b005b610381600480360381019061037c9190612a04565b610b6a565b005b34801561038f57600080fd5b506103aa60048036038101906103a59190612a73565b610ccc565b005b3480156103b857600080fd5b506103d360048036038101906103ce9190612648565b610d2e565b6040516103e091906125f0565b60405180910390f35b3480156103f557600080fd5b50610410600480360381019061040b9190612af6565b610e80565b60405161041d919061253c565b60405180910390f35b34801561043257600080fd5b5061044d60048036038101906104489190612790565b610f14565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061051a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061052a57506105298261116d565b5b9050919050565b60606000805461054090612b65565b80601f016020809104026020016040519081016040528092919081815260200182805461056c90612b65565b80156105b95780601f1061058e576101008083540402835291602001916105b9565b820191906000526020600020905b81548152906001019060200180831161059c57829003601f168201915b5050505050905090565b60006105ce826111d7565b61060d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060490612c09565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610653826107e0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bb90612c9b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106e3611243565b73ffffffffffffffffffffffffffffffffffffffff16148061071257506107118161070c611243565b610e80565b5b610751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074890612d2d565b60405180910390fd5b61075b838361124b565b505050565b61077161076b611243565b82611304565b6107b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a790612dbf565b60405180910390fd5b6107bb8383836113e2565b505050565b6107db83838360405180602001604052806000815250610ccc565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610889576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088090612e51565b60405180910390fd5b80915050919050565b61089a611243565b73ffffffffffffffffffffffffffffffffffffffff166108b8610a98565b73ffffffffffffffffffffffffffffffffffffffff161461090e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090590612ebd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610954573d6000803e3d6000fd5b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156109c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c090612f4f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a18611243565b73ffffffffffffffffffffffffffffffffffffffff16610a36610a98565b73ffffffffffffffffffffffffffffffffffffffff1614610a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8390612ebd565b60405180910390fd5b610a966000611649565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610ad190612b65565b80601f0160208091040260200160405190810160405280929190818152602001828054610afd90612b65565b8015610b4a5780601f10610b1f57610100808354040283529160200191610b4a565b820191906000526020600020905b815481529060010190602001808311610b2d57829003601f168201915b5050505050905090565b610b66610b5f611243565b838361170f565b5050565b600a54341015610baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba690612fbb565b60405180910390fd5b6000600a5434610bbf919061300a565b90506000811115610c12573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610c10573d6000803e3d6000fd5b505b6000338486604051602001610c29939291906130f2565b604051602081830303815290604052805190602001209050610c4a8161187c565b610c548184611915565b8015610c76575061038484610c69919061312f565b67ffffffffffffffff1642105b15610c8a57610c85338661198f565b610cc5565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbc906131df565b60405180910390fd5b5050505050565b610cdd610cd7611243565b83611304565b610d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1390612dbf565b60405180910390fd5b610d2884848484611a75565b50505050565b6060610d39826111d7565b610d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6f90613271565b60405180910390fd5b6000600660008481526020019081526020016000208054610d9890612b65565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc490612b65565b8015610e115780601f10610de657610100808354040283529160200191610e11565b820191906000526020600020905b815481529060010190602001808311610df457829003601f168201915b505050505090506000610e22611ad1565b9050600081511415610e38578192505050610e7b565b600082511115610e6d578082604051602001610e559291906132cd565b60405160208183030381529060405292505050610e7b565b610e7684611ae8565b925050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610f1c611243565b73ffffffffffffffffffffffffffffffffffffffff16610f3a610a98565b73ffffffffffffffffffffffffffffffffffffffff1614610f90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8790612ebd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611000576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff790613363565b60405180910390fd5b61100981611649565b50565b60606000821415611054576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611168565b600082905060005b6000821461108657808061106f90613383565b915050600a8261107f91906133fb565b915061105c565b60008167ffffffffffffffff8111156110a2576110a16128d9565b5b6040519080825280601f01601f1916602001820160405280156110d45781602001600182028036833780820191505090505b5090505b60008514611161576001826110ed919061300a565b9150600a856110fc919061342c565b6030611108919061345d565b60f81b81838151811061111e5761111d6134b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561115a91906133fb565b94506110d8565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166112be836107e0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061130f826111d7565b61134e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134590613554565b60405180910390fd5b6000611359836107e0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061139b575061139a8185610e80565b5b806113d957508373ffffffffffffffffffffffffffffffffffffffff166113c1846105c3565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611402826107e0565b73ffffffffffffffffffffffffffffffffffffffff1614611458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144f906135e6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bf90613678565b60405180910390fd5b6114d3838383611b8f565b6114de60008261124b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461152e919061300a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611585919061345d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611644838383611b94565b505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561177e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611775906136e4565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161186f919061253c565b60405180910390a3505050565b61191281604051602401611890919061371d565b6040516020818303038152906040527f27b7cf85000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611b99565b50565b6000806119338361192586611bc2565b611bf290919063ffffffff16565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161491505092915050565b61199f828263ffffffff16611c19565b600060086119b28363ffffffff1661100c565b6040518060400160405280600581526020017f2e6a736f6e0000000000000000000000000000000000000000000000000000008152506040516020016119fa93929190613813565b6040516020818303038152906040529050611a1b8263ffffffff1682611df3565b8163ffffffff168373ffffffffffffffffffffffffffffffffffffffff167f04702e2d8196dbd36f2ce4a2576dae1a0166635e841f05b5f4f57f5e7fb2e69a42604051611a6891906127cc565b60405180910390a3505050565b611a808484846113e2565b611a8c84848484611e67565b611acb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac2906138b6565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b6060611af3826111d7565b611b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2990613948565b60405180910390fd5b6000611b3c611ad1565b90506000815111611b5c5760405180602001604052806000815250611b87565b80611b668461100c565b604051602001611b779291906132cd565b6040516020818303038152906040525b915050919050565b505050565b505050565b60008151905060006a636f6e736f6c652e6c6f679050602083016000808483855afa5050505050565b600081604051602001611bd591906139d5565b604051602081830303815290604052805190602001209050919050565b6000806000611c018585611ffe565b91509150611c0e81612081565b819250505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090613a47565b60405180910390fd5b611c92816111d7565b15611cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc990613ab3565b60405180910390fd5b611cde60008383611b8f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d2e919061345d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611def60008383611b94565b5050565b611dfc826111d7565b611e3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3290613b45565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190611e629291906123e5565b505050565b6000611e888473ffffffffffffffffffffffffffffffffffffffff16612256565b15611ff1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611eb1611243565b8786866040518563ffffffff1660e01b8152600401611ed39493929190613baf565b602060405180830381600087803b158015611eed57600080fd5b505af1925050508015611f1e57506040513d601f19601f82011682018060405250810190611f1b9190613c10565b60015b611fa1573d8060008114611f4e576040519150601f19603f3d011682016040523d82523d6000602084013e611f53565b606091505b50600081511415611f99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f90906138b6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611ff6565b600190505b949350505050565b6000806041835114156120405760008060006020860151925060408601519150606086015160001a905061203487828585612279565b9450945050505061207a565b604083511415612071576000806020850151915060408501519050612066868383612386565b93509350505061207a565b60006002915091505b9250929050565b6000600481111561209557612094613c3d565b5b8160048111156120a8576120a7613c3d565b5b14156120b357612253565b600160048111156120c7576120c6613c3d565b5b8160048111156120da576120d9613c3d565b5b141561211b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211290613cb8565b60405180910390fd5b6002600481111561212f5761212e613c3d565b5b81600481111561214257612141613c3d565b5b1415612183576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217a90613d24565b60405180910390fd5b6003600481111561219757612196613c3d565b5b8160048111156121aa576121a9613c3d565b5b14156121eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e290613db6565b60405180910390fd5b6004808111156121fe576121fd613c3d565b5b81600481111561221157612210613c3d565b5b1415612252576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224990613e48565b60405180910390fd5b5b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156122b457600060039150915061237d565b601b8560ff16141580156122cc5750601c8560ff1614155b156122de57600060049150915061237d565b6000600187878787604051600081526020016040526040516123039493929190613e84565b6020604051602081039080840390855afa158015612325573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123745760006001925092505061237d565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6123c9919061345d565b90506123d787828885612279565b935093505050935093915050565b8280546123f190612b65565b90600052602060002090601f016020900481019282612413576000855561245a565b82601f1061242c57805160ff191683800117855561245a565b8280016001018555821561245a579182015b8281111561245957825182559160200191906001019061243e565b5b509050612467919061246b565b5090565b5b8082111561248457600081600090555060010161246c565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6124d18161249c565b81146124dc57600080fd5b50565b6000813590506124ee816124c8565b92915050565b60006020828403121561250a57612509612492565b5b6000612518848285016124df565b91505092915050565b60008115159050919050565b61253681612521565b82525050565b6000602082019050612551600083018461252d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612591578082015181840152602081019050612576565b838111156125a0576000848401525b50505050565b6000601f19601f8301169050919050565b60006125c282612557565b6125cc8185612562565b93506125dc818560208601612573565b6125e5816125a6565b840191505092915050565b6000602082019050818103600083015261260a81846125b7565b905092915050565b6000819050919050565b61262581612612565b811461263057600080fd5b50565b6000813590506126428161261c565b92915050565b60006020828403121561265e5761265d612492565b5b600061266c84828501612633565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006126a082612675565b9050919050565b6126b081612695565b82525050565b60006020820190506126cb60008301846126a7565b92915050565b6126da81612695565b81146126e557600080fd5b50565b6000813590506126f7816126d1565b92915050565b6000806040838503121561271457612713612492565b5b6000612722858286016126e8565b925050602061273385828601612633565b9150509250929050565b60008060006060848603121561275657612755612492565b5b6000612764868287016126e8565b9350506020612775868287016126e8565b925050604061278686828701612633565b9150509250925092565b6000602082840312156127a6576127a5612492565b5b60006127b4848285016126e8565b91505092915050565b6127c681612612565b82525050565b60006020820190506127e160008301846127bd565b92915050565b6127f081612521565b81146127fb57600080fd5b50565b60008135905061280d816127e7565b92915050565b6000806040838503121561282a57612829612492565b5b6000612838858286016126e8565b9250506020612849858286016127fe565b9150509250929050565b600063ffffffff82169050919050565b61286c81612853565b811461287757600080fd5b50565b60008135905061288981612863565b92915050565b600067ffffffffffffffff82169050919050565b6128ac8161288f565b81146128b757600080fd5b50565b6000813590506128c9816128a3565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612911826125a6565b810181811067ffffffffffffffff821117156129305761292f6128d9565b5b80604052505050565b6000612943612488565b905061294f8282612908565b919050565b600067ffffffffffffffff82111561296f5761296e6128d9565b5b612978826125a6565b9050602081019050919050565b82818337600083830152505050565b60006129a76129a284612954565b612939565b9050828152602081018484840111156129c3576129c26128d4565b5b6129ce848285612985565b509392505050565b600082601f8301126129eb576129ea6128cf565b5b81356129fb848260208601612994565b91505092915050565b600080600060608486031215612a1d57612a1c612492565b5b6000612a2b8682870161287a565b9350506020612a3c868287016128ba565b925050604084013567ffffffffffffffff811115612a5d57612a5c612497565b5b612a69868287016129d6565b9150509250925092565b60008060008060808587031215612a8d57612a8c612492565b5b6000612a9b878288016126e8565b9450506020612aac878288016126e8565b9350506040612abd87828801612633565b925050606085013567ffffffffffffffff811115612ade57612add612497565b5b612aea878288016129d6565b91505092959194509250565b60008060408385031215612b0d57612b0c612492565b5b6000612b1b858286016126e8565b9250506020612b2c858286016126e8565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612b7d57607f821691505b60208210811415612b9157612b90612b36565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612bf3602c83612562565b9150612bfe82612b97565b604082019050919050565b60006020820190508181036000830152612c2281612be6565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612c85602183612562565b9150612c9082612c29565b604082019050919050565b60006020820190508181036000830152612cb481612c78565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612d17603883612562565b9150612d2282612cbb565b604082019050919050565b60006020820190508181036000830152612d4681612d0a565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000612da9603183612562565b9150612db482612d4d565b604082019050919050565b60006020820190508181036000830152612dd881612d9c565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000612e3b602983612562565b9150612e4682612ddf565b604082019050919050565b60006020820190508181036000830152612e6a81612e2e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612ea7602083612562565b9150612eb282612e71565b602082019050919050565b60006020820190508181036000830152612ed681612e9a565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000612f39602a83612562565b9150612f4482612edd565b604082019050919050565b60006020820190508181036000830152612f6881612f2c565b9050919050565b7f4552524f523a204e6f7420656e6f7567682065746865722073656e7400000000600082015250565b6000612fa5601c83612562565b9150612fb082612f6f565b602082019050919050565b60006020820190508181036000830152612fd481612f98565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061301582612612565b915061302083612612565b92508282101561303357613032612fdb565b5b828203905092915050565b60008160601b9050919050565b60006130568261303e565b9050919050565b60006130688261304b565b9050919050565b61308061307b82612695565b61305d565b82525050565b60008160c01b9050919050565b600061309e82613086565b9050919050565b6130b66130b18261288f565b613093565b82525050565b60008160e01b9050919050565b60006130d4826130bc565b9050919050565b6130ec6130e782612853565b6130c9565b82525050565b60006130fe828661306f565b60148201915061310e82856130a5565b60088201915061311e82846130db565b600482019150819050949350505050565b600061313a8261288f565b91506131458361288f565b92508267ffffffffffffffff0382111561316257613161612fdb565b5b828201905092915050565b7f4552524f523a20556e617574686f72697a6564206d696e74696e67207265717560008201527f6573746564000000000000000000000000000000000000000000000000000000602082015250565b60006131c9602583612562565b91506131d48261316d565b604082019050919050565b600060208201905081810360008301526131f8816131bc565b9050919050565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b600061325b603183612562565b9150613266826131ff565b604082019050919050565b6000602082019050818103600083015261328a8161324e565b9050919050565b600081905092915050565b60006132a782612557565b6132b18185613291565b93506132c1818560208601612573565b80840191505092915050565b60006132d9828561329c565b91506132e5828461329c565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061334d602683612562565b9150613358826132f1565b604082019050919050565b6000602082019050818103600083015261337c81613340565b9050919050565b600061338e82612612565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156133c1576133c0612fdb565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061340682612612565b915061341183612612565b925082613421576134206133cc565b5b828204905092915050565b600061343782612612565b915061344283612612565b925082613452576134516133cc565b5b828206905092915050565b600061346882612612565b915061347383612612565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156134a8576134a7612fdb565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061353e602c83612562565b9150613549826134e2565b604082019050919050565b6000602082019050818103600083015261356d81613531565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006135d0602583612562565b91506135db82613574565b604082019050919050565b600060208201905081810360008301526135ff816135c3565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613662602483612562565b915061366d82613606565b604082019050919050565b6000602082019050818103600083015261369181613655565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006136ce601983612562565b91506136d982613698565b602082019050919050565b600060208201905081810360008301526136fd816136c1565b9050919050565b6000819050919050565b61371781613704565b82525050565b6000602082019050613732600083018461370e565b92915050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461376581612b65565b61376f8186613738565b9450600182166000811461378a576001811461379b576137ce565b60ff198316865281860193506137ce565b6137a485613743565b60005b838110156137c6578154818901526001820191506020810190506137a7565b838801955050505b50505092915050565b600081519050919050565b60006137ed826137d7565b6137f78185613738565b9350613807818560208601612573565b80840191505092915050565b600061381f8286613758565b915061382b82856137e2565b915061383782846137e2565b9150819050949350505050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006138a0603283612562565b91506138ab82613844565b604082019050919050565b600060208201905081810360008301526138cf81613893565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613932602f83612562565b915061393d826138d6565b604082019050919050565b6000602082019050818103600083015261396181613925565b9050919050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b600061399e601c83613291565b91506139a982613968565b601c82019050919050565b6000819050919050565b6139cf6139ca82613704565b6139b4565b82525050565b60006139e082613991565b91506139ec82846139be565b60208201915081905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613a31602083612562565b9150613a3c826139fb565b602082019050919050565b60006020820190508181036000830152613a6081613a24565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613a9d601c83612562565b9150613aa882613a67565b602082019050919050565b60006020820190508181036000830152613acc81613a90565b9050919050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b6000613b2f602e83612562565b9150613b3a82613ad3565b604082019050919050565b60006020820190508181036000830152613b5e81613b22565b9050919050565b600082825260208201905092915050565b6000613b81826137d7565b613b8b8185613b65565b9350613b9b818560208601612573565b613ba4816125a6565b840191505092915050565b6000608082019050613bc460008301876126a7565b613bd160208301866126a7565b613bde60408301856127bd565b8181036060830152613bf08184613b76565b905095945050505050565b600081519050613c0a816124c8565b92915050565b600060208284031215613c2657613c25612492565b5b6000613c3484828501613bfb565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000613ca2601883612562565b9150613cad82613c6c565b602082019050919050565b60006020820190508181036000830152613cd181613c95565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000613d0e601f83612562565b9150613d1982613cd8565b602082019050919050565b60006020820190508181036000830152613d3d81613d01565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613da0602283612562565b9150613dab82613d44565b604082019050919050565b60006020820190508181036000830152613dcf81613d93565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e32602283612562565b9150613e3d82613dd6565b604082019050919050565b60006020820190508181036000830152613e6181613e25565b9050919050565b600060ff82169050919050565b613e7e81613e68565b82525050565b6000608082019050613e99600083018761370e565b613ea66020830186613e75565b613eb3604083018561370e565b613ec0606083018461370e565b9594505050505056fea26469706673582212209455b44efe0cf2427767cceca115e8a13c1b3993420cb5d8601e7f0d8d89b0c864736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000600000000000000000000000009025ec9f6e9d744d6a9f2e57a241c73be452180800000000000000000000000000000000000000000000000000b1a2bc2ec500000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d504370677671526959653153596e4d477639504d68714a38314559785045746a78556e526b6b665a51376b6f2f00000000000000000000
-----Decoded View---------------
Arg [0] : baseTokenURI (string): ipfs://QmPCpgvqRiYe1SYnMGv9PMhqJ81EYxPEtjxUnRkkfZQ7ko/
Arg [1] : signerAddress (address): 0x9025EC9F6e9D744D6a9f2e57A241c73be4521808
Arg [2] : mintingPrice (uint256): 50000000000000000
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 0000000000000000000000009025ec9f6e9d744d6a9f2e57a241c73be4521808
Arg [2] : 00000000000000000000000000000000000000000000000000b1a2bc2ec50000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [4] : 697066733a2f2f516d504370677671526959653153596e4d477639504d68714a
Arg [5] : 38314559785045746a78556e526b6b665a51376b6f2f00000000000000000000
Deployed Bytecode Sourcemap
165500:3066:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22435:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23604:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25298:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24821:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26217:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26664:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23211:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;168433:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22854:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50405:103;;;;;;;;;;;;;:::i;:::-;;49754:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23773:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25678:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;166819:876;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26920:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37023:766;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25936:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50663:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22435:355;22582:4;22639:25;22624:40;;;:11;:40;;;;:105;;;;22696:33;22681:48;;;:11;:48;;;;22624:105;:158;;;;22746:36;22770:11;22746:23;:36::i;:::-;22624:158;22604:178;;22435:355;;;:::o;23604:100::-;23658:13;23691:5;23684:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23604:100;:::o;25298:308::-;25419:7;25466:16;25474:7;25466;:16::i;:::-;25444:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;25574:15;:24;25590:7;25574:24;;;;;;;;;;;;;;;;;;;;;25567:31;;25298:308;;;:::o;24821:411::-;24902:13;24918:23;24933:7;24918:14;:23::i;:::-;24902:39;;24966:5;24960:11;;:2;:11;;;;24952:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;25060:5;25044:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;25069:37;25086:5;25093:12;:10;:12::i;:::-;25069:16;:37::i;:::-;25044:62;25022:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;25203:21;25212:2;25216:7;25203:8;:21::i;:::-;24891:341;24821:411;;:::o;26217:376::-;26426:41;26445:12;:10;:12::i;:::-;26459:7;26426:18;:41::i;:::-;26404:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;26557:28;26567:4;26573:2;26577:7;26557:9;:28::i;:::-;26217:376;;;:::o;26664:185::-;26802:39;26819:4;26825:2;26829:7;26802:39;;;;;;;;;;;;:16;:39::i;:::-;26664:185;;;:::o;23211:326::-;23328:7;23353:13;23369:7;:16;23377:7;23369:16;;;;;;;;;;;;;;;;;;;;;23353:32;;23435:1;23418:19;;:5;:19;;;;23396:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;23524:5;23517:12;;;23211:326;;;:::o;168433:130::-;49985:12;:10;:12::i;:::-;49974:23;;:7;:5;:7::i;:::-;:23;;;49966:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;168513:9:::1;168505:27;;:50;168533:21;168505:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;168433:130:::0;:::o;22854:295::-;22971:7;23035:1;23018:19;;:5;:19;;;;22996:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;23125:9;:16;23135:5;23125:16;;;;;;;;;;;;;;;;23118:23;;22854:295;;;:::o;50405:103::-;49985:12;:10;:12::i;:::-;49974:23;;:7;:5;:7::i;:::-;:23;;;49966:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50470:30:::1;50497:1;50470:18;:30::i;:::-;50405:103::o:0;49754:87::-;49800:7;49827:6;;;;;;;;;;;49820:13;;49754:87;:::o;23773:104::-;23829:13;23862:7;23855:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23773:104;:::o;25678:187::-;25805:52;25824:12;:10;:12::i;:::-;25838:8;25848;25805:18;:52::i;:::-;25678:187;;:::o;166819:876::-;167025:13;;167012:9;:26;;167004:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;167082:21;167118:13;;167106:9;:25;;;;:::i;:::-;167082:49;;167162:1;167146:13;:17;167142:93;;;167188:10;167180:28;;:43;167209:13;167180:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;167142:93;167291:16;167351:10;167363:9;167374:7;167334:48;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;167310:83;;;;;;167291:102;;167406:28;167425:8;167406:18;:28::i;:::-;167463:41;167484:8;167494:9;167463:20;:41::i;:::-;:98;;;;;167551:10;167539:9;:22;;;;:::i;:::-;167521:40;;:15;:40;167463:98;167445:242;;;167588:34;167602:10;167614:7;167588:13;:34::i;:::-;167445:242;;;167640:47;;;;;;;;;;:::i;:::-;;;;;;;;167445:242;166950:745;;166819:876;;;:::o;26920:365::-;27109:41;27128:12;:10;:12::i;:::-;27142:7;27109:18;:41::i;:::-;27087:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;27238:39;27252:4;27258:2;27262:7;27271:5;27238:13;:39::i;:::-;26920:365;;;;:::o;37023:766::-;37141:13;37194:16;37202:7;37194;:16::i;:::-;37172:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;37300:23;37326:10;:19;37337:7;37326:19;;;;;;;;;;;37300:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37356:18;37377:10;:8;:10::i;:::-;37356:31;;37485:1;37469:4;37463:18;:23;37459:72;;;37510:9;37503:16;;;;;;37459:72;37661:1;37641:9;37635:23;:27;37631:108;;;37710:4;37716:9;37693:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37679:48;;;;;;37631:108;37758:23;37773:7;37758:14;:23::i;:::-;37751:30;;;;37023:766;;;;:::o;25936:214::-;26078:4;26107:18;:25;26126:5;26107:25;;;;;;;;;;;;;;;:35;26133:8;26107:35;;;;;;;;;;;;;;;;;;;;;;;;;26100:42;;25936:214;;;;:::o;50663:238::-;49985:12;:10;:12::i;:::-;49974:23;;:7;:5;:7::i;:::-;:23;;;49966:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50786:1:::1;50766:22;;:8;:22;;;;50744:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;50865:28;50884:8;50865:18;:28::i;:::-;50663:238:::0;:::o;18166:723::-;18222:13;18452:1;18443:5;:10;18439:53;;;18470:10;;;;;;;;;;;;;;;;;;;;;18439:53;18502:12;18517:5;18502:20;;18533:14;18558:78;18573:1;18565:4;:9;18558:78;;18591:8;;;;;:::i;:::-;;;;18622:2;18614:10;;;;;:::i;:::-;;;18558:78;;;18646:19;18678:6;18668:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18646:39;;18696:154;18712:1;18703:5;:10;18696:154;;18740:1;18730:11;;;;;:::i;:::-;;;18807:2;18799:5;:10;;;;:::i;:::-;18786:2;:24;;;;:::i;:::-;18773:39;;18756:6;18763;18756:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18836:2;18827:11;;;;;:::i;:::-;;;18696:154;;;18874:6;18860:21;;;;;18166:723;;;;:::o;20824:207::-;20954:4;20998:25;20983:40;;;:11;:40;;;;20976:47;;20824:207;;;:::o;28832:127::-;28897:4;28949:1;28921:30;;:7;:16;28929:7;28921:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28914:37;;28832:127;;;:::o;17583:98::-;17636:7;17663:10;17656:17;;17583:98;:::o;33119:174::-;33221:2;33194:15;:24;33210:7;33194:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33277:7;33273:2;33239:46;;33248:23;33263:7;33248:14;:23::i;:::-;33239:46;;;;;;;;;;;;33119:174;;:::o;29126:452::-;29255:4;29299:16;29307:7;29299;:16::i;:::-;29277:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;29398:13;29414:23;29429:7;29414:14;:23::i;:::-;29398:39;;29467:5;29456:16;;:7;:16;;;:65;;;;29489:32;29506:5;29513:7;29489:16;:32::i;:::-;29456:65;:113;;;;29562:7;29538:31;;:20;29550:7;29538:11;:20::i;:::-;:31;;;29456:113;29448:122;;;29126:452;;;;:::o;32339:662::-;32512:4;32485:31;;:23;32500:7;32485:14;:23::i;:::-;:31;;;32463:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;32614:1;32600:16;;:2;:16;;;;32592:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32670:39;32691:4;32697:2;32701:7;32670:20;:39::i;:::-;32774:29;32791:1;32795:7;32774:8;:29::i;:::-;32835:1;32816:9;:15;32826:4;32816:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32864:1;32847:9;:13;32857:2;32847:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32895:2;32876:7;:16;32884:7;32876:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32934:7;32930:2;32915:27;;32924:4;32915:27;;;;;;;;;;;;32955:38;32975:4;32981:2;32985:7;32955:19;:38::i;:::-;32339:662;;;:::o;51061:191::-;51135:16;51154:6;;;;;;;;;;;51135:25;;51180:8;51171:6;;:17;;;;;;;;;;;;;;;;;;51235:8;51204:40;;51225:8;51204:40;;;;;;;;;;;;51124:128;51061:191;:::o;33435:315::-;33590:8;33581:17;;:5;:17;;;;33573:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;33677:8;33639:18;:25;33658:5;33639:25;;;;;;;;;;;;;;;:35;33665:8;33639:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;33723:8;33701:41;;33716:5;33701:41;;;33733:8;33701:41;;;;;;:::i;:::-;;;;;;;;33435:315;;;:::o;56905:125::-;56962:60;57018:2;56978:43;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56962:15;:60::i;:::-;56905:125;:::o;167703:300::-;167820:12;167850:21;167874:72;167926:9;167874:29;:4;:27;:29::i;:::-;:37;;:72;;;;:::i;:::-;167850:96;;167981:14;;;;;;;;;;;167964:31;;:13;:31;;;167957:38;;;167703:300;;;;:::o;168011:414::-;168087:24;168093:8;168103:7;168087:24;;:5;:24::i;:::-;168122:17;168200:13;168239:18;:7;:16;;;:18::i;:::-;168277:14;;;;;;;;;;;;;;;;;168163:143;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;168122:195;;168328:26;168341:7;168328:26;;168350:3;168328:12;:26::i;:::-;168392:7;168370:47;;168382:8;168370:47;;;168401:15;168370:47;;;;;;:::i;:::-;;;;;;;;168076:349;168011:414;;:::o;28167:352::-;28324:28;28334:4;28340:2;28344:7;28324:9;:28::i;:::-;28385:48;28408:4;28414:2;28418:7;28427:5;28385:22;:48::i;:::-;28363:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;28167:352;;;;:::o;24665:94::-;24716:13;24742:9;;;;;;;;;;;;;;24665:94;:::o;23948:468::-;24066:13;24119:16;24127:7;24119;:16::i;:::-;24097:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;24223:21;24247:10;:8;:10::i;:::-;24223:34;;24312:1;24294:7;24288:21;:25;:120;;;;;;;;;;;;;;;;;24357:7;24366:18;:7;:16;:18::i;:::-;24340:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24288:120;24268:140;;;23948:468;;;:::o;35867:126::-;;;;:::o;36378:125::-;;;;:::o;51460:457::-;51531:21;51555:7;:14;51531:38;;51580:22;51408:42;51580:40;;51688:2;51679:7;51675:16;51883:1;51863;51831:13;51800:12;51767:14;51743:5;51714:185;51640:270;;;;51460:457;:::o;47037:346::-;47133:7;47355:4;47302:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;47274:101;;;;;;47254:121;;47037:346;;;:::o;43115:263::-;43220:7;43246:17;43265:18;43287:27;43298:4;43304:9;43287:10;:27::i;:::-;43245:69;;;;43325:18;43337:5;43325:11;:18::i;:::-;43361:9;43354:16;;;;43115:263;;;;:::o;30914:439::-;31008:1;30994:16;;:2;:16;;;;30986:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;31067:16;31075:7;31067;:16::i;:::-;31066:17;31058:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31129:45;31158:1;31162:2;31166:7;31129:20;:45::i;:::-;31204:1;31187:9;:13;31197:2;31187:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31235:2;31216:7;:16;31224:7;31216:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31280:7;31276:2;31255:33;;31272:1;31255:33;;;;;;;;;;;;31301:44;31329:1;31333:2;31337:7;31301:19;:44::i;:::-;30914:439;;:::o;37945:277::-;38082:16;38090:7;38082;:16::i;:::-;38060:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;38205:9;38183:10;:19;38194:7;38183:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;37945:277;;:::o;34315:980::-;34470:4;34491:15;:2;:13;;;:15::i;:::-;34487:801;;;34560:2;34544:36;;;34603:12;:10;:12::i;:::-;34638:4;34665:7;34695:5;34544:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34523:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34919:1;34902:6;:13;:18;34898:320;;;34945:108;;;;;;;;;;:::i;:::-;;;;;;;;34898:320;35168:6;35162:13;35153:6;35149:2;35145:15;35138:38;34523:710;34793:41;;;34783:51;;;:6;:51;;;;34776:58;;;;;34487:801;35272:4;35265:11;;34315:980;;;;;;;:::o;40973:1340::-;41081:7;41090:12;41340:2;41320:9;:16;:22;41316:990;;;41359:9;41383;41407:7;41616:4;41605:9;41601:20;41595:27;41590:32;;41666:4;41655:9;41651:20;41645:27;41640:32;;41724:4;41713:9;41709:20;41703:27;41700:1;41695:36;41690:41;;41767:25;41778:4;41784:1;41787;41790;41767:10;:25::i;:::-;41760:32;;;;;;;;;41316:990;41834:2;41814:9;:16;:22;41810:496;;;41853:9;41877:10;42089:4;42078:9;42074:20;42068:27;42063:32;;42140:4;42129:9;42125:20;42119:27;42113:33;;42182:23;42193:4;42199:1;42202:2;42182:10;:23::i;:::-;42175:30;;;;;;;;41810:496;42254:1;42258:35;42238:56;;;;40973:1340;;;;;;:::o;39244:643::-;39322:20;39313:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;39309:571;;;39359:7;;39309:571;39420:29;39411:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;39407:473;;;39466:34;;;;;;;;;;:::i;:::-;;;;;;;;39407:473;39531:35;39522:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;39518:362;;;39583:41;;;;;;;;;;:::i;:::-;;;;;;;;39518:362;39655:30;39646:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;39642:238;;;39702:44;;;;;;;;;;:::i;:::-;;;;;;;;39642:238;39777:30;39768:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;39764:116;;;39824:44;;;;;;;;;;:::i;:::-;;;;;;;;39764:116;39244:643;;:::o;9163:326::-;9223:4;9480:1;9458:7;:19;;;:23;9451:30;;9163:326;;;:::o;44644:1675::-;44775:7;44784:12;45742:66;45724:1;45716:10;;:92;45698:200;;;45851:1;45855:30;45835:51;;;;;;45698:200;45917:2;45912:1;:7;;;;:18;;;;;45928:2;45923:1;:7;;;;45912:18;45908:102;;;45963:1;45967:30;45947:51;;;;;;45908:102;46107:14;46124:24;46134:4;46140:1;46143;46146;46124:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46107:41;;46181:1;46163:20;;:6;:20;;;46159:103;;;46216:1;46220:29;46200:50;;;;;;;46159:103;46282:6;46290:20;46274:37;;;;;44644:1675;;;;;;;;:::o;43641:389::-;43755:7;43764:12;43789:9;43845:66;43819:107;;43801:2;:125;43789:137;;43937:7;43976:2;43969:3;43962:2;43954:11;;:18;;43953:25;;;;:::i;:::-;43937:42;;43997:25;44008:4;44014:1;44017;44020;43997:10;:25::i;:::-;43990:32;;;;;;43641:389;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:619::-;5015:6;5023;5031;5080:2;5068:9;5059:7;5055:23;5051:32;5048:119;;;5086:79;;:::i;:::-;5048:119;5206:1;5231:53;5276:7;5267:6;5256:9;5252:22;5231:53;:::i;:::-;5221:63;;5177:117;5333:2;5359:53;5404:7;5395:6;5384:9;5380:22;5359:53;:::i;:::-;5349:63;;5304:118;5461:2;5487:53;5532:7;5523:6;5512:9;5508:22;5487:53;:::i;:::-;5477:63;;5432:118;4938:619;;;;;:::o;5563:329::-;5622:6;5671:2;5659:9;5650:7;5646:23;5642:32;5639:119;;;5677:79;;:::i;:::-;5639:119;5797:1;5822:53;5867:7;5858:6;5847:9;5843:22;5822:53;:::i;:::-;5812:63;;5768:117;5563:329;;;;:::o;5898:118::-;5985:24;6003:5;5985:24;:::i;:::-;5980:3;5973:37;5898:118;;:::o;6022:222::-;6115:4;6153:2;6142:9;6138:18;6130:26;;6166:71;6234:1;6223:9;6219:17;6210:6;6166:71;:::i;:::-;6022:222;;;;:::o;6250:116::-;6320:21;6335:5;6320:21;:::i;:::-;6313:5;6310:32;6300:60;;6356:1;6353;6346:12;6300:60;6250:116;:::o;6372:133::-;6415:5;6453:6;6440:20;6431:29;;6469:30;6493:5;6469:30;:::i;:::-;6372:133;;;;:::o;6511:468::-;6576:6;6584;6633:2;6621:9;6612:7;6608:23;6604:32;6601:119;;;6639:79;;:::i;:::-;6601:119;6759:1;6784:53;6829:7;6820:6;6809:9;6805:22;6784:53;:::i;:::-;6774:63;;6730:117;6886:2;6912:50;6954:7;6945:6;6934:9;6930:22;6912:50;:::i;:::-;6902:60;;6857:115;6511:468;;;;;:::o;6985:93::-;7021:7;7061:10;7054:5;7050:22;7039:33;;6985:93;;;:::o;7084:120::-;7156:23;7173:5;7156:23;:::i;:::-;7149:5;7146:34;7136:62;;7194:1;7191;7184:12;7136:62;7084:120;:::o;7210:137::-;7255:5;7293:6;7280:20;7271:29;;7309:32;7335:5;7309:32;:::i;:::-;7210:137;;;;:::o;7353:101::-;7389:7;7429:18;7422:5;7418:30;7407:41;;7353:101;;;:::o;7460:120::-;7532:23;7549:5;7532:23;:::i;:::-;7525:5;7522:34;7512:62;;7570:1;7567;7560:12;7512:62;7460:120;:::o;7586:137::-;7631:5;7669:6;7656:20;7647:29;;7685:32;7711:5;7685:32;:::i;:::-;7586:137;;;;:::o;7729:117::-;7838:1;7835;7828:12;7852:117;7961:1;7958;7951:12;7975:180;8023:77;8020:1;8013:88;8120:4;8117:1;8110:15;8144:4;8141:1;8134:15;8161:281;8244:27;8266:4;8244:27;:::i;:::-;8236:6;8232:40;8374:6;8362:10;8359:22;8338:18;8326:10;8323:34;8320:62;8317:88;;;8385:18;;:::i;:::-;8317:88;8425:10;8421:2;8414:22;8204:238;8161:281;;:::o;8448:129::-;8482:6;8509:20;;:::i;:::-;8499:30;;8538:33;8566:4;8558:6;8538:33;:::i;:::-;8448:129;;;:::o;8583:307::-;8644:4;8734:18;8726:6;8723:30;8720:56;;;8756:18;;:::i;:::-;8720:56;8794:29;8816:6;8794:29;:::i;:::-;8786:37;;8878:4;8872;8868:15;8860:23;;8583:307;;;:::o;8896:154::-;8980:6;8975:3;8970;8957:30;9042:1;9033:6;9028:3;9024:16;9017:27;8896:154;;;:::o;9056:410::-;9133:5;9158:65;9174:48;9215:6;9174:48;:::i;:::-;9158:65;:::i;:::-;9149:74;;9246:6;9239:5;9232:21;9284:4;9277:5;9273:16;9322:3;9313:6;9308:3;9304:16;9301:25;9298:112;;;9329:79;;:::i;:::-;9298:112;9419:41;9453:6;9448:3;9443;9419:41;:::i;:::-;9139:327;9056:410;;;;;:::o;9485:338::-;9540:5;9589:3;9582:4;9574:6;9570:17;9566:27;9556:122;;9597:79;;:::i;:::-;9556:122;9714:6;9701:20;9739:78;9813:3;9805:6;9798:4;9790:6;9786:17;9739:78;:::i;:::-;9730:87;;9546:277;9485:338;;;;:::o;9829:793::-;9913:6;9921;9929;9978:2;9966:9;9957:7;9953:23;9949:32;9946:119;;;9984:79;;:::i;:::-;9946:119;10104:1;10129:52;10173:7;10164:6;10153:9;10149:22;10129:52;:::i;:::-;10119:62;;10075:116;10230:2;10256:52;10300:7;10291:6;10280:9;10276:22;10256:52;:::i;:::-;10246:62;;10201:117;10385:2;10374:9;10370:18;10357:32;10416:18;10408:6;10405:30;10402:117;;;10438:79;;:::i;:::-;10402:117;10543:62;10597:7;10588:6;10577:9;10573:22;10543:62;:::i;:::-;10533:72;;10328:287;9829:793;;;;;:::o;10628:943::-;10723:6;10731;10739;10747;10796:3;10784:9;10775:7;10771:23;10767:33;10764:120;;;10803:79;;:::i;:::-;10764:120;10923:1;10948:53;10993:7;10984:6;10973:9;10969:22;10948:53;:::i;:::-;10938:63;;10894:117;11050:2;11076:53;11121:7;11112:6;11101:9;11097:22;11076:53;:::i;:::-;11066:63;;11021:118;11178:2;11204:53;11249:7;11240:6;11229:9;11225:22;11204:53;:::i;:::-;11194:63;;11149:118;11334:2;11323:9;11319:18;11306:32;11365:18;11357:6;11354:30;11351:117;;;11387:79;;:::i;:::-;11351:117;11492:62;11546:7;11537:6;11526:9;11522:22;11492:62;:::i;:::-;11482:72;;11277:287;10628:943;;;;;;;:::o;11577:474::-;11645:6;11653;11702:2;11690:9;11681:7;11677:23;11673:32;11670:119;;;11708:79;;:::i;:::-;11670:119;11828:1;11853:53;11898:7;11889:6;11878:9;11874:22;11853:53;:::i;:::-;11843:63;;11799:117;11955:2;11981:53;12026:7;12017:6;12006:9;12002:22;11981:53;:::i;:::-;11971:63;;11926:118;11577:474;;;;;:::o;12057:180::-;12105:77;12102:1;12095:88;12202:4;12199:1;12192:15;12226:4;12223:1;12216:15;12243:320;12287:6;12324:1;12318:4;12314:12;12304:22;;12371:1;12365:4;12361:12;12392:18;12382:81;;12448:4;12440:6;12436:17;12426:27;;12382:81;12510:2;12502:6;12499:14;12479:18;12476:38;12473:84;;;12529:18;;:::i;:::-;12473:84;12294:269;12243:320;;;:::o;12569:231::-;12709:34;12705:1;12697:6;12693:14;12686:58;12778:14;12773:2;12765:6;12761:15;12754:39;12569:231;:::o;12806:366::-;12948:3;12969:67;13033:2;13028:3;12969:67;:::i;:::-;12962:74;;13045:93;13134:3;13045:93;:::i;:::-;13163:2;13158:3;13154:12;13147:19;;12806:366;;;:::o;13178:419::-;13344:4;13382:2;13371:9;13367:18;13359:26;;13431:9;13425:4;13421:20;13417:1;13406:9;13402:17;13395:47;13459:131;13585:4;13459:131;:::i;:::-;13451:139;;13178:419;;;:::o;13603:220::-;13743:34;13739:1;13731:6;13727:14;13720:58;13812:3;13807:2;13799:6;13795:15;13788:28;13603:220;:::o;13829:366::-;13971:3;13992:67;14056:2;14051:3;13992:67;:::i;:::-;13985:74;;14068:93;14157:3;14068:93;:::i;:::-;14186:2;14181:3;14177:12;14170:19;;13829:366;;;:::o;14201:419::-;14367:4;14405:2;14394:9;14390:18;14382:26;;14454:9;14448:4;14444:20;14440:1;14429:9;14425:17;14418:47;14482:131;14608:4;14482:131;:::i;:::-;14474:139;;14201:419;;;:::o;14626:243::-;14766:34;14762:1;14754:6;14750:14;14743:58;14835:26;14830:2;14822:6;14818:15;14811:51;14626:243;:::o;14875:366::-;15017:3;15038:67;15102:2;15097:3;15038:67;:::i;:::-;15031:74;;15114:93;15203:3;15114:93;:::i;:::-;15232:2;15227:3;15223:12;15216:19;;14875:366;;;:::o;15247:419::-;15413:4;15451:2;15440:9;15436:18;15428:26;;15500:9;15494:4;15490:20;15486:1;15475:9;15471:17;15464:47;15528:131;15654:4;15528:131;:::i;:::-;15520:139;;15247:419;;;:::o;15672:236::-;15812:34;15808:1;15800:6;15796:14;15789:58;15881:19;15876:2;15868:6;15864:15;15857:44;15672:236;:::o;15914:366::-;16056:3;16077:67;16141:2;16136:3;16077:67;:::i;:::-;16070:74;;16153:93;16242:3;16153:93;:::i;:::-;16271:2;16266:3;16262:12;16255:19;;15914:366;;;:::o;16286:419::-;16452:4;16490:2;16479:9;16475:18;16467:26;;16539:9;16533:4;16529:20;16525:1;16514:9;16510:17;16503:47;16567:131;16693:4;16567:131;:::i;:::-;16559:139;;16286:419;;;:::o;16711:228::-;16851:34;16847:1;16839:6;16835:14;16828:58;16920:11;16915:2;16907:6;16903:15;16896:36;16711:228;:::o;16945:366::-;17087:3;17108:67;17172:2;17167:3;17108:67;:::i;:::-;17101:74;;17184:93;17273:3;17184:93;:::i;:::-;17302:2;17297:3;17293:12;17286:19;;16945:366;;;:::o;17317:419::-;17483:4;17521:2;17510:9;17506:18;17498:26;;17570:9;17564:4;17560:20;17556:1;17545:9;17541:17;17534:47;17598:131;17724:4;17598:131;:::i;:::-;17590:139;;17317:419;;;:::o;17742:182::-;17882:34;17878:1;17870:6;17866:14;17859:58;17742:182;:::o;17930:366::-;18072:3;18093:67;18157:2;18152:3;18093:67;:::i;:::-;18086:74;;18169:93;18258:3;18169:93;:::i;:::-;18287:2;18282:3;18278:12;18271:19;;17930:366;;;:::o;18302:419::-;18468:4;18506:2;18495:9;18491:18;18483:26;;18555:9;18549:4;18545:20;18541:1;18530:9;18526:17;18519:47;18583:131;18709:4;18583:131;:::i;:::-;18575:139;;18302:419;;;:::o;18727:229::-;18867:34;18863:1;18855:6;18851:14;18844:58;18936:12;18931:2;18923:6;18919:15;18912:37;18727:229;:::o;18962:366::-;19104:3;19125:67;19189:2;19184:3;19125:67;:::i;:::-;19118:74;;19201:93;19290:3;19201:93;:::i;:::-;19319:2;19314:3;19310:12;19303:19;;18962:366;;;:::o;19334:419::-;19500:4;19538:2;19527:9;19523:18;19515:26;;19587:9;19581:4;19577:20;19573:1;19562:9;19558:17;19551:47;19615:131;19741:4;19615:131;:::i;:::-;19607:139;;19334:419;;;:::o;19759:178::-;19899:30;19895:1;19887:6;19883:14;19876:54;19759:178;:::o;19943:366::-;20085:3;20106:67;20170:2;20165:3;20106:67;:::i;:::-;20099:74;;20182:93;20271:3;20182:93;:::i;:::-;20300:2;20295:3;20291:12;20284:19;;19943:366;;;:::o;20315:419::-;20481:4;20519:2;20508:9;20504:18;20496:26;;20568:9;20562:4;20558:20;20554:1;20543:9;20539:17;20532:47;20596:131;20722:4;20596:131;:::i;:::-;20588:139;;20315:419;;;:::o;20740:180::-;20788:77;20785:1;20778:88;20885:4;20882:1;20875:15;20909:4;20906:1;20899:15;20926:191;20966:4;20986:20;21004:1;20986:20;:::i;:::-;20981:25;;21020:20;21038:1;21020:20;:::i;:::-;21015:25;;21059:1;21056;21053:8;21050:34;;;21064:18;;:::i;:::-;21050:34;21109:1;21106;21102:9;21094:17;;20926:191;;;;:::o;21123:94::-;21156:8;21204:5;21200:2;21196:14;21175:35;;21123:94;;;:::o;21223:::-;21262:7;21291:20;21305:5;21291:20;:::i;:::-;21280:31;;21223:94;;;:::o;21323:100::-;21362:7;21391:26;21411:5;21391:26;:::i;:::-;21380:37;;21323:100;;;:::o;21429:157::-;21534:45;21554:24;21572:5;21554:24;:::i;:::-;21534:45;:::i;:::-;21529:3;21522:58;21429:157;;:::o;21592:96::-;21626:8;21675:5;21670:3;21666:15;21645:36;;21592:96;;;:::o;21694:94::-;21732:7;21761:21;21776:5;21761:21;:::i;:::-;21750:32;;21694:94;;;:::o;21794:153::-;21897:43;21916:23;21933:5;21916:23;:::i;:::-;21897:43;:::i;:::-;21892:3;21885:56;21794:153;;:::o;21953:96::-;21987:8;22036:5;22031:3;22027:15;22006:36;;21953:96;;;:::o;22055:94::-;22093:7;22122:21;22137:5;22122:21;:::i;:::-;22111:32;;22055:94;;;:::o;22155:153::-;22258:43;22277:23;22294:5;22277:23;:::i;:::-;22258:43;:::i;:::-;22253:3;22246:56;22155:153;;:::o;22314:528::-;22478:3;22493:75;22564:3;22555:6;22493:75;:::i;:::-;22593:2;22588:3;22584:12;22577:19;;22606:73;22675:3;22666:6;22606:73;:::i;:::-;22704:1;22699:3;22695:11;22688:18;;22716:73;22785:3;22776:6;22716:73;:::i;:::-;22814:1;22809:3;22805:11;22798:18;;22833:3;22826:10;;22314:528;;;;;;:::o;22848:254::-;22887:3;22906:19;22923:1;22906:19;:::i;:::-;22901:24;;22939:19;22956:1;22939:19;:::i;:::-;22934:24;;23044:1;23024:18;23020:26;23017:1;23014:33;23011:59;;;23050:18;;:::i;:::-;23011:59;23094:1;23091;23087:9;23080:16;;22848:254;;;;:::o;23108:224::-;23248:34;23244:1;23236:6;23232:14;23225:58;23317:7;23312:2;23304:6;23300:15;23293:32;23108:224;:::o;23338:366::-;23480:3;23501:67;23565:2;23560:3;23501:67;:::i;:::-;23494:74;;23577:93;23666:3;23577:93;:::i;:::-;23695:2;23690:3;23686:12;23679:19;;23338:366;;;:::o;23710:419::-;23876:4;23914:2;23903:9;23899:18;23891:26;;23963:9;23957:4;23953:20;23949:1;23938:9;23934:17;23927:47;23991:131;24117:4;23991:131;:::i;:::-;23983:139;;23710:419;;;:::o;24135:236::-;24275:34;24271:1;24263:6;24259:14;24252:58;24344:19;24339:2;24331:6;24327:15;24320:44;24135:236;:::o;24377:366::-;24519:3;24540:67;24604:2;24599:3;24540:67;:::i;:::-;24533:74;;24616:93;24705:3;24616:93;:::i;:::-;24734:2;24729:3;24725:12;24718:19;;24377:366;;;:::o;24749:419::-;24915:4;24953:2;24942:9;24938:18;24930:26;;25002:9;24996:4;24992:20;24988:1;24977:9;24973:17;24966:47;25030:131;25156:4;25030:131;:::i;:::-;25022:139;;24749:419;;;:::o;25174:148::-;25276:11;25313:3;25298:18;;25174:148;;;;:::o;25328:377::-;25434:3;25462:39;25495:5;25462:39;:::i;:::-;25517:89;25599:6;25594:3;25517:89;:::i;:::-;25510:96;;25615:52;25660:6;25655:3;25648:4;25641:5;25637:16;25615:52;:::i;:::-;25692:6;25687:3;25683:16;25676:23;;25438:267;25328:377;;;;:::o;25711:435::-;25891:3;25913:95;26004:3;25995:6;25913:95;:::i;:::-;25906:102;;26025:95;26116:3;26107:6;26025:95;:::i;:::-;26018:102;;26137:3;26130:10;;25711:435;;;;;:::o;26152:225::-;26292:34;26288:1;26280:6;26276:14;26269:58;26361:8;26356:2;26348:6;26344:15;26337:33;26152:225;:::o;26383:366::-;26525:3;26546:67;26610:2;26605:3;26546:67;:::i;:::-;26539:74;;26622:93;26711:3;26622:93;:::i;:::-;26740:2;26735:3;26731:12;26724:19;;26383:366;;;:::o;26755:419::-;26921:4;26959:2;26948:9;26944:18;26936:26;;27008:9;27002:4;26998:20;26994:1;26983:9;26979:17;26972:47;27036:131;27162:4;27036:131;:::i;:::-;27028:139;;26755:419;;;:::o;27180:233::-;27219:3;27242:24;27260:5;27242:24;:::i;:::-;27233:33;;27288:66;27281:5;27278:77;27275:103;;;27358:18;;:::i;:::-;27275:103;27405:1;27398:5;27394:13;27387:20;;27180:233;;;:::o;27419:180::-;27467:77;27464:1;27457:88;27564:4;27561:1;27554:15;27588:4;27585:1;27578:15;27605:185;27645:1;27662:20;27680:1;27662:20;:::i;:::-;27657:25;;27696:20;27714:1;27696:20;:::i;:::-;27691:25;;27735:1;27725:35;;27740:18;;:::i;:::-;27725:35;27782:1;27779;27775:9;27770:14;;27605:185;;;;:::o;27796:176::-;27828:1;27845:20;27863:1;27845:20;:::i;:::-;27840:25;;27879:20;27897:1;27879:20;:::i;:::-;27874:25;;27918:1;27908:35;;27923:18;;:::i;:::-;27908:35;27964:1;27961;27957:9;27952:14;;27796:176;;;;:::o;27978:305::-;28018:3;28037:20;28055:1;28037:20;:::i;:::-;28032:25;;28071:20;28089:1;28071:20;:::i;:::-;28066:25;;28225:1;28157:66;28153:74;28150:1;28147:81;28144:107;;;28231:18;;:::i;:::-;28144:107;28275:1;28272;28268:9;28261:16;;27978:305;;;;:::o;28289:180::-;28337:77;28334:1;28327:88;28434:4;28431:1;28424:15;28458:4;28455:1;28448:15;28475:231;28615:34;28611:1;28603:6;28599:14;28592:58;28684:14;28679:2;28671:6;28667:15;28660:39;28475:231;:::o;28712:366::-;28854:3;28875:67;28939:2;28934:3;28875:67;:::i;:::-;28868:74;;28951:93;29040:3;28951:93;:::i;:::-;29069:2;29064:3;29060:12;29053:19;;28712:366;;;:::o;29084:419::-;29250:4;29288:2;29277:9;29273:18;29265:26;;29337:9;29331:4;29327:20;29323:1;29312:9;29308:17;29301:47;29365:131;29491:4;29365:131;:::i;:::-;29357:139;;29084:419;;;:::o;29509:224::-;29649:34;29645:1;29637:6;29633:14;29626:58;29718:7;29713:2;29705:6;29701:15;29694:32;29509:224;:::o;29739:366::-;29881:3;29902:67;29966:2;29961:3;29902:67;:::i;:::-;29895:74;;29978:93;30067:3;29978:93;:::i;:::-;30096:2;30091:3;30087:12;30080:19;;29739:366;;;:::o;30111:419::-;30277:4;30315:2;30304:9;30300:18;30292:26;;30364:9;30358:4;30354:20;30350:1;30339:9;30335:17;30328:47;30392:131;30518:4;30392:131;:::i;:::-;30384:139;;30111:419;;;:::o;30536:223::-;30676:34;30672:1;30664:6;30660:14;30653:58;30745:6;30740:2;30732:6;30728:15;30721:31;30536:223;:::o;30765:366::-;30907:3;30928:67;30992:2;30987:3;30928:67;:::i;:::-;30921:74;;31004:93;31093:3;31004:93;:::i;:::-;31122:2;31117:3;31113:12;31106:19;;30765:366;;;:::o;31137:419::-;31303:4;31341:2;31330:9;31326:18;31318:26;;31390:9;31384:4;31380:20;31376:1;31365:9;31361:17;31354:47;31418:131;31544:4;31418:131;:::i;:::-;31410:139;;31137:419;;;:::o;31562:175::-;31702:27;31698:1;31690:6;31686:14;31679:51;31562:175;:::o;31743:366::-;31885:3;31906:67;31970:2;31965:3;31906:67;:::i;:::-;31899:74;;31982:93;32071:3;31982:93;:::i;:::-;32100:2;32095:3;32091:12;32084:19;;31743:366;;;:::o;32115:419::-;32281:4;32319:2;32308:9;32304:18;32296:26;;32368:9;32362:4;32358:20;32354:1;32343:9;32339:17;32332:47;32396:131;32522:4;32396:131;:::i;:::-;32388:139;;32115:419;;;:::o;32540:77::-;32577:7;32606:5;32595:16;;32540:77;;;:::o;32623:118::-;32710:24;32728:5;32710:24;:::i;:::-;32705:3;32698:37;32623:118;;:::o;32747:222::-;32840:4;32878:2;32867:9;32863:18;32855:26;;32891:71;32959:1;32948:9;32944:17;32935:6;32891:71;:::i;:::-;32747:222;;;;:::o;32975:147::-;33076:11;33113:3;33098:18;;32975:147;;;;:::o;33128:144::-;33180:4;33203:3;33195:11;;33226:3;33223:1;33216:14;33260:4;33257:1;33247:18;33239:26;;33128:144;;;:::o;33300:849::-;33405:3;33442:5;33436:12;33471:36;33497:9;33471:36;:::i;:::-;33523:88;33604:6;33599:3;33523:88;:::i;:::-;33516:95;;33642:1;33631:9;33627:17;33658:1;33653:137;;;;33804:1;33799:344;;;;33620:523;;33653:137;33737:4;33733:9;33722;33718:25;33713:3;33706:38;33773:6;33768:3;33764:16;33757:23;;33653:137;;33799:344;33866:41;33901:5;33866:41;:::i;:::-;33929:1;33943:154;33957:6;33954:1;33951:13;33943:154;;;34031:7;34025:14;34021:1;34016:3;34012:11;34005:35;34081:1;34072:7;34068:15;34057:26;;33979:4;33976:1;33972:12;33967:17;;33943:154;;;34126:6;34121:3;34117:16;34110:23;;33806:337;;33620:523;;33409:740;;33300:849;;;;:::o;34155:98::-;34206:6;34240:5;34234:12;34224:22;;34155:98;;;:::o;34259:373::-;34363:3;34391:38;34423:5;34391:38;:::i;:::-;34445:88;34526:6;34521:3;34445:88;:::i;:::-;34438:95;;34542:52;34587:6;34582:3;34575:4;34568:5;34564:16;34542:52;:::i;:::-;34619:6;34614:3;34610:16;34603:23;;34367:265;34259:373;;;;:::o;34638:585::-;34861:3;34883:94;34973:3;34964:6;34883:94;:::i;:::-;34876:101;;34994:93;35083:3;35074:6;34994:93;:::i;:::-;34987:100;;35104:93;35193:3;35184:6;35104:93;:::i;:::-;35097:100;;35214:3;35207:10;;34638:585;;;;;;:::o;35229:237::-;35369:34;35365:1;35357:6;35353:14;35346:58;35438:20;35433:2;35425:6;35421:15;35414:45;35229:237;:::o;35472:366::-;35614:3;35635:67;35699:2;35694:3;35635:67;:::i;:::-;35628:74;;35711:93;35800:3;35711:93;:::i;:::-;35829:2;35824:3;35820:12;35813:19;;35472:366;;;:::o;35844:419::-;36010:4;36048:2;36037:9;36033:18;36025:26;;36097:9;36091:4;36087:20;36083:1;36072:9;36068:17;36061:47;36125:131;36251:4;36125:131;:::i;:::-;36117:139;;35844:419;;;:::o;36269:234::-;36409:34;36405:1;36397:6;36393:14;36386:58;36478:17;36473:2;36465:6;36461:15;36454:42;36269:234;:::o;36509:366::-;36651:3;36672:67;36736:2;36731:3;36672:67;:::i;:::-;36665:74;;36748:93;36837:3;36748:93;:::i;:::-;36866:2;36861:3;36857:12;36850:19;;36509:366;;;:::o;36881:419::-;37047:4;37085:2;37074:9;37070:18;37062:26;;37134:9;37128:4;37124:20;37120:1;37109:9;37105:17;37098:47;37162:131;37288:4;37162:131;:::i;:::-;37154:139;;36881:419;;;:::o;37306:214::-;37446:66;37442:1;37434:6;37430:14;37423:90;37306:214;:::o;37526:402::-;37686:3;37707:85;37789:2;37784:3;37707:85;:::i;:::-;37700:92;;37801:93;37890:3;37801:93;:::i;:::-;37919:2;37914:3;37910:12;37903:19;;37526:402;;;:::o;37934:79::-;37973:7;38002:5;37991:16;;37934:79;;;:::o;38019:157::-;38124:45;38144:24;38162:5;38144:24;:::i;:::-;38124:45;:::i;:::-;38119:3;38112:58;38019:157;;:::o;38182:522::-;38395:3;38417:148;38561:3;38417:148;:::i;:::-;38410:155;;38575:75;38646:3;38637:6;38575:75;:::i;:::-;38675:2;38670:3;38666:12;38659:19;;38695:3;38688:10;;38182:522;;;;:::o;38710:182::-;38850:34;38846:1;38838:6;38834:14;38827:58;38710:182;:::o;38898:366::-;39040:3;39061:67;39125:2;39120:3;39061:67;:::i;:::-;39054:74;;39137:93;39226:3;39137:93;:::i;:::-;39255:2;39250:3;39246:12;39239:19;;38898:366;;;:::o;39270:419::-;39436:4;39474:2;39463:9;39459:18;39451:26;;39523:9;39517:4;39513:20;39509:1;39498:9;39494:17;39487:47;39551:131;39677:4;39551:131;:::i;:::-;39543:139;;39270:419;;;:::o;39695:178::-;39835:30;39831:1;39823:6;39819:14;39812:54;39695:178;:::o;39879:366::-;40021:3;40042:67;40106:2;40101:3;40042:67;:::i;:::-;40035:74;;40118:93;40207:3;40118:93;:::i;:::-;40236:2;40231:3;40227:12;40220:19;;39879:366;;;:::o;40251:419::-;40417:4;40455:2;40444:9;40440:18;40432:26;;40504:9;40498:4;40494:20;40490:1;40479:9;40475:17;40468:47;40532:131;40658:4;40532:131;:::i;:::-;40524:139;;40251:419;;;:::o;40676:233::-;40816:34;40812:1;40804:6;40800:14;40793:58;40885:16;40880:2;40872:6;40868:15;40861:41;40676:233;:::o;40915:366::-;41057:3;41078:67;41142:2;41137:3;41078:67;:::i;:::-;41071:74;;41154:93;41243:3;41154:93;:::i;:::-;41272:2;41267:3;41263:12;41256:19;;40915:366;;;:::o;41287:419::-;41453:4;41491:2;41480:9;41476:18;41468:26;;41540:9;41534:4;41530:20;41526:1;41515:9;41511:17;41504:47;41568:131;41694:4;41568:131;:::i;:::-;41560:139;;41287:419;;;:::o;41712:168::-;41795:11;41829:6;41824:3;41817:19;41869:4;41864:3;41860:14;41845:29;;41712:168;;;;:::o;41886:360::-;41972:3;42000:38;42032:5;42000:38;:::i;:::-;42054:70;42117:6;42112:3;42054:70;:::i;:::-;42047:77;;42133:52;42178:6;42173:3;42166:4;42159:5;42155:16;42133:52;:::i;:::-;42210:29;42232:6;42210:29;:::i;:::-;42205:3;42201:39;42194:46;;41976:270;41886:360;;;;:::o;42252:640::-;42447:4;42485:3;42474:9;42470:19;42462:27;;42499:71;42567:1;42556:9;42552:17;42543:6;42499:71;:::i;:::-;42580:72;42648:2;42637:9;42633:18;42624:6;42580:72;:::i;:::-;42662;42730:2;42719:9;42715:18;42706:6;42662:72;:::i;:::-;42781:9;42775:4;42771:20;42766:2;42755:9;42751:18;42744:48;42809:76;42880:4;42871:6;42809:76;:::i;:::-;42801:84;;42252:640;;;;;;;:::o;42898:141::-;42954:5;42985:6;42979:13;42970:22;;43001:32;43027:5;43001:32;:::i;:::-;42898:141;;;;:::o;43045:349::-;43114:6;43163:2;43151:9;43142:7;43138:23;43134:32;43131:119;;;43169:79;;:::i;:::-;43131:119;43289:1;43314:63;43369:7;43360:6;43349:9;43345:22;43314:63;:::i;:::-;43304:73;;43260:127;43045:349;;;;:::o;43400:180::-;43448:77;43445:1;43438:88;43545:4;43542:1;43535:15;43569:4;43566:1;43559:15;43586:174;43726:26;43722:1;43714:6;43710:14;43703:50;43586:174;:::o;43766:366::-;43908:3;43929:67;43993:2;43988:3;43929:67;:::i;:::-;43922:74;;44005:93;44094:3;44005:93;:::i;:::-;44123:2;44118:3;44114:12;44107:19;;43766:366;;;:::o;44138:419::-;44304:4;44342:2;44331:9;44327:18;44319:26;;44391:9;44385:4;44381:20;44377:1;44366:9;44362:17;44355:47;44419:131;44545:4;44419:131;:::i;:::-;44411:139;;44138:419;;;:::o;44563:181::-;44703:33;44699:1;44691:6;44687:14;44680:57;44563:181;:::o;44750:366::-;44892:3;44913:67;44977:2;44972:3;44913:67;:::i;:::-;44906:74;;44989:93;45078:3;44989:93;:::i;:::-;45107:2;45102:3;45098:12;45091:19;;44750:366;;;:::o;45122:419::-;45288:4;45326:2;45315:9;45311:18;45303:26;;45375:9;45369:4;45365:20;45361:1;45350:9;45346:17;45339:47;45403:131;45529:4;45403:131;:::i;:::-;45395:139;;45122:419;;;:::o;45547:221::-;45687:34;45683:1;45675:6;45671:14;45664:58;45756:4;45751:2;45743:6;45739:15;45732:29;45547:221;:::o;45774:366::-;45916:3;45937:67;46001:2;45996:3;45937:67;:::i;:::-;45930:74;;46013:93;46102:3;46013:93;:::i;:::-;46131:2;46126:3;46122:12;46115:19;;45774:366;;;:::o;46146:419::-;46312:4;46350:2;46339:9;46335:18;46327:26;;46399:9;46393:4;46389:20;46385:1;46374:9;46370:17;46363:47;46427:131;46553:4;46427:131;:::i;:::-;46419:139;;46146:419;;;:::o;46571:221::-;46711:34;46707:1;46699:6;46695:14;46688:58;46780:4;46775:2;46767:6;46763:15;46756:29;46571:221;:::o;46798:366::-;46940:3;46961:67;47025:2;47020:3;46961:67;:::i;:::-;46954:74;;47037:93;47126:3;47037:93;:::i;:::-;47155:2;47150:3;47146:12;47139:19;;46798:366;;;:::o;47170:419::-;47336:4;47374:2;47363:9;47359:18;47351:26;;47423:9;47417:4;47413:20;47409:1;47398:9;47394:17;47387:47;47451:131;47577:4;47451:131;:::i;:::-;47443:139;;47170:419;;;:::o;47595:86::-;47630:7;47670:4;47663:5;47659:16;47648:27;;47595:86;;;:::o;47687:112::-;47770:22;47786:5;47770:22;:::i;:::-;47765:3;47758:35;47687:112;;:::o;47805:545::-;47978:4;48016:3;48005:9;48001:19;47993:27;;48030:71;48098:1;48087:9;48083:17;48074:6;48030:71;:::i;:::-;48111:68;48175:2;48164:9;48160:18;48151:6;48111:68;:::i;:::-;48189:72;48257:2;48246:9;48242:18;48233:6;48189:72;:::i;:::-;48271;48339:2;48328:9;48324:18;48315:6;48271:72;:::i;:::-;47805:545;;;;;;;:::o
Swarm Source
ipfs://9455b44efe0cf2427767cceca115e8a13c1b3993420cb5d8601e7f0d8d89b0c8
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.