Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
8,888 UCFISH
Holders
14
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
5 UCFISHLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
UnicornFish
Compiler Version
v0.8.2+commit.661d1103
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-11 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.2; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.2; /** * @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.2; /** * @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/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.2; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.2; /** * @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.2; /** * @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.2; /** * @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.2; /** * @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.2; /** * @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); } 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 tokenId); /** * @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.2; /** * @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.2; /** * @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 {} } 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]. */ /** * @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: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.2; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require( _exists(tokenId), "ERC721URIStorage: URI set of nonexistent token" ); _tokenURIs[tokenId] = _tokenURI; } /** * @dev See {ERC721-_burn}. This override additionally checks to see if a * token-specific URI was set for the token, and if so, it deletes the token URI from * the storage mapping. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } pragma solidity ^0.8.2; contract UnicornFish is ERC721, ERC721URIStorage, ERC721Enumerable, Ownable { /* * Date and Time utilities for ethereum contracts * */ struct _DateTime { uint16 year; uint8 month; uint8 day; uint8 hour; uint8 minute; uint8 second; uint8 weekday; } uint256 constant DAY_IN_SECONDS = 86400; uint256 constant YEAR_IN_SECONDS = 31536000; uint256 constant LEAP_YEAR_IN_SECONDS = 31622400; uint256 constant HOUR_IN_SECONDS = 3600; uint256 constant MINUTE_IN_SECONDS = 60; uint16 constant ORIGIN_YEAR = 1970; function isLeapYear(uint16 year) public pure returns (bool) { if (year % 4 != 0) { return false; } if (year % 100 != 0) { return true; } if (year % 400 != 0) { return false; } return true; } function leapYearsBefore(uint256 year) public pure returns (uint256) { year -= 1; return year / 4 - year / 100 + year / 400; } function getDaysInMonth(uint8 month, uint16 year) public pure returns (uint8) { if ( month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12 ) { return 31; } else if (month == 4 || month == 6 || month == 9 || month == 11) { return 30; } else if (isLeapYear(year)) { return 29; } else { return 28; } } function parseTimestamp(uint256 timestamp) internal pure returns (_DateTime memory dt) { uint256 secondsAccountedFor = 0; uint256 buf; uint8 i; // Year dt.year = getYear(timestamp); buf = leapYearsBefore(dt.year) - leapYearsBefore(ORIGIN_YEAR); secondsAccountedFor += LEAP_YEAR_IN_SECONDS * buf; secondsAccountedFor += YEAR_IN_SECONDS * (dt.year - ORIGIN_YEAR - buf); // Month uint256 secondsInMonth; for (i = 1; i <= 12; i++) { secondsInMonth = DAY_IN_SECONDS * getDaysInMonth(i, dt.year); if (secondsInMonth + secondsAccountedFor > timestamp) { dt.month = i; break; } secondsAccountedFor += secondsInMonth; } // Day for (i = 1; i <= getDaysInMonth(dt.month, dt.year); i++) { if (DAY_IN_SECONDS + secondsAccountedFor > timestamp) { dt.day = i; break; } secondsAccountedFor += DAY_IN_SECONDS; } // Hour dt.hour = getHour(timestamp); // Minute dt.minute = getMinute(timestamp); // Second dt.second = getSecond(timestamp); // Day of week. dt.weekday = getWeekday(timestamp); } function getYear(uint256 timestamp) public pure returns (uint16) { uint256 secondsAccountedFor = 0; uint16 year; uint256 numLeapYears; // Year year = uint16(ORIGIN_YEAR + timestamp / YEAR_IN_SECONDS); numLeapYears = leapYearsBefore(year) - leapYearsBefore(ORIGIN_YEAR); secondsAccountedFor += LEAP_YEAR_IN_SECONDS * numLeapYears; secondsAccountedFor += YEAR_IN_SECONDS * (year - ORIGIN_YEAR - numLeapYears); while (secondsAccountedFor > timestamp) { if (isLeapYear(uint16(year - 1))) { secondsAccountedFor -= LEAP_YEAR_IN_SECONDS; } else { secondsAccountedFor -= YEAR_IN_SECONDS; } year -= 1; } return year; } function getCurrentDate(uint256) public view returns (uint32) { uint8 month = getMonth(block.timestamp); uint32 mm = uint32(month) * 100; return mm + uint32(getDay(block.timestamp)); } function getMonth(uint256 timestamp) public pure returns (uint8) { return parseTimestamp(timestamp).month; } function getDay(uint256 timestamp) public pure returns (uint8) { return parseTimestamp(timestamp).day; } function getHour(uint256 timestamp) public pure returns (uint8) { return uint8((timestamp / 60 / 60) % 24); } function getMinute(uint256 timestamp) public pure returns (uint8) { return uint8((timestamp / 60) % 60); } function getSecond(uint256 timestamp) public pure returns (uint8) { return uint8(timestamp % 60); } function getWeekday(uint256 timestamp) public pure returns (uint8) { return uint8((timestamp / DAY_IN_SECONDS + 4) % 7); } function toTimestamp( uint16 year, uint8 month, uint8 day ) public pure returns (uint256 timestamp) { return toTimestamp(year, month, day, 0, 0, 0); } function toTimestamp( uint16 year, uint8 month, uint8 day, uint8 hour ) public pure returns (uint256 timestamp) { return toTimestamp(year, month, day, hour, 0, 0); } function toTimestamp( uint16 year, uint8 month, uint8 day, uint8 hour, uint8 minute ) public pure returns (uint256 timestamp) { return toTimestamp(year, month, day, hour, minute, 0); } function toTimestamp( uint16 year, uint8 month, uint8 day, uint8 hour, uint8 minute, uint8 second ) public pure returns (uint256 timestamp) { uint16 i; // Year for (i = ORIGIN_YEAR; i < year; i++) { if (isLeapYear(i)) { timestamp += LEAP_YEAR_IN_SECONDS; } else { timestamp += YEAR_IN_SECONDS; } } // Month uint8[12] memory monthDayCounts; monthDayCounts[0] = 31; if (isLeapYear(year)) { monthDayCounts[1] = 29; } else { monthDayCounts[1] = 28; } monthDayCounts[2] = 31; monthDayCounts[3] = 30; monthDayCounts[4] = 31; monthDayCounts[5] = 30; monthDayCounts[6] = 31; monthDayCounts[7] = 31; monthDayCounts[8] = 30; monthDayCounts[9] = 31; monthDayCounts[10] = 30; monthDayCounts[11] = 31; for (i = 1; i < month; i++) { timestamp += DAY_IN_SECONDS * monthDayCounts[i - 1]; } // Day timestamp += DAY_IN_SECONDS * (day - 1); // Hour timestamp += HOUR_IN_SECONDS * (hour); // Minute timestamp += MINUTE_IN_SECONDS * (minute); // Second timestamp += second; return timestamp; } using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; mapping(string => uint8) existingURIs; mapping(address => bool) userAddr; mapping(address => uint32) userMintTime; mapping(uint32 => uint32) dailyNFTController; uint256 saleStatus; uint32 totalNFT; uint32 NFTMax; uint32 NFTdailyMax; constructor() ERC721("UnicornFish", "UCFISH") { NFTMax = 8888; NFTdailyMax = 888; } function _baseURI() internal pure override returns (string memory) { return ""; } function safeMint(address to, string memory uri) public onlyOwner { uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(to, tokenId); _setTokenURI(tokenId, uri); existingURIs[uri] = 1; dailyNFTController[getCurrentDate(block.timestamp)] = dailyNFTController[getCurrentDate(block.timestamp)] + 1; } function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } function isContentOwned(string memory uri) public view returns (bool) { return existingURIs[uri] == 1; } function mint(address recipient, string memory metadataURI) public payable returns (uint256) { require(existingURIs[metadataURI] != 1, "NFT already minted."); if (_tokenIdCounter.current() > NFTMax) { require(false, "total minted NFT has been reached max)"); } if (saleStatus == 0) { require(false, "nft is not on sale."); } if ( dailyNFTController[getCurrentDate(block.timestamp)] >= NFTdailyMax ) { require( false, "today minted NFT has been reached maximum(888), please try again tomorrow" ); } if (getDay(userMintTime[recipient]) == getDay(block.timestamp)) { require( false, "users only can mint one NFT everyday, please mint tomorrow" ); } uint256 newItemId = _tokenIdCounter.current(); _tokenIdCounter.increment(); existingURIs[metadataURI] = 1; _mint(recipient, newItemId); _setTokenURI(newItemId, metadataURI); dailyNFTController[getCurrentDate(block.timestamp)] = dailyNFTController[getCurrentDate(block.timestamp)] + 1; userMintTime[recipient] = uint32(block.timestamp); return newItemId; } function supportsInterface(bytes4 _interfaceId) public view virtual override( ERC721,ERC721Enumerable) returns (bool) { return super.supportsInterface(_interfaceId); } function totalSupply() public view virtual override (ERC721Enumerable) returns (uint256) { return NFTMax; } function count() public view returns (uint256) { return _tokenIdCounter.current(); } function updateSaleStatus(uint256 status) external onlyOwner { saleStatus = status; } function getSaleStatus() public view returns (uint256) { return saleStatus; } function update(uint32 max) external onlyOwner { NFTMax = max; } function updateDaily(uint32 dailyMax) external onlyOwner { NFTdailyMax = dailyMax; } function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < _tokenIdCounter.current()); return super.tokenByIndex(index); } function getNFTInfo() public view returns ( uint32, uint256, uint256, uint256 ) { return ( dailyNFTController[getCurrentDate(block.timestamp)], _tokenIdCounter.current(), NFTdailyMax, NFTMax ); } } // File: unicornfish.sol
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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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":[],"name":"count","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":"uint256","name":"","type":"uint256"}],"name":"getCurrentDate","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getDay","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint8","name":"month","type":"uint8"},{"internalType":"uint16","name":"year","type":"uint16"}],"name":"getDaysInMonth","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getHour","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getMinute","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getMonth","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getNFTInfo","outputs":[{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSaleStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getSecond","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getWeekday","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getYear","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"pure","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":"string","name":"uri","type":"string"}],"name":"isContentOwned","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"year","type":"uint16"}],"name":"isLeapYear","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"year","type":"uint256"}],"name":"leapYearsBefore","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"string","name":"metadataURI","type":"string"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"year","type":"uint16"},{"internalType":"uint8","name":"month","type":"uint8"},{"internalType":"uint8","name":"day","type":"uint8"},{"internalType":"uint8","name":"hour","type":"uint8"},{"internalType":"uint8","name":"minute","type":"uint8"}],"name":"toTimestamp","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint16","name":"year","type":"uint16"},{"internalType":"uint8","name":"month","type":"uint8"},{"internalType":"uint8","name":"day","type":"uint8"},{"internalType":"uint8","name":"hour","type":"uint8"}],"name":"toTimestamp","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint16","name":"year","type":"uint16"},{"internalType":"uint8","name":"month","type":"uint8"},{"internalType":"uint8","name":"day","type":"uint8"}],"name":"toTimestamp","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint16","name":"year","type":"uint16"},{"internalType":"uint8","name":"month","type":"uint8"},{"internalType":"uint8","name":"day","type":"uint8"},{"internalType":"uint8","name":"hour","type":"uint8"},{"internalType":"uint8","name":"minute","type":"uint8"},{"internalType":"uint8","name":"second","type":"uint8"}],"name":"toTimestamp","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"pure","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"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"max","type":"uint32"}],"name":"update","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"dailyMax","type":"uint32"}],"name":"updateDaily","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"status","type":"uint256"}],"name":"updateSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604080518082018252600b81526a0aadcd2c6dee4dc8cd2e6d60ab1b6020808301918252835180850190945260068452650aa868c92a6960d31b908401528151919291620000639160009162000120565b5080516200007990600190602084019062000120565b5050506200009662000090620000ca60201b60201c565b620000ce565b6012805463ffffffff60201b19166522b8000000001763ffffffff60401b1916690378000000000000000017905562000203565b3390565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200012e90620001c6565b90600052602060002090601f0160209004810192826200015257600085556200019d565b82601f106200016d57805160ff19168380011785556200019d565b828001600101855582156200019d579182015b828111156200019d57825182559160200191906001019062000180565b50620001ab929150620001af565b5090565b5b80821115620001ab5760008155600101620001b0565b600281046001821680620001db57607f821691505b60208210811415620001fd57634e487b7160e01b600052602260045260246000fd5b50919050565b612e5e80620002136000396000f3fe60806040526004361061025c5760003560e01c80638aa001fc11610144578063b1999937116100b6578063d0def5211161007a578063d0def5211461076c578063d204c45e1461077f578063e985e9c51461079f578063ec870448146107e8578063f2fde38b14610808578063fa93f883146108285761025c565b8063b1999937146106cc578063b238ad0e146106ec578063b88d4fde1461070c578063c580032f1461072c578063c87b56dd1461074c5761025c565b806392d663131161010857806392d663131461060457806395d89b41146106375780639f1cabc61461064c578063a22cb4651461066c578063a324ad241461068c578063a6f0e577146106ac5761025c565b80638aa001fc146105715780638c3c4b34146105915780638c8d98a0146105a65780638da5cb5b146105c65780639054bdec146105e45761025c565b806342842e0e116101dd57806362ba9687116101a157806362ba9687146104bc5780636352211e146104dc57806365c72840146104fc57806370a082311461051c578063715018a61461053c5780637f791833146105515761025c565b806342842e0e146103eb5780634ac1ad781461040b5780634d21e0191461042b5780634f6ccce71461046757806354af2bce146104875761025c565b806318160ddd1161022457806318160ddd1461033557806323b872dd146103595780632f745c591461037957806335b36c44146103995780633e239e1a146103b95761025c565b806301ffc9a71461026157806306661abd1461029657806306fdde03146102b9578063081812fc146102db578063095ea7b314610313575b600080fd5b34801561026d57600080fd5b5061028161027c366004612831565b610848565b60405190151581526020015b60405180910390f35b3480156102a257600080fd5b506102ab61085b565b60405190815260200161028d565b3480156102c557600080fd5b506102ce61086b565b60405161028d9190612b31565b3480156102e757600080fd5b506102fb6102f6366004612a22565b6108fd565b6040516001600160a01b03909116815260200161028d565b34801561031f57600080fd5b5061033361032e366004612808565b610924565b005b34801561034157600080fd5b506102ab601254640100000000900463ffffffff1690565b34801561036557600080fd5b506103336103743660046126ce565b610a3f565b34801561038557600080fd5b506102ab610394366004612808565b610a70565b3480156103a557600080fd5b506103336103b4366004612a22565b610b09565b3480156103c557600080fd5b506103d96103d4366004612a22565b610b16565b60405160ff909116815260200161028d565b3480156103f757600080fd5b506103336104063660046126ce565b610b3a565b34801561041757600080fd5b506103d9610426366004612a22565b610b55565b34801561043757600080fd5b50610440610b71565b6040805163ffffffff9095168552602085019390935291830152606082015260800161028d565b34801561047357600080fd5b506102ab610482366004612a22565b610bd1565b34801561049357600080fd5b506104a76104a2366004612a22565b610bf0565b60405163ffffffff909116815260200161028d565b3480156104c857600080fd5b506102ab6104d736600461294b565b610c2e565b3480156104e857600080fd5b506102fb6104f7366004612a22565b610c49565b34801561050857600080fd5b506103d9610517366004612a22565b610ca9565b34801561052857600080fd5b506102ab610537366004612682565b610cbe565b34801561054857600080fd5b50610333610d44565b34801561055d57600080fd5b506102ab61056c3660046128f8565b610d58565b34801561057d57600080fd5b506103d961058c366004612a22565b610d72565b34801561059d57600080fd5b506011546102ab565b3480156105b257600080fd5b506102ab6105c13660046128b6565b610d7f565b3480156105d257600080fd5b50600b546001600160a01b03166102fb565b3480156105f057600080fd5b506102ab6105ff3660046129af565b610d8d565b34801561061057600080fd5b5061062461061f366004612a22565b610f4c565b60405161ffff909116815260200161028d565b34801561064357600080fd5b506102ce61103c565b34801561065857600080fd5b50610281610667366004612869565b61104b565b34801561067857600080fd5b50610333610687366004612782565b61107a565b34801561069857600080fd5b506103d96106a7366004612a22565b611089565b3480156106b857600080fd5b506102816106c736600461289c565b61109e565b3480156106d857600080fd5b506102ab6106e7366004612a22565b6110fd565b3480156106f857600080fd5b506103d9610707366004612a5e565b611142565b34801561071857600080fd5b50610333610727366004612709565b611208565b34801561073857600080fd5b50610333610747366004612a3a565b611240565b34801561075857600080fd5b506102ce610767366004612a22565b611270565b6102ab61077a3660046127bc565b61127b565b34801561078b57600080fd5b5061033361079a3660046127bc565b611606565b3480156107ab57600080fd5b506102816107ba36600461269c565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107f457600080fd5b50610333610803366004612a3a565b6116e1565b34801561081457600080fd5b50610333610823366004612682565b611714565b34801561083457600080fd5b506103d9610843366004612a22565b61178d565b60006108538261179b565b90505b919050565b6000610866600c5490565b905090565b60606000805461087a90612d03565b80601f01602080910402602001604051908101604052809291908181526020018280546108a690612d03565b80156108f35780601f106108c8576101008083540402835291602001916108f3565b820191906000526020600020905b8154815290600101906020018083116108d657829003601f168201915b5050505050905090565b6000610908826117c0565b506000908152600460205260409020546001600160a01b031690565b600061092f82610c49565b9050806001600160a01b0316836001600160a01b031614156109a25760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806109be57506109be81336107ba565b610a305760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610999565b610a3a838361181f565b505050565b610a49338261188d565b610a655760405162461bcd60e51b815260040161099990612b96565b610a3a83838361190b565b6000610a7b83610cbe565b8210610add5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610999565b506001600160a01b03821660009081526007602090815260408083208484529091529020545b92915050565b610b11611aa7565b601155565b60006018603c610b268185612c1b565b610b309190612c1b565b6108539190612dbc565b610a3a83838360405180602001604052806000815250611208565b60006007610b666201518084612c1b565b610b30906004612be4565b60008060008060106000610b8442610bf0565b63ffffffff908116825260208201929092526040016000205416610ba7600c5490565b601254919550935063ffffffff600160401b82048116935064010000000090910416905090919293565b6000610bdc600c5490565b8210610be757600080fd5b61085382611b01565b600080610bfc42611089565b90506000610c0e60ff83166064612c4e565b9050610c1942610ca9565b610c269060ff1682612bfc565b949350505050565b6000610c3f86868686866000610d8d565b9695505050505050565b6000818152600260205260408120546001600160a01b0316806108535760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610999565b6000610cb482611ba2565b6040015192915050565b60006001600160a01b038216610d285760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610999565b506001600160a01b031660009081526003602052604090205490565b610d4c611aa7565b610d566000611d8a565b565b6000610d6985858585600080610d8d565b95945050505050565b6000610853603c83612dbc565b6000610c2684848460008060005b60006107b25b8761ffff168161ffff161015610de957610dac8161109e565b15610dc657610dbf6301e2850083612be4565b9150610dd7565b610dd46301e1338083612be4565b91505b80610de181612d3e565b915050610d93565b610df16124fb565b601f8152610dfe8961109e565b15610e0f57601d6020820152610e17565b601c60208201525b601f60408201819052601e606083018190526080830182905260a0830181905260c0830182905260e0830182905261010083018190526101208301829052610140830152610160820152600191505b8760ff168261ffff161015610ed65780610e81600184612c7a565b61ffff16600c8110610ea357634e487b7160e01b600052603260045260246000fd5b6020020151610eb89060ff1662015180612c2f565b610ec29084612be4565b925081610ece81612d3e565b925050610e66565b610ee1600188612cb4565b610ef19060ff1662015180612c2f565b610efb9084612be4565b9250610f0c60ff8716610e10612c2f565b610f169084612be4565b9250610f2660ff8616603c612c2f565b610f309084612be4565b9250610f3f60ff851684612be4565b9998505050505050505050565b6000808080610f5f6301e1338086612c1b565b610f6b906107b2612be4565b9150610f786107b26110fd565b610f858361ffff166110fd565b610f8f9190612c9d565b9050610f9f816301e28500612c2f565b610fa99084612be4565b925080610fb86107b284612c7a565b61ffff16610fc69190612c9d565b610fd4906301e13380612c2f565b610fde9084612be4565b92505b8483111561103457610ff76106c7600184612c7a565b156110115761100a6301e2850084612c9d565b9250611022565b61101f6301e1338084612c9d565b92505b61102d600183612c7a565b9150610fe1565b509392505050565b60606001805461087a90612d03565b6000600d8260405161105d9190612ab3565b9081526040519081900360200190205460ff166001149050919050565b611085338383611ddc565b5050565b600061109482611ba2565b6020015192915050565b60006110ab600483612d9b565b61ffff16156110bc57506000610856565b6110c7606483612d9b565b61ffff16156110d857506001610856565b6110e461019083612d9b565b61ffff16156110f557506000610856565b506001919050565b600061110a600183612c9d565b915061111861019083612c1b565b611123606484612c1b565b61112e600485612c1b565b6111389190612c9d565b6108539190612be4565b60008260ff166001148061115957508260ff166003145b8061116757508260ff166005145b8061117557508260ff166007145b8061118357508260ff166008145b8061119157508260ff16600a145b8061119f57508260ff16600c145b156111ac5750601f610b03565b8260ff16600414806111c157508260ff166006145b806111cf57508260ff166009145b806111dd57508260ff16600b145b156111ea5750601e610b03565b6111f38261109e565b156112005750601d610b03565b50601c610b03565b611212338361188d565b61122e5760405162461bcd60e51b815260040161099990612b96565b61123a84848484611eab565b50505050565b611248611aa7565b6012805463ffffffff9092166401000000000267ffffffff0000000019909216919091179055565b606061085382611ede565b6000600d8260405161128d9190612ab3565b9081526040519081900360200190205460ff16600114156112e65760405162461bcd60e51b815260206004820152601360248201527227232a1030b63932b0b23c9036b4b73a32b21760691b6044820152606401610999565b601254640100000000900463ffffffff16611300600c5490565b111561135d5760405162461bcd60e51b815260206004820152602660248201527f746f74616c206d696e746564204e465420686173206265656e2072656163686560448201526564206d61782960d01b6064820152608401610999565b6011546113a25760405162461bcd60e51b815260206004820152601360248201527237333a1034b9903737ba1037b71039b0b6329760691b6044820152606401610999565b601254600160401b900463ffffffff16601060006113bf42610bf0565b63ffffffff9081168252602082019290925260400160002054161061145e5760405162461bcd60e51b815260206004820152604960248201527f746f646179206d696e746564204e465420686173206265656e2072656163686560448201527f64206d6178696d756d28383838292c20706c656173652074727920616761696e60648201526820746f6d6f72726f7760b81b608482015260a401610999565b61146742610ca9565b6001600160a01b0384166000908152600f602052604090205460ff91909116906114969063ffffffff16610ca9565b60ff16141561150d5760405162461bcd60e51b815260206004820152603a60248201527f7573657273206f6e6c792063616e206d696e74206f6e65204e4654206576657260448201527f796461792c20706c65617365206d696e7420746f6d6f72726f770000000000006064820152608401610999565b6000611518600c5490565b9050611528600c80546001019055565b6001600d8460405161153a9190612ab3565b908152604051908190036020019020805460ff9290921660ff199092169190911790556115678482611fe8565b611571818461212b565b6010600061157e42610bf0565b63ffffffff90811682526020820192909252604001600020546115a391166001612bfc565b601060006115b042610bf0565b63ffffffff908116825260208083019390935260409182016000908120805495831663ffffffff199687161790556001600160a01b0389168152600f909352912080544290921691909216179055905092915050565b61160e611aa7565b6000611619600c5490565b9050611629600c80546001019055565b61163383826121c5565b61163d818361212b565b6001600d8360405161164f9190612ab3565b908152604051908190036020019020805460ff9290921660ff199092169190911790556010600061167f42610bf0565b63ffffffff90811682526020820192909252604001600020546116a491166001612bfc565b601060006116b142610bf0565b63ffffffff90811682526020820192909252604001600020805463ffffffff191692909116919091179055505050565b6116e9611aa7565b6012805463ffffffff909216600160401b026bffffffff000000000000000019909216919091179055565b61171c611aa7565b6001600160a01b0381166117815760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610999565b61178a81611d8a565b50565b6000603c610b308184612c1b565b60006001600160e01b0319821663780e9d6360e01b14806108535750610853826121df565b6000818152600260205260409020546001600160a01b031661178a5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610999565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061185482610c49565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061189983610c49565b9050806001600160a01b0316846001600160a01b031614806118e057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80610c265750836001600160a01b03166118f9846108fd565b6001600160a01b031614949350505050565b826001600160a01b031661191e82610c49565b6001600160a01b0316146119825760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610999565b6001600160a01b0382166119e45760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610999565b6119ef60008261181f565b6001600160a01b0383166000908152600360205260408120805460019290611a18908490612c9d565b90915550506001600160a01b0382166000908152600360205260408120805460019290611a46908490612be4565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4610a3a565b600b546001600160a01b03163314610d565760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610999565b6000611b0c60095490565b8210611b6f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610999565b60098281548110611b9057634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101829052908080611be685610f4c565b61ffff168452611bf76107b26110fd565b8451611c069061ffff166110fd565b611c109190612c9d565b9150611c20826301e28500612c2f565b611c2a9084612be4565b9250816107b28560000151611c3f9190612c7a565b61ffff16611c4d9190612c9d565b611c5b906301e13380612c2f565b611c659084612be4565b92506000600191505b600c8260ff1611611cd657611c87828660000151611142565b611c979060ff1662015180612c2f565b905085611ca48583612be4565b1115611cb85760ff82166020860152611cd6565b611cc28185612be4565b935081611cce81612d7b565b925050611c6e565b600191505b611ced85602001518660000151611142565b60ff168260ff1611611d3c5785611d078562015180612be4565b1115611d1b5760ff82166040860152611d3c565b611d286201518085612be4565b935081611d3481612d7b565b925050611cdb565b611d4586610b16565b60ff166060860152611d568661178d565b60ff166080860152611d6786610d72565b60ff1660a0860152611d7886610b55565b60ff1660c08601525092949350505050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611e3e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610999565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611eb684848461190b565b611ec28484848461222f565b61123a5760405162461bcd60e51b815260040161099990612b44565b6060611ee9826117c0565b60008281526006602052604081208054611f0290612d03565b80601f0160208091040260200160405190810160405280929190818152602001828054611f2e90612d03565b8015611f7b5780601f10611f5057610100808354040283529160200191611f7b565b820191906000526020600020905b815481529060010190602001808311611f5e57829003601f168201915b505050505090506000611f9960408051602081019091526000815290565b9050805160001415611fad57509050610856565b815115611fdf578082604051602001611fc7929190612acf565b60405160208183030381529060405292505050610856565b610c2684612339565b6001600160a01b03821661203e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610999565b6000818152600260205260409020546001600160a01b0316156120a35760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610999565b6001600160a01b03821660009081526003602052604081208054600192906120cc908490612be4565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611085565b6000828152600260205260409020546001600160a01b03166121a65760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b6064820152608401610999565b60008281526006602090815260409091208251610a3a9284019061251a565b6110858282604051806020016040528060008152506123ad565b60006001600160e01b031982166380ac58cd60e01b148061221057506001600160e01b03198216635b5e139f60e01b145b8061085357506301ffc9a760e01b6001600160e01b0319831614610853565b60006001600160a01b0384163b1561233157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612273903390899088908890600401612afe565b602060405180830381600087803b15801561228d57600080fd5b505af19250505080156122bd575060408051601f3d908101601f191682019092526122ba9181019061284d565b60015b612317573d8080156122eb576040519150601f19603f3d011682016040523d82523d6000602084013e6122f0565b606091505b50805161230f5760405162461bcd60e51b815260040161099990612b44565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610c26565b506001610c26565b6060612344826117c0565b600061235b60408051602081019091526000815290565b9050600081511161237b57604051806020016040528060008152506123a6565b80612385846123e0565b604051602001612396929190612acf565b6040516020818303038152906040525b9392505050565b6123b78383611fe8565b6123c4600084848461222f565b610a3a5760405162461bcd60e51b815260040161099990612b44565b60608161240557506040805180820190915260018152600360fc1b6020820152610856565b8160005b811561242f578061241981612d60565b91506124289050600a83612c1b565b9150612409565b60008167ffffffffffffffff81111561245857634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612482576020820181803683370190505b5090505b8415610c2657612497600183612c9d565b91506124a4600a86612dbc565b6124af906030612be4565b60f81b8183815181106124d257634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506124f4600a86612c1b565b9450612486565b604051806101800160405280600c906020820280368337509192915050565b82805461252690612d03565b90600052602060002090601f016020900481019282612548576000855561258e565b82601f1061256157805160ff191683800117855561258e565b8280016001018555821561258e579182015b8281111561258e578251825591602001919060010190612573565b5061259a92915061259e565b5090565b5b8082111561259a576000815560010161259f565b600067ffffffffffffffff808411156125ce576125ce612dfc565b604051601f8501601f19908116603f011681019082821181831017156125f6576125f6612dfc565b8160405280935085815286868601111561260f57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461085657600080fd5b600082601f830112612650578081fd5b6123a6838335602085016125b3565b803561ffff8116811461085657600080fd5b803560ff8116811461085657600080fd5b600060208284031215612693578081fd5b6123a682612629565b600080604083850312156126ae578081fd5b6126b783612629565b91506126c560208401612629565b90509250929050565b6000806000606084860312156126e2578081fd5b6126eb84612629565b92506126f960208501612629565b9150604084013590509250925092565b6000806000806080858703121561271e578081fd5b61272785612629565b935061273560208601612629565b925060408501359150606085013567ffffffffffffffff811115612757578182fd5b8501601f81018713612767578182fd5b612776878235602084016125b3565b91505092959194509250565b60008060408385031215612794578182fd5b61279d83612629565b9150602083013580151581146127b1578182fd5b809150509250929050565b600080604083850312156127ce578182fd5b6127d783612629565b9150602083013567ffffffffffffffff8111156127f2578182fd5b6127fe85828601612640565b9150509250929050565b6000806040838503121561281a578182fd5b61282383612629565b946020939093013593505050565b600060208284031215612842578081fd5b81356123a681612e12565b60006020828403121561285e578081fd5b81516123a681612e12565b60006020828403121561287a578081fd5b813567ffffffffffffffff811115612890578182fd5b610c2684828501612640565b6000602082840312156128ad578081fd5b6123a68261265f565b6000806000606084860312156128ca578283fd5b6128d38461265f565b92506128e160208501612671565b91506128ef60408501612671565b90509250925092565b6000806000806080858703121561290d578182fd5b6129168561265f565b935061292460208601612671565b925061293260408601612671565b915061294060608601612671565b905092959194509250565b600080600080600060a08688031215612962578283fd5b61296b8661265f565b945061297960208701612671565b935061298760408701612671565b925061299560608701612671565b91506129a360808701612671565b90509295509295909350565b60008060008060008060c087890312156129c7578384fd5b6129d08761265f565b95506129de60208801612671565b94506129ec60408801612671565b93506129fa60608801612671565b9250612a0860808801612671565b9150612a1660a08801612671565b90509295509295509295565b600060208284031215612a33578081fd5b5035919050565b600060208284031215612a4b578081fd5b813563ffffffff811681146123a6578182fd5b60008060408385031215612a70578182fd5b612a7983612671565b91506126c56020840161265f565b60008151808452612a9f816020860160208601612cd7565b601f01601f19169290920160200192915050565b60008251612ac5818460208701612cd7565b9190910192915050565b60008351612ae1818460208801612cd7565b835190830190612af5818360208801612cd7565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090610c3f90830184612a87565b6000602082526123a66020830184612a87565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b60008219821115612bf757612bf7612dd0565b500190565b600063ffffffff808316818516808303821115612af557612af5612dd0565b600082612c2a57612c2a612de6565b500490565b6000816000190483118215151615612c4957612c49612dd0565b500290565b600063ffffffff80831681851681830481118215151615612c7157612c71612dd0565b02949350505050565b600061ffff83811690831681811015612c9557612c95612dd0565b039392505050565b600082821015612caf57612caf612dd0565b500390565b600060ff821660ff841680821015612cce57612cce612dd0565b90039392505050565b60005b83811015612cf2578181015183820152602001612cda565b8381111561123a5750506000910152565b600281046001821680612d1757607f821691505b60208210811415612d3857634e487b7160e01b600052602260045260246000fd5b50919050565b600061ffff80831681811415612d5657612d56612dd0565b6001019392505050565b6000600019821415612d7457612d74612dd0565b5060010190565b600060ff821660ff811415612d9257612d92612dd0565b60010192915050565b600061ffff80841680612db057612db0612de6565b92169190910692915050565b600082612dcb57612dcb612de6565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461178a57600080fdfea2646970667358221220f1e7c816f693e6bb711943a866ed8314e92d453df842359dfdc72a55d963d70a64736f6c63430008020033
Deployed Bytecode
0x60806040526004361061025c5760003560e01c80638aa001fc11610144578063b1999937116100b6578063d0def5211161007a578063d0def5211461076c578063d204c45e1461077f578063e985e9c51461079f578063ec870448146107e8578063f2fde38b14610808578063fa93f883146108285761025c565b8063b1999937146106cc578063b238ad0e146106ec578063b88d4fde1461070c578063c580032f1461072c578063c87b56dd1461074c5761025c565b806392d663131161010857806392d663131461060457806395d89b41146106375780639f1cabc61461064c578063a22cb4651461066c578063a324ad241461068c578063a6f0e577146106ac5761025c565b80638aa001fc146105715780638c3c4b34146105915780638c8d98a0146105a65780638da5cb5b146105c65780639054bdec146105e45761025c565b806342842e0e116101dd57806362ba9687116101a157806362ba9687146104bc5780636352211e146104dc57806365c72840146104fc57806370a082311461051c578063715018a61461053c5780637f791833146105515761025c565b806342842e0e146103eb5780634ac1ad781461040b5780634d21e0191461042b5780634f6ccce71461046757806354af2bce146104875761025c565b806318160ddd1161022457806318160ddd1461033557806323b872dd146103595780632f745c591461037957806335b36c44146103995780633e239e1a146103b95761025c565b806301ffc9a71461026157806306661abd1461029657806306fdde03146102b9578063081812fc146102db578063095ea7b314610313575b600080fd5b34801561026d57600080fd5b5061028161027c366004612831565b610848565b60405190151581526020015b60405180910390f35b3480156102a257600080fd5b506102ab61085b565b60405190815260200161028d565b3480156102c557600080fd5b506102ce61086b565b60405161028d9190612b31565b3480156102e757600080fd5b506102fb6102f6366004612a22565b6108fd565b6040516001600160a01b03909116815260200161028d565b34801561031f57600080fd5b5061033361032e366004612808565b610924565b005b34801561034157600080fd5b506102ab601254640100000000900463ffffffff1690565b34801561036557600080fd5b506103336103743660046126ce565b610a3f565b34801561038557600080fd5b506102ab610394366004612808565b610a70565b3480156103a557600080fd5b506103336103b4366004612a22565b610b09565b3480156103c557600080fd5b506103d96103d4366004612a22565b610b16565b60405160ff909116815260200161028d565b3480156103f757600080fd5b506103336104063660046126ce565b610b3a565b34801561041757600080fd5b506103d9610426366004612a22565b610b55565b34801561043757600080fd5b50610440610b71565b6040805163ffffffff9095168552602085019390935291830152606082015260800161028d565b34801561047357600080fd5b506102ab610482366004612a22565b610bd1565b34801561049357600080fd5b506104a76104a2366004612a22565b610bf0565b60405163ffffffff909116815260200161028d565b3480156104c857600080fd5b506102ab6104d736600461294b565b610c2e565b3480156104e857600080fd5b506102fb6104f7366004612a22565b610c49565b34801561050857600080fd5b506103d9610517366004612a22565b610ca9565b34801561052857600080fd5b506102ab610537366004612682565b610cbe565b34801561054857600080fd5b50610333610d44565b34801561055d57600080fd5b506102ab61056c3660046128f8565b610d58565b34801561057d57600080fd5b506103d961058c366004612a22565b610d72565b34801561059d57600080fd5b506011546102ab565b3480156105b257600080fd5b506102ab6105c13660046128b6565b610d7f565b3480156105d257600080fd5b50600b546001600160a01b03166102fb565b3480156105f057600080fd5b506102ab6105ff3660046129af565b610d8d565b34801561061057600080fd5b5061062461061f366004612a22565b610f4c565b60405161ffff909116815260200161028d565b34801561064357600080fd5b506102ce61103c565b34801561065857600080fd5b50610281610667366004612869565b61104b565b34801561067857600080fd5b50610333610687366004612782565b61107a565b34801561069857600080fd5b506103d96106a7366004612a22565b611089565b3480156106b857600080fd5b506102816106c736600461289c565b61109e565b3480156106d857600080fd5b506102ab6106e7366004612a22565b6110fd565b3480156106f857600080fd5b506103d9610707366004612a5e565b611142565b34801561071857600080fd5b50610333610727366004612709565b611208565b34801561073857600080fd5b50610333610747366004612a3a565b611240565b34801561075857600080fd5b506102ce610767366004612a22565b611270565b6102ab61077a3660046127bc565b61127b565b34801561078b57600080fd5b5061033361079a3660046127bc565b611606565b3480156107ab57600080fd5b506102816107ba36600461269c565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107f457600080fd5b50610333610803366004612a3a565b6116e1565b34801561081457600080fd5b50610333610823366004612682565b611714565b34801561083457600080fd5b506103d9610843366004612a22565b61178d565b60006108538261179b565b90505b919050565b6000610866600c5490565b905090565b60606000805461087a90612d03565b80601f01602080910402602001604051908101604052809291908181526020018280546108a690612d03565b80156108f35780601f106108c8576101008083540402835291602001916108f3565b820191906000526020600020905b8154815290600101906020018083116108d657829003601f168201915b5050505050905090565b6000610908826117c0565b506000908152600460205260409020546001600160a01b031690565b600061092f82610c49565b9050806001600160a01b0316836001600160a01b031614156109a25760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806109be57506109be81336107ba565b610a305760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610999565b610a3a838361181f565b505050565b610a49338261188d565b610a655760405162461bcd60e51b815260040161099990612b96565b610a3a83838361190b565b6000610a7b83610cbe565b8210610add5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610999565b506001600160a01b03821660009081526007602090815260408083208484529091529020545b92915050565b610b11611aa7565b601155565b60006018603c610b268185612c1b565b610b309190612c1b565b6108539190612dbc565b610a3a83838360405180602001604052806000815250611208565b60006007610b666201518084612c1b565b610b30906004612be4565b60008060008060106000610b8442610bf0565b63ffffffff908116825260208201929092526040016000205416610ba7600c5490565b601254919550935063ffffffff600160401b82048116935064010000000090910416905090919293565b6000610bdc600c5490565b8210610be757600080fd5b61085382611b01565b600080610bfc42611089565b90506000610c0e60ff83166064612c4e565b9050610c1942610ca9565b610c269060ff1682612bfc565b949350505050565b6000610c3f86868686866000610d8d565b9695505050505050565b6000818152600260205260408120546001600160a01b0316806108535760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610999565b6000610cb482611ba2565b6040015192915050565b60006001600160a01b038216610d285760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610999565b506001600160a01b031660009081526003602052604090205490565b610d4c611aa7565b610d566000611d8a565b565b6000610d6985858585600080610d8d565b95945050505050565b6000610853603c83612dbc565b6000610c2684848460008060005b60006107b25b8761ffff168161ffff161015610de957610dac8161109e565b15610dc657610dbf6301e2850083612be4565b9150610dd7565b610dd46301e1338083612be4565b91505b80610de181612d3e565b915050610d93565b610df16124fb565b601f8152610dfe8961109e565b15610e0f57601d6020820152610e17565b601c60208201525b601f60408201819052601e606083018190526080830182905260a0830181905260c0830182905260e0830182905261010083018190526101208301829052610140830152610160820152600191505b8760ff168261ffff161015610ed65780610e81600184612c7a565b61ffff16600c8110610ea357634e487b7160e01b600052603260045260246000fd5b6020020151610eb89060ff1662015180612c2f565b610ec29084612be4565b925081610ece81612d3e565b925050610e66565b610ee1600188612cb4565b610ef19060ff1662015180612c2f565b610efb9084612be4565b9250610f0c60ff8716610e10612c2f565b610f169084612be4565b9250610f2660ff8616603c612c2f565b610f309084612be4565b9250610f3f60ff851684612be4565b9998505050505050505050565b6000808080610f5f6301e1338086612c1b565b610f6b906107b2612be4565b9150610f786107b26110fd565b610f858361ffff166110fd565b610f8f9190612c9d565b9050610f9f816301e28500612c2f565b610fa99084612be4565b925080610fb86107b284612c7a565b61ffff16610fc69190612c9d565b610fd4906301e13380612c2f565b610fde9084612be4565b92505b8483111561103457610ff76106c7600184612c7a565b156110115761100a6301e2850084612c9d565b9250611022565b61101f6301e1338084612c9d565b92505b61102d600183612c7a565b9150610fe1565b509392505050565b60606001805461087a90612d03565b6000600d8260405161105d9190612ab3565b9081526040519081900360200190205460ff166001149050919050565b611085338383611ddc565b5050565b600061109482611ba2565b6020015192915050565b60006110ab600483612d9b565b61ffff16156110bc57506000610856565b6110c7606483612d9b565b61ffff16156110d857506001610856565b6110e461019083612d9b565b61ffff16156110f557506000610856565b506001919050565b600061110a600183612c9d565b915061111861019083612c1b565b611123606484612c1b565b61112e600485612c1b565b6111389190612c9d565b6108539190612be4565b60008260ff166001148061115957508260ff166003145b8061116757508260ff166005145b8061117557508260ff166007145b8061118357508260ff166008145b8061119157508260ff16600a145b8061119f57508260ff16600c145b156111ac5750601f610b03565b8260ff16600414806111c157508260ff166006145b806111cf57508260ff166009145b806111dd57508260ff16600b145b156111ea5750601e610b03565b6111f38261109e565b156112005750601d610b03565b50601c610b03565b611212338361188d565b61122e5760405162461bcd60e51b815260040161099990612b96565b61123a84848484611eab565b50505050565b611248611aa7565b6012805463ffffffff9092166401000000000267ffffffff0000000019909216919091179055565b606061085382611ede565b6000600d8260405161128d9190612ab3565b9081526040519081900360200190205460ff16600114156112e65760405162461bcd60e51b815260206004820152601360248201527227232a1030b63932b0b23c9036b4b73a32b21760691b6044820152606401610999565b601254640100000000900463ffffffff16611300600c5490565b111561135d5760405162461bcd60e51b815260206004820152602660248201527f746f74616c206d696e746564204e465420686173206265656e2072656163686560448201526564206d61782960d01b6064820152608401610999565b6011546113a25760405162461bcd60e51b815260206004820152601360248201527237333a1034b9903737ba1037b71039b0b6329760691b6044820152606401610999565b601254600160401b900463ffffffff16601060006113bf42610bf0565b63ffffffff9081168252602082019290925260400160002054161061145e5760405162461bcd60e51b815260206004820152604960248201527f746f646179206d696e746564204e465420686173206265656e2072656163686560448201527f64206d6178696d756d28383838292c20706c656173652074727920616761696e60648201526820746f6d6f72726f7760b81b608482015260a401610999565b61146742610ca9565b6001600160a01b0384166000908152600f602052604090205460ff91909116906114969063ffffffff16610ca9565b60ff16141561150d5760405162461bcd60e51b815260206004820152603a60248201527f7573657273206f6e6c792063616e206d696e74206f6e65204e4654206576657260448201527f796461792c20706c65617365206d696e7420746f6d6f72726f770000000000006064820152608401610999565b6000611518600c5490565b9050611528600c80546001019055565b6001600d8460405161153a9190612ab3565b908152604051908190036020019020805460ff9290921660ff199092169190911790556115678482611fe8565b611571818461212b565b6010600061157e42610bf0565b63ffffffff90811682526020820192909252604001600020546115a391166001612bfc565b601060006115b042610bf0565b63ffffffff908116825260208083019390935260409182016000908120805495831663ffffffff199687161790556001600160a01b0389168152600f909352912080544290921691909216179055905092915050565b61160e611aa7565b6000611619600c5490565b9050611629600c80546001019055565b61163383826121c5565b61163d818361212b565b6001600d8360405161164f9190612ab3565b908152604051908190036020019020805460ff9290921660ff199092169190911790556010600061167f42610bf0565b63ffffffff90811682526020820192909252604001600020546116a491166001612bfc565b601060006116b142610bf0565b63ffffffff90811682526020820192909252604001600020805463ffffffff191692909116919091179055505050565b6116e9611aa7565b6012805463ffffffff909216600160401b026bffffffff000000000000000019909216919091179055565b61171c611aa7565b6001600160a01b0381166117815760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610999565b61178a81611d8a565b50565b6000603c610b308184612c1b565b60006001600160e01b0319821663780e9d6360e01b14806108535750610853826121df565b6000818152600260205260409020546001600160a01b031661178a5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610999565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061185482610c49565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061189983610c49565b9050806001600160a01b0316846001600160a01b031614806118e057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80610c265750836001600160a01b03166118f9846108fd565b6001600160a01b031614949350505050565b826001600160a01b031661191e82610c49565b6001600160a01b0316146119825760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610999565b6001600160a01b0382166119e45760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610999565b6119ef60008261181f565b6001600160a01b0383166000908152600360205260408120805460019290611a18908490612c9d565b90915550506001600160a01b0382166000908152600360205260408120805460019290611a46908490612be4565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4610a3a565b600b546001600160a01b03163314610d565760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610999565b6000611b0c60095490565b8210611b6f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610999565b60098281548110611b9057634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101829052908080611be685610f4c565b61ffff168452611bf76107b26110fd565b8451611c069061ffff166110fd565b611c109190612c9d565b9150611c20826301e28500612c2f565b611c2a9084612be4565b9250816107b28560000151611c3f9190612c7a565b61ffff16611c4d9190612c9d565b611c5b906301e13380612c2f565b611c659084612be4565b92506000600191505b600c8260ff1611611cd657611c87828660000151611142565b611c979060ff1662015180612c2f565b905085611ca48583612be4565b1115611cb85760ff82166020860152611cd6565b611cc28185612be4565b935081611cce81612d7b565b925050611c6e565b600191505b611ced85602001518660000151611142565b60ff168260ff1611611d3c5785611d078562015180612be4565b1115611d1b5760ff82166040860152611d3c565b611d286201518085612be4565b935081611d3481612d7b565b925050611cdb565b611d4586610b16565b60ff166060860152611d568661178d565b60ff166080860152611d6786610d72565b60ff1660a0860152611d7886610b55565b60ff1660c08601525092949350505050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611e3e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610999565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611eb684848461190b565b611ec28484848461222f565b61123a5760405162461bcd60e51b815260040161099990612b44565b6060611ee9826117c0565b60008281526006602052604081208054611f0290612d03565b80601f0160208091040260200160405190810160405280929190818152602001828054611f2e90612d03565b8015611f7b5780601f10611f5057610100808354040283529160200191611f7b565b820191906000526020600020905b815481529060010190602001808311611f5e57829003601f168201915b505050505090506000611f9960408051602081019091526000815290565b9050805160001415611fad57509050610856565b815115611fdf578082604051602001611fc7929190612acf565b60405160208183030381529060405292505050610856565b610c2684612339565b6001600160a01b03821661203e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610999565b6000818152600260205260409020546001600160a01b0316156120a35760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610999565b6001600160a01b03821660009081526003602052604081208054600192906120cc908490612be4565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611085565b6000828152600260205260409020546001600160a01b03166121a65760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b6064820152608401610999565b60008281526006602090815260409091208251610a3a9284019061251a565b6110858282604051806020016040528060008152506123ad565b60006001600160e01b031982166380ac58cd60e01b148061221057506001600160e01b03198216635b5e139f60e01b145b8061085357506301ffc9a760e01b6001600160e01b0319831614610853565b60006001600160a01b0384163b1561233157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612273903390899088908890600401612afe565b602060405180830381600087803b15801561228d57600080fd5b505af19250505080156122bd575060408051601f3d908101601f191682019092526122ba9181019061284d565b60015b612317573d8080156122eb576040519150601f19603f3d011682016040523d82523d6000602084013e6122f0565b606091505b50805161230f5760405162461bcd60e51b815260040161099990612b44565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610c26565b506001610c26565b6060612344826117c0565b600061235b60408051602081019091526000815290565b9050600081511161237b57604051806020016040528060008152506123a6565b80612385846123e0565b604051602001612396929190612acf565b6040516020818303038152906040525b9392505050565b6123b78383611fe8565b6123c4600084848461222f565b610a3a5760405162461bcd60e51b815260040161099990612b44565b60608161240557506040805180820190915260018152600360fc1b6020820152610856565b8160005b811561242f578061241981612d60565b91506124289050600a83612c1b565b9150612409565b60008167ffffffffffffffff81111561245857634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612482576020820181803683370190505b5090505b8415610c2657612497600183612c9d565b91506124a4600a86612dbc565b6124af906030612be4565b60f81b8183815181106124d257634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506124f4600a86612c1b565b9450612486565b604051806101800160405280600c906020820280368337509192915050565b82805461252690612d03565b90600052602060002090601f016020900481019282612548576000855561258e565b82601f1061256157805160ff191683800117855561258e565b8280016001018555821561258e579182015b8281111561258e578251825591602001919060010190612573565b5061259a92915061259e565b5090565b5b8082111561259a576000815560010161259f565b600067ffffffffffffffff808411156125ce576125ce612dfc565b604051601f8501601f19908116603f011681019082821181831017156125f6576125f6612dfc565b8160405280935085815286868601111561260f57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461085657600080fd5b600082601f830112612650578081fd5b6123a6838335602085016125b3565b803561ffff8116811461085657600080fd5b803560ff8116811461085657600080fd5b600060208284031215612693578081fd5b6123a682612629565b600080604083850312156126ae578081fd5b6126b783612629565b91506126c560208401612629565b90509250929050565b6000806000606084860312156126e2578081fd5b6126eb84612629565b92506126f960208501612629565b9150604084013590509250925092565b6000806000806080858703121561271e578081fd5b61272785612629565b935061273560208601612629565b925060408501359150606085013567ffffffffffffffff811115612757578182fd5b8501601f81018713612767578182fd5b612776878235602084016125b3565b91505092959194509250565b60008060408385031215612794578182fd5b61279d83612629565b9150602083013580151581146127b1578182fd5b809150509250929050565b600080604083850312156127ce578182fd5b6127d783612629565b9150602083013567ffffffffffffffff8111156127f2578182fd5b6127fe85828601612640565b9150509250929050565b6000806040838503121561281a578182fd5b61282383612629565b946020939093013593505050565b600060208284031215612842578081fd5b81356123a681612e12565b60006020828403121561285e578081fd5b81516123a681612e12565b60006020828403121561287a578081fd5b813567ffffffffffffffff811115612890578182fd5b610c2684828501612640565b6000602082840312156128ad578081fd5b6123a68261265f565b6000806000606084860312156128ca578283fd5b6128d38461265f565b92506128e160208501612671565b91506128ef60408501612671565b90509250925092565b6000806000806080858703121561290d578182fd5b6129168561265f565b935061292460208601612671565b925061293260408601612671565b915061294060608601612671565b905092959194509250565b600080600080600060a08688031215612962578283fd5b61296b8661265f565b945061297960208701612671565b935061298760408701612671565b925061299560608701612671565b91506129a360808701612671565b90509295509295909350565b60008060008060008060c087890312156129c7578384fd5b6129d08761265f565b95506129de60208801612671565b94506129ec60408801612671565b93506129fa60608801612671565b9250612a0860808801612671565b9150612a1660a08801612671565b90509295509295509295565b600060208284031215612a33578081fd5b5035919050565b600060208284031215612a4b578081fd5b813563ffffffff811681146123a6578182fd5b60008060408385031215612a70578182fd5b612a7983612671565b91506126c56020840161265f565b60008151808452612a9f816020860160208601612cd7565b601f01601f19169290920160200192915050565b60008251612ac5818460208701612cd7565b9190910192915050565b60008351612ae1818460208801612cd7565b835190830190612af5818360208801612cd7565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090610c3f90830184612a87565b6000602082526123a66020830184612a87565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b60008219821115612bf757612bf7612dd0565b500190565b600063ffffffff808316818516808303821115612af557612af5612dd0565b600082612c2a57612c2a612de6565b500490565b6000816000190483118215151615612c4957612c49612dd0565b500290565b600063ffffffff80831681851681830481118215151615612c7157612c71612dd0565b02949350505050565b600061ffff83811690831681811015612c9557612c95612dd0565b039392505050565b600082821015612caf57612caf612dd0565b500390565b600060ff821660ff841680821015612cce57612cce612dd0565b90039392505050565b60005b83811015612cf2578181015183820152602001612cda565b8381111561123a5750506000910152565b600281046001821680612d1757607f821691505b60208210811415612d3857634e487b7160e01b600052602260045260246000fd5b50919050565b600061ffff80831681811415612d5657612d56612dd0565b6001019392505050565b6000600019821415612d7457612d74612dd0565b5060010190565b600060ff821660ff811415612d9257612d92612dd0565b60010192915050565b600061ffff80841680612db057612db0612de6565b92169190910692915050565b600082612dcb57612dcb612de6565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461178a57600080fdfea2646970667358221220f1e7c816f693e6bb711943a866ed8314e92d453df842359dfdc72a55d963d70a64736f6c63430008020033
Deployed Bytecode Sourcemap
49951:11408:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59901:244;;;;;;;;;;-1:-1:-1;59901:244:0;;;;;:::i;:::-;;:::i;:::-;;;9470:14:1;;9463:22;9445:41;;9433:2;9418:18;59901:244:0;;;;;;;;60293:98;;;;;;;;;;;;;:::i;:::-;;;18393:25:1;;;18381:2;18366:18;60293:98:0;18348:76:1;28811:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30421:221::-;;;;;;;;;;-1:-1:-1;30421:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8768:32:1;;;8750:51;;8738:2;8723:18;30421:221:0;8705:102:1;29938:417:0;;;;;;;;;;-1:-1:-1;29938:417:0;;;;;:::i;:::-;;:::i;:::-;;60153:132;;;;;;;;;;;;60271:6;;;;;;;;60153:132;31253:373;;;;;;;;;;-1:-1:-1;31253:373:0;;;;;:::i;:::-;;:::i;42612:256::-;;;;;;;;;;-1:-1:-1;42612:256:0;;;;;:::i;:::-;;:::i;60399:99::-;;;;;;;;;;-1:-1:-1;60399:99:0;;;;;:::i;:::-;;:::i;54358:123::-;;;;;;;;;;-1:-1:-1;54358:123:0;;;;;:::i;:::-;;:::i;:::-;;;19209:4:1;19197:17;;;19179:36;;19167:2;19152:18;54358:123:0;19134:87:1;31697:185:0;;;;;;;;;;-1:-1:-1;31697:185:0;;;;;:::i;:::-;;:::i;54738:136::-;;;;;;;;;;-1:-1:-1;54738:136:0;;;;;:::i;:::-;;:::i;60993:363::-;;;;;;;;;;;;;:::i;:::-;;;;18885:10:1;18873:23;;;18855:42;;18928:2;18913:18;;18906:34;;;;18956:18;;;18949:34;19014:2;18999:18;;18992:34;18842:3;18827:19;60993:363:0;18809:223:1;60797:188:0;;;;;;;;;;-1:-1:-1;60797:188:0;;;;;:::i;:::-;;:::i;53878:216::-;;;;;;;;;;-1:-1:-1;53878:216:0;;;;;:::i;:::-;;:::i;:::-;;;18603:10:1;18591:23;;;18573:42;;18561:2;18546:18;53878:216:0;18528:93:1;55314:248:0;;;;;;;;;;-1:-1:-1;55314:248:0;;;;;:::i;:::-;;:::i;28472:272::-;;;;;;;;;;-1:-1:-1;28472:272:0;;;;;:::i;:::-;;:::i;54232:118::-;;;;;;;;;;-1:-1:-1;54232:118:0;;;;;:::i;:::-;;:::i;28116:294::-;;;;;;;;;;-1:-1:-1;28116:294:0;;;;;:::i;:::-;;:::i;6820:103::-;;;;;;;;;;;;;:::i;55086:220::-;;;;;;;;;;-1:-1:-1;55086:220:0;;;;;:::i;:::-;;:::i;54617:113::-;;;;;;;;;;-1:-1:-1;54617:113:0;;;;;:::i;:::-;;:::i;60506:91::-;;;;;;;;;;-1:-1:-1;60579:10:0;;60506:91;;54882:196;;;;;;;;;;-1:-1:-1;54882:196:0;;;;;:::i;:::-;;:::i;6172:87::-;;;;;;;;;;-1:-1:-1;6245:6:0;;-1:-1:-1;;;;;6245:6:0;6172:87;;55570:1443;;;;;;;;;;-1:-1:-1;55570:1443:0;;;;;:::i;:::-;;:::i;53039:831::-;;;;;;;;;;-1:-1:-1;53039:831:0;;;;;:::i;:::-;;:::i;:::-;;;18228:6:1;18216:19;;;18198:38;;18186:2;18171:18;53039:831:0;18153:89:1;28980:104:0;;;;;;;;;;;;;:::i;58378:118::-;;;;;;;;;;-1:-1:-1;58378:118:0;;;;;:::i;:::-;;:::i;30714:187::-;;;;;;;;;;-1:-1:-1;30714:187:0;;;;;:::i;:::-;;:::i;54102:122::-;;;;;;;;;;-1:-1:-1;54102:122:0;;;;;:::i;:::-;;:::i;50593:297::-;;;;;;;;;;-1:-1:-1;50593:297:0;;;;;:::i;:::-;;:::i;50898:149::-;;;;;;;;;;-1:-1:-1;50898:149:0;;;;;:::i;:::-;;:::i;51055:575::-;;;;;;;;;;-1:-1:-1;51055:575:0;;;;;:::i;:::-;;:::i;31953:360::-;;;;;;;;;;-1:-1:-1;31953:360:0;;;;;:::i;:::-;;:::i;60605:78::-;;;;;;;;;;-1:-1:-1;60605:78:0;;;;;:::i;:::-;;:::i;58174:196::-;;;;;;;;;;-1:-1:-1;58174:196:0;;;;;:::i;:::-;;:::i;58504:1389::-;;;;;;:::i;:::-;;:::i;57606:414::-;;;;;;;;;;-1:-1:-1;57606:414:0;;;;;:::i;:::-;;:::i;30972:214::-;;;;;;;;;;-1:-1:-1;30972:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;31143:25:0;;;31114:4;31143:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30972:214;60691:98;;;;;;;;;;-1:-1:-1;60691:98:0;;;;;:::i;:::-;;:::i;7078:238::-;;;;;;;;;;-1:-1:-1;7078:238:0;;;;;:::i;:::-;;:::i;54489:120::-;;;;;;;;;;-1:-1:-1;54489:120:0;;;;;:::i;:::-;;:::i;59901:244::-;60058:4;60100:37;60124:12;60100:23;:37::i;:::-;60080:57;;59901:244;;;;:::o;60293:98::-;60331:7;60358:25;:15;997:14;;905:114;60358:25;60351:32;;60293:98;:::o;28811:100::-;28865:13;28898:5;28891:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28811:100;:::o;30421:221::-;30542:7;30567:23;30582:7;30567:14;:23::i;:::-;-1:-1:-1;30610:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;30610:24:0;;30421:221::o;29938:417::-;30019:13;30035:23;30050:7;30035:14;:23::i;:::-;30019:39;;30083:5;-1:-1:-1;;;;;30077:11:0;:2;-1:-1:-1;;;;;30077:11:0;;;30069:57;;;;-1:-1:-1;;;30069:57:0;;16678:2:1;30069:57:0;;;16660:21:1;16717:2;16697:18;;;16690:30;16756:34;16736:18;;;16729:62;-1:-1:-1;;;16807:18:1;;;16800:31;16848:19;;30069:57:0;;;;;;;;;4782:10;-1:-1:-1;;;;;30161:21:0;;;;:62;;-1:-1:-1;30186:37:0;30203:5;4782:10;30210:12;4702:98;30186:37;30139:174;;;;-1:-1:-1;;;30139:174:0;;14397:2:1;30139:174:0;;;14379:21:1;14436:2;14416:18;;;14409:30;14475:34;14455:18;;;14448:62;14546:32;14526:18;;;14519:60;14596:19;;30139:174:0;14369:252:1;30139:174:0;30326:21;30335:2;30339:7;30326:8;:21::i;:::-;29938:417;;;:::o;31253:373::-;31462:41;4782:10;31495:7;31462:18;:41::i;:::-;31440:137;;;;-1:-1:-1;;;31440:137:0;;;;;;;:::i;:::-;31590:28;31600:4;31606:2;31610:7;31590:9;:28::i;42612:256::-;42709:7;42745:23;42762:5;42745:16;:23::i;:::-;42737:5;:31;42729:87;;;;-1:-1:-1;;;42729:87:0;;10330:2:1;42729:87:0;;;10312:21:1;10369:2;10349:18;;;10342:30;10408:34;10388:18;;;10381:62;-1:-1:-1;;;10459:18:1;;;10452:41;10510:19;;42729:87:0;10302:233:1;42729:87:0;-1:-1:-1;;;;;;42834:19:0;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;42612:256;;;;;:::o;60399:99::-;6058:13;:11;:13::i;:::-;60471:10:::1;:19:::0;60399:99::o;54358:123::-;54415:5;54470:2;54464;54447:14;54464:2;54447:9;:14;:::i;:::-;:19;;;;:::i;:::-;54446:26;;;;:::i;31697:185::-;31835:39;31852:4;31858:2;31862:7;31835:39;;;;;;;;;;;;:16;:39::i;54738:136::-;54798:5;54864:1;54830:26;50337:5;54830:9;:26;:::i;:::-;:30;;54859:1;54830:30;:::i;60993:363::-;61077:6;61098:7;61120;61142;61199:18;:51;61218:31;61233:15;61218:14;:31::i;:::-;61199:51;;;;;;;;;;;;;;;-1:-1:-1;61199:51:0;;;61265:25;:15;997:14;;905:114;61265:25;61305:11;;61177:171;;-1:-1:-1;61177:171:0;-1:-1:-1;61305:11:0;-1:-1:-1;;;61305:11:0;;;;;-1:-1:-1;61331:6:0;;;;;;-1:-1:-1;60993:363:0;;;;:::o;60797:188::-;60872:7;60908:25;:15;997:14;;905:114;60908:25;60900:5;:33;60892:42;;;;;;60952:25;60971:5;60952:18;:25::i;53878:216::-;53932:6;53951:11;53965:25;53974:15;53965:8;:25::i;:::-;53951:39;-1:-1:-1;54001:9:0;54013:19;:13;;;54029:3;54013:19;:::i;:::-;54001:31;;54062:23;54069:15;54062:6;:23::i;:::-;54050:36;;54055:31;;54050:2;:36;:::i;:::-;54043:43;53878:216;-1:-1:-1;;;;53878:216:0:o;55314:248::-;55471:17;55508:46;55520:4;55526:5;55533:3;55538:4;55544:6;55552:1;55508:11;:46::i;:::-;55501:53;55314:248;-1:-1:-1;;;;;;55314:248:0:o;28472:272::-;28589:7;28630:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28630:16:0;28665:19;28657:56;;;;-1:-1:-1;;;28657:56:0;;16325:2:1;28657:56:0;;;16307:21:1;16364:2;16344:18;;;16337:30;-1:-1:-1;;;16383:18:1;;;16376:54;16447:18;;28657:56:0;16297:174:1;54232:118:0;54288:5;54313:25;54328:9;54313:14;:25::i;:::-;:29;;;;54232:118;-1:-1:-1;;54232:118:0:o;28116:294::-;28233:7;-1:-1:-1;;;;;28280:19:0;;28258:110;;;;-1:-1:-1;;;28258:110:0;;13572:2:1;28258:110:0;;;13554:21:1;13611:2;13591:18;;;13584:30;13650:34;13630:18;;;13623:62;-1:-1:-1;;;13701:18:1;;;13694:39;13750:19;;28258:110:0;13544:231:1;28258:110:0;-1:-1:-1;;;;;;28386:16:0;;;;;:9;:16;;;;;;;28116:294::o;6820:103::-;6058:13;:11;:13::i;:::-;6885:30:::1;6912:1;6885:18;:30::i;:::-;6820:103::o:0;55086:220::-;55220:17;55257:41;55269:4;55275:5;55282:3;55287:4;55293:1;55296;55257:11;:41::i;:::-;55250:48;55086:220;-1:-1:-1;;;;;55086:220:0:o;54617:113::-;54676:5;54707:14;54719:2;54707:9;:14;:::i;54882:196::-;54995:17;55032:38;55044:4;55050:5;55057:3;55062:1;55065;55068;55570:1443;55750:17;50580:4;55818:219;55844:4;55840:8;;:1;:8;;;55818:219;;;55874:13;55885:1;55874:10;:13::i;:::-;55870:156;;;55908:33;50439:8;55908:33;;:::i;:::-;;;55870:156;;;55982:28;50384:8;55982:28;;:::i;:::-;;;55870:156;55850:3;;;;:::i;:::-;;;;55818:219;;;56067:31;;:::i;:::-;56129:2;56109:22;;56146:16;56157:4;56146:10;:16::i;:::-;56142:126;;;56199:2;56179:17;;;:22;56142:126;;;56254:2;56234:17;;;:22;56142:126;56298:2;56278:17;;;:22;;;56331:2;56311:17;;;:22;;;56344:17;;;:22;;;56377:17;;;:22;;;56410:17;;;:22;;;56443:17;;;:22;;;56476:17;;;:22;;;56509:17;;;:22;;;56542:18;;;:23;56576:18;;;:23;56621:1;;-1:-1:-1;56612:106:0;56628:5;56624:9;;:1;:9;;;56612:106;;;56685:14;56700:5;56704:1;56700;:5;:::i;:::-;56685:21;;;;;;;-1:-1:-1;;;56685:21:0;;;;;;;;;;;;;56668:38;;;;50337:5;56668:38;:::i;:::-;56655:51;;;;:::i;:::-;;-1:-1:-1;56635:3:0;;;;:::i;:::-;;;;56612:106;;;56777:7;56783:1;56777:3;:7;:::i;:::-;56759:26;;;;50337:5;56759:26;:::i;:::-;56746:39;;;;:::i;:::-;;-1:-1:-1;56828:24:0;;;;50491:4;56828:24;:::i;:::-;56815:37;;;;:::i;:::-;;-1:-1:-1;56897:28:0;;;;50539:2;56897:28;:::i;:::-;56884:41;;;;:::i;:::-;;-1:-1:-1;56957:19:0;;;;56884:41;56957:19;:::i;:::-;;55570:1443;-1:-1:-1;;;;;;;;;55570:1443:0:o;53039:831::-;53096:6;;;;53257:27;50384:8;53257:9;:27;:::i;:::-;53243:41;;50580:4;53243:41;:::i;:::-;53229:56;-1:-1:-1;53335:28:0;50580:4;53335:15;:28::i;:::-;53311:21;53327:4;53311:21;;:15;:21::i;:::-;:52;;;;:::i;:::-;53296:67;-1:-1:-1;53399:35:0;53296:67;50439:8;53399:35;:::i;:::-;53376:58;;;;:::i;:::-;;-1:-1:-1;53534:12:0;53513:18;50580:4;53513;:18;:::i;:::-;:33;;;;;;:::i;:::-;53481:66;;50384:8;53481:66;:::i;:::-;53445:102;;;;:::i;:::-;;;53560:281;53589:9;53567:19;:31;53560:281;;;53619:28;53637:8;53644:1;53637:4;:8;:::i;53619:28::-;53615:191;;;53668:43;50439:8;53668:43;;:::i;:::-;;;53615:191;;;53752:38;50384:8;53752:38;;:::i;:::-;;;53615:191;53820:9;53828:1;53820:9;;:::i;:::-;;;53560:281;;;-1:-1:-1;53858:4:0;53039:831;-1:-1:-1;;;53039:831:0:o;28980:104::-;29036:13;29069:7;29062:14;;;;;:::i;58378:118::-;58442:4;58466:12;58479:3;58466:17;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:22;;-1:-1:-1;58378:118:0;;;:::o;30714:187::-;30841:52;4782:10;30874:8;30884;30841:18;:52::i;:::-;30714:187;;:::o;54102:122::-;54160:5;54185:25;54200:9;54185:14;:25::i;:::-;:31;;;;54102:122;-1:-1:-1;;54102:122:0:o;50593:297::-;50647:4;50668:8;50675:1;50668:4;:8;:::i;:::-;:13;;;50664:58;;-1:-1:-1;50705:5:0;50698:12;;50664:58;50736:10;50743:3;50736:4;:10;:::i;:::-;:15;;;50732:59;;-1:-1:-1;50775:4:0;50768:11;;50732:59;50805:10;50812:3;50805:4;:10;:::i;:::-;:15;;;50801:60;;-1:-1:-1;50844:5:0;50837:12;;50801:60;-1:-1:-1;50878:4:0;50593:297;;;:::o;50898:149::-;50958:7;50978:9;50986:1;50978:9;;:::i;:::-;;-1:-1:-1;51029:10:0;51036:3;50978:9;51029:10;:::i;:::-;51016;51023:3;51016:4;:10;:::i;:::-;51005:8;51012:1;51005:4;:8;:::i;:::-;:21;;;;:::i;:::-;:34;;;;:::i;51055:575::-;51153:5;51194;:10;;51203:1;51194:10;:37;;;;51221:5;:10;;51230:1;51221:10;51194:37;:64;;;;51248:5;:10;;51257:1;51248:10;51194:64;:91;;;;51275:5;:10;;51284:1;51275:10;51194:91;:118;;;;51302:5;:10;;51311:1;51302:10;51194:118;:146;;;;51329:5;:11;;51338:2;51329:11;51194:146;:174;;;;51357:5;:11;;51366:2;51357:11;51194:174;51176:447;;;-1:-1:-1;51402:2:0;51395:9;;51176:447;51426:5;:10;;51435:1;51426:10;:24;;;;51440:5;:10;;51449:1;51440:10;51426:24;:38;;;;51454:5;:10;;51463:1;51454:10;51426:38;:53;;;;51468:5;:11;;51477:2;51468:11;51426:53;51422:201;;;-1:-1:-1;51503:2:0;51496:9;;51422:201;51527:16;51538:4;51527:10;:16::i;:::-;51523:100;;;-1:-1:-1;51567:2:0;51560:9;;51523:100;-1:-1:-1;51609:2:0;51602:9;;31953:360;32141:41;4782:10;32174:7;32141:18;:41::i;:::-;32119:137;;;;-1:-1:-1;;;32119:137:0;;;;;;;:::i;:::-;32267:38;32281:4;32287:2;32291:7;32300:4;32267:13;:38::i;:::-;31953:360;;;;:::o;60605:78::-;6058:13;:11;:13::i;:::-;60663:6:::1;:12:::0;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;60663:12:0;;::::1;::::0;;;::::1;::::0;;60605:78::o;58174:196::-;58301:13;58339:23;58354:7;58339:14;:23::i;58504:1389::-;58615:7;58648:12;58661:11;58648:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:30;;58640:62;;;;-1:-1:-1;;;58640:62:0;;17493:2:1;58640:62:0;;;17475:21:1;17532:2;17512:18;;;17505:30;-1:-1:-1;;;17551:18:1;;;17544:49;17610:18;;58640:62:0;17465:169:1;58640:62:0;58745:6;;;;;;;58717:25;:15;997:14;;905:114;58717:25;:34;58713:123;;;58768:56;;-1:-1:-1;;;58768:56:0;;9923:2:1;58768:56:0;;;9905:21:1;9962:2;9942:18;;;9935:30;10001:34;9981:18;;;9974:62;-1:-1:-1;;;10052:18:1;;;10045:36;10098:19;;58768:56:0;9895:228:1;58768:56:0;58850:10;;58846:85;;58882:37;;-1:-1:-1;;;58882:37:0;;15977:2:1;58882:37:0;;;15959:21:1;16016:2;15996:18;;;15989:30;-1:-1:-1;;;16035:18:1;;;16028:49;16094:18;;58882:37:0;15949:169:1;58882:37:0;59014:11;;-1:-1:-1;;;59014:11:0;;;;58959:18;:51;58978:31;58993:15;58978:14;:31::i;:::-;58959:51;;;;;;;;;;;;;;;-1:-1:-1;58959:51:0;;;:66;58941:263;;59052:140;;-1:-1:-1;;;59052:140:0;;12331:2:1;59052:140:0;;;12313:21:1;12370:2;12350:18;;;12343:30;12409:34;12389:18;;;12382:62;12480:34;12460:18;;;12453:62;-1:-1:-1;;;12531:19:1;;;12524:40;12581:19;;59052:140:0;12303:303:1;59052:140:0;59255:23;59262:15;59255:6;:23::i;:::-;-1:-1:-1;;;;;59227:23:0;;;;;;:12;:23;;;;;;59220:58;;;;;;:31;;59227:23;;59220:6;:31::i;:::-;:58;;;59216:216;;;59295:125;;-1:-1:-1;;;59295:125:0;;15189:2:1;59295:125:0;;;15171:21:1;15228:2;15208:18;;;15201:30;15267:34;15247:18;;;15240:62;15338:28;15318:18;;;15311:56;15384:19;;59295:125:0;15161:248:1;59295:125:0;59444:17;59464:25;:15;997:14;;905:114;59464:25;59444:45;;59500:27;:15;1116:19;;1134:1;1116:19;;;1027:127;59500:27;59566:1;59538:12;59551:11;59538:25;;;;;;:::i;:::-;;;;;;;;;;;;;;:29;;;;;;;-1:-1:-1;;59538:29:0;;;;;;;;;59578:27;59584:9;59595;59578:5;:27::i;:::-;59616:36;59629:9;59640:11;59616:12;:36::i;:::-;59730:18;:51;59749:31;59764:15;59749:14;:31::i;:::-;59730:51;;;;;;;;;;;;;;;-1:-1:-1;59730:51:0;;:68;;:51;;:68;:::i;:::-;59663:18;:51;59682:31;59697:15;59682:14;:31::i;:::-;59663:51;;;;;;;;;;;;;;;;;;-1:-1:-1;59663:51:0;;;:135;;;;;-1:-1:-1;;59663:135:0;;;;;;-1:-1:-1;;;;;59809:23:0;;;;:12;:23;;;;;:49;;59842:15;59809:49;;;;;;;;;;59876:9;-1:-1:-1;58504:1389:0;;;;:::o;57606:414::-;6058:13;:11;:13::i;:::-;57683:15:::1;57701:25;:15;997:14:::0;;905:114;57701:25:::1;57683:43;;57737:27;:15;1116:19:::0;;1134:1;1116:19;;;1027:127;57737:27:::1;57775:22;57785:2;57789:7;57775:9;:22::i;:::-;57808:26;57821:7;57830:3;57808:12;:26::i;:::-;57865:1;57845:12;57858:3;57845:17;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:21;;::::1;::::0;;;::::1;-1:-1:-1::0;;57845:21:0;;::::1;::::0;;;::::1;::::0;;57944:18:::1;57845:17;57963:31;57978:15;57963:14;:31::i;:::-;57944:51;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;57944:51:0;;:68:::1;::::0;:51:::1;::::0;:68:::1;:::i;:::-;57877:18;:51;57896:31;57911:15;57896:14;:31::i;:::-;57877:51;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;57877:51:0;:135;;-1:-1:-1;;57877:135:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;57606:414:0:o;60691:98::-;6058:13;:11;:13::i;:::-;60759:11:::1;:22:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;60759:22:0::1;-1:-1:-1::0;;60759:22:0;;::::1;::::0;;;::::1;::::0;;60691:98::o;7078:238::-;6058:13;:11;:13::i;:::-;-1:-1:-1;;;;;7181:22:0;::::1;7159:110;;;::::0;-1:-1:-1;;;7159:110:0;;11161:2:1;7159:110:0::1;::::0;::::1;11143:21:1::0;11200:2;11180:18;;;11173:30;11239:34;11219:18;;;11212:62;-1:-1:-1;;;11290:18:1;;;11283:36;11336:19;;7159:110:0::1;11133:228:1::0;7159:110:0::1;7280:28;7299:8;7280:18;:28::i;:::-;7078:238:::0;:::o;54489:120::-;54548:5;54598:2;54580:14;54598:2;54580:9;:14;:::i;42304:224::-;42406:4;-1:-1:-1;;;;;;42430:50:0;;-1:-1:-1;;;42430:50:0;;:90;;;42484:36;42508:11;42484:23;:36::i;38743:135::-;33922:4;33946:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33946:16:0;38817:53;;;;-1:-1:-1;;;38817:53:0;;16325:2:1;38817:53:0;;;16307:21:1;16364:2;16344:18;;;16337:30;-1:-1:-1;;;16383:18:1;;;16376:54;16447:18;;38817:53:0;16297:174:1;38022::0;38097:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;38097:29:0;-1:-1:-1;;;;;38097:29:0;;;;;;;;:24;;38151:23;38097:24;38151:14;:23::i;:::-;-1:-1:-1;;;;;38142:46:0;;;;;;;;;;;38022:174;;:::o;34151:331::-;34280:4;34302:13;34318:23;34333:7;34318:14;:23::i;:::-;34302:39;;34371:5;-1:-1:-1;;;;;34360:16:0;:7;-1:-1:-1;;;;;34360:16:0;;:65;;;-1:-1:-1;;;;;;31143:25:0;;;31114:4;31143:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;34393:32;34360:113;;;;34466:7;-1:-1:-1;;;;;34442:31:0;:20;34454:7;34442:11;:20::i;:::-;-1:-1:-1;;;;;34442:31:0;;34352:122;34151:331;-1:-1:-1;;;;34151:331:0:o;37241:662::-;37414:4;-1:-1:-1;;;;;37387:31:0;:23;37402:7;37387:14;:23::i;:::-;-1:-1:-1;;;;;37387:31:0;;37365:118;;;;-1:-1:-1;;;37365:118:0;;11568:2:1;37365:118:0;;;11550:21:1;11607:2;11587:18;;;11580:30;11646:34;11626:18;;;11619:62;-1:-1:-1;;;11697:18:1;;;11690:35;11742:19;;37365:118:0;11540:227:1;37365:118:0;-1:-1:-1;;;;;37502:16:0;;37494:65;;;;-1:-1:-1;;;37494:65:0;;12813:2:1;37494:65:0;;;12795:21:1;12852:2;12832:18;;;12825:30;12891:34;12871:18;;;12864:62;-1:-1:-1;;;12942:18:1;;;12935:34;12986:19;;37494:65:0;12785:226:1;37494:65:0;37676:29;37693:1;37697:7;37676:8;:29::i;:::-;-1:-1:-1;;;;;37718:15:0;;;;;;:9;:15;;;;;:20;;37737:1;;37718:15;:20;;37737:1;;37718:20;:::i;:::-;;;;-1:-1:-1;;;;;;;37749:13:0;;;;;;:9;:13;;;;;:18;;37766:1;;37749:13;:18;;37766:1;;37749:18;:::i;:::-;;;;-1:-1:-1;;37778:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;37778:21:0;-1:-1:-1;;;;;37778:21:0;;;;;;;;;37817:27;;37778:16;;37817:27;;;;;;;37857:38;29938:417;6337:132;6245:6;;-1:-1:-1;;;;;6245:6:0;4782:10;6401:23;6393:68;;;;-1:-1:-1;;;6393:68:0;;15616:2:1;6393:68:0;;;15598:21:1;;;15635:18;;;15628:30;15694:34;15674:18;;;15667:62;15746:18;;6393:68:0;15588:182:1;43134:233:0;43209:7;43245:30;43032:10;:17;42944:113;;43245:30;43237:5;:38;43229:95;;;;-1:-1:-1;;;43229:95:0;;17080:2:1;43229:95:0;;;17062:21:1;17119:2;17099:18;;;17092:30;17158:34;17138:18;;;17131:62;-1:-1:-1;;;17209:18:1;;;17202:42;17261:19;;43229:95:0;17052:234:1;43229:95:0;43342:10;43353:5;43342:17;;;;;;-1:-1:-1;;;43342:17:0;;;;;;;;;;;;;;;;;43335:24;;43134:233;;;:::o;51638:1393::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51879:18:0;51887:9;51879:7;:18::i;:::-;51869:28;;;;51941;50580:4;51941:15;:28::i;:::-;51930:7;;51914:24;;;;:15;:24::i;:::-;:55;;;;:::i;:::-;51908:61;-1:-1:-1;52005:26:0;51908:61;50439:8;52005:26;:::i;:::-;51982:49;;;;:::i;:::-;;;52108:3;50580:4;52084:2;:7;;;:21;;;;:::i;:::-;:27;;;;;;:::i;:::-;52065:47;;50384:8;52065:47;:::i;:::-;52042:70;;;;:::i;:::-;;;52143:22;52185:1;52181:5;;52176:304;52193:2;52188:1;:7;;;52176:304;;52251:26;52266:1;52269:2;:7;;;52251:14;:26::i;:::-;52234:43;;;;50337:5;52234:43;:::i;:::-;52217:60;-1:-1:-1;52335:9:0;52296:36;52313:19;52217:60;52296:36;:::i;:::-;:48;52292:125;;;52365:12;;;:8;;;:12;52396:5;;52292:125;52431:37;52454:14;52431:37;;:::i;:::-;;-1:-1:-1;52197:3:0;;;;:::i;:::-;;;;52176:304;;;52517:1;52513:5;;52508:258;52525:33;52540:2;:8;;;52550:2;:7;;;52525:14;:33::i;:::-;52520:38;;:1;:38;;;52508:258;;52623:9;52584:36;52601:19;50337:5;52584:36;:::i;:::-;:48;52580:123;;;52653:10;;;:6;;;:10;52682:5;;52580:123;52717:37;50337:5;52717:37;;:::i;:::-;;-1:-1:-1;52560:3:0;;;;:::i;:::-;;;;52508:258;;;52805:18;52813:9;52805:7;:18::i;:::-;52795:28;;:7;;;:28;52867:20;52877:9;52867;:20::i;:::-;52855:32;;:9;;;:32;52931:20;52941:9;52931;:20::i;:::-;52919:32;;:9;;;:32;53002:21;53013:9;53002:10;:21::i;:::-;52989:34;;:10;;;:34;-1:-1:-1;52989:2:0;;51638:1393;-1:-1:-1;;;;51638:1393:0:o;7476:191::-;7569:6;;;-1:-1:-1;;;;;7586:17:0;;;-1:-1:-1;;;;;;7586:17:0;;;;;;;7619:40;;7569:6;;;7586:17;7569:6;;7619:40;;7550:16;;7619:40;7476:191;;:::o;38339:315::-;38494:8;-1:-1:-1;;;;;38485:17:0;:5;-1:-1:-1;;;;;38485:17:0;;;38477:55;;;;-1:-1:-1;;;38477:55:0;;13218:2:1;38477:55:0;;;13200:21:1;13257:2;13237:18;;;13230:30;13296:27;13276:18;;;13269:55;13341:18;;38477:55:0;13190:175:1;38477:55:0;-1:-1:-1;;;;;38543:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;38543:46:0;;;;;;;;;;38605:41;;9445::1;;;38605::0;;9418:18:1;38605:41:0;;;;;;;38339:315;;;:::o;33194:350::-;33350:28;33360:4;33366:2;33370:7;33350:9;:28::i;:::-;33411:47;33434:4;33440:2;33444:7;33453:4;33411:22;:47::i;:::-;33389:147;;;;-1:-1:-1;;;33389:147:0;;;;;;;:::i;48379:674::-;48497:13;48528:23;48543:7;48528:14;:23::i;:::-;48564;48590:19;;;:10;:19;;;;;48564:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48620:18;48641:10;57581:9;;;;;;;;;-1:-1:-1;57581:9:0;;57503:95;;48641:10;48620:31;;48733:4;48727:18;48749:1;48727:23;48723:72;;;-1:-1:-1;48774:9:0;-1:-1:-1;48767:16:0;;48723:72;48899:23;;:27;48895:108;;48974:4;48980:9;48957:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48943:48;;;;;;48895:108;49022:23;49037:7;49022:14;:23::i;35816:439::-;-1:-1:-1;;;;;35896:16:0;;35888:61;;;;-1:-1:-1;;;35888:61:0;;14828:2:1;35888:61:0;;;14810:21:1;;;14847:18;;;14840:30;14906:34;14886:18;;;14879:62;14958:18;;35888:61:0;14800:182:1;35888:61:0;33922:4;33946:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33946:16:0;:30;35960:58;;;;-1:-1:-1;;;35960:58:0;;11974:2:1;35960:58:0;;;11956:21:1;12013:2;11993:18;;;11986:30;12052;12032:18;;;12025:58;12100:18;;35960:58:0;11946:178:1;35960:58:0;-1:-1:-1;;;;;36089:13:0;;;;;;:9;:13;;;;;:18;;36106:1;;36089:13;:18;;36106:1;;36089:18;:::i;:::-;;;;-1:-1:-1;;36118:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36118:21:0;-1:-1:-1;;;;;36118:21:0;;;;;;;;36157:33;;36118:16;;;36157:33;;36118:16;;36157:33;36203:44;29938:417;49209:277;33922:4;33946:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33946:16:0;49324:112;;;;-1:-1:-1;;;49324:112:0;;13982:2:1;49324:112:0;;;13964:21:1;14021:2;14001:18;;;13994:30;14060:34;14040:18;;;14033:62;-1:-1:-1;;;14111:18:1;;;14104:44;14165:19;;49324:112:0;13954:236:1;49324:112:0;49447:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;34824:110::-;34900:26;34910:2;34914:7;34900:26;;;;;;;;;;;;:9;:26::i;27697:355::-;27844:4;-1:-1:-1;;;;;;27886:40:0;;-1:-1:-1;;;27886:40:0;;:105;;-1:-1:-1;;;;;;;27943:48:0;;-1:-1:-1;;;27943:48:0;27886:105;:158;;;-1:-1:-1;;;;;;;;;;19679:40:0;;;28008:36;19520:207;39442:1034;39596:4;-1:-1:-1;;;;;39617:13:0;;9200:19;:23;39613:856;;39670:174;;-1:-1:-1;;;39670:174:0;;-1:-1:-1;;;;;39670:36:0;;;;;:174;;4782:10;;39764:4;;39791:7;;39821:4;;39670:174;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39670:174:0;;;;;;;;-1:-1:-1;;39670:174:0;;;;;;;;;;;;:::i;:::-;;;39649:765;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40027:13:0;;40023:376;;40070:108;;-1:-1:-1;;;40070:108:0;;;;;;;:::i;40023:376::-;40349:6;40343:13;40334:6;40330:2;40326:15;40319:38;39649:765;-1:-1:-1;;;;;;39908:51:0;-1:-1:-1;;;39908:51:0;;-1:-1:-1;39901:58:0;;39613:856;-1:-1:-1;40453:4:0;40446:11;;29155:378;29273:13;29304:23;29319:7;29304:14;:23::i;:::-;29340:21;29364:10;57581:9;;;;;;;;;-1:-1:-1;57581:9:0;;57503:95;;29364:10;29340:34;;29429:1;29411:7;29405:21;:25;:120;;;;;;;;;;;;;;;;;29474:7;29483:18;:7;:16;:18::i;:::-;29457:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29405:120;29385:140;29155:378;-1:-1:-1;;;29155:378:0:o;35161:319::-;35290:18;35296:2;35300:7;35290:5;:18::i;:::-;35341:53;35372:1;35376:2;35380:7;35389:4;35341:22;:53::i;:::-;35319:153;;;;-1:-1:-1;;;35319:153:0;;;;;;;:::i;1926:723::-;1982:13;2203:10;2199:53;;-1:-1:-1;2230:10:0;;;;;;;;;;;;-1:-1:-1;;;2230:10:0;;;;;;2199:53;2277:5;2262:12;2318:78;2325:9;;2318:78;;2351:8;;;;:::i;:::-;;-1:-1:-1;2374:10:0;;-1:-1:-1;2382:2:0;2374:10;;:::i;:::-;;;2318:78;;;2406:19;2438:6;2428:17;;;;;;-1:-1:-1;;;2428:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2428:17:0;;2406:39;;2456:154;2463:10;;2456:154;;2490:11;2500:1;2490:11;;:::i;:::-;;-1:-1:-1;2559:10:0;2567:2;2559:5;:10;:::i;:::-;2546:24;;:2;:24;:::i;:::-;2533:39;;2516:6;2523;2516:14;;;;;;-1:-1:-1;;;2516:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;2516:56:0;;;;;;;;-1:-1:-1;2587:11:0;2596:2;2587:11;;:::i;:::-;;;2456:154;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:2;;813:1;810;803:12;828:229;;924:3;917:4;909:6;905:17;901:27;891:2;;946:5;939;932:20;891:2;972:79;1047:3;1038:6;1025:20;1018:4;1010:6;1006:17;972:79;:::i;1062:159::-;1129:20;;1189:6;1178:18;;1168:29;;1158:2;;1211:1;1208;1201:12;1226:156;1292:20;;1352:4;1341:16;;1331:27;;1321:2;;1372:1;1369;1362:12;1387:196;;1499:2;1487:9;1478:7;1474:23;1470:32;1467:2;;;1520:6;1512;1505:22;1467:2;1548:29;1567:9;1548:29;:::i;1588:270::-;;;1717:2;1705:9;1696:7;1692:23;1688:32;1685:2;;;1738:6;1730;1723:22;1685:2;1766:29;1785:9;1766:29;:::i;:::-;1756:39;;1814:38;1848:2;1837:9;1833:18;1814:38;:::i;:::-;1804:48;;1675:183;;;;;:::o;1863:338::-;;;;2009:2;1997:9;1988:7;1984:23;1980:32;1977:2;;;2030:6;2022;2015:22;1977:2;2058:29;2077:9;2058:29;:::i;:::-;2048:39;;2106:38;2140:2;2129:9;2125:18;2106:38;:::i;:::-;2096:48;;2191:2;2180:9;2176:18;2163:32;2153:42;;1967:234;;;;;:::o;2206:696::-;;;;;2378:3;2366:9;2357:7;2353:23;2349:33;2346:2;;;2400:6;2392;2385:22;2346:2;2428:29;2447:9;2428:29;:::i;:::-;2418:39;;2476:38;2510:2;2499:9;2495:18;2476:38;:::i;:::-;2466:48;;2561:2;2550:9;2546:18;2533:32;2523:42;;2616:2;2605:9;2601:18;2588:32;2643:18;2635:6;2632:30;2629:2;;;2680:6;2672;2665:22;2629:2;2708:22;;2761:4;2753:13;;2749:27;-1:-1:-1;2739:2:1;;2795:6;2787;2780:22;2739:2;2823:73;2888:7;2883:2;2870:16;2865:2;2861;2857:11;2823:73;:::i;:::-;2813:83;;;2336:566;;;;;;;:::o;2907:367::-;;;3033:2;3021:9;3012:7;3008:23;3004:32;3001:2;;;3054:6;3046;3039:22;3001:2;3082:29;3101:9;3082:29;:::i;:::-;3072:39;;3161:2;3150:9;3146:18;3133:32;3208:5;3201:13;3194:21;3187:5;3184:32;3174:2;;3235:6;3227;3220:22;3174:2;3263:5;3253:15;;;2991:283;;;;;:::o;3279:416::-;;;3418:2;3406:9;3397:7;3393:23;3389:32;3386:2;;;3439:6;3431;3424:22;3386:2;3467:29;3486:9;3467:29;:::i;:::-;3457:39;;3547:2;3536:9;3532:18;3519:32;3574:18;3566:6;3563:30;3560:2;;;3611:6;3603;3596:22;3560:2;3639:50;3681:7;3672:6;3661:9;3657:22;3639:50;:::i;:::-;3629:60;;;3376:319;;;;;:::o;3700:264::-;;;3829:2;3817:9;3808:7;3804:23;3800:32;3797:2;;;3850:6;3842;3835:22;3797:2;3878:29;3897:9;3878:29;:::i;:::-;3868:39;3954:2;3939:18;;;;3926:32;;-1:-1:-1;;;3787:177:1:o;3969:255::-;;4080:2;4068:9;4059:7;4055:23;4051:32;4048:2;;;4101:6;4093;4086:22;4048:2;4145:9;4132:23;4164:30;4188:5;4164:30;:::i;4229:259::-;;4351:2;4339:9;4330:7;4326:23;4322:32;4319:2;;;4372:6;4364;4357:22;4319:2;4409:9;4403:16;4428:30;4452:5;4428:30;:::i;4493:342::-;;4615:2;4603:9;4594:7;4590:23;4586:32;4583:2;;;4636:6;4628;4621:22;4583:2;4681:9;4668:23;4714:18;4706:6;4703:30;4700:2;;;4751:6;4743;4736:22;4700:2;4779:50;4821:7;4812:6;4801:9;4797:22;4779:50;:::i;4840:194::-;;4951:2;4939:9;4930:7;4926:23;4922:32;4919:2;;;4972:6;4964;4957:22;4919:2;5000:28;5018:9;5000:28;:::i;5039:334::-;;;;5180:2;5168:9;5159:7;5155:23;5151:32;5148:2;;;5201:6;5193;5186:22;5148:2;5229:28;5247:9;5229:28;:::i;:::-;5219:38;;5276:36;5308:2;5297:9;5293:18;5276:36;:::i;:::-;5266:46;;5331:36;5363:2;5352:9;5348:18;5331:36;:::i;:::-;5321:46;;5138:235;;;;;:::o;5378:405::-;;;;;5534:3;5522:9;5513:7;5509:23;5505:33;5502:2;;;5556:6;5548;5541:22;5502:2;5584:28;5602:9;5584:28;:::i;:::-;5574:38;;5631:36;5663:2;5652:9;5648:18;5631:36;:::i;:::-;5621:46;;5686:36;5718:2;5707:9;5703:18;5686:36;:::i;:::-;5676:46;;5741:36;5773:2;5762:9;5758:18;5741:36;:::i;:::-;5731:46;;5492:291;;;;;;;:::o;5788:476::-;;;;;;5959:3;5947:9;5938:7;5934:23;5930:33;5927:2;;;5981:6;5973;5966:22;5927:2;6009:28;6027:9;6009:28;:::i;:::-;5999:38;;6056:36;6088:2;6077:9;6073:18;6056:36;:::i;:::-;6046:46;;6111:36;6143:2;6132:9;6128:18;6111:36;:::i;:::-;6101:46;;6166:36;6198:2;6187:9;6183:18;6166:36;:::i;:::-;6156:46;;6221:37;6253:3;6242:9;6238:19;6221:37;:::i;:::-;6211:47;;5917:347;;;;;;;;:::o;6269:547::-;;;;;;;6455:3;6443:9;6434:7;6430:23;6426:33;6423:2;;;6477:6;6469;6462:22;6423:2;6505:28;6523:9;6505:28;:::i;:::-;6495:38;;6552:36;6584:2;6573:9;6569:18;6552:36;:::i;:::-;6542:46;;6607:36;6639:2;6628:9;6624:18;6607:36;:::i;:::-;6597:46;;6662:36;6694:2;6683:9;6679:18;6662:36;:::i;:::-;6652:46;;6717:37;6749:3;6738:9;6734:19;6717:37;:::i;:::-;6707:47;;6773:37;6805:3;6794:9;6790:19;6773:37;:::i;:::-;6763:47;;6413:403;;;;;;;;:::o;6821:190::-;;6933:2;6921:9;6912:7;6908:23;6904:32;6901:2;;;6954:6;6946;6939:22;6901:2;-1:-1:-1;6982:23:1;;6891:120;-1:-1:-1;6891:120:1:o;7016:296::-;;7127:2;7115:9;7106:7;7102:23;7098:32;7095:2;;;7148:6;7140;7133:22;7095:2;7192:9;7179:23;7242:10;7235:5;7231:22;7224:5;7221:33;7211:2;;7273:6;7265;7258:22;7317:264;;;7443:2;7431:9;7422:7;7418:23;7414:32;7411:2;;;7464:6;7456;7449:22;7411:2;7492:27;7509:9;7492:27;:::i;:::-;7482:37;;7538;7571:2;7560:9;7556:18;7538:37;:::i;7586:257::-;;7665:5;7659:12;7692:6;7687:3;7680:19;7708:63;7764:6;7757:4;7752:3;7748:14;7741:4;7734:5;7730:16;7708:63;:::i;:::-;7825:2;7804:15;-1:-1:-1;;7800:29:1;7791:39;;;;7832:4;7787:50;;7635:208;-1:-1:-1;;7635:208:1:o;7848:276::-;;8017:6;8011:13;8033:53;8079:6;8074:3;8067:4;8059:6;8055:17;8033:53;:::i;:::-;8102:16;;;;;7987:137;-1:-1:-1;;7987:137:1:o;8129:470::-;;8346:6;8340:13;8362:53;8408:6;8403:3;8396:4;8388:6;8384:17;8362:53;:::i;:::-;8478:13;;8437:16;;;;8500:57;8478:13;8437:16;8534:4;8522:17;;8500:57;:::i;:::-;8573:20;;8316:283;-1:-1:-1;;;;8316:283:1:o;8812:488::-;-1:-1:-1;;;;;9081:15:1;;;9063:34;;9133:15;;9128:2;9113:18;;9106:43;9180:2;9165:18;;9158:34;;;9228:3;9223:2;9208:18;;9201:31;;;8812:488;;9249:45;;9274:19;;9266:6;9249:45;:::i;9497:219::-;;9646:2;9635:9;9628:21;9666:44;9706:2;9695:9;9691:18;9683:6;9666:44;:::i;10540:414::-;10742:2;10724:21;;;10781:2;10761:18;;;10754:30;10820:34;10815:2;10800:18;;10793:62;-1:-1:-1;;;10886:2:1;10871:18;;10864:48;10944:3;10929:19;;10714:240::o;17639:410::-;17841:2;17823:21;;;17880:2;17860:18;;;17853:30;17919:34;17914:2;17899:18;;17892:62;-1:-1:-1;;;17985:2:1;17970:18;;17963:44;18039:3;18024:19;;17813:236::o;19226:128::-;;19297:1;19293:6;19290:1;19287:13;19284:2;;;19303:18;;:::i;:::-;-1:-1:-1;19339:9:1;;19274:80::o;19359:228::-;;19426:10;19463:2;19460:1;19456:10;19493:2;19490:1;19486:10;19524:3;19520:2;19516:12;19511:3;19508:21;19505:2;;;19532:18;;:::i;19592:120::-;;19658:1;19648:2;;19663:18;;:::i;:::-;-1:-1:-1;19697:9:1;;19638:74::o;19717:168::-;;19823:1;19819;19815:6;19811:14;19808:1;19805:21;19800:1;19793:9;19786:17;19782:45;19779:2;;;19830:18;;:::i;:::-;-1:-1:-1;19870:9:1;;19769:116::o;19890:262::-;;19961:10;19998:2;19995:1;19991:10;20028:2;20025:1;20021:10;20084:3;20080:2;20076:12;20071:3;20068:21;20061:3;20054:11;20047:19;20043:47;20040:2;;;20093:18;;:::i;:::-;20133:13;;19941:211;-1:-1:-1;;;;19941:211:1:o;20157:217::-;;20225:6;20281:10;;;;20251;;20303:12;;;20300:2;;;20318:18;;:::i;:::-;20355:13;;20205:169;-1:-1:-1;;;20205:169:1:o;20379:125::-;;20447:1;20444;20441:8;20438:2;;;20452:18;;:::i;:::-;-1:-1:-1;20489:9:1;;20428:76::o;20509:195::-;;20584:4;20581:1;20577:12;20616:4;20613:1;20609:12;20641:3;20636;20633:12;20630:2;;;20648:18;;:::i;:::-;20685:13;;;20556:148;-1:-1:-1;;;20556:148:1:o;20709:258::-;20781:1;20791:113;20805:6;20802:1;20799:13;20791:113;;;20881:11;;;20875:18;20862:11;;;20855:39;20827:2;20820:10;20791:113;;;20922:6;20919:1;20916:13;20913:2;;;-1:-1:-1;;20957:1:1;20939:16;;20932:27;20762:205::o;20972:380::-;21057:1;21047:12;;21104:1;21094:12;;;21115:2;;21169:4;21161:6;21157:17;21147:27;;21115:2;21222;21214:6;21211:14;21191:18;21188:38;21185:2;;;21268:10;21263:3;21259:20;21256:1;21249:31;21303:4;21300:1;21293:15;21331:4;21328:1;21321:15;21185:2;;21027:325;;;:::o;21357:197::-;;21423:6;21464:2;21457:5;21453:14;21491:2;21482:7;21479:15;21476:2;;;21497:18;;:::i;:::-;21546:1;21533:15;;21403:151;-1:-1:-1;;;21403:151:1:o;21559:135::-;;-1:-1:-1;;21619:17:1;;21616:2;;;21639:18;;:::i;:::-;-1:-1:-1;21686:1:1;21675:13;;21606:88::o;21699:175::-;;21780:4;21773:5;21769:16;21809:4;21800:7;21797:17;21794:2;;;21817:18;;:::i;:::-;21866:1;21853:15;;21744:130;-1:-1:-1;;21744:130:1:o;21879:179::-;;21936:6;21969:2;21966:1;21962:10;21991:3;21981:2;;21998:18;;:::i;:::-;22036:10;;22032:20;;;;;21916:142;-1:-1:-1;;21916:142:1:o;22063:112::-;;22121:1;22111:2;;22126:18;;:::i;:::-;-1:-1:-1;22160:9:1;;22101:74::o;22180:127::-;22241:10;22236:3;22232:20;22229:1;22222:31;22272:4;22269:1;22262:15;22296:4;22293:1;22286:15;22312:127;22373:10;22368:3;22364:20;22361:1;22354:31;22404:4;22401:1;22394:15;22428:4;22425:1;22418:15;22444:127;22505:10;22500:3;22496:20;22493:1;22486:31;22536:4;22533:1;22526:15;22560:4;22557:1;22550:15;22576:131;-1:-1:-1;;;;;;22650:32:1;;22640:43;;22630:2;;22697:1;22694;22687:12
Swarm Source
ipfs://f1e7c816f693e6bb711943a866ed8314e92d453df842359dfdc72a55d963d70a
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.