ERC-721
Overview
Max Total Supply
20 ESTq
Holders
4
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
4 ESTqLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
MyTextNftn
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-30 */ // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // 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/Address.sol // OpenZeppelin Contracts (last updated v4.7.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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // 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/utils/introspection/IERC165.sol // 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/utils/introspection/ERC165.sol // 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/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.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 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/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // 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/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.7.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: address zero is not a valid owner"); 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: invalid token ID"); 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) { _requireMinted(tokenId); 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 token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); 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: caller is not token 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: caller is not token 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) { 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 an {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 an {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 Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @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 { /// @solidity memory-safe-assembly 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/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @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` cannot be the zero address. * - `to` cannot be the zero address. * * 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 override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts/testNft.sol pragma solidity ^0.8.4; // import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; contract MyTextNftn is ERC721Enumerable { constructor() ERC721("EzSwapTest1", "ESTq") {} uint256 tokenId = 0; function mint(uint256 number,address _to) public { uint256 _tokenId=tokenId; for (uint i = 0; i < number; i++) { _mint(_to, _tokenId); _tokenId += 1; } tokenId=_tokenId; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"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":"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":"uint256","name":"number","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"}]
Contract Creation Code
60806040526000600a553480156200001657600080fd5b506040518060400160405280600b81526020017f457a5377617054657374310000000000000000000000000000000000000000008152506040518060400160405280600481526020017f455354710000000000000000000000000000000000000000000000000000000081525081600090805190602001906200009b929190620000bd565b508060019080519060200190620000b4929190620000bd565b505050620001d2565b828054620000cb906200016d565b90600052602060002090601f016020900481019282620000ef57600085556200013b565b82601f106200010a57805160ff19168380011785556200013b565b828001600101855582156200013b579182015b828111156200013a5782518255916020019190600101906200011d565b5b5090506200014a91906200014e565b5090565b5b80821115620001695760008160009055506001016200014f565b5090565b600060028204905060018216806200018657607f821691505b602082108114156200019d576200019c620001a3565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b612cf180620001e26000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c80634f6ccce7116100a257806395d89b411161007157806395d89b41146102dc578063a22cb465146102fa578063b88d4fde14610316578063c87b56dd14610332578063e985e9c5146103625761010b565b80634f6ccce7146102305780636352211e1461026057806370a082311461029057806394bf804d146102c05761010b565b806318160ddd116100de57806318160ddd146101aa57806323b872dd146101c85780632f745c59146101e457806342842e0e146102145761010b565b806301ffc9a71461011057806306fdde0314610140578063081812fc1461015e578063095ea7b31461018e575b600080fd5b61012a60048036038101906101259190611f6f565b610392565b6040516101379190612348565b60405180910390f35b61014861040c565b6040516101559190612363565b60405180910390f35b61017860048036038101906101739190611fc1565b61049e565b60405161018591906122e1565b60405180910390f35b6101a860048036038101906101a39190611f33565b6104e4565b005b6101b26105fc565b6040516101bf9190612525565b60405180910390f35b6101e260048036038101906101dd9190611e2d565b610609565b005b6101fe60048036038101906101f99190611f33565b610669565b60405161020b9190612525565b60405180910390f35b61022e60048036038101906102299190611e2d565b61070e565b005b61024a60048036038101906102459190611fc1565b61072e565b6040516102579190612525565b60405180910390f35b61027a60048036038101906102759190611fc1565b6107c5565b60405161028791906122e1565b60405180910390f35b6102aa60048036038101906102a59190611dc8565b610877565b6040516102b79190612525565b60405180910390f35b6102da60048036038101906102d59190611fea565b61092f565b005b6102e461097a565b6040516102f19190612363565b60405180910390f35b610314600480360381019061030f9190611ef7565b610a0c565b005b610330600480360381019061032b9190611e7c565b610a22565b005b61034c60048036038101906103479190611fc1565b610a84565b6040516103599190612363565b60405180910390f35b61037c60048036038101906103779190611df1565b610aec565b6040516103899190612348565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610405575061040482610b80565b5b9050919050565b60606000805461041b9061274a565b80601f01602080910402602001604051908101604052809291908181526020018280546104479061274a565b80156104945780601f1061046957610100808354040283529160200191610494565b820191906000526020600020905b81548152906001019060200180831161047757829003601f168201915b5050505050905090565b60006104a982610c62565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104ef826107c5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610560576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610557906124c5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661057f610cad565b73ffffffffffffffffffffffffffffffffffffffff1614806105ae57506105ad816105a8610cad565b610aec565b5b6105ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e490612465565b60405180910390fd5b6105f78383610cb5565b505050565b6000600880549050905090565b61061a610614610cad565b82610d6e565b610659576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065090612505565b60405180910390fd5b610664838383610e03565b505050565b600061067483610877565b82106106b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ac90612385565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61072983838360405180602001604052806000815250610a22565b505050565b60006107386105fc565b8210610779576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610770906124e5565b60405180910390fd5b600882815481106107b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561086e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610865906124a5565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156108e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108df90612445565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600a54905060005b8381101561096d5761094b838361106a565b60018261095891906125d9565b91508080610965906127ad565b915050610939565b5080600a81905550505050565b6060600180546109899061274a565b80601f01602080910402602001604051908101604052809291908181526020018280546109b59061274a565b8015610a025780601f106109d757610100808354040283529160200191610a02565b820191906000526020600020905b8154815290600101906020018083116109e557829003601f168201915b5050505050905090565b610a1e610a17610cad565b8383611244565b5050565b610a33610a2d610cad565b83610d6e565b610a72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6990612505565b60405180910390fd5b610a7e848484846113b1565b50505050565b6060610a8f82610c62565b6000610a9961140d565b90506000815111610ab95760405180602001604052806000815250610ae4565b80610ac384611424565b604051602001610ad49291906122bd565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c4b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c5b5750610c5a826115d1565b5b9050919050565b610c6b8161163b565b610caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca1906124a5565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610d28836107c5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610d7a836107c5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610dbc5750610dbb8185610aec565b5b80610dfa57508373ffffffffffffffffffffffffffffffffffffffff16610de28461049e565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610e23826107c5565b73ffffffffffffffffffffffffffffffffffffffff1614610e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e70906123c5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee090612405565b60405180910390fd5b610ef48383836116a7565b610eff600082610cb5565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f4f9190612660565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fa691906125d9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46110658383836117bb565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d190612485565b60405180910390fd5b6110e38161163b565b15611123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111a906123e5565b60405180910390fd5b61112f600083836116a7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461117f91906125d9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611240600083836117bb565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112aa90612425565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113a49190612348565b60405180910390a3505050565b6113bc848484610e03565b6113c8848484846117c0565b611407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fe906123a5565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b6060600082141561146c576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506115cc565b600082905060005b6000821461149e578080611487906127ad565b915050600a82611497919061262f565b9150611474565b60008167ffffffffffffffff8111156114e0577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156115125781602001600182028036833780820191505090505b5090505b600085146115c55760018261152b9190612660565b9150600a8561153a91906127f6565b603061154691906125d9565b60f81b818381518110611582577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856115be919061262f565b9450611516565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6116b2838383611957565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156116f5576116f08161195c565b611734565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146117335761173283826119a5565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117775761177281611b12565b6117b6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146117b5576117b48282611c55565b5b5b505050565b505050565b60006117e18473ffffffffffffffffffffffffffffffffffffffff16611cd4565b1561194a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261180a610cad565b8786866040518563ffffffff1660e01b815260040161182c94939291906122fc565b602060405180830381600087803b15801561184657600080fd5b505af192505050801561187757506040513d601f19601f820116820180604052508101906118749190611f98565b60015b6118fa573d80600081146118a7576040519150601f19603f3d011682016040523d82523d6000602084013e6118ac565b606091505b506000815114156118f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e9906123a5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061194f565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016119b284610877565b6119bc9190612660565b9050600060076000848152602001908152602001600020549050818114611aa1576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050611b269190612660565b9050600060096000848152602001908152602001600020549050600060088381548110611b7c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110611bc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480611c39577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000611c6083610877565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000611d0a611d0584612565565b612540565b905082815260208101848484011115611d2257600080fd5b611d2d848285612708565b509392505050565b600081359050611d4481612c5f565b92915050565b600081359050611d5981612c76565b92915050565b600081359050611d6e81612c8d565b92915050565b600081519050611d8381612c8d565b92915050565b600082601f830112611d9a57600080fd5b8135611daa848260208601611cf7565b91505092915050565b600081359050611dc281612ca4565b92915050565b600060208284031215611dda57600080fd5b6000611de884828501611d35565b91505092915050565b60008060408385031215611e0457600080fd5b6000611e1285828601611d35565b9250506020611e2385828601611d35565b9150509250929050565b600080600060608486031215611e4257600080fd5b6000611e5086828701611d35565b9350506020611e6186828701611d35565b9250506040611e7286828701611db3565b9150509250925092565b60008060008060808587031215611e9257600080fd5b6000611ea087828801611d35565b9450506020611eb187828801611d35565b9350506040611ec287828801611db3565b925050606085013567ffffffffffffffff811115611edf57600080fd5b611eeb87828801611d89565b91505092959194509250565b60008060408385031215611f0a57600080fd5b6000611f1885828601611d35565b9250506020611f2985828601611d4a565b9150509250929050565b60008060408385031215611f4657600080fd5b6000611f5485828601611d35565b9250506020611f6585828601611db3565b9150509250929050565b600060208284031215611f8157600080fd5b6000611f8f84828501611d5f565b91505092915050565b600060208284031215611faa57600080fd5b6000611fb884828501611d74565b91505092915050565b600060208284031215611fd357600080fd5b6000611fe184828501611db3565b91505092915050565b60008060408385031215611ffd57600080fd5b600061200b85828601611db3565b925050602061201c85828601611d35565b9150509250929050565b61202f81612694565b82525050565b61203e816126a6565b82525050565b600061204f82612596565b61205981856125ac565b9350612069818560208601612717565b612072816128e3565b840191505092915050565b6000612088826125a1565b61209281856125bd565b93506120a2818560208601612717565b6120ab816128e3565b840191505092915050565b60006120c1826125a1565b6120cb81856125ce565b93506120db818560208601612717565b80840191505092915050565b60006120f4602b836125bd565b91506120ff826128f4565b604082019050919050565b60006121176032836125bd565b915061212282612943565b604082019050919050565b600061213a6025836125bd565b915061214582612992565b604082019050919050565b600061215d601c836125bd565b9150612168826129e1565b602082019050919050565b60006121806024836125bd565b915061218b82612a0a565b604082019050919050565b60006121a36019836125bd565b91506121ae82612a59565b602082019050919050565b60006121c66029836125bd565b91506121d182612a82565b604082019050919050565b60006121e9603e836125bd565b91506121f482612ad1565b604082019050919050565b600061220c6020836125bd565b915061221782612b20565b602082019050919050565b600061222f6018836125bd565b915061223a82612b49565b602082019050919050565b60006122526021836125bd565b915061225d82612b72565b604082019050919050565b6000612275602c836125bd565b915061228082612bc1565b604082019050919050565b6000612298602e836125bd565b91506122a382612c10565b604082019050919050565b6122b7816126fe565b82525050565b60006122c982856120b6565b91506122d582846120b6565b91508190509392505050565b60006020820190506122f66000830184612026565b92915050565b60006080820190506123116000830187612026565b61231e6020830186612026565b61232b60408301856122ae565b818103606083015261233d8184612044565b905095945050505050565b600060208201905061235d6000830184612035565b92915050565b6000602082019050818103600083015261237d818461207d565b905092915050565b6000602082019050818103600083015261239e816120e7565b9050919050565b600060208201905081810360008301526123be8161210a565b9050919050565b600060208201905081810360008301526123de8161212d565b9050919050565b600060208201905081810360008301526123fe81612150565b9050919050565b6000602082019050818103600083015261241e81612173565b9050919050565b6000602082019050818103600083015261243e81612196565b9050919050565b6000602082019050818103600083015261245e816121b9565b9050919050565b6000602082019050818103600083015261247e816121dc565b9050919050565b6000602082019050818103600083015261249e816121ff565b9050919050565b600060208201905081810360008301526124be81612222565b9050919050565b600060208201905081810360008301526124de81612245565b9050919050565b600060208201905081810360008301526124fe81612268565b9050919050565b6000602082019050818103600083015261251e8161228b565b9050919050565b600060208201905061253a60008301846122ae565b92915050565b600061254a61255b565b9050612556828261277c565b919050565b6000604051905090565b600067ffffffffffffffff8211156125805761257f6128b4565b5b612589826128e3565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006125e4826126fe565b91506125ef836126fe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561262457612623612827565b5b828201905092915050565b600061263a826126fe565b9150612645836126fe565b92508261265557612654612856565b5b828204905092915050565b600061266b826126fe565b9150612676836126fe565b92508282101561268957612688612827565b5b828203905092915050565b600061269f826126de565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561273557808201518184015260208101905061271a565b83811115612744576000848401525b50505050565b6000600282049050600182168061276257607f821691505b6020821081141561277657612775612885565b5b50919050565b612785826128e3565b810181811067ffffffffffffffff821117156127a4576127a36128b4565b5b80604052505050565b60006127b8826126fe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156127eb576127ea612827565b5b600182019050919050565b6000612801826126fe565b915061280c836126fe565b92508261281c5761281b612856565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b612c6881612694565b8114612c7357600080fd5b50565b612c7f816126a6565b8114612c8a57600080fd5b50565b612c96816126b2565b8114612ca157600080fd5b50565b612cad816126fe565b8114612cb857600080fd5b5056fea26469706673582212201adef051da52f7893b915c1799133128cc3dacc6943732da0b4ba111569bdfc964736f6c63430008040033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061010b5760003560e01c80634f6ccce7116100a257806395d89b411161007157806395d89b41146102dc578063a22cb465146102fa578063b88d4fde14610316578063c87b56dd14610332578063e985e9c5146103625761010b565b80634f6ccce7146102305780636352211e1461026057806370a082311461029057806394bf804d146102c05761010b565b806318160ddd116100de57806318160ddd146101aa57806323b872dd146101c85780632f745c59146101e457806342842e0e146102145761010b565b806301ffc9a71461011057806306fdde0314610140578063081812fc1461015e578063095ea7b31461018e575b600080fd5b61012a60048036038101906101259190611f6f565b610392565b6040516101379190612348565b60405180910390f35b61014861040c565b6040516101559190612363565b60405180910390f35b61017860048036038101906101739190611fc1565b61049e565b60405161018591906122e1565b60405180910390f35b6101a860048036038101906101a39190611f33565b6104e4565b005b6101b26105fc565b6040516101bf9190612525565b60405180910390f35b6101e260048036038101906101dd9190611e2d565b610609565b005b6101fe60048036038101906101f99190611f33565b610669565b60405161020b9190612525565b60405180910390f35b61022e60048036038101906102299190611e2d565b61070e565b005b61024a60048036038101906102459190611fc1565b61072e565b6040516102579190612525565b60405180910390f35b61027a60048036038101906102759190611fc1565b6107c5565b60405161028791906122e1565b60405180910390f35b6102aa60048036038101906102a59190611dc8565b610877565b6040516102b79190612525565b60405180910390f35b6102da60048036038101906102d59190611fea565b61092f565b005b6102e461097a565b6040516102f19190612363565b60405180910390f35b610314600480360381019061030f9190611ef7565b610a0c565b005b610330600480360381019061032b9190611e7c565b610a22565b005b61034c60048036038101906103479190611fc1565b610a84565b6040516103599190612363565b60405180910390f35b61037c60048036038101906103779190611df1565b610aec565b6040516103899190612348565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610405575061040482610b80565b5b9050919050565b60606000805461041b9061274a565b80601f01602080910402602001604051908101604052809291908181526020018280546104479061274a565b80156104945780601f1061046957610100808354040283529160200191610494565b820191906000526020600020905b81548152906001019060200180831161047757829003601f168201915b5050505050905090565b60006104a982610c62565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104ef826107c5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610560576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610557906124c5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661057f610cad565b73ffffffffffffffffffffffffffffffffffffffff1614806105ae57506105ad816105a8610cad565b610aec565b5b6105ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e490612465565b60405180910390fd5b6105f78383610cb5565b505050565b6000600880549050905090565b61061a610614610cad565b82610d6e565b610659576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065090612505565b60405180910390fd5b610664838383610e03565b505050565b600061067483610877565b82106106b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ac90612385565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61072983838360405180602001604052806000815250610a22565b505050565b60006107386105fc565b8210610779576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610770906124e5565b60405180910390fd5b600882815481106107b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561086e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610865906124a5565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156108e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108df90612445565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600a54905060005b8381101561096d5761094b838361106a565b60018261095891906125d9565b91508080610965906127ad565b915050610939565b5080600a81905550505050565b6060600180546109899061274a565b80601f01602080910402602001604051908101604052809291908181526020018280546109b59061274a565b8015610a025780601f106109d757610100808354040283529160200191610a02565b820191906000526020600020905b8154815290600101906020018083116109e557829003601f168201915b5050505050905090565b610a1e610a17610cad565b8383611244565b5050565b610a33610a2d610cad565b83610d6e565b610a72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6990612505565b60405180910390fd5b610a7e848484846113b1565b50505050565b6060610a8f82610c62565b6000610a9961140d565b90506000815111610ab95760405180602001604052806000815250610ae4565b80610ac384611424565b604051602001610ad49291906122bd565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c4b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c5b5750610c5a826115d1565b5b9050919050565b610c6b8161163b565b610caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca1906124a5565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610d28836107c5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610d7a836107c5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610dbc5750610dbb8185610aec565b5b80610dfa57508373ffffffffffffffffffffffffffffffffffffffff16610de28461049e565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610e23826107c5565b73ffffffffffffffffffffffffffffffffffffffff1614610e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e70906123c5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee090612405565b60405180910390fd5b610ef48383836116a7565b610eff600082610cb5565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f4f9190612660565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fa691906125d9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46110658383836117bb565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d190612485565b60405180910390fd5b6110e38161163b565b15611123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111a906123e5565b60405180910390fd5b61112f600083836116a7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461117f91906125d9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611240600083836117bb565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112aa90612425565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113a49190612348565b60405180910390a3505050565b6113bc848484610e03565b6113c8848484846117c0565b611407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fe906123a5565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b6060600082141561146c576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506115cc565b600082905060005b6000821461149e578080611487906127ad565b915050600a82611497919061262f565b9150611474565b60008167ffffffffffffffff8111156114e0577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156115125781602001600182028036833780820191505090505b5090505b600085146115c55760018261152b9190612660565b9150600a8561153a91906127f6565b603061154691906125d9565b60f81b818381518110611582577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856115be919061262f565b9450611516565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6116b2838383611957565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156116f5576116f08161195c565b611734565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146117335761173283826119a5565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117775761177281611b12565b6117b6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146117b5576117b48282611c55565b5b5b505050565b505050565b60006117e18473ffffffffffffffffffffffffffffffffffffffff16611cd4565b1561194a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261180a610cad565b8786866040518563ffffffff1660e01b815260040161182c94939291906122fc565b602060405180830381600087803b15801561184657600080fd5b505af192505050801561187757506040513d601f19601f820116820180604052508101906118749190611f98565b60015b6118fa573d80600081146118a7576040519150601f19603f3d011682016040523d82523d6000602084013e6118ac565b606091505b506000815114156118f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e9906123a5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061194f565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016119b284610877565b6119bc9190612660565b9050600060076000848152602001908152602001600020549050818114611aa1576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050611b269190612660565b9050600060096000848152602001908152602001600020549050600060088381548110611b7c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110611bc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480611c39577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000611c6083610877565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000611d0a611d0584612565565b612540565b905082815260208101848484011115611d2257600080fd5b611d2d848285612708565b509392505050565b600081359050611d4481612c5f565b92915050565b600081359050611d5981612c76565b92915050565b600081359050611d6e81612c8d565b92915050565b600081519050611d8381612c8d565b92915050565b600082601f830112611d9a57600080fd5b8135611daa848260208601611cf7565b91505092915050565b600081359050611dc281612ca4565b92915050565b600060208284031215611dda57600080fd5b6000611de884828501611d35565b91505092915050565b60008060408385031215611e0457600080fd5b6000611e1285828601611d35565b9250506020611e2385828601611d35565b9150509250929050565b600080600060608486031215611e4257600080fd5b6000611e5086828701611d35565b9350506020611e6186828701611d35565b9250506040611e7286828701611db3565b9150509250925092565b60008060008060808587031215611e9257600080fd5b6000611ea087828801611d35565b9450506020611eb187828801611d35565b9350506040611ec287828801611db3565b925050606085013567ffffffffffffffff811115611edf57600080fd5b611eeb87828801611d89565b91505092959194509250565b60008060408385031215611f0a57600080fd5b6000611f1885828601611d35565b9250506020611f2985828601611d4a565b9150509250929050565b60008060408385031215611f4657600080fd5b6000611f5485828601611d35565b9250506020611f6585828601611db3565b9150509250929050565b600060208284031215611f8157600080fd5b6000611f8f84828501611d5f565b91505092915050565b600060208284031215611faa57600080fd5b6000611fb884828501611d74565b91505092915050565b600060208284031215611fd357600080fd5b6000611fe184828501611db3565b91505092915050565b60008060408385031215611ffd57600080fd5b600061200b85828601611db3565b925050602061201c85828601611d35565b9150509250929050565b61202f81612694565b82525050565b61203e816126a6565b82525050565b600061204f82612596565b61205981856125ac565b9350612069818560208601612717565b612072816128e3565b840191505092915050565b6000612088826125a1565b61209281856125bd565b93506120a2818560208601612717565b6120ab816128e3565b840191505092915050565b60006120c1826125a1565b6120cb81856125ce565b93506120db818560208601612717565b80840191505092915050565b60006120f4602b836125bd565b91506120ff826128f4565b604082019050919050565b60006121176032836125bd565b915061212282612943565b604082019050919050565b600061213a6025836125bd565b915061214582612992565b604082019050919050565b600061215d601c836125bd565b9150612168826129e1565b602082019050919050565b60006121806024836125bd565b915061218b82612a0a565b604082019050919050565b60006121a36019836125bd565b91506121ae82612a59565b602082019050919050565b60006121c66029836125bd565b91506121d182612a82565b604082019050919050565b60006121e9603e836125bd565b91506121f482612ad1565b604082019050919050565b600061220c6020836125bd565b915061221782612b20565b602082019050919050565b600061222f6018836125bd565b915061223a82612b49565b602082019050919050565b60006122526021836125bd565b915061225d82612b72565b604082019050919050565b6000612275602c836125bd565b915061228082612bc1565b604082019050919050565b6000612298602e836125bd565b91506122a382612c10565b604082019050919050565b6122b7816126fe565b82525050565b60006122c982856120b6565b91506122d582846120b6565b91508190509392505050565b60006020820190506122f66000830184612026565b92915050565b60006080820190506123116000830187612026565b61231e6020830186612026565b61232b60408301856122ae565b818103606083015261233d8184612044565b905095945050505050565b600060208201905061235d6000830184612035565b92915050565b6000602082019050818103600083015261237d818461207d565b905092915050565b6000602082019050818103600083015261239e816120e7565b9050919050565b600060208201905081810360008301526123be8161210a565b9050919050565b600060208201905081810360008301526123de8161212d565b9050919050565b600060208201905081810360008301526123fe81612150565b9050919050565b6000602082019050818103600083015261241e81612173565b9050919050565b6000602082019050818103600083015261243e81612196565b9050919050565b6000602082019050818103600083015261245e816121b9565b9050919050565b6000602082019050818103600083015261247e816121dc565b9050919050565b6000602082019050818103600083015261249e816121ff565b9050919050565b600060208201905081810360008301526124be81612222565b9050919050565b600060208201905081810360008301526124de81612245565b9050919050565b600060208201905081810360008301526124fe81612268565b9050919050565b6000602082019050818103600083015261251e8161228b565b9050919050565b600060208201905061253a60008301846122ae565b92915050565b600061254a61255b565b9050612556828261277c565b919050565b6000604051905090565b600067ffffffffffffffff8211156125805761257f6128b4565b5b612589826128e3565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006125e4826126fe565b91506125ef836126fe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561262457612623612827565b5b828201905092915050565b600061263a826126fe565b9150612645836126fe565b92508261265557612654612856565b5b828204905092915050565b600061266b826126fe565b9150612676836126fe565b92508282101561268957612688612827565b5b828203905092915050565b600061269f826126de565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561273557808201518184015260208101905061271a565b83811115612744576000848401525b50505050565b6000600282049050600182168061276257607f821691505b6020821081141561277657612775612885565b5b50919050565b612785826128e3565b810181811067ffffffffffffffff821117156127a4576127a36128b4565b5b80604052505050565b60006127b8826126fe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156127eb576127ea612827565b5b600182019050919050565b6000612801826126fe565b915061280c836126fe565b92508261281c5761281b612856565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b612c6881612694565b8114612c7357600080fd5b50565b612c7f816126a6565b8114612c8a57600080fd5b50565b612c96816126b2565b8114612ca157600080fd5b50565b612cad816126fe565b8114612cb857600080fd5b5056fea26469706673582212201adef051da52f7893b915c1799133128cc3dacc6943732da0b4ba111569bdfc964736f6c63430008040033
Deployed Bytecode Sourcemap
43583:381:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37310:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24044:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25557:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25074:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37950:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26257:336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37618:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26664:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38140:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23755:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23486:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43708:253;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24213:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25800:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26920:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24388:281;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26026:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37310:224;37412:4;37451:35;37436:50;;;:11;:50;;;;:90;;;;37490:36;37514:11;37490:23;:36::i;:::-;37436:90;37429:97;;37310:224;;;:::o;24044:100::-;24098:13;24131:5;24124:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24044:100;:::o;25557:171::-;25633:7;25653:23;25668:7;25653:14;:23::i;:::-;25696:15;:24;25712:7;25696:24;;;;;;;;;;;;;;;;;;;;;25689:31;;25557:171;;;:::o;25074:417::-;25155:13;25171:23;25186:7;25171:14;:23::i;:::-;25155:39;;25219:5;25213:11;;:2;:11;;;;25205:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;25313:5;25297:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;25322:37;25339:5;25346:12;:10;:12::i;:::-;25322:16;:37::i;:::-;25297:62;25275:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;25462:21;25471:2;25475:7;25462:8;:21::i;:::-;25074:417;;;:::o;37950:113::-;38011:7;38038:10;:17;;;;38031:24;;37950:113;:::o;26257:336::-;26452:41;26471:12;:10;:12::i;:::-;26485:7;26452:18;:41::i;:::-;26444:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;26557:28;26567:4;26573:2;26577:7;26557:9;:28::i;:::-;26257:336;;;:::o;37618:256::-;37715:7;37751:23;37768:5;37751:16;:23::i;:::-;37743:5;:31;37735:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37840:12;:19;37853:5;37840:19;;;;;;;;;;;;;;;:26;37860:5;37840:26;;;;;;;;;;;;37833:33;;37618:256;;;;:::o;26664:185::-;26802:39;26819:4;26825:2;26829:7;26802:39;;;;;;;;;;;;:16;:39::i;:::-;26664:185;;;:::o;38140:233::-;38215:7;38251:30;:28;:30::i;:::-;38243:5;:38;38235:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;38348:10;38359:5;38348:17;;;;;;;;;;;;;;;;;;;;;;;;38341:24;;38140:233;;;:::o;23755:222::-;23827:7;23847:13;23863:7;:16;23871:7;23863:16;;;;;;;;;;;;;;;;;;;;;23847:32;;23915:1;23898:19;;:5;:19;;;;23890:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;23964:5;23957:12;;;23755:222;;;:::o;23486:207::-;23558:7;23603:1;23586:19;;:5;:19;;;;23578:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23669:9;:16;23679:5;23669:16;;;;;;;;;;;;;;;;23662:23;;23486:207;;;:::o;43708:253::-;43768:16;43785:7;;43768:24;;43809:6;43804:114;43825:6;43821:1;:10;43804:114;;;43854:20;43860:3;43865:8;43854:5;:20::i;:::-;43905:1;43893:13;;;;;:::i;:::-;;;43833:3;;;;;:::i;:::-;;;;43804:114;;;;43936:8;43928:7;:16;;;;43708:253;;;:::o;24213:104::-;24269:13;24302:7;24295:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24213:104;:::o;25800:155::-;25895:52;25914:12;:10;:12::i;:::-;25928:8;25938;25895:18;:52::i;:::-;25800:155;;:::o;26920:323::-;27094:41;27113:12;:10;:12::i;:::-;27127:7;27094:18;:41::i;:::-;27086:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;27197:38;27211:4;27217:2;27221:7;27230:4;27197:13;:38::i;:::-;26920:323;;;;:::o;24388:281::-;24461:13;24487:23;24502:7;24487:14;:23::i;:::-;24523:21;24547:10;:8;:10::i;:::-;24523:34;;24599:1;24581:7;24575:21;:25;:86;;;;;;;;;;;;;;;;;24627:7;24636:18;:7;:16;:18::i;:::-;24610:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24575:86;24568:93;;;24388:281;;;:::o;26026:164::-;26123:4;26147:18;:25;26166:5;26147:25;;;;;;;;;;;;;;;:35;26173:8;26147:35;;;;;;;;;;;;;;;;;;;;;;;;;26140:42;;26026:164;;;;:::o;23117:305::-;23219:4;23271:25;23256:40;;;:11;:40;;;;:105;;;;23328:33;23313:48;;;:11;:48;;;;23256:105;:158;;;;23378:36;23402:11;23378:23;:36::i;:::-;23256:158;23236:178;;23117:305;;;:::o;33532:135::-;33614:16;33622:7;33614;:16::i;:::-;33606:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;33532:135;:::o;3176:98::-;3229:7;3256:10;3249:17;;3176:98;:::o;32811:174::-;32913:2;32886:15;:24;32902:7;32886:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32969:7;32965:2;32931:46;;32940:23;32955:7;32940:14;:23::i;:::-;32931:46;;;;;;;;;;;;32811:174;;:::o;29044:264::-;29137:4;29154:13;29170:23;29185:7;29170:14;:23::i;:::-;29154:39;;29223:5;29212:16;;:7;:16;;;:52;;;;29232:32;29249:5;29256:7;29232:16;:32::i;:::-;29212:52;:87;;;;29292:7;29268:31;;:20;29280:7;29268:11;:20::i;:::-;:31;;;29212:87;29204:96;;;29044:264;;;;:::o;32067:625::-;32226:4;32199:31;;:23;32214:7;32199:14;:23::i;:::-;:31;;;32191:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;32305:1;32291:16;;:2;:16;;;;32283:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32361:39;32382:4;32388:2;32392:7;32361:20;:39::i;:::-;32465:29;32482:1;32486:7;32465:8;:29::i;:::-;32526:1;32507:9;:15;32517:4;32507:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32555:1;32538:9;:13;32548:2;32538:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32586:2;32567:7;:16;32575:7;32567:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32625:7;32621:2;32606:27;;32615:4;32606:27;;;;;;;;;;;;32646:38;32666:4;32672:2;32676:7;32646:19;:38::i;:::-;32067:625;;;:::o;30642:439::-;30736:1;30722:16;;:2;:16;;;;30714:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30795:16;30803:7;30795;:16::i;:::-;30794:17;30786:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30857:45;30886:1;30890:2;30894:7;30857:20;:45::i;:::-;30932:1;30915:9;:13;30925:2;30915:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30963:2;30944:7;:16;30952:7;30944:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31008:7;31004:2;30983:33;;31000:1;30983:33;;;;;;;;;;;;31029:44;31057:1;31061:2;31065:7;31029:19;:44::i;:::-;30642:439;;:::o;33128:315::-;33283:8;33274:17;;:5;:17;;;;33266:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;33370:8;33332:18;:25;33351:5;33332:25;;;;;;;;;;;;;;;:35;33358:8;33332:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;33416:8;33394:41;;33409:5;33394:41;;;33426:8;33394:41;;;;;;:::i;:::-;;;;;;;;33128:315;;;:::o;28124:313::-;28280:28;28290:4;28296:2;28300:7;28280:9;:28::i;:::-;28327:47;28350:4;28356:2;28360:7;28369:4;28327:22;:47::i;:::-;28319:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;28124:313;;;;:::o;24918:94::-;24969:13;24995:9;;;;;;;;;;;;;;24918:94;:::o;430:723::-;486:13;716:1;707:5;:10;703:53;;;734:10;;;;;;;;;;;;;;;;;;;;;703:53;766:12;781:5;766:20;;797:14;822:78;837:1;829:4;:9;822:78;;855:8;;;;;:::i;:::-;;;;886:2;878:10;;;;;:::i;:::-;;;822:78;;;910:19;942:6;932:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:39;;960:154;976:1;967:5;:10;960:154;;1004:1;994:11;;;;;:::i;:::-;;;1071:2;1063:5;:10;;;;:::i;:::-;1050:2;:24;;;;:::i;:::-;1037:39;;1020:6;1027;1020:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;1100:2;1091:11;;;;;:::i;:::-;;;960:154;;;1138:6;1124:21;;;;;430:723;;;;:::o;14779:157::-;14864:4;14903:25;14888:40;;;:11;:40;;;;14881:47;;14779:157;;;:::o;28750:127::-;28815:4;28867:1;28839:30;;:7;:16;28847:7;28839:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28832:37;;28750:127;;;:::o;38986:589::-;39130:45;39157:4;39163:2;39167:7;39130:26;:45::i;:::-;39208:1;39192:18;;:4;:18;;;39188:187;;;39227:40;39259:7;39227:31;:40::i;:::-;39188:187;;;39297:2;39289:10;;:4;:10;;;39285:90;;39316:47;39349:4;39355:7;39316:32;:47::i;:::-;39285:90;39188:187;39403:1;39389:16;;:2;:16;;;39385:183;;;39422:45;39459:7;39422:36;:45::i;:::-;39385:183;;;39495:4;39489:10;;:2;:10;;;39485:83;;39516:40;39544:2;39548:7;39516:27;:40::i;:::-;39485:83;39385:183;38986:589;;;:::o;36167:125::-;;;;:::o;34231:853::-;34385:4;34406:15;:2;:13;;;:15::i;:::-;34402:675;;;34458:2;34442:36;;;34479:12;:10;:12::i;:::-;34493:4;34499:7;34508:4;34442:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34438:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34700:1;34683:6;:13;:18;34679:328;;;34726:60;;;;;;;;;;:::i;:::-;;;;;;;;34679:328;34957:6;34951:13;34942:6;34938:2;34934:15;34927:38;34438:584;34574:41;;;34564:51;;;:6;:51;;;;34557:58;;;;;34402:675;35061:4;35054:11;;34231:853;;;;;;;:::o;35656:126::-;;;;:::o;40298:164::-;40402:10;:17;;;;40375:15;:24;40391:7;40375:24;;;;;;;;;;;:44;;;;40430:10;40446:7;40430:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40298:164;:::o;41089:988::-;41355:22;41405:1;41380:22;41397:4;41380:16;:22::i;:::-;:26;;;;:::i;:::-;41355:51;;41417:18;41438:17;:26;41456:7;41438:26;;;;;;;;;;;;41417:47;;41585:14;41571:10;:28;41567:328;;41616:19;41638:12;:18;41651:4;41638:18;;;;;;;;;;;;;;;:34;41657:14;41638:34;;;;;;;;;;;;41616:56;;41722:11;41689:12;:18;41702:4;41689:18;;;;;;;;;;;;;;;:30;41708:10;41689:30;;;;;;;;;;;:44;;;;41839:10;41806:17;:30;41824:11;41806:30;;;;;;;;;;;:43;;;;41567:328;;41991:17;:26;42009:7;41991:26;;;;;;;;;;;41984:33;;;42035:12;:18;42048:4;42035:18;;;;;;;;;;;;;;;:34;42054:14;42035:34;;;;;;;;;;;42028:41;;;41089:988;;;;:::o;42372:1079::-;42625:22;42670:1;42650:10;:17;;;;:21;;;;:::i;:::-;42625:46;;42682:18;42703:15;:24;42719:7;42703:24;;;;;;;;;;;;42682:45;;43054:19;43076:10;43087:14;43076:26;;;;;;;;;;;;;;;;;;;;;;;;43054:48;;43140:11;43115:10;43126;43115:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;43251:10;43220:15;:28;43236:11;43220:28;;;;;;;;;;;:41;;;;43392:15;:24;43408:7;43392:24;;;;;;;;;;;43385:31;;;43427:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42372:1079;;;;:::o;39876:221::-;39961:14;39978:20;39995:2;39978:16;:20::i;:::-;39961:37;;40036:7;40009:12;:16;40022:2;40009:16;;;;;;;;;;;;;;;:24;40026:6;40009:24;;;;;;;;;;;:34;;;;40083:6;40054:17;:26;40072:7;40054:26;;;;;;;;;;;:35;;;;39876:221;;;:::o;4623:326::-;4683:4;4940:1;4918:7;:19;;;:23;4911:30;;4623:326;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;402:5;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;501:133::-;544:5;582:6;569:20;560:29;;598:30;622:5;598:30;:::i;:::-;550:84;;;;:::o;640:137::-;685:5;723:6;710:20;701:29;;739:32;765:5;739:32;:::i;:::-;691:86;;;;:::o;783:141::-;839:5;870:6;864:13;855:22;;886:32;912:5;886:32;:::i;:::-;845:79;;;;:::o;943:271::-;998:5;1047:3;1040:4;1032:6;1028:17;1024:27;1014:2;;1065:1;1062;1055:12;1014:2;1105:6;1092:20;1130:78;1204:3;1196:6;1189:4;1181:6;1177:17;1130:78;:::i;:::-;1121:87;;1004:210;;;;;:::o;1220:139::-;1266:5;1304:6;1291:20;1282:29;;1320:33;1347:5;1320:33;:::i;:::-;1272:87;;;;:::o;1365:262::-;1424:6;1473:2;1461:9;1452:7;1448:23;1444:32;1441:2;;;1489:1;1486;1479:12;1441:2;1532:1;1557:53;1602:7;1593:6;1582:9;1578:22;1557:53;:::i;:::-;1547:63;;1503:117;1431:196;;;;:::o;1633:407::-;1701:6;1709;1758:2;1746:9;1737:7;1733:23;1729:32;1726:2;;;1774:1;1771;1764:12;1726:2;1817:1;1842:53;1887:7;1878:6;1867:9;1863:22;1842:53;:::i;:::-;1832:63;;1788:117;1944:2;1970:53;2015:7;2006:6;1995:9;1991:22;1970:53;:::i;:::-;1960:63;;1915:118;1716:324;;;;;:::o;2046:552::-;2123:6;2131;2139;2188:2;2176:9;2167:7;2163:23;2159:32;2156:2;;;2204:1;2201;2194:12;2156:2;2247:1;2272:53;2317:7;2308:6;2297:9;2293:22;2272:53;:::i;:::-;2262:63;;2218:117;2374:2;2400:53;2445:7;2436:6;2425:9;2421:22;2400:53;:::i;:::-;2390:63;;2345:118;2502:2;2528:53;2573:7;2564:6;2553:9;2549:22;2528:53;:::i;:::-;2518:63;;2473:118;2146:452;;;;;:::o;2604:809::-;2699:6;2707;2715;2723;2772:3;2760:9;2751:7;2747:23;2743:33;2740:2;;;2789:1;2786;2779:12;2740:2;2832:1;2857:53;2902:7;2893:6;2882:9;2878:22;2857:53;:::i;:::-;2847:63;;2803:117;2959:2;2985:53;3030:7;3021:6;3010:9;3006:22;2985:53;:::i;:::-;2975:63;;2930:118;3087:2;3113:53;3158:7;3149:6;3138:9;3134:22;3113:53;:::i;:::-;3103:63;;3058:118;3243:2;3232:9;3228:18;3215:32;3274:18;3266:6;3263:30;3260:2;;;3306:1;3303;3296:12;3260:2;3334:62;3388:7;3379:6;3368:9;3364:22;3334:62;:::i;:::-;3324:72;;3186:220;2730:683;;;;;;;:::o;3419:401::-;3484:6;3492;3541:2;3529:9;3520:7;3516:23;3512:32;3509:2;;;3557:1;3554;3547:12;3509:2;3600:1;3625:53;3670:7;3661:6;3650:9;3646:22;3625:53;:::i;:::-;3615:63;;3571:117;3727:2;3753:50;3795:7;3786:6;3775:9;3771:22;3753:50;:::i;:::-;3743:60;;3698:115;3499:321;;;;;:::o;3826:407::-;3894:6;3902;3951:2;3939:9;3930:7;3926:23;3922:32;3919:2;;;3967:1;3964;3957:12;3919:2;4010:1;4035:53;4080:7;4071:6;4060:9;4056:22;4035:53;:::i;:::-;4025:63;;3981:117;4137:2;4163:53;4208:7;4199:6;4188:9;4184:22;4163:53;:::i;:::-;4153:63;;4108:118;3909:324;;;;;:::o;4239:260::-;4297:6;4346:2;4334:9;4325:7;4321:23;4317:32;4314:2;;;4362:1;4359;4352:12;4314:2;4405:1;4430:52;4474:7;4465:6;4454:9;4450:22;4430:52;:::i;:::-;4420:62;;4376:116;4304:195;;;;:::o;4505:282::-;4574:6;4623:2;4611:9;4602:7;4598:23;4594:32;4591:2;;;4639:1;4636;4629:12;4591:2;4682:1;4707:63;4762:7;4753:6;4742:9;4738:22;4707:63;:::i;:::-;4697:73;;4653:127;4581:206;;;;:::o;4793:262::-;4852:6;4901:2;4889:9;4880:7;4876:23;4872:32;4869:2;;;4917:1;4914;4907:12;4869:2;4960:1;4985:53;5030:7;5021:6;5010:9;5006:22;4985:53;:::i;:::-;4975:63;;4931:117;4859:196;;;;:::o;5061:407::-;5129:6;5137;5186:2;5174:9;5165:7;5161:23;5157:32;5154:2;;;5202:1;5199;5192:12;5154:2;5245:1;5270:53;5315:7;5306:6;5295:9;5291:22;5270:53;:::i;:::-;5260:63;;5216:117;5372:2;5398:53;5443:7;5434:6;5423:9;5419:22;5398:53;:::i;:::-;5388:63;;5343:118;5144:324;;;;;:::o;5474:118::-;5561:24;5579:5;5561:24;:::i;:::-;5556:3;5549:37;5539:53;;:::o;5598:109::-;5679:21;5694:5;5679:21;:::i;:::-;5674:3;5667:34;5657:50;;:::o;5713:360::-;5799:3;5827:38;5859:5;5827:38;:::i;:::-;5881:70;5944:6;5939:3;5881:70;:::i;:::-;5874:77;;5960:52;6005:6;6000:3;5993:4;5986:5;5982:16;5960:52;:::i;:::-;6037:29;6059:6;6037:29;:::i;:::-;6032:3;6028:39;6021:46;;5803:270;;;;;:::o;6079:364::-;6167:3;6195:39;6228:5;6195:39;:::i;:::-;6250:71;6314:6;6309:3;6250:71;:::i;:::-;6243:78;;6330:52;6375:6;6370:3;6363:4;6356:5;6352:16;6330:52;:::i;:::-;6407:29;6429:6;6407:29;:::i;:::-;6402:3;6398:39;6391:46;;6171:272;;;;;:::o;6449:377::-;6555:3;6583:39;6616:5;6583:39;:::i;:::-;6638:89;6720:6;6715:3;6638:89;:::i;:::-;6631:96;;6736:52;6781:6;6776:3;6769:4;6762:5;6758:16;6736:52;:::i;:::-;6813:6;6808:3;6804:16;6797:23;;6559:267;;;;;:::o;6832:366::-;6974:3;6995:67;7059:2;7054:3;6995:67;:::i;:::-;6988:74;;7071:93;7160:3;7071:93;:::i;:::-;7189:2;7184:3;7180:12;7173:19;;6978:220;;;:::o;7204:366::-;7346:3;7367:67;7431:2;7426:3;7367:67;:::i;:::-;7360:74;;7443:93;7532:3;7443:93;:::i;:::-;7561:2;7556:3;7552:12;7545:19;;7350:220;;;:::o;7576:366::-;7718:3;7739:67;7803:2;7798:3;7739:67;:::i;:::-;7732:74;;7815:93;7904:3;7815:93;:::i;:::-;7933:2;7928:3;7924:12;7917:19;;7722:220;;;:::o;7948:366::-;8090:3;8111:67;8175:2;8170:3;8111:67;:::i;:::-;8104:74;;8187:93;8276:3;8187:93;:::i;:::-;8305:2;8300:3;8296:12;8289:19;;8094:220;;;:::o;8320:366::-;8462:3;8483:67;8547:2;8542:3;8483:67;:::i;:::-;8476:74;;8559:93;8648:3;8559:93;:::i;:::-;8677:2;8672:3;8668:12;8661:19;;8466:220;;;:::o;8692:366::-;8834:3;8855:67;8919:2;8914:3;8855:67;:::i;:::-;8848:74;;8931:93;9020:3;8931:93;:::i;:::-;9049:2;9044:3;9040:12;9033:19;;8838:220;;;:::o;9064:366::-;9206:3;9227:67;9291:2;9286:3;9227:67;:::i;:::-;9220:74;;9303:93;9392:3;9303:93;:::i;:::-;9421:2;9416:3;9412:12;9405:19;;9210:220;;;:::o;9436:366::-;9578:3;9599:67;9663:2;9658:3;9599:67;:::i;:::-;9592:74;;9675:93;9764:3;9675:93;:::i;:::-;9793:2;9788:3;9784:12;9777:19;;9582:220;;;:::o;9808:366::-;9950:3;9971:67;10035:2;10030:3;9971:67;:::i;:::-;9964:74;;10047:93;10136:3;10047:93;:::i;:::-;10165:2;10160:3;10156:12;10149:19;;9954:220;;;:::o;10180:366::-;10322:3;10343:67;10407:2;10402:3;10343:67;:::i;:::-;10336:74;;10419:93;10508:3;10419:93;:::i;:::-;10537:2;10532:3;10528:12;10521:19;;10326:220;;;:::o;10552:366::-;10694:3;10715:67;10779:2;10774:3;10715:67;:::i;:::-;10708:74;;10791:93;10880:3;10791:93;:::i;:::-;10909:2;10904:3;10900:12;10893:19;;10698:220;;;:::o;10924:366::-;11066:3;11087:67;11151:2;11146:3;11087:67;:::i;:::-;11080:74;;11163:93;11252:3;11163:93;:::i;:::-;11281:2;11276:3;11272:12;11265:19;;11070:220;;;:::o;11296:366::-;11438:3;11459:67;11523:2;11518:3;11459:67;:::i;:::-;11452:74;;11535:93;11624:3;11535:93;:::i;:::-;11653:2;11648:3;11644:12;11637:19;;11442:220;;;:::o;11668:118::-;11755:24;11773:5;11755:24;:::i;:::-;11750:3;11743:37;11733:53;;:::o;11792:435::-;11972:3;11994:95;12085:3;12076:6;11994:95;:::i;:::-;11987:102;;12106:95;12197:3;12188:6;12106:95;:::i;:::-;12099:102;;12218:3;12211:10;;11976:251;;;;;:::o;12233:222::-;12326:4;12364:2;12353:9;12349:18;12341:26;;12377:71;12445:1;12434:9;12430:17;12421:6;12377:71;:::i;:::-;12331:124;;;;:::o;12461:640::-;12656:4;12694:3;12683:9;12679:19;12671:27;;12708:71;12776:1;12765:9;12761:17;12752:6;12708:71;:::i;:::-;12789:72;12857:2;12846:9;12842:18;12833:6;12789:72;:::i;:::-;12871;12939:2;12928:9;12924:18;12915:6;12871:72;:::i;:::-;12990:9;12984:4;12980:20;12975:2;12964:9;12960:18;12953:48;13018:76;13089:4;13080:6;13018:76;:::i;:::-;13010:84;;12661:440;;;;;;;:::o;13107:210::-;13194:4;13232:2;13221:9;13217:18;13209:26;;13245:65;13307:1;13296:9;13292:17;13283:6;13245:65;:::i;:::-;13199:118;;;;:::o;13323:313::-;13436:4;13474:2;13463:9;13459:18;13451:26;;13523:9;13517:4;13513:20;13509:1;13498:9;13494:17;13487:47;13551:78;13624:4;13615:6;13551:78;:::i;:::-;13543:86;;13441:195;;;;:::o;13642:419::-;13808:4;13846:2;13835:9;13831:18;13823:26;;13895:9;13889:4;13885:20;13881:1;13870:9;13866:17;13859:47;13923:131;14049:4;13923:131;:::i;:::-;13915:139;;13813:248;;;:::o;14067:419::-;14233:4;14271:2;14260:9;14256:18;14248:26;;14320:9;14314:4;14310:20;14306:1;14295:9;14291:17;14284:47;14348:131;14474:4;14348:131;:::i;:::-;14340:139;;14238:248;;;:::o;14492:419::-;14658:4;14696:2;14685:9;14681:18;14673:26;;14745:9;14739:4;14735:20;14731:1;14720:9;14716:17;14709:47;14773:131;14899:4;14773:131;:::i;:::-;14765:139;;14663:248;;;:::o;14917:419::-;15083:4;15121:2;15110:9;15106:18;15098:26;;15170:9;15164:4;15160:20;15156:1;15145:9;15141:17;15134:47;15198:131;15324:4;15198:131;:::i;:::-;15190:139;;15088:248;;;:::o;15342:419::-;15508:4;15546:2;15535:9;15531:18;15523:26;;15595:9;15589:4;15585:20;15581:1;15570:9;15566:17;15559:47;15623:131;15749:4;15623:131;:::i;:::-;15615:139;;15513:248;;;:::o;15767:419::-;15933:4;15971:2;15960:9;15956:18;15948:26;;16020:9;16014:4;16010:20;16006:1;15995:9;15991:17;15984:47;16048:131;16174:4;16048:131;:::i;:::-;16040:139;;15938:248;;;:::o;16192:419::-;16358:4;16396:2;16385:9;16381:18;16373:26;;16445:9;16439:4;16435:20;16431:1;16420:9;16416:17;16409:47;16473:131;16599:4;16473:131;:::i;:::-;16465:139;;16363:248;;;:::o;16617:419::-;16783:4;16821:2;16810:9;16806:18;16798:26;;16870:9;16864:4;16860:20;16856:1;16845:9;16841:17;16834:47;16898:131;17024:4;16898:131;:::i;:::-;16890:139;;16788:248;;;:::o;17042:419::-;17208:4;17246:2;17235:9;17231:18;17223:26;;17295:9;17289:4;17285:20;17281:1;17270:9;17266:17;17259:47;17323:131;17449:4;17323:131;:::i;:::-;17315:139;;17213:248;;;:::o;17467:419::-;17633:4;17671:2;17660:9;17656:18;17648:26;;17720:9;17714:4;17710:20;17706:1;17695:9;17691:17;17684:47;17748:131;17874:4;17748:131;:::i;:::-;17740:139;;17638:248;;;:::o;17892:419::-;18058:4;18096:2;18085:9;18081:18;18073:26;;18145:9;18139:4;18135:20;18131:1;18120:9;18116:17;18109:47;18173:131;18299:4;18173:131;:::i;:::-;18165:139;;18063:248;;;:::o;18317:419::-;18483:4;18521:2;18510:9;18506:18;18498:26;;18570:9;18564:4;18560:20;18556:1;18545:9;18541:17;18534:47;18598:131;18724:4;18598:131;:::i;:::-;18590:139;;18488:248;;;:::o;18742:419::-;18908:4;18946:2;18935:9;18931:18;18923:26;;18995:9;18989:4;18985:20;18981:1;18970:9;18966:17;18959:47;19023:131;19149:4;19023:131;:::i;:::-;19015:139;;18913:248;;;:::o;19167:222::-;19260:4;19298:2;19287:9;19283:18;19275:26;;19311:71;19379:1;19368:9;19364:17;19355:6;19311:71;:::i;:::-;19265:124;;;;:::o;19395:129::-;19429:6;19456:20;;:::i;:::-;19446:30;;19485:33;19513:4;19505:6;19485:33;:::i;:::-;19436:88;;;:::o;19530:75::-;19563:6;19596:2;19590:9;19580:19;;19570:35;:::o;19611:307::-;19672:4;19762:18;19754:6;19751:30;19748:2;;;19784:18;;:::i;:::-;19748:2;19822:29;19844:6;19822:29;:::i;:::-;19814:37;;19906:4;19900;19896:15;19888:23;;19677:241;;;:::o;19924:98::-;19975:6;20009:5;20003:12;19993:22;;19982:40;;;:::o;20028:99::-;20080:6;20114:5;20108:12;20098:22;;20087:40;;;:::o;20133:168::-;20216:11;20250:6;20245:3;20238:19;20290:4;20285:3;20281:14;20266:29;;20228:73;;;;:::o;20307:169::-;20391:11;20425:6;20420:3;20413:19;20465:4;20460:3;20456:14;20441:29;;20403:73;;;;:::o;20482:148::-;20584:11;20621:3;20606:18;;20596:34;;;;:::o;20636:305::-;20676:3;20695:20;20713:1;20695:20;:::i;:::-;20690:25;;20729:20;20747:1;20729:20;:::i;:::-;20724:25;;20883:1;20815:66;20811:74;20808:1;20805:81;20802:2;;;20889:18;;:::i;:::-;20802:2;20933:1;20930;20926:9;20919:16;;20680:261;;;;:::o;20947:185::-;20987:1;21004:20;21022:1;21004:20;:::i;:::-;20999:25;;21038:20;21056:1;21038:20;:::i;:::-;21033:25;;21077:1;21067:2;;21082:18;;:::i;:::-;21067:2;21124:1;21121;21117:9;21112:14;;20989:143;;;;:::o;21138:191::-;21178:4;21198:20;21216:1;21198:20;:::i;:::-;21193:25;;21232:20;21250:1;21232:20;:::i;:::-;21227:25;;21271:1;21268;21265:8;21262:2;;;21276:18;;:::i;:::-;21262:2;21321:1;21318;21314:9;21306:17;;21183:146;;;;:::o;21335:96::-;21372:7;21401:24;21419:5;21401:24;:::i;:::-;21390:35;;21380:51;;;:::o;21437:90::-;21471:7;21514:5;21507:13;21500:21;21489:32;;21479:48;;;:::o;21533:149::-;21569:7;21609:66;21602:5;21598:78;21587:89;;21577:105;;;:::o;21688:126::-;21725:7;21765:42;21758:5;21754:54;21743:65;;21733:81;;;:::o;21820:77::-;21857:7;21886:5;21875:16;;21865:32;;;:::o;21903:154::-;21987:6;21982:3;21977;21964:30;22049:1;22040:6;22035:3;22031:16;22024:27;21954:103;;;:::o;22063:307::-;22131:1;22141:113;22155:6;22152:1;22149:13;22141:113;;;22240:1;22235:3;22231:11;22225:18;22221:1;22216:3;22212:11;22205:39;22177:2;22174:1;22170:10;22165:15;;22141:113;;;22272:6;22269:1;22266:13;22263:2;;;22352:1;22343:6;22338:3;22334:16;22327:27;22263:2;22112:258;;;;:::o;22376:320::-;22420:6;22457:1;22451:4;22447:12;22437:22;;22504:1;22498:4;22494:12;22525:18;22515:2;;22581:4;22573:6;22569:17;22559:27;;22515:2;22643;22635:6;22632:14;22612:18;22609:38;22606:2;;;22662:18;;:::i;:::-;22606:2;22427:269;;;;:::o;22702:281::-;22785:27;22807:4;22785:27;:::i;:::-;22777:6;22773:40;22915:6;22903:10;22900:22;22879:18;22867:10;22864:34;22861:62;22858:2;;;22926:18;;:::i;:::-;22858:2;22966:10;22962:2;22955:22;22745:238;;;:::o;22989:233::-;23028:3;23051:24;23069:5;23051:24;:::i;:::-;23042:33;;23097:66;23090:5;23087:77;23084:2;;;23167:18;;:::i;:::-;23084:2;23214:1;23207:5;23203:13;23196:20;;23032:190;;;:::o;23228:176::-;23260:1;23277:20;23295:1;23277:20;:::i;:::-;23272:25;;23311:20;23329:1;23311:20;:::i;:::-;23306:25;;23350:1;23340:2;;23355:18;;:::i;:::-;23340:2;23396:1;23393;23389:9;23384:14;;23262:142;;;;:::o;23410:180::-;23458:77;23455:1;23448:88;23555:4;23552:1;23545:15;23579:4;23576:1;23569:15;23596:180;23644:77;23641:1;23634:88;23741:4;23738:1;23731:15;23765:4;23762:1;23755:15;23782:180;23830:77;23827:1;23820:88;23927:4;23924:1;23917:15;23951:4;23948:1;23941:15;23968:180;24016:77;24013:1;24006:88;24113:4;24110:1;24103:15;24137:4;24134:1;24127:15;24154:102;24195:6;24246:2;24242:7;24237:2;24230:5;24226:14;24222:28;24212:38;;24202:54;;;:::o;24262:230::-;24402:34;24398:1;24390:6;24386:14;24379:58;24471:13;24466:2;24458:6;24454:15;24447:38;24368:124;:::o;24498:237::-;24638:34;24634:1;24626:6;24622:14;24615:58;24707:20;24702:2;24694:6;24690:15;24683:45;24604:131;:::o;24741:224::-;24881:34;24877:1;24869:6;24865:14;24858:58;24950:7;24945:2;24937:6;24933:15;24926:32;24847:118;:::o;24971:178::-;25111:30;25107:1;25099:6;25095:14;25088:54;25077:72;:::o;25155:223::-;25295:34;25291:1;25283:6;25279:14;25272:58;25364:6;25359:2;25351:6;25347:15;25340:31;25261:117;:::o;25384:175::-;25524:27;25520:1;25512:6;25508:14;25501:51;25490:69;:::o;25565:228::-;25705:34;25701:1;25693:6;25689:14;25682:58;25774:11;25769:2;25761:6;25757:15;25750:36;25671:122;:::o;25799:249::-;25939:34;25935:1;25927:6;25923:14;25916:58;26008:32;26003:2;25995:6;25991:15;25984:57;25905:143;:::o;26054:182::-;26194:34;26190:1;26182:6;26178:14;26171:58;26160:76;:::o;26242:174::-;26382:26;26378:1;26370:6;26366:14;26359:50;26348:68;:::o;26422:220::-;26562:34;26558:1;26550:6;26546:14;26539:58;26631:3;26626:2;26618:6;26614:15;26607:28;26528:114;:::o;26648:231::-;26788:34;26784:1;26776:6;26772:14;26765:58;26857:14;26852:2;26844:6;26840:15;26833:39;26754:125;:::o;26885:233::-;27025:34;27021:1;27013:6;27009:14;27002:58;27094:16;27089:2;27081:6;27077:15;27070:41;26991:127;:::o;27124:122::-;27197:24;27215:5;27197:24;:::i;:::-;27190:5;27187:35;27177:2;;27236:1;27233;27226:12;27177:2;27167:79;:::o;27252:116::-;27322:21;27337:5;27322:21;:::i;:::-;27315:5;27312:32;27302:2;;27358:1;27355;27348:12;27302:2;27292:76;:::o;27374:120::-;27446:23;27463:5;27446:23;:::i;:::-;27439:5;27436:34;27426:2;;27484:1;27481;27474:12;27426:2;27416:78;:::o;27500:122::-;27573:24;27591:5;27573:24;:::i;:::-;27566:5;27563:35;27553:2;;27612:1;27609;27602:12;27553:2;27543:79;:::o
Swarm Source
ipfs://1adef051da52f7893b915c1799133128cc3dacc6943732da0b4ba111569bdfc9
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.