ERC-721
NFT
Overview
Max Total Supply
1,650 NSK
Holders
563
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 NSKLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
NEOSTACKEY
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-11-21 */ //SPDX-License-Identifier: MIT pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } pragma solidity ^0.8.7; abstract contract MerkleProof { bytes32 internal _vipMerkleRoot; bytes32 internal _wlMerkleRoot; function _setWlMerkleRoot(bytes32 merkleRoot_) internal virtual { _wlMerkleRoot = merkleRoot_; } function isWhitelisted(address address_, bytes32[] memory proof_) public view returns (bool) { bytes32 _leaf = keccak256(abi.encodePacked(address_)); for (uint256 i = 0; i < proof_.length; i++) { _leaf = _leaf < proof_[i] ? keccak256(abi.encodePacked(_leaf, proof_[i])) : keccak256(abi.encodePacked(proof_[i], _leaf)); } return _leaf == _wlMerkleRoot; } } // OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol) pragma solidity ^0.8.0; /** * @dev Provides a set of functions to operate with Base64 strings. * * _Available since v4.5._ */ library Base64 { /** * @dev Base64 Encoding/Decoding Table */ string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /** * @dev Converts a `bytes` to its Bytes64 `string` representation. */ function encode(bytes memory data) internal pure returns (string memory) { /** * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol */ if (data.length == 0) return ""; // Loads the table into memory string memory table = _TABLE; // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter // and split into 4 numbers of 6 bits. // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up // - `data.length + 2` -> Round up // - `/ 3` -> Number of 3-bytes chunks // - `4 *` -> 4 characters for each chunk string memory result = new string(4 * ((data.length + 2) / 3)); /// @solidity memory-safe-assembly assembly { // Prepare the lookup table (skip the first "length" byte) let tablePtr := add(table, 1) // Prepare result pointer, jump over length let resultPtr := add(result, 32) // Run over the input, 3 bytes at a time for { let dataPtr := data let endPtr := add(data, mload(data)) } lt(dataPtr, endPtr) { } { // Advance 3 bytes dataPtr := add(dataPtr, 3) let input := mload(dataPtr) // To write each character, shift the 3 bytes (18 bits) chunk // 4 times in blocks of 6 bits for each character (18, 12, 6, 0) // and apply logical AND with 0x3F which is the number of // the previous character in the ASCII table prior to the Base64 Table // The result is then added to the table to get the character to write, // and finally write it in the result pointer but with a left shift // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F)))) resultPtr := add(resultPtr, 1) // Advance } // When data `bytes` is not exactly 3 bytes long // it is padded with `=` characters at the end switch mod(mload(data), 3) case 1 { mstore8(sub(resultPtr, 1), 0x3d) mstore8(sub(resultPtr, 2), 0x3d) } case 2 { mstore8(sub(resultPtr, 1), 0x3d) } } return result; } } // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A is IERC721, IERC721Metadata { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); } // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721A { using Address for address; using Strings for uint256; // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @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 override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @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) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); 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 overriden 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 = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner) if(!isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_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 { _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 { _transfer(from, to, tokenId); if (to.isContract()) if(!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev 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); } } pragma solidity ^0.8.13; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } pragma solidity ^0.8.13; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); bool public operatorFilteringEnabled = true; IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0 && operatorFilteringEnabled) { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from == msg.sender) { _; return; } if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) { revert OperatorNotAllowed(msg.sender); } } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0 && operatorFilteringEnabled) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } _; } } pragma solidity ^0.8.13; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {} } pragma solidity ^0.8.7; /* 🐒 🐒🐒 ┏━┓╋┏┳━━━┳━━━┳━━━┳━━━━┳━━━┳━━━┳┓┏━┳━━━┳┓╋╋┏┓ ┃┃┗┓┃┃┏━━┫┏━┓┃┏━┓┃┏┓┏┓┃┏━┓┃┏━┓┃┃┃┏┫┏━━┫┗┓┏┛┃ ┃┏┓┗┛┃┗━━┫┃╋┃┃┗━━╋┛┃┃┗┫┃╋┃┃┃╋┗┫┗┛┛┃┗━━╋┓┗┛┏┛ ┃┃┗┓┃┃┏━━┫┃╋┃┣━━┓┃╋┃┃╋┃┗━┛┃┃╋┏┫┏┓┃┃┏━━┛┗┓┏┛ ┃┃╋┃┃┃┗━━┫┗━┛┃┗━┛┃╋┃┃╋┃┏━┓┃┗━┛┃┃┃┗┫┗━━┓╋┃┃🐒 ┗┛╋┗━┻━━━┻━━━┻━━━┛╋┗┛╋┗┛╋┗┻━━━┻┛┗━┻━━━┛╋┗┛🐒 🐒 🐒 🐒 🐒 🐒 //Neo-Stackey🐒 */ contract NEOSTACKEY is Ownable, ERC721A, ReentrancyGuard, MerkleProof, ERC2981, DefaultOperatorFilterer { //Project Settings uint256 public wlMintPrice = 0.03 ether; uint256 public psMintPrice = 0.05 ether; uint256 public maxMintsPerWL = 1; uint256 public maxMintsPerPS = 2; uint256 public maxSupply = 1650; uint256 public maxReveal;// = 3; uint256 public cntHodl;// = 3; uint256 public cntBlock;// = 604800; address payable internal _withdrawWallet; //URI string internal hiddenURI; string internal _baseTokenURI; string public _baseExtension = ".json"; //flags bool public isWlSaleEnabled; bool public isPublicSaleEnabled; bool public revealed = false; bool internal hodlCntSys = false; bool internal hodlTimSys = false; //mint records. mapping(address => uint256) internal _wlMinted; mapping(address => uint256) internal _psMinted; mapping(uint256 => uint256) internal _updateAt; mapping(uint256 => int256) internal _lockTim; constructor ( address _royaltyReceiver, uint96 _royaltyFraction ) ERC721A ("NEOSTACKEY","NSK") { _setDefaultRoyalty(_royaltyReceiver,_royaltyFraction); } //start from 1.adjust. function _startTokenId() internal view virtual override returns (uint256) { return 1; } //set Default Royalty._feeNumerator 500 = 5% Royalty function setDefaultRoyalty(address _receiver, uint96 _feeNumerator) external virtual onlyOwner { _setDefaultRoyalty(_receiver, _feeNumerator); } //for ERC2981 function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } //for ERC2981 Opensea function contractURI() external view virtual returns (string memory) { return _formatContractURI(); } //make contractURI function _formatContractURI() internal view returns (string memory) { (address receiver, uint256 royaltyFraction) = royaltyInfo(0,_feeDenominator());//tokenid=0 return string( abi.encodePacked( "data:application/json;base64,", Base64.encode( bytes( abi.encodePacked( '{"seller_fee_basis_points":', Strings.toString(royaltyFraction), ', "fee_recipient":"', Strings.toHexString(uint256(uint160(receiver)), 20), '"}' ) ) ) ) ); } //set owner's wallet.withdraw to this wallet.only owner. function setWithdrawWallet(address _owner) external virtual onlyOwner { _withdrawWallet = payable(_owner); } //set maxSupply.only owner. function setMaxSupply(uint256 _maxSupply) external virtual onlyOwner { require(totalSupply() <= _maxSupply, "Lower than _currentIndex."); maxSupply = _maxSupply; } // SET PRICES. function setWlPrice(uint256 newPrice) external virtual onlyOwner { wlMintPrice = newPrice; } function setPsPrice(uint256 newPrice) external virtual onlyOwner { psMintPrice = newPrice; } //set reveal.only owner. function setReveal(bool newRevealStatus) external virtual onlyOwner { revealed = newRevealStatus; } //return _isRevealed() function _isRevealed() internal view virtual returns (bool){ return revealed; } //set hodlCnt.only owner. function sethodlCntSys(bool newhodlCntSysStatus) external virtual onlyOwner { hodlCntSys = newhodlCntSysStatus; } //set hodlTimSys.only owner. function sethodlTimSys(bool newhodlTimSysStatus) external virtual onlyOwner { hodlTimSys = newhodlTimSysStatus; } // GET MINTED COUNT. function wlMinted(address _address) external view virtual returns (uint256){ return _wlMinted[_address]; } function psMinted(address _address) external view virtual returns (uint256){ return _psMinted[_address]; } // SET MAX MINTS. function setWlMaxMints(uint256 _max) external virtual onlyOwner { maxMintsPerWL = _max; } function setPsMaxMints(uint256 _max) external virtual onlyOwner { maxMintsPerPS = _max; } // SET MAX Rev. function setmaxReveal(uint256 _max) external virtual onlyOwner { maxReveal = _max; } // SET Cntable. function setcntBlock(uint256 _cnt) external virtual onlyOwner { cntBlock = _cnt; } // SET SALES ENABLE. function setWhitelistSaleEnable(bool bool_) external virtual onlyOwner { isWlSaleEnabled = bool_; } function setPublicSaleEnable(bool bool_) external virtual onlyOwner { isPublicSaleEnabled = bool_; } // SET MERKLE ROOT. function setWlMerkleRoot(bytes32 merkleRoot_) external virtual onlyOwner { _setWlMerkleRoot(merkleRoot_); } //set HiddenBaseURI.only owner. function setHiddenURI(string memory uri_) external virtual onlyOwner { hiddenURI = uri_; } //return _currentIndex function getCurrentIndex() external view virtual returns (uint256){ return _currentIndex; } //set BaseURI at after reveal. only owner. function setBaseURI(string memory uri_) external virtual onlyOwner { _baseTokenURI = uri_; } function setBaseExtension(string memory _newBaseExtension) external onlyOwner { _baseExtension = _newBaseExtension; } //retuen BaseURI.internal. function _currentBaseURI() internal view returns (string memory){ return _baseTokenURI; } function getTokenTim(uint256 _tokenId) external view virtual returns (uint256) { require(_exists(_tokenId), "URI query for nonexistent token"); return _updateAt[_tokenId]; } function getTokenTimId(uint256 _tokenId) internal view virtual returns (int256) { require(_exists(_tokenId), "URI query for nonexistent token"); int256 revealId = (int256(block.timestamp)-int256(_updateAt[_tokenId])) / int256(cntBlock); if (revealId >= int256(maxReveal)){ revealId = int256(maxReveal); } return revealId; } function getHodlCntId(uint256 _tokenId) internal view virtual returns (int256) { require(_exists(_tokenId), "URI query for nonexistent token"); address ownerAddress_ = ownerOf(_tokenId); uint256 tokenBalance_ = balanceOf(ownerAddress_); int256 revealId = int256(tokenBalance_) / int256(cntHodl); if (revealId >= int256(maxReveal)){ revealId = int256(maxReveal); } return revealId; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), "URI query for nonexistent token"); if(_isRevealed()){ if(_lockTim[_tokenId] > 0){ return string(abi.encodePacked(_currentBaseURI(), Strings.toString(uint256(_lockTim[_tokenId])) ,"/", Strings.toString((_tokenId)), _baseExtension)); } if(hodlCntSys){ int256 revealId = getHodlCntId(_tokenId); return string(abi.encodePacked(_currentBaseURI(), Strings.toString(uint256(revealId)) ,"/", Strings.toString((_tokenId)), _baseExtension)); } if(hodlTimSys){ int256 revealId = getTokenTimId(_tokenId); return string(abi.encodePacked(_currentBaseURI(), Strings.toString(uint256(revealId)) ,"/", Strings.toString((_tokenId)), _baseExtension)); } return string(abi.encodePacked(_currentBaseURI(), Strings.toString(_tokenId), _baseExtension)); } return hiddenURI; } //fixrevId function fixToken(uint256 _tokenId) external virtual { require(_exists(_tokenId), "URI query for nonexistent token"); require(ownerOf(_tokenId) == msg.sender, "isnt owner token"); if(_isRevealed()){ if(hodlCntSys){ int256 revealId = getHodlCntId(_tokenId); _lockTim[_tokenId] = revealId; } if(hodlTimSys){ int256 revealId = getTokenTimId(_tokenId); _lockTim[_tokenId] = revealId; } } } //unfixrevId function unfixToken(uint256 _tokenId) external virtual { require(_exists(_tokenId), "URI query for nonexistent token"); require(ownerOf(_tokenId) == msg.sender, "isnt owner token"); _lockTim[_tokenId] = 0; } //owner mint.transfer to _address.only owner. function ownerMint(uint256 _amount, address _address) external virtual onlyOwner { require((_amount + totalSupply()) <= (maxSupply), "No more NFTs"); _safeMint(_address, _amount); } //WL mint. function whitelistMint(uint256 _amount, bytes32[] memory proof_) external payable virtual nonReentrant { require(isWlSaleEnabled, "whitelistMint is Paused"); require(isWhitelisted(msg.sender, proof_), "You are not whitelisted!"); require(maxMintsPerWL >= _amount, "whitelistMint: Over max mints per wallet"); require(maxMintsPerWL >= _wlMinted[msg.sender] + _amount, "You have no whitelistMint left"); require(msg.value == wlMintPrice * _amount, "ETH value is not correct"); require((_amount + totalSupply()) <= (maxSupply), "No more NFTs"); _wlMinted[msg.sender] += _amount; _safeMint(msg.sender, _amount); } //Public mint. function publicMint(uint256 _amount) external payable virtual nonReentrant { require(isPublicSaleEnabled, "publicMint is Paused"); require(maxMintsPerPS >= _amount, "publicMint: Over max mints per wallet"); require(maxMintsPerPS >= _psMinted[msg.sender] + _amount, "You have no publicMint left"); require(msg.value == psMintPrice * _amount, "ETH value is not correct"); require((_amount + totalSupply()) <= (maxSupply), "No more NFTs"); _psMinted[msg.sender] += _amount; _safeMint(msg.sender, _amount); } //burn function burn(uint256 tokenId) external virtual { _burn(tokenId, true); } //widraw ETH from this contract.only owner. function withdraw() external payable virtual onlyOwner nonReentrant{ // This will payout the owner 100% of the contract balance. // Do not remove this otherwise you will not be able to withdraw the funds. // ============================================================================= bool os; if(_withdrawWallet != address(0)){//if _withdrawWallet has. (os, ) = payable(_withdrawWallet).call{value: address(this).balance}(""); }else{ (os, ) = payable(owner()).call{value: address(this).balance}(""); } require(os); // ============================================================================= } //return wallet owned tokenids. function walletOfOwner(address _address) external view virtual returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_address); uint256[] memory tokenIds = new uint256[](ownerTokenCount); //search from all tonkenid. so spend high gas values.attention. uint256 tokenindex = 0; for (uint256 i = _startTokenId(); i < _currentIndex; i++) { if(_address == this.tryOwnerOf(i)) tokenIds[tokenindex++] = i; } return tokenIds; } //try catch vaersion ownerOf. support burned tokenid. function tryOwnerOf(uint256 tokenId) external view virtual returns (address) { try this.ownerOf(tokenId) returns (address _address) { return(_address); } catch { return (address(0));//return 0x0 if error. } } /** * @notice Set the state of the OpenSea operator filter * @param value Flag indicating if the operator filter should be applied to transfers and approvals */ function setOperatorFilteringEnabled(bool value) external onlyOwner { operatorFilteringEnabled = value; } function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal override { _updateAt[startTokenId] = block.timestamp; uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { _updateAt[updatedIndex++] = block.timestamp; } while (updatedIndex < end); super._beforeTokenTransfers(from, to, startTokenId, quantity); } } //CODE.BY.FRICKLIK
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_royaltyReceiver","type":"address"},{"internalType":"uint96","name":"_royaltyFraction","type":"uint96"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cntBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cntHodl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"fixToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getTokenTim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWlSaleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintsPerPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintsPerWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxReveal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilteringEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"psMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"psMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setHiddenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setOperatorFilteringEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setPsMaxMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPsPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setPublicSaleEnable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newRevealStatus","type":"bool"}],"name":"setReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setWhitelistSaleEnable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setWithdrawWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setWlMaxMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setWlMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setWlPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cnt","type":"uint256"}],"name":"setcntBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newhodlCntSysStatus","type":"bool"}],"name":"sethodlCntSys","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newhodlTimSysStatus","type":"bool"}],"name":"sethodlTimSys","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setmaxReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"uint256","name":"tokenId","type":"uint256"}],"name":"tryOwnerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"unfixToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"wlMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"wlMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
600e805460ff19166001908117909155666a94d74f430000600f5566b1a2bc2ec50000601055601155600260125561067260135560c06040526005608081905264173539b7b760d91b60a09081526200005c91601a9190620003f6565b50601b805464ffffff0000191690553480156200007857600080fd5b5060405162004333380380620043338339810160408190526200009b916200049c565b733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600a8152602001694e454f535441434b455960b01b815250604051806040016040528060038152602001624e534b60e81b8152506200010b620001056200029d60201b60201c565b620002a1565b815162000120906003906020850190620003f6565b50805162000136906004906020840190620003f6565b50600180815560095550506daaeb6d7670e522a718067333cd4e3b1562000286578015620001d457604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b158015620001b557600080fd5b505af1158015620001ca573d6000803e3d6000fd5b5050505062000286565b6001600160a01b03821615620002255760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af2903906044016200019a565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200026c57600080fd5b505af115801562000281573d6000803e3d6000fd5b505050505b506200029590508282620002f1565b50506200052d565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6127106001600160601b0382161115620003655760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084015b60405180910390fd5b6001600160a01b038216620003bd5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016200035c565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600c55565b8280546200040490620004f1565b90600052602060002090601f01602090048101928262000428576000855562000473565b82601f106200044357805160ff191683800117855562000473565b8280016001018555821562000473579182015b828111156200047357825182559160200191906001019062000456565b506200048192915062000485565b5090565b5b8082111562000481576000815560010162000486565b60008060408385031215620004b057600080fd5b82516001600160a01b0381168114620004c857600080fd5b60208401519092506001600160601b0381168114620004e657600080fd5b809150509250929050565b600181811c908216806200050657607f821691505b6020821081036200052757634e487b7160e01b600052602260045260246000fd5b50919050565b613df6806200053d6000396000f3fe6080604052600436106103d95760003560e01c80637254d90c116101fd578063a355fd2911610118578063d5abeb01116100ab578063e985e9c51161007a578063e985e9c514610b4a578063f2fde38b14610b93578063facd92d414610bb3578063fb796e6c14610bd3578063fe8b456e14610bed57600080fd5b8063d5abeb0114610adf578063d78be71c14610af5578063da3ef23f14610b15578063e8a3d48514610b3557600080fd5b8063c3faf724116100e7578063c3faf72414610a6c578063c87b56dd14610a8c578063d2cab05614610aac578063d52c57e014610abf57600080fd5b8063a355fd29146109ec578063b7c0b8e814610a0c578063b88d4fde14610a2c578063bbaac02f14610a4c57600080fd5b80638c5668be11610190578063942958f41161015f578063942958f41461096b57806395d89b41146109a15780639970cc29146109b6578063a22cb465146109cc57600080fd5b80638c5668be146108ed5780638da5cb5b1461090d5780638dd07d0f1461092b5780639373f4321461094b57600080fd5b80637fc69f5a116101cc5780637fc69f5a14610877578063813779ef1461088d578063830b3a64146108ad5780638ac1e161146108cd57600080fd5b80637254d90c146107eb57806374dfc982146108015780637558be9e1461082157806378a923801461084157600080fd5b80633c136054116102f8578063518302271161028b5780636f8b44b01161025a5780636f8b44b014610756578063709411d21461077657806370a0823114610796578063715018a6146107b6578063719eaef8146107cb57600080fd5b806351830227146106d657806355f804b3146106f65780635a23dd99146107165780636352211e1461073657600080fd5b806342454db9116102c757806342454db91461065357806342842e0e1461066957806342966c6814610689578063438b6300146106a957600080fd5b80633c136054146105ea5780633ccfd60b1461060a5780634009920d1461061257806341f434341461063157600080fd5b8063189f3de1116103705780632a3f300c1161033f5780632a3f300c146105625780632a55205a146105825780632c4e9fc6146105c15780632db11544146105d757600080fd5b8063189f3de1146104fd5780631a09cfe21461051757806323b872dd1461052d5780632672c9021461054d57600080fd5b8063095ea7b3116103ac578063095ea7b31461048f5780630a594d41146104af5780630d9005ae146104d357806318160ddd146104e857600080fd5b806301ffc9a7146103de57806304634d8d1461041357806306fdde0314610435578063081812fc14610457575b600080fd5b3480156103ea57600080fd5b506103fe6103f93660046133bc565b610c0d565b60405190151581526020015b60405180910390f35b34801561041f57600080fd5b5061043361042e3660046133ee565b610c1e565b005b34801561044157600080fd5b5061044a610c34565b60405161040a919061348b565b34801561046357600080fd5b5061047761047236600461349e565b610cc6565b6040516001600160a01b03909116815260200161040a565b34801561049b57600080fd5b506104336104aa3660046134b7565b610d0a565b3480156104bb57600080fd5b506104c560155481565b60405190815260200161040a565b3480156104df57600080fd5b506001546104c5565b3480156104f457600080fd5b506104c5610de8565b34801561050957600080fd5b50601b546103fe9060ff1681565b34801561052357600080fd5b506104c560125481565b34801561053957600080fd5b506104336105483660046134e3565b610df6565b34801561055957600080fd5b5061044a610edf565b34801561056e57600080fd5b5061043361057d366004613532565b610f6d565b34801561058e57600080fd5b506105a261059d36600461354f565b610f91565b604080516001600160a01b03909316835260208301919091520161040a565b3480156105cd57600080fd5b506104c5600f5481565b6104336105e536600461349e565b61103d565b3480156105f657600080fd5b50610433610605366004613532565b61123f565b610433611267565b34801561061e57600080fd5b50601b546103fe90610100900460ff1681565b34801561063d57600080fd5b506104776daaeb6d7670e522a718067333cd4e81565b34801561065f57600080fd5b506104c560105481565b34801561067557600080fd5b506104336106843660046134e3565b611372565b34801561069557600080fd5b506104336106a436600461349e565b611450565b3480156106b557600080fd5b506106c96106c4366004613571565b61145e565b60405161040a919061358e565b3480156106e257600080fd5b50601b546103fe9062010000900460ff1681565b34801561070257600080fd5b5061043361071136600461366f565b611581565b34801561072257600080fd5b506103fe610731366004613736565b61159c565b34801561074257600080fd5b5061047761075136600461349e565b6116c0565b34801561076257600080fd5b5061043361077136600461349e565b6116d2565b34801561078257600080fd5b5061043361079136600461349e565b611736565b3480156107a257600080fd5b506104c56107b1366004613571565b6117bf565b3480156107c257600080fd5b5061043361180d565b3480156107d757600080fd5b506104336107e636600461349e565b611821565b3480156107f757600080fd5b506104c560165481565b34801561080d57600080fd5b506104c561081c36600461349e565b61182e565b34801561082d57600080fd5b5061043361083c36600461349e565b611868565b34801561084d57600080fd5b506104c561085c366004613571565b6001600160a01b03166000908152601c602052604090205490565b34801561088357600080fd5b506104c560145481565b34801561089957600080fd5b506104336108a836600461349e565b611875565b3480156108b957600080fd5b506104776108c836600461349e565b611882565b3480156108d957600080fd5b506104336108e836600461349e565b6118e9565b3480156108f957600080fd5b5061043361090836600461349e565b6118fa565b34801561091957600080fd5b506000546001600160a01b0316610477565b34801561093757600080fd5b5061043361094636600461349e565b6119e2565b34801561095757600080fd5b50610433610966366004613571565b6119ef565b34801561097757600080fd5b506104c5610986366004613571565b6001600160a01b03166000908152601d602052604090205490565b3480156109ad57600080fd5b5061044a611a19565b3480156109c257600080fd5b506104c560115481565b3480156109d857600080fd5b506104336109e7366004613785565b611a28565b3480156109f857600080fd5b50610433610a07366004613532565b611afc565b348015610a1857600080fd5b50610433610a27366004613532565b611b1e565b348015610a3857600080fd5b50610433610a473660046137b3565b611b39565b348015610a5857600080fd5b50610433610a6736600461366f565b611c25565b348015610a7857600080fd5b50610433610a87366004613532565b611c40565b348015610a9857600080fd5b5061044a610aa736600461349e565b611c5b565b610433610aba366004613832565b611e36565b348015610acb57600080fd5b50610433610ada366004613862565b612096565b348015610aeb57600080fd5b506104c560135481565b348015610b0157600080fd5b50610433610b1036600461349e565b6120db565b348015610b2157600080fd5b50610433610b3036600461366f565b6120e8565b348015610b4157600080fd5b5061044a612103565b348015610b5657600080fd5b506103fe610b65366004613887565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b348015610b9f57600080fd5b50610433610bae366004613571565b612112565b348015610bbf57600080fd5b50610433610bce366004613532565b612188565b348015610bdf57600080fd5b50600e546103fe9060ff1681565b348015610bf957600080fd5b50610433610c0836600461349e565b6121ae565b6000610c18826121bb565b92915050565b610c266121e0565b610c30828261223a565b5050565b606060038054610c43906138b5565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6f906138b5565b8015610cbc5780601f10610c9157610100808354040283529160200191610cbc565b820191906000526020600020905b815481529060010190602001808311610c9f57829003601f168201915b5050505050905090565b6000610cd182612337565b610cee576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b816daaeb6d7670e522a718067333cd4e3b15801590610d2b5750600e5460ff165b15610dd957604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610d88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dac91906138ef565b610dd957604051633b79c77360e21b81526001600160a01b03821660048201526024015b60405180910390fd5b610de38383612370565b505050565b600254600154036000190190565b826daaeb6d7670e522a718067333cd4e3b15801590610e175750600e5460ff165b15610ece57336001600160a01b03821603610e3c57610e378484846123f1565b610ed9565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610e8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eaf91906138ef565b610ece57604051633b79c77360e21b8152336004820152602401610dd0565b610ed98484846123f1565b50505050565b601a8054610eec906138b5565b80601f0160208091040260200160405190810160405280929190818152602001828054610f18906138b5565b8015610f655780601f10610f3a57610100808354040283529160200191610f65565b820191906000526020600020905b815481529060010190602001808311610f4857829003601f168201915b505050505081565b610f756121e0565b601b8054911515620100000262ff000019909216919091179055565b6000828152600d602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291611006575060408051808201909152600c546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090611025906001600160601b031687613922565b61102f9190613957565b915196919550909350505050565b60026009540361105f5760405162461bcd60e51b8152600401610dd09061396b565b6002600955601b54610100900460ff166110b25760405162461bcd60e51b81526020600482015260146024820152731c1d589b1a58d35a5b9d081a5cc814185d5cd95960621b6044820152606401610dd0565b8060125410156111125760405162461bcd60e51b815260206004820152602560248201527f7075626c69634d696e743a204f766572206d6178206d696e7473207065722077604482015264185b1b195d60da1b6064820152608401610dd0565b336000908152601d602052604090205461112d9082906139a2565b601254101561117e5760405162461bcd60e51b815260206004820152601b60248201527f596f752068617665206e6f207075626c69634d696e74206c65667400000000006044820152606401610dd0565b8060105461118c9190613922565b34146111d55760405162461bcd60e51b8152602060048201526018602482015277115512081d985b1d59481a5cc81b9bdd0818dbdc9c9958dd60421b6044820152606401610dd0565b6013546111e0610de8565b6111ea90836139a2565b11156112085760405162461bcd60e51b8152600401610dd0906139ba565b336000908152601d6020526040812080548392906112279084906139a2565b90915550611237905033826123fc565b506001600955565b6112476121e0565b601b80549115156401000000000264ff0000000019909216919091179055565b61126f6121e0565b6002600954036112915760405162461bcd60e51b8152600401610dd09061396b565b60026009556017546000906001600160a01b031615611307576017546040516001600160a01b03909116904790600081818185875af1925050503d80600081146112f7576040519150601f19603f3d011682016040523d82523d6000602084013e6112fc565b606091505b505080915050611368565b6000546001600160a01b03166001600160a01b03164760405160006040518083038185875af1925050503d806000811461135d576040519150601f19603f3d011682016040523d82523d6000602084013e611362565b606091505b50909150505b8061123757600080fd5b826daaeb6d7670e522a718067333cd4e3b158015906113935750600e5460ff165b1561144557336001600160a01b038216036113b357610e37848484612416565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611402573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142691906138ef565b61144557604051633b79c77360e21b8152336004820152602401610dd0565b610ed9848484612416565b61145b816001612431565b50565b6060600061146b836117bf565b90506000816001600160401b03811115611487576114876135d2565b6040519080825280602002602001820160405280156114b0578160200160208202803683370190505b509050600060015b600154811015611577576040516320c2ce9960e21b815260048101829052309063830b3a6490602401602060405180830381865afa1580156114fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152291906139e0565b6001600160a01b0316866001600160a01b03160361156557808383611546816139fd565b94508151811061155857611558613a16565b6020026020010181815250505b8061156f816139fd565b9150506114b8565b5090949350505050565b6115896121e0565b8051610c3090601990602084019061330d565b6040516bffffffffffffffffffffffff19606084901b166020820152600090819060340160405160208183030381529060405280519060200120905060005b83518110156116b4578381815181106115f6576115f6613a16565b602002602001015182106116545783818151811061161657611616613a16565b602002602001015182604051602001611639929190918252602082015260400190565b604051602081830303815290604052805190602001206116a0565b8184828151811061166757611667613a16565b6020026020010151604051602001611689929190918252602082015260400190565b604051602081830303815290604052805190602001205b9150806116ac816139fd565b9150506115db565b50600b54149392505050565b60006116cb826125f3565b5192915050565b6116da6121e0565b806116e3610de8565b11156117315760405162461bcd60e51b815260206004820152601960248201527f4c6f776572207468616e205f63757272656e74496e6465782e000000000000006044820152606401610dd0565b601355565b61173f81612337565b61175b5760405162461bcd60e51b8152600401610dd090613a2c565b33611765826116c0565b6001600160a01b0316146117ae5760405162461bcd60e51b815260206004820152601060248201526f34b9b73a1037bbb732b9103a37b5b2b760811b6044820152606401610dd0565b6000908152601f6020526040812055565b60006001600160a01b0382166117e8576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b6118156121e0565b61181f6000612715565b565b6118296121e0565b601155565b600061183982612337565b6118555760405162461bcd60e51b8152600401610dd090613a2c565b506000908152601e602052604090205490565b6118706121e0565b601455565b61187d6121e0565b601255565b6040516331a9108f60e11b8152600481018290526000903090636352211e90602401602060405180830381865afa9250505080156118dd575060408051601f3d908101601f191682019092526118da918101906139e0565b60015b610c1857506000919050565b6118f16121e0565b61145b81600b55565b61190381612337565b61191f5760405162461bcd60e51b8152600401610dd090613a2c565b33611929826116c0565b6001600160a01b0316146119725760405162461bcd60e51b815260206004820152601060248201526f34b9b73a1037bbb732b9103a37b5b2b760811b6044820152606401610dd0565b601b5462010000900460ff161561145b57601b546301000000900460ff16156119b15760006119a082612765565b6000838152601f6020526040902055505b601b54640100000000900460ff161561145b5760006119cf826127ce565b6000838152601f60205260409020555050565b6119ea6121e0565b600f55565b6119f76121e0565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b606060048054610c43906138b5565b816daaeb6d7670e522a718067333cd4e3b15801590611a495750600e5460ff165b15611af257604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611aa6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aca91906138ef565b611af257604051633b79c77360e21b81526001600160a01b0382166004820152602401610dd0565b610de38383612833565b611b046121e0565b601b80549115156101000261ff0019909216919091179055565b611b266121e0565b600e805460ff1916911515919091179055565b836daaeb6d7670e522a718067333cd4e3b15801590611b5a5750600e5460ff165b15611c1257336001600160a01b03821603611b8057611b7b858585856128c8565b611c1e565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611bcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf391906138ef565b611c1257604051633b79c77360e21b8152336004820152602401610dd0565b611c1e858585856128c8565b5050505050565b611c2d6121e0565b8051610c3090601890602084019061330d565b611c486121e0565b601b805460ff1916911515919091179055565b6060611c6682612337565b611c825760405162461bcd60e51b8152600401610dd090613a2c565b601b5462010000900460ff1615611da4576000828152601f60205260408120541315611cfc57611cb061290c565b6000838152601f6020526040902054611cc89061291b565b611cd18461291b565b601a604051602001611ce69493929190613afc565b6040516020818303038152906040529050919050565b601b546301000000900460ff1615611d61576000611d1983612765565b9050611d2361290c565b611d2c8261291b565b611d358561291b565b601a604051602001611d4a9493929190613afc565b604051602081830303815290604052915050919050565b601b54640100000000900460ff1615611d7f576000611d19836127ce565b611d8761290c565b611d908361291b565b601a604051602001611ce693929190613b5a565b60188054611db1906138b5565b80601f0160208091040260200160405190810160405280929190818152602001828054611ddd906138b5565b8015611e2a5780601f10611dff57610100808354040283529160200191611e2a565b820191906000526020600020905b815481529060010190602001808311611e0d57829003601f168201915b50505050509050919050565b600260095403611e585760405162461bcd60e51b8152600401610dd09061396b565b6002600955601b5460ff16611eaf5760405162461bcd60e51b815260206004820152601760248201527f77686974656c6973744d696e74206973205061757365640000000000000000006044820152606401610dd0565b611eb9338261159c565b611f055760405162461bcd60e51b815260206004820152601860248201527f596f7520617265206e6f742077686974656c69737465642100000000000000006044820152606401610dd0565b816011541015611f685760405162461bcd60e51b815260206004820152602860248201527f77686974656c6973744d696e743a204f766572206d6178206d696e74732070656044820152671c881dd85b1b195d60c21b6064820152608401610dd0565b336000908152601c6020526040902054611f839083906139a2565b6011541015611fd45760405162461bcd60e51b815260206004820152601e60248201527f596f752068617665206e6f2077686974656c6973744d696e74206c65667400006044820152606401610dd0565b81600f54611fe29190613922565b341461202b5760405162461bcd60e51b8152602060048201526018602482015277115512081d985b1d59481a5cc81b9bdd0818dbdc9c9958dd60421b6044820152606401610dd0565b601354612036610de8565b61204090846139a2565b111561205e5760405162461bcd60e51b8152600401610dd0906139ba565b336000908152601c60205260408120805484929061207d9084906139a2565b9091555061208d905033836123fc565b50506001600955565b61209e6121e0565b6013546120a9610de8565b6120b390846139a2565b11156120d15760405162461bcd60e51b8152600401610dd0906139ba565b610c3081836123fc565b6120e36121e0565b601055565b6120f06121e0565b8051610c3090601a90602084019061330d565b606061210d612a1b565b905090565b61211a6121e0565b6001600160a01b03811661217f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610dd0565b61145b81612715565b6121906121e0565b601b805491151563010000000263ff00000019909216919091179055565b6121b66121e0565b601655565b60006001600160e01b0319821663152a902d60e11b1480610c185750610c1882612a9b565b6000546001600160a01b0316331461181f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dd0565b6127106001600160601b03821611156122a85760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610dd0565b6001600160a01b0382166122fe5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610dd0565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600c55565b60008160011115801561234b575060015482105b8015610c18575050600090815260056020526040902054600160e01b900460ff161590565b600061237b826116c0565b9050806001600160a01b0316836001600160a01b0316036123af5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216146123e6576123c98133610b65565b6123e6576040516367d9dca160e11b815260040160405180910390fd5b610de3838383612aeb565b610de3838383612b47565b610c30828260405180602001604052806000815250612d2d565b610de383838360405180602001604052806000815250611b39565b600061243c836125f3565b805190915082156124a2576000336001600160a01b038316148061246557506124658233610b65565b8061248057503361247586610cc6565b6001600160a01b0316145b9050806124a057604051632ce44b5f60e11b815260040160405180910390fd5b505b6124b0816000866001612edc565b6124bc60008583612aeb565b6001600160a01b0380821660008181526006602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526005909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b1785559189018084529220805491949091166125ba5760015482146125ba57805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b03841690600080516020613da1833981519152908390a450506002805460010190555050565b604080516060810182526000808252602082018190529181019190915281806001116126fc576001548110156126fc57600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906126fa5780516001600160a01b031615612691579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156126f5579392505050565b612691565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600061277082612337565b61278c5760405162461bcd60e51b8152600401610dd090613a2c565b6000612797836116c0565b905060006127a4826117bf565b90506000601554826127b69190613b8c565b905060145481126127c657506014545b949350505050565b60006127d982612337565b6127f55760405162461bcd60e51b8152600401610dd090613a2c565b6016546000838152601e60205260408120549091906128149042613bba565b61281e9190613b8c565b90506014548112610c18575060145492915050565b336001600160a01b0383160361285c5760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6128d3848484612b47565b6001600160a01b0383163b15610ed9576128ef84848484612f2e565b610ed9576040516368d2bf6b60e11b815260040160405180910390fd5b606060198054610c43906138b5565b6060816000036129425750506040805180820190915260018152600360fc1b602082015290565b8160005b811561296c5780612956816139fd565b91506129659050600a83613957565b9150612946565b6000816001600160401b03811115612986576129866135d2565b6040519080825280601f01601f1916602001820160405280156129b0576020820181803683370190505b5090505b84156127c6576129c5600183613bf9565b91506129d2600a86613c10565b6129dd9060306139a2565b60f81b8183815181106129f2576129f2613a16565b60200101906001600160f81b031916908160001a905350612a14600a86613957565b94506129b4565b6060600080612a2c81612710610f91565b91509150612a75612a3c8261291b565b612a50846001600160a01b03166014613019565b604051602001612a61929190613c24565b6040516020818303038152906040526131bb565b604051602001612a859190613caa565b6040516020818303038152906040529250505090565b60006001600160e01b031982166380ac58cd60e01b1480612acc57506001600160e01b03198216635b5e139f60e01b145b80610c1857506301ffc9a760e01b6001600160e01b0319831614610c18565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000612b52826125f3565b9050836001600160a01b031681600001516001600160a01b031614612b895760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480612ba75750612ba78533610b65565b80612bc2575033612bb784610cc6565b6001600160a01b0316145b905080612be257604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416612c0957604051633a954ecd60e21b815260040160405180910390fd5b612c168585856001612edc565b612c2260008487612aeb565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116612cf6576001548214612cf657805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b0316600080516020613da183398151915260405160405180910390a4611c1e565b6001546001600160a01b038416612d5657604051622e076360e81b815260040160405180910390fd5b82600003612d775760405163b562e8dd60e01b815260040160405180910390fd5b612d846000858386612edc565b6001600160a01b038416600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600590925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15612e9a575b60405182906001600160a01b03881690600090600080516020613da1833981519152908290a4612e636000878480600101955087612f2e565b612e80576040516368d2bf6b60e11b815260040160405180910390fd5b808210612e2a578260015414612e9557600080fd5b612ecd565b5b6040516001830192906001600160a01b03881690600090600080516020613da1833981519152908290a4808210612e9b575b50600155610ed9600085838684565b6000828152601e602052604081204290558290612ef983836139a2565b90505b42601e600084612f0b816139fd565b9550815260200190815260200160002081905550808210612efc57505050505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612f63903390899088908890600401613cef565b6020604051808303816000875af1925050508015612f9e575060408051601f3d908101601f19168201909252612f9b91810190613d2c565b60015b612ffc573d808015612fcc576040519150601f19603f3d011682016040523d82523d6000602084013e612fd1565b606091505b508051600003612ff4576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b60606000613028836002613922565b6130339060026139a2565b6001600160401b0381111561304a5761304a6135d2565b6040519080825280601f01601f191660200182016040528015613074576020820181803683370190505b509050600360fc1b8160008151811061308f5761308f613a16565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106130be576130be613a16565b60200101906001600160f81b031916908160001a90535060006130e2846002613922565b6130ed9060016139a2565b90505b6001811115613165576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061312157613121613a16565b1a60f81b82828151811061313757613137613a16565b60200101906001600160f81b031916908160001a90535060049490941c9361315e81613d49565b90506130f0565b5083156131b45760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610dd0565b9392505050565b606081516000036131da57505060408051602081019091526000815290565b6000604051806060016040528060408152602001613d61604091399050600060038451600261320991906139a2565b6132139190613957565b61321e906004613922565b6001600160401b03811115613235576132356135d2565b6040519080825280601f01601f19166020018201604052801561325f576020820181803683370190505b509050600182016020820185865187015b808210156132cb576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250613270565b50506003865106600181146132e757600281146132fa57613302565b603d6001830353603d6002830353613302565b603d60018303535b509195945050505050565b828054613319906138b5565b90600052602060002090601f01602090048101928261333b5760008555613381565b82601f1061335457805160ff1916838001178555613381565b82800160010185558215613381579182015b82811115613381578251825591602001919060010190613366565b5061338d929150613391565b5090565b5b8082111561338d5760008155600101613392565b6001600160e01b03198116811461145b57600080fd5b6000602082840312156133ce57600080fd5b81356131b4816133a6565b6001600160a01b038116811461145b57600080fd5b6000806040838503121561340157600080fd5b823561340c816133d9565b915060208301356001600160601b038116811461342857600080fd5b809150509250929050565b60005b8381101561344e578181015183820152602001613436565b83811115610ed95750506000910152565b60008151808452613477816020860160208601613433565b601f01601f19169290920160200192915050565b6020815260006131b4602083018461345f565b6000602082840312156134b057600080fd5b5035919050565b600080604083850312156134ca57600080fd5b82356134d5816133d9565b946020939093013593505050565b6000806000606084860312156134f857600080fd5b8335613503816133d9565b92506020840135613513816133d9565b929592945050506040919091013590565b801515811461145b57600080fd5b60006020828403121561354457600080fd5b81356131b481613524565b6000806040838503121561356257600080fd5b50508035926020909101359150565b60006020828403121561358357600080fd5b81356131b4816133d9565b6020808252825182820181905260009190848201906040850190845b818110156135c6578351835292840192918401916001016135aa565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613610576136106135d2565b604052919050565b60006001600160401b03831115613631576136316135d2565b613644601f8401601f19166020016135e8565b905082815283838301111561365857600080fd5b828260208301376000602084830101529392505050565b60006020828403121561368157600080fd5b81356001600160401b0381111561369757600080fd5b8201601f810184136136a857600080fd5b6127c684823560208401613618565b600082601f8301126136c857600080fd5b813560206001600160401b038211156136e3576136e36135d2565b8160051b6136f28282016135e8565b928352848101820192828101908785111561370c57600080fd5b83870192505b8483101561372b57823582529183019190830190613712565b979650505050505050565b6000806040838503121561374957600080fd5b8235613754816133d9565b915060208301356001600160401b0381111561376f57600080fd5b61377b858286016136b7565b9150509250929050565b6000806040838503121561379857600080fd5b82356137a3816133d9565b9150602083013561342881613524565b600080600080608085870312156137c957600080fd5b84356137d4816133d9565b935060208501356137e4816133d9565b92506040850135915060608501356001600160401b0381111561380657600080fd5b8501601f8101871361381757600080fd5b61382687823560208401613618565b91505092959194509250565b6000806040838503121561384557600080fd5b8235915060208301356001600160401b0381111561376f57600080fd5b6000806040838503121561387557600080fd5b823591506020830135613428816133d9565b6000806040838503121561389a57600080fd5b82356138a5816133d9565b91506020830135613428816133d9565b600181811c908216806138c957607f821691505b6020821081036138e957634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561390157600080fd5b81516131b481613524565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561393c5761393c61390c565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261396657613966613941565b500490565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600082198211156139b5576139b561390c565b500190565b6020808252600c908201526b4e6f206d6f7265204e46547360a01b604082015260600190565b6000602082840312156139f257600080fd5b81516131b4816133d9565b600060018201613a0f57613a0f61390c565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6020808252601f908201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00604082015260600190565b8054600090600181811c9080831680613a7d57607f831692505b60208084108203613a9e57634e487b7160e01b600052602260045260246000fd5b818015613ab25760018114613ac357613af0565b60ff19861689528489019650613af0565b60008881526020902060005b86811015613ae85781548b820152908501908301613acf565b505084890196505b50505050505092915050565b60008551613b0e818460208a01613433565b855190830190613b22818360208a01613433565b602f60f81b91019081528451613b3f816001840160208901613433565b613b4e60018284010186613a63565b98975050505050505050565b60008451613b6c818460208901613433565b845190830190613b80818360208901613433565b61372b81830186613a63565b600082613b9b57613b9b613941565b600160ff1b821460001984141615613bb557613bb561390c565b500590565b60008083128015600160ff1b850184121615613bd857613bd861390c565b6001600160ff1b0384018313811615613bf357613bf361390c565b50500390565b600082821015613c0b57613c0b61390c565b500390565b600082613c1f57613c1f613941565b500690565b7f7b2273656c6c65725f6665655f62617369735f706f696e7473223a0000000000815260008351613c5c81601b850160208801613433565b721610113332b2afb932b1b4b834b2b73a111d1160691b601b918401918201528351613c8f81602e840160208801613433565b61227d60f01b602e9290910191820152603001949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613ce281601d850160208701613433565b91909101601d0192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613d229083018461345f565b9695505050505050565b600060208284031215613d3e57600080fd5b81516131b4816133a6565b600081613d5857613d5861390c565b50600019019056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122061e84593d10c60fdd68fd2e828407692c705e10e85c3f74e48a6c4a1b0bd92d364736f6c634300080d0033000000000000000000000000b4250f715995683c6ea5bc7c5e2cdf9b1601ba3f00000000000000000000000000000000000000000000000000000000000003e8
Deployed Bytecode
0x6080604052600436106103d95760003560e01c80637254d90c116101fd578063a355fd2911610118578063d5abeb01116100ab578063e985e9c51161007a578063e985e9c514610b4a578063f2fde38b14610b93578063facd92d414610bb3578063fb796e6c14610bd3578063fe8b456e14610bed57600080fd5b8063d5abeb0114610adf578063d78be71c14610af5578063da3ef23f14610b15578063e8a3d48514610b3557600080fd5b8063c3faf724116100e7578063c3faf72414610a6c578063c87b56dd14610a8c578063d2cab05614610aac578063d52c57e014610abf57600080fd5b8063a355fd29146109ec578063b7c0b8e814610a0c578063b88d4fde14610a2c578063bbaac02f14610a4c57600080fd5b80638c5668be11610190578063942958f41161015f578063942958f41461096b57806395d89b41146109a15780639970cc29146109b6578063a22cb465146109cc57600080fd5b80638c5668be146108ed5780638da5cb5b1461090d5780638dd07d0f1461092b5780639373f4321461094b57600080fd5b80637fc69f5a116101cc5780637fc69f5a14610877578063813779ef1461088d578063830b3a64146108ad5780638ac1e161146108cd57600080fd5b80637254d90c146107eb57806374dfc982146108015780637558be9e1461082157806378a923801461084157600080fd5b80633c136054116102f8578063518302271161028b5780636f8b44b01161025a5780636f8b44b014610756578063709411d21461077657806370a0823114610796578063715018a6146107b6578063719eaef8146107cb57600080fd5b806351830227146106d657806355f804b3146106f65780635a23dd99146107165780636352211e1461073657600080fd5b806342454db9116102c757806342454db91461065357806342842e0e1461066957806342966c6814610689578063438b6300146106a957600080fd5b80633c136054146105ea5780633ccfd60b1461060a5780634009920d1461061257806341f434341461063157600080fd5b8063189f3de1116103705780632a3f300c1161033f5780632a3f300c146105625780632a55205a146105825780632c4e9fc6146105c15780632db11544146105d757600080fd5b8063189f3de1146104fd5780631a09cfe21461051757806323b872dd1461052d5780632672c9021461054d57600080fd5b8063095ea7b3116103ac578063095ea7b31461048f5780630a594d41146104af5780630d9005ae146104d357806318160ddd146104e857600080fd5b806301ffc9a7146103de57806304634d8d1461041357806306fdde0314610435578063081812fc14610457575b600080fd5b3480156103ea57600080fd5b506103fe6103f93660046133bc565b610c0d565b60405190151581526020015b60405180910390f35b34801561041f57600080fd5b5061043361042e3660046133ee565b610c1e565b005b34801561044157600080fd5b5061044a610c34565b60405161040a919061348b565b34801561046357600080fd5b5061047761047236600461349e565b610cc6565b6040516001600160a01b03909116815260200161040a565b34801561049b57600080fd5b506104336104aa3660046134b7565b610d0a565b3480156104bb57600080fd5b506104c560155481565b60405190815260200161040a565b3480156104df57600080fd5b506001546104c5565b3480156104f457600080fd5b506104c5610de8565b34801561050957600080fd5b50601b546103fe9060ff1681565b34801561052357600080fd5b506104c560125481565b34801561053957600080fd5b506104336105483660046134e3565b610df6565b34801561055957600080fd5b5061044a610edf565b34801561056e57600080fd5b5061043361057d366004613532565b610f6d565b34801561058e57600080fd5b506105a261059d36600461354f565b610f91565b604080516001600160a01b03909316835260208301919091520161040a565b3480156105cd57600080fd5b506104c5600f5481565b6104336105e536600461349e565b61103d565b3480156105f657600080fd5b50610433610605366004613532565b61123f565b610433611267565b34801561061e57600080fd5b50601b546103fe90610100900460ff1681565b34801561063d57600080fd5b506104776daaeb6d7670e522a718067333cd4e81565b34801561065f57600080fd5b506104c560105481565b34801561067557600080fd5b506104336106843660046134e3565b611372565b34801561069557600080fd5b506104336106a436600461349e565b611450565b3480156106b557600080fd5b506106c96106c4366004613571565b61145e565b60405161040a919061358e565b3480156106e257600080fd5b50601b546103fe9062010000900460ff1681565b34801561070257600080fd5b5061043361071136600461366f565b611581565b34801561072257600080fd5b506103fe610731366004613736565b61159c565b34801561074257600080fd5b5061047761075136600461349e565b6116c0565b34801561076257600080fd5b5061043361077136600461349e565b6116d2565b34801561078257600080fd5b5061043361079136600461349e565b611736565b3480156107a257600080fd5b506104c56107b1366004613571565b6117bf565b3480156107c257600080fd5b5061043361180d565b3480156107d757600080fd5b506104336107e636600461349e565b611821565b3480156107f757600080fd5b506104c560165481565b34801561080d57600080fd5b506104c561081c36600461349e565b61182e565b34801561082d57600080fd5b5061043361083c36600461349e565b611868565b34801561084d57600080fd5b506104c561085c366004613571565b6001600160a01b03166000908152601c602052604090205490565b34801561088357600080fd5b506104c560145481565b34801561089957600080fd5b506104336108a836600461349e565b611875565b3480156108b957600080fd5b506104776108c836600461349e565b611882565b3480156108d957600080fd5b506104336108e836600461349e565b6118e9565b3480156108f957600080fd5b5061043361090836600461349e565b6118fa565b34801561091957600080fd5b506000546001600160a01b0316610477565b34801561093757600080fd5b5061043361094636600461349e565b6119e2565b34801561095757600080fd5b50610433610966366004613571565b6119ef565b34801561097757600080fd5b506104c5610986366004613571565b6001600160a01b03166000908152601d602052604090205490565b3480156109ad57600080fd5b5061044a611a19565b3480156109c257600080fd5b506104c560115481565b3480156109d857600080fd5b506104336109e7366004613785565b611a28565b3480156109f857600080fd5b50610433610a07366004613532565b611afc565b348015610a1857600080fd5b50610433610a27366004613532565b611b1e565b348015610a3857600080fd5b50610433610a473660046137b3565b611b39565b348015610a5857600080fd5b50610433610a6736600461366f565b611c25565b348015610a7857600080fd5b50610433610a87366004613532565b611c40565b348015610a9857600080fd5b5061044a610aa736600461349e565b611c5b565b610433610aba366004613832565b611e36565b348015610acb57600080fd5b50610433610ada366004613862565b612096565b348015610aeb57600080fd5b506104c560135481565b348015610b0157600080fd5b50610433610b1036600461349e565b6120db565b348015610b2157600080fd5b50610433610b3036600461366f565b6120e8565b348015610b4157600080fd5b5061044a612103565b348015610b5657600080fd5b506103fe610b65366004613887565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b348015610b9f57600080fd5b50610433610bae366004613571565b612112565b348015610bbf57600080fd5b50610433610bce366004613532565b612188565b348015610bdf57600080fd5b50600e546103fe9060ff1681565b348015610bf957600080fd5b50610433610c0836600461349e565b6121ae565b6000610c18826121bb565b92915050565b610c266121e0565b610c30828261223a565b5050565b606060038054610c43906138b5565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6f906138b5565b8015610cbc5780601f10610c9157610100808354040283529160200191610cbc565b820191906000526020600020905b815481529060010190602001808311610c9f57829003601f168201915b5050505050905090565b6000610cd182612337565b610cee576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b816daaeb6d7670e522a718067333cd4e3b15801590610d2b5750600e5460ff165b15610dd957604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610d88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dac91906138ef565b610dd957604051633b79c77360e21b81526001600160a01b03821660048201526024015b60405180910390fd5b610de38383612370565b505050565b600254600154036000190190565b826daaeb6d7670e522a718067333cd4e3b15801590610e175750600e5460ff165b15610ece57336001600160a01b03821603610e3c57610e378484846123f1565b610ed9565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610e8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eaf91906138ef565b610ece57604051633b79c77360e21b8152336004820152602401610dd0565b610ed98484846123f1565b50505050565b601a8054610eec906138b5565b80601f0160208091040260200160405190810160405280929190818152602001828054610f18906138b5565b8015610f655780601f10610f3a57610100808354040283529160200191610f65565b820191906000526020600020905b815481529060010190602001808311610f4857829003601f168201915b505050505081565b610f756121e0565b601b8054911515620100000262ff000019909216919091179055565b6000828152600d602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291611006575060408051808201909152600c546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090611025906001600160601b031687613922565b61102f9190613957565b915196919550909350505050565b60026009540361105f5760405162461bcd60e51b8152600401610dd09061396b565b6002600955601b54610100900460ff166110b25760405162461bcd60e51b81526020600482015260146024820152731c1d589b1a58d35a5b9d081a5cc814185d5cd95960621b6044820152606401610dd0565b8060125410156111125760405162461bcd60e51b815260206004820152602560248201527f7075626c69634d696e743a204f766572206d6178206d696e7473207065722077604482015264185b1b195d60da1b6064820152608401610dd0565b336000908152601d602052604090205461112d9082906139a2565b601254101561117e5760405162461bcd60e51b815260206004820152601b60248201527f596f752068617665206e6f207075626c69634d696e74206c65667400000000006044820152606401610dd0565b8060105461118c9190613922565b34146111d55760405162461bcd60e51b8152602060048201526018602482015277115512081d985b1d59481a5cc81b9bdd0818dbdc9c9958dd60421b6044820152606401610dd0565b6013546111e0610de8565b6111ea90836139a2565b11156112085760405162461bcd60e51b8152600401610dd0906139ba565b336000908152601d6020526040812080548392906112279084906139a2565b90915550611237905033826123fc565b506001600955565b6112476121e0565b601b80549115156401000000000264ff0000000019909216919091179055565b61126f6121e0565b6002600954036112915760405162461bcd60e51b8152600401610dd09061396b565b60026009556017546000906001600160a01b031615611307576017546040516001600160a01b03909116904790600081818185875af1925050503d80600081146112f7576040519150601f19603f3d011682016040523d82523d6000602084013e6112fc565b606091505b505080915050611368565b6000546001600160a01b03166001600160a01b03164760405160006040518083038185875af1925050503d806000811461135d576040519150601f19603f3d011682016040523d82523d6000602084013e611362565b606091505b50909150505b8061123757600080fd5b826daaeb6d7670e522a718067333cd4e3b158015906113935750600e5460ff165b1561144557336001600160a01b038216036113b357610e37848484612416565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611402573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142691906138ef565b61144557604051633b79c77360e21b8152336004820152602401610dd0565b610ed9848484612416565b61145b816001612431565b50565b6060600061146b836117bf565b90506000816001600160401b03811115611487576114876135d2565b6040519080825280602002602001820160405280156114b0578160200160208202803683370190505b509050600060015b600154811015611577576040516320c2ce9960e21b815260048101829052309063830b3a6490602401602060405180830381865afa1580156114fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152291906139e0565b6001600160a01b0316866001600160a01b03160361156557808383611546816139fd565b94508151811061155857611558613a16565b6020026020010181815250505b8061156f816139fd565b9150506114b8565b5090949350505050565b6115896121e0565b8051610c3090601990602084019061330d565b6040516bffffffffffffffffffffffff19606084901b166020820152600090819060340160405160208183030381529060405280519060200120905060005b83518110156116b4578381815181106115f6576115f6613a16565b602002602001015182106116545783818151811061161657611616613a16565b602002602001015182604051602001611639929190918252602082015260400190565b604051602081830303815290604052805190602001206116a0565b8184828151811061166757611667613a16565b6020026020010151604051602001611689929190918252602082015260400190565b604051602081830303815290604052805190602001205b9150806116ac816139fd565b9150506115db565b50600b54149392505050565b60006116cb826125f3565b5192915050565b6116da6121e0565b806116e3610de8565b11156117315760405162461bcd60e51b815260206004820152601960248201527f4c6f776572207468616e205f63757272656e74496e6465782e000000000000006044820152606401610dd0565b601355565b61173f81612337565b61175b5760405162461bcd60e51b8152600401610dd090613a2c565b33611765826116c0565b6001600160a01b0316146117ae5760405162461bcd60e51b815260206004820152601060248201526f34b9b73a1037bbb732b9103a37b5b2b760811b6044820152606401610dd0565b6000908152601f6020526040812055565b60006001600160a01b0382166117e8576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b6118156121e0565b61181f6000612715565b565b6118296121e0565b601155565b600061183982612337565b6118555760405162461bcd60e51b8152600401610dd090613a2c565b506000908152601e602052604090205490565b6118706121e0565b601455565b61187d6121e0565b601255565b6040516331a9108f60e11b8152600481018290526000903090636352211e90602401602060405180830381865afa9250505080156118dd575060408051601f3d908101601f191682019092526118da918101906139e0565b60015b610c1857506000919050565b6118f16121e0565b61145b81600b55565b61190381612337565b61191f5760405162461bcd60e51b8152600401610dd090613a2c565b33611929826116c0565b6001600160a01b0316146119725760405162461bcd60e51b815260206004820152601060248201526f34b9b73a1037bbb732b9103a37b5b2b760811b6044820152606401610dd0565b601b5462010000900460ff161561145b57601b546301000000900460ff16156119b15760006119a082612765565b6000838152601f6020526040902055505b601b54640100000000900460ff161561145b5760006119cf826127ce565b6000838152601f60205260409020555050565b6119ea6121e0565b600f55565b6119f76121e0565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b606060048054610c43906138b5565b816daaeb6d7670e522a718067333cd4e3b15801590611a495750600e5460ff165b15611af257604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611aa6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aca91906138ef565b611af257604051633b79c77360e21b81526001600160a01b0382166004820152602401610dd0565b610de38383612833565b611b046121e0565b601b80549115156101000261ff0019909216919091179055565b611b266121e0565b600e805460ff1916911515919091179055565b836daaeb6d7670e522a718067333cd4e3b15801590611b5a5750600e5460ff165b15611c1257336001600160a01b03821603611b8057611b7b858585856128c8565b611c1e565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611bcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf391906138ef565b611c1257604051633b79c77360e21b8152336004820152602401610dd0565b611c1e858585856128c8565b5050505050565b611c2d6121e0565b8051610c3090601890602084019061330d565b611c486121e0565b601b805460ff1916911515919091179055565b6060611c6682612337565b611c825760405162461bcd60e51b8152600401610dd090613a2c565b601b5462010000900460ff1615611da4576000828152601f60205260408120541315611cfc57611cb061290c565b6000838152601f6020526040902054611cc89061291b565b611cd18461291b565b601a604051602001611ce69493929190613afc565b6040516020818303038152906040529050919050565b601b546301000000900460ff1615611d61576000611d1983612765565b9050611d2361290c565b611d2c8261291b565b611d358561291b565b601a604051602001611d4a9493929190613afc565b604051602081830303815290604052915050919050565b601b54640100000000900460ff1615611d7f576000611d19836127ce565b611d8761290c565b611d908361291b565b601a604051602001611ce693929190613b5a565b60188054611db1906138b5565b80601f0160208091040260200160405190810160405280929190818152602001828054611ddd906138b5565b8015611e2a5780601f10611dff57610100808354040283529160200191611e2a565b820191906000526020600020905b815481529060010190602001808311611e0d57829003601f168201915b50505050509050919050565b600260095403611e585760405162461bcd60e51b8152600401610dd09061396b565b6002600955601b5460ff16611eaf5760405162461bcd60e51b815260206004820152601760248201527f77686974656c6973744d696e74206973205061757365640000000000000000006044820152606401610dd0565b611eb9338261159c565b611f055760405162461bcd60e51b815260206004820152601860248201527f596f7520617265206e6f742077686974656c69737465642100000000000000006044820152606401610dd0565b816011541015611f685760405162461bcd60e51b815260206004820152602860248201527f77686974656c6973744d696e743a204f766572206d6178206d696e74732070656044820152671c881dd85b1b195d60c21b6064820152608401610dd0565b336000908152601c6020526040902054611f839083906139a2565b6011541015611fd45760405162461bcd60e51b815260206004820152601e60248201527f596f752068617665206e6f2077686974656c6973744d696e74206c65667400006044820152606401610dd0565b81600f54611fe29190613922565b341461202b5760405162461bcd60e51b8152602060048201526018602482015277115512081d985b1d59481a5cc81b9bdd0818dbdc9c9958dd60421b6044820152606401610dd0565b601354612036610de8565b61204090846139a2565b111561205e5760405162461bcd60e51b8152600401610dd0906139ba565b336000908152601c60205260408120805484929061207d9084906139a2565b9091555061208d905033836123fc565b50506001600955565b61209e6121e0565b6013546120a9610de8565b6120b390846139a2565b11156120d15760405162461bcd60e51b8152600401610dd0906139ba565b610c3081836123fc565b6120e36121e0565b601055565b6120f06121e0565b8051610c3090601a90602084019061330d565b606061210d612a1b565b905090565b61211a6121e0565b6001600160a01b03811661217f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610dd0565b61145b81612715565b6121906121e0565b601b805491151563010000000263ff00000019909216919091179055565b6121b66121e0565b601655565b60006001600160e01b0319821663152a902d60e11b1480610c185750610c1882612a9b565b6000546001600160a01b0316331461181f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dd0565b6127106001600160601b03821611156122a85760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610dd0565b6001600160a01b0382166122fe5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610dd0565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600c55565b60008160011115801561234b575060015482105b8015610c18575050600090815260056020526040902054600160e01b900460ff161590565b600061237b826116c0565b9050806001600160a01b0316836001600160a01b0316036123af5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216146123e6576123c98133610b65565b6123e6576040516367d9dca160e11b815260040160405180910390fd5b610de3838383612aeb565b610de3838383612b47565b610c30828260405180602001604052806000815250612d2d565b610de383838360405180602001604052806000815250611b39565b600061243c836125f3565b805190915082156124a2576000336001600160a01b038316148061246557506124658233610b65565b8061248057503361247586610cc6565b6001600160a01b0316145b9050806124a057604051632ce44b5f60e11b815260040160405180910390fd5b505b6124b0816000866001612edc565b6124bc60008583612aeb565b6001600160a01b0380821660008181526006602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526005909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b1785559189018084529220805491949091166125ba5760015482146125ba57805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b03841690600080516020613da1833981519152908390a450506002805460010190555050565b604080516060810182526000808252602082018190529181019190915281806001116126fc576001548110156126fc57600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906126fa5780516001600160a01b031615612691579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156126f5579392505050565b612691565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600061277082612337565b61278c5760405162461bcd60e51b8152600401610dd090613a2c565b6000612797836116c0565b905060006127a4826117bf565b90506000601554826127b69190613b8c565b905060145481126127c657506014545b949350505050565b60006127d982612337565b6127f55760405162461bcd60e51b8152600401610dd090613a2c565b6016546000838152601e60205260408120549091906128149042613bba565b61281e9190613b8c565b90506014548112610c18575060145492915050565b336001600160a01b0383160361285c5760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6128d3848484612b47565b6001600160a01b0383163b15610ed9576128ef84848484612f2e565b610ed9576040516368d2bf6b60e11b815260040160405180910390fd5b606060198054610c43906138b5565b6060816000036129425750506040805180820190915260018152600360fc1b602082015290565b8160005b811561296c5780612956816139fd565b91506129659050600a83613957565b9150612946565b6000816001600160401b03811115612986576129866135d2565b6040519080825280601f01601f1916602001820160405280156129b0576020820181803683370190505b5090505b84156127c6576129c5600183613bf9565b91506129d2600a86613c10565b6129dd9060306139a2565b60f81b8183815181106129f2576129f2613a16565b60200101906001600160f81b031916908160001a905350612a14600a86613957565b94506129b4565b6060600080612a2c81612710610f91565b91509150612a75612a3c8261291b565b612a50846001600160a01b03166014613019565b604051602001612a61929190613c24565b6040516020818303038152906040526131bb565b604051602001612a859190613caa565b6040516020818303038152906040529250505090565b60006001600160e01b031982166380ac58cd60e01b1480612acc57506001600160e01b03198216635b5e139f60e01b145b80610c1857506301ffc9a760e01b6001600160e01b0319831614610c18565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000612b52826125f3565b9050836001600160a01b031681600001516001600160a01b031614612b895760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480612ba75750612ba78533610b65565b80612bc2575033612bb784610cc6565b6001600160a01b0316145b905080612be257604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416612c0957604051633a954ecd60e21b815260040160405180910390fd5b612c168585856001612edc565b612c2260008487612aeb565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116612cf6576001548214612cf657805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b0316600080516020613da183398151915260405160405180910390a4611c1e565b6001546001600160a01b038416612d5657604051622e076360e81b815260040160405180910390fd5b82600003612d775760405163b562e8dd60e01b815260040160405180910390fd5b612d846000858386612edc565b6001600160a01b038416600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600590925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15612e9a575b60405182906001600160a01b03881690600090600080516020613da1833981519152908290a4612e636000878480600101955087612f2e565b612e80576040516368d2bf6b60e11b815260040160405180910390fd5b808210612e2a578260015414612e9557600080fd5b612ecd565b5b6040516001830192906001600160a01b03881690600090600080516020613da1833981519152908290a4808210612e9b575b50600155610ed9600085838684565b6000828152601e602052604081204290558290612ef983836139a2565b90505b42601e600084612f0b816139fd565b9550815260200190815260200160002081905550808210612efc57505050505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612f63903390899088908890600401613cef565b6020604051808303816000875af1925050508015612f9e575060408051601f3d908101601f19168201909252612f9b91810190613d2c565b60015b612ffc573d808015612fcc576040519150601f19603f3d011682016040523d82523d6000602084013e612fd1565b606091505b508051600003612ff4576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b60606000613028836002613922565b6130339060026139a2565b6001600160401b0381111561304a5761304a6135d2565b6040519080825280601f01601f191660200182016040528015613074576020820181803683370190505b509050600360fc1b8160008151811061308f5761308f613a16565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106130be576130be613a16565b60200101906001600160f81b031916908160001a90535060006130e2846002613922565b6130ed9060016139a2565b90505b6001811115613165576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061312157613121613a16565b1a60f81b82828151811061313757613137613a16565b60200101906001600160f81b031916908160001a90535060049490941c9361315e81613d49565b90506130f0565b5083156131b45760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610dd0565b9392505050565b606081516000036131da57505060408051602081019091526000815290565b6000604051806060016040528060408152602001613d61604091399050600060038451600261320991906139a2565b6132139190613957565b61321e906004613922565b6001600160401b03811115613235576132356135d2565b6040519080825280601f01601f19166020018201604052801561325f576020820181803683370190505b509050600182016020820185865187015b808210156132cb576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250613270565b50506003865106600181146132e757600281146132fa57613302565b603d6001830353603d6002830353613302565b603d60018303535b509195945050505050565b828054613319906138b5565b90600052602060002090601f01602090048101928261333b5760008555613381565b82601f1061335457805160ff1916838001178555613381565b82800160010185558215613381579182015b82811115613381578251825591602001919060010190613366565b5061338d929150613391565b5090565b5b8082111561338d5760008155600101613392565b6001600160e01b03198116811461145b57600080fd5b6000602082840312156133ce57600080fd5b81356131b4816133a6565b6001600160a01b038116811461145b57600080fd5b6000806040838503121561340157600080fd5b823561340c816133d9565b915060208301356001600160601b038116811461342857600080fd5b809150509250929050565b60005b8381101561344e578181015183820152602001613436565b83811115610ed95750506000910152565b60008151808452613477816020860160208601613433565b601f01601f19169290920160200192915050565b6020815260006131b4602083018461345f565b6000602082840312156134b057600080fd5b5035919050565b600080604083850312156134ca57600080fd5b82356134d5816133d9565b946020939093013593505050565b6000806000606084860312156134f857600080fd5b8335613503816133d9565b92506020840135613513816133d9565b929592945050506040919091013590565b801515811461145b57600080fd5b60006020828403121561354457600080fd5b81356131b481613524565b6000806040838503121561356257600080fd5b50508035926020909101359150565b60006020828403121561358357600080fd5b81356131b4816133d9565b6020808252825182820181905260009190848201906040850190845b818110156135c6578351835292840192918401916001016135aa565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613610576136106135d2565b604052919050565b60006001600160401b03831115613631576136316135d2565b613644601f8401601f19166020016135e8565b905082815283838301111561365857600080fd5b828260208301376000602084830101529392505050565b60006020828403121561368157600080fd5b81356001600160401b0381111561369757600080fd5b8201601f810184136136a857600080fd5b6127c684823560208401613618565b600082601f8301126136c857600080fd5b813560206001600160401b038211156136e3576136e36135d2565b8160051b6136f28282016135e8565b928352848101820192828101908785111561370c57600080fd5b83870192505b8483101561372b57823582529183019190830190613712565b979650505050505050565b6000806040838503121561374957600080fd5b8235613754816133d9565b915060208301356001600160401b0381111561376f57600080fd5b61377b858286016136b7565b9150509250929050565b6000806040838503121561379857600080fd5b82356137a3816133d9565b9150602083013561342881613524565b600080600080608085870312156137c957600080fd5b84356137d4816133d9565b935060208501356137e4816133d9565b92506040850135915060608501356001600160401b0381111561380657600080fd5b8501601f8101871361381757600080fd5b61382687823560208401613618565b91505092959194509250565b6000806040838503121561384557600080fd5b8235915060208301356001600160401b0381111561376f57600080fd5b6000806040838503121561387557600080fd5b823591506020830135613428816133d9565b6000806040838503121561389a57600080fd5b82356138a5816133d9565b91506020830135613428816133d9565b600181811c908216806138c957607f821691505b6020821081036138e957634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561390157600080fd5b81516131b481613524565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561393c5761393c61390c565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261396657613966613941565b500490565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600082198211156139b5576139b561390c565b500190565b6020808252600c908201526b4e6f206d6f7265204e46547360a01b604082015260600190565b6000602082840312156139f257600080fd5b81516131b4816133d9565b600060018201613a0f57613a0f61390c565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6020808252601f908201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00604082015260600190565b8054600090600181811c9080831680613a7d57607f831692505b60208084108203613a9e57634e487b7160e01b600052602260045260246000fd5b818015613ab25760018114613ac357613af0565b60ff19861689528489019650613af0565b60008881526020902060005b86811015613ae85781548b820152908501908301613acf565b505084890196505b50505050505092915050565b60008551613b0e818460208a01613433565b855190830190613b22818360208a01613433565b602f60f81b91019081528451613b3f816001840160208901613433565b613b4e60018284010186613a63565b98975050505050505050565b60008451613b6c818460208901613433565b845190830190613b80818360208901613433565b61372b81830186613a63565b600082613b9b57613b9b613941565b600160ff1b821460001984141615613bb557613bb561390c565b500590565b60008083128015600160ff1b850184121615613bd857613bd861390c565b6001600160ff1b0384018313811615613bf357613bf361390c565b50500390565b600082821015613c0b57613c0b61390c565b500390565b600082613c1f57613c1f613941565b500690565b7f7b2273656c6c65725f6665655f62617369735f706f696e7473223a0000000000815260008351613c5c81601b850160208801613433565b721610113332b2afb932b1b4b834b2b73a111d1160691b601b918401918201528351613c8f81602e840160208801613433565b61227d60f01b602e9290910191820152603001949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613ce281601d850160208701613433565b91909101601d0192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613d229083018461345f565b9695505050505050565b600060208284031215613d3e57600080fd5b81516131b4816133a6565b600081613d5857613d5861390c565b50600019019056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122061e84593d10c60fdd68fd2e828407692c705e10e85c3f74e48a6c4a1b0bd92d364736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b4250f715995683c6ea5bc7c5e2cdf9b1601ba3f00000000000000000000000000000000000000000000000000000000000003e8
-----Decoded View---------------
Arg [0] : _royaltyReceiver (address): 0xB4250F715995683c6EA5BC7c5e2CDF9b1601ba3f
Arg [1] : _royaltyFraction (uint96): 1000
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000b4250f715995683c6ea5bc7c5e2cdf9b1601ba3f
Arg [1] : 00000000000000000000000000000000000000000000000000000000000003e8
Deployed Bytecode Sourcemap
65757:13135:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67312:165;;;;;;;;;;-1:-1:-1;67312:165:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;67312:165:0;;;;;;;;67137:154;;;;;;;;;;-1:-1:-1;67137:154:0;;;;;:::i;:::-;;:::i;:::-;;40869:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;42381:204::-;;;;;;;;;;-1:-1:-1;42381:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2268:32:1;;;2250:51;;2238:2;2223:18;42381:204:0;2104:203:1;77643:157:0;;;;;;;;;;-1:-1:-1;77643:157:0;;;;;:::i;:::-;;:::i;66122:22::-;;;;;;;;;;;;;;;;;;;2778:25:1;;;2766:2;2751:18;66122:22:0;2632:177:1;70689:99:0;;;;;;;;;;-1:-1:-1;70769:13:0;;70689:99;;36994:312;;;;;;;;;;;;;:::i;66372:27::-;;;;;;;;;;-1:-1:-1;66372:27:0;;;;;;;;66013:32;;;;;;;;;;;;;;;;77808:163;;;;;;;;;;-1:-1:-1;77808:163:0;;;;;:::i;:::-;;:::i;66316:38::-;;;;;;;;;;;;;:::i;68867:107::-;;;;;;;;;;-1:-1:-1;68867:107:0;;;;;:::i;:::-;;:::i;28905:442::-;;;;;;;;;;-1:-1:-1;28905:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4089:32:1;;;4071:51;;4153:2;4138:18;;4131:34;;;;4044:18;28905:442:0;3897:274:1;65888:39:0;;;;;;;;;;;;;;;;74956:544;;;;;;:::i;:::-;;:::i;69287:121::-;;;;;;;;;;-1:-1:-1;69287:121:0;;;;;:::i;:::-;;:::i;75655:661::-;;;:::i;66404:31::-;;;;;;;;;;-1:-1:-1;66404:31:0;;;;;;;;;;;62069:143;;;;;;;;;;;;62169:42;62069:143;;65932:39;;;;;;;;;;;;;;;;77979:171;;;;;;;;;;-1:-1:-1;77979:171:0;;;;;:::i;:::-;;:::i;75516:81::-;;;;;;;;;;-1:-1:-1;75516:81:0;;;;;:::i;:::-;;:::i;76359:475::-;;;;;;;;;;-1:-1:-1;76359:475:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;66440:28::-;;;;;;;;;;-1:-1:-1;66440:28:0;;;;;;;;;;;70840:100;;;;;;;;;;-1:-1:-1;70840:100:0;;;;;:::i;:::-;;:::i;12161:407::-;;;;;;;;;;-1:-1:-1;12161:407:0;;;;;:::i;:::-;;:::i;40677:125::-;;;;;;;;;;-1:-1:-1;40677:125:0;;;;;:::i;:::-;;:::i;68429:176::-;;;;;;;;;;-1:-1:-1;68429:176:0;;;;;:::i;:::-;;:::i;73779:225::-;;;;;;;;;;-1:-1:-1;73779:225:0;;;;;:::i;:::-;;:::i;38123:206::-;;;;;;;;;;-1:-1:-1;38123:206:0;;;;;:::i;:::-;;:::i;58408:103::-;;;;;;;;;;;;;:::i;69699:97::-;;;;;;;;;;-1:-1:-1;69699:97:0;;;;;:::i;:::-;;:::i;66156:23::-;;;;;;;;;;;;;;;;71219:189;;;;;;;;;;-1:-1:-1;71219:189:0;;;;;:::i;:::-;;:::i;69920:92::-;;;;;;;;;;-1:-1:-1;69920:92:0;;;;;:::i;:::-;;:::i;69440:114::-;;;;;;;;;;-1:-1:-1;69440:114:0;;;;;:::i;:::-;-1:-1:-1;;;;;69529:19:0;69507:7;69529:19;;;:9;:19;;;;;;;69440:114;66086:24;;;;;;;;;;;;;;;;69800:97;;;;;;;;;;-1:-1:-1;69800:97:0;;;;;:::i;:::-;;:::i;76897:243::-;;;;;;;;;;-1:-1:-1;76897:243:0;;;;;:::i;:::-;;:::i;70403:115::-;;;;;;;;;;-1:-1:-1;70403:115:0;;;;;:::i;:::-;;:::i;73261:496::-;;;;;;;;;;-1:-1:-1;73261:496:0;;;;;:::i;:::-;;:::i;57760:87::-;;;;;;;;;;-1:-1:-1;57806:7:0;57833:6;-1:-1:-1;;;;;57833:6:0;57760:87;;68629:100;;;;;;;;;;-1:-1:-1;68629:100:0;;;;;:::i;:::-;;:::i;68276:116::-;;;;;;;;;;-1:-1:-1;68276:116:0;;;;;:::i;:::-;;:::i;69558:114::-;;;;;;;;;;-1:-1:-1;69558:114:0;;;;;:::i;:::-;-1:-1:-1;;;;;69647:19:0;69625:7;69647:19;;;:9;:19;;;;;;;69558:114;41038:104;;;;;;;;;;;;;:::i;65976:32::-;;;;;;;;;;;;;;;;77459:176;;;;;;;;;;-1:-1:-1;77459:176:0;;;;;:::i;:::-;;:::i;70266:108::-;;;;;;;;;;-1:-1:-1;70266:108:0;;;;;:::i;:::-;;:::i;77332:119::-;;;;;;;;;;-1:-1:-1;77332:119:0;;;;;:::i;:::-;;:::i;78158:228::-;;;;;;;;;;-1:-1:-1;78158:228:0;;;;;:::i;:::-;;:::i;70559:98::-;;;;;;;;;;-1:-1:-1;70559:98:0;;;;;:::i;:::-;;:::i;70155:107::-;;;;;;;;;;-1:-1:-1;70155:107:0;;;;;:::i;:::-;;:::i;72219:1022::-;;;;;;;;;;-1:-1:-1;72219:1022:0;;;;;:::i;:::-;;:::i;74278:652::-;;;;;;:::i;:::-;;:::i;74061:195::-;;;;;;;;;;-1:-1:-1;74061:195:0;;;;;:::i;:::-;;:::i;66050:31::-;;;;;;;;;;;;;;;;68733:100;;;;;;;;;;-1:-1:-1;68733:100:0;;;;;:::i;:::-;;:::i;70948:128::-;;;;;;;;;;-1:-1:-1;70948:128:0;;;;;:::i;:::-;;:::i;67506:113::-;;;;;;;;;;;;;:::i;43015:164::-;;;;;;;;;;-1:-1:-1;43015:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;43136:25:0;;;43112:4;43136:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;43015:164;58666:201;;;;;;;;;;-1:-1:-1;58666:201:0;;;;;:::i;:::-;;:::i;69128:121::-;;;;;;;;;;-1:-1:-1;69128:121:0;;;;;:::i;:::-;;:::i;62017:43::-;;;;;;;;;;-1:-1:-1;62017:43:0;;;;;;;;70035:90;;;;;;;;;;-1:-1:-1;70035:90:0;;;;;:::i;:::-;;:::i;67312:165::-;67415:4;67435:36;67459:11;67435:23;:36::i;:::-;67428:43;67312:165;-1:-1:-1;;67312:165:0:o;67137:154::-;57646:13;:11;:13::i;:::-;67241:44:::1;67260:9;67271:13;67241:18;:44::i;:::-;67137:154:::0;;:::o;40869:100::-;40923:13;40956:5;40949:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40869:100;:::o;42381:204::-;42449:7;42474:16;42482:7;42474;:16::i;:::-;42469:64;;42499:34;;-1:-1:-1;;;42499:34:0;;;;;;;;;;;42469:64;-1:-1:-1;42553:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;42553:24:0;;42381:204::o;77643:157::-;77739:8;62169:42;64091:45;:49;;;;:77;;-1:-1:-1;64144:24:0;;;;64091:77;64087:253;;;64190:67;;-1:-1:-1;;;64190:67:0;;64241:4;64190:67;;;10893:34:1;-1:-1:-1;;;;;10963:15:1;;10943:18;;;10936:43;62169:42:0;;64190;;10828:18:1;;64190:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64185:144;;64285:28;;-1:-1:-1;;;64285:28:0;;-1:-1:-1;;;;;2268:32:1;;64285:28:0;;;2250:51:1;2223:18;;64285:28:0;;;;;;;;64185:144;77760:32:::1;77774:8;77784:7;77760:13;:32::i;:::-;77643:157:::0;;;:::o;36994:312::-;37257:12;;67070:1;37241:13;:28;-1:-1:-1;;37241:46:0;;36994:312::o;77808:163::-;77909:4;62169:42;63317:45;:49;;;;:77;;-1:-1:-1;63370:24:0;;;;63317:77;63313:567;;;63634:10;-1:-1:-1;;;;;63626:18:0;;;63622:85;;77926:37:::1;77945:4;77951:2;77955:7;77926:18;:37::i;:::-;63685:7:::0;;63622:85;63726:69;;-1:-1:-1;;;63726:69:0;;63777:4;63726:69;;;10893:34:1;63784:10:0;10943:18:1;;;10936:43;62169:42:0;;63726;;10828:18:1;;63726:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63721:148;;63823:30;;-1:-1:-1;;;63823:30:0;;63842:10;63823:30;;;2250:51:1;2223:18;;63823:30:0;2104:203:1;63721:148:0;77926:37:::1;77945:4;77951:2;77955:7;77926:18;:37::i;:::-;77808:163:::0;;;;:::o;66316:38::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;68867:107::-;57646:13;:11;:13::i;:::-;68942:8:::1;:26:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;68942:26:0;;::::1;::::0;;;::::1;::::0;;68867:107::o;28905:442::-;29002:7;29060:27;;;:17;:27;;;;;;;;29031:56;;;;;;;;;-1:-1:-1;;;;;29031:56:0;;;;;-1:-1:-1;;;29031:56:0;;;-1:-1:-1;;;;;29031:56:0;;;;;;;;29002:7;;29100:92;;-1:-1:-1;29151:29:0;;;;;;;;;29161:19;29151:29;-1:-1:-1;;;;;29151:29:0;;;;-1:-1:-1;;;29151:29:0;;-1:-1:-1;;;;;29151:29:0;;;;;29100:92;29242:23;;;;29204:21;;29713:5;;29229:36;;-1:-1:-1;;;;;29229:36:0;:10;:36;:::i;:::-;29228:58;;;;:::i;:::-;29307:16;;;;;-1:-1:-1;28905:442:0;;-1:-1:-1;;;;28905:442:0:o;74956:544::-;33153:1;33751:7;;:19;33743:63;;;;-1:-1:-1;;;33743:63:0;;;;;;;:::i;:::-;33153:1;33884:7;:18;75046:19:::1;::::0;::::1;::::0;::::1;;;75038:52;;;::::0;-1:-1:-1;;;75038:52:0;;12364:2:1;75038:52:0::1;::::0;::::1;12346:21:1::0;12403:2;12383:18;;;12376:30;-1:-1:-1;;;12422:18:1;;;12415:50;12482:18;;75038:52:0::1;12162:344:1::0;75038:52:0::1;75122:7;75105:13;;:24;;75097:74;;;::::0;-1:-1:-1;;;75097:74:0;;12713:2:1;75097:74:0::1;::::0;::::1;12695:21:1::0;12752:2;12732:18;;;12725:30;12791:34;12771:18;;;12764:62;-1:-1:-1;;;12842:18:1;;;12835:35;12887:19;;75097:74:0::1;12511:401:1::0;75097:74:0::1;75213:10;75203:21;::::0;;;:9:::1;:21;::::0;;;;;:31:::1;::::0;75227:7;;75203:31:::1;:::i;:::-;75186:13;;:48;;75178:88;;;::::0;-1:-1:-1;;;75178:88:0;;13252:2:1;75178:88:0::1;::::0;::::1;13234:21:1::0;13291:2;13271:18;;;13264:30;13330:29;13310:18;;;13303:57;13377:18;;75178:88:0::1;13050:351:1::0;75178:88:0::1;75308:7;75294:11;;:21;;;;:::i;:::-;75281:9;:34;75273:71;;;::::0;-1:-1:-1;;;75273:71:0;;13608:2:1;75273:71:0::1;::::0;::::1;13590:21:1::0;13647:2;13627:18;;;13620:30;-1:-1:-1;;;13666:18:1;;;13659:54;13730:18;;75273:71:0::1;13406:348:1::0;75273:71:0::1;75389:9;;75370:13;:11;:13::i;:::-;75360:23;::::0;:7;:23:::1;:::i;:::-;75359:40;;75351:65;;;;-1:-1:-1::0;;;75351:65:0::1;;;;;;;:::i;:::-;75435:10;75425:21;::::0;;;:9:::1;:21;::::0;;;;:32;;75450:7;;75425:21;:32:::1;::::0;75450:7;;75425:32:::1;:::i;:::-;::::0;;;-1:-1:-1;75464:30:0::1;::::0;-1:-1:-1;75474:10:0::1;75486:7:::0;75464:9:::1;:30::i;:::-;-1:-1:-1::0;33109:1:0;34063:7;:22;74956:544::o;69287:121::-;57646:13;:11;:13::i;:::-;69370:10:::1;:32:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;69370:32:0;;::::1;::::0;;;::::1;::::0;;69287:121::o;75655:661::-;57646:13;:11;:13::i;:::-;33153:1:::1;33751:7;;:19:::0;33743:63:::1;;;;-1:-1:-1::0;;;33743:63:0::1;;;;;;;:::i;:::-;33153:1;33884:7;:18:::0;75978:15:::2;::::0;75961:7:::2;::::0;-1:-1:-1;;;;;75978:15:0::2;:29:::0;75975:232:::2;;76059:15;::::0;76051:63:::2;::::0;-1:-1:-1;;;;;76059:15:0;;::::2;::::0;76088:21:::2;::::0;76051:63:::2;::::0;;;76088:21;76059:15;76051:63:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76042:72;;;;;75975:232;;;57806:7:::0;57833:6;-1:-1:-1;;;;;57833:6:0;-1:-1:-1;;;;;76144:21:0::2;76173;76144:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;76135:64:0;;-1:-1:-1;;75975:232:0::2;76221:2;76213:11;;;::::0;::::2;77979:171:::0;78084:4;62169:42;63317:45;:49;;;;:77;;-1:-1:-1;63370:24:0;;;;63317:77;63313:567;;;63634:10;-1:-1:-1;;;;;63626:18:0;;;63622:85;;78101:41:::1;78124:4;78130:2;78134:7;78101:22;:41::i;63622:85::-:0;63726:69;;-1:-1:-1;;;63726:69:0;;63777:4;63726:69;;;10893:34:1;63784:10:0;10943:18:1;;;10936:43;62169:42:0;;63726;;10828:18:1;;63726:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63721:148;;63823:30;;-1:-1:-1;;;63823:30:0;;63842:10;63823:30;;;2250:51:1;2223:18;;63823:30:0;2104:203:1;63721:148:0;78101:41:::1;78124:4;78130:2;78134:7;78101:22;:41::i;75516:81::-:0;75571:20;75577:7;75586:4;75571:5;:20::i;:::-;75516:81;:::o;76359:475::-;76431:16;76456:23;76482:19;76492:8;76482:9;:19::i;:::-;76456:45;;76508:25;76550:15;-1:-1:-1;;;;;76536:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76536:30:0;-1:-1:-1;76508:58:0;-1:-1:-1;76642:18:0;67070:1;76671:136;76709:13;;76705:1;:17;76671:136;;;76753:18;;-1:-1:-1;;;76753:18:0;;;;;2778:25:1;;;76753:4:0;;:15;;2751:18:1;;76753::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;76741:30:0;:8;-1:-1:-1;;;;;76741:30:0;;76738:61;;76798:1;76773:8;76782:12;;;;:::i;:::-;;;76773:22;;;;;;;;:::i;:::-;;;;;;:26;;;;;76738:61;76724:3;;;;:::i;:::-;;;;76671:136;;;-1:-1:-1;76820:8:0;;76359:475;-1:-1:-1;;;;76359:475:0:o;70840:100::-;57646:13;:11;:13::i;:::-;70914:20;;::::1;::::0;:13:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;12161:407::-:0;12291:26;;-1:-1:-1;;14987:2:1;14983:15;;;14979:53;12291:26:0;;;14967:66:1;12248:4:0;;;;15049:12:1;;12291:26:0;;;;;;;;;;;;12281:37;;;;;;12265:53;;12334:9;12329:192;12353:6;:13;12349:1;:17;12329:192;;;12404:6;12411:1;12404:9;;;;;;;;:::i;:::-;;;;;;;12396:5;:17;:113;;12491:6;12498:1;12491:9;;;;;;;;:::i;:::-;;;;;;;12502:5;12474:34;;;;;;;;15229:19:1;;;15273:2;15264:12;;15257:28;15310:2;15301:12;;15072:247;12474:34:0;;;;;;;;;;;;;12464:45;;;;;;12396:113;;;12443:5;12450:6;12457:1;12450:9;;;;;;;;:::i;:::-;;;;;;;12426:34;;;;;;;;15229:19:1;;;15273:2;15264:12;;15257:28;15310:2;15301:12;;15072:247;12426:34:0;;;;;;;;;;;;;12416:45;;;;;;12396:113;12388:121;-1:-1:-1;12368:3:0;;;;:::i;:::-;;;;12329:192;;;-1:-1:-1;12547:13:0;;12538:22;;12161:407;-1:-1:-1;;;12161:407:0:o;40677:125::-;40741:7;40768:21;40781:7;40768:12;:21::i;:::-;:26;;40677:125;-1:-1:-1;;40677:125:0:o;68429:176::-;57646:13;:11;:13::i;:::-;68530:10:::1;68513:13;:11;:13::i;:::-;:27;;68505:65;;;::::0;-1:-1:-1;;;68505:65:0;;15526:2:1;68505:65:0::1;::::0;::::1;15508:21:1::0;15565:2;15545:18;;;15538:30;15604:27;15584:18;;;15577:55;15649:18;;68505:65:0::1;15324:349:1::0;68505:65:0::1;68577:9;:22:::0;68429:176::o;73779:225::-;73849:17;73857:8;73849:7;:17::i;:::-;73841:61;;;;-1:-1:-1;;;73841:61:0;;;;;;;:::i;:::-;73938:10;73917:17;73925:8;73917:7;:17::i;:::-;-1:-1:-1;;;;;73917:31:0;;73909:60;;;;-1:-1:-1;;;73909:60:0;;16240:2:1;73909:60:0;;;16222:21:1;16279:2;16259:18;;;16252:30;-1:-1:-1;;;16298:18:1;;;16291:46;16354:18;;73909:60:0;16038:340:1;73909:60:0;73997:1;73976:18;;;:8;:18;;;;;:22;73779:225::o;38123:206::-;38187:7;-1:-1:-1;;;;;38211:19:0;;38207:60;;38239:28;;-1:-1:-1;;;38239:28:0;;;;;;;;;;;38207:60;-1:-1:-1;;;;;;38293:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;38293:27:0;;38123:206::o;58408:103::-;57646:13;:11;:13::i;:::-;58473:30:::1;58500:1;58473:18;:30::i;:::-;58408:103::o:0;69699:97::-;57646:13;:11;:13::i;:::-;69770::::1;:20:::0;69699:97::o;71219:189::-;71290:7;71314:17;71322:8;71314:7;:17::i;:::-;71306:61;;;;-1:-1:-1;;;71306:61:0;;;;;;;:::i;:::-;-1:-1:-1;71383:19:0;;;;:9;:19;;;;;;;71219:189::o;69920:92::-;57646:13;:11;:13::i;:::-;69990:9:::1;:16:::0;69920:92::o;69800:97::-;57646:13;:11;:13::i;:::-;69871::::1;:20:::0;69800:97::o;76897:243::-;76986:21;;-1:-1:-1;;;76986:21:0;;;;;2778:25:1;;;76966:7:0;;76986:4;;:12;;2751:18:1;;76986:21:0;;;;;;;;;;;;;;;;;;-1:-1:-1;76986:21:0;;;;;;;;-1:-1:-1;;76986:21:0;;;;;;;;;;;;:::i;:::-;;;76982:153;;-1:-1:-1;77102:1:0;;76897:243;-1:-1:-1;76897:243:0:o;70403:115::-;57646:13;:11;:13::i;:::-;70483:29:::1;70500:11;12118:13:::0;:27;12043:110;73261:496;73329:17;73337:8;73329:7;:17::i;:::-;73321:61;;;;-1:-1:-1;;;73321:61:0;;;;;;;:::i;:::-;73418:10;73397:17;73405:8;73397:7;:17::i;:::-;-1:-1:-1;;;;;73397:31:0;;73389:60;;;;-1:-1:-1;;;73389:60:0;;16240:2:1;73389:60:0;;;16222:21:1;16279:2;16259:18;;;16252:30;-1:-1:-1;;;16298:18:1;;;16291:46;16354:18;;73389:60:0;16038:340:1;73389:60:0;69077:8;;;;;;;73456:296;;;73487:10;;;;;;;73484:125;;;73513:15;73531:22;73544:8;73531:12;:22::i;:::-;73568:18;;;;:8;:18;;;;;:29;-1:-1:-1;73484:125:0;73622:10;;;;;;;73619:126;;;73648:15;73666:23;73680:8;73666:13;:23::i;:::-;73704:18;;;;:8;:18;;;;;:29;-1:-1:-1;73261:496:0;:::o;68629:100::-;57646:13;:11;:13::i;:::-;68701:11:::1;:22:::0;68629:100::o;68276:116::-;57646:13;:11;:13::i;:::-;68353:15:::1;:33:::0;;-1:-1:-1;;;;;;68353:33:0::1;-1:-1:-1::0;;;;;68353:33:0;;;::::1;::::0;;;::::1;::::0;;68276:116::o;41038:104::-;41094:13;41127:7;41120:14;;;;;:::i;77459:176::-;77563:8;62169:42;64091:45;:49;;;;:77;;-1:-1:-1;64144:24:0;;;;64091:77;64087:253;;;64190:67;;-1:-1:-1;;;64190:67:0;;64241:4;64190:67;;;10893:34:1;-1:-1:-1;;;;;10963:15:1;;10943:18;;;10936:43;62169:42:0;;64190;;10828:18:1;;64190:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64185:144;;64285:28;;-1:-1:-1;;;64285:28:0;;-1:-1:-1;;;;;2268:32:1;;64285:28:0;;;2250:51:1;2223:18;;64285:28:0;2104:203:1;64185:144:0;77584:43:::1;77608:8;77618;77584:23;:43::i;70266:108::-:0;57646:13;:11;:13::i;:::-;70341:19:::1;:27:::0;;;::::1;;;;-1:-1:-1::0;;70341:27:0;;::::1;::::0;;;::::1;::::0;;70266:108::o;77332:119::-;57646:13;:11;:13::i;:::-;77411:24:::1;:32:::0;;-1:-1:-1;;77411:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;77332:119::o;78158:228::-;78309:4;62169:42;63317:45;:49;;;;:77;;-1:-1:-1;63370:24:0;;;;63317:77;63313:567;;;63634:10;-1:-1:-1;;;;;63626:18:0;;;63622:85;;78331:47:::1;78354:4;78360:2;78364:7;78373:4;78331:22;:47::i;:::-;63685:7:::0;;63622:85;63726:69;;-1:-1:-1;;;63726:69:0;;63777:4;63726:69;;;10893:34:1;63784:10:0;10943:18:1;;;10936:43;62169:42:0;;63726;;10828:18:1;;63726:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63721:148;;63823:30;;-1:-1:-1;;;63823:30:0;;63842:10;63823:30;;;2250:51:1;2223:18;;63823:30:0;2104:203:1;63721:148:0;78331:47:::1;78354:4;78360:2;78364:7;78373:4;78331:22;:47::i;:::-;78158:228:::0;;;;;:::o;70559:98::-;57646:13;:11;:13::i;:::-;70635:16;;::::1;::::0;:9:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;70155:107::-:0;57646:13;:11;:13::i;:::-;70233:15:::1;:23:::0;;-1:-1:-1;;70233:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;70155:107::o;72219:1022::-;72293:13;72323:17;72331:8;72323:7;:17::i;:::-;72315:61;;;;-1:-1:-1;;;72315:61:0;;;;;;;:::i;:::-;69077:8;;;;;;;72383:830;;;72435:1;72414:18;;;:8;:18;;;;;;:22;72411:201;;;72483:17;:15;:17::i;:::-;72527:18;;;;:8;:18;;;;;;72502:45;;:16;:45::i;:::-;72554:28;72572:8;72554:16;:28::i;:::-;72584:14;72466:133;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;72452:148;;72219:1022;;;:::o;72411:201::-;72625:10;;;;;;;72622:234;;;72651:15;72669:22;72682:8;72669:12;:22::i;:::-;72651:40;;72737:17;:15;:17::i;:::-;72756:35;72781:8;72756:16;:35::i;:::-;72798:28;72816:8;72798:16;:28::i;:::-;72828:14;72720:123;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;72706:138;;;72219:1022;;;:::o;72622:234::-;72869:10;;;;;;;72866:235;;;72895:15;72913:23;72927:8;72913:13;:23::i;72866:235::-;73142:17;:15;:17::i;:::-;73161:26;73178:8;73161:16;:26::i;:::-;73189:14;73125:79;;;;;;;;;;:::i;72383:830::-;73226:9;73219:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72219:1022;;;:::o;74278:652::-;33153:1;33751:7;;:19;33743:63;;;;-1:-1:-1;;;33743:63:0;;;;;;;:::i;:::-;33153:1;33884:7;:18;74396:15:::1;::::0;::::1;;74388:51;;;::::0;-1:-1:-1;;;74388:51:0;;19137:2:1;74388:51:0::1;::::0;::::1;19119:21:1::0;19176:2;19156:18;;;19149:30;19215:25;19195:18;;;19188:53;19258:18;;74388:51:0::1;18935:347:1::0;74388:51:0::1;74454:33;74468:10;74480:6;74454:13;:33::i;:::-;74446:70;;;::::0;-1:-1:-1;;;74446:70:0;;19489:2:1;74446:70:0::1;::::0;::::1;19471:21:1::0;19528:2;19508:18;;;19501:30;19567:26;19547:18;;;19540:54;19611:18;;74446:70:0::1;19287:348:1::0;74446:70:0::1;74548:7;74531:13;;:24;;74523:77;;;::::0;-1:-1:-1;;;74523:77:0;;19842:2:1;74523:77:0::1;::::0;::::1;19824:21:1::0;19881:2;19861:18;;;19854:30;19920:34;19900:18;;;19893:62;-1:-1:-1;;;19971:18:1;;;19964:38;20019:19;;74523:77:0::1;19640:404:1::0;74523:77:0::1;74642:10;74632:21;::::0;;;:9:::1;:21;::::0;;;;;:31:::1;::::0;74656:7;;74632:31:::1;:::i;:::-;74615:13;;:48;;74607:91;;;::::0;-1:-1:-1;;;74607:91:0;;20251:2:1;74607:91:0::1;::::0;::::1;20233:21:1::0;20290:2;20270:18;;;20263:30;20329:32;20309:18;;;20302:60;20379:18;;74607:91:0::1;20049:354:1::0;74607:91:0::1;74740:7;74726:11;;:21;;;;:::i;:::-;74713:9;:34;74705:71;;;::::0;-1:-1:-1;;;74705:71:0;;13608:2:1;74705:71:0::1;::::0;::::1;13590:21:1::0;13647:2;13627:18;;;13620:30;-1:-1:-1;;;13666:18:1;;;13659:54;13730:18;;74705:71:0::1;13406:348:1::0;74705:71:0::1;74821:9;;74802:13;:11;:13::i;:::-;74792:23;::::0;:7;:23:::1;:::i;:::-;74791:40;;74783:65;;;;-1:-1:-1::0;;;74783:65:0::1;;;;;;;:::i;:::-;74865:10;74855:21;::::0;;;:9:::1;:21;::::0;;;;:32;;74880:7;;74855:21;:32:::1;::::0;74880:7;;74855:32:::1;:::i;:::-;::::0;;;-1:-1:-1;74894:30:0::1;::::0;-1:-1:-1;74904:10:0::1;74916:7:::0;74894:9:::1;:30::i;:::-;-1:-1:-1::0;;33109:1:0;34063:7;:22;74278:652::o;74061:195::-;57646:13;:11;:13::i;:::-;74188:9:::1;;74169:13;:11;:13::i;:::-;74159:23;::::0;:7;:23:::1;:::i;:::-;74158:40;;74150:65;;;;-1:-1:-1::0;;;74150:65:0::1;;;;;;;:::i;:::-;74222:28;74232:8;74242:7;74222:9;:28::i;68733:100::-:0;57646:13;:11;:13::i;:::-;68805:11:::1;:22:::0;68733:100::o;70948:128::-;57646:13;:11;:13::i;:::-;71036:34;;::::1;::::0;:14:::1;::::0;:34:::1;::::0;::::1;::::0;::::1;:::i;67506:113::-:0;67560:13;67593:20;:18;:20::i;:::-;67586:27;;67506:113;:::o;58666:201::-;57646:13;:11;:13::i;:::-;-1:-1:-1;;;;;58755:22:0;::::1;58747:73;;;::::0;-1:-1:-1;;;58747:73:0;;20610:2:1;58747:73:0::1;::::0;::::1;20592:21:1::0;20649:2;20629:18;;;20622:30;20688:34;20668:18;;;20661:62;-1:-1:-1;;;20739:18:1;;;20732:36;20785:19;;58747:73:0::1;20408:402:1::0;58747:73:0::1;58831:28;58850:8;58831:18;:28::i;69128:121::-:0;57646:13;:11;:13::i;:::-;69211:10:::1;:32:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;69211:32:0;;::::1;::::0;;;::::1;::::0;;69128:121::o;70035:90::-;57646:13;:11;:13::i;:::-;70104:8:::1;:15:::0;70035:90::o;28635:215::-;28737:4;-1:-1:-1;;;;;;28761:41:0;;-1:-1:-1;;;28761:41:0;;:81;;;28806:36;28830:11;28806:23;:36::i;57925:132::-;57806:7;57833:6;-1:-1:-1;;;;;57833:6:0;34809:10;57989:23;57981:68;;;;-1:-1:-1;;;57981:68:0;;21017:2:1;57981:68:0;;;20999:21:1;;;21036:18;;;21029:30;21095:34;21075:18;;;21068:62;21147:18;;57981:68:0;20815:356:1;29997:332:0;29713:5;-1:-1:-1;;;;;30100:33:0;;;;30092:88;;;;-1:-1:-1;;;30092:88:0;;21378:2:1;30092:88:0;;;21360:21:1;21417:2;21397:18;;;21390:30;21456:34;21436:18;;;21429:62;-1:-1:-1;;;21507:18:1;;;21500:40;21557:19;;30092:88:0;21176:406:1;30092:88:0;-1:-1:-1;;;;;30199:22:0;;30191:60;;;;-1:-1:-1;;;30191:60:0;;21789:2:1;30191:60:0;;;21771:21:1;21828:2;21808:18;;;21801:30;21867:27;21847:18;;;21840:55;21912:18;;30191:60:0;21587:349:1;30191:60:0;30286:35;;;;;;;;;-1:-1:-1;;;;;30286:35:0;;;;;;-1:-1:-1;;;;;30286:35:0;;;;;;;;;;-1:-1:-1;;;30264:57:0;;;;:19;:57;29997:332::o;44368:174::-;44425:4;44468:7;67070:1;44449:26;;:53;;;;;44489:13;;44479:7;:23;44449:53;:85;;;;-1:-1:-1;;44507:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;44507:27:0;;;;44506:28;;44368:174::o;41935:380::-;42016:13;42032:24;42048:7;42032:15;:24::i;:::-;42016:40;;42077:5;-1:-1:-1;;;;;42071:11:0;:2;-1:-1:-1;;;;;42071:11:0;;42067:48;;42091:24;;-1:-1:-1;;;42091:24:0;;;;;;;;;;;42067:48;34809:10;-1:-1:-1;;;;;42132:21:0;;;42128:139;;42159:37;42176:5;34809:10;43015:164;:::i;42159:37::-;42155:112;;42220:35;;-1:-1:-1;;;42220:35:0;;;;;;;;;;;42155:112;42279:28;42288:2;42292:7;42301:5;42279:8;:28::i;43246:170::-;43380:28;43390:4;43396:2;43400:7;43380:9;:28::i;44626:104::-;44695:27;44705:2;44709:8;44695:27;;;;;;;;;;;;:9;:27::i;43487:185::-;43625:39;43642:4;43648:2;43652:7;43625:39;;;;;;;;;;;;:16;:39::i;51064:2408::-;51144:35;51182:21;51195:7;51182:12;:21::i;:::-;51231:18;;51144:59;;-1:-1:-1;51262:290:0;;;;51296:22;34809:10;-1:-1:-1;;;;;51322:20:0;;;;:77;;-1:-1:-1;51363:36:0;51380:4;34809:10;43015:164;:::i;51363:36::-;51322:134;;;-1:-1:-1;34809:10:0;51420:20;51432:7;51420:11;:20::i;:::-;-1:-1:-1;;;;;51420:36:0;;51322:134;51296:161;;51479:17;51474:66;;51505:35;;-1:-1:-1;;;51505:35:0;;;;;;;;;;;51474:66;51281:271;51262:290;51564:51;51586:4;51600:1;51604:7;51613:1;51564:21;:51::i;:::-;51680:35;51697:1;51701:7;51710:4;51680:8;:35::i;:::-;-1:-1:-1;;;;;52045:18:0;;;52011:31;52045:18;;;:12;:18;;;;;;;;52078:24;;-1:-1:-1;;;;;;;;;;52078:24:0;;;;;;;;;-1:-1:-1;;52078:24:0;;;;52117:29;;;;;52101:1;52117:29;;;;;;;;-1:-1:-1;;52117:29:0;;;;;;;;;;52279:20;;;:11;:20;;;;;;52314;;-1:-1:-1;;;;52382:15:0;52349:49;;;-1:-1:-1;;;52349:49:0;-1:-1:-1;;;;;;52349:49:0;;;;;;;;;;52413:22;-1:-1:-1;;;52413:22:0;;;52705:11;;;52765:24;;;;;52808:13;;52045:18;;52765:24;;52808:13;52804:384;;53018:13;;53003:11;:28;52999:174;;53056:20;;53125:28;;;;-1:-1:-1;;;;;53099:54:0;-1:-1:-1;;;53099:54:0;-1:-1:-1;;;;;;53099:54:0;;;-1:-1:-1;;;;;53056:20:0;;53099:54;;;;52999:174;-1:-1:-1;;53216:35:0;;53243:7;;-1:-1:-1;53239:1:0;;-1:-1:-1;;;;;;53216:35:0;;;-1:-1:-1;;;;;;;;;;;53216:35:0;53239:1;;53216:35;-1:-1:-1;;53439:12:0;:14;;;;;;-1:-1:-1;;51064:2408:0:o;39504:1111::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;39615:7:0;;67070:1;39664:23;39660:888;;39700:13;;39693:4;:20;39689:859;;;39734:31;39768:17;;;:11;:17;;;;;;;;;39734:51;;;;;;;;;-1:-1:-1;;;;;39734:51:0;;;;-1:-1:-1;;;39734:51:0;;-1:-1:-1;;;;;39734:51:0;;;;;;;;-1:-1:-1;;;39734:51:0;;;;;;;;;;;;;;39804:729;;39854:14;;-1:-1:-1;;;;;39854:28:0;;39850:101;;39918:9;39504:1111;-1:-1:-1;;;39504:1111:0:o;39850:101::-;-1:-1:-1;;;40293:6:0;40338:17;;;;:11;:17;;;;;;;;;40326:29;;;;;;;;;-1:-1:-1;;;;;40326:29:0;;;;;-1:-1:-1;;;40326:29:0;;-1:-1:-1;;;;;40326:29:0;;;;;;;;-1:-1:-1;;;40326:29:0;;;;;;;;;;;;;40386:28;40382:109;;40454:9;39504:1111;-1:-1:-1;;;39504:1111:0:o;40382:109::-;40253:261;;;39715:833;39689:859;40576:31;;-1:-1:-1;;;40576:31:0;;;;;;;;;;;59027:191;59101:16;59120:6;;-1:-1:-1;;;;;59137:17:0;;;-1:-1:-1;;;;;;59137:17:0;;;;;;59170:40;;59120:6;;;;;;;59170:40;;59101:16;59170:40;59090:128;59027:191;:::o;71781:430::-;71853:6;71876:17;71884:8;71876:7;:17::i;:::-;71868:61;;;;-1:-1:-1;;;71868:61:0;;;;;;;:::i;:::-;71936:21;71960:17;71968:8;71960:7;:17::i;:::-;71936:41;;71984:21;72008:24;72018:13;72008:9;:24::i;:::-;71984:48;;72039:15;72088:7;;72064:13;72057:39;;;;:::i;:::-;72039:57;;72126:9;;72107:8;:29;72103:81;;-1:-1:-1;72166:9:0;;72103:81;72197:8;71781:430;-1:-1:-1;;;;71781:430:0:o;71414:361::-;71487:6;71510:17;71518:8;71510:7;:17::i;:::-;71502:61;;;;-1:-1:-1;;;71502:61:0;;;;;;;:::i;:::-;71651:8;;71570:15;71620:19;;;:9;:19;;;;;;71570:15;;71651:8;71589:51;;71596:15;71589:51;:::i;:::-;71588:72;;;;:::i;:::-;71570:90;;71690:9;;71671:8;:29;71667:81;;-1:-1:-1;71730:9:0;;71761:8;71414:361;-1:-1:-1;;71414:361:0:o;42657:287::-;34809:10;-1:-1:-1;;;;;42756:24:0;;;42752:54;;42789:17;;-1:-1:-1;;;42789:17:0;;;;;;;;;;;42752:54;34809:10;42819:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;42819:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;42819:53:0;;;;;;;;;;42888:48;;540:41:1;;;42819:42:0;;34809:10;42888:48;;513:18:1;42888:48:0;;;;;;;42657:287;;:::o;43743:370::-;43910:28;43920:4;43926:2;43930:7;43910:9;:28::i;:::-;-1:-1:-1;;;;;43953:13:0;;1435:19;:23;43949:157;;43974:56;44005:4;44011:2;44015:7;44024:5;43974:30;:56::i;:::-;43970:136;;44054:40;;-1:-1:-1;;;44054:40:0;;;;;;;;;;;71112:97;71162:13;71190;71183:20;;;;;:::i;9829:723::-;9885:13;10106:5;10115:1;10106:10;10102:53;;-1:-1:-1;;10133:10:0;;;;;;;;;;;;-1:-1:-1;;;10133:10:0;;;;;9829:723::o;10102:53::-;10180:5;10165:12;10221:78;10228:9;;10221:78;;10254:8;;;;:::i;:::-;;-1:-1:-1;10277:10:0;;-1:-1:-1;10285:2:0;10277:10;;:::i;:::-;;;10221:78;;;10309:19;10341:6;-1:-1:-1;;;;;10331:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10331:17:0;;10309:39;;10359:154;10366:10;;10359:154;;10393:11;10403:1;10393:11;;:::i;:::-;;-1:-1:-1;10462:10:0;10470:2;10462:5;:10;:::i;:::-;10449:24;;:2;:24;:::i;:::-;10436:39;;10419:6;10426;10419:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;10419:56:0;;;;;;;;-1:-1:-1;10490:11:0;10499:2;10490:11;;:::i;:::-;;;10359:154;;67645:567;67698:13;67721:16;;67766:32;67721:16;29713:5;67766:11;:32::i;:::-;67720:78;;;;67907:283;68019:33;68036:15;68019:16;:33::i;:::-;68094:51;68130:8;-1:-1:-1;;;;;68114:26:0;68142:2;68094:19;:51::i;:::-;67953:213;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67907:13;:283::i;:::-;67838:361;;;;;;;;:::i;:::-;;;;;;;;;;;;;67816:390;;;;67645:567;:::o;37754:305::-;37856:4;-1:-1:-1;;;;;;37893:40:0;;-1:-1:-1;;;37893:40:0;;:105;;-1:-1:-1;;;;;;;37950:48:0;;-1:-1:-1;;;37950:48:0;37893:105;:158;;;-1:-1:-1;;;;;;;;;;26409:40:0;;;38015:36;26300:157;53590:196;53705:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;53705:29:0;-1:-1:-1;;;;;53705:29:0;;;;;;;;;53750:28;;53705:24;;53750:28;;;;;;;53590:196;;;:::o;48538:2130::-;48653:35;48691:21;48704:7;48691:12;:21::i;:::-;48653:59;;48751:4;-1:-1:-1;;;;;48729:26:0;:13;:18;;;-1:-1:-1;;;;;48729:26:0;;48725:67;;48764:28;;-1:-1:-1;;;48764:28:0;;;;;;;;;;;48725:67;48805:22;34809:10;-1:-1:-1;;;;;48831:20:0;;;;:73;;-1:-1:-1;48868:36:0;48885:4;34809:10;43015:164;:::i;48868:36::-;48831:126;;;-1:-1:-1;34809:10:0;48921:20;48933:7;48921:11;:20::i;:::-;-1:-1:-1;;;;;48921:36:0;;48831:126;48805:153;;48976:17;48971:66;;49002:35;;-1:-1:-1;;;49002:35:0;;;;;;;;;;;48971:66;-1:-1:-1;;;;;49052:16:0;;49048:52;;49077:23;;-1:-1:-1;;;49077:23:0;;;;;;;;;;;49048:52;49113:43;49135:4;49141:2;49145:7;49154:1;49113:21;:43::i;:::-;49221:35;49238:1;49242:7;49251:4;49221:8;:35::i;:::-;-1:-1:-1;;;;;49552:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;49552:31:0;;;-1:-1:-1;;;;;49552:31:0;;;-1:-1:-1;;49552:31:0;;;;;;;49598:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;49598:29:0;;;;;;;;;;;49678:20;;;:11;:20;;;;;;49713:18;;-1:-1:-1;;;;;;49746:49:0;;;;-1:-1:-1;;;49779:15:0;49746:49;;;;;;;;;;50069:11;;50129:24;;;;;50172:13;;49678:20;;50129:24;;50172:13;50168:384;;50382:13;;50367:11;:28;50363:174;;50420:20;;50489:28;;;;-1:-1:-1;;;;;50463:54:0;-1:-1:-1;;;50463:54:0;-1:-1:-1;;;;;;50463:54:0;;;-1:-1:-1;;;;;50420:20:0;;50463:54;;;;50363:174;49527:1036;;;50599:7;50595:2;-1:-1:-1;;;;;50580:27:0;50589:4;-1:-1:-1;;;;;50580:27:0;-1:-1:-1;;;;;;;;;;;50580:27:0;;;;;;;;;50618:42;77808:163;45103:1749;45249:13;;-1:-1:-1;;;;;45277:16:0;;45273:48;;45302:19;;-1:-1:-1;;;45302:19:0;;;;;;;;;;;45273:48;45336:8;45348:1;45336:13;45332:44;;45358:18;;-1:-1:-1;;;45358:18:0;;;;;;;;;;;45332:44;45389:61;45419:1;45423:2;45427:12;45441:8;45389:21;:61::i;:::-;-1:-1:-1;;;;;45727:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;45786:49:0;;-1:-1:-1;;;;;45727:44:0;;;;;;;45786:49;;;;-1:-1:-1;;45727:44:0;;;;;;45786:49;;;;;;;;;;;;;;;;45852:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;45902:66:0;;;-1:-1:-1;;;45952:15:0;45902:66;;;;;;;;;;;;;45852:25;;46049:23;;;;1435:19;:23;46089:631;;46129:313;46160:38;;46185:12;;-1:-1:-1;;;;;46160:38:0;;;46177:1;;-1:-1:-1;;;;;;;;;;;46160:38:0;46177:1;;46160:38;46226:69;46265:1;46269:2;46273:14;;;;;;46289:5;46226:30;:69::i;:::-;46221:174;;46331:40;;-1:-1:-1;;;46331:40:0;;;;;;;;;;;46221:174;46437:3;46422:12;:18;46129:313;;46523:12;46506:13;;:29;46502:43;;46537:8;;;46502:43;46089:631;;;46586:119;46617:40;;46642:14;;;;;-1:-1:-1;;;;;46617:40:0;;;46634:1;;-1:-1:-1;;;;;;;;;;;46617:40:0;46634:1;;46617:40;46700:3;46685:12;:18;46586:119;;46089:631;-1:-1:-1;46734:13:0;:28;46784:60;46813:1;46817:2;46821:12;46835:8;46784:60;:::i;78394:495::-;78563:23;;;;:9;:23;;;;;78589:15;78563:41;;78573:12;;78675:23;78690:8;78573:12;78675:23;:::i;:::-;78661:37;;78709:101;78755:15;78727:9;:25;78737:14;;;;:::i;:::-;;;78727:25;;;;;;;;;;;:43;;;;78805:3;78790:12;:18;78709:101;;78552:337;;78394:495;;;;:::o;54278:667::-;54462:72;;-1:-1:-1;;;54462:72:0;;54441:4;;-1:-1:-1;;;;;54462:36:0;;;;;:72;;34809:10;;54513:4;;54519:7;;54528:5;;54462:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54462:72:0;;;;;;;;-1:-1:-1;;54462:72:0;;;;;;;;;;;;:::i;:::-;;;54458:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54696:6;:13;54713:1;54696:18;54692:235;;54742:40;;-1:-1:-1;;;54742:40:0;;;;;;;;;;;54692:235;54885:6;54879:13;54870:6;54866:2;54862:15;54855:38;54458:480;-1:-1:-1;;;;;;54581:55:0;-1:-1:-1;;;54581:55:0;;-1:-1:-1;54278:667:0;;;;;;:::o;11130:451::-;11205:13;11231:19;11263:10;11267:6;11263:1;:10;:::i;:::-;:14;;11276:1;11263:14;:::i;:::-;-1:-1:-1;;;;;11253:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11253:25:0;;11231:47;;-1:-1:-1;;;11289:6:0;11296:1;11289:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;11289:15:0;;;;;;;;;-1:-1:-1;;;11315:6:0;11322:1;11315:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;11315:15:0;;;;;;;;-1:-1:-1;11346:9:0;11358:10;11362:6;11358:1;:10;:::i;:::-;:14;;11371:1;11358:14;:::i;:::-;11346:26;;11341:135;11378:1;11374;:5;11341:135;;;-1:-1:-1;;;11426:5:0;11434:3;11426:11;11413:25;;;;;;;:::i;:::-;;;;11401:6;11408:1;11401:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;11401:37:0;;;;;;;;-1:-1:-1;11463:1:0;11453:11;;;;;11381:3;;;:::i;:::-;;;11341:135;;;-1:-1:-1;11494:10:0;;11486:55;;;;-1:-1:-1;;;11486:55:0;;25231:2:1;11486:55:0;;;25213:21:1;;;25250:18;;;25243:30;25309:34;25289:18;;;25282:62;25361:18;;11486:55:0;25029:356:1;11486:55:0;11566:6;11130:451;-1:-1:-1;;;11130:451:0:o;13070:3097::-;13128:13;13365:4;:11;13380:1;13365:16;13361:31;;-1:-1:-1;;13383:9:0;;;;;;;;;-1:-1:-1;13383:9:0;;;13070:3097::o;13361:31::-;13445:19;13467:6;;;;;;;;;;;;;;;;;13445:28;;13884:20;13943:1;13924:4;:11;13938:1;13924:15;;;;:::i;:::-;13923:21;;;;:::i;:::-;13918:27;;:1;:27;:::i;:::-;-1:-1:-1;;;;;13907:39:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13907:39:0;;13884:62;;14126:1;14119:5;14115:13;14230:2;14222:6;14218:15;14341:4;14393;14387:11;14381:4;14377:22;14303:1432;14427:6;14418:7;14415:19;14303:1432;;;14533:1;14524:7;14520:15;14509:26;;14572:7;14566:14;15225:4;15217:5;15213:2;15209:14;15205:25;15195:8;15191:40;15185:47;15174:9;15166:67;15279:1;15268:9;15264:17;15251:30;;15371:4;15363:5;15359:2;15355:14;15351:25;15341:8;15337:40;15331:47;15320:9;15312:67;15425:1;15414:9;15410:17;15397:30;;15516:4;15508:5;15505:1;15501:13;15497:24;15487:8;15483:39;15477:46;15466:9;15458:66;15570:1;15559:9;15555:17;15542:30;;15653:4;15646:5;15642:16;15632:8;15628:31;15622:38;15611:9;15603:58;;15707:1;15696:9;15692:17;15679:30;;14303:1432;;;14307:107;;15897:1;15890:4;15884:11;15880:19;15918:1;15913:123;;;;16055:1;16050:73;;;;15873:250;;15913:123;15966:4;15962:1;15951:9;15947:17;15939:32;16016:4;16012:1;16001:9;15997:17;15989:32;15913:123;;16050:73;16103:4;16099:1;16088:9;16084:17;16076:32;15873:250;-1:-1:-1;16153:6:0;;13070:3097;-1:-1:-1;;;;;13070:3097:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:131::-;-1:-1:-1;;;;;667:31:1;;657:42;;647:70;;713:1;710;703:12;728:435;795:6;803;856:2;844:9;835:7;831:23;827:32;824:52;;;872:1;869;862:12;824:52;911:9;898:23;930:31;955:5;930:31;:::i;:::-;980:5;-1:-1:-1;1037:2:1;1022:18;;1009:32;-1:-1:-1;;;;;1072:40:1;;1060:53;;1050:81;;1127:1;1124;1117:12;1050:81;1150:7;1140:17;;;728:435;;;;;:::o;1168:258::-;1240:1;1250:113;1264:6;1261:1;1258:13;1250:113;;;1340:11;;;1334:18;1321:11;;;1314:39;1286:2;1279:10;1250:113;;;1381:6;1378:1;1375:13;1372:48;;;-1:-1:-1;;1416:1:1;1398:16;;1391:27;1168:258::o;1431:::-;1473:3;1511:5;1505:12;1538:6;1533:3;1526:19;1554:63;1610:6;1603:4;1598:3;1594:14;1587:4;1580:5;1576:16;1554:63;:::i;:::-;1671:2;1650:15;-1:-1:-1;;1646:29:1;1637:39;;;;1678:4;1633:50;;1431:258;-1:-1:-1;;1431:258:1:o;1694:220::-;1843:2;1832:9;1825:21;1806:4;1863:45;1904:2;1893:9;1889:18;1881:6;1863:45;:::i;1919:180::-;1978:6;2031:2;2019:9;2010:7;2006:23;2002:32;1999:52;;;2047:1;2044;2037:12;1999:52;-1:-1:-1;2070:23:1;;1919:180;-1:-1:-1;1919:180:1:o;2312:315::-;2380:6;2388;2441:2;2429:9;2420:7;2416:23;2412:32;2409:52;;;2457:1;2454;2447:12;2409:52;2496:9;2483:23;2515:31;2540:5;2515:31;:::i;:::-;2565:5;2617:2;2602:18;;;;2589:32;;-1:-1:-1;;;2312:315:1:o;2814:456::-;2891:6;2899;2907;2960:2;2948:9;2939:7;2935:23;2931:32;2928:52;;;2976:1;2973;2966:12;2928:52;3015:9;3002:23;3034:31;3059:5;3034:31;:::i;:::-;3084:5;-1:-1:-1;3141:2:1;3126:18;;3113:32;3154:33;3113:32;3154:33;:::i;:::-;2814:456;;3206:7;;-1:-1:-1;;;3260:2:1;3245:18;;;;3232:32;;2814:456::o;3275:118::-;3361:5;3354:13;3347:21;3340:5;3337:32;3327:60;;3383:1;3380;3373:12;3398:241;3454:6;3507:2;3495:9;3486:7;3482:23;3478:32;3475:52;;;3523:1;3520;3513:12;3475:52;3562:9;3549:23;3581:28;3603:5;3581:28;:::i;3644:248::-;3712:6;3720;3773:2;3761:9;3752:7;3748:23;3744:32;3741:52;;;3789:1;3786;3779:12;3741:52;-1:-1:-1;;3812:23:1;;;3882:2;3867:18;;;3854:32;;-1:-1:-1;3644:248:1:o;4416:247::-;4475:6;4528:2;4516:9;4507:7;4503:23;4499:32;4496:52;;;4544:1;4541;4534:12;4496:52;4583:9;4570:23;4602:31;4627:5;4602:31;:::i;4668:632::-;4839:2;4891:21;;;4961:13;;4864:18;;;4983:22;;;4810:4;;4839:2;5062:15;;;;5036:2;5021:18;;;4810:4;5105:169;5119:6;5116:1;5113:13;5105:169;;;5180:13;;5168:26;;5249:15;;;;5214:12;;;;5141:1;5134:9;5105:169;;;-1:-1:-1;5291:3:1;;4668:632;-1:-1:-1;;;;;;4668:632:1:o;5305:127::-;5366:10;5361:3;5357:20;5354:1;5347:31;5397:4;5394:1;5387:15;5421:4;5418:1;5411:15;5437:275;5508:2;5502:9;5573:2;5554:13;;-1:-1:-1;;5550:27:1;5538:40;;-1:-1:-1;;;;;5593:34:1;;5629:22;;;5590:62;5587:88;;;5655:18;;:::i;:::-;5691:2;5684:22;5437:275;;-1:-1:-1;5437:275:1:o;5717:407::-;5782:5;-1:-1:-1;;;;;5808:6:1;5805:30;5802:56;;;5838:18;;:::i;:::-;5876:57;5921:2;5900:15;;-1:-1:-1;;5896:29:1;5927:4;5892:40;5876:57;:::i;:::-;5867:66;;5956:6;5949:5;5942:21;5996:3;5987:6;5982:3;5978:16;5975:25;5972:45;;;6013:1;6010;6003:12;5972:45;6062:6;6057:3;6050:4;6043:5;6039:16;6026:43;6116:1;6109:4;6100:6;6093:5;6089:18;6085:29;6078:40;5717:407;;;;;:::o;6129:451::-;6198:6;6251:2;6239:9;6230:7;6226:23;6222:32;6219:52;;;6267:1;6264;6257:12;6219:52;6307:9;6294:23;-1:-1:-1;;;;;6332:6:1;6329:30;6326:50;;;6372:1;6369;6362:12;6326:50;6395:22;;6448:4;6440:13;;6436:27;-1:-1:-1;6426:55:1;;6477:1;6474;6467:12;6426:55;6500:74;6566:7;6561:2;6548:16;6543:2;6539;6535:11;6500:74;:::i;6585:712::-;6639:5;6692:3;6685:4;6677:6;6673:17;6669:27;6659:55;;6710:1;6707;6700:12;6659:55;6746:6;6733:20;6772:4;-1:-1:-1;;;;;6791:2:1;6788:26;6785:52;;;6817:18;;:::i;:::-;6863:2;6860:1;6856:10;6886:28;6910:2;6906;6902:11;6886:28;:::i;:::-;6948:15;;;7018;;;7014:24;;;6979:12;;;;7050:15;;;7047:35;;;7078:1;7075;7068:12;7047:35;7114:2;7106:6;7102:15;7091:26;;7126:142;7142:6;7137:3;7134:15;7126:142;;;7208:17;;7196:30;;7159:12;;;;7246;;;;7126:142;;;7286:5;6585:712;-1:-1:-1;;;;;;;6585:712:1:o;7302:483::-;7395:6;7403;7456:2;7444:9;7435:7;7431:23;7427:32;7424:52;;;7472:1;7469;7462:12;7424:52;7511:9;7498:23;7530:31;7555:5;7530:31;:::i;:::-;7580:5;-1:-1:-1;7636:2:1;7621:18;;7608:32;-1:-1:-1;;;;;7652:30:1;;7649:50;;;7695:1;7692;7685:12;7649:50;7718:61;7771:7;7762:6;7751:9;7747:22;7718:61;:::i;:::-;7708:71;;;7302:483;;;;;:::o;7975:382::-;8040:6;8048;8101:2;8089:9;8080:7;8076:23;8072:32;8069:52;;;8117:1;8114;8107:12;8069:52;8156:9;8143:23;8175:31;8200:5;8175:31;:::i;:::-;8225:5;-1:-1:-1;8282:2:1;8267:18;;8254:32;8295:30;8254:32;8295:30;:::i;8362:795::-;8457:6;8465;8473;8481;8534:3;8522:9;8513:7;8509:23;8505:33;8502:53;;;8551:1;8548;8541:12;8502:53;8590:9;8577:23;8609:31;8634:5;8609:31;:::i;:::-;8659:5;-1:-1:-1;8716:2:1;8701:18;;8688:32;8729:33;8688:32;8729:33;:::i;:::-;8781:7;-1:-1:-1;8835:2:1;8820:18;;8807:32;;-1:-1:-1;8890:2:1;8875:18;;8862:32;-1:-1:-1;;;;;8906:30:1;;8903:50;;;8949:1;8946;8939:12;8903:50;8972:22;;9025:4;9017:13;;9013:27;-1:-1:-1;9003:55:1;;9054:1;9051;9044:12;9003:55;9077:74;9143:7;9138:2;9125:16;9120:2;9116;9112:11;9077:74;:::i;:::-;9067:84;;;8362:795;;;;;;;:::o;9162:416::-;9255:6;9263;9316:2;9304:9;9295:7;9291:23;9287:32;9284:52;;;9332:1;9329;9322:12;9284:52;9368:9;9355:23;9345:33;;9429:2;9418:9;9414:18;9401:32;-1:-1:-1;;;;;9448:6:1;9445:30;9442:50;;;9488:1;9485;9478:12;9583:315;9651:6;9659;9712:2;9700:9;9691:7;9687:23;9683:32;9680:52;;;9728:1;9725;9718:12;9680:52;9764:9;9751:23;9741:33;;9824:2;9813:9;9809:18;9796:32;9837:31;9862:5;9837:31;:::i;9903:388::-;9971:6;9979;10032:2;10020:9;10011:7;10007:23;10003:32;10000:52;;;10048:1;10045;10038:12;10000:52;10087:9;10074:23;10106:31;10131:5;10106:31;:::i;:::-;10156:5;-1:-1:-1;10213:2:1;10198:18;;10185:32;10226:33;10185:32;10226:33;:::i;10296:380::-;10375:1;10371:12;;;;10418;;;10439:61;;10493:4;10485:6;10481:17;10471:27;;10439:61;10546:2;10538:6;10535:14;10515:18;10512:38;10509:161;;10592:10;10587:3;10583:20;10580:1;10573:31;10627:4;10624:1;10617:15;10655:4;10652:1;10645:15;10509:161;;10296:380;;;:::o;10990:245::-;11057:6;11110:2;11098:9;11089:7;11085:23;11081:32;11078:52;;;11126:1;11123;11116:12;11078:52;11158:9;11152:16;11177:28;11199:5;11177:28;:::i;11240:127::-;11301:10;11296:3;11292:20;11289:1;11282:31;11332:4;11329:1;11322:15;11356:4;11353:1;11346:15;11372:168;11412:7;11478:1;11474;11470:6;11466:14;11463:1;11460:21;11455:1;11448:9;11441:17;11437:45;11434:71;;;11485:18;;:::i;:::-;-1:-1:-1;11525:9:1;;11372:168::o;11545:127::-;11606:10;11601:3;11597:20;11594:1;11587:31;11637:4;11634:1;11627:15;11661:4;11658:1;11651:15;11677:120;11717:1;11743;11733:35;;11748:18;;:::i;:::-;-1:-1:-1;11782:9:1;;11677:120::o;11802:355::-;12004:2;11986:21;;;12043:2;12023:18;;;12016:30;12082:33;12077:2;12062:18;;12055:61;12148:2;12133:18;;11802:355::o;12917:128::-;12957:3;12988:1;12984:6;12981:1;12978:13;12975:39;;;12994:18;;:::i;:::-;-1:-1:-1;13030:9:1;;12917:128::o;13759:336::-;13961:2;13943:21;;;14000:2;13980:18;;;13973:30;-1:-1:-1;;;14034:2:1;14019:18;;14012:42;14086:2;14071:18;;13759:336::o;14310:251::-;14380:6;14433:2;14421:9;14412:7;14408:23;14404:32;14401:52;;;14449:1;14446;14439:12;14401:52;14481:9;14475:16;14500:31;14525:5;14500:31;:::i;14566:135::-;14605:3;14626:17;;;14623:43;;14646:18;;:::i;:::-;-1:-1:-1;14693:1:1;14682:13;;14566:135::o;14706:127::-;14767:10;14762:3;14758:20;14755:1;14748:31;14798:4;14795:1;14788:15;14822:4;14819:1;14812:15;15678:355;15880:2;15862:21;;;15919:2;15899:18;;;15892:30;15958:33;15953:2;15938:18;;15931:61;16024:2;16009:18;;15678:355::o;16509:973::-;16594:12;;16559:3;;16649:1;16669:18;;;;16722;;;;16749:61;;16803:4;16795:6;16791:17;16781:27;;16749:61;16829:2;16877;16869:6;16866:14;16846:18;16843:38;16840:161;;16923:10;16918:3;16914:20;16911:1;16904:31;16958:4;16955:1;16948:15;16986:4;16983:1;16976:15;16840:161;17017:18;17044:104;;;;17162:1;17157:319;;;;17010:466;;17044:104;-1:-1:-1;;17077:24:1;;17065:37;;17122:16;;;;-1:-1:-1;17044:104:1;;17157:319;16456:1;16449:14;;;16493:4;16480:18;;17251:1;17265:165;17279:6;17276:1;17273:13;17265:165;;;17357:14;;17344:11;;;17337:35;17400:16;;;;17294:10;;17265:165;;;17269:3;;17459:6;17454:3;17450:16;17443:23;;17010:466;;;;;;;16509:973;;;;:::o;17487:888::-;17860:3;17898:6;17892:13;17914:53;17960:6;17955:3;17948:4;17940:6;17936:17;17914:53;:::i;:::-;18030:13;;17989:16;;;;18052:57;18030:13;17989:16;18086:4;18074:17;;18052:57;:::i;:::-;-1:-1:-1;;;18131:20:1;;18160:18;;;18203:13;;18225:65;18203:13;18277:1;18266:13;;18259:4;18247:17;;18225:65;:::i;:::-;18306:63;18366:1;18355:8;18348:5;18344:20;18340:28;18332:6;18306:63;:::i;:::-;18299:70;17487:888;-1:-1:-1;;;;;;;;17487:888:1:o;18380:550::-;18604:3;18642:6;18636:13;18658:53;18704:6;18699:3;18692:4;18684:6;18680:17;18658:53;:::i;:::-;18774:13;;18733:16;;;;18796:57;18774:13;18733:16;18830:4;18818:17;;18796:57;:::i;:::-;18869:55;18914:8;18907:5;18903:20;18895:6;18869:55;:::i;21941:193::-;21980:1;22006;21996:35;;22011:18;;:::i;:::-;-1:-1:-1;;;22047:18:1;;-1:-1:-1;;22067:13:1;;22043:38;22040:64;;;22084:18;;:::i;:::-;-1:-1:-1;22118:10:1;;21941:193::o;22139:267::-;22178:4;22207:9;;;22232:10;;-1:-1:-1;;;22251:19:1;;22244:27;;22228:44;22225:70;;;22275:18;;:::i;:::-;-1:-1:-1;;;;;22322:27:1;;22315:35;;22307:44;;22304:70;;;22354:18;;:::i;:::-;-1:-1:-1;;22391:9:1;;22139:267::o;22411:125::-;22451:4;22479:1;22476;22473:8;22470:34;;;22484:18;;:::i;:::-;-1:-1:-1;22521:9:1;;22411:125::o;22541:112::-;22573:1;22599;22589:35;;22604:18;;:::i;:::-;-1:-1:-1;22638:9:1;;22541:112::o;22658:1024::-;23170:66;23165:3;23158:79;23140:3;23266:6;23260:13;23282:62;23337:6;23332:2;23327:3;23323:12;23316:4;23308:6;23304:17;23282:62;:::i;:::-;-1:-1:-1;;;23403:2:1;23363:16;;;23395:11;;;23388:71;23484:13;;23506:63;23484:13;23555:2;23547:11;;23540:4;23528:17;;23506:63;:::i;:::-;-1:-1:-1;;;23629:2:1;23588:17;;;;23621:11;;;23614:35;23673:2;23665:11;;22658:1024;-1:-1:-1;;;;22658:1024:1:o;23687:448::-;23949:31;23944:3;23937:44;23919:3;24010:6;24004:13;24026:62;24081:6;24076:2;24071:3;24067:12;24060:4;24052:6;24048:17;24026:62;:::i;:::-;24108:16;;;;24126:2;24104:25;;23687:448;-1:-1:-1;;23687:448:1:o;24140:489::-;-1:-1:-1;;;;;24409:15:1;;;24391:34;;24461:15;;24456:2;24441:18;;24434:43;24508:2;24493:18;;24486:34;;;24556:3;24551:2;24536:18;;24529:31;;;24334:4;;24577:46;;24603:19;;24595:6;24577:46;:::i;:::-;24569:54;24140:489;-1:-1:-1;;;;;;24140:489:1:o;24634:249::-;24703:6;24756:2;24744:9;24735:7;24731:23;24727:32;24724:52;;;24772:1;24769;24762:12;24724:52;24804:9;24798:16;24823:30;24847:5;24823:30;:::i;24888:136::-;24927:3;24955:5;24945:39;;24964:18;;:::i;:::-;-1:-1:-1;;;25000:18:1;;24888:136::o
Swarm Source
ipfs://61e84593d10c60fdd68fd2e828407692c705e10e85c3f74e48a6c4a1b0bd92d3
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.