Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 1,091 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 19857122 | 109 days ago | IN | 0 ETH | 0.00014477 | ||||
Safe Transfer Fr... | 19695623 | 131 days ago | IN | 0 ETH | 0.00086166 | ||||
Safe Transfer Fr... | 19695617 | 131 days ago | IN | 0 ETH | 0.00069186 | ||||
Safe Transfer Fr... | 19695609 | 131 days ago | IN | 0 ETH | 0.00052556 | ||||
Safe Transfer Fr... | 19598273 | 145 days ago | IN | 0 ETH | 0.00094051 | ||||
Safe Transfer Fr... | 19598272 | 145 days ago | IN | 0 ETH | 0.00136441 | ||||
Set Approval For... | 19118679 | 212 days ago | IN | 0 ETH | 0.00066889 | ||||
Set Approval For... | 19118627 | 212 days ago | IN | 0 ETH | 0.00052488 | ||||
Set Approval For... | 18624610 | 281 days ago | IN | 0 ETH | 0.00145129 | ||||
Set Approval For... | 18308612 | 326 days ago | IN | 0 ETH | 0.00014522 | ||||
Set Approval For... | 17789025 | 398 days ago | IN | 0 ETH | 0.00090604 | ||||
Set Approval For... | 17763624 | 402 days ago | IN | 0 ETH | 0.00253887 | ||||
Safe Transfer Fr... | 17749826 | 404 days ago | IN | 0 ETH | 0.00220786 | ||||
Transfer From | 17725005 | 407 days ago | IN | 0 ETH | 0.00180404 | ||||
Set Approval For... | 17725004 | 407 days ago | IN | 0 ETH | 0.00113944 | ||||
Set Approval For... | 17557164 | 431 days ago | IN | 0 ETH | 0.0006457 | ||||
Set Approval For... | 17010134 | 508 days ago | IN | 0 ETH | 0.00052868 | ||||
Set Approval For... | 16921339 | 521 days ago | IN | 0 ETH | 0.00157476 | ||||
Set Approval For... | 16850526 | 531 days ago | IN | 0 ETH | 0.00073947 | ||||
Set Approval For... | 16833793 | 533 days ago | IN | 0 ETH | 0.00127622 | ||||
Set Approval For... | 16683129 | 554 days ago | IN | 0 ETH | 0.00131484 | ||||
Set Approval For... | 16682573 | 554 days ago | IN | 0 ETH | 0.00117259 | ||||
Set Approval For... | 16630909 | 561 days ago | IN | 0 ETH | 0.00175152 | ||||
Set Approval For... | 16602380 | 565 days ago | IN | 0 ETH | 0.00048647 | ||||
Set Approval For... | 16522271 | 577 days ago | IN | 0 ETH | 0.00099422 |
Loading...
Loading
Contract Name:
GobzMutant
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-18 */ // SPDX-License-Identifier: MIT // Author @Akileus7 twitter.com/akileus7 Akileus.eth // Co-Author @atsu_eth twitter.com/atsu_eth // Owner: GobzNFT // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * 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. */ 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 proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _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} * * _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 the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _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} * * _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/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @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`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @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 payable; /** * @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); // ============================================================= // IERC721Metadata // ============================================================= /** * @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); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @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, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @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) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @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) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @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. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @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 memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File: contracts/GobzMutant.sol // Author @Akileus7 twitter.com/akileus7 Akileus.eth // Co-Author @atsu_eth twitter.com/atsu_eth // Owner: GobzNFT pragma solidity ^0.8.13; contract GobzMutant is ERC721A, Ownable { using Strings for uint256; using Counters for Counters.Counter; Counters.Counter private supply; bytes32 root; string uriPrefix; uint256 public immutable MAX_SUPPLY = 3333; uint256 public immutable MAX_PER_TX = 20; uint256 public immutable MAX_PER_TX_PRIVATE = 6; uint256 public MINT_PRICE_M1 = 0.05 ether; uint256 public MINT_PRICE_M2 = 0.1 ether; uint256 public MINT_PRICE_M3 = 0.2 ether; uint256[] TokenTypeM1; uint256[] TokenTypeM2; uint256[] TokenTypeM3; uint256 public M1_SPOT; uint256 public M2_SPOT; uint256 public M3_SPOT; bool public IS_PRE_SALE_ACTIVE = false; bool public IS_SALE_ACTIVE = false; enum MintType { M1, M2, M3 } mapping(address => uint) MintCountPerAddress; constructor( string memory Name, string memory Symbol, string memory _URI, bytes32 _root ) ERC721A(Name, Symbol) { root = _root; setURI(_URI); } function setMerkleRoot(bytes32 merkleroot) public onlyOwner { root = merkleroot; } function ownerMint( address to, uint256 quantity, MintType typeofmint ) external onlyOwner { uint256 nextTokenId = _nextTokenId(); require(nextTokenId + quantity <= MAX_SUPPLY, "Excedes max supply."); if (typeofmint == MintType.M1) { for (uint256 i = nextTokenId; i < nextTokenId + quantity; i++) { TokenTypeM1.push(i); } M1_SPOT += quantity; _mint(to, quantity); } if (typeofmint == MintType.M2) { for (uint256 i = nextTokenId; i < nextTokenId + quantity; i++) { TokenTypeM2.push(i); } M2_SPOT += quantity; _mint(to, quantity); } if (typeofmint == MintType.M3) { for (uint256 i = nextTokenId; i < nextTokenId + quantity; i++) { TokenTypeM3.push(i); } M3_SPOT += quantity; _mint(to, quantity); } } function mintPrivateM1(uint quantity, bytes32[] calldata proof) external payable { require(IS_PRE_SALE_ACTIVE, "Pre-sale haven't started"); uint256 nextTokenId = _nextTokenId(); require(_verify(_leaf(msg.sender), proof), "Invalid merkle proof"); require(nextTokenId + quantity <= MAX_SUPPLY, "Excedes max supply."); require( MintCountPerAddress[msg.sender] + quantity <= MAX_PER_TX_PRIVATE, "Exceeds allowance" ); MintCountPerAddress[msg.sender] += quantity; require( MINT_PRICE_M1 * quantity <= msg.value, "Ether value sent is not correct" ); for (uint256 i = nextTokenId; i < nextTokenId + quantity; i++) { TokenTypeM1.push(i); } M1_SPOT += quantity; _mint(msg.sender, quantity); } function mintPrivateM2(uint quantity, bytes32[] calldata proof) external payable { require(IS_PRE_SALE_ACTIVE, "Pre-sale haven't started"); uint256 nextTokenId = _nextTokenId(); require(_verify(_leaf(msg.sender), proof), "Invalid merkle proof"); require(nextTokenId + quantity <= MAX_SUPPLY, "Excedes max supply."); require( MintCountPerAddress[msg.sender] + quantity <= MAX_PER_TX_PRIVATE, "Exceeds allowance" ); MintCountPerAddress[msg.sender] += quantity; require( MINT_PRICE_M2 * quantity <= msg.value, "Ether value sent is not correct" ); for (uint256 i = nextTokenId; i < nextTokenId + quantity; i++) { TokenTypeM2.push(i); } M2_SPOT += quantity; _mint(msg.sender, quantity); } function mintPrivateM3(uint quantity, bytes32[] calldata proof) external payable { require(IS_PRE_SALE_ACTIVE, "Pre-sale haven't started"); uint256 nextTokenId = _nextTokenId(); require(_verify(_leaf(msg.sender), proof), "Invalid merkle proof"); require(nextTokenId + quantity <= MAX_SUPPLY, "Excedes max supply."); require( MintCountPerAddress[msg.sender] + quantity <= MAX_PER_TX_PRIVATE, "Exceeds allowance" ); MintCountPerAddress[msg.sender] += quantity; require( MINT_PRICE_M3 * quantity <= msg.value, "Ether value sent is not correct" ); for (uint256 i = nextTokenId; i < nextTokenId + quantity; i++) { TokenTypeM3.push(i); } M3_SPOT += quantity; _mint(msg.sender, quantity); } function mintM1(uint256 quantity) external payable { require(IS_SALE_ACTIVE, "Sale haven't started"); uint256 nextTokenId = _nextTokenId(); require(nextTokenId + quantity <= MAX_SUPPLY, "Excedes max supply."); require( MINT_PRICE_M1 * quantity <= msg.value, "Ether value sent is not correct" ); for (uint256 i = nextTokenId; i < nextTokenId + quantity; i++) { TokenTypeM1.push(i); } M1_SPOT += quantity; _mint(msg.sender, quantity); } function mintM2(uint256 quantity) external payable { require(IS_SALE_ACTIVE, "Sale haven't started"); uint256 nextTokenId = _nextTokenId(); require(nextTokenId + quantity <= MAX_SUPPLY, "Excedes max supply."); require( MINT_PRICE_M2 * quantity <= msg.value, "Ether value sent is not correct" ); for (uint256 i = nextTokenId; i < nextTokenId + quantity; i++) { TokenTypeM2.push(i); } M2_SPOT += quantity; _mint(msg.sender, quantity); } function mintM3(uint256 quantity) external payable { require(IS_SALE_ACTIVE, "Sale haven't started"); uint256 nextTokenId = _nextTokenId(); require(nextTokenId + quantity <= MAX_SUPPLY, "Excedes max supply."); require( MINT_PRICE_M3 * quantity <= msg.value, "Ether value sent is not correct" ); for (uint256 i = nextTokenId; i < nextTokenId + quantity; i++) { TokenTypeM3.push(i); } M3_SPOT += quantity; _mint(msg.sender, quantity); } function getM1() public view returns (uint[] memory) { return TokenTypeM1; } function getM2() public view returns (uint[] memory) { return TokenTypeM2; } function getM3() public view returns (uint[] memory) { return TokenTypeM3; } function toggleSale() public onlyOwner { IS_SALE_ACTIVE = !IS_SALE_ACTIVE; } function togglePreSale() public onlyOwner { IS_PRE_SALE_ACTIVE = !IS_PRE_SALE_ACTIVE; } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount); uint256 currentTokenId = 1; uint256 ownedTokenIndex = 0; while ( ownedTokenIndex < ownerTokenCount && currentTokenId <= MAX_SUPPLY ) { address currentTokenOwner = ownerOf(currentTokenId); if (currentTokenOwner == _owner) { ownedTokenIds[ownedTokenIndex] = currentTokenId; ownedTokenIndex++; } currentTokenId++; } return ownedTokenIds; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require( _exists(_tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString())) : ""; } function withdraw() public onlyOwner { uint256 balance = address(this).balance; require(balance > 0); _withdraw( 0x9d479E8998626daBabb8012b2053df58060EE5E3, address(this).balance ); } function _withdraw(address _address, uint256 _amount) private { (bool success, ) = _address.call{value: _amount}(""); require(success, "Transfer failed."); } function setURI(string memory URI) public onlyOwner { uriPrefix = URI; } function _baseURI() internal view virtual override returns (string memory) { return uriPrefix; } function _leaf(address account) internal pure returns (bytes32) { return keccak256(abi.encodePacked(account)); } function _verify(bytes32 leaf, bytes32[] memory proof) internal view returns (bool) { return MerkleProof.verify(proof, root, leaf); } }
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":"string","name":"_URI","type":"string"},{"internalType":"bytes32","name":"_root","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"IS_PRE_SALE_ACTIVE","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IS_SALE_ACTIVE","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"M1_SPOT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"M2_SPOT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"M3_SPOT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_TX_PRIVATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE_M1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE_M2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE_M3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getM1","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getM2","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getM3","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintM1","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintM2","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintM3","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintPrivateM1","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintPrivateM2","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintPrivateM3","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"enum GobzMutant.MintType","name":"typeofmint","type":"uint8"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleroot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setURI","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":[],"name":"togglePreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60e0604052610d05608090815250601460a090815250600660c09081525066b1a2bc2ec50000600c5567016345785d8a0000600d556702c68af0bb140000600e556000601560006101000a81548160ff0219169083151502179055506000601560016101000a81548160ff0219169083151502179055503480156200008357600080fd5b5060405162005176380380620051768339818101604052810190620000a99190620004aa565b83838160029081620000bc9190620007c4565b508060039081620000ce9190620007c4565b50620000df6200012960201b60201c565b600081905550505062000107620000fb6200012e60201b60201c565b6200013660201b60201c565b80600a819055506200011f82620001fc60201b60201c565b505050506200092e565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200020c6200022160201b60201c565b80600b90816200021d9190620007c4565b5050565b620002316200012e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000257620002b260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002b0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002a7906200090c565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200034582620002fa565b810181811067ffffffffffffffff821117156200036757620003666200030b565b5b80604052505050565b60006200037c620002dc565b90506200038a82826200033a565b919050565b600067ffffffffffffffff821115620003ad57620003ac6200030b565b5b620003b882620002fa565b9050602081019050919050565b60005b83811015620003e5578082015181840152602081019050620003c8565b60008484015250505050565b60006200040862000402846200038f565b62000370565b905082815260208101848484011115620004275762000426620002f5565b5b62000434848285620003c5565b509392505050565b600082601f830112620004545762000453620002f0565b5b815162000466848260208601620003f1565b91505092915050565b6000819050919050565b62000484816200046f565b81146200049057600080fd5b50565b600081519050620004a48162000479565b92915050565b60008060008060808587031215620004c757620004c6620002e6565b5b600085015167ffffffffffffffff811115620004e857620004e7620002eb565b5b620004f6878288016200043c565b945050602085015167ffffffffffffffff8111156200051a5762000519620002eb565b5b62000528878288016200043c565b935050604085015167ffffffffffffffff8111156200054c576200054b620002eb565b5b6200055a878288016200043c565b92505060606200056d8782880162000493565b91505092959194509250565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620005cc57607f821691505b602082108103620005e257620005e162000584565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200064c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200060d565b6200065886836200060d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620006a56200069f620006998462000670565b6200067a565b62000670565b9050919050565b6000819050919050565b620006c18362000684565b620006d9620006d082620006ac565b8484546200061a565b825550505050565b600090565b620006f0620006e1565b620006fd818484620006b6565b505050565b5b81811015620007255762000719600082620006e6565b60018101905062000703565b5050565b601f82111562000774576200073e81620005e8565b6200074984620005fd565b8101602085101562000759578190505b620007716200076885620005fd565b83018262000702565b50505b505050565b600082821c905092915050565b6000620007996000198460080262000779565b1980831691505092915050565b6000620007b4838362000786565b9150826002028217905092915050565b620007cf8262000579565b67ffffffffffffffff811115620007eb57620007ea6200030b565b5b620007f78254620005b3565b6200080482828562000729565b600060209050601f8311600181146200083c576000841562000827578287015190505b620008338582620007a6565b865550620008a3565b601f1984166200084c86620005e8565b60005b8281101562000876578489015182556001820191506020850194506020810190506200084f565b8683101562000896578489015162000892601f89168262000786565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620008f4602083620008ab565b91506200090182620008bc565b602082019050919050565b600060208201905081810360008301526200092781620008e5565b9050919050565b60805160a05160c0516147cb620009ab60003960008181610dc901528181611d600152818161256501526128ca015260006128a6015260008181610d5b015281816112d40152818161138e015281816114dd015281816117d101528181611cf201528181612000015281816122cf01526124f701526147cb6000f3fe6080604052600436106102675760003560e01c80637cb6475911610144578063c87b56dd116100b6578063e3701b191161007a578063e3701b191461085b578063e985e9c514610877578063ee2df4f8146108b4578063f2fde38b146108df578063f43a22dc14610908578063f9172d3e1461093357610267565b8063c87b56dd14610795578063ca3cb522146107d2578063d09608a0146107e9578063d174f12114610814578063d9a451631461083f57610267565b806392ba35991161010857806392ba3599146106c257806395d89b41146106ed578063a22cb46514610718578063af70c4f714610741578063b88d4fde1461075d578063c5f5cd561461077957610267565b80637cb64759146106015780637d8966e41461062a5780638da5cb5b146106415780638e70d2741461066c5780638f4fe4311461069757610267565b80633ccfd60b116101dd5780634f0c5258116101a15780634f0c5258146104ef5780636352211e1461051a57806370a0823114610557578063715018a61461059457806376d02b71146105ab5780637b6b88e0146105d657610267565b80633ccfd60b1461043a57806340cda05f1461045157806341cffc411461046d57806342842e0e14610496578063438b6300146104b257610267565b80630ba2f4501161022f5780630ba2f45014610356578063130bfbc61461038157806317b338f1146103ac57806318160ddd146103c857806323b872dd146103f357806332cb6b0c1461040f57610267565b806301ffc9a71461026c57806302fe5305146102a957806306fdde03146102d2578063081812fc146102fd578063095ea7b31461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e919061336c565b61095e565b6040516102a091906133b4565b60405180910390f35b3480156102b557600080fd5b506102d060048036038101906102cb9190613515565b6109f0565b005b3480156102de57600080fd5b506102e7610a0b565b6040516102f491906135dd565b60405180910390f35b34801561030957600080fd5b50610324600480360381019061031f9190613635565b610a9d565b60405161033191906136a3565b60405180910390f35b610354600480360381019061034f91906136ea565b610b1c565b005b34801561036257600080fd5b5061036b610c60565b6040516103789190613739565b60405180910390f35b34801561038d57600080fd5b50610396610c66565b6040516103a39190613739565b60405180910390f35b6103c660048036038101906103c191906137b4565b610c6c565b005b3480156103d457600080fd5b506103dd610f99565b6040516103ea9190613739565b60405180910390f35b61040d60048036038101906104089190613814565b610fb0565b005b34801561041b57600080fd5b506104246112d2565b6040516104319190613739565b60405180910390f35b34801561044657600080fd5b5061044f6112f6565b005b61046b60048036038101906104669190613635565b611331565b005b34801561047957600080fd5b50610494600480360381019061048f919061388c565b6114c7565b005b6104b060048036038101906104ab9190613814565b611740565b005b3480156104be57600080fd5b506104d960048036038101906104d491906138df565b611760565b6040516104e691906139ca565b60405180910390f35b3480156104fb57600080fd5b50610504611888565b6040516105119190613739565b60405180910390f35b34801561052657600080fd5b50610541600480360381019061053c9190613635565b61188e565b60405161054e91906136a3565b60405180910390f35b34801561056357600080fd5b5061057e600480360381019061057991906138df565b6118a0565b60405161058b9190613739565b60405180910390f35b3480156105a057600080fd5b506105a9611958565b005b3480156105b757600080fd5b506105c061196c565b6040516105cd91906133b4565b60405180910390f35b3480156105e257600080fd5b506105eb61197f565b6040516105f891906139ca565b60405180910390f35b34801561060d57600080fd5b5061062860048036038101906106239190613a22565b6119d7565b005b34801561063657600080fd5b5061063f6119e9565b005b34801561064d57600080fd5b50610656611a1d565b60405161066391906136a3565b60405180910390f35b34801561067857600080fd5b50610681611a47565b60405161068e91906133b4565b60405180910390f35b3480156106a357600080fd5b506106ac611a5a565b6040516106b99190613739565b60405180910390f35b3480156106ce57600080fd5b506106d7611a60565b6040516106e49190613739565b60405180910390f35b3480156106f957600080fd5b50610702611a66565b60405161070f91906135dd565b60405180910390f35b34801561072457600080fd5b5061073f600480360381019061073a9190613a7b565b611af8565b005b61075b600480360381019061075691906137b4565b611c03565b005b61077760048036038101906107729190613b5c565b611f30565b005b610793600480360381019061078e9190613635565b611fa3565b005b3480156107a157600080fd5b506107bc60048036038101906107b79190613635565b612139565b6040516107c991906135dd565b60405180910390f35b3480156107de57600080fd5b506107e76121e0565b005b3480156107f557600080fd5b506107fe612214565b60405161080b91906139ca565b60405180910390f35b34801561082057600080fd5b5061082961226c565b6040516108369190613739565b60405180910390f35b61085960048036038101906108549190613635565b612272565b005b610875600480360381019061087091906137b4565b612408565b005b34801561088357600080fd5b5061089e60048036038101906108999190613bdf565b612735565b6040516108ab91906133b4565b60405180910390f35b3480156108c057600080fd5b506108c96127c9565b6040516108d691906139ca565b60405180910390f35b3480156108eb57600080fd5b50610906600480360381019061090191906138df565b612821565b005b34801561091457600080fd5b5061091d6128a4565b60405161092a9190613739565b60405180910390f35b34801561093f57600080fd5b506109486128c8565b6040516109559190613739565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109b957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109e95750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6109f86128ec565b80600b9081610a079190613e2b565b5050565b606060028054610a1a90613c4e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4690613c4e565b8015610a935780601f10610a6857610100808354040283529160200191610a93565b820191906000526020600020905b815481529060010190602001808311610a7657829003601f168201915b5050505050905090565b6000610aa88261296a565b610ade576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b278261188e565b90508073ffffffffffffffffffffffffffffffffffffffff16610b486129c9565b73ffffffffffffffffffffffffffffffffffffffff1614610bab57610b7481610b6f6129c9565b612735565b610baa576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60135481565b60125481565b601560009054906101000a900460ff16610cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb290613f49565b60405180910390fd5b6000610cc56129d1565b9050610d1a610cd3336129da565b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050612a0a565b610d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5090613fb5565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008482610d869190614004565b1115610dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbe90614084565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000084601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e339190614004565b1115610e74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6b906140f0565b60405180910390fd5b83601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610ec39190614004565b925050819055503484600d54610ed99190614110565b1115610f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f11906141b6565b60405180910390fd5b60008190505b8482610f2c9190614004565b811015610f6f5760108190806001815401808255809150506001900390600052602060002001600090919091909150558080610f67906141d6565b915050610f20565b508360136000828254610f829190614004565b92505081905550610f933385612a21565b50505050565b6000610fa3612bdc565b6001546000540303905090565b6000610fbb82612be1565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611022576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061102e84612cad565b91509150611044818761103f6129c9565b612cd4565b61109057611059866110546129c9565b612735565b61108f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036110f6576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111038686866001612d18565b801561110e57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506111dc856111b8888887612d1e565b7c020000000000000000000000000000000000000000000000000000000017612d46565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611262576000600185019050600060046000838152602001908152602001600020540361126057600054811461125f578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46112ca8686866001612d71565b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6112fe6128ec565b60004790506000811161131057600080fd5b61132e739d479e8998626dababb8012b2053df58060ee5e347612d77565b50565b601560019054906101000a900460ff16611380576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113779061426a565b60405180910390fd5b600061138a6129d1565b90507f000000000000000000000000000000000000000000000000000000000000000082826113b99190614004565b11156113fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f190614084565b60405180910390fd5b3482600c546114099190614110565b111561144a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611441906141b6565b60405180910390fd5b60008190505b828261145c9190614004565b81101561149f57600f8190806001815401808255809150506001900390600052602060002001600090919091909150558080611497906141d6565b915050611450565b5081601260008282546114b29190614004565b925050819055506114c33383612a21565b5050565b6114cf6128ec565b60006114d96129d1565b90507f000000000000000000000000000000000000000000000000000000000000000083826115089190614004565b1115611549576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154090614084565b60405180910390fd5b6000600281111561155d5761155c61428a565b5b8260028111156115705761156f61428a565b5b036115ef5760008190505b83826115879190614004565b8110156115ca57600f81908060018154018082558091505060019003906000526020600020016000909190919091505580806115c2906141d6565b91505061157b565b5082601260008282546115dd9190614004565b925050819055506115ee8484612a21565b5b600160028111156116035761160261428a565b5b8260028111156116165761161561428a565b5b036116955760008190505b838261162d9190614004565b8110156116705760108190806001815401808255809150506001900390600052602060002001600090919091909150558080611668906141d6565b915050611621565b5082601360008282546116839190614004565b925050819055506116948484612a21565b5b6002808111156116a8576116a761428a565b5b8260028111156116bb576116ba61428a565b5b0361173a5760008190505b83826116d29190614004565b811015611715576011819080600181540180825580915050600190039060005260206000200160009091909190915055808061170d906141d6565b9150506116c6565b5082601460008282546117289190614004565b925050819055506117398484612a21565b5b50505050565b61175b83838360405180602001604052806000815250611f30565b505050565b6060600061176d836118a0565b905060008167ffffffffffffffff81111561178b5761178a6133ea565b5b6040519080825280602002602001820160405280156117b95781602001602082028036833780820191505090505b50905060006001905060005b83811080156117f457507f00000000000000000000000000000000000000000000000000000000000000008211155b1561187c5760006118048361188e565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611868578284838151811061184d5761184c6142b9565b5b6020026020010181815250508180611864906141d6565b9250505b8280611873906141d6565b935050506117c5565b82945050505050919050565b600c5481565b600061189982612be1565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611907576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6119606128ec565b61196a6000612e28565b565b601560019054906101000a900460ff1681565b606060118054806020026020016040519081016040528092919081815260200182805480156119cd57602002820191906000526020600020905b8154815260200190600101908083116119b9575b5050505050905090565b6119df6128ec565b80600a8190555050565b6119f16128ec565b601560019054906101000a900460ff1615601560016101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601560009054906101000a900460ff1681565b600d5481565b60145481565b606060038054611a7590613c4e565b80601f0160208091040260200160405190810160405280929190818152602001828054611aa190613c4e565b8015611aee5780601f10611ac357610100808354040283529160200191611aee565b820191906000526020600020905b815481529060010190602001808311611ad157829003601f168201915b5050505050905090565b8060076000611b056129c9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611bb26129c9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611bf791906133b4565b60405180910390a35050565b601560009054906101000a900460ff16611c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4990613f49565b60405180910390fd5b6000611c5c6129d1565b9050611cb1611c6a336129da565b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050612a0a565b611cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce790613fb5565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008482611d1d9190614004565b1115611d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5590614084565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000084601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611dca9190614004565b1115611e0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e02906140f0565b60405180910390fd5b83601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e5a9190614004565b925050819055503484600c54611e709190614110565b1115611eb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea8906141b6565b60405180910390fd5b60008190505b8482611ec39190614004565b811015611f0657600f8190806001815401808255809150506001900390600052602060002001600090919091909150558080611efe906141d6565b915050611eb7565b508360126000828254611f199190614004565b92505081905550611f2a3385612a21565b50505050565b611f3b848484610fb0565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611f9d57611f6684848484612eee565b611f9c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b601560019054906101000a900460ff16611ff2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe99061426a565b60405180910390fd5b6000611ffc6129d1565b90507f0000000000000000000000000000000000000000000000000000000000000000828261202b9190614004565b111561206c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206390614084565b60405180910390fd5b3482600d5461207b9190614110565b11156120bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b3906141b6565b60405180910390fd5b60008190505b82826120ce9190614004565b8110156121115760108190806001815401808255809150506001900390600052602060002001600090919091909150558080612109906141d6565b9150506120c2565b5081601360008282546121249190614004565b925050819055506121353383612a21565b5050565b60606121448261296a565b612183576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217a9061435a565b60405180910390fd5b600061218d61303e565b905060008151116121ad57604051806020016040528060008152506121d8565b806121b7846130d0565b6040516020016121c89291906143b6565b6040516020818303038152906040525b915050919050565b6121e86128ec565b601560009054906101000a900460ff1615601560006101000a81548160ff021916908315150217905550565b6060601080548060200260200160405190810160405280929190818152602001828054801561226257602002820191906000526020600020905b81548152602001906001019080831161224e575b5050505050905090565b600e5481565b601560019054906101000a900460ff166122c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b89061426a565b60405180910390fd5b60006122cb6129d1565b90507f000000000000000000000000000000000000000000000000000000000000000082826122fa9190614004565b111561233b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233290614084565b60405180910390fd5b3482600e5461234a9190614110565b111561238b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612382906141b6565b60405180910390fd5b60008190505b828261239d9190614004565b8110156123e057601181908060018154018082558091505060019003906000526020600020016000909190919091505580806123d8906141d6565b915050612391565b5081601460008282546123f39190614004565b925050819055506124043383612a21565b5050565b601560009054906101000a900460ff16612457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244e90613f49565b60405180910390fd5b60006124616129d1565b90506124b661246f336129da565b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050612a0a565b6124f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ec90613fb5565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000084826125229190614004565b1115612563576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255a90614084565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000084601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125cf9190614004565b1115612610576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612607906140f0565b60405180910390fd5b83601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461265f9190614004565b925050819055503484600e546126759190614110565b11156126b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ad906141b6565b60405180910390fd5b60008190505b84826126c89190614004565b81101561270b5760118190806001815401808255809150506001900390600052602060002001600090919091909150558080612703906141d6565b9150506126bc565b50836014600082825461271e9190614004565b9250508190555061272f3385612a21565b50505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600f80548060200260200160405190810160405280929190818152602001828054801561281757602002820191906000526020600020905b815481526020019060010190808311612803575b5050505050905090565b6128296128ec565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288f9061444c565b60405180910390fd5b6128a181612e28565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6128f4613230565b73ffffffffffffffffffffffffffffffffffffffff16612912611a1d565b73ffffffffffffffffffffffffffffffffffffffff1614612968576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295f906144b8565b60405180910390fd5b565b600081612975612bdc565b11158015612984575060005482105b80156129c2575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60008054905090565b6000816040516020016129ed9190614520565b604051602081830303815290604052805190602001209050919050565b6000612a1982600a5485613238565b905092915050565b60008054905060008203612a61576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a6e6000848385612d18565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612ae583612ad66000866000612d1e565b612adf8561324f565b17612d46565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612b8657808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612b4b565b5060008203612bc1576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050612bd76000848385612d71565b505050565b600090565b60008082905080612bf0612bdc565b11612c7657600054811015612c755760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612c73575b60008103612c69576004600083600190039350838152602001908152602001600020549050612c3f565b8092505050612ca8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612d3586868461325f565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612d9d9061456c565b60006040518083038185875af1925050503d8060008114612dda576040519150601f19603f3d011682016040523d82523d6000602084013e612ddf565b606091505b5050905080612e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1a906145cd565b60405180910390fd5b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f146129c9565b8786866040518563ffffffff1660e01b8152600401612f369493929190614642565b6020604051808303816000875af1925050508015612f7257506040513d601f19601f82011682018060405250810190612f6f91906146a3565b60015b612feb573d8060008114612fa2576040519150601f19603f3d011682016040523d82523d6000602084013e612fa7565b606091505b506000815103612fe3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b805461304d90613c4e565b80601f016020809104026020016040519081016040528092919081815260200182805461307990613c4e565b80156130c65780601f1061309b576101008083540402835291602001916130c6565b820191906000526020600020905b8154815290600101906020018083116130a957829003601f168201915b5050505050905090565b606060008203613117576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061322b565b600082905060005b60008214613149578080613132906141d6565b915050600a8261314291906146ff565b915061311f565b60008167ffffffffffffffff811115613165576131646133ea565b5b6040519080825280601f01601f1916602001820160405280156131975781602001600182028036833780820191505090505b5090505b60008514613224576001826131b09190614730565b9150600a856131bf9190614764565b60306131cb9190614004565b60f81b8183815181106131e1576131e06142b9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561321d91906146ff565b945061319b565b8093505050505b919050565b600033905090565b6000826132458584613268565b1490509392505050565b60006001821460e11b9050919050565b60009392505050565b60008082905060005b84518110156132b35761329e82868381518110613291576132906142b9565b5b60200260200101516132be565b915080806132ab906141d6565b915050613271565b508091505092915050565b60008183106132d6576132d182846132e9565b6132e1565b6132e083836132e9565b5b905092915050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61334981613314565b811461335457600080fd5b50565b60008135905061336681613340565b92915050565b6000602082840312156133825761338161330a565b5b600061339084828501613357565b91505092915050565b60008115159050919050565b6133ae81613399565b82525050565b60006020820190506133c960008301846133a5565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613422826133d9565b810181811067ffffffffffffffff82111715613441576134406133ea565b5b80604052505050565b6000613454613300565b90506134608282613419565b919050565b600067ffffffffffffffff8211156134805761347f6133ea565b5b613489826133d9565b9050602081019050919050565b82818337600083830152505050565b60006134b86134b384613465565b61344a565b9050828152602081018484840111156134d4576134d36133d4565b5b6134df848285613496565b509392505050565b600082601f8301126134fc576134fb6133cf565b5b813561350c8482602086016134a5565b91505092915050565b60006020828403121561352b5761352a61330a565b5b600082013567ffffffffffffffff8111156135495761354861330f565b5b613555848285016134e7565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561359857808201518184015260208101905061357d565b60008484015250505050565b60006135af8261355e565b6135b98185613569565b93506135c981856020860161357a565b6135d2816133d9565b840191505092915050565b600060208201905081810360008301526135f781846135a4565b905092915050565b6000819050919050565b613612816135ff565b811461361d57600080fd5b50565b60008135905061362f81613609565b92915050565b60006020828403121561364b5761364a61330a565b5b600061365984828501613620565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061368d82613662565b9050919050565b61369d81613682565b82525050565b60006020820190506136b86000830184613694565b92915050565b6136c781613682565b81146136d257600080fd5b50565b6000813590506136e4816136be565b92915050565b600080604083850312156137015761370061330a565b5b600061370f858286016136d5565b925050602061372085828601613620565b9150509250929050565b613733816135ff565b82525050565b600060208201905061374e600083018461372a565b92915050565b600080fd5b600080fd5b60008083601f840112613774576137736133cf565b5b8235905067ffffffffffffffff81111561379157613790613754565b5b6020830191508360208202830111156137ad576137ac613759565b5b9250929050565b6000806000604084860312156137cd576137cc61330a565b5b60006137db86828701613620565b935050602084013567ffffffffffffffff8111156137fc576137fb61330f565b5b6138088682870161375e565b92509250509250925092565b60008060006060848603121561382d5761382c61330a565b5b600061383b868287016136d5565b935050602061384c868287016136d5565b925050604061385d86828701613620565b9150509250925092565b6003811061387457600080fd5b50565b60008135905061388681613867565b92915050565b6000806000606084860312156138a5576138a461330a565b5b60006138b3868287016136d5565b93505060206138c486828701613620565b92505060406138d586828701613877565b9150509250925092565b6000602082840312156138f5576138f461330a565b5b6000613903848285016136d5565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613941816135ff565b82525050565b60006139538383613938565b60208301905092915050565b6000602082019050919050565b60006139778261390c565b6139818185613917565b935061398c83613928565b8060005b838110156139bd5781516139a48882613947565b97506139af8361395f565b925050600181019050613990565b5085935050505092915050565b600060208201905081810360008301526139e4818461396c565b905092915050565b6000819050919050565b6139ff816139ec565b8114613a0a57600080fd5b50565b600081359050613a1c816139f6565b92915050565b600060208284031215613a3857613a3761330a565b5b6000613a4684828501613a0d565b91505092915050565b613a5881613399565b8114613a6357600080fd5b50565b600081359050613a7581613a4f565b92915050565b60008060408385031215613a9257613a9161330a565b5b6000613aa0858286016136d5565b9250506020613ab185828601613a66565b9150509250929050565b600067ffffffffffffffff821115613ad657613ad56133ea565b5b613adf826133d9565b9050602081019050919050565b6000613aff613afa84613abb565b61344a565b905082815260208101848484011115613b1b57613b1a6133d4565b5b613b26848285613496565b509392505050565b600082601f830112613b4357613b426133cf565b5b8135613b53848260208601613aec565b91505092915050565b60008060008060808587031215613b7657613b7561330a565b5b6000613b84878288016136d5565b9450506020613b95878288016136d5565b9350506040613ba687828801613620565b925050606085013567ffffffffffffffff811115613bc757613bc661330f565b5b613bd387828801613b2e565b91505092959194509250565b60008060408385031215613bf657613bf561330a565b5b6000613c04858286016136d5565b9250506020613c15858286016136d5565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c6657607f821691505b602082108103613c7957613c78613c1f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613ce17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613ca4565b613ceb8683613ca4565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613d28613d23613d1e846135ff565b613d03565b6135ff565b9050919050565b6000819050919050565b613d4283613d0d565b613d56613d4e82613d2f565b848454613cb1565b825550505050565b600090565b613d6b613d5e565b613d76818484613d39565b505050565b5b81811015613d9a57613d8f600082613d63565b600181019050613d7c565b5050565b601f821115613ddf57613db081613c7f565b613db984613c94565b81016020851015613dc8578190505b613ddc613dd485613c94565b830182613d7b565b50505b505050565b600082821c905092915050565b6000613e0260001984600802613de4565b1980831691505092915050565b6000613e1b8383613df1565b9150826002028217905092915050565b613e348261355e565b67ffffffffffffffff811115613e4d57613e4c6133ea565b5b613e578254613c4e565b613e62828285613d9e565b600060209050601f831160018114613e955760008415613e83578287015190505b613e8d8582613e0f565b865550613ef5565b601f198416613ea386613c7f565b60005b82811015613ecb57848901518255600182019150602085019450602081019050613ea6565b86831015613ee85784890151613ee4601f891682613df1565b8355505b6001600288020188555050505b505050505050565b7f5072652d73616c6520686176656e277420737461727465640000000000000000600082015250565b6000613f33601883613569565b9150613f3e82613efd565b602082019050919050565b60006020820190508181036000830152613f6281613f26565b9050919050565b7f496e76616c6964206d65726b6c652070726f6f66000000000000000000000000600082015250565b6000613f9f601483613569565b9150613faa82613f69565b602082019050919050565b60006020820190508181036000830152613fce81613f92565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061400f826135ff565b915061401a836135ff565b925082820190508082111561403257614031613fd5565b5b92915050565b7f45786365646573206d617820737570706c792e00000000000000000000000000600082015250565b600061406e601383613569565b915061407982614038565b602082019050919050565b6000602082019050818103600083015261409d81614061565b9050919050565b7f4578636565647320616c6c6f77616e6365000000000000000000000000000000600082015250565b60006140da601183613569565b91506140e5826140a4565b602082019050919050565b60006020820190508181036000830152614109816140cd565b9050919050565b600061411b826135ff565b9150614126836135ff565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561415f5761415e613fd5565b5b828202905092915050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b60006141a0601f83613569565b91506141ab8261416a565b602082019050919050565b600060208201905081810360008301526141cf81614193565b9050919050565b60006141e1826135ff565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361421357614212613fd5565b5b600182019050919050565b7f53616c6520686176656e27742073746172746564000000000000000000000000600082015250565b6000614254601483613569565b915061425f8261421e565b602082019050919050565b6000602082019050818103600083015261428381614247565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614344602f83613569565b915061434f826142e8565b604082019050919050565b6000602082019050818103600083015261437381614337565b9050919050565b600081905092915050565b60006143908261355e565b61439a818561437a565b93506143aa81856020860161357a565b80840191505092915050565b60006143c28285614385565b91506143ce8284614385565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614436602683613569565b9150614441826143da565b604082019050919050565b6000602082019050818103600083015261446581614429565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006144a2602083613569565b91506144ad8261446c565b602082019050919050565b600060208201905081810360008301526144d181614495565b9050919050565b60008160601b9050919050565b60006144f0826144d8565b9050919050565b6000614502826144e5565b9050919050565b61451a61451582613682565b6144f7565b82525050565b600061452c8284614509565b60148201915081905092915050565b600081905092915050565b50565b600061455660008361453b565b915061456182614546565b600082019050919050565b600061457782614549565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006145b7601083613569565b91506145c282614581565b602082019050919050565b600060208201905081810360008301526145e6816145aa565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614614826145ed565b61461e81856145f8565b935061462e81856020860161357a565b614637816133d9565b840191505092915050565b60006080820190506146576000830187613694565b6146646020830186613694565b614671604083018561372a565b81810360608301526146838184614609565b905095945050505050565b60008151905061469d81613340565b92915050565b6000602082840312156146b9576146b861330a565b5b60006146c78482850161468e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061470a826135ff565b9150614715836135ff565b925082614725576147246146d0565b5b828204905092915050565b600061473b826135ff565b9150614746836135ff565b925082820390508181111561475e5761475d613fd5565b5b92915050565b600061476f826135ff565b915061477a836135ff565b92508261478a576147896146d0565b5b82820690509291505056fea2646970667358221220acb5d09468f0a7a9e69310578e1a474e9e2f4fefe715263bd45057791585c19064736f6c63430008100033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100b19b8a4448da867b8fe4c00b16743bbdf86074ca2b4189ea225a0b87d6d9bb800000000000000000000000000000000000000000000000000000000000000003474f4f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034d55540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002068747470733a2f2f6170692e6d7574616e74676f627a2e696f2f746f6b656e2f
Deployed Bytecode
0x6080604052600436106102675760003560e01c80637cb6475911610144578063c87b56dd116100b6578063e3701b191161007a578063e3701b191461085b578063e985e9c514610877578063ee2df4f8146108b4578063f2fde38b146108df578063f43a22dc14610908578063f9172d3e1461093357610267565b8063c87b56dd14610795578063ca3cb522146107d2578063d09608a0146107e9578063d174f12114610814578063d9a451631461083f57610267565b806392ba35991161010857806392ba3599146106c257806395d89b41146106ed578063a22cb46514610718578063af70c4f714610741578063b88d4fde1461075d578063c5f5cd561461077957610267565b80637cb64759146106015780637d8966e41461062a5780638da5cb5b146106415780638e70d2741461066c5780638f4fe4311461069757610267565b80633ccfd60b116101dd5780634f0c5258116101a15780634f0c5258146104ef5780636352211e1461051a57806370a0823114610557578063715018a61461059457806376d02b71146105ab5780637b6b88e0146105d657610267565b80633ccfd60b1461043a57806340cda05f1461045157806341cffc411461046d57806342842e0e14610496578063438b6300146104b257610267565b80630ba2f4501161022f5780630ba2f45014610356578063130bfbc61461038157806317b338f1146103ac57806318160ddd146103c857806323b872dd146103f357806332cb6b0c1461040f57610267565b806301ffc9a71461026c57806302fe5305146102a957806306fdde03146102d2578063081812fc146102fd578063095ea7b31461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e919061336c565b61095e565b6040516102a091906133b4565b60405180910390f35b3480156102b557600080fd5b506102d060048036038101906102cb9190613515565b6109f0565b005b3480156102de57600080fd5b506102e7610a0b565b6040516102f491906135dd565b60405180910390f35b34801561030957600080fd5b50610324600480360381019061031f9190613635565b610a9d565b60405161033191906136a3565b60405180910390f35b610354600480360381019061034f91906136ea565b610b1c565b005b34801561036257600080fd5b5061036b610c60565b6040516103789190613739565b60405180910390f35b34801561038d57600080fd5b50610396610c66565b6040516103a39190613739565b60405180910390f35b6103c660048036038101906103c191906137b4565b610c6c565b005b3480156103d457600080fd5b506103dd610f99565b6040516103ea9190613739565b60405180910390f35b61040d60048036038101906104089190613814565b610fb0565b005b34801561041b57600080fd5b506104246112d2565b6040516104319190613739565b60405180910390f35b34801561044657600080fd5b5061044f6112f6565b005b61046b60048036038101906104669190613635565b611331565b005b34801561047957600080fd5b50610494600480360381019061048f919061388c565b6114c7565b005b6104b060048036038101906104ab9190613814565b611740565b005b3480156104be57600080fd5b506104d960048036038101906104d491906138df565b611760565b6040516104e691906139ca565b60405180910390f35b3480156104fb57600080fd5b50610504611888565b6040516105119190613739565b60405180910390f35b34801561052657600080fd5b50610541600480360381019061053c9190613635565b61188e565b60405161054e91906136a3565b60405180910390f35b34801561056357600080fd5b5061057e600480360381019061057991906138df565b6118a0565b60405161058b9190613739565b60405180910390f35b3480156105a057600080fd5b506105a9611958565b005b3480156105b757600080fd5b506105c061196c565b6040516105cd91906133b4565b60405180910390f35b3480156105e257600080fd5b506105eb61197f565b6040516105f891906139ca565b60405180910390f35b34801561060d57600080fd5b5061062860048036038101906106239190613a22565b6119d7565b005b34801561063657600080fd5b5061063f6119e9565b005b34801561064d57600080fd5b50610656611a1d565b60405161066391906136a3565b60405180910390f35b34801561067857600080fd5b50610681611a47565b60405161068e91906133b4565b60405180910390f35b3480156106a357600080fd5b506106ac611a5a565b6040516106b99190613739565b60405180910390f35b3480156106ce57600080fd5b506106d7611a60565b6040516106e49190613739565b60405180910390f35b3480156106f957600080fd5b50610702611a66565b60405161070f91906135dd565b60405180910390f35b34801561072457600080fd5b5061073f600480360381019061073a9190613a7b565b611af8565b005b61075b600480360381019061075691906137b4565b611c03565b005b61077760048036038101906107729190613b5c565b611f30565b005b610793600480360381019061078e9190613635565b611fa3565b005b3480156107a157600080fd5b506107bc60048036038101906107b79190613635565b612139565b6040516107c991906135dd565b60405180910390f35b3480156107de57600080fd5b506107e76121e0565b005b3480156107f557600080fd5b506107fe612214565b60405161080b91906139ca565b60405180910390f35b34801561082057600080fd5b5061082961226c565b6040516108369190613739565b60405180910390f35b61085960048036038101906108549190613635565b612272565b005b610875600480360381019061087091906137b4565b612408565b005b34801561088357600080fd5b5061089e60048036038101906108999190613bdf565b612735565b6040516108ab91906133b4565b60405180910390f35b3480156108c057600080fd5b506108c96127c9565b6040516108d691906139ca565b60405180910390f35b3480156108eb57600080fd5b50610906600480360381019061090191906138df565b612821565b005b34801561091457600080fd5b5061091d6128a4565b60405161092a9190613739565b60405180910390f35b34801561093f57600080fd5b506109486128c8565b6040516109559190613739565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109b957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109e95750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6109f86128ec565b80600b9081610a079190613e2b565b5050565b606060028054610a1a90613c4e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4690613c4e565b8015610a935780601f10610a6857610100808354040283529160200191610a93565b820191906000526020600020905b815481529060010190602001808311610a7657829003601f168201915b5050505050905090565b6000610aa88261296a565b610ade576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b278261188e565b90508073ffffffffffffffffffffffffffffffffffffffff16610b486129c9565b73ffffffffffffffffffffffffffffffffffffffff1614610bab57610b7481610b6f6129c9565b612735565b610baa576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60135481565b60125481565b601560009054906101000a900460ff16610cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb290613f49565b60405180910390fd5b6000610cc56129d1565b9050610d1a610cd3336129da565b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050612a0a565b610d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5090613fb5565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000d058482610d869190614004565b1115610dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbe90614084565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000684601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e339190614004565b1115610e74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6b906140f0565b60405180910390fd5b83601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610ec39190614004565b925050819055503484600d54610ed99190614110565b1115610f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f11906141b6565b60405180910390fd5b60008190505b8482610f2c9190614004565b811015610f6f5760108190806001815401808255809150506001900390600052602060002001600090919091909150558080610f67906141d6565b915050610f20565b508360136000828254610f829190614004565b92505081905550610f933385612a21565b50505050565b6000610fa3612bdc565b6001546000540303905090565b6000610fbb82612be1565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611022576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061102e84612cad565b91509150611044818761103f6129c9565b612cd4565b61109057611059866110546129c9565b612735565b61108f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036110f6576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111038686866001612d18565b801561110e57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506111dc856111b8888887612d1e565b7c020000000000000000000000000000000000000000000000000000000017612d46565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611262576000600185019050600060046000838152602001908152602001600020540361126057600054811461125f578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46112ca8686866001612d71565b505050505050565b7f0000000000000000000000000000000000000000000000000000000000000d0581565b6112fe6128ec565b60004790506000811161131057600080fd5b61132e739d479e8998626dababb8012b2053df58060ee5e347612d77565b50565b601560019054906101000a900460ff16611380576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113779061426a565b60405180910390fd5b600061138a6129d1565b90507f0000000000000000000000000000000000000000000000000000000000000d0582826113b99190614004565b11156113fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f190614084565b60405180910390fd5b3482600c546114099190614110565b111561144a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611441906141b6565b60405180910390fd5b60008190505b828261145c9190614004565b81101561149f57600f8190806001815401808255809150506001900390600052602060002001600090919091909150558080611497906141d6565b915050611450565b5081601260008282546114b29190614004565b925050819055506114c33383612a21565b5050565b6114cf6128ec565b60006114d96129d1565b90507f0000000000000000000000000000000000000000000000000000000000000d0583826115089190614004565b1115611549576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154090614084565b60405180910390fd5b6000600281111561155d5761155c61428a565b5b8260028111156115705761156f61428a565b5b036115ef5760008190505b83826115879190614004565b8110156115ca57600f81908060018154018082558091505060019003906000526020600020016000909190919091505580806115c2906141d6565b91505061157b565b5082601260008282546115dd9190614004565b925050819055506115ee8484612a21565b5b600160028111156116035761160261428a565b5b8260028111156116165761161561428a565b5b036116955760008190505b838261162d9190614004565b8110156116705760108190806001815401808255809150506001900390600052602060002001600090919091909150558080611668906141d6565b915050611621565b5082601360008282546116839190614004565b925050819055506116948484612a21565b5b6002808111156116a8576116a761428a565b5b8260028111156116bb576116ba61428a565b5b0361173a5760008190505b83826116d29190614004565b811015611715576011819080600181540180825580915050600190039060005260206000200160009091909190915055808061170d906141d6565b9150506116c6565b5082601460008282546117289190614004565b925050819055506117398484612a21565b5b50505050565b61175b83838360405180602001604052806000815250611f30565b505050565b6060600061176d836118a0565b905060008167ffffffffffffffff81111561178b5761178a6133ea565b5b6040519080825280602002602001820160405280156117b95781602001602082028036833780820191505090505b50905060006001905060005b83811080156117f457507f0000000000000000000000000000000000000000000000000000000000000d058211155b1561187c5760006118048361188e565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611868578284838151811061184d5761184c6142b9565b5b6020026020010181815250508180611864906141d6565b9250505b8280611873906141d6565b935050506117c5565b82945050505050919050565b600c5481565b600061189982612be1565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611907576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6119606128ec565b61196a6000612e28565b565b601560019054906101000a900460ff1681565b606060118054806020026020016040519081016040528092919081815260200182805480156119cd57602002820191906000526020600020905b8154815260200190600101908083116119b9575b5050505050905090565b6119df6128ec565b80600a8190555050565b6119f16128ec565b601560019054906101000a900460ff1615601560016101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601560009054906101000a900460ff1681565b600d5481565b60145481565b606060038054611a7590613c4e565b80601f0160208091040260200160405190810160405280929190818152602001828054611aa190613c4e565b8015611aee5780601f10611ac357610100808354040283529160200191611aee565b820191906000526020600020905b815481529060010190602001808311611ad157829003601f168201915b5050505050905090565b8060076000611b056129c9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611bb26129c9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611bf791906133b4565b60405180910390a35050565b601560009054906101000a900460ff16611c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4990613f49565b60405180910390fd5b6000611c5c6129d1565b9050611cb1611c6a336129da565b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050612a0a565b611cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce790613fb5565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000d058482611d1d9190614004565b1115611d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5590614084565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000684601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611dca9190614004565b1115611e0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e02906140f0565b60405180910390fd5b83601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e5a9190614004565b925050819055503484600c54611e709190614110565b1115611eb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea8906141b6565b60405180910390fd5b60008190505b8482611ec39190614004565b811015611f0657600f8190806001815401808255809150506001900390600052602060002001600090919091909150558080611efe906141d6565b915050611eb7565b508360126000828254611f199190614004565b92505081905550611f2a3385612a21565b50505050565b611f3b848484610fb0565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611f9d57611f6684848484612eee565b611f9c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b601560019054906101000a900460ff16611ff2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe99061426a565b60405180910390fd5b6000611ffc6129d1565b90507f0000000000000000000000000000000000000000000000000000000000000d05828261202b9190614004565b111561206c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206390614084565b60405180910390fd5b3482600d5461207b9190614110565b11156120bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b3906141b6565b60405180910390fd5b60008190505b82826120ce9190614004565b8110156121115760108190806001815401808255809150506001900390600052602060002001600090919091909150558080612109906141d6565b9150506120c2565b5081601360008282546121249190614004565b925050819055506121353383612a21565b5050565b60606121448261296a565b612183576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217a9061435a565b60405180910390fd5b600061218d61303e565b905060008151116121ad57604051806020016040528060008152506121d8565b806121b7846130d0565b6040516020016121c89291906143b6565b6040516020818303038152906040525b915050919050565b6121e86128ec565b601560009054906101000a900460ff1615601560006101000a81548160ff021916908315150217905550565b6060601080548060200260200160405190810160405280929190818152602001828054801561226257602002820191906000526020600020905b81548152602001906001019080831161224e575b5050505050905090565b600e5481565b601560019054906101000a900460ff166122c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b89061426a565b60405180910390fd5b60006122cb6129d1565b90507f0000000000000000000000000000000000000000000000000000000000000d0582826122fa9190614004565b111561233b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233290614084565b60405180910390fd5b3482600e5461234a9190614110565b111561238b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612382906141b6565b60405180910390fd5b60008190505b828261239d9190614004565b8110156123e057601181908060018154018082558091505060019003906000526020600020016000909190919091505580806123d8906141d6565b915050612391565b5081601460008282546123f39190614004565b925050819055506124043383612a21565b5050565b601560009054906101000a900460ff16612457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244e90613f49565b60405180910390fd5b60006124616129d1565b90506124b661246f336129da565b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050612a0a565b6124f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ec90613fb5565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000d0584826125229190614004565b1115612563576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255a90614084565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000684601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125cf9190614004565b1115612610576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612607906140f0565b60405180910390fd5b83601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461265f9190614004565b925050819055503484600e546126759190614110565b11156126b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ad906141b6565b60405180910390fd5b60008190505b84826126c89190614004565b81101561270b5760118190806001815401808255809150506001900390600052602060002001600090919091909150558080612703906141d6565b9150506126bc565b50836014600082825461271e9190614004565b9250508190555061272f3385612a21565b50505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600f80548060200260200160405190810160405280929190818152602001828054801561281757602002820191906000526020600020905b815481526020019060010190808311612803575b5050505050905090565b6128296128ec565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288f9061444c565b60405180910390fd5b6128a181612e28565b50565b7f000000000000000000000000000000000000000000000000000000000000001481565b7f000000000000000000000000000000000000000000000000000000000000000681565b6128f4613230565b73ffffffffffffffffffffffffffffffffffffffff16612912611a1d565b73ffffffffffffffffffffffffffffffffffffffff1614612968576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295f906144b8565b60405180910390fd5b565b600081612975612bdc565b11158015612984575060005482105b80156129c2575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60008054905090565b6000816040516020016129ed9190614520565b604051602081830303815290604052805190602001209050919050565b6000612a1982600a5485613238565b905092915050565b60008054905060008203612a61576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a6e6000848385612d18565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612ae583612ad66000866000612d1e565b612adf8561324f565b17612d46565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612b8657808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612b4b565b5060008203612bc1576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050612bd76000848385612d71565b505050565b600090565b60008082905080612bf0612bdc565b11612c7657600054811015612c755760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612c73575b60008103612c69576004600083600190039350838152602001908152602001600020549050612c3f565b8092505050612ca8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612d3586868461325f565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612d9d9061456c565b60006040518083038185875af1925050503d8060008114612dda576040519150601f19603f3d011682016040523d82523d6000602084013e612ddf565b606091505b5050905080612e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1a906145cd565b60405180910390fd5b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f146129c9565b8786866040518563ffffffff1660e01b8152600401612f369493929190614642565b6020604051808303816000875af1925050508015612f7257506040513d601f19601f82011682018060405250810190612f6f91906146a3565b60015b612feb573d8060008114612fa2576040519150601f19603f3d011682016040523d82523d6000602084013e612fa7565b606091505b506000815103612fe3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b805461304d90613c4e565b80601f016020809104026020016040519081016040528092919081815260200182805461307990613c4e565b80156130c65780601f1061309b576101008083540402835291602001916130c6565b820191906000526020600020905b8154815290600101906020018083116130a957829003601f168201915b5050505050905090565b606060008203613117576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061322b565b600082905060005b60008214613149578080613132906141d6565b915050600a8261314291906146ff565b915061311f565b60008167ffffffffffffffff811115613165576131646133ea565b5b6040519080825280601f01601f1916602001820160405280156131975781602001600182028036833780820191505090505b5090505b60008514613224576001826131b09190614730565b9150600a856131bf9190614764565b60306131cb9190614004565b60f81b8183815181106131e1576131e06142b9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561321d91906146ff565b945061319b565b8093505050505b919050565b600033905090565b6000826132458584613268565b1490509392505050565b60006001821460e11b9050919050565b60009392505050565b60008082905060005b84518110156132b35761329e82868381518110613291576132906142b9565b5b60200260200101516132be565b915080806132ab906141d6565b915050613271565b508091505092915050565b60008183106132d6576132d182846132e9565b6132e1565b6132e083836132e9565b5b905092915050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61334981613314565b811461335457600080fd5b50565b60008135905061336681613340565b92915050565b6000602082840312156133825761338161330a565b5b600061339084828501613357565b91505092915050565b60008115159050919050565b6133ae81613399565b82525050565b60006020820190506133c960008301846133a5565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613422826133d9565b810181811067ffffffffffffffff82111715613441576134406133ea565b5b80604052505050565b6000613454613300565b90506134608282613419565b919050565b600067ffffffffffffffff8211156134805761347f6133ea565b5b613489826133d9565b9050602081019050919050565b82818337600083830152505050565b60006134b86134b384613465565b61344a565b9050828152602081018484840111156134d4576134d36133d4565b5b6134df848285613496565b509392505050565b600082601f8301126134fc576134fb6133cf565b5b813561350c8482602086016134a5565b91505092915050565b60006020828403121561352b5761352a61330a565b5b600082013567ffffffffffffffff8111156135495761354861330f565b5b613555848285016134e7565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561359857808201518184015260208101905061357d565b60008484015250505050565b60006135af8261355e565b6135b98185613569565b93506135c981856020860161357a565b6135d2816133d9565b840191505092915050565b600060208201905081810360008301526135f781846135a4565b905092915050565b6000819050919050565b613612816135ff565b811461361d57600080fd5b50565b60008135905061362f81613609565b92915050565b60006020828403121561364b5761364a61330a565b5b600061365984828501613620565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061368d82613662565b9050919050565b61369d81613682565b82525050565b60006020820190506136b86000830184613694565b92915050565b6136c781613682565b81146136d257600080fd5b50565b6000813590506136e4816136be565b92915050565b600080604083850312156137015761370061330a565b5b600061370f858286016136d5565b925050602061372085828601613620565b9150509250929050565b613733816135ff565b82525050565b600060208201905061374e600083018461372a565b92915050565b600080fd5b600080fd5b60008083601f840112613774576137736133cf565b5b8235905067ffffffffffffffff81111561379157613790613754565b5b6020830191508360208202830111156137ad576137ac613759565b5b9250929050565b6000806000604084860312156137cd576137cc61330a565b5b60006137db86828701613620565b935050602084013567ffffffffffffffff8111156137fc576137fb61330f565b5b6138088682870161375e565b92509250509250925092565b60008060006060848603121561382d5761382c61330a565b5b600061383b868287016136d5565b935050602061384c868287016136d5565b925050604061385d86828701613620565b9150509250925092565b6003811061387457600080fd5b50565b60008135905061388681613867565b92915050565b6000806000606084860312156138a5576138a461330a565b5b60006138b3868287016136d5565b93505060206138c486828701613620565b92505060406138d586828701613877565b9150509250925092565b6000602082840312156138f5576138f461330a565b5b6000613903848285016136d5565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613941816135ff565b82525050565b60006139538383613938565b60208301905092915050565b6000602082019050919050565b60006139778261390c565b6139818185613917565b935061398c83613928565b8060005b838110156139bd5781516139a48882613947565b97506139af8361395f565b925050600181019050613990565b5085935050505092915050565b600060208201905081810360008301526139e4818461396c565b905092915050565b6000819050919050565b6139ff816139ec565b8114613a0a57600080fd5b50565b600081359050613a1c816139f6565b92915050565b600060208284031215613a3857613a3761330a565b5b6000613a4684828501613a0d565b91505092915050565b613a5881613399565b8114613a6357600080fd5b50565b600081359050613a7581613a4f565b92915050565b60008060408385031215613a9257613a9161330a565b5b6000613aa0858286016136d5565b9250506020613ab185828601613a66565b9150509250929050565b600067ffffffffffffffff821115613ad657613ad56133ea565b5b613adf826133d9565b9050602081019050919050565b6000613aff613afa84613abb565b61344a565b905082815260208101848484011115613b1b57613b1a6133d4565b5b613b26848285613496565b509392505050565b600082601f830112613b4357613b426133cf565b5b8135613b53848260208601613aec565b91505092915050565b60008060008060808587031215613b7657613b7561330a565b5b6000613b84878288016136d5565b9450506020613b95878288016136d5565b9350506040613ba687828801613620565b925050606085013567ffffffffffffffff811115613bc757613bc661330f565b5b613bd387828801613b2e565b91505092959194509250565b60008060408385031215613bf657613bf561330a565b5b6000613c04858286016136d5565b9250506020613c15858286016136d5565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c6657607f821691505b602082108103613c7957613c78613c1f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613ce17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613ca4565b613ceb8683613ca4565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613d28613d23613d1e846135ff565b613d03565b6135ff565b9050919050565b6000819050919050565b613d4283613d0d565b613d56613d4e82613d2f565b848454613cb1565b825550505050565b600090565b613d6b613d5e565b613d76818484613d39565b505050565b5b81811015613d9a57613d8f600082613d63565b600181019050613d7c565b5050565b601f821115613ddf57613db081613c7f565b613db984613c94565b81016020851015613dc8578190505b613ddc613dd485613c94565b830182613d7b565b50505b505050565b600082821c905092915050565b6000613e0260001984600802613de4565b1980831691505092915050565b6000613e1b8383613df1565b9150826002028217905092915050565b613e348261355e565b67ffffffffffffffff811115613e4d57613e4c6133ea565b5b613e578254613c4e565b613e62828285613d9e565b600060209050601f831160018114613e955760008415613e83578287015190505b613e8d8582613e0f565b865550613ef5565b601f198416613ea386613c7f565b60005b82811015613ecb57848901518255600182019150602085019450602081019050613ea6565b86831015613ee85784890151613ee4601f891682613df1565b8355505b6001600288020188555050505b505050505050565b7f5072652d73616c6520686176656e277420737461727465640000000000000000600082015250565b6000613f33601883613569565b9150613f3e82613efd565b602082019050919050565b60006020820190508181036000830152613f6281613f26565b9050919050565b7f496e76616c6964206d65726b6c652070726f6f66000000000000000000000000600082015250565b6000613f9f601483613569565b9150613faa82613f69565b602082019050919050565b60006020820190508181036000830152613fce81613f92565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061400f826135ff565b915061401a836135ff565b925082820190508082111561403257614031613fd5565b5b92915050565b7f45786365646573206d617820737570706c792e00000000000000000000000000600082015250565b600061406e601383613569565b915061407982614038565b602082019050919050565b6000602082019050818103600083015261409d81614061565b9050919050565b7f4578636565647320616c6c6f77616e6365000000000000000000000000000000600082015250565b60006140da601183613569565b91506140e5826140a4565b602082019050919050565b60006020820190508181036000830152614109816140cd565b9050919050565b600061411b826135ff565b9150614126836135ff565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561415f5761415e613fd5565b5b828202905092915050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b60006141a0601f83613569565b91506141ab8261416a565b602082019050919050565b600060208201905081810360008301526141cf81614193565b9050919050565b60006141e1826135ff565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361421357614212613fd5565b5b600182019050919050565b7f53616c6520686176656e27742073746172746564000000000000000000000000600082015250565b6000614254601483613569565b915061425f8261421e565b602082019050919050565b6000602082019050818103600083015261428381614247565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614344602f83613569565b915061434f826142e8565b604082019050919050565b6000602082019050818103600083015261437381614337565b9050919050565b600081905092915050565b60006143908261355e565b61439a818561437a565b93506143aa81856020860161357a565b80840191505092915050565b60006143c28285614385565b91506143ce8284614385565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614436602683613569565b9150614441826143da565b604082019050919050565b6000602082019050818103600083015261446581614429565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006144a2602083613569565b91506144ad8261446c565b602082019050919050565b600060208201905081810360008301526144d181614495565b9050919050565b60008160601b9050919050565b60006144f0826144d8565b9050919050565b6000614502826144e5565b9050919050565b61451a61451582613682565b6144f7565b82525050565b600061452c8284614509565b60148201915081905092915050565b600081905092915050565b50565b600061455660008361453b565b915061456182614546565b600082019050919050565b600061457782614549565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006145b7601083613569565b91506145c282614581565b602082019050919050565b600060208201905081810360008301526145e6816145aa565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614614826145ed565b61461e81856145f8565b935061462e81856020860161357a565b614637816133d9565b840191505092915050565b60006080820190506146576000830187613694565b6146646020830186613694565b614671604083018561372a565b81810360608301526146838184614609565b905095945050505050565b60008151905061469d81613340565b92915050565b6000602082840312156146b9576146b861330a565b5b60006146c78482850161468e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061470a826135ff565b9150614715836135ff565b925082614725576147246146d0565b5b828204905092915050565b600061473b826135ff565b9150614746836135ff565b925082820390508181111561475e5761475d613fd5565b5b92915050565b600061476f826135ff565b915061477a836135ff565b92508261478a576147896146d0565b5b82820690509291505056fea2646970667358221220acb5d09468f0a7a9e69310578e1a474e9e2f4fefe715263bd45057791585c19064736f6c63430008100033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100b19b8a4448da867b8fe4c00b16743bbdf86074ca2b4189ea225a0b87d6d9bb800000000000000000000000000000000000000000000000000000000000000003474f4f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034d55540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002068747470733a2f2f6170692e6d7574616e74676f627a2e696f2f746f6b656e2f
-----Decoded View---------------
Arg [0] : Name (string): GOO
Arg [1] : Symbol (string): MUT
Arg [2] : _URI (string): https://api.mutantgobz.io/token/
Arg [3] : _root (bytes32): 0xb19b8a4448da867b8fe4c00b16743bbdf86074ca2b4189ea225a0b87d6d9bb80
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : b19b8a4448da867b8fe4c00b16743bbdf86074ca2b4189ea225a0b87d6d9bb80
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 474f4f0000000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [7] : 4d55540000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [9] : 68747470733a2f2f6170692e6d7574616e74676f627a2e696f2f746f6b656e2f
Deployed Bytecode Sourcemap
99890:9373:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66664:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;108735:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67566:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74057:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73490:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100506:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100477;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;103023:897;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63317:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77696:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100095:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;108289:250;;;;;;;;;;;;;:::i;:::-;;104833:563;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;101095:1015;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80617:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;107047:734;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100247:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68959:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64501:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15614:103;;;;;;;;;;;;;:::i;:::-;;100611:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;106742:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100991:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;106840:90;;;;;;;;;;;;;:::i;:::-;;14966:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100566:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100295:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100535:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67742:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74615:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102118:897;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81408:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;105404:563;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;107789:492;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;106938:101;;;;;;;;;;;;;:::i;:::-;;106644:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100342:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;105975:563;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;103928:897;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75006:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;106546:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15872:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100144:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100191:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66664:639;66749:4;67088:10;67073:25;;:11;:25;;;;:102;;;;67165:10;67150:25;;:11;:25;;;;67073:102;:179;;;;67242:10;67227:25;;:11;:25;;;;67073:179;67053:199;;66664:639;;;:::o;108735:86::-;14852:13;:11;:13::i;:::-;108810:3:::1;108798:9;:15;;;;;;:::i;:::-;;108735:86:::0;:::o;67566:100::-;67620:13;67653:5;67646:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67566:100;:::o;74057:218::-;74133:7;74158:16;74166:7;74158;:16::i;:::-;74153:64;;74183:34;;;;;;;;;;;;;;74153:64;74237:15;:24;74253:7;74237:24;;;;;;;;;;;:30;;;;;;;;;;;;74230:37;;74057:218;;;:::o;73490:408::-;73579:13;73595:16;73603:7;73595;:16::i;:::-;73579:32;;73651:5;73628:28;;:19;:17;:19::i;:::-;:28;;;73624:175;;73676:44;73693:5;73700:19;:17;:19::i;:::-;73676:16;:44::i;:::-;73671:128;;73748:35;;;;;;;;;;;;;;73671:128;73624:175;73844:2;73811:15;:24;73827:7;73811:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;73882:7;73878:2;73862:28;;73871:5;73862:28;;;;;;;;;;;;73568:330;73490:408;;:::o;100506:22::-;;;;:::o;100477:::-;;;;:::o;103023:897::-;103146:18;;;;;;;;;;;103138:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;103204:19;103226:14;:12;:14::i;:::-;103204:36;;103259:33;103267:17;103273:10;103267:5;:17::i;:::-;103286:5;;103259:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:33::i;:::-;103251:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;103362:10;103350:8;103336:11;:22;;;;:::i;:::-;:36;;103328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;103475:18;103463:8;103429:19;:31;103449:10;103429:31;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;:64;;103407:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;103584:8;103549:19;:31;103569:10;103549:31;;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;103653:9;103641:8;103625:13;;:24;;;;:::i;:::-;:37;;103603:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;103739:9;103751:11;103739:23;;103734:109;103782:8;103768:11;:22;;;;:::i;:::-;103764:1;:26;103734:109;;;103812:11;103829:1;103812:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;103792:3;;;;;:::i;:::-;;;;103734:109;;;;103866:8;103855:7;;:19;;;;;;;:::i;:::-;;;;;;;;103885:27;103891:10;103903:8;103885:5;:27::i;:::-;103127:793;103023:897;;;:::o;63317:323::-;63378:7;63606:15;:13;:15::i;:::-;63591:12;;63575:13;;:28;:46;63568:53;;63317:323;:::o;77696:2825::-;77838:27;77868;77887:7;77868:18;:27::i;:::-;77838:57;;77953:4;77912:45;;77928:19;77912:45;;;77908:86;;77966:28;;;;;;;;;;;;;;77908:86;78008:27;78037:23;78064:35;78091:7;78064:26;:35::i;:::-;78007:92;;;;78199:68;78224:15;78241:4;78247:19;:17;:19::i;:::-;78199:24;:68::i;:::-;78194:180;;78287:43;78304:4;78310:19;:17;:19::i;:::-;78287:16;:43::i;:::-;78282:92;;78339:35;;;;;;;;;;;;;;78282:92;78194:180;78405:1;78391:16;;:2;:16;;;78387:52;;78416:23;;;;;;;;;;;;;;78387:52;78452:43;78474:4;78480:2;78484:7;78493:1;78452:21;:43::i;:::-;78588:15;78585:160;;;78728:1;78707:19;78700:30;78585:160;79125:18;:24;79144:4;79125:24;;;;;;;;;;;;;;;;79123:26;;;;;;;;;;;;79194:18;:22;79213:2;79194:22;;;;;;;;;;;;;;;;79192:24;;;;;;;;;;;79516:146;79553:2;79602:45;79617:4;79623:2;79627:19;79602:14;:45::i;:::-;59716:8;79574:73;79516:18;:146::i;:::-;79487:17;:26;79505:7;79487:26;;;;;;;;;;;:175;;;;79833:1;59716:8;79782:19;:47;:52;79778:627;;79855:19;79887:1;79877:7;:11;79855:33;;80044:1;80010:17;:30;80028:11;80010:30;;;;;;;;;;;;:35;80006:384;;80148:13;;80133:11;:28;80129:242;;80328:19;80295:17;:30;80313:11;80295:30;;;;;;;;;;;:52;;;;80129:242;80006:384;79836:569;79778:627;80452:7;80448:2;80433:27;;80442:4;80433:27;;;;;;;;;;;;80471:42;80492:4;80498:2;80502:7;80511:1;80471:20;:42::i;:::-;77827:2694;;;77696:2825;;;:::o;100095:42::-;;;:::o;108289:250::-;14852:13;:11;:13::i;:::-;108337:15:::1;108355:21;108337:39;;108405:1;108395:7;:11;108387:20;;;::::0;::::1;;108418:113;108442:42;108499:21;108418:9;:113::i;:::-;108326:213;108289:250::o:0;104833:563::-;104903:14;;;;;;;;;;;104895:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;104953:19;104975:14;:12;:14::i;:::-;104953:36;;105034:10;105022:8;105008:11;:22;;;;:::i;:::-;:36;;105000:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;105129:9;105117:8;105101:13;;:24;;;;:::i;:::-;:37;;105079:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;105215:9;105227:11;105215:23;;105210:109;105258:8;105244:11;:22;;;;:::i;:::-;105240:1;:26;105210:109;;;105288:11;105305:1;105288:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;105268:3;;;;;:::i;:::-;;;;105210:109;;;;105342:8;105331:7;;:19;;;;;;;:::i;:::-;;;;;;;;105361:27;105367:10;105379:8;105361:5;:27::i;:::-;104884:512;104833:563;:::o;101095:1015::-;14852:13;:11;:13::i;:::-;101229:19:::1;101251:14;:12;:14::i;:::-;101229:36;;101310:10;101298:8;101284:11;:22;;;;:::i;:::-;:36;;101276:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;101373:11;101359:25;;;;;;;;:::i;:::-;;:10;:25;;;;;;;;:::i;:::-;;::::0;101355:242:::1;;101406:9;101418:11;101406:23;;101401:117;101449:8;101435:11;:22;;;;:::i;:::-;101431:1;:26;101401:117;;;101483:11;101500:1;101483:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101459:3;;;;;:::i;:::-;;;;101401:117;;;;101543:8;101532:7;;:19;;;;;;;:::i;:::-;;;;;;;;101566;101572:2;101576:8;101566:5;:19::i;:::-;101355:242;101625:11;101611:25;;;;;;;;:::i;:::-;;:10;:25;;;;;;;;:::i;:::-;;::::0;101607:242:::1;;101658:9;101670:11;101658:23;;101653:117;101701:8;101687:11;:22;;;;:::i;:::-;101683:1;:26;101653:117;;;101735:11;101752:1;101735:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101711:3;;;;;:::i;:::-;;;;101653:117;;;;101795:8;101784:7;;:19;;;;;;;:::i;:::-;;;;;;;;101818;101824:2;101828:8;101818:5;:19::i;:::-;101607:242;101877:11;101863:25:::0;::::1;;;;;;;:::i;:::-;;:10;:25;;;;;;;;:::i;:::-;;::::0;101859:244:::1;;101910:9;101922:11;101910:23;;101905:117;101953:8;101939:11;:22;;;;:::i;:::-;101935:1;:26;101905:117;;;101987:11;102004:1;101987:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101963:3;;;;;:::i;:::-;;;;101905:117;;;;102049:8;102038:7;;:19;;;;;;;:::i;:::-;;;;;;;;102072;102078:2;102082:8;102072:5;:19::i;:::-;101859:244;101218:892;101095:1015:::0;;;:::o;80617:193::-;80763:39;80780:4;80786:2;80790:7;80763:39;;;;;;;;;;;;:16;:39::i;:::-;80617:193;;;:::o;107047:734::-;107134:16;107168:23;107194:17;107204:6;107194:9;:17::i;:::-;107168:43;;107222:30;107269:15;107255:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;107222:63;;107296:22;107321:1;107296:26;;107333:23;107371:372;107410:15;107392;:33;:65;;;;;107447:10;107429:14;:28;;107392:65;107371:372;;;107484:25;107512:23;107520:14;107512:7;:23::i;:::-;107484:51;;107575:6;107554:27;;:17;:27;;;107550:151;;107635:14;107602:13;107616:15;107602:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;107668:17;;;;;:::i;:::-;;;;107550:151;107715:16;;;;;:::i;:::-;;;;107469:274;107371:372;;;107760:13;107753:20;;;;;;107047:734;;;:::o;100247:41::-;;;;:::o;68959:152::-;69031:7;69074:27;69093:7;69074:18;:27::i;:::-;69051:52;;68959:152;;;:::o;64501:233::-;64573:7;64614:1;64597:19;;:5;:19;;;64593:60;;64625:28;;;;;;;;;;;;;;64593:60;58660:13;64671:18;:25;64690:5;64671:25;;;;;;;;;;;;;;;;:55;64664:62;;64501:233;;;:::o;15614:103::-;14852:13;:11;:13::i;:::-;15679:30:::1;15706:1;15679:18;:30::i;:::-;15614:103::o:0;100611:34::-;;;;;;;;;;;;;:::o;106742:90::-;106780:13;106813:11;106806:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;106742:90;:::o;100991:96::-;14852:13;:11;:13::i;:::-;101069:10:::1;101062:4;:17;;;;100991:96:::0;:::o;106840:90::-;14852:13;:11;:13::i;:::-;106908:14:::1;;;;;;;;;;;106907:15;106890:14;;:32;;;;;;;;;;;;;;;;;;106840:90::o:0;14966:87::-;15012:7;15039:6;;;;;;;;;;;15032:13;;14966:87;:::o;100566:38::-;;;;;;;;;;;;;:::o;100295:40::-;;;;:::o;100535:22::-;;;;:::o;67742:104::-;67798:13;67831:7;67824:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67742:104;:::o;74615:234::-;74762:8;74710:18;:39;74729:19;:17;:19::i;:::-;74710:39;;;;;;;;;;;;;;;:49;74750:8;74710:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;74822:8;74786:55;;74801:19;:17;:19::i;:::-;74786:55;;;74832:8;74786:55;;;;;;:::i;:::-;;;;;;;;74615:234;;:::o;102118:897::-;102241:18;;;;;;;;;;;102233:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;102299:19;102321:14;:12;:14::i;:::-;102299:36;;102354:33;102362:17;102368:10;102362:5;:17::i;:::-;102381:5;;102354:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:33::i;:::-;102346:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;102457:10;102445:8;102431:11;:22;;;;:::i;:::-;:36;;102423:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;102570:18;102558:8;102524:19;:31;102544:10;102524:31;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;:64;;102502:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;102679:8;102644:19;:31;102664:10;102644:31;;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;102748:9;102736:8;102720:13;;:24;;;;:::i;:::-;:37;;102698:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;102834:9;102846:11;102834:23;;102829:109;102877:8;102863:11;:22;;;;:::i;:::-;102859:1;:26;102829:109;;;102907:11;102924:1;102907:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;102887:3;;;;;:::i;:::-;;;;102829:109;;;;102961:8;102950:7;;:19;;;;;;;:::i;:::-;;;;;;;;102980:27;102986:10;102998:8;102980:5;:27::i;:::-;102222:793;102118:897;;;:::o;81408:407::-;81583:31;81596:4;81602:2;81606:7;81583:12;:31::i;:::-;81647:1;81629:2;:14;;;:19;81625:183;;81668:56;81699:4;81705:2;81709:7;81718:5;81668:30;:56::i;:::-;81663:145;;81752:40;;;;;;;;;;;;;;81663:145;81625:183;81408:407;;;;:::o;105404:563::-;105474:14;;;;;;;;;;;105466:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;105524:19;105546:14;:12;:14::i;:::-;105524:36;;105605:10;105593:8;105579:11;:22;;;;:::i;:::-;:36;;105571:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;105700:9;105688:8;105672:13;;:24;;;;:::i;:::-;:37;;105650:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;105786:9;105798:11;105786:23;;105781:109;105829:8;105815:11;:22;;;;:::i;:::-;105811:1;:26;105781:109;;;105859:11;105876:1;105859:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;105839:3;;;;;:::i;:::-;;;;105781:109;;;;105913:8;105902:7;;:19;;;;;;;:::i;:::-;;;;;;;;105932:27;105938:10;105950:8;105932:5;:27::i;:::-;105455:512;105404:563;:::o;107789:492::-;107908:13;107961:17;107969:8;107961:7;:17::i;:::-;107939:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;108066:28;108097:10;:8;:10::i;:::-;108066:41;;108169:1;108144:14;108138:28;:32;:135;;;;;;;;;;;;;;;;;108214:14;108230:19;:8;:17;:19::i;:::-;108197:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;108138:135;108118:155;;;107789:492;;;:::o;106938:101::-;14852:13;:11;:13::i;:::-;107013:18:::1;;;;;;;;;;;107012:19;106991:18;;:40;;;;;;;;;;;;;;;;;;106938:101::o:0;106644:90::-;106682:13;106715:11;106708:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;106644:90;:::o;100342:40::-;;;;:::o;105975:563::-;106045:14;;;;;;;;;;;106037:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;106095:19;106117:14;:12;:14::i;:::-;106095:36;;106176:10;106164:8;106150:11;:22;;;;:::i;:::-;:36;;106142:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;106271:9;106259:8;106243:13;;:24;;;;:::i;:::-;:37;;106221:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;106357:9;106369:11;106357:23;;106352:109;106400:8;106386:11;:22;;;;:::i;:::-;106382:1;:26;106352:109;;;106430:11;106447:1;106430:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;106410:3;;;;;:::i;:::-;;;;106352:109;;;;106484:8;106473:7;;:19;;;;;;;:::i;:::-;;;;;;;;106503:27;106509:10;106521:8;106503:5;:27::i;:::-;106026:512;105975:563;:::o;103928:897::-;104051:18;;;;;;;;;;;104043:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;104109:19;104131:14;:12;:14::i;:::-;104109:36;;104164:33;104172:17;104178:10;104172:5;:17::i;:::-;104191:5;;104164:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:33::i;:::-;104156:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;104267:10;104255:8;104241:11;:22;;;;:::i;:::-;:36;;104233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;104380:18;104368:8;104334:19;:31;104354:10;104334:31;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;:64;;104312:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;104489:8;104454:19;:31;104474:10;104454:31;;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;104558:9;104546:8;104530:13;;:24;;;;:::i;:::-;:37;;104508:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;104644:9;104656:11;104644:23;;104639:109;104687:8;104673:11;:22;;;;:::i;:::-;104669:1;:26;104639:109;;;104717:11;104734:1;104717:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;104697:3;;;;;:::i;:::-;;;;104639:109;;;;104771:8;104760:7;;:19;;;;;;;:::i;:::-;;;;;;;;104790:27;104796:10;104808:8;104790:5;:27::i;:::-;104032:793;103928:897;;;:::o;75006:164::-;75103:4;75127:18;:25;75146:5;75127:25;;;;;;;;;;;;;;;:35;75153:8;75127:35;;;;;;;;;;;;;;;;;;;;;;;;;75120:42;;75006:164;;;;:::o;106546:90::-;106584:13;106617:11;106610:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;106546:90;:::o;15872:201::-;14852:13;:11;:13::i;:::-;15981:1:::1;15961:22;;:8;:22;;::::0;15953:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;16037:28;16056:8;16037:18;:28::i;:::-;15872:201:::0;:::o;100144:40::-;;;:::o;100191:47::-;;;:::o;15131:132::-;15206:12;:10;:12::i;:::-;15195:23;;:7;:5;:7::i;:::-;:23;;;15187:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15131:132::o;75428:282::-;75493:4;75549:7;75530:15;:13;:15::i;:::-;:26;;:66;;;;;75583:13;;75573:7;:23;75530:66;:153;;;;;75682:1;59436:8;75634:17;:26;75652:7;75634:26;;;;;;;;;;;;:44;:49;75530:153;75510:173;;75428:282;;;:::o;97736:105::-;97796:7;97823:10;97816:17;;97736:105;:::o;63004:103::-;63059:7;63086:13;;63079:20;;63004:103;:::o;108947:126::-;109002:7;109056;109039:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;109029:36;;;;;;109022:43;;108947:126;;;:::o;109081:179::-;109186:4;109215:37;109234:5;109241:4;;109247;109215:18;:37::i;:::-;109208:44;;109081:179;;;;:::o;85077:2966::-;85150:20;85173:13;;85150:36;;85213:1;85201:8;:13;85197:44;;85223:18;;;;;;;;;;;;;;85197:44;85254:61;85284:1;85288:2;85292:12;85306:8;85254:21;:61::i;:::-;85798:1;58798:2;85768:1;:26;;85767:32;85755:8;:45;85729:18;:22;85748:2;85729:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;86077:139;86114:2;86168:33;86191:1;86195:2;86199:1;86168:14;:33::i;:::-;86135:30;86156:8;86135:20;:30::i;:::-;:66;86077:18;:139::i;:::-;86043:17;:31;86061:12;86043:31;;;;;;;;;;;:173;;;;86233:16;86264:11;86293:8;86278:12;:23;86264:37;;86814:16;86810:2;86806:25;86794:37;;87186:12;87146:8;87105:1;87043:25;86984:1;86923;86896:335;87557:1;87543:12;87539:20;87497:346;87598:3;87589:7;87586:16;87497:346;;87816:7;87806:8;87803:1;87776:25;87773:1;87770;87765:59;87651:1;87642:7;87638:15;87627:26;;87497:346;;;87501:77;87888:1;87876:8;:13;87872:45;;87898:19;;;;;;;;;;;;;;87872:45;87950:3;87934:13;:19;;;;85503:2462;;87975:60;88004:1;88008:2;88012:12;88026:8;87975:20;:60::i;:::-;85139:2904;85077:2966;;:::o;62833:92::-;62889:7;62833:92;:::o;70114:1275::-;70181:7;70201:12;70216:7;70201:22;;70284:4;70265:15;:13;:15::i;:::-;:23;70261:1061;;70318:13;;70311:4;:20;70307:1015;;;70356:14;70373:17;:23;70391:4;70373:23;;;;;;;;;;;;70356:40;;70490:1;59436:8;70462:6;:24;:29;70458:845;;71127:113;71144:1;71134:6;:11;71127:113;;71187:17;:25;71205:6;;;;;;;71187:25;;;;;;;;;;;;71178:34;;71127:113;;;71273:6;71266:13;;;;;;70458:845;70333:989;70307:1015;70261:1061;71350:31;;;;;;;;;;;;;;70114:1275;;;;:::o;76591:485::-;76693:27;76722:23;76763:38;76804:15;:24;76820:7;76804:24;;;;;;;;;;;76763:65;;76981:18;76958:41;;77038:19;77032:26;77013:45;;76943:126;76591:485;;;:::o;75819:659::-;75968:11;76133:16;76126:5;76122:28;76113:37;;76293:16;76282:9;76278:32;76265:45;;76443:15;76432:9;76429:30;76421:5;76410:9;76407:20;76404:56;76394:66;;75819:659;;;;;:::o;82477:159::-;;;;;:::o;97045:311::-;97180:7;97200:16;59840:3;97226:19;:41;;97200:68;;59840:3;97294:31;97305:4;97311:2;97315:9;97294:10;:31::i;:::-;97286:40;;:62;;97279:69;;;97045:311;;;;;:::o;71937:450::-;72017:14;72185:16;72178:5;72174:28;72165:37;;72362:5;72348:11;72323:23;72319:41;72316:52;72309:5;72306:63;72296:73;;71937:450;;;;:::o;83301:158::-;;;;;:::o;108547:180::-;108621:12;108639:8;:13;;108660:7;108639:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;108620:52;;;108691:7;108683:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;108609:118;108547:180;;:::o;16233:191::-;16307:16;16326:6;;;;;;;;;;;16307:25;;16352:8;16343:6;;:17;;;;;;;;;;;;;;;;;;16407:8;16376:40;;16397:8;16376:40;;;;;;;;;;;;16296:128;16233:191;:::o;83899:716::-;84062:4;84108:2;84083:45;;;84129:19;:17;:19::i;:::-;84150:4;84156:7;84165:5;84083:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;84079:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84383:1;84366:6;:13;:18;84362:235;;84412:40;;;;;;;;;;;;;;84362:235;84555:6;84549:13;84540:6;84536:2;84532:15;84525:38;84079:529;84252:54;;;84242:64;;;:6;:64;;;;84235:71;;;83899:716;;;;;;:::o;108829:110::-;108889:13;108922:9;108915:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;108829:110;:::o;10771:723::-;10827:13;11057:1;11048:5;:10;11044:53;;11075:10;;;;;;;;;;;;;;;;;;;;;11044:53;11107:12;11122:5;11107:20;;11138:14;11163:78;11178:1;11170:4;:9;11163:78;;11196:8;;;;;:::i;:::-;;;;11227:2;11219:10;;;;;:::i;:::-;;;11163:78;;;11251:19;11283:6;11273:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11251:39;;11301:154;11317:1;11308:5;:10;11301:154;;11345:1;11335:11;;;;;:::i;:::-;;;11412:2;11404:5;:10;;;;:::i;:::-;11391:2;:24;;;;:::i;:::-;11378:39;;11361:6;11368;11361:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;11441:2;11432:11;;;;;:::i;:::-;;;11301:154;;;11479:6;11465:21;;;;;10771:723;;;;:::o;13517:98::-;13570:7;13597:10;13590:17;;13517:98;:::o;1370:190::-;1495:4;1548;1519:25;1532:5;1539:4;1519:12;:25::i;:::-;:33;1512:40;;1370:190;;;;;:::o;72489:324::-;72559:14;72792:1;72782:8;72779:15;72753:24;72749:46;72739:56;;72489:324;;;:::o;96746:147::-;96883:6;96746:147;;;;;:::o;2237:296::-;2320:7;2340:20;2363:4;2340:27;;2383:9;2378:118;2402:5;:12;2398:1;:16;2378:118;;;2451:33;2461:12;2475:5;2481:1;2475:8;;;;;;;;:::i;:::-;;;;;;;;2451:9;:33::i;:::-;2436:48;;2416:3;;;;;:::i;:::-;;;;2378:118;;;;2513:12;2506:19;;;2237:296;;;;:::o;8444:149::-;8507:7;8538:1;8534;:5;:51;;8565:20;8580:1;8583;8565:14;:20::i;:::-;8534:51;;;8542:20;8557:1;8560;8542:14;:20::i;:::-;8534:51;8527:58;;8444:149;;;;:::o;8601:268::-;8669:13;8776:1;8770:4;8763:15;8805:1;8799:4;8792:15;8846:4;8840;8830:21;8821:30;;8601:268;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:117::-;1627:1;1624;1617:12;1641:117;1750:1;1747;1740:12;1764:102;1805:6;1856:2;1852:7;1847:2;1840:5;1836:14;1832:28;1822:38;;1764:102;;;:::o;1872:180::-;1920:77;1917:1;1910:88;2017:4;2014:1;2007:15;2041:4;2038:1;2031:15;2058:281;2141:27;2163:4;2141:27;:::i;:::-;2133:6;2129:40;2271:6;2259:10;2256:22;2235:18;2223:10;2220:34;2217:62;2214:88;;;2282:18;;:::i;:::-;2214:88;2322:10;2318:2;2311:22;2101:238;2058:281;;:::o;2345:129::-;2379:6;2406:20;;:::i;:::-;2396:30;;2435:33;2463:4;2455:6;2435:33;:::i;:::-;2345:129;;;:::o;2480:308::-;2542:4;2632:18;2624:6;2621:30;2618:56;;;2654:18;;:::i;:::-;2618:56;2692:29;2714:6;2692:29;:::i;:::-;2684:37;;2776:4;2770;2766:15;2758:23;;2480:308;;;:::o;2794:146::-;2891:6;2886:3;2881;2868:30;2932:1;2923:6;2918:3;2914:16;2907:27;2794:146;;;:::o;2946:425::-;3024:5;3049:66;3065:49;3107:6;3065:49;:::i;:::-;3049:66;:::i;:::-;3040:75;;3138:6;3131:5;3124:21;3176:4;3169:5;3165:16;3214:3;3205:6;3200:3;3196:16;3193:25;3190:112;;;3221:79;;:::i;:::-;3190:112;3311:54;3358:6;3353:3;3348;3311:54;:::i;:::-;3030:341;2946:425;;;;;:::o;3391:340::-;3447:5;3496:3;3489:4;3481:6;3477:17;3473:27;3463:122;;3504:79;;:::i;:::-;3463:122;3621:6;3608:20;3646:79;3721:3;3713:6;3706:4;3698:6;3694:17;3646:79;:::i;:::-;3637:88;;3453:278;3391:340;;;;:::o;3737:509::-;3806:6;3855:2;3843:9;3834:7;3830:23;3826:32;3823:119;;;3861:79;;:::i;:::-;3823:119;4009:1;3998:9;3994:17;3981:31;4039:18;4031:6;4028:30;4025:117;;;4061:79;;:::i;:::-;4025:117;4166:63;4221:7;4212:6;4201:9;4197:22;4166:63;:::i;:::-;4156:73;;3952:287;3737:509;;;;:::o;4252:99::-;4304:6;4338:5;4332:12;4322:22;;4252:99;;;:::o;4357:169::-;4441:11;4475:6;4470:3;4463:19;4515:4;4510:3;4506:14;4491:29;;4357:169;;;;:::o;4532:246::-;4613:1;4623:113;4637:6;4634:1;4631:13;4623:113;;;4722:1;4717:3;4713:11;4707:18;4703:1;4698:3;4694:11;4687:39;4659:2;4656:1;4652:10;4647:15;;4623:113;;;4770:1;4761:6;4756:3;4752:16;4745:27;4594:184;4532:246;;;:::o;4784:377::-;4872:3;4900:39;4933:5;4900:39;:::i;:::-;4955:71;5019:6;5014:3;4955:71;:::i;:::-;4948:78;;5035:65;5093:6;5088:3;5081:4;5074:5;5070:16;5035:65;:::i;:::-;5125:29;5147:6;5125:29;:::i;:::-;5120:3;5116:39;5109:46;;4876:285;4784:377;;;;:::o;5167:313::-;5280:4;5318:2;5307:9;5303:18;5295:26;;5367:9;5361:4;5357:20;5353:1;5342:9;5338:17;5331:47;5395:78;5468:4;5459:6;5395:78;:::i;:::-;5387:86;;5167:313;;;;:::o;5486:77::-;5523:7;5552:5;5541:16;;5486:77;;;:::o;5569:122::-;5642:24;5660:5;5642:24;:::i;:::-;5635:5;5632:35;5622:63;;5681:1;5678;5671:12;5622:63;5569:122;:::o;5697:139::-;5743:5;5781:6;5768:20;5759:29;;5797:33;5824:5;5797:33;:::i;:::-;5697:139;;;;:::o;5842:329::-;5901:6;5950:2;5938:9;5929:7;5925:23;5921:32;5918:119;;;5956:79;;:::i;:::-;5918:119;6076:1;6101:53;6146:7;6137:6;6126:9;6122:22;6101:53;:::i;:::-;6091:63;;6047:117;5842:329;;;;:::o;6177:126::-;6214:7;6254:42;6247:5;6243:54;6232:65;;6177:126;;;:::o;6309:96::-;6346:7;6375:24;6393:5;6375:24;:::i;:::-;6364:35;;6309:96;;;:::o;6411:118::-;6498:24;6516:5;6498:24;:::i;:::-;6493:3;6486:37;6411:118;;:::o;6535:222::-;6628:4;6666:2;6655:9;6651:18;6643:26;;6679:71;6747:1;6736:9;6732:17;6723:6;6679:71;:::i;:::-;6535:222;;;;:::o;6763:122::-;6836:24;6854:5;6836:24;:::i;:::-;6829:5;6826:35;6816:63;;6875:1;6872;6865:12;6816:63;6763:122;:::o;6891:139::-;6937:5;6975:6;6962:20;6953:29;;6991:33;7018:5;6991:33;:::i;:::-;6891:139;;;;:::o;7036:474::-;7104:6;7112;7161:2;7149:9;7140:7;7136:23;7132:32;7129:119;;;7167:79;;:::i;:::-;7129:119;7287:1;7312:53;7357:7;7348:6;7337:9;7333:22;7312:53;:::i;:::-;7302:63;;7258:117;7414:2;7440:53;7485:7;7476:6;7465:9;7461:22;7440:53;:::i;:::-;7430:63;;7385:118;7036:474;;;;;:::o;7516:118::-;7603:24;7621:5;7603:24;:::i;:::-;7598:3;7591:37;7516:118;;:::o;7640:222::-;7733:4;7771:2;7760:9;7756:18;7748:26;;7784:71;7852:1;7841:9;7837:17;7828:6;7784:71;:::i;:::-;7640:222;;;;:::o;7868:117::-;7977:1;7974;7967:12;7991:117;8100:1;8097;8090:12;8131:568;8204:8;8214:6;8264:3;8257:4;8249:6;8245:17;8241:27;8231:122;;8272:79;;:::i;:::-;8231:122;8385:6;8372:20;8362:30;;8415:18;8407:6;8404:30;8401:117;;;8437:79;;:::i;:::-;8401:117;8551:4;8543:6;8539:17;8527:29;;8605:3;8597:4;8589:6;8585:17;8575:8;8571:32;8568:41;8565:128;;;8612:79;;:::i;:::-;8565:128;8131:568;;;;;:::o;8705:704::-;8800:6;8808;8816;8865:2;8853:9;8844:7;8840:23;8836:32;8833:119;;;8871:79;;:::i;:::-;8833:119;8991:1;9016:53;9061:7;9052:6;9041:9;9037:22;9016:53;:::i;:::-;9006:63;;8962:117;9146:2;9135:9;9131:18;9118:32;9177:18;9169:6;9166:30;9163:117;;;9199:79;;:::i;:::-;9163:117;9312:80;9384:7;9375:6;9364:9;9360:22;9312:80;:::i;:::-;9294:98;;;;9089:313;8705:704;;;;;:::o;9415:619::-;9492:6;9500;9508;9557:2;9545:9;9536:7;9532:23;9528:32;9525:119;;;9563:79;;:::i;:::-;9525:119;9683:1;9708:53;9753:7;9744:6;9733:9;9729:22;9708:53;:::i;:::-;9698:63;;9654:117;9810:2;9836:53;9881:7;9872:6;9861:9;9857:22;9836:53;:::i;:::-;9826:63;;9781:118;9938:2;9964:53;10009:7;10000:6;9989:9;9985:22;9964:53;:::i;:::-;9954:63;;9909:118;9415:619;;;;;:::o;10040:112::-;10126:1;10119:5;10116:12;10106:40;;10142:1;10139;10132:12;10106:40;10040:112;:::o;10158:165::-;10217:5;10255:6;10242:20;10233:29;;10271:46;10311:5;10271:46;:::i;:::-;10158:165;;;;:::o;10329:645::-;10419:6;10427;10435;10484:2;10472:9;10463:7;10459:23;10455:32;10452:119;;;10490:79;;:::i;:::-;10452:119;10610:1;10635:53;10680:7;10671:6;10660:9;10656:22;10635:53;:::i;:::-;10625:63;;10581:117;10737:2;10763:53;10808:7;10799:6;10788:9;10784:22;10763:53;:::i;:::-;10753:63;;10708:118;10865:2;10891:66;10949:7;10940:6;10929:9;10925:22;10891:66;:::i;:::-;10881:76;;10836:131;10329:645;;;;;:::o;10980:329::-;11039:6;11088:2;11076:9;11067:7;11063:23;11059:32;11056:119;;;11094:79;;:::i;:::-;11056:119;11214:1;11239:53;11284:7;11275:6;11264:9;11260:22;11239:53;:::i;:::-;11229:63;;11185:117;10980:329;;;;:::o;11315:114::-;11382:6;11416:5;11410:12;11400:22;;11315:114;;;:::o;11435:184::-;11534:11;11568:6;11563:3;11556:19;11608:4;11603:3;11599:14;11584:29;;11435:184;;;;:::o;11625:132::-;11692:4;11715:3;11707:11;;11745:4;11740:3;11736:14;11728:22;;11625:132;;;:::o;11763:108::-;11840:24;11858:5;11840:24;:::i;:::-;11835:3;11828:37;11763:108;;:::o;11877:179::-;11946:10;11967:46;12009:3;12001:6;11967:46;:::i;:::-;12045:4;12040:3;12036:14;12022:28;;11877:179;;;;:::o;12062:113::-;12132:4;12164;12159:3;12155:14;12147:22;;12062:113;;;:::o;12211:732::-;12330:3;12359:54;12407:5;12359:54;:::i;:::-;12429:86;12508:6;12503:3;12429:86;:::i;:::-;12422:93;;12539:56;12589:5;12539:56;:::i;:::-;12618:7;12649:1;12634:284;12659:6;12656:1;12653:13;12634:284;;;12735:6;12729:13;12762:63;12821:3;12806:13;12762:63;:::i;:::-;12755:70;;12848:60;12901:6;12848:60;:::i;:::-;12838:70;;12694:224;12681:1;12678;12674:9;12669:14;;12634:284;;;12638:14;12934:3;12927:10;;12335:608;;;12211:732;;;;:::o;12949:373::-;13092:4;13130:2;13119:9;13115:18;13107:26;;13179:9;13173:4;13169:20;13165:1;13154:9;13150:17;13143:47;13207:108;13310:4;13301:6;13207:108;:::i;:::-;13199:116;;12949:373;;;;:::o;13328:77::-;13365:7;13394:5;13383:16;;13328:77;;;:::o;13411:122::-;13484:24;13502:5;13484:24;:::i;:::-;13477:5;13474:35;13464:63;;13523:1;13520;13513:12;13464:63;13411:122;:::o;13539:139::-;13585:5;13623:6;13610:20;13601:29;;13639:33;13666:5;13639:33;:::i;:::-;13539:139;;;;:::o;13684:329::-;13743:6;13792:2;13780:9;13771:7;13767:23;13763:32;13760:119;;;13798:79;;:::i;:::-;13760:119;13918:1;13943:53;13988:7;13979:6;13968:9;13964:22;13943:53;:::i;:::-;13933:63;;13889:117;13684:329;;;;:::o;14019:116::-;14089:21;14104:5;14089:21;:::i;:::-;14082:5;14079:32;14069:60;;14125:1;14122;14115:12;14069:60;14019:116;:::o;14141:133::-;14184:5;14222:6;14209:20;14200:29;;14238:30;14262:5;14238:30;:::i;:::-;14141:133;;;;:::o;14280:468::-;14345:6;14353;14402:2;14390:9;14381:7;14377:23;14373:32;14370:119;;;14408:79;;:::i;:::-;14370:119;14528:1;14553:53;14598:7;14589:6;14578:9;14574:22;14553:53;:::i;:::-;14543:63;;14499:117;14655:2;14681:50;14723:7;14714:6;14703:9;14699:22;14681:50;:::i;:::-;14671:60;;14626:115;14280:468;;;;;:::o;14754:307::-;14815:4;14905:18;14897:6;14894:30;14891:56;;;14927:18;;:::i;:::-;14891:56;14965:29;14987:6;14965:29;:::i;:::-;14957:37;;15049:4;15043;15039:15;15031:23;;14754:307;;;:::o;15067:423::-;15144:5;15169:65;15185:48;15226:6;15185:48;:::i;:::-;15169:65;:::i;:::-;15160:74;;15257:6;15250:5;15243:21;15295:4;15288:5;15284:16;15333:3;15324:6;15319:3;15315:16;15312:25;15309:112;;;15340:79;;:::i;:::-;15309:112;15430:54;15477:6;15472:3;15467;15430:54;:::i;:::-;15150:340;15067:423;;;;;:::o;15509:338::-;15564:5;15613:3;15606:4;15598:6;15594:17;15590:27;15580:122;;15621:79;;:::i;:::-;15580:122;15738:6;15725:20;15763:78;15837:3;15829:6;15822:4;15814:6;15810:17;15763:78;:::i;:::-;15754:87;;15570:277;15509:338;;;;:::o;15853:943::-;15948:6;15956;15964;15972;16021:3;16009:9;16000:7;15996:23;15992:33;15989:120;;;16028:79;;:::i;:::-;15989:120;16148:1;16173:53;16218:7;16209:6;16198:9;16194:22;16173:53;:::i;:::-;16163:63;;16119:117;16275:2;16301:53;16346:7;16337:6;16326:9;16322:22;16301:53;:::i;:::-;16291:63;;16246:118;16403:2;16429:53;16474:7;16465:6;16454:9;16450:22;16429:53;:::i;:::-;16419:63;;16374:118;16559:2;16548:9;16544:18;16531:32;16590:18;16582:6;16579:30;16576:117;;;16612:79;;:::i;:::-;16576:117;16717:62;16771:7;16762:6;16751:9;16747:22;16717:62;:::i;:::-;16707:72;;16502:287;15853:943;;;;;;;:::o;16802:474::-;16870:6;16878;16927:2;16915:9;16906:7;16902:23;16898:32;16895:119;;;16933:79;;:::i;:::-;16895:119;17053:1;17078:53;17123:7;17114:6;17103:9;17099:22;17078:53;:::i;:::-;17068:63;;17024:117;17180:2;17206:53;17251:7;17242:6;17231:9;17227:22;17206:53;:::i;:::-;17196:63;;17151:118;16802:474;;;;;:::o;17282:180::-;17330:77;17327:1;17320:88;17427:4;17424:1;17417:15;17451:4;17448:1;17441:15;17468:320;17512:6;17549:1;17543:4;17539:12;17529:22;;17596:1;17590:4;17586:12;17617:18;17607:81;;17673:4;17665:6;17661:17;17651:27;;17607:81;17735:2;17727:6;17724:14;17704:18;17701:38;17698:84;;17754:18;;:::i;:::-;17698:84;17519:269;17468:320;;;:::o;17794:141::-;17843:4;17866:3;17858:11;;17889:3;17886:1;17879:14;17923:4;17920:1;17910:18;17902:26;;17794:141;;;:::o;17941:93::-;17978:6;18025:2;18020;18013:5;18009:14;18005:23;17995:33;;17941:93;;;:::o;18040:107::-;18084:8;18134:5;18128:4;18124:16;18103:37;;18040:107;;;;:::o;18153:393::-;18222:6;18272:1;18260:10;18256:18;18295:97;18325:66;18314:9;18295:97;:::i;:::-;18413:39;18443:8;18432:9;18413:39;:::i;:::-;18401:51;;18485:4;18481:9;18474:5;18470:21;18461:30;;18534:4;18524:8;18520:19;18513:5;18510:30;18500:40;;18229:317;;18153:393;;;;;:::o;18552:60::-;18580:3;18601:5;18594:12;;18552:60;;;:::o;18618:142::-;18668:9;18701:53;18719:34;18728:24;18746:5;18728:24;:::i;:::-;18719:34;:::i;:::-;18701:53;:::i;:::-;18688:66;;18618:142;;;:::o;18766:75::-;18809:3;18830:5;18823:12;;18766:75;;;:::o;18847:269::-;18957:39;18988:7;18957:39;:::i;:::-;19018:91;19067:41;19091:16;19067:41;:::i;:::-;19059:6;19052:4;19046:11;19018:91;:::i;:::-;19012:4;19005:105;18923:193;18847:269;;;:::o;19122:73::-;19167:3;19122:73;:::o;19201:189::-;19278:32;;:::i;:::-;19319:65;19377:6;19369;19363:4;19319:65;:::i;:::-;19254:136;19201:189;;:::o;19396:186::-;19456:120;19473:3;19466:5;19463:14;19456:120;;;19527:39;19564:1;19557:5;19527:39;:::i;:::-;19500:1;19493:5;19489:13;19480:22;;19456:120;;;19396:186;;:::o;19588:543::-;19689:2;19684:3;19681:11;19678:446;;;19723:38;19755:5;19723:38;:::i;:::-;19807:29;19825:10;19807:29;:::i;:::-;19797:8;19793:44;19990:2;19978:10;19975:18;19972:49;;;20011:8;19996:23;;19972:49;20034:80;20090:22;20108:3;20090:22;:::i;:::-;20080:8;20076:37;20063:11;20034:80;:::i;:::-;19693:431;;19678:446;19588:543;;;:::o;20137:117::-;20191:8;20241:5;20235:4;20231:16;20210:37;;20137:117;;;;:::o;20260:169::-;20304:6;20337:51;20385:1;20381:6;20373:5;20370:1;20366:13;20337:51;:::i;:::-;20333:56;20418:4;20412;20408:15;20398:25;;20311:118;20260:169;;;;:::o;20434:295::-;20510:4;20656:29;20681:3;20675:4;20656:29;:::i;:::-;20648:37;;20718:3;20715:1;20711:11;20705:4;20702:21;20694:29;;20434:295;;;;:::o;20734:1395::-;20851:37;20884:3;20851:37;:::i;:::-;20953:18;20945:6;20942:30;20939:56;;;20975:18;;:::i;:::-;20939:56;21019:38;21051:4;21045:11;21019:38;:::i;:::-;21104:67;21164:6;21156;21150:4;21104:67;:::i;:::-;21198:1;21222:4;21209:17;;21254:2;21246:6;21243:14;21271:1;21266:618;;;;21928:1;21945:6;21942:77;;;21994:9;21989:3;21985:19;21979:26;21970:35;;21942:77;22045:67;22105:6;22098:5;22045:67;:::i;:::-;22039:4;22032:81;21901:222;21236:887;;21266:618;21318:4;21314:9;21306:6;21302:22;21352:37;21384:4;21352:37;:::i;:::-;21411:1;21425:208;21439:7;21436:1;21433:14;21425:208;;;21518:9;21513:3;21509:19;21503:26;21495:6;21488:42;21569:1;21561:6;21557:14;21547:24;;21616:2;21605:9;21601:18;21588:31;;21462:4;21459:1;21455:12;21450:17;;21425:208;;;21661:6;21652:7;21649:19;21646:179;;;21719:9;21714:3;21710:19;21704:26;21762:48;21804:4;21796:6;21792:17;21781:9;21762:48;:::i;:::-;21754:6;21747:64;21669:156;21646:179;21871:1;21867;21859:6;21855:14;21851:22;21845:4;21838:36;21273:611;;;21236:887;;20826:1303;;;20734:1395;;:::o;22135:174::-;22275:26;22271:1;22263:6;22259:14;22252:50;22135:174;:::o;22315:366::-;22457:3;22478:67;22542:2;22537:3;22478:67;:::i;:::-;22471:74;;22554:93;22643:3;22554:93;:::i;:::-;22672:2;22667:3;22663:12;22656:19;;22315:366;;;:::o;22687:419::-;22853:4;22891:2;22880:9;22876:18;22868:26;;22940:9;22934:4;22930:20;22926:1;22915:9;22911:17;22904:47;22968:131;23094:4;22968:131;:::i;:::-;22960:139;;22687:419;;;:::o;23112:170::-;23252:22;23248:1;23240:6;23236:14;23229:46;23112:170;:::o;23288:366::-;23430:3;23451:67;23515:2;23510:3;23451:67;:::i;:::-;23444:74;;23527:93;23616:3;23527:93;:::i;:::-;23645:2;23640:3;23636:12;23629:19;;23288:366;;;:::o;23660:419::-;23826:4;23864:2;23853:9;23849:18;23841:26;;23913:9;23907:4;23903:20;23899:1;23888:9;23884:17;23877:47;23941:131;24067:4;23941:131;:::i;:::-;23933:139;;23660:419;;;:::o;24085:180::-;24133:77;24130:1;24123:88;24230:4;24227:1;24220:15;24254:4;24251:1;24244:15;24271:191;24311:3;24330:20;24348:1;24330:20;:::i;:::-;24325:25;;24364:20;24382:1;24364:20;:::i;:::-;24359:25;;24407:1;24404;24400:9;24393:16;;24428:3;24425:1;24422:10;24419:36;;;24435:18;;:::i;:::-;24419:36;24271:191;;;;:::o;24468:169::-;24608:21;24604:1;24596:6;24592:14;24585:45;24468:169;:::o;24643:366::-;24785:3;24806:67;24870:2;24865:3;24806:67;:::i;:::-;24799:74;;24882:93;24971:3;24882:93;:::i;:::-;25000:2;24995:3;24991:12;24984:19;;24643:366;;;:::o;25015:419::-;25181:4;25219:2;25208:9;25204:18;25196:26;;25268:9;25262:4;25258:20;25254:1;25243:9;25239:17;25232:47;25296:131;25422:4;25296:131;:::i;:::-;25288:139;;25015:419;;;:::o;25440:167::-;25580:19;25576:1;25568:6;25564:14;25557:43;25440:167;:::o;25613:366::-;25755:3;25776:67;25840:2;25835:3;25776:67;:::i;:::-;25769:74;;25852:93;25941:3;25852:93;:::i;:::-;25970:2;25965:3;25961:12;25954:19;;25613:366;;;:::o;25985:419::-;26151:4;26189:2;26178:9;26174:18;26166:26;;26238:9;26232:4;26228:20;26224:1;26213:9;26209:17;26202:47;26266:131;26392:4;26266:131;:::i;:::-;26258:139;;25985:419;;;:::o;26410:348::-;26450:7;26473:20;26491:1;26473:20;:::i;:::-;26468:25;;26507:20;26525:1;26507:20;:::i;:::-;26502:25;;26695:1;26627:66;26623:74;26620:1;26617:81;26612:1;26605:9;26598:17;26594:105;26591:131;;;26702:18;;:::i;:::-;26591:131;26750:1;26747;26743:9;26732:20;;26410:348;;;;:::o;26764:181::-;26904:33;26900:1;26892:6;26888:14;26881:57;26764:181;:::o;26951:366::-;27093:3;27114:67;27178:2;27173:3;27114:67;:::i;:::-;27107:74;;27190:93;27279:3;27190:93;:::i;:::-;27308:2;27303:3;27299:12;27292:19;;26951:366;;;:::o;27323:419::-;27489:4;27527:2;27516:9;27512:18;27504:26;;27576:9;27570:4;27566:20;27562:1;27551:9;27547:17;27540:47;27604:131;27730:4;27604:131;:::i;:::-;27596:139;;27323:419;;;:::o;27748:233::-;27787:3;27810:24;27828:5;27810:24;:::i;:::-;27801:33;;27856:66;27849:5;27846:77;27843:103;;27926:18;;:::i;:::-;27843:103;27973:1;27966:5;27962:13;27955:20;;27748:233;;;:::o;27987:170::-;28127:22;28123:1;28115:6;28111:14;28104:46;27987:170;:::o;28163:366::-;28305:3;28326:67;28390:2;28385:3;28326:67;:::i;:::-;28319:74;;28402:93;28491:3;28402:93;:::i;:::-;28520:2;28515:3;28511:12;28504:19;;28163:366;;;:::o;28535:419::-;28701:4;28739:2;28728:9;28724:18;28716:26;;28788:9;28782:4;28778:20;28774:1;28763:9;28759:17;28752:47;28816:131;28942:4;28816:131;:::i;:::-;28808:139;;28535:419;;;:::o;28960:180::-;29008:77;29005:1;28998:88;29105:4;29102:1;29095:15;29129:4;29126:1;29119:15;29146:180;29194:77;29191:1;29184:88;29291:4;29288:1;29281:15;29315:4;29312:1;29305:15;29332:234;29472:34;29468:1;29460:6;29456:14;29449:58;29541:17;29536:2;29528:6;29524:15;29517:42;29332:234;:::o;29572:366::-;29714:3;29735:67;29799:2;29794:3;29735:67;:::i;:::-;29728:74;;29811:93;29900:3;29811:93;:::i;:::-;29929:2;29924:3;29920:12;29913:19;;29572:366;;;:::o;29944:419::-;30110:4;30148:2;30137:9;30133:18;30125:26;;30197:9;30191:4;30187:20;30183:1;30172:9;30168:17;30161:47;30225:131;30351:4;30225:131;:::i;:::-;30217:139;;29944:419;;;:::o;30369:148::-;30471:11;30508:3;30493:18;;30369:148;;;;:::o;30523:390::-;30629:3;30657:39;30690:5;30657:39;:::i;:::-;30712:89;30794:6;30789:3;30712:89;:::i;:::-;30705:96;;30810:65;30868:6;30863:3;30856:4;30849:5;30845:16;30810:65;:::i;:::-;30900:6;30895:3;30891:16;30884:23;;30633:280;30523:390;;;;:::o;30919:435::-;31099:3;31121:95;31212:3;31203:6;31121:95;:::i;:::-;31114:102;;31233:95;31324:3;31315:6;31233:95;:::i;:::-;31226:102;;31345:3;31338:10;;30919:435;;;;;:::o;31360:225::-;31500:34;31496:1;31488:6;31484:14;31477:58;31569:8;31564:2;31556:6;31552:15;31545:33;31360:225;:::o;31591:366::-;31733:3;31754:67;31818:2;31813:3;31754:67;:::i;:::-;31747:74;;31830:93;31919:3;31830:93;:::i;:::-;31948:2;31943:3;31939:12;31932:19;;31591:366;;;:::o;31963:419::-;32129:4;32167:2;32156:9;32152:18;32144:26;;32216:9;32210:4;32206:20;32202:1;32191:9;32187:17;32180:47;32244:131;32370:4;32244:131;:::i;:::-;32236:139;;31963:419;;;:::o;32388:182::-;32528:34;32524:1;32516:6;32512:14;32505:58;32388:182;:::o;32576:366::-;32718:3;32739:67;32803:2;32798:3;32739:67;:::i;:::-;32732:74;;32815:93;32904:3;32815:93;:::i;:::-;32933:2;32928:3;32924:12;32917:19;;32576:366;;;:::o;32948:419::-;33114:4;33152:2;33141:9;33137:18;33129:26;;33201:9;33195:4;33191:20;33187:1;33176:9;33172:17;33165:47;33229:131;33355:4;33229:131;:::i;:::-;33221:139;;32948:419;;;:::o;33373:94::-;33406:8;33454:5;33450:2;33446:14;33425:35;;33373:94;;;:::o;33473:::-;33512:7;33541:20;33555:5;33541:20;:::i;:::-;33530:31;;33473:94;;;:::o;33573:100::-;33612:7;33641:26;33661:5;33641:26;:::i;:::-;33630:37;;33573:100;;;:::o;33679:157::-;33784:45;33804:24;33822:5;33804:24;:::i;:::-;33784:45;:::i;:::-;33779:3;33772:58;33679:157;;:::o;33842:256::-;33954:3;33969:75;34040:3;34031:6;33969:75;:::i;:::-;34069:2;34064:3;34060:12;34053:19;;34089:3;34082:10;;33842:256;;;;:::o;34104:147::-;34205:11;34242:3;34227:18;;34104:147;;;;:::o;34257:114::-;;:::o;34377:398::-;34536:3;34557:83;34638:1;34633:3;34557:83;:::i;:::-;34550:90;;34649:93;34738:3;34649:93;:::i;:::-;34767:1;34762:3;34758:11;34751:18;;34377:398;;;:::o;34781:379::-;34965:3;34987:147;35130:3;34987:147;:::i;:::-;34980:154;;35151:3;35144:10;;34781:379;;;:::o;35166:166::-;35306:18;35302:1;35294:6;35290:14;35283:42;35166:166;:::o;35338:366::-;35480:3;35501:67;35565:2;35560:3;35501:67;:::i;:::-;35494:74;;35577:93;35666:3;35577:93;:::i;:::-;35695:2;35690:3;35686:12;35679:19;;35338:366;;;:::o;35710:419::-;35876:4;35914:2;35903:9;35899:18;35891:26;;35963:9;35957:4;35953:20;35949:1;35938:9;35934:17;35927:47;35991:131;36117:4;35991:131;:::i;:::-;35983:139;;35710:419;;;:::o;36135:98::-;36186:6;36220:5;36214:12;36204:22;;36135:98;;;:::o;36239:168::-;36322:11;36356:6;36351:3;36344:19;36396:4;36391:3;36387:14;36372:29;;36239:168;;;;:::o;36413:373::-;36499:3;36527:38;36559:5;36527:38;:::i;:::-;36581:70;36644:6;36639:3;36581:70;:::i;:::-;36574:77;;36660:65;36718:6;36713:3;36706:4;36699:5;36695:16;36660:65;:::i;:::-;36750:29;36772:6;36750:29;:::i;:::-;36745:3;36741:39;36734:46;;36503:283;36413:373;;;;:::o;36792:640::-;36987:4;37025:3;37014:9;37010:19;37002:27;;37039:71;37107:1;37096:9;37092:17;37083:6;37039:71;:::i;:::-;37120:72;37188:2;37177:9;37173:18;37164:6;37120:72;:::i;:::-;37202;37270:2;37259:9;37255:18;37246:6;37202:72;:::i;:::-;37321:9;37315:4;37311:20;37306:2;37295:9;37291:18;37284:48;37349:76;37420:4;37411:6;37349:76;:::i;:::-;37341:84;;36792:640;;;;;;;:::o;37438:141::-;37494:5;37525:6;37519:13;37510:22;;37541:32;37567:5;37541:32;:::i;:::-;37438:141;;;;:::o;37585:349::-;37654:6;37703:2;37691:9;37682:7;37678:23;37674:32;37671:119;;;37709:79;;:::i;:::-;37671:119;37829:1;37854:63;37909:7;37900:6;37889:9;37885:22;37854:63;:::i;:::-;37844:73;;37800:127;37585:349;;;;:::o;37940:180::-;37988:77;37985:1;37978:88;38085:4;38082:1;38075:15;38109:4;38106:1;38099:15;38126:185;38166:1;38183:20;38201:1;38183:20;:::i;:::-;38178:25;;38217:20;38235:1;38217:20;:::i;:::-;38212:25;;38256:1;38246:35;;38261:18;;:::i;:::-;38246:35;38303:1;38300;38296:9;38291:14;;38126:185;;;;:::o;38317:194::-;38357:4;38377:20;38395:1;38377:20;:::i;:::-;38372:25;;38411:20;38429:1;38411:20;:::i;:::-;38406:25;;38455:1;38452;38448:9;38440:17;;38479:1;38473:4;38470:11;38467:37;;;38484:18;;:::i;:::-;38467:37;38317:194;;;;:::o;38517:176::-;38549:1;38566:20;38584:1;38566:20;:::i;:::-;38561:25;;38600:20;38618:1;38600:20;:::i;:::-;38595:25;;38639:1;38629:35;;38644:18;;:::i;:::-;38629:35;38685:1;38682;38678:9;38673:14;;38517:176;;;;:::o
Swarm Source
ipfs://acb5d09468f0a7a9e69310578e1a474e9e2f4fefe715263bd45057791585c190
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.