ERC-721
Overview
Max Total Supply
2,256 MITA
Holders
718
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 MITALoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
mitaverse
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-02-23 */ // File: contracts/operator-filter/lib/Constants.sol pragma solidity ^0.8.17; address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E; address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6; // File: contracts/operator-filter/IOperatorFilterRegistry.sol pragma solidity ^0.8.13; interface IOperatorFilterRegistry { /** * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns * true if supplied registrant address is not registered. */ function isOperatorAllowed(address registrant, address operator) external view returns (bool); /** * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner. */ function register(address registrant) external; /** * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes. */ function registerAndSubscribe(address registrant, address subscription) external; /** * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another * address without subscribing. */ function registerAndCopyEntries(address registrant, address registrantToCopy) external; /** * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner. * Note that this does not remove any filtered addresses or codeHashes. * Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes. */ function unregister(address addr) external; /** * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered. */ function updateOperator(address registrant, address operator, bool filtered) external; /** * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates. */ function updateOperators(address registrant, address[] calldata operators, bool filtered) external; /** * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered. */ function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; /** * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates. */ function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; /** * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous * subscription if present. * Note that accounts with subscriptions may go on to subscribe to other accounts - in this case, * subscriptions will not be forwarded. Instead the former subscription's existing entries will still be * used. */ function subscribe(address registrant, address registrantToSubscribe) external; /** * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes. */ function unsubscribe(address registrant, bool copyExistingEntries) external; /** * @notice Get the subscription address of a given registrant, if any. */ function subscriptionOf(address addr) external returns (address registrant); /** * @notice Get the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscribers(address registrant) external returns (address[] memory); /** * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscriberAt(address registrant, uint256 index) external returns (address); /** * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr. */ function copyEntriesOf(address registrant, address registrantToCopy) external; /** * @notice Returns true if operator is filtered by a given address or its subscription. */ function isOperatorFiltered(address registrant, address operator) external returns (bool); /** * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription. */ function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); /** * @notice Returns true if a codeHash is filtered by a given address or its subscription. */ function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); /** * @notice Returns a list of filtered operators for a given address or its subscription. */ function filteredOperators(address addr) external returns (address[] memory); /** * @notice Returns the set of filtered codeHashes for a given address or its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashes(address addr) external returns (bytes32[] memory); /** * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredOperatorAt(address registrant, uint256 index) external returns (address); /** * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); /** * @notice Returns true if an address has registered */ function isRegistered(address addr) external returns (bool); /** * @dev Convenience method to compute the code hash of an arbitrary contract */ function codeHashOf(address addr) external returns (bytes32); } // File: contracts/operator-filter/OperatorFilterer.sol 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. * Please note that if your token contract does not provide an owner with EIP-173, it must provide * administration methods on the contract itself to interact with the registry otherwise the subscription * will be locked to the options set during construction. */ abstract contract OperatorFilterer { /// @dev Emitted when an operator is not allowed. error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS); /// @dev The constructor that is called when the contract is being deployed. 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)); } } } } /** * @dev A helper function to check if an operator is allowed. */ modifier onlyAllowedOperator(address from) virtual { // 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) { _checkFilterOperator(msg.sender); } _; } /** * @dev A helper function to check if an operator approval is allowed. */ modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } /** * @dev A helper function to check if an operator is allowed. */ function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { // under normal circumstances, this function will revert rather than return false, but inheriting contracts // may specify their own OperatorFilterRegistry implementations, which may behave differently if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } } // File: contracts/operator-filter/DefaultOperatorFilterer.sol pragma solidity ^0.8.13; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. * @dev Please note that if your token contract does not provide an owner with EIP-173, it must provide * administration methods on the contract itself to interact with the registry otherwise the subscription * will be locked to the options set during construction. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { /// @dev The constructor that is called when the contract is being deployed. constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {} } // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/[email protected]/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File: @openzeppelin/[email protected]/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/[email protected]/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _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) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/[email protected]/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/[email protected]/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/[email protected]/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/[email protected]/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/[email protected]/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.8.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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/[email protected]/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/[email protected]/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(account), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: @openzeppelin/[email protected]/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256, /* firstTokenId */ uint256 batchSize ) internal virtual { if (batchSize > 1) { if (from != address(0)) { _balances[from] -= batchSize; } if (to != address(0)) { _balances[to] += batchSize; } } } /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} } // File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721Burnable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Burnable.sol) pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _burn(tokenId); } } // File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721URIStorage.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev See {ERC721-_burn}. This override additionally checks to see if a * token-specific URI was set for the token, and if so, it deletes the token URI from * the storage mapping. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual override { super._beforeTokenTransfer(from, to, firstTokenId, batchSize); if (batchSize > 1) { // Will only trigger during construction. Batch transferring (minting) is not available afterwards. revert("ERC721Enumerable: consecutive transfers not supported"); } uint256 tokenId = firstTokenId; if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: @openzeppelin/[email protected]/interfaces/IERC2981.sol // 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); } // File: @openzeppelin/[email protected]/token/common/ERC2981.sol // 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]; } } // File: contracts/user-sm/mitaverse/mitaverse.sol pragma solidity ^0.8.9; contract mitaverse is ERC721, ERC721Enumerable, ERC721URIStorage, AccessControl, ERC721Burnable, DefaultOperatorFilterer, ERC2981 { bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); string private metadataUri; string private metadataSuffix = ""; bool private _paused; uint256 public maxSupply; uint256 public tokenId; address public owner; mapping(uint256 => uint256) public rarity; struct SaleInfo { uint256 amount; uint256 price; uint64 startTime; uint64 endTime; uint256 startId; bytes32 merkleRoot; uint256 perTx; uint256 perWallet; uint256 maxLimit; uint256 minted; } mapping(uint16 => SaleInfo) public saleInfos; mapping(uint16 => mapping(address => uint256)) public mintLogs; uint16 public saleInfoNum = 0; bool private isRevealed = false; event Paused(address account); event Unpaused(address account); constructor( string memory name, string memory symbol, uint256 _maxSupply ) ERC721(name, symbol) { _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); _grantRole(PAUSER_ROLE, msg.sender); _grantRole(MINTER_ROLE, msg.sender); tokenId = 1; maxSupply = _maxSupply; owner = msg.sender; } // ============================================================= // INTERNAL METHODS // ============================================================= function _logMint(address addr, uint16 step, uint256 quantity) private { mintLogs[step][addr] += quantity; saleInfos[step].minted += quantity; } function _checkIsMintable(address addr, uint16 step, uint256 quantity) internal returns (bool) { if (step >= saleInfoNum) revert("Not exist mint step"); SaleInfo memory saleInfo = saleInfos[step]; if (block.timestamp < saleInfo.startTime) revert("Minting hasn't started yet"); if (block.timestamp > saleInfo.endTime) revert("Minting has ended"); if (saleInfo.amount < saleInfo.minted + quantity) revert("Sold out in this step"); if (tokenId + quantity - 1 > maxSupply) revert("Sold out for total supply"); if (saleInfo.maxLimit != 0 && tokenId + quantity - 1 > saleInfo.maxLimit) revert("Sold out for max limit"); if (saleInfo.perTx != 0 && saleInfo.perTx < quantity) revert("Exceeds the maximum number of mints per transaction"); if (saleInfo.perWallet != 0 && saleInfo.perWallet < mintLogs[step][addr] + quantity) revert("Exceeds the maximum number of mints per wallet"); if (quantity == 0) revert("Invalid quantity"); if (msg.sender == addr && msg.value != saleInfo.price * quantity) revert("Invalid value"); return true; } function _beforeTokenTransfer(address from, address to, uint256 _tokenId, uint256 batchSize) internal override(ERC721, ERC721Enumerable) { if(!paused() || from == address(0)) super._beforeTokenTransfer(from, to, _tokenId, batchSize); else revert("Pasused"); } function _burn(uint256 _tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(_tokenId); } function transferOwnership(address newOwner) public onlyRole(DEFAULT_ADMIN_ROLE) { _grantRole(DEFAULT_ADMIN_ROLE, newOwner); _grantRole(PAUSER_ROLE, newOwner); _grantRole(MINTER_ROLE, newOwner); _revokeRole(PAUSER_ROLE, msg.sender); _revokeRole(MINTER_ROLE, msg.sender); _revokeRole(DEFAULT_ADMIN_ROLE, msg.sender); owner = newOwner; } function _pause() internal virtual { _paused = true; emit Paused(_msgSender()); } function _unpause() internal virtual { _paused = false; emit Unpaused(_msgSender()); } // ============================================================= // MINT METHODS // ============================================================= function airdrop(address to, uint256 amount) public onlyRole(MINTER_ROLE) { if(tokenId + amount - 1 > maxSupply) revert("Sold out for max supply"); for(uint256 i = 0; i < amount; i++) { _safeMint(to, tokenId); tokenId++; } } function mint( uint16 step, uint8 amount, bytes32[] memory proof ) external payable { SaleInfo memory saleInfo = saleInfos[step]; _checkIsMintable(msg.sender, step, amount); if (!isWhiteListed(msg.sender, proof, step)) revert("Not in whitelist"); for(uint256 i = 0; i < amount; i++) { _safeMint(msg.sender, saleInfo.startId + saleInfo.minted + i); tokenId++; } _logMint(msg.sender, step, amount); } function setSaleInfoList( uint256[] memory amounts, uint256[] memory prices, uint64[] memory startTimes, uint64[] memory endTimes, uint256[] memory startIds, bytes32[] memory merkleRoots, uint256[] memory perTxs, uint256[] memory perWallets, uint256[] memory maxLimits, uint16 startIdx ) external onlyRole(MINTER_ROLE) { require(startIdx <= saleInfoNum, "startIdx is out of range"); for (uint16 i = 0; i < amounts.length; i++) saleInfos[i + startIdx] = SaleInfo( amounts[i], prices[i], startTimes[i], endTimes[i], startIds[i], merkleRoots[i], perTxs[i], perWallets[i], maxLimits[i], saleInfos[i + startIdx].minted ); if (startIdx + amounts.length > saleInfoNum) saleInfoNum = startIdx + uint16(amounts.length); } function isWhiteListed( address _account, bytes32[] memory _proof, uint16 step ) public view returns (bool) { return saleInfos[step].merkleRoot == 0x0 || MerkleProof.verify(_proof, saleInfos[step].merkleRoot, leaf(_account)); } function leaf(address _account) internal pure returns (bytes32) { return keccak256(abi.encodePacked(_account)); } function withdraw(uint256 amount) public onlyRole(DEFAULT_ADMIN_ROLE) { payable(msg.sender).transfer(amount); } function currentTime() public view returns(uint256) { return block.timestamp; } // ============================================================= // TOKEN METHODS // ============================================================= function tokensOfOwner(address owner_) public view virtual returns (uint256[] memory) { uint256 balance = balanceOf(owner_); uint256[] memory result = new uint256[](balance); for (uint256 i = 0; i < balance; i++) { result[i] = tokenOfOwnerByIndex(owner_, i); } return result; } function setMaxSupply(uint256 _amount) public onlyRole(MINTER_ROLE) { maxSupply = _amount; } function tokenURI(uint256 _tokenId) public view virtual override(ERC721, ERC721URIStorage) returns (string memory) { require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token"); if (!isRevealed) return string(abi.encodePacked(metadataUri, metadataSuffix)); return string(abi.encodePacked(metadataUri, Strings.toString(_tokenId), metadataSuffix)); } function contractURI() public view returns (string memory) { return string(abi.encodePacked(metadataUri, "contract", metadataSuffix)); } function setMetadata(string calldata _metadataUri, string calldata _metadataSuffix, bool _isReveal) external onlyRole(MINTER_ROLE) { metadataUri = _metadataUri; metadataSuffix = _metadataSuffix; isRevealed = _isReveal; } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable, AccessControl, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } function setApprovalForAll(address operator, bool approved) public override(ERC721, IERC721) onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } /** * @dev See {IERC721-approve}. * In this example the added modifier ensures that the operator is allowed by the OperatorFilterRegistry. */ function approve(address operator, uint256 _tokenId) public override(ERC721, IERC721) onlyAllowedOperatorApproval(operator) { super.approve(operator, _tokenId); } /** * @dev See {IERC721-transferFrom}. * In this example the added modifier ensures that the operator is allowed by the OperatorFilterRegistry. */ function transferFrom(address from, address to, uint256 _tokenId) public override(ERC721, IERC721) onlyAllowedOperator(from) { super.transferFrom(from, to, _tokenId); } /** * @dev See {IERC721-safeTransferFrom}. * In this example the added modifier ensures that the operator is allowed by the OperatorFilterRegistry. */ function safeTransferFrom(address from, address to, uint256 _tokenId) public override(ERC721, IERC721) onlyAllowedOperator(from) { super.safeTransferFrom(from, to, _tokenId); } /** * @dev See {IERC721-safeTransferFrom}. * In this example the added modifier ensures that the operator is allowed by the OperatorFilterRegistry. */ function safeTransferFrom(address from, address to, uint256 _tokenId, bytes memory data) public override(ERC721, IERC721) onlyAllowedOperator(from) { super.safeTransferFrom(from, to, _tokenId, data); } function pause() public onlyRole(PAUSER_ROLE) { _pause(); } function unpause() public onlyRole(PAUSER_ROLE) { _unpause(); } function paused() public view virtual returns (bool) { return _paused; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","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":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"uint16","name":"step","type":"uint16"}],"name":"isWhiteListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"step","type":"uint16"},{"internalType":"uint8","name":"amount","type":"uint8"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"address","name":"","type":"address"}],"name":"mintLogs","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":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rarity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","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":[],"name":"saleInfoNum","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"saleInfos","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint64","name":"startTime","type":"uint64"},{"internalType":"uint64","name":"endTime","type":"uint64"},{"internalType":"uint256","name":"startId","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"perTx","type":"uint256"},{"internalType":"uint256","name":"perWallet","type":"uint256"},{"internalType":"uint256","name":"maxLimit","type":"uint256"},{"internalType":"uint256","name":"minted","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_metadataUri","type":"string"},{"internalType":"string","name":"_metadataSuffix","type":"string"},{"internalType":"bool","name":"_isReveal","type":"bool"}],"name":"setMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"prices","type":"uint256[]"},{"internalType":"uint64[]","name":"startTimes","type":"uint64[]"},{"internalType":"uint64[]","name":"endTimes","type":"uint64[]"},{"internalType":"uint256[]","name":"startIds","type":"uint256[]"},{"internalType":"bytes32[]","name":"merkleRoots","type":"bytes32[]"},{"internalType":"uint256[]","name":"perTxs","type":"uint256[]"},{"internalType":"uint256[]","name":"perWallets","type":"uint256[]"},{"internalType":"uint256[]","name":"maxLimits","type":"uint256[]"},{"internalType":"uint16","name":"startIdx","type":"uint16"}],"name":"setSaleInfoList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a060405260006080908152600f906200001a9082620003a9565b506017805462ffffff191690553480156200003457600080fd5b50604051620043e3380380620043e3833981016040819052620000579162000524565b733cc6cdda760b79bafa08df41ecfa224f810dceb66001848460006200007e8382620003a9565b5060016200008d8282620003a9565b5050506daaeb6d7670e522a718067333cd4e3b15620001d55780156200012357604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200010457600080fd5b505af115801562000119573d6000803e3d6000fd5b50505050620001d5565b6001600160a01b03821615620001745760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401620000e9565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b158015620001bb57600080fd5b505af1158015620001d0573d6000803e3d6000fd5b505050505b50620001e590506000336200025f565b620002117f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a336200025f565b6200023d7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6336200025f565b60016012556011555050601380546001600160a01b0319163317905562000597565b6000828152600b602090815260408083206001600160a01b038516845290915290205460ff1662000300576000828152600b602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620002bf3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200032f57607f821691505b6020821081036200035057634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003a457600081815260208120601f850160051c810160208610156200037f5750805b601f850160051c820191505b81811015620003a0578281556001016200038b565b5050505b505050565b81516001600160401b03811115620003c557620003c562000304565b620003dd81620003d684546200031a565b8462000356565b602080601f831160018114620004155760008415620003fc5750858301515b600019600386901b1c1916600185901b178555620003a0565b600085815260208120601f198616915b82811015620004465788860151825594840194600190910190840162000425565b5085821015620004655787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600082601f8301126200048757600080fd5b81516001600160401b0380821115620004a457620004a462000304565b604051601f8301601f19908116603f01168101908282118183101715620004cf57620004cf62000304565b81604052838152602092508683858801011115620004ec57600080fd5b600091505b83821015620005105785820183015181830184015290820190620004f1565b600093810190920192909252949350505050565b6000806000606084860312156200053a57600080fd5b83516001600160401b03808211156200055257600080fd5b620005608783880162000475565b945060208601519150808211156200057757600080fd5b50620005868682870162000475565b925050604084015190509250925092565b613e3c80620005a76000396000f3fe6080604052600436106102935760003560e01c80636f8b44b01161015a578063bbd04845116100c1578063d5abeb011161007a578063d5abeb01146108cf578063e63ab1e9146108e5578063e8a3d48514610907578063e985e9c51461091c578063f2fde38b14610965578063f3ee5cb81461098557600080fd5b8063bbd0484514610827578063bfdf0ca71461083a578063c87b56dd1461085a578063d18e81b31461087a578063d53913931461088d578063d547741f146108af57600080fd5b80638da5cb5b116101135780638da5cb5b1461077d57806391d148541461079d57806395d89b41146107bd578063a217fddf146107d2578063a22cb465146107e7578063b88d4fde1461080757600080fd5b80636f8b44b0146106ae57806370a08231146106ce5780638456cb59146106ee5780638462151c146107035780638b58c569146107305780638ba4cc3c1461075d57600080fd5b80632e1a7d4d116101fe57806342842e0e116101b757806342842e0e1461054e57806342966c681461056e5780634f6ccce71461058e5780635c975abb146105ae5780636352211e146105c65780636dc0055a146105e657600080fd5b80632e1a7d4d146104975780632f2ff15d146104b75780632f745c59146104d757806336568abe146104f75780633f4ba83a1461051757806341f434341461052c57600080fd5b806317d70f7c1161025057806317d70f7c1461039757806318160ddd146103bb578063227d33e6146103d057806323b872dd14610408578063248a9ca3146104285780632a55205a1461045857600080fd5b806301ffc9a71461029857806306fdde03146102cd578063081812fc146102ef578063095ea7b3146103275780630d0163121461034957806311f105a914610369575b600080fd5b3480156102a457600080fd5b506102b86102b3366004613130565b6109a5565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102e26109b6565b6040516102c4919061319d565b3480156102fb57600080fd5b5061030f61030a3660046131b0565b610a48565b6040516001600160a01b0390911681526020016102c4565b34801561033357600080fd5b506103476103423660046131e5565b610a6f565b005b34801561035557600080fd5b506102b86103643660046132f5565b610a88565b34801561037557600080fd5b506017546103849061ffff1681565b60405161ffff90911681526020016102c4565b3480156103a357600080fd5b506103ad60125481565b6040519081526020016102c4565b3480156103c757600080fd5b506008546103ad565b3480156103dc57600080fd5b506103ad6103eb366004613352565b601660209081526000928352604080842090915290825290205481565b34801561041457600080fd5b50610347610423366004613385565b610b13565b34801561043457600080fd5b506103ad6104433660046131b0565b6000908152600b602052604090206001015490565b34801561046457600080fd5b506104786104733660046133c1565b610b3e565b604080516001600160a01b0390931683526020830191909152016102c4565b3480156104a357600080fd5b506103476104b23660046131b0565b610bec565b3480156104c357600080fd5b506103476104d23660046133e3565b610c24565b3480156104e357600080fd5b506103ad6104f23660046131e5565b610c49565b34801561050357600080fd5b506103476105123660046133e3565b610ce4565b34801561052357600080fd5b50610347610d62565b34801561053857600080fd5b5061030f6daaeb6d7670e522a718067333cd4e81565b34801561055a57600080fd5b50610347610569366004613385565b610d85565b34801561057a57600080fd5b506103476105893660046131b0565b610daa565b34801561059a57600080fd5b506103ad6105a93660046131b0565b610dda565b3480156105ba57600080fd5b5060105460ff166102b8565b3480156105d257600080fd5b5061030f6105e13660046131b0565b610e6d565b3480156105f257600080fd5b50610658610601366004613406565b601560205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007880154600890980154969795966001600160401b0380871697600160401b9097041695908a565b604080519a8b5260208b01999099526001600160401b03978816988a0198909852959094166060880152608087019290925260a086015260c085015260e0840152610100830152610120820152610140016102c4565b3480156106ba57600080fd5b506103476106c93660046131b0565b610ecd565b3480156106da57600080fd5b506103ad6106e9366004613421565b610eeb565b3480156106fa57600080fd5b50610347610f71565b34801561070f57600080fd5b5061072361071e366004613421565b610f91565b6040516102c4919061343c565b34801561073c57600080fd5b506103ad61074b3660046131b0565b60146020526000908152604090205481565b34801561076957600080fd5b506103476107783660046131e5565b611032565b34801561078957600080fd5b5060135461030f906001600160a01b031681565b3480156107a957600080fd5b506102b86107b83660046133e3565b6110f4565b3480156107c957600080fd5b506102e261111f565b3480156107de57600080fd5b506103ad600081565b3480156107f357600080fd5b5061034761080236600461348e565b61112e565b34801561081357600080fd5b506103476108223660046134c5565b611142565b610347610835366004613584565b61116f565b34801561084657600080fd5b5061034761085536600461362a565b6112cb565b34801561086657600080fd5b506102e26108753660046131b0565b611320565b34801561088657600080fd5b50426103ad565b34801561089957600080fd5b506103ad600080516020613de783398151915281565b3480156108bb57600080fd5b506103476108ca3660046133e3565b6113f9565b3480156108db57600080fd5b506103ad60115481565b3480156108f157600080fd5b506103ad600080516020613dc783398151915281565b34801561091357600080fd5b506102e261141e565b34801561092857600080fd5b506102b86109373660046136ad565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561097157600080fd5b50610347610980366004613421565b611449565b34801561099157600080fd5b506103476109a036600461373a565b6114ed565b60006109b08261180a565b92915050565b6060600080546109c5906138b0565b80601f01602080910402602001604051908101604052809291908181526020018280546109f1906138b0565b8015610a3e5780601f10610a1357610100808354040283529160200191610a3e565b820191906000526020600020905b815481529060010190602001808311610a2157829003601f168201915b5050505050905090565b6000610a538261182f565b506000908152600460205260409020546001600160a01b031690565b81610a798161188e565b610a838383611947565b505050565b61ffff81166000908152601560205260408120600401541580610b0b575061ffff8216600090815260156020526040902060040154610b0b908490610b06876040516bffffffffffffffffffffffff19606083901b166020820152600090603401604051602081830303815290604052805190602001209050919050565b611a57565b949350505050565b826001600160a01b0381163314610b2d57610b2d3361188e565b610b38848484611a6d565b50505050565b6000828152600d602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610bb3575060408051808201909152600c546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610bd2906001600160601b031687613900565b610bdc9190613917565b91519350909150505b9250929050565b6000610bf781611a9d565b604051339083156108fc029084906000818181858888f19350505050158015610a83573d6000803e3d6000fd5b6000828152600b6020526040902060010154610c3f81611a9d565b610a838383611aa7565b6000610c5483610eeb565b8210610cbb5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084015b60405180910390fd5b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6001600160a01b0381163314610d545760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610cb2565b610d5e8282611b2d565b5050565b600080516020613dc7833981519152610d7a81611a9d565b610d82611b94565b50565b826001600160a01b0381163314610d9f57610d9f3361188e565b610b38848484611bde565b610db5335b82611bf9565b610dd15760405162461bcd60e51b8152600401610cb290613939565b610d8281611c77565b6000610de560085490565b8210610e485760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610cb2565b60088281548110610e5b57610e5b613986565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806109b05760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610cb2565b600080516020613de7833981519152610ee581611a9d565b50601155565b60006001600160a01b038216610f555760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610cb2565b506001600160a01b031660009081526003602052604090205490565b600080516020613dc7833981519152610f8981611a9d565b610d82611c80565b60606000610f9e83610eeb565b90506000816001600160401b03811115610fba57610fba61320f565b604051908082528060200260200182016040528015610fe3578160200160208202803683370190505b50905060005b8281101561102a57610ffb8582610c49565b82828151811061100d5761100d613986565b6020908102919091010152806110228161399c565b915050610fe9565b509392505050565b600080516020613de783398151915261104a81611a9d565b60115460018360125461105d91906139b5565b61106791906139c8565b11156110b55760405162461bcd60e51b815260206004820152601760248201527f536f6c64206f757420666f72206d617820737570706c790000000000000000006044820152606401610cb2565b60005b82811015610b38576110cc84601254611cb5565b601280549060006110dc8361399c565b919050555080806110ec9061399c565b9150506110b8565b6000918252600b602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600180546109c5906138b0565b816111388161188e565b610a838383611ccf565b836001600160a01b038116331461115c5761115c3361188e565b61116885858585611cda565b5050505050565b61ffff83166000908152601560209081526040918290208251610140810184528154815260018201549281019290925260028101546001600160401b0380821694840194909452600160401b9004909216606082015260038201546080820152600482015460a0820152600582015460c0820152600682015460e08201526007820154610100820152600890910154610120820152611212338560ff8616611d0c565b5061121e338386610a88565b61125d5760405162461bcd60e51b815260206004820152601060248201526f139bdd081a5b881dda1a5d195b1a5cdd60821b6044820152606401610cb2565b60005b8360ff168110156112bc576112943382846101200151856080015161128591906139b5565b61128f91906139b5565b611cb5565b601280549060006112a48361399c565b919050555080806112b49061399c565b915050611260565b50610b3833858560ff166121a8565b600080516020613de78339815191526112e381611a9d565b600e6112f0868883613a29565b50600f6112fe848683613a29565b505060178054911515620100000262ff00001990921691909117905550505050565b6000818152600260205260409020546060906001600160a01b031661139f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610cb2565b60175462010000900460ff166113da57600e600f6040516020016113c4929190613b5b565b6040516020818303038152906040529050919050565b600e6113e583612214565b600f6040516020016113c493929190613b70565b6000828152600b602052604090206001015461141481611a9d565b610a838383611b2d565b6060600e600f604051602001611435929190613ba3565b604051602081830303815290604052905090565b600061145481611a9d565b61145f600083611aa7565b611477600080516020613dc783398151915283611aa7565b61148f600080516020613de783398151915283611aa7565b6114a7600080516020613dc783398151915233611b2d565b6114bf600080516020613de783398151915233611b2d565b6114ca600033611b2d565b50601380546001600160a01b0319166001600160a01b0392909216919091179055565b600080516020613de783398151915261150581611a9d565b60175461ffff908116908316111561155f5760405162461bcd60e51b815260206004820152601860248201527f7374617274496478206973206f7574206f662072616e676500000000000000006044820152606401610cb2565b60005b8b518161ffff1610156117bb576040518061014001604052808d8361ffff168151811061159157611591613986565b602002602001015181526020018c8361ffff16815181106115b4576115b4613986565b602002602001015181526020018b8361ffff16815181106115d7576115d7613986565b60200260200101516001600160401b031681526020018a8361ffff168151811061160357611603613986565b60200260200101516001600160401b03168152602001898361ffff168151811061162f5761162f613986565b60200260200101518152602001888361ffff168151811061165257611652613986565b60200260200101518152602001878361ffff168151811061167557611675613986565b60200260200101518152602001868361ffff168151811061169857611698613986565b60200260200101518152602001858361ffff16815181106116bb576116bb613986565b602002602001015181526020016015600086856116d89190613bd3565b61ffff1661ffff168152602001908152602001600020600801548152506015600085846117059190613bd3565b61ffff16815260208082019290925260409081016000208351815591830151600183015582015160028201805460608501516001600160401b03908116600160401b026fffffffffffffffffffffffffffffffff199092169316929092179190911790556080820151600382015560a0820151600482015560c0820151600582015560e08201516006820155610100820151600782015561012090910151600890910155806117b381613bf5565b915050611562565b506017548b5161ffff918216916117d4919085166139b5565b11156117fd578a516117e69083613bd3565b6017805461ffff191661ffff929092169190911790555b5050505050505050505050565b60006001600160e01b0319821663152a902d60e11b14806109b057506109b0826122a6565b6000818152600260205260409020546001600160a01b0316610d825760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610cb2565b6daaeb6d7670e522a718067333cd4e3b15610d8257604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156118fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191f9190613c16565b610d8257604051633b79c77360e21b81526001600160a01b0382166004820152602401610cb2565b600061195282610e6d565b9050806001600160a01b0316836001600160a01b0316036119bf5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610cb2565b336001600160a01b03821614806119db57506119db8133610937565b611a4d5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610cb2565b610a8383836122cb565b600082611a648584612339565b14949350505050565b611a7633610daf565b611a925760405162461bcd60e51b8152600401610cb290613939565b610a8383838361237e565b610d8281336124ef565b611ab182826110f4565b610d5e576000828152600b602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611ae93390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611b3782826110f4565b15610d5e576000828152600b602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6010805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b610a8383838360405180602001604052806000815250611142565b600080611c0583610e6d565b9050806001600160a01b0316846001600160a01b03161480611c4c57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80610b0b5750836001600160a01b0316611c6584610a48565b6001600160a01b031614949350505050565b610d8281612548565b6010805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611bc13390565b610d5e828260405180602001604052806000815250612588565b610d5e3383836125bb565b611ce43383611bf9565b611d005760405162461bcd60e51b8152600401610cb290613939565b610b3884848484612689565b60175460009061ffff90811690841610611d5e5760405162461bcd60e51b815260206004820152601360248201527204e6f74206578697374206d696e74207374657606c1b6044820152606401610cb2565b61ffff83166000908152601560209081526040918290208251610140810184528154815260018201549281019290925260028101546001600160401b03808216948401859052600160401b90910416606083015260038101546080830152600481015460a0830152600581015460c0830152600681015460e083015260078101546101008301526008015461012082015290421015611e3f5760405162461bcd60e51b815260206004820152601a60248201527f4d696e74696e67206861736e27742073746172746564207965740000000000006044820152606401610cb2565b80606001516001600160401b0316421115611e905760405162461bcd60e51b8152602060048201526011602482015270135a5b9d1a5b99c81a185cc8195b991959607a1b6044820152606401610cb2565b82816101200151611ea191906139b5565b81511015611ee95760405162461bcd60e51b81526020600482015260156024820152740536f6c64206f757420696e2074686973207374657605c1b6044820152606401610cb2565b601154600184601254611efc91906139b5565b611f0691906139c8565b1115611f545760405162461bcd60e51b815260206004820152601960248201527f536f6c64206f757420666f7220746f74616c20737570706c79000000000000006044820152606401610cb2565b61010081015115801590611f855750806101000151600184601254611f7991906139b5565b611f8391906139c8565b115b15611fcb5760405162461bcd60e51b815260206004820152601660248201527514dbdb19081bdd5d08199bdc881b585e081b1a5b5a5d60521b6044820152606401610cb2565b60c081015115801590611fe15750828160c00151105b1561204a5760405162461bcd60e51b815260206004820152603360248201527f4578636565647320746865206d6178696d756d206e756d626572206f66206d69604482015272373a39903832b9103a3930b739b0b1ba34b7b760691b6064820152608401610cb2565b60e081015115801590612092575061ffff841660009081526016602090815260408083206001600160a01b038916845290915290205461208b9084906139b5565b8160e00151105b156120f65760405162461bcd60e51b815260206004820152602e60248201527f4578636565647320746865206d6178696d756d206e756d626572206f66206d6960448201526d1b9d1cc81c195c881dd85b1b195d60921b6064820152608401610cb2565b826000036121395760405162461bcd60e51b815260206004820152601060248201526f496e76616c6964207175616e7469747960801b6044820152606401610cb2565b336001600160a01b038616148015612160575082816020015161215c9190613900565b3414155b1561219d5760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642076616c756560981b6044820152606401610cb2565b506001949350505050565b61ffff821660009081526016602090815260408083206001600160a01b0387168452909152812080548392906121df9084906139b5565b909155505061ffff82166000908152601560205260408120600801805483929061220a9084906139b5565b9091555050505050565b60606000612221836126bc565b60010190506000816001600160401b038111156122405761224061320f565b6040519080825280601f01601f19166020018201604052801561226a576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461227457509392505050565b60006001600160e01b03198216637965db0b60e01b14806109b057506109b082612794565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061230082610e6d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081815b845181101561102a5761236a8286838151811061235d5761235d613986565b60200260200101516127b9565b9150806123768161399c565b91505061233e565b826001600160a01b031661239182610e6d565b6001600160a01b0316146123b75760405162461bcd60e51b8152600401610cb290613c33565b6001600160a01b0382166124195760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610cb2565b61242683838360016127eb565b826001600160a01b031661243982610e6d565b6001600160a01b03161461245f5760405162461bcd60e51b8152600401610cb290613c33565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6124f982826110f4565b610d5e576125068161284c565b61251183602061285e565b604051602001612522929190613c78565b60408051601f198184030181529082905262461bcd60e51b8252610cb29160040161319d565b612551816129f9565b6000818152600a60205260409020805461256a906138b0565b159050610d82576000818152600a60205260408120610d82916130cc565b6125928383612a9c565b61259f6000848484612c35565b610a835760405162461bcd60e51b8152600401610cb290613ced565b816001600160a01b0316836001600160a01b03160361261c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610cb2565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61269484848461237e565b6126a084848484612c35565b610b385760405162461bcd60e51b8152600401610cb290613ced565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106126fb5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612727576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061274557662386f26fc10000830492506010015b6305f5e100831061275d576305f5e100830492506008015b612710831061277157612710830492506004015b60648310612783576064830492506002015b600a83106109b05760010192915050565b60006001600160e01b0319821663780e9d6360e01b14806109b057506109b082612d2b565b60008183106127d55760008281526020849052604090206127e4565b60008381526020839052604090205b9392505050565b60105460ff16158061280457506001600160a01b038416155b1561281a5761281584848484612d7b565b610b38565b60405162461bcd60e51b815260206004820152600760248201526614185cdd5cd95960ca1b6044820152606401610cb2565b60606109b06001600160a01b03831660145b6060600061286d836002613900565b6128789060026139b5565b6001600160401b0381111561288f5761288f61320f565b6040519080825280601f01601f1916602001820160405280156128b9576020820181803683370190505b509050600360fc1b816000815181106128d4576128d4613986565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061290357612903613986565b60200101906001600160f81b031916908160001a9053506000612927846002613900565b6129329060016139b5565b90505b60018111156129aa576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061296657612966613986565b1a60f81b82828151811061297c5761297c613986565b60200101906001600160f81b031916908160001a90535060049490941c936129a381613d3f565b9050612935565b5083156127e45760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610cb2565b6000612a0482610e6d565b9050612a148160008460016127eb565b612a1d82610e6d565b600083815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526003845282852080546000190190558785526002909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b038216612af25760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610cb2565b6000818152600260205260409020546001600160a01b031615612b575760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610cb2565b612b656000838360016127eb565b6000818152600260205260409020546001600160a01b031615612bca5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610cb2565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561219d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612c79903390899088908890600401613d56565b6020604051808303816000875af1925050508015612cb4575060408051601f3d908101601f19168201909252612cb191810190613d93565b60015b612d11573d808015612ce2576040519150601f19603f3d011682016040523d82523d6000602084013e612ce7565b606091505b508051600003612d095760405162461bcd60e51b8152600401610cb290613ced565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610b0b565b60006001600160e01b031982166380ac58cd60e01b1480612d5c57506001600160e01b03198216635b5e139f60e01b145b806109b057506301ffc9a760e01b6001600160e01b03198316146109b0565b612d8784848484612eb4565b6001811115612df65760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610cb2565b816001600160a01b038516612e5257612e4d81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612e75565b836001600160a01b0316856001600160a01b031614612e7557612e758582612f3c565b6001600160a01b038416612e9157612e8c81612fd9565b611168565b846001600160a01b0316846001600160a01b031614611168576111688482613088565b6001811115610b38576001600160a01b03841615612efa576001600160a01b03841660009081526003602052604081208054839290612ef49084906139c8565b90915550505b6001600160a01b03831615610b38576001600160a01b03831660009081526003602052604081208054839290612f319084906139b5565b909155505050505050565b60006001612f4984610eeb565b612f5391906139c8565b600083815260076020526040902054909150808214612fa6576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612feb906001906139c8565b6000838152600960205260408120546008805493945090928490811061301357613013613986565b90600052602060002001549050806008838154811061303457613034613986565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061306c5761306c613db0565b6001900381819060005260206000200160009055905550505050565b600061309383610eeb565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b5080546130d8906138b0565b6000825580601f106130e8575050565b601f016020900490600052602060002090810190610d8291905b808211156131165760008155600101613102565b5090565b6001600160e01b031981168114610d8257600080fd5b60006020828403121561314257600080fd5b81356127e48161311a565b60005b83811015613168578181015183820152602001613150565b50506000910152565b6000815180845261318981602086016020860161314d565b601f01601f19169290920160200192915050565b6020815260006127e46020830184613171565b6000602082840312156131c257600080fd5b5035919050565b80356001600160a01b03811681146131e057600080fd5b919050565b600080604083850312156131f857600080fd5b613201836131c9565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561324d5761324d61320f565b604052919050565b60006001600160401b0382111561326e5761326e61320f565b5060051b60200190565b600082601f83011261328957600080fd5b8135602061329e61329983613255565b613225565b82815260059290921b840181019181810190868411156132bd57600080fd5b8286015b848110156132d857803583529183019183016132c1565b509695505050505050565b803561ffff811681146131e057600080fd5b60008060006060848603121561330a57600080fd5b613313846131c9565b925060208401356001600160401b0381111561332e57600080fd5b61333a86828701613278565b925050613349604085016132e3565b90509250925092565b6000806040838503121561336557600080fd5b61336e836132e3565b915061337c602084016131c9565b90509250929050565b60008060006060848603121561339a57600080fd5b6133a3846131c9565b92506133b1602085016131c9565b9150604084013590509250925092565b600080604083850312156133d457600080fd5b50508035926020909101359150565b600080604083850312156133f657600080fd5b8235915061337c602084016131c9565b60006020828403121561341857600080fd5b6127e4826132e3565b60006020828403121561343357600080fd5b6127e4826131c9565b6020808252825182820181905260009190848201906040850190845b8181101561347457835183529284019291840191600101613458565b50909695505050505050565b8015158114610d8257600080fd5b600080604083850312156134a157600080fd5b6134aa836131c9565b915060208301356134ba81613480565b809150509250929050565b600080600080608085870312156134db57600080fd5b6134e4856131c9565b935060206134f38187016131c9565b93506040860135925060608601356001600160401b038082111561351657600080fd5b818801915088601f83011261352a57600080fd5b81358181111561353c5761353c61320f565b61354e601f8201601f19168501613225565b9150808252898482850101111561356457600080fd5b808484018584013760008482840101525080935050505092959194509250565b60008060006060848603121561359957600080fd5b6135a2846132e3565b9250602084013560ff811681146135b857600080fd5b915060408401356001600160401b038111156135d357600080fd5b6135df86828701613278565b9150509250925092565b60008083601f8401126135fb57600080fd5b5081356001600160401b0381111561361257600080fd5b602083019150836020828501011115610be557600080fd5b60008060008060006060868803121561364257600080fd5b85356001600160401b038082111561365957600080fd5b61366589838a016135e9565b9097509550602088013591508082111561367e57600080fd5b5061368b888289016135e9565b909450925050604086013561369f81613480565b809150509295509295909350565b600080604083850312156136c057600080fd5b61336e836131c9565b600082601f8301126136da57600080fd5b813560206136ea61329983613255565b82815260059290921b8401810191818101908684111561370957600080fd5b8286015b848110156132d85780356001600160401b038116811461372d5760008081fd5b835291830191830161370d565b6000806000806000806000806000806101408b8d03121561375a57600080fd5b8a356001600160401b038082111561377157600080fd5b61377d8e838f01613278565b9b5060208d013591508082111561379357600080fd5b61379f8e838f01613278565b9a5060408d01359150808211156137b557600080fd5b6137c18e838f016136c9565b995060608d01359150808211156137d757600080fd5b6137e38e838f016136c9565b985060808d01359150808211156137f957600080fd5b6138058e838f01613278565b975060a08d013591508082111561381b57600080fd5b6138278e838f01613278565b965060c08d013591508082111561383d57600080fd5b6138498e838f01613278565b955060e08d013591508082111561385f57600080fd5b61386b8e838f01613278565b94506101008d013591508082111561388257600080fd5b5061388f8d828e01613278565b92505061389f6101208c016132e3565b90509295989b9194979a5092959850565b600181811c908216806138c457607f821691505b6020821081036138e457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176109b0576109b06138ea565b60008261393457634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000600182016139ae576139ae6138ea565b5060010190565b808201808211156109b0576109b06138ea565b818103818111156109b0576109b06138ea565b601f821115610a8357600081815260208120601f850160051c81016020861015613a025750805b601f850160051c820191505b81811015613a2157828155600101613a0e565b505050505050565b6001600160401b03831115613a4057613a4061320f565b613a5483613a4e83546138b0565b836139db565b6000601f841160018114613a885760008515613a705750838201355b600019600387901b1c1916600186901b178355611168565b600083815260209020601f19861690835b82811015613ab95786850135825560209485019460019092019101613a99565b5086821015613ad65760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60008154613af5816138b0565b60018281168015613b0d5760018114613b2257613b51565b60ff1984168752821515830287019450613b51565b8560005260208060002060005b85811015613b485781548a820152908401908201613b2f565b50505082870194505b5050505092915050565b6000610b0b613b6a8386613ae8565b84613ae8565b6000613b7c8286613ae8565b8451613b8c81836020890161314d565b613b9881830186613ae8565b979650505050505050565b6000613baf8285613ae8565b6718dbdb9d1c9858dd60c21b8152613bca6008820185613ae8565b95945050505050565b61ffff818116838216019080821115613bee57613bee6138ea565b5092915050565b600061ffff808316818103613c0c57613c0c6138ea565b6001019392505050565b600060208284031215613c2857600080fd5b81516127e481613480565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613cb081601785016020880161314d565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613ce181602884016020880161314d565b01602801949350505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600081613d4e57613d4e6138ea565b506000190190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613d8990830184613171565b9695505050505050565b600060208284031215613da557600080fd5b81516127e48161311a565b634e487b7160e01b600052603160045260246000fdfe65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a2646970667358221220a100bb874d036e52d53aa251c32495a8e57552d1f58b4c7750fe7871e91a93cd64736f6c63430008110033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000000094d6974617665727365000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d49544100000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102935760003560e01c80636f8b44b01161015a578063bbd04845116100c1578063d5abeb011161007a578063d5abeb01146108cf578063e63ab1e9146108e5578063e8a3d48514610907578063e985e9c51461091c578063f2fde38b14610965578063f3ee5cb81461098557600080fd5b8063bbd0484514610827578063bfdf0ca71461083a578063c87b56dd1461085a578063d18e81b31461087a578063d53913931461088d578063d547741f146108af57600080fd5b80638da5cb5b116101135780638da5cb5b1461077d57806391d148541461079d57806395d89b41146107bd578063a217fddf146107d2578063a22cb465146107e7578063b88d4fde1461080757600080fd5b80636f8b44b0146106ae57806370a08231146106ce5780638456cb59146106ee5780638462151c146107035780638b58c569146107305780638ba4cc3c1461075d57600080fd5b80632e1a7d4d116101fe57806342842e0e116101b757806342842e0e1461054e57806342966c681461056e5780634f6ccce71461058e5780635c975abb146105ae5780636352211e146105c65780636dc0055a146105e657600080fd5b80632e1a7d4d146104975780632f2ff15d146104b75780632f745c59146104d757806336568abe146104f75780633f4ba83a1461051757806341f434341461052c57600080fd5b806317d70f7c1161025057806317d70f7c1461039757806318160ddd146103bb578063227d33e6146103d057806323b872dd14610408578063248a9ca3146104285780632a55205a1461045857600080fd5b806301ffc9a71461029857806306fdde03146102cd578063081812fc146102ef578063095ea7b3146103275780630d0163121461034957806311f105a914610369575b600080fd5b3480156102a457600080fd5b506102b86102b3366004613130565b6109a5565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102e26109b6565b6040516102c4919061319d565b3480156102fb57600080fd5b5061030f61030a3660046131b0565b610a48565b6040516001600160a01b0390911681526020016102c4565b34801561033357600080fd5b506103476103423660046131e5565b610a6f565b005b34801561035557600080fd5b506102b86103643660046132f5565b610a88565b34801561037557600080fd5b506017546103849061ffff1681565b60405161ffff90911681526020016102c4565b3480156103a357600080fd5b506103ad60125481565b6040519081526020016102c4565b3480156103c757600080fd5b506008546103ad565b3480156103dc57600080fd5b506103ad6103eb366004613352565b601660209081526000928352604080842090915290825290205481565b34801561041457600080fd5b50610347610423366004613385565b610b13565b34801561043457600080fd5b506103ad6104433660046131b0565b6000908152600b602052604090206001015490565b34801561046457600080fd5b506104786104733660046133c1565b610b3e565b604080516001600160a01b0390931683526020830191909152016102c4565b3480156104a357600080fd5b506103476104b23660046131b0565b610bec565b3480156104c357600080fd5b506103476104d23660046133e3565b610c24565b3480156104e357600080fd5b506103ad6104f23660046131e5565b610c49565b34801561050357600080fd5b506103476105123660046133e3565b610ce4565b34801561052357600080fd5b50610347610d62565b34801561053857600080fd5b5061030f6daaeb6d7670e522a718067333cd4e81565b34801561055a57600080fd5b50610347610569366004613385565b610d85565b34801561057a57600080fd5b506103476105893660046131b0565b610daa565b34801561059a57600080fd5b506103ad6105a93660046131b0565b610dda565b3480156105ba57600080fd5b5060105460ff166102b8565b3480156105d257600080fd5b5061030f6105e13660046131b0565b610e6d565b3480156105f257600080fd5b50610658610601366004613406565b601560205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007880154600890980154969795966001600160401b0380871697600160401b9097041695908a565b604080519a8b5260208b01999099526001600160401b03978816988a0198909852959094166060880152608087019290925260a086015260c085015260e0840152610100830152610120820152610140016102c4565b3480156106ba57600080fd5b506103476106c93660046131b0565b610ecd565b3480156106da57600080fd5b506103ad6106e9366004613421565b610eeb565b3480156106fa57600080fd5b50610347610f71565b34801561070f57600080fd5b5061072361071e366004613421565b610f91565b6040516102c4919061343c565b34801561073c57600080fd5b506103ad61074b3660046131b0565b60146020526000908152604090205481565b34801561076957600080fd5b506103476107783660046131e5565b611032565b34801561078957600080fd5b5060135461030f906001600160a01b031681565b3480156107a957600080fd5b506102b86107b83660046133e3565b6110f4565b3480156107c957600080fd5b506102e261111f565b3480156107de57600080fd5b506103ad600081565b3480156107f357600080fd5b5061034761080236600461348e565b61112e565b34801561081357600080fd5b506103476108223660046134c5565b611142565b610347610835366004613584565b61116f565b34801561084657600080fd5b5061034761085536600461362a565b6112cb565b34801561086657600080fd5b506102e26108753660046131b0565b611320565b34801561088657600080fd5b50426103ad565b34801561089957600080fd5b506103ad600080516020613de783398151915281565b3480156108bb57600080fd5b506103476108ca3660046133e3565b6113f9565b3480156108db57600080fd5b506103ad60115481565b3480156108f157600080fd5b506103ad600080516020613dc783398151915281565b34801561091357600080fd5b506102e261141e565b34801561092857600080fd5b506102b86109373660046136ad565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561097157600080fd5b50610347610980366004613421565b611449565b34801561099157600080fd5b506103476109a036600461373a565b6114ed565b60006109b08261180a565b92915050565b6060600080546109c5906138b0565b80601f01602080910402602001604051908101604052809291908181526020018280546109f1906138b0565b8015610a3e5780601f10610a1357610100808354040283529160200191610a3e565b820191906000526020600020905b815481529060010190602001808311610a2157829003601f168201915b5050505050905090565b6000610a538261182f565b506000908152600460205260409020546001600160a01b031690565b81610a798161188e565b610a838383611947565b505050565b61ffff81166000908152601560205260408120600401541580610b0b575061ffff8216600090815260156020526040902060040154610b0b908490610b06876040516bffffffffffffffffffffffff19606083901b166020820152600090603401604051602081830303815290604052805190602001209050919050565b611a57565b949350505050565b826001600160a01b0381163314610b2d57610b2d3361188e565b610b38848484611a6d565b50505050565b6000828152600d602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610bb3575060408051808201909152600c546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610bd2906001600160601b031687613900565b610bdc9190613917565b91519350909150505b9250929050565b6000610bf781611a9d565b604051339083156108fc029084906000818181858888f19350505050158015610a83573d6000803e3d6000fd5b6000828152600b6020526040902060010154610c3f81611a9d565b610a838383611aa7565b6000610c5483610eeb565b8210610cbb5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084015b60405180910390fd5b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6001600160a01b0381163314610d545760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610cb2565b610d5e8282611b2d565b5050565b600080516020613dc7833981519152610d7a81611a9d565b610d82611b94565b50565b826001600160a01b0381163314610d9f57610d9f3361188e565b610b38848484611bde565b610db5335b82611bf9565b610dd15760405162461bcd60e51b8152600401610cb290613939565b610d8281611c77565b6000610de560085490565b8210610e485760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610cb2565b60088281548110610e5b57610e5b613986565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806109b05760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610cb2565b600080516020613de7833981519152610ee581611a9d565b50601155565b60006001600160a01b038216610f555760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610cb2565b506001600160a01b031660009081526003602052604090205490565b600080516020613dc7833981519152610f8981611a9d565b610d82611c80565b60606000610f9e83610eeb565b90506000816001600160401b03811115610fba57610fba61320f565b604051908082528060200260200182016040528015610fe3578160200160208202803683370190505b50905060005b8281101561102a57610ffb8582610c49565b82828151811061100d5761100d613986565b6020908102919091010152806110228161399c565b915050610fe9565b509392505050565b600080516020613de783398151915261104a81611a9d565b60115460018360125461105d91906139b5565b61106791906139c8565b11156110b55760405162461bcd60e51b815260206004820152601760248201527f536f6c64206f757420666f72206d617820737570706c790000000000000000006044820152606401610cb2565b60005b82811015610b38576110cc84601254611cb5565b601280549060006110dc8361399c565b919050555080806110ec9061399c565b9150506110b8565b6000918252600b602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600180546109c5906138b0565b816111388161188e565b610a838383611ccf565b836001600160a01b038116331461115c5761115c3361188e565b61116885858585611cda565b5050505050565b61ffff83166000908152601560209081526040918290208251610140810184528154815260018201549281019290925260028101546001600160401b0380821694840194909452600160401b9004909216606082015260038201546080820152600482015460a0820152600582015460c0820152600682015460e08201526007820154610100820152600890910154610120820152611212338560ff8616611d0c565b5061121e338386610a88565b61125d5760405162461bcd60e51b815260206004820152601060248201526f139bdd081a5b881dda1a5d195b1a5cdd60821b6044820152606401610cb2565b60005b8360ff168110156112bc576112943382846101200151856080015161128591906139b5565b61128f91906139b5565b611cb5565b601280549060006112a48361399c565b919050555080806112b49061399c565b915050611260565b50610b3833858560ff166121a8565b600080516020613de78339815191526112e381611a9d565b600e6112f0868883613a29565b50600f6112fe848683613a29565b505060178054911515620100000262ff00001990921691909117905550505050565b6000818152600260205260409020546060906001600160a01b031661139f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610cb2565b60175462010000900460ff166113da57600e600f6040516020016113c4929190613b5b565b6040516020818303038152906040529050919050565b600e6113e583612214565b600f6040516020016113c493929190613b70565b6000828152600b602052604090206001015461141481611a9d565b610a838383611b2d565b6060600e600f604051602001611435929190613ba3565b604051602081830303815290604052905090565b600061145481611a9d565b61145f600083611aa7565b611477600080516020613dc783398151915283611aa7565b61148f600080516020613de783398151915283611aa7565b6114a7600080516020613dc783398151915233611b2d565b6114bf600080516020613de783398151915233611b2d565b6114ca600033611b2d565b50601380546001600160a01b0319166001600160a01b0392909216919091179055565b600080516020613de783398151915261150581611a9d565b60175461ffff908116908316111561155f5760405162461bcd60e51b815260206004820152601860248201527f7374617274496478206973206f7574206f662072616e676500000000000000006044820152606401610cb2565b60005b8b518161ffff1610156117bb576040518061014001604052808d8361ffff168151811061159157611591613986565b602002602001015181526020018c8361ffff16815181106115b4576115b4613986565b602002602001015181526020018b8361ffff16815181106115d7576115d7613986565b60200260200101516001600160401b031681526020018a8361ffff168151811061160357611603613986565b60200260200101516001600160401b03168152602001898361ffff168151811061162f5761162f613986565b60200260200101518152602001888361ffff168151811061165257611652613986565b60200260200101518152602001878361ffff168151811061167557611675613986565b60200260200101518152602001868361ffff168151811061169857611698613986565b60200260200101518152602001858361ffff16815181106116bb576116bb613986565b602002602001015181526020016015600086856116d89190613bd3565b61ffff1661ffff168152602001908152602001600020600801548152506015600085846117059190613bd3565b61ffff16815260208082019290925260409081016000208351815591830151600183015582015160028201805460608501516001600160401b03908116600160401b026fffffffffffffffffffffffffffffffff199092169316929092179190911790556080820151600382015560a0820151600482015560c0820151600582015560e08201516006820155610100820151600782015561012090910151600890910155806117b381613bf5565b915050611562565b506017548b5161ffff918216916117d4919085166139b5565b11156117fd578a516117e69083613bd3565b6017805461ffff191661ffff929092169190911790555b5050505050505050505050565b60006001600160e01b0319821663152a902d60e11b14806109b057506109b0826122a6565b6000818152600260205260409020546001600160a01b0316610d825760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610cb2565b6daaeb6d7670e522a718067333cd4e3b15610d8257604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156118fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191f9190613c16565b610d8257604051633b79c77360e21b81526001600160a01b0382166004820152602401610cb2565b600061195282610e6d565b9050806001600160a01b0316836001600160a01b0316036119bf5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610cb2565b336001600160a01b03821614806119db57506119db8133610937565b611a4d5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610cb2565b610a8383836122cb565b600082611a648584612339565b14949350505050565b611a7633610daf565b611a925760405162461bcd60e51b8152600401610cb290613939565b610a8383838361237e565b610d8281336124ef565b611ab182826110f4565b610d5e576000828152600b602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611ae93390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611b3782826110f4565b15610d5e576000828152600b602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6010805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b610a8383838360405180602001604052806000815250611142565b600080611c0583610e6d565b9050806001600160a01b0316846001600160a01b03161480611c4c57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80610b0b5750836001600160a01b0316611c6584610a48565b6001600160a01b031614949350505050565b610d8281612548565b6010805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611bc13390565b610d5e828260405180602001604052806000815250612588565b610d5e3383836125bb565b611ce43383611bf9565b611d005760405162461bcd60e51b8152600401610cb290613939565b610b3884848484612689565b60175460009061ffff90811690841610611d5e5760405162461bcd60e51b815260206004820152601360248201527204e6f74206578697374206d696e74207374657606c1b6044820152606401610cb2565b61ffff83166000908152601560209081526040918290208251610140810184528154815260018201549281019290925260028101546001600160401b03808216948401859052600160401b90910416606083015260038101546080830152600481015460a0830152600581015460c0830152600681015460e083015260078101546101008301526008015461012082015290421015611e3f5760405162461bcd60e51b815260206004820152601a60248201527f4d696e74696e67206861736e27742073746172746564207965740000000000006044820152606401610cb2565b80606001516001600160401b0316421115611e905760405162461bcd60e51b8152602060048201526011602482015270135a5b9d1a5b99c81a185cc8195b991959607a1b6044820152606401610cb2565b82816101200151611ea191906139b5565b81511015611ee95760405162461bcd60e51b81526020600482015260156024820152740536f6c64206f757420696e2074686973207374657605c1b6044820152606401610cb2565b601154600184601254611efc91906139b5565b611f0691906139c8565b1115611f545760405162461bcd60e51b815260206004820152601960248201527f536f6c64206f757420666f7220746f74616c20737570706c79000000000000006044820152606401610cb2565b61010081015115801590611f855750806101000151600184601254611f7991906139b5565b611f8391906139c8565b115b15611fcb5760405162461bcd60e51b815260206004820152601660248201527514dbdb19081bdd5d08199bdc881b585e081b1a5b5a5d60521b6044820152606401610cb2565b60c081015115801590611fe15750828160c00151105b1561204a5760405162461bcd60e51b815260206004820152603360248201527f4578636565647320746865206d6178696d756d206e756d626572206f66206d69604482015272373a39903832b9103a3930b739b0b1ba34b7b760691b6064820152608401610cb2565b60e081015115801590612092575061ffff841660009081526016602090815260408083206001600160a01b038916845290915290205461208b9084906139b5565b8160e00151105b156120f65760405162461bcd60e51b815260206004820152602e60248201527f4578636565647320746865206d6178696d756d206e756d626572206f66206d6960448201526d1b9d1cc81c195c881dd85b1b195d60921b6064820152608401610cb2565b826000036121395760405162461bcd60e51b815260206004820152601060248201526f496e76616c6964207175616e7469747960801b6044820152606401610cb2565b336001600160a01b038616148015612160575082816020015161215c9190613900565b3414155b1561219d5760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642076616c756560981b6044820152606401610cb2565b506001949350505050565b61ffff821660009081526016602090815260408083206001600160a01b0387168452909152812080548392906121df9084906139b5565b909155505061ffff82166000908152601560205260408120600801805483929061220a9084906139b5565b9091555050505050565b60606000612221836126bc565b60010190506000816001600160401b038111156122405761224061320f565b6040519080825280601f01601f19166020018201604052801561226a576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461227457509392505050565b60006001600160e01b03198216637965db0b60e01b14806109b057506109b082612794565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061230082610e6d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081815b845181101561102a5761236a8286838151811061235d5761235d613986565b60200260200101516127b9565b9150806123768161399c565b91505061233e565b826001600160a01b031661239182610e6d565b6001600160a01b0316146123b75760405162461bcd60e51b8152600401610cb290613c33565b6001600160a01b0382166124195760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610cb2565b61242683838360016127eb565b826001600160a01b031661243982610e6d565b6001600160a01b03161461245f5760405162461bcd60e51b8152600401610cb290613c33565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6124f982826110f4565b610d5e576125068161284c565b61251183602061285e565b604051602001612522929190613c78565b60408051601f198184030181529082905262461bcd60e51b8252610cb29160040161319d565b612551816129f9565b6000818152600a60205260409020805461256a906138b0565b159050610d82576000818152600a60205260408120610d82916130cc565b6125928383612a9c565b61259f6000848484612c35565b610a835760405162461bcd60e51b8152600401610cb290613ced565b816001600160a01b0316836001600160a01b03160361261c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610cb2565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61269484848461237e565b6126a084848484612c35565b610b385760405162461bcd60e51b8152600401610cb290613ced565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106126fb5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612727576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061274557662386f26fc10000830492506010015b6305f5e100831061275d576305f5e100830492506008015b612710831061277157612710830492506004015b60648310612783576064830492506002015b600a83106109b05760010192915050565b60006001600160e01b0319821663780e9d6360e01b14806109b057506109b082612d2b565b60008183106127d55760008281526020849052604090206127e4565b60008381526020839052604090205b9392505050565b60105460ff16158061280457506001600160a01b038416155b1561281a5761281584848484612d7b565b610b38565b60405162461bcd60e51b815260206004820152600760248201526614185cdd5cd95960ca1b6044820152606401610cb2565b60606109b06001600160a01b03831660145b6060600061286d836002613900565b6128789060026139b5565b6001600160401b0381111561288f5761288f61320f565b6040519080825280601f01601f1916602001820160405280156128b9576020820181803683370190505b509050600360fc1b816000815181106128d4576128d4613986565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061290357612903613986565b60200101906001600160f81b031916908160001a9053506000612927846002613900565b6129329060016139b5565b90505b60018111156129aa576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061296657612966613986565b1a60f81b82828151811061297c5761297c613986565b60200101906001600160f81b031916908160001a90535060049490941c936129a381613d3f565b9050612935565b5083156127e45760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610cb2565b6000612a0482610e6d565b9050612a148160008460016127eb565b612a1d82610e6d565b600083815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526003845282852080546000190190558785526002909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b038216612af25760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610cb2565b6000818152600260205260409020546001600160a01b031615612b575760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610cb2565b612b656000838360016127eb565b6000818152600260205260409020546001600160a01b031615612bca5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610cb2565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561219d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612c79903390899088908890600401613d56565b6020604051808303816000875af1925050508015612cb4575060408051601f3d908101601f19168201909252612cb191810190613d93565b60015b612d11573d808015612ce2576040519150601f19603f3d011682016040523d82523d6000602084013e612ce7565b606091505b508051600003612d095760405162461bcd60e51b8152600401610cb290613ced565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610b0b565b60006001600160e01b031982166380ac58cd60e01b1480612d5c57506001600160e01b03198216635b5e139f60e01b145b806109b057506301ffc9a760e01b6001600160e01b03198316146109b0565b612d8784848484612eb4565b6001811115612df65760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610cb2565b816001600160a01b038516612e5257612e4d81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612e75565b836001600160a01b0316856001600160a01b031614612e7557612e758582612f3c565b6001600160a01b038416612e9157612e8c81612fd9565b611168565b846001600160a01b0316846001600160a01b031614611168576111688482613088565b6001811115610b38576001600160a01b03841615612efa576001600160a01b03841660009081526003602052604081208054839290612ef49084906139c8565b90915550505b6001600160a01b03831615610b38576001600160a01b03831660009081526003602052604081208054839290612f319084906139b5565b909155505050505050565b60006001612f4984610eeb565b612f5391906139c8565b600083815260076020526040902054909150808214612fa6576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612feb906001906139c8565b6000838152600960205260408120546008805493945090928490811061301357613013613986565b90600052602060002001549050806008838154811061303457613034613986565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061306c5761306c613db0565b6001900381819060005260206000200160009055905550505050565b600061309383610eeb565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b5080546130d8906138b0565b6000825580601f106130e8575050565b601f016020900490600052602060002090810190610d8291905b808211156131165760008155600101613102565b5090565b6001600160e01b031981168114610d8257600080fd5b60006020828403121561314257600080fd5b81356127e48161311a565b60005b83811015613168578181015183820152602001613150565b50506000910152565b6000815180845261318981602086016020860161314d565b601f01601f19169290920160200192915050565b6020815260006127e46020830184613171565b6000602082840312156131c257600080fd5b5035919050565b80356001600160a01b03811681146131e057600080fd5b919050565b600080604083850312156131f857600080fd5b613201836131c9565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561324d5761324d61320f565b604052919050565b60006001600160401b0382111561326e5761326e61320f565b5060051b60200190565b600082601f83011261328957600080fd5b8135602061329e61329983613255565b613225565b82815260059290921b840181019181810190868411156132bd57600080fd5b8286015b848110156132d857803583529183019183016132c1565b509695505050505050565b803561ffff811681146131e057600080fd5b60008060006060848603121561330a57600080fd5b613313846131c9565b925060208401356001600160401b0381111561332e57600080fd5b61333a86828701613278565b925050613349604085016132e3565b90509250925092565b6000806040838503121561336557600080fd5b61336e836132e3565b915061337c602084016131c9565b90509250929050565b60008060006060848603121561339a57600080fd5b6133a3846131c9565b92506133b1602085016131c9565b9150604084013590509250925092565b600080604083850312156133d457600080fd5b50508035926020909101359150565b600080604083850312156133f657600080fd5b8235915061337c602084016131c9565b60006020828403121561341857600080fd5b6127e4826132e3565b60006020828403121561343357600080fd5b6127e4826131c9565b6020808252825182820181905260009190848201906040850190845b8181101561347457835183529284019291840191600101613458565b50909695505050505050565b8015158114610d8257600080fd5b600080604083850312156134a157600080fd5b6134aa836131c9565b915060208301356134ba81613480565b809150509250929050565b600080600080608085870312156134db57600080fd5b6134e4856131c9565b935060206134f38187016131c9565b93506040860135925060608601356001600160401b038082111561351657600080fd5b818801915088601f83011261352a57600080fd5b81358181111561353c5761353c61320f565b61354e601f8201601f19168501613225565b9150808252898482850101111561356457600080fd5b808484018584013760008482840101525080935050505092959194509250565b60008060006060848603121561359957600080fd5b6135a2846132e3565b9250602084013560ff811681146135b857600080fd5b915060408401356001600160401b038111156135d357600080fd5b6135df86828701613278565b9150509250925092565b60008083601f8401126135fb57600080fd5b5081356001600160401b0381111561361257600080fd5b602083019150836020828501011115610be557600080fd5b60008060008060006060868803121561364257600080fd5b85356001600160401b038082111561365957600080fd5b61366589838a016135e9565b9097509550602088013591508082111561367e57600080fd5b5061368b888289016135e9565b909450925050604086013561369f81613480565b809150509295509295909350565b600080604083850312156136c057600080fd5b61336e836131c9565b600082601f8301126136da57600080fd5b813560206136ea61329983613255565b82815260059290921b8401810191818101908684111561370957600080fd5b8286015b848110156132d85780356001600160401b038116811461372d5760008081fd5b835291830191830161370d565b6000806000806000806000806000806101408b8d03121561375a57600080fd5b8a356001600160401b038082111561377157600080fd5b61377d8e838f01613278565b9b5060208d013591508082111561379357600080fd5b61379f8e838f01613278565b9a5060408d01359150808211156137b557600080fd5b6137c18e838f016136c9565b995060608d01359150808211156137d757600080fd5b6137e38e838f016136c9565b985060808d01359150808211156137f957600080fd5b6138058e838f01613278565b975060a08d013591508082111561381b57600080fd5b6138278e838f01613278565b965060c08d013591508082111561383d57600080fd5b6138498e838f01613278565b955060e08d013591508082111561385f57600080fd5b61386b8e838f01613278565b94506101008d013591508082111561388257600080fd5b5061388f8d828e01613278565b92505061389f6101208c016132e3565b90509295989b9194979a5092959850565b600181811c908216806138c457607f821691505b6020821081036138e457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176109b0576109b06138ea565b60008261393457634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000600182016139ae576139ae6138ea565b5060010190565b808201808211156109b0576109b06138ea565b818103818111156109b0576109b06138ea565b601f821115610a8357600081815260208120601f850160051c81016020861015613a025750805b601f850160051c820191505b81811015613a2157828155600101613a0e565b505050505050565b6001600160401b03831115613a4057613a4061320f565b613a5483613a4e83546138b0565b836139db565b6000601f841160018114613a885760008515613a705750838201355b600019600387901b1c1916600186901b178355611168565b600083815260209020601f19861690835b82811015613ab95786850135825560209485019460019092019101613a99565b5086821015613ad65760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60008154613af5816138b0565b60018281168015613b0d5760018114613b2257613b51565b60ff1984168752821515830287019450613b51565b8560005260208060002060005b85811015613b485781548a820152908401908201613b2f565b50505082870194505b5050505092915050565b6000610b0b613b6a8386613ae8565b84613ae8565b6000613b7c8286613ae8565b8451613b8c81836020890161314d565b613b9881830186613ae8565b979650505050505050565b6000613baf8285613ae8565b6718dbdb9d1c9858dd60c21b8152613bca6008820185613ae8565b95945050505050565b61ffff818116838216019080821115613bee57613bee6138ea565b5092915050565b600061ffff808316818103613c0c57613c0c6138ea565b6001019392505050565b600060208284031215613c2857600080fd5b81516127e481613480565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613cb081601785016020880161314d565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613ce181602884016020880161314d565b01602801949350505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600081613d4e57613d4e6138ea565b506000190190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613d8990830184613171565b9695505050505050565b600060208284031215613da557600080fd5b81516127e48161311a565b634e487b7160e01b600052603160045260246000fdfe65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a2646970667358221220a100bb874d036e52d53aa251c32495a8e57552d1f58b4c7750fe7871e91a93cd64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000000094d6974617665727365000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d49544100000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): Mitaverse
Arg [1] : symbol (string): MITA
Arg [2] : _maxSupply (uint256): 5000
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000001388
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [4] : 4d69746176657273650000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [6] : 4d49544100000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
99655:10621:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;108057:220;;;;;;;;;;-1:-1:-1;108057:220:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;108057:220:0;;;;;;;;69854:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;71366:171::-;;;;;;;;;;-1:-1:-1;71366:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;71366:171:0;1533:203:1;108655:176:0;;;;;;;;;;-1:-1:-1;108655:176:0;;;;;:::i;:::-;;:::i;:::-;;105802:286;;;;;;;;;;-1:-1:-1;105802:286:0;;;;;:::i;:::-;;:::i;100584:29::-;;;;;;;;;;-1:-1:-1;100584:29:0;;;;;;;;;;;4282:6:1;4270:19;;;4252:38;;4240:2;4225:18;100584:29:0;4108:188:1;100066:22:0;;;;;;;;;;;;;;;;;;;4447:25:1;;;4435:2;4420:18;100066:22:0;4301:177:1;89198:113:0;;;;;;;;;;-1:-1:-1;89286:10:0;:17;89198:113;;100513:62;;;;;;;;;;-1:-1:-1;100513:62:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;109014:182;;;;;;;;;;-1:-1:-1;109014:182:0;;;;;:::i;:::-;;:::i;63667:131::-;;;;;;;;;;-1:-1:-1;63667:131:0;;;;;:::i;:::-;63741:7;63768:12;;;:6;:12;;;;;:22;;;;63667:131;97059:442;;;;;;;;;;-1:-1:-1;97059:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;5891:32:1;;;5873:51;;5955:2;5940:18;;5933:34;;;;5846:18;97059:442:0;5699:274:1;106227:136:0;;;;;;;;;;-1:-1:-1;106227:136:0;;;;;:::i;:::-;;:::i;64108:147::-;;;;;;;;;;-1:-1:-1;64108:147:0;;;;;:::i;:::-;;:::i;88866:256::-;;;;;;;;;;-1:-1:-1;88866:256:0;;;;;:::i;:::-;;:::i;65252:218::-;;;;;;;;;;-1:-1:-1;65252:218:0;;;;;:::i;:::-;;:::i;110099:82::-;;;;;;;;;;;;;:::i;7726:143::-;;;;;;;;;;;;148:42;7726:143;;109383:190;;;;;;;;;;-1:-1:-1;109383:190:0;;;;;:::i;:::-;;:::i;85310:242::-;;;;;;;;;;-1:-1:-1;85310:242:0;;;;;:::i;:::-;;:::i;89388:233::-;;;;;;;;;;-1:-1:-1;89388:233:0;;;;;:::i;:::-;;:::i;110187:86::-;;;;;;;;;;-1:-1:-1;110258:7:0;;;;110187:86;;69564:223;;;;;;;;;;-1:-1:-1;69564:223:0;;;;;:::i;:::-;;:::i;100462:44::-;;;;;;;;;;-1:-1:-1;100462:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;100462:44:0;;;;-1:-1:-1;;;100462:44:0;;;;;;;;;;;;7060:25:1;;;7116:2;7101:18;;7094:34;;;;-1:-1:-1;;;;;7201:15:1;;;7181:18;;;7174:43;;;;7253:15;;;;7248:2;7233:18;;7226:43;7300:3;7285:19;;7278:35;;;;7344:3;7329:19;;7322:35;7388:3;7373:19;;7366:35;7432:3;7417:19;;7410:35;7476:3;7461:19;;7454:35;7520:3;7505:19;;7498:35;7047:3;7032:19;100462:44:0;6665:874:1;107067:121:0;;;;;;;;;;-1:-1:-1;107067:121:0;;;;;:::i;:::-;;:::i;69295:207::-;;;;;;;;;;-1:-1:-1;69295:207:0;;;;;:::i;:::-;;:::i;110015:78::-;;;;;;;;;;;;;:::i;106678:381::-;;;;;;;;;;-1:-1:-1;106678:381:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;100122:41::-;;;;;;;;;;-1:-1:-1;100122:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;103938:296;;;;;;;;;;-1:-1:-1;103938:296:0;;;;;:::i;:::-;;:::i;100095:20::-;;;;;;;;;;-1:-1:-1;100095:20:0;;;;-1:-1:-1;;;;;100095:20:0;;;62140:147;;;;;;;;;;-1:-1:-1;62140:147:0;;;;;:::i;:::-;;:::i;70023:104::-;;;;;;;;;;;;;:::i;61245:49::-;;;;;;;;;;-1:-1:-1;61245:49:0;61290:4;61245:49;;108284:193;;;;;;;;;;-1:-1:-1;108284:193:0;;;;;:::i;:::-;;:::i;109760:247::-;;;;;;;;;;-1:-1:-1;109760:247:0;;;;;:::i;:::-;;:::i;104242:507::-;;;;;;:::i;:::-;;:::i;107784:267::-;;;;;;;;;;-1:-1:-1;107784:267:0;;;;;:::i;:::-;;:::i;107194:408::-;;;;;;;;;;-1:-1:-1;107194:408:0;;;;;:::i;:::-;;:::i;106369:114::-;;;;;;;;;;-1:-1:-1;106460:15:0;106369:114;;99861:62;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;99861:62:0;;64548:149;;;;;;;;;;-1:-1:-1;64548:149:0;;;;;:::i;:::-;;:::i;100035:24::-;;;;;;;;;;;;;;;;99792:62;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;99792:62:0;;107608:170;;;;;;;;;;;;;:::i;71835:164::-;;;;;;;;;;-1:-1:-1;71835:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;71956:25:0;;;71932:4;71956:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;71835:164;103113:403;;;;;;;;;;-1:-1:-1;103113:403:0;;;;;:::i;:::-;;:::i;104761:1035::-;;;;;;;;;;-1:-1:-1;104761:1035:0;;;;;:::i;:::-;;:::i;108057:220::-;108204:4;108233:36;108257:11;108233:23;:36::i;:::-;108226:43;108057:220;-1:-1:-1;;108057:220:0:o;69854:100::-;69908:13;69941:5;69934:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69854:100;:::o;71366:171::-;71442:7;71462:23;71477:7;71462:14;:23::i;:::-;-1:-1:-1;71505:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;71505:24:0;;71366:171::o;108655:176::-;108769:8;9508:30;9529:8;9508:20;:30::i;:::-;108790:33:::1;108804:8;108814;108790:13;:33::i;:::-;108655:176:::0;;;:::o;105802:286::-;105973:15;;;105936:4;105973:15;;;:9;:15;;;;;:26;;;:33;;:107;;-1:-1:-1;106037:15:0;;;;;;;:9;:15;;;;;:26;;;106010:70;;106029:6;;106065:14;106070:8;106186:26;;-1:-1:-1;;26990:2:1;26986:15;;;26982:53;106186:26:0;;;26970:66:1;106149:7:0;;27052:12:1;;106186:26:0;;;;;;;;;;;;106176:37;;;;;;106169:44;;106094:127;;;;106065:14;106010:18;:70::i;:::-;105953:127;105802:286;-1:-1:-1;;;;105802:286:0:o;109014:182::-;109133:4;-1:-1:-1;;;;;9234:18:0;;9242:10;9234:18;9230:83;;9269:32;9290:10;9269:20;:32::i;:::-;109150:38:::1;109169:4;109175:2;109179:8;109150:18;:38::i;:::-;109014:182:::0;;;;:::o;97059:442::-;97156:7;97214:27;;;:17;:27;;;;;;;;97185:56;;;;;;;;;-1:-1:-1;;;;;97185:56:0;;;;;-1:-1:-1;;;97185:56:0;;;-1:-1:-1;;;;;97185:56:0;;;;;;;;97156:7;;97254:92;;-1:-1:-1;97305:29:0;;;;;;;;;97315:19;97305:29;-1:-1:-1;;;;;97305:29:0;;;;-1:-1:-1;;;97305:29:0;;-1:-1:-1;;;;;97305:29:0;;;;;97254:92;97396:23;;;;97358:21;;97867:5;;97383:36;;-1:-1:-1;;;;;97383:36:0;:10;:36;:::i;:::-;97382:58;;;;:::i;:::-;97461:16;;;-1:-1:-1;97358:82:0;;-1:-1:-1;;97059:442:0;;;;;;:::o;106227:136::-;61290:4;61736:16;61290:4;61736:10;:16::i;:::-;106319:36:::1;::::0;106327:10:::1;::::0;106319:36;::::1;;;::::0;106348:6;;106319:36:::1;::::0;;;106348:6;106327:10;106319:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;64108:147:::0;63741:7;63768:12;;;:6;:12;;;;;:22;;;61736:16;61747:4;61736:10;:16::i;:::-;64222:25:::1;64233:4;64239:7;64222:10;:25::i;88866:256::-:0;88963:7;88999:23;89016:5;88999:16;:23::i;:::-;88991:5;:31;88983:87;;;;-1:-1:-1;;;88983:87:0;;16874:2:1;88983:87:0;;;16856:21:1;16913:2;16893:18;;;16886:30;16952:34;16932:18;;;16925:62;-1:-1:-1;;;17003:18:1;;;16996:41;17054:19;;88983:87:0;;;;;;;;;-1:-1:-1;;;;;;89088:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;88866:256::o;65252:218::-;-1:-1:-1;;;;;65348:23:0;;39660:10;65348:23;65340:83;;;;-1:-1:-1;;;65340:83:0;;17286:2:1;65340:83:0;;;17268:21:1;17325:2;17305:18;;;17298:30;17364:34;17344:18;;;17337:62;-1:-1:-1;;;17415:18:1;;;17408:45;17470:19;;65340:83:0;17084:411:1;65340:83:0;65436:26;65448:4;65454:7;65436:11;:26::i;:::-;65252:218;;:::o;110099:82::-;-1:-1:-1;;;;;;;;;;;61736:16:0;61747:4;61736:10;:16::i;:::-;110163:10:::1;:8;:10::i;:::-;110099:82:::0;:::o;109383:190::-;109506:4;-1:-1:-1;;;;;9234:18:0;;9242:10;9234:18;9230:83;;9269:32;9290:10;9269:20;:32::i;:::-;109523:42:::1;109546:4;109552:2;109556:8;109523:22;:42::i;85310:242::-:0;85428:41;39660:10;85447:12;85461:7;85428:18;:41::i;:::-;85420:99;;;;-1:-1:-1;;;85420:99:0;;;;;;;:::i;:::-;85530:14;85536:7;85530:5;:14::i;89388:233::-;89463:7;89499:30;89286:10;:17;;89198:113;89499:30;89491:5;:38;89483:95;;;;-1:-1:-1;;;89483:95:0;;18116:2:1;89483:95:0;;;18098:21:1;18155:2;18135:18;;;18128:30;18194:34;18174:18;;;18167:62;-1:-1:-1;;;18245:18:1;;;18238:42;18297:19;;89483:95:0;17914:408:1;89483:95:0;89596:10;89607:5;89596:17;;;;;;;;:::i;:::-;;;;;;;;;89589:24;;89388:233;;;:::o;69564:223::-;69636:7;74451:16;;;:7;:16;;;;;;-1:-1:-1;;;;;74451:16:0;;69700:56;;;;-1:-1:-1;;;69700:56:0;;18661:2:1;69700:56:0;;;18643:21:1;18700:2;18680:18;;;18673:30;-1:-1:-1;;;18719:18:1;;;18712:54;18783:18;;69700:56:0;18459:348:1;107067:121:0;-1:-1:-1;;;;;;;;;;;61736:16:0;61747:4;61736:10;:16::i;:::-;-1:-1:-1;107161:9:0::1;:19:::0;107067:121::o;69295:207::-;69367:7;-1:-1:-1;;;;;69395:19:0;;69387:73;;;;-1:-1:-1;;;69387:73:0;;19014:2:1;69387:73:0;;;18996:21:1;19053:2;19033:18;;;19026:30;19092:34;19072:18;;;19065:62;-1:-1:-1;;;19143:18:1;;;19136:39;19192:19;;69387:73:0;18812:405:1;69387:73:0;-1:-1:-1;;;;;;69478:16:0;;;;;:9;:16;;;;;;;69295:207::o;110015:78::-;-1:-1:-1;;;;;;;;;;;61736:16:0;61747:4;61736:10;:16::i;:::-;110077:8:::1;:6;:8::i;106678:381::-:0;106782:16;106816:15;106834:17;106844:6;106834:9;:17::i;:::-;106816:35;;106862:23;106902:7;-1:-1:-1;;;;;106888:22:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;106888:22:0;;106862:48;;106926:9;106921:107;106945:7;106941:1;:11;106921:107;;;106986:30;107006:6;107014:1;106986:19;:30::i;:::-;106974:6;106981:1;106974:9;;;;;;;;:::i;:::-;;;;;;;;;;:42;106954:3;;;;:::i;:::-;;;;106921:107;;;-1:-1:-1;107045:6:0;106678:381;-1:-1:-1;;;106678:381:0:o;103938:296::-;-1:-1:-1;;;;;;;;;;;61736:16:0;61747:4;61736:10;:16::i;:::-;104072:9:::1;;104068:1;104059:6;104049:7;;:16;;;;:::i;:::-;:20;;;;:::i;:::-;:32;104046:70;;;104083:33;::::0;-1:-1:-1;;;104083:33:0;;19827:2:1;104083:33:0::1;::::0;::::1;19809:21:1::0;19866:2;19846:18;;;19839:30;19905:25;19885:18;;;19878:53;19948:18;;104083:33:0::1;19625:347:1::0;104046:70:0::1;104130:9;104126:101;104149:6;104145:1;:10;104126:101;;;104173:22;104183:2;104187:7;;104173:9;:22::i;:::-;104206:7;:9:::0;;;:7:::1;:9;::::0;::::1;:::i;:::-;;;;;;104157:3;;;;;:::i;:::-;;;;104126:101;;62140:147:::0;62226:4;62250:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;62250:29:0;;;;;;;;;;;;;;;62140:147::o;70023:104::-;70079:13;70112:7;70105:14;;;;;:::i;108284:193::-;108405:8;9508:30;9529:8;9508:20;:30::i;:::-;108426:43:::1;108450:8;108460;108426:23;:43::i;109760:247::-:0;109929:4;-1:-1:-1;;;;;9234:18:0;;9242:10;9234:18;9230:83;;9269:32;9290:10;9269:20;:32::i;:::-;109951:48:::1;109974:4;109980:2;109984:8;109994:4;109951:22;:48::i;:::-;109760:247:::0;;;;;:::o;104242:507::-;104396:15;;;104369:24;104396:15;;;:9;:15;;;;;;;;;104369:42;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;104369:42:0;;;;;;;;;;-1:-1:-1;;;104369:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;104422;104439:10;104406:4;104422:42;;;:16;:42::i;:::-;;104480:38;104494:10;104506:5;104513:4;104480:13;:38::i;:::-;104475:71;;104520:26;;-1:-1:-1;;;104520:26:0;;20179:2:1;104520:26:0;;;20161:21:1;20218:2;20198:18;;;20191:30;-1:-1:-1;;;20237:18:1;;;20230:46;20293:18;;104520:26:0;19977:340:1;104475:71:0;104561:9;104557:140;104580:6;104576:10;;:1;:10;104557:140;;;104604:61;104614:10;104663:1;104645:8;:15;;;104626:8;:16;;;:34;;;;:::i;:::-;:38;;;;:::i;:::-;104604:9;:61::i;:::-;104676:7;:9;;;:7;:9;;;:::i;:::-;;;;;;104588:3;;;;;:::i;:::-;;;;104557:140;;;;104707:34;104716:10;104728:4;104734:6;104707:34;;:8;:34::i;107784:267::-;-1:-1:-1;;;;;;;;;;;61736:16:0;61747:4;61736:10;:16::i;:::-;107941:11:::1;:26;107955:12:::0;;107941:11;:26:::1;:::i;:::-;-1:-1:-1::0;107978:14:0::1;:32;107995:15:::0;;107978:14;:32:::1;:::i;:::-;-1:-1:-1::0;;108021:10:0::1;:22:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;108021:22:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;;107784:267:0:o;107194:408::-;74853:4;74451:16;;;:7;:16;;;;;;107299:13;;-1:-1:-1;;;;;74451:16:0;107330:77;;;;-1:-1:-1;;;107330:77:0;;22582:2:1;107330:77:0;;;22564:21:1;22621:2;22601:18;;;22594:30;22660:34;22640:18;;;22633:62;-1:-1:-1;;;22711:18:1;;;22704:45;22766:19;;107330:77:0;22380:411:1;107330:77:0;107423:10;;;;;;;107418:77;;107466:11;107479:14;107449:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;107435:60;;107194:408;;;:::o;107418:77::-;107537:11;107550:26;107567:8;107550:16;:26::i;:::-;107578:14;107520:73;;;;;;;;;;:::i;64548:149::-;63741:7;63768:12;;;:6;:12;;;;;:22;;;61736:16;61747:4;61736:10;:16::i;:::-;64663:26:::1;64675:4;64681:7;64663:11;:26::i;107608:170::-:0;107667:13;107729:11;107754:14;107712:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;107698:72;;107608:170;:::o;103113:403::-;61290:4;61736:16;61290:4;61736:10;:16::i;:::-;103205:40:::1;61290:4;103236:8:::0;103205:10:::1;:40::i;:::-;103256:33;-1:-1:-1::0;;;;;;;;;;;103280:8:0::1;103256:10;:33::i;:::-;103300;-1:-1:-1::0;;;;;;;;;;;103324:8:0::1;103300:10;:33::i;:::-;103344:36;-1:-1:-1::0;;;;;;;;;;;103369:10:0::1;103344:11;:36::i;:::-;103391;-1:-1:-1::0;;;;;;;;;;;103416:10:0::1;103391:11;:36::i;:::-;103438:43;61290:4;103470:10;103438:11;:43::i;:::-;-1:-1:-1::0;103492:5:0::1;:16:::0;;-1:-1:-1;;;;;;103492:16:0::1;-1:-1:-1::0;;;;;103492:16:0;;;::::1;::::0;;;::::1;::::0;;103113:403::o;104761:1035::-;-1:-1:-1;;;;;;;;;;;61736:16:0;61747:4;61736:10;:16::i;:::-;105206:11:::1;::::0;::::1;::::0;;::::1;105194:23:::0;;::::1;;;105186:60;;;::::0;-1:-1:-1;;;105186:60:0;;24924:2:1;105186:60:0::1;::::0;::::1;24906:21:1::0;24963:2;24943:18;;;24936:30;25002:26;24982:18;;;24975:54;25046:18;;105186:60:0::1;24722:348:1::0;105186:60:0::1;105262:8;105257:428;105280:7;:14;105276:1;:18;;;105257:428;;;105340:345;;;;;;;;105367:7;105375:1;105367:10;;;;;;;;;;:::i;:::-;;;;;;;105340:345;;;;105396:6;105403:1;105396:9;;;;;;;;;;:::i;:::-;;;;;;;105340:345;;;;105424:10;105435:1;105424:13;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;105340:345:0::1;;;;;105456:8;105465:1;105456:11;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;105340:345:0::1;;;;;105486:8;105495:1;105486:11;;;;;;;;;;:::i;:::-;;;;;;;105340:345;;;;105516:11;105528:1;105516:14;;;;;;;;;;:::i;:::-;;;;;;;105340:345;;;;105549:6;105556:1;105549:9;;;;;;;;;;:::i;:::-;;;;;;;105340:345;;;;105577:10;105588:1;105577:13;;;;;;;;;;:::i;:::-;;;;;;;105340:345;;;;105609:9;105619:1;105609:12;;;;;;;;;;:::i;:::-;;;;;;;105340:345;;;;105640:9;:23;105654:8;105650:1;:12;;;;:::i;:::-;105640:23;;;;;;;;;;;;;;;:30;;;105340:345;;::::0;105314:9:::1;:23;105328:8;105324:1;:12;;;;:::i;:::-;105314:23;;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;105314:23:0;:371;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;105314:371:0;;::::1;-1:-1:-1::0;;;105314:371:0::1;-1:-1:-1::0;;105314:371:0;;;;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;105296:3;::::1;::::0;::::1;:::i;:::-;;;;105257:428;;;-1:-1:-1::0;105728:11:0::1;::::0;105711:14;;105728:11:::1;::::0;;::::1;::::0;105700:25:::1;::::0;105711:14;105700:25;::::1;;:::i;:::-;:39;105696:92;;;105773:14:::0;;105755:33:::1;::::0;:8;:33:::1;:::i;:::-;105741:11;:47:::0;;-1:-1:-1;;105741:47:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;105696:92:::1;104761:1035:::0;;;;;;;;;;;:::o;96789:215::-;96891:4;-1:-1:-1;;;;;;96915:41:0;;-1:-1:-1;;;96915:41:0;;:81;;;96960:36;96984:11;96960:23;:36::i;81185:135::-;74853:4;74451:16;;;:7;:16;;;;;;-1:-1:-1;;;;;74451:16:0;81259:53;;;;-1:-1:-1;;;81259:53:0;;18661:2:1;81259:53:0;;;18643:21:1;18700:2;18680:18;;;18673:30;-1:-1:-1;;;18719:18:1;;;18712:54;18783:18;;81259:53:0;18459:348:1;9651:647:0;148:42;9842:45;:49;9838:453;;10141:67;;-1:-1:-1;;;10141:67:0;;10192:4;10141:67;;;25662:34:1;-1:-1:-1;;;;;25732:15:1;;25712:18;;;25705:43;148:42:0;;10141;;25597:18:1;;10141:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10136:144;;10236:28;;-1:-1:-1;;;10236:28:0;;-1:-1:-1;;;;;1697:32:1;;10236:28:0;;;1679:51:1;1652:18;;10236:28:0;1533:203:1;70884:416:0;70965:13;70981:23;70996:7;70981:14;:23::i;:::-;70965:39;;71029:5;-1:-1:-1;;;;;71023:11:0;:2;-1:-1:-1;;;;;71023:11:0;;71015:57;;;;-1:-1:-1;;;71015:57:0;;26211:2:1;71015:57:0;;;26193:21:1;26250:2;26230:18;;;26223:30;26289:34;26269:18;;;26262:62;-1:-1:-1;;;26340:18:1;;;26333:31;26381:19;;71015:57:0;26009:397:1;71015:57:0;39660:10;-1:-1:-1;;;;;71107:21:0;;;;:62;;-1:-1:-1;71132:37:0;71149:5;39660:10;71835:164;:::i;71132:37::-;71085:173;;;;-1:-1:-1;;;71085:173:0;;26613:2:1;71085:173:0;;;26595:21:1;26652:2;26632:18;;;26625:30;26691:34;26671:18;;;26664:62;26762:31;26742:18;;;26735:59;26811:19;;71085:173:0;26411:425:1;71085:173:0;71271:21;71280:2;71284:7;71271:8;:21::i;12298:190::-;12423:4;12476;12447:25;12460:5;12467:4;12447:12;:25::i;:::-;:33;;12298:190;-1:-1:-1;;;;12298:190:0:o;72066:335::-;72261:41;39660:10;72280:12;39580:98;72261:41;72253:99;;;;-1:-1:-1;;;72253:99:0;;;;;;;:::i;:::-;72365:28;72375:4;72381:2;72385:7;72365:9;:28::i;62591:105::-;62658:30;62669:4;39660:10;62658;:30::i;66849:238::-;66933:22;66941:4;66947:7;66933;:22::i;:::-;66928:152;;66972:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;66972:29:0;;;;;;;;;:36;;-1:-1:-1;;66972:36:0;67004:4;66972:36;;;67055:12;39660:10;;39580:98;67055:12;-1:-1:-1;;;;;67028:40:0;67046:7;-1:-1:-1;;;;;67028:40:0;67040:4;67028:40;;;;;;;;;;66849:238;;:::o;67267:239::-;67351:22;67359:4;67365:7;67351;:22::i;:::-;67347:152;;;67422:5;67390:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;67390:29:0;;;;;;;;;;:37;;-1:-1:-1;;67390:37:0;;;67447:40;39660:10;;67390:12;;67447:40;;67422:5;67447:40;67267:239;;:::o;103635:109::-;103683:7;:15;;-1:-1:-1;;103683:15:0;;;103714:22;39660:10;103723:12;103714:22;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;103714:22:0;;;;;;;103635:109::o;72472:185::-;72610:39;72627:4;72633:2;72637:7;72610:39;;;;;;;;;;;;:16;:39::i;75083:264::-;75176:4;75193:13;75209:23;75224:7;75209:14;:23::i;:::-;75193:39;;75262:5;-1:-1:-1;;;;;75251:16:0;:7;-1:-1:-1;;;;;75251:16:0;;:52;;;-1:-1:-1;;;;;;71956:25:0;;;71932:4;71956:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;75271:32;75251:87;;;;75331:7;-1:-1:-1;;;;;75307:31:0;:20;75319:7;75307:11;:20::i;:::-;-1:-1:-1;;;;;75307:31:0;;75243:96;75083:264;-1:-1:-1;;;;75083:264:0:o;102984:123::-;103078:21;103090:8;103078:11;:21::i;103523:104::-;103569:7;:14;;-1:-1:-1;;103569:14:0;103579:4;103569:14;;;103599:20;103606:12;39660:10;;39580:98;75689:110;75765:26;75775:2;75779:7;75765:26;;;;;;;;;;;;:9;:26::i;71609:155::-;71704:52;39660:10;71737:8;71747;71704:18;:52::i;72728:322::-;72902:41;39660:10;72935:7;72902:18;:41::i;:::-;72894:99;;;;-1:-1:-1;;;72894:99:0;;;;;;;:::i;:::-;73004:38;73018:4;73024:2;73028:7;73037:4;73004:13;:38::i;101484:1183::-;101620:11;;101585:4;;101620:11;;;;101612:19;;;;101608:54;;101633:29;;-1:-1:-1;;;101633:29:0;;27277:2:1;101633:29:0;;;27259:21:1;27316:2;27296:18;;;27289:30;-1:-1:-1;;;27335:18:1;;;27328:49;27394:18;;101633:29:0;27075:343:1;101608:54:0;101700:15;;;101673:24;101700:15;;;:9;:15;;;;;;;;;101673:42;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;101673:42:0;;;;;;;;;-1:-1:-1;;;101673:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101730:15;:36;101726:78;;;101768:36;;-1:-1:-1;;;101768:36:0;;27625:2:1;101768:36:0;;;27607:21:1;27664:2;27644:18;;;27637:30;27703:28;27683:18;;;27676:56;27749:18;;101768:36:0;27423:350:1;101726:78:0;101837:8;:16;;;-1:-1:-1;;;;;101819:34:0;:15;:34;101815:67;;;101855:27;;-1:-1:-1;;;101855:27:0;;27980:2:1;101855:27:0;;;27962:21:1;28019:2;27999:18;;;27992:30;-1:-1:-1;;;28038:18:1;;;28031:47;28095:18;;101855:27:0;27778:341:1;101815:67:0;101933:8;101915;:15;;;:26;;;;:::i;:::-;101897:15;;:44;101893:81;;;101943:31;;-1:-1:-1;;;101943:31:0;;28326:2:1;101943:31:0;;;28308:21:1;28365:2;28345:18;;;28338:30;-1:-1:-1;;;28384:18:1;;;28377:51;28445:18;;101943:31:0;28124:345:1;101893:81:0;102014:9;;102010:1;101999:8;101989:7;;:18;;;;:::i;:::-;:22;;;;:::i;:::-;:34;101985:75;;;102025:35;;-1:-1:-1;;;102025:35:0;;28676:2:1;102025:35:0;;;28658:21:1;28715:2;28695:18;;;28688:30;28754:27;28734:18;;;28727:55;28799:18;;102025:35:0;28474:349:1;101985:75:0;102075:17;;;;:22;;;;:68;;;102126:8;:17;;;102122:1;102111:8;102101:7;;:18;;;;:::i;:::-;:22;;;;:::i;:::-;:42;102075:68;102071:106;;;102145:32;;-1:-1:-1;;;102145:32:0;;29030:2:1;102145:32:0;;;29012:21:1;29069:2;29049:18;;;29042:30;-1:-1:-1;;;29088:18:1;;;29081:52;29150:18;;102145:32:0;28828:346:1;102071:106:0;102192:14;;;;:19;;;;:48;;;102232:8;102215;:14;;;:25;102192:48;102188:128;;;102255:61;;-1:-1:-1;;;102255:61:0;;29381:2:1;102255:61:0;;;29363:21:1;29420:2;29400:18;;;29393:30;29459:34;29439:18;;;29432:62;-1:-1:-1;;;29510:18:1;;;29503:49;29569:19;;102255:61:0;29179:415:1;102188:128:0;102331:18;;;;:23;;;;:79;;-1:-1:-1;102379:14:0;;;;;;;:8;:14;;;;;;;;-1:-1:-1;;;;;102379:20:0;;;;;;;;;;:31;;102402:8;;102379:31;:::i;:::-;102358:8;:18;;;:52;102331:79;102327:154;;;102425:56;;-1:-1:-1;;;102425:56:0;;29801:2:1;102425:56:0;;;29783:21:1;29840:2;29820:18;;;29813:30;29879:34;29859:18;;;29852:62;-1:-1:-1;;;29930:18:1;;;29923:44;29984:19;;102425:56:0;29599:410:1;102327:154:0;102496:8;102508:1;102496:13;102492:45;;102511:26;;-1:-1:-1;;;102511:26:0;;30216:2:1;102511:26:0;;;30198:21:1;30255:2;30235:18;;;30228:30;-1:-1:-1;;;30274:18:1;;;30267:46;30330:18;;102511:26:0;30014:340:1;102492:45:0;102552:10;-1:-1:-1;;;;;102552:18:0;;;:60;;;;;102604:8;102587;:14;;;:25;;;;:::i;:::-;102574:9;:38;;102552:60;102548:89;;;102614:23;;-1:-1:-1;;;102614:23:0;;30561:2:1;102614:23:0;;;30543:21:1;30600:2;30580:18;;;30573:30;-1:-1:-1;;;30619:18:1;;;30612:43;30672:18;;102614:23:0;30359:337:1;102548:89:0;-1:-1:-1;102655:4:0;;101484:1183;-1:-1:-1;;;;101484:1183:0:o;101300:178::-;101393:14;;;;;;;:8;:14;;;;;;;;-1:-1:-1;;;;;101393:20:0;;;;;;;;;:32;;101417:8;;101393:14;:32;;101417:8;;101393:32;:::i;:::-;;;;-1:-1:-1;;101436:15:0;;;;;;;:9;:15;;;;;:22;;:34;;101462:8;;101436:15;:34;;101462:8;;101436:34;:::i;:::-;;;;-1:-1:-1;;;;;101300:178:0:o;37001:716::-;37057:13;37108:14;37125:17;37136:5;37125:10;:17::i;:::-;37145:1;37125:21;37108:38;;37161:20;37195:6;-1:-1:-1;;;;;37184:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37184:18:0;-1:-1:-1;37161:41:0;-1:-1:-1;37326:28:0;;;37342:2;37326:28;37383:288;-1:-1:-1;;37415:5:0;-1:-1:-1;;;37552:2:0;37541:14;;37536:30;37415:5;37523:44;37613:2;37604:11;;;-1:-1:-1;37634:21:0;37383:288;37634:21;-1:-1:-1;37692:6:0;37001:716;-1:-1:-1;;;37001:716:0:o;61844:204::-;61929:4;-1:-1:-1;;;;;;61953:47:0;;-1:-1:-1;;;61953:47:0;;:87;;;62004:36;62028:11;62004:23;:36::i;80464:174::-;80539:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;80539:29:0;-1:-1:-1;;;;;80539:29:0;;;;;;;;:24;;80593:23;80539:24;80593:14;:23::i;:::-;-1:-1:-1;;;;;80584:46:0;;;;;;;;;;;80464:174;;:::o;13165:296::-;13248:7;13291:4;13248:7;13306:118;13330:5;:12;13326:1;:16;13306:118;;;13379:33;13389:12;13403:5;13409:1;13403:8;;;;;;;;:::i;:::-;;;;;;;13379:9;:33::i;:::-;13364:48;-1:-1:-1;13344:3:0;;;;:::i;:::-;;;;13306:118;;79082:1263;79241:4;-1:-1:-1;;;;;79214:31:0;:23;79229:7;79214:14;:23::i;:::-;-1:-1:-1;;;;;79214:31:0;;79206:81;;;;-1:-1:-1;;;79206:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;79306:16:0;;79298:65;;;;-1:-1:-1;;;79298:65:0;;31309:2:1;79298:65:0;;;31291:21:1;31348:2;31328:18;;;31321:30;31387:34;31367:18;;;31360:62;-1:-1:-1;;;31438:18:1;;;31431:34;31482:19;;79298:65:0;31107:400:1;79298:65:0;79376:42;79397:4;79403:2;79407:7;79416:1;79376:20;:42::i;:::-;79548:4;-1:-1:-1;;;;;79521:31:0;:23;79536:7;79521:14;:23::i;:::-;-1:-1:-1;;;;;79521:31:0;;79513:81;;;;-1:-1:-1;;;79513:81:0;;;;;;;:::i;:::-;79666:24;;;;:15;:24;;;;;;;;79659:31;;-1:-1:-1;;;;;;79659:31:0;;;;;;-1:-1:-1;;;;;80142:15:0;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;80142:20:0;;;80177:13;;;;;;;;;:18;;79659:31;80177:18;;;80217:16;;;:7;:16;;;;;;:21;;;;;;;;;;80256:27;;79682:7;;80256:27;;;108655:176;;;:::o;62986:492::-;63075:22;63083:4;63089:7;63075;:22::i;:::-;63070:401;;63263:28;63283:7;63263:19;:28::i;:::-;63364:38;63392:4;63399:2;63364:19;:38::i;:::-;63168:257;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;63168:257:0;;;;;;;;;;-1:-1:-1;;;63114:345:0;;;;;;;:::i;87313:206::-;87382:20;87394:7;87382:11;:20::i;:::-;87425:19;;;;:10;:19;;;;;87419:33;;;;;:::i;:::-;:38;;-1:-1:-1;87415:97:0;;87481:19;;;;:10;:19;;;;;87474:26;;;:::i;76026:319::-;76155:18;76161:2;76165:7;76155:5;:18::i;:::-;76206:53;76237:1;76241:2;76245:7;76254:4;76206:22;:53::i;:::-;76184:153;;;;-1:-1:-1;;;76184:153:0;;;;;;;:::i;80781:315::-;80936:8;-1:-1:-1;;;;;80927:17:0;:5;-1:-1:-1;;;;;80927:17:0;;80919:55;;;;-1:-1:-1;;;80919:55:0;;32950:2:1;80919:55:0;;;32932:21:1;32989:2;32969:18;;;32962:30;33028:27;33008:18;;;33001:55;33073:18;;80919:55:0;32748:349:1;80919:55:0;-1:-1:-1;;;;;80985:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;80985:46:0;;;;;;;;;;81047:41;;540::1;;;81047::0;;513:18:1;81047:41:0;;;;;;;80781:315;;;:::o;73931:313::-;74087:28;74097:4;74103:2;74107:7;74087:9;:28::i;:::-;74134:47;74157:4;74163:2;74167:7;74176:4;74134:22;:47::i;:::-;74126:110;;;;-1:-1:-1;;;74126:110:0;;;;;;;:::i;33861:922::-;33914:7;;-1:-1:-1;;;33992:15:0;;33988:102;;-1:-1:-1;;;34028:15:0;;;-1:-1:-1;34072:2:0;34062:12;33988:102;34117:6;34108:5;:15;34104:102;;34153:6;34144:15;;;-1:-1:-1;34188:2:0;34178:12;34104:102;34233:6;34224:5;:15;34220:102;;34269:6;34260:15;;;-1:-1:-1;34304:2:0;34294:12;34220:102;34349:5;34340;:14;34336:99;;34384:5;34375:14;;;-1:-1:-1;34418:1:0;34408:11;34336:99;34462:5;34453;:14;34449:99;;34497:5;34488:14;;;-1:-1:-1;34531:1:0;34521:11;34449:99;34575:5;34566;:14;34562:99;;34610:5;34601:14;;;-1:-1:-1;34644:1:0;34634:11;34562:99;34688:5;34679;:14;34675:66;;34724:1;34714:11;34769:6;33861:922;-1:-1:-1;;33861:922:0:o;88558:224::-;88660:4;-1:-1:-1;;;;;;88684:50:0;;-1:-1:-1;;;88684:50:0;;:90;;;88738:36;88762:11;88738:23;:36::i;20205:149::-;20268:7;20299:1;20295;:5;:51;;20430:13;20524:15;;;20560:4;20553:15;;;20607:4;20591:21;;20295:51;;;20430:13;20524:15;;;20560:4;20553:15;;;20607:4;20591:21;;20303:20;20288:58;20205:149;-1:-1:-1;;;20205:149:0:o;102673:305::-;110258:7;;;;102847:9;:31;;;-1:-1:-1;;;;;;102860:18:0;;;102847:31;102844:126;;;102880:57;102907:4;102913:2;102917:8;102927:9;102880:26;:57::i;:::-;102844:126;;;102953:17;;-1:-1:-1;;;102953:17:0;;33304:2:1;102953:17:0;;;33286:21:1;33343:1;33323:18;;;33316:29;-1:-1:-1;;;33361:18:1;;;33354:37;33408:18;;102953:17:0;33102:330:1;38737:151:0;38795:13;38828:52;-1:-1:-1;;;;;38840:22:0;;36892:2;38133:447;38208:13;38234:19;38266:10;38270:6;38266:1;:10;:::i;:::-;:14;;38279:1;38266:14;:::i;:::-;-1:-1:-1;;;;;38256:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38256:25:0;;38234:47;;-1:-1:-1;;;38292:6:0;38299:1;38292:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;38292:15:0;;;;;;;;;-1:-1:-1;;;38318:6:0;38325:1;38318:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;38318:15:0;;;;;;;;-1:-1:-1;38349:9:0;38361:10;38365:6;38361:1;:10;:::i;:::-;:14;;38374:1;38361:14;:::i;:::-;38349:26;;38344:131;38381:1;38377;:5;38344:131;;;-1:-1:-1;;;38425:5:0;38433:3;38425:11;38416:21;;;;;;;:::i;:::-;;;;38404:6;38411:1;38404:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;38404:33:0;;;;;;;;-1:-1:-1;38462:1:0;38452:11;;;;;38384:3;;;:::i;:::-;;;38344:131;;;-1:-1:-1;38493:10:0;;38485:55;;;;-1:-1:-1;;;38485:55:0;;33780:2:1;38485:55:0;;;33762:21:1;;;33799:18;;;33792:30;33858:34;33838:18;;;33831:62;33910:18;;38485:55:0;33578:356:1;77962:783:0;78022:13;78038:23;78053:7;78038:14;:23::i;:::-;78022:39;;78074:51;78095:5;78110:1;78114:7;78123:1;78074:20;:51::i;:::-;78238:23;78253:7;78238:14;:23::i;:::-;78309:24;;;;:15;:24;;;;;;;;78302:31;;-1:-1:-1;;;;;;78302:31:0;;;;;;-1:-1:-1;;;;;78554:16:0;;;;;:9;:16;;;;;:21;;-1:-1:-1;;78554:21:0;;;78604:16;;;:7;:16;;;;;;78597:23;;;;;;;78638:36;78230:31;;-1:-1:-1;78325:7:0;;78638:36;;78309:24;;78638:36;65252:218;;:::o;76681:942::-;-1:-1:-1;;;;;76761:16:0;;76753:61;;;;-1:-1:-1;;;76753:61:0;;34141:2:1;76753:61:0;;;34123:21:1;;;34160:18;;;34153:30;34219:34;34199:18;;;34192:62;34271:18;;76753:61:0;33939:356:1;76753:61:0;74853:4;74451:16;;;:7;:16;;;;;;-1:-1:-1;;;;;74451:16:0;74877:31;76825:58;;;;-1:-1:-1;;;76825:58:0;;34502:2:1;76825:58:0;;;34484:21:1;34541:2;34521:18;;;34514:30;34580;34560:18;;;34553:58;34628:18;;76825:58:0;34300:352:1;76825:58:0;76896:48;76925:1;76929:2;76933:7;76942:1;76896:20;:48::i;:::-;74853:4;74451:16;;;:7;:16;;;;;;-1:-1:-1;;;;;74451:16:0;74877:31;77034:58;;;;-1:-1:-1;;;77034:58:0;;34502:2:1;77034:58:0;;;34484:21:1;34541:2;34521:18;;;34514:30;34580;34560:18;;;34553:58;34628:18;;77034:58:0;34300:352:1;77034:58:0;-1:-1:-1;;;;;77441:13:0;;;;;;:9;:13;;;;;;;;:18;;77458:1;77441:18;;;77483:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;77483:21:0;;;;;77522:33;77491:7;;77441:13;;77522:33;;77441:13;;77522:33;65252:218;;:::o;81884:853::-;82038:4;-1:-1:-1;;;;;82059:13:0;;41328:19;:23;82055:675;;82095:71;;-1:-1:-1;;;82095:71:0;;-1:-1:-1;;;;;82095:36:0;;;;;:71;;39660:10;;82146:4;;82152:7;;82161:4;;82095:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;82095:71:0;;;;;;;;-1:-1:-1;;82095:71:0;;;;;;;;;;;;:::i;:::-;;;82091:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82336:6;:13;82353:1;82336:18;82332:328;;82379:60;;-1:-1:-1;;;82379:60:0;;;;;;;:::i;82332:328::-;82610:6;82604:13;82595:6;82591:2;82587:15;82580:38;82091:584;-1:-1:-1;;;;;;82217:51:0;-1:-1:-1;;;82217:51:0;;-1:-1:-1;82210:58:0;;68926:305;69028:4;-1:-1:-1;;;;;;69065:40:0;;-1:-1:-1;;;69065:40:0;;:105;;-1:-1:-1;;;;;;;69122:48:0;;-1:-1:-1;;;69122:48:0;69065:105;:158;;;-1:-1:-1;;;;;;;;;;59206:40:0;;;69187:36;59097:157;89695:915;89872:61;89899:4;89905:2;89909:12;89923:9;89872:26;:61::i;:::-;89962:1;89950:9;:13;89946:222;;;90093:63;;-1:-1:-1;;;90093:63:0;;35607:2:1;90093:63:0;;;35589:21:1;35646:2;35626:18;;;35619:30;35685:34;35665:18;;;35658:62;-1:-1:-1;;;35736:18:1;;;35729:51;35797:19;;90093:63:0;35405:417:1;89946:222:0;90198:12;-1:-1:-1;;;;;90227:18:0;;90223:187;;90262:40;90294:7;91437:10;:17;;91410:24;;;;:15;:24;;;;;:44;;;91465:24;;;;;;;;;;;;91333:164;90262:40;90223:187;;;90332:2;-1:-1:-1;;;;;90324:10:0;:4;-1:-1:-1;;;;;90324:10:0;;90320:90;;90351:47;90384:4;90390:7;90351:32;:47::i;:::-;-1:-1:-1;;;;;90424:16:0;;90420:183;;90457:45;90494:7;90457:36;:45::i;:::-;90420:183;;;90530:4;-1:-1:-1;;;;;90524:10:0;:2;-1:-1:-1;;;;;90524:10:0;;90520:83;;90551:40;90579:2;90583:7;90551:27;:40::i;83469:410::-;83659:1;83647:9;:13;83643:229;;;-1:-1:-1;;;;;83681:18:0;;;83677:87;;-1:-1:-1;;;;;83720:15:0;;;;;;:9;:15;;;;;:28;;83739:9;;83720:15;:28;;83739:9;;83720:28;:::i;:::-;;;;-1:-1:-1;;83677:87:0;-1:-1:-1;;;;;83782:16:0;;;83778:83;;-1:-1:-1;;;;;83819:13:0;;;;;;:9;:13;;;;;:26;;83836:9;;83819:13;:26;;83836:9;;83819:26;:::i;:::-;;;;-1:-1:-1;;83469:410:0;;;;:::o;92124:988::-;92390:22;92440:1;92415:22;92432:4;92415:16;:22::i;:::-;:26;;;;:::i;:::-;92452:18;92473:26;;;:17;:26;;;;;;92390:51;;-1:-1:-1;92606:28:0;;;92602:328;;-1:-1:-1;;;;;92673:18:0;;92651:19;92673:18;;;:12;:18;;;;;;;;:34;;;;;;;;;92724:30;;;;;;:44;;;92841:30;;:17;:30;;;;;:43;;;92602:328;-1:-1:-1;93026:26:0;;;;:17;:26;;;;;;;;93019:33;;;-1:-1:-1;;;;;93070:18:0;;;;;:12;:18;;;;;:34;;;;;;;93063:41;92124:988::o;93407:1079::-;93685:10;:17;93660:22;;93685:21;;93705:1;;93685:21;:::i;:::-;93717:18;93738:24;;;:15;:24;;;;;;94111:10;:26;;93660:46;;-1:-1:-1;93738:24:0;;93660:46;;94111:26;;;;;;:::i;:::-;;;;;;;;;94089:48;;94175:11;94150:10;94161;94150:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;94255:28;;;:15;:28;;;;;;;:41;;;94427:24;;;;;94420:31;94462:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;93478:1008;;;93407:1079;:::o;90911:221::-;90996:14;91013:20;91030:2;91013:16;:20::i;:::-;-1:-1:-1;;;;;91044:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;91089:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;90911:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2178:127::-;2239:10;2234:3;2230:20;2227:1;2220:31;2270:4;2267:1;2260:15;2294:4;2291:1;2284:15;2310:275;2381:2;2375:9;2446:2;2427:13;;-1:-1:-1;;2423:27:1;2411:40;;-1:-1:-1;;;;;2466:34:1;;2502:22;;;2463:62;2460:88;;;2528:18;;:::i;:::-;2564:2;2557:22;2310:275;;-1:-1:-1;2310:275:1:o;2590:183::-;2650:4;-1:-1:-1;;;;;2675:6:1;2672:30;2669:56;;;2705:18;;:::i;:::-;-1:-1:-1;2750:1:1;2746:14;2762:4;2742:25;;2590:183::o;2778:662::-;2832:5;2885:3;2878:4;2870:6;2866:17;2862:27;2852:55;;2903:1;2900;2893:12;2852:55;2939:6;2926:20;2965:4;2989:60;3005:43;3045:2;3005:43;:::i;:::-;2989:60;:::i;:::-;3083:15;;;3169:1;3165:10;;;;3153:23;;3149:32;;;3114:12;;;;3193:15;;;3190:35;;;3221:1;3218;3211:12;3190:35;3257:2;3249:6;3245:15;3269:142;3285:6;3280:3;3277:15;3269:142;;;3351:17;;3339:30;;3389:12;;;;3302;;3269:142;;;-1:-1:-1;3429:5:1;2778:662;-1:-1:-1;;;;;;2778:662:1:o;3445:159::-;3512:20;;3572:6;3561:18;;3551:29;;3541:57;;3594:1;3591;3584:12;3609:494;3710:6;3718;3726;3779:2;3767:9;3758:7;3754:23;3750:32;3747:52;;;3795:1;3792;3785:12;3747:52;3818:29;3837:9;3818:29;:::i;:::-;3808:39;;3898:2;3887:9;3883:18;3870:32;-1:-1:-1;;;;;3917:6:1;3914:30;3911:50;;;3957:1;3954;3947:12;3911:50;3980:61;4033:7;4024:6;4013:9;4009:22;3980:61;:::i;:::-;3970:71;;;4060:37;4093:2;4082:9;4078:18;4060:37;:::i;:::-;4050:47;;3609:494;;;;;:::o;4483:258::-;4550:6;4558;4611:2;4599:9;4590:7;4586:23;4582:32;4579:52;;;4627:1;4624;4617:12;4579:52;4650:28;4668:9;4650:28;:::i;:::-;4640:38;;4697;4731:2;4720:9;4716:18;4697:38;:::i;:::-;4687:48;;4483:258;;;;;:::o;4746:328::-;4823:6;4831;4839;4892:2;4880:9;4871:7;4867:23;4863:32;4860:52;;;4908:1;4905;4898:12;4860:52;4931:29;4950:9;4931:29;:::i;:::-;4921:39;;4979:38;5013:2;5002:9;4998:18;4979:38;:::i;:::-;4969:48;;5064:2;5053:9;5049:18;5036:32;5026:42;;4746:328;;;;;:::o;5446:248::-;5514:6;5522;5575:2;5563:9;5554:7;5550:23;5546:32;5543:52;;;5591:1;5588;5581:12;5543:52;-1:-1:-1;;5614:23:1;;;5684:2;5669:18;;;5656:32;;-1:-1:-1;5446:248:1:o;5978:254::-;6046:6;6054;6107:2;6095:9;6086:7;6082:23;6078:32;6075:52;;;6123:1;6120;6113:12;6075:52;6159:9;6146:23;6136:33;;6188:38;6222:2;6211:9;6207:18;6188:38;:::i;6476:184::-;6534:6;6587:2;6575:9;6566:7;6562:23;6558:32;6555:52;;;6603:1;6600;6593:12;6555:52;6626:28;6644:9;6626:28;:::i;7544:186::-;7603:6;7656:2;7644:9;7635:7;7631:23;7627:32;7624:52;;;7672:1;7669;7662:12;7624:52;7695:29;7714:9;7695:29;:::i;7735:632::-;7906:2;7958:21;;;8028:13;;7931:18;;;8050:22;;;7877:4;;7906:2;8129:15;;;;8103:2;8088:18;;;7877:4;8172:169;8186:6;8183:1;8180:13;8172:169;;;8247:13;;8235:26;;8316:15;;;;8281:12;;;;8208:1;8201:9;8172:169;;;-1:-1:-1;8358:3:1;;7735:632;-1:-1:-1;;;;;;7735:632:1:o;8372:118::-;8458:5;8451:13;8444:21;8437:5;8434:32;8424:60;;8480:1;8477;8470:12;8495:315;8560:6;8568;8621:2;8609:9;8600:7;8596:23;8592:32;8589:52;;;8637:1;8634;8627:12;8589:52;8660:29;8679:9;8660:29;:::i;:::-;8650:39;;8739:2;8728:9;8724:18;8711:32;8752:28;8774:5;8752:28;:::i;:::-;8799:5;8789:15;;;8495:315;;;;;:::o;8815:980::-;8910:6;8918;8926;8934;8987:3;8975:9;8966:7;8962:23;8958:33;8955:53;;;9004:1;9001;8994:12;8955:53;9027:29;9046:9;9027:29;:::i;:::-;9017:39;;9075:2;9096:38;9130:2;9119:9;9115:18;9096:38;:::i;:::-;9086:48;;9181:2;9170:9;9166:18;9153:32;9143:42;;9236:2;9225:9;9221:18;9208:32;-1:-1:-1;;;;;9300:2:1;9292:6;9289:14;9286:34;;;9316:1;9313;9306:12;9286:34;9354:6;9343:9;9339:22;9329:32;;9399:7;9392:4;9388:2;9384:13;9380:27;9370:55;;9421:1;9418;9411:12;9370:55;9457:2;9444:16;9479:2;9475;9472:10;9469:36;;;9485:18;;:::i;:::-;9527:53;9570:2;9551:13;;-1:-1:-1;;9547:27:1;9543:36;;9527:53;:::i;:::-;9514:66;;9603:2;9596:5;9589:17;9643:7;9638:2;9633;9629;9625:11;9621:20;9618:33;9615:53;;;9664:1;9661;9654:12;9615:53;9719:2;9714;9710;9706:11;9701:2;9694:5;9690:14;9677:45;9763:1;9758:2;9753;9746:5;9742:14;9738:23;9731:34;;9784:5;9774:15;;;;;8815:980;;;;;;;:::o;9800:577::-;9899:6;9907;9915;9968:2;9956:9;9947:7;9943:23;9939:32;9936:52;;;9984:1;9981;9974:12;9936:52;10007:28;10025:9;10007:28;:::i;:::-;9997:38;;10085:2;10074:9;10070:18;10057:32;10129:4;10122:5;10118:16;10111:5;10108:27;10098:55;;10149:1;10146;10139:12;10098:55;10172:5;-1:-1:-1;10228:2:1;10213:18;;10200:32;-1:-1:-1;;;;;10244:30:1;;10241:50;;;10287:1;10284;10277:12;10241:50;10310:61;10363:7;10354:6;10343:9;10339:22;10310:61;:::i;:::-;10300:71;;;9800:577;;;;;:::o;10382:348::-;10434:8;10444:6;10498:3;10491:4;10483:6;10479:17;10475:27;10465:55;;10516:1;10513;10506:12;10465:55;-1:-1:-1;10539:20:1;;-1:-1:-1;;;;;10571:30:1;;10568:50;;;10614:1;10611;10604:12;10568:50;10651:4;10643:6;10639:17;10627:29;;10703:3;10696:4;10687:6;10679;10675:19;10671:30;10668:39;10665:59;;;10720:1;10717;10710:12;10735:850;10833:6;10841;10849;10857;10865;10918:2;10906:9;10897:7;10893:23;10889:32;10886:52;;;10934:1;10931;10924:12;10886:52;10974:9;10961:23;-1:-1:-1;;;;;11044:2:1;11036:6;11033:14;11030:34;;;11060:1;11057;11050:12;11030:34;11099:59;11150:7;11141:6;11130:9;11126:22;11099:59;:::i;:::-;11177:8;;-1:-1:-1;11073:85:1;-1:-1:-1;11265:2:1;11250:18;;11237:32;;-1:-1:-1;11281:16:1;;;11278:36;;;11310:1;11307;11300:12;11278:36;;11349:61;11402:7;11391:8;11380:9;11376:24;11349:61;:::i;:::-;11429:8;;-1:-1:-1;11323:87:1;-1:-1:-1;;11514:2:1;11499:18;;11486:32;11527:28;11486:32;11527:28;:::i;:::-;11574:5;11564:15;;;10735:850;;;;;;;;:::o;11590:260::-;11658:6;11666;11719:2;11707:9;11698:7;11694:23;11690:32;11687:52;;;11735:1;11732;11725:12;11687:52;11758:29;11777:9;11758:29;:::i;12522:844::-;12575:5;12628:3;12621:4;12613:6;12609:17;12605:27;12595:55;;12646:1;12643;12636:12;12595:55;12682:6;12669:20;12708:4;12732:60;12748:43;12788:2;12748:43;:::i;12732:60::-;12826:15;;;12912:1;12908:10;;;;12896:23;;12892:32;;;12857:12;;;;12936:15;;;12933:35;;;12964:1;12961;12954:12;12933:35;13000:2;12992:6;12988:15;13012:325;13028:6;13023:3;13020:15;13012:325;;;13108:3;13095:17;-1:-1:-1;;;;;13149:5:1;13145:30;13138:5;13135:41;13125:139;;13218:1;13247:2;13243;13236:14;13125:139;13277:18;;13315:12;;;;13045;;13012:325;;13371:2252;13733:6;13741;13749;13757;13765;13773;13781;13789;13797;13805;13858:3;13846:9;13837:7;13833:23;13829:33;13826:53;;;13875:1;13872;13865:12;13826:53;13915:9;13902:23;-1:-1:-1;;;;;13985:2:1;13977:6;13974:14;13971:34;;;14001:1;13998;13991:12;13971:34;14024:61;14077:7;14068:6;14057:9;14053:22;14024:61;:::i;:::-;14014:71;;14138:2;14127:9;14123:18;14110:32;14094:48;;14167:2;14157:8;14154:16;14151:36;;;14183:1;14180;14173:12;14151:36;14206:63;14261:7;14250:8;14239:9;14235:24;14206:63;:::i;:::-;14196:73;;14322:2;14311:9;14307:18;14294:32;14278:48;;14351:2;14341:8;14338:16;14335:36;;;14367:1;14364;14357:12;14335:36;14390:62;14444:7;14433:8;14422:9;14418:24;14390:62;:::i;:::-;14380:72;;14505:2;14494:9;14490:18;14477:32;14461:48;;14534:2;14524:8;14521:16;14518:36;;;14550:1;14547;14540:12;14518:36;14573:62;14627:7;14616:8;14605:9;14601:24;14573:62;:::i;:::-;14563:72;;14688:3;14677:9;14673:19;14660:33;14644:49;;14718:2;14708:8;14705:16;14702:36;;;14734:1;14731;14724:12;14702:36;14757:63;14812:7;14801:8;14790:9;14786:24;14757:63;:::i;:::-;14747:73;;14873:3;14862:9;14858:19;14845:33;14829:49;;14903:2;14893:8;14890:16;14887:36;;;14919:1;14916;14909:12;14887:36;14942:63;14997:7;14986:8;14975:9;14971:24;14942:63;:::i;:::-;14932:73;;15058:3;15047:9;15043:19;15030:33;15014:49;;15088:2;15078:8;15075:16;15072:36;;;15104:1;15101;15094:12;15072:36;15127:63;15182:7;15171:8;15160:9;15156:24;15127:63;:::i;:::-;15117:73;;15243:3;15232:9;15228:19;15215:33;15199:49;;15273:2;15263:8;15260:16;15257:36;;;15289:1;15286;15279:12;15257:36;15312:63;15367:7;15356:8;15345:9;15341:24;15312:63;:::i;:::-;15302:73;;15428:3;15417:9;15413:19;15400:33;15384:49;;15458:2;15448:8;15445:16;15442:36;;;15474:1;15471;15464:12;15442:36;;15497:63;15552:7;15541:8;15530:9;15526:24;15497:63;:::i;:::-;15487:73;;;15579:38;15612:3;15601:9;15597:19;15579:38;:::i;:::-;15569:48;;13371:2252;;;;;;;;;;;;;:::o;15628:380::-;15707:1;15703:12;;;;15750;;;15771:61;;15825:4;15817:6;15813:17;15803:27;;15771:61;15878:2;15870:6;15867:14;15847:18;15844:38;15841:161;;15924:10;15919:3;15915:20;15912:1;15905:31;15959:4;15956:1;15949:15;15987:4;15984:1;15977:15;15841:161;;15628:380;;;:::o;16013:127::-;16074:10;16069:3;16065:20;16062:1;16055:31;16105:4;16102:1;16095:15;16129:4;16126:1;16119:15;16145:168;16218:9;;;16249;;16266:15;;;16260:22;;16246:37;16236:71;;16287:18;;:::i;16450:217::-;16490:1;16516;16506:132;;16560:10;16555:3;16551:20;16548:1;16541:31;16595:4;16592:1;16585:15;16623:4;16620:1;16613:15;16506:132;-1:-1:-1;16652:9:1;;16450:217::o;17500:409::-;17702:2;17684:21;;;17741:2;17721:18;;;17714:30;17780:34;17775:2;17760:18;;17753:62;-1:-1:-1;;;17846:2:1;17831:18;;17824:43;17899:3;17884:19;;17500:409::o;18327:127::-;18388:10;18383:3;18379:20;18376:1;18369:31;18419:4;18416:1;18409:15;18443:4;18440:1;18433:15;19222:135;19261:3;19282:17;;;19279:43;;19302:18;;:::i;:::-;-1:-1:-1;19349:1:1;19338:13;;19222:135::o;19362:125::-;19427:9;;;19448:10;;;19445:36;;;19461:18;;:::i;19492:128::-;19559:9;;;19580:11;;;19577:37;;;19594:18;;:::i;20448:545::-;20550:2;20545:3;20542:11;20539:448;;;20586:1;20611:5;20607:2;20600:17;20656:4;20652:2;20642:19;20726:2;20714:10;20710:19;20707:1;20703:27;20697:4;20693:38;20762:4;20750:10;20747:20;20744:47;;;-1:-1:-1;20785:4:1;20744:47;20840:2;20835:3;20831:12;20828:1;20824:20;20818:4;20814:31;20804:41;;20895:82;20913:2;20906:5;20903:13;20895:82;;;20958:17;;;20939:1;20928:13;20895:82;;;20899:3;;;20448:545;;;:::o;21169:1206::-;-1:-1:-1;;;;;21288:3:1;21285:27;21282:53;;;21315:18;;:::i;:::-;21344:94;21434:3;21394:38;21426:4;21420:11;21394:38;:::i;:::-;21388:4;21344:94;:::i;:::-;21464:1;21489:2;21484:3;21481:11;21506:1;21501:616;;;;22161:1;22178:3;22175:93;;;-1:-1:-1;22234:19:1;;;22221:33;22175:93;-1:-1:-1;;21126:1:1;21122:11;;;21118:24;21114:29;21104:40;21150:1;21146:11;;;21101:57;22281:78;;21474:895;;21501:616;20395:1;20388:14;;;20432:4;20419:18;;-1:-1:-1;;21537:17:1;;;21638:9;21660:229;21674:7;21671:1;21668:14;21660:229;;;21763:19;;;21750:33;21735:49;;21870:4;21855:20;;;;21823:1;21811:14;;;;21690:12;21660:229;;;21664:3;21917;21908:7;21905:16;21902:159;;;22041:1;22037:6;22031:3;22025;22022:1;22018:11;22014:21;22010:34;22006:39;21993:9;21988:3;21984:19;21971:33;21967:79;21959:6;21952:95;21902:159;;;22104:1;22098:3;22095:1;22091:11;22087:19;22081:4;22074:33;21474:895;;21169:1206;;;:::o;22796:722::-;22846:3;22887:5;22881:12;22916:36;22942:9;22916:36;:::i;:::-;22971:1;22988:18;;;23015:133;;;;23162:1;23157:355;;;;22981:531;;23015:133;-1:-1:-1;;23048:24:1;;23036:37;;23121:14;;23114:22;23102:35;;23093:45;;;-1:-1:-1;23015:133:1;;23157:355;23188:5;23185:1;23178:16;23217:4;23262:2;23259:1;23249:16;23287:1;23301:165;23315:6;23312:1;23309:13;23301:165;;;23393:14;;23380:11;;;23373:35;23436:16;;;;23330:10;;23301:165;;;23305:3;;;23495:6;23490:3;23486:16;23479:23;;22981:531;;;;;22796:722;;;;:::o;23523:277::-;23696:3;23721:73;23755:38;23789:3;23781:6;23755:38;:::i;:::-;23747:6;23721:73;:::i;23805:469::-;24026:3;24054:38;24088:3;24080:6;24054:38;:::i;:::-;24121:6;24115:13;24137:65;24195:6;24191:2;24184:4;24176:6;24172:17;24137:65;:::i;:::-;24218:50;24260:6;24256:2;24252:15;24244:6;24218:50;:::i;:::-;24211:57;23805:469;-1:-1:-1;;;;;;;23805:469:1:o;24279:438::-;24553:3;24581:38;24615:3;24607:6;24581:38;:::i;:::-;-1:-1:-1;;;24635:2:1;24628:22;24666:45;24708:1;24704:2;24700:10;24692:6;24666:45;:::i;:::-;24659:52;24279:438;-1:-1:-1;;;;;24279:438:1:o;25075:168::-;25142:6;25168:10;;;25180;;;25164:27;;25203:11;;;25200:37;;;25217:18;;:::i;:::-;25200:37;25075:168;;;;:::o;25248:197::-;25286:3;25314:6;25355:2;25348:5;25344:14;25382:2;25373:7;25370:15;25367:41;;25388:18;;:::i;:::-;25437:1;25424:15;;25248:197;-1:-1:-1;;;25248:197:1:o;25759:245::-;25826:6;25879:2;25867:9;25858:7;25854:23;25850:32;25847:52;;;25895:1;25892;25885:12;25847:52;25927:9;25921:16;25946:28;25968:5;25946:28;:::i;30701:401::-;30903:2;30885:21;;;30942:2;30922:18;;;30915:30;30981:34;30976:2;30961:18;;30954:62;-1:-1:-1;;;31047:2:1;31032:18;;31025:35;31092:3;31077:19;;30701:401::o;31512:812::-;31923:25;31918:3;31911:38;31893:3;31978:6;31972:13;31994:75;32062:6;32057:2;32052:3;32048:12;32041:4;32033:6;32029:17;31994:75;:::i;:::-;-1:-1:-1;;;32128:2:1;32088:16;;;32120:11;;;32113:40;32178:13;;32200:76;32178:13;32262:2;32254:11;;32247:4;32235:17;;32200:76;:::i;:::-;32296:17;32315:2;32292:26;;31512:812;-1:-1:-1;;;;31512:812:1:o;32329:414::-;32531:2;32513:21;;;32570:2;32550:18;;;32543:30;32609:34;32604:2;32589:18;;32582:62;-1:-1:-1;;;32675:2:1;32660:18;;32653:48;32733:3;32718:19;;32329:414::o;33437:136::-;33476:3;33504:5;33494:39;;33513:18;;:::i;:::-;-1:-1:-1;;;33549:18:1;;33437:136::o;34657:489::-;-1:-1:-1;;;;;34926:15:1;;;34908:34;;34978:15;;34973:2;34958:18;;34951:43;35025:2;35010:18;;35003:34;;;35073:3;35068:2;35053:18;;35046:31;;;34851:4;;35094:46;;35120:19;;35112:6;35094:46;:::i;:::-;35086:54;34657:489;-1:-1:-1;;;;;;34657:489:1:o;35151:249::-;35220:6;35273:2;35261:9;35252:7;35248:23;35244:32;35241:52;;;35289:1;35286;35279:12;35241:52;35321:9;35315:16;35340:30;35364:5;35340:30;:::i;35827:127::-;35888:10;35883:3;35879:20;35876:1;35869:31;35919:4;35916:1;35909:15;35943:4;35940:1;35933:15
Swarm Source
ipfs://a100bb874d036e52d53aa251c32495a8e57552d1f58b4c7750fe7871e91a93cd
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.