Feature Tip: Add private address tag to any address under My Name Tag !
Overview
TokenID
1196
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CatBloxTBT
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-13 */ // 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: TBT.sol //SPDX-License-Identifier: Unlicense pragma solidity ^0.8.0; contract CatBloxTBT is ERC721, Ownable { using Counters for Counters.Counter; using Strings for uint256; Counters.Counter private tokenCounter; string public baseURI; string public provenanceHash; bool public isClaimingActive; bytes32 public claimListMerkleRoot; uint256 public immutable maxTokens; mapping(address => uint256) public claimListMintCounts; // ============ ACCESS CONTROL/SANITY MODIFIERS ============ modifier claimListActive() { require(isClaimingActive, "Claim list not active"); _; } modifier totalNotExceeded(uint256 numberOfTokens) { require( tokenCounter.current() + numberOfTokens <= maxTokens, "Not enough tokens remaining to claim" ); _; } modifier isValidMerkleProof(bytes32[] calldata merkleProof, bytes32 root, uint256 maxClaimable) { require( MerkleProof.verify( merkleProof, root, keccak256(abi.encodePacked(msg.sender, maxClaimable)) ), "Proof does not exist in tree" ); _; } constructor(string memory _baseURI, uint256 _maxTokens) ERC721("CatBloxTBT", "CBLXTBT") { baseURI = _baseURI; maxTokens = _maxTokens; } // ============ PUBLIC FUNCTION FOR CLAIMING ============ function claim( uint256 numberOfTokens, uint256 maxClaimable, bytes32[] calldata merkleProof ) external claimListActive totalNotExceeded(numberOfTokens) isValidMerkleProof(merkleProof, claimListMerkleRoot, maxClaimable) { uint256 numAlreadyMinted = claimListMintCounts[msg.sender]; require(numAlreadyMinted + numberOfTokens <= maxClaimable, "Exceeds max claimable"); claimListMintCounts[msg.sender] = numAlreadyMinted + numberOfTokens; for (uint256 i = 0; i < numberOfTokens; i++) { _safeMint(msg.sender, nextTokenId()); } } // ============ PUBLIC READ-ONLY FUNCTIONS ============ function totalSupply() external view returns (uint256) { return tokenCounter.current(); } // ============ OWNER-ONLY ADMIN FUNCTIONS ============ function setBaseURI(string memory _baseURI) external onlyOwner { baseURI = _baseURI; } function setProvenanceHash(string memory _hash) external onlyOwner { provenanceHash = _hash; } // Toggle Claiming Active / Inactive function setClaimingActive(bool _isClaimingActive) external onlyOwner { isClaimingActive = _isClaimingActive; } // Set Merkle Roots function setClaimListMerkleRoot(bytes32 _merkleRoot) external onlyOwner { claimListMerkleRoot = _merkleRoot; } // ============ SUPPORTING FUNCTIONS ============ function nextTokenId() private returns (uint256) { tokenCounter.increment(); return tokenCounter.current(); } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "Nonexistent token"); return string(abi.encodePacked(baseURI, tokenId.toString())); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"},{"internalType":"uint256","name":"_maxTokens","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"uint256","name":"maxClaimable","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimListMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimListMintCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isClaimingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenanceHash","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setClaimListMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isClaimingActive","type":"bool"}],"name":"setClaimingActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b5060405162003bdd38038062003bdd833981810160405281019062000037919062000333565b6040518060400160405280600a81526020017f436174426c6f78544254000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f43424c58544254000000000000000000000000000000000000000000000000008152508160009080519060200190620000bb929190620001ee565b508060019080519060200190620000d4929190620001ee565b505050620000f7620000eb6200012060201b60201c565b6200012860201b60201c565b81600890805190602001906200010f929190620001ee565b508060808181525050505062000541565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001fc9062000438565b90600052602060002090601f0160209004810192826200022057600085556200026c565b82601f106200023b57805160ff19168380011785556200026c565b828001600101855582156200026c579182015b828111156200026b5782518255916020019190600101906200024e565b5b5090506200027b91906200027f565b5090565b5b808211156200029a57600081600090555060010162000280565b5090565b6000620002b5620002af84620003c2565b62000399565b905082815260208101848484011115620002d457620002d362000507565b5b620002e184828562000402565b509392505050565b600082601f83011262000301576200030062000502565b5b8151620003138482602086016200029e565b91505092915050565b6000815190506200032d8162000527565b92915050565b600080604083850312156200034d576200034c62000511565b5b600083015167ffffffffffffffff8111156200036e576200036d6200050c565b5b6200037c85828601620002e9565b92505060206200038f858286016200031c565b9150509250929050565b6000620003a5620003b8565b9050620003b382826200046e565b919050565b6000604051905090565b600067ffffffffffffffff821115620003e057620003df620004d3565b5b620003eb8262000516565b9050602081019050919050565b6000819050919050565b60005b838110156200042257808201518184015260208101905062000405565b8381111562000432576000848401525b50505050565b600060028204905060018216806200045157607f821691505b60208210811415620004685762000467620004a4565b5b50919050565b620004798262000516565b810181811067ffffffffffffffff821117156200049b576200049a620004d3565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6200053281620003f8565b81146200053e57600080fd5b50565b6080516136796200056460003960008181610c8c015261105d01526136796000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80636c0360eb116100f9578063b88d4fde11610097578063c87b56dd11610071578063c87b56dd146104cb578063e8315742146104fb578063e985e9c514610519578063f2fde38b14610549576101c4565b8063b88d4fde14610461578063c503b18a1461047d578063c6ab67a3146104ad576101c4565b80638da5cb5b116100d35780638da5cb5b146103ed57806395d89b411461040b578063a22cb46514610429578063ae0b51df14610445576101c4565b80636c0360eb1461039557806370a08231146103b3578063715018a6146103e3576101c4565b806323b872dd116101665780633732ad1c116101405780633732ad1c1461030f57806342842e0e1461032d57806355f804b3146103495780636352211e14610365576101c4565b806323b872dd146102b957806330ea4199146102d5578063326f9ad3146102f1576101c4565b8063095ea7b3116101a2578063095ea7b314610247578063109695231461026357806315bdebe21461027f57806318160ddd1461029b576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036038101906101de919061245c565b610565565b6040516101f09190612a59565b60405180910390f35b610201610647565b60405161020e9190612a8f565b60405180910390f35b610231600480360381019061022c91906124ff565b6106d9565b60405161023e91906129f2565b60405180910390f35b610261600480360381019061025c91906123c2565b61071f565b005b61027d600480360381019061027891906124b6565b610837565b005b6102996004803603810190610294919061242f565b610859565b005b6102a361086b565b6040516102b09190612cf1565b60405180910390f35b6102d360048036038101906102ce91906122ac565b61087c565b005b6102ef60048036038101906102ea9190612402565b6108dc565b005b6102f9610901565b6040516103069190612a74565b60405180910390f35b610317610907565b6040516103249190612a59565b60405180910390f35b610347600480360381019061034291906122ac565b61091a565b005b610363600480360381019061035e91906124b6565b61093a565b005b61037f600480360381019061037a91906124ff565b61095c565b60405161038c91906129f2565b60405180910390f35b61039d610a0e565b6040516103aa9190612a8f565b60405180910390f35b6103cd60048036038101906103c8919061223f565b610a9c565b6040516103da9190612cf1565b60405180910390f35b6103eb610b54565b005b6103f5610b68565b60405161040291906129f2565b60405180910390f35b610413610b92565b6040516104209190612a8f565b60405180910390f35b610443600480360381019061043e9190612382565b610c24565b005b61045f600480360381019061045a919061252c565b610c3a565b005b61047b600480360381019061047691906122ff565b610ed7565b005b6104976004803603810190610492919061223f565b610f39565b6040516104a49190612cf1565b60405180910390f35b6104b5610f51565b6040516104c29190612a8f565b60405180910390f35b6104e560048036038101906104e091906124ff565b610fdf565b6040516104f29190612a8f565b60405180910390f35b61050361105b565b6040516105109190612cf1565b60405180910390f35b610533600480360381019061052e919061226c565b61107f565b6040516105409190612a59565b60405180910390f35b610563600480360381019061055e919061223f565b611113565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061063057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610640575061063f82611197565b5b9050919050565b60606000805461065690612f66565b80601f016020809104026020016040519081016040528092919081815260200182805461068290612f66565b80156106cf5780601f106106a4576101008083540402835291602001916106cf565b820191906000526020600020905b8154815290600101906020018083116106b257829003601f168201915b5050505050905090565b60006106e482611201565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061072a8261095c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561079b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290612c71565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107ba61124c565b73ffffffffffffffffffffffffffffffffffffffff1614806107e957506107e8816107e361124c565b61107f565b5b610828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081f90612bf1565b60405180910390fd5b6108328383611254565b505050565b61083f61130d565b8060099080519060200190610855929190611fe8565b5050565b61086161130d565b80600b8190555050565b6000610877600761138b565b905090565b61088d61088761124c565b82611399565b6108cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c390612cb1565b60405180910390fd5b6108d783838361142e565b505050565b6108e461130d565b80600a60006101000a81548160ff02191690831515021790555050565b600b5481565b600a60009054906101000a900460ff1681565b61093583838360405180602001604052806000815250610ed7565b505050565b61094261130d565b8060089080519060200190610958929190611fe8565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610a05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fc90612c51565b60405180910390fd5b80915050919050565b60088054610a1b90612f66565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4790612f66565b8015610a945780601f10610a6957610100808354040283529160200191610a94565b820191906000526020600020905b815481529060010190602001808311610a7757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0490612bb1565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b5c61130d565b610b666000611695565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610ba190612f66565b80601f0160208091040260200160405190810160405280929190818152602001828054610bcd90612f66565b8015610c1a5780601f10610bef57610100808354040283529160200191610c1a565b820191906000526020600020905b815481529060010190602001808311610bfd57829003601f168201915b5050505050905090565b610c36610c2f61124c565b838361175b565b5050565b600a60009054906101000a900460ff16610c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8090612cd1565b60405180910390fd5b837f000000000000000000000000000000000000000000000000000000000000000081610cb6600761138b565b610cc09190612deb565b1115610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf890612b31565b60405180910390fd5b8282600b5486610d7b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050833384604051602001610d609291906129a2565b604051602081830303815290604052805190602001206118c8565b610dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db190612b91565b60405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050888a82610e0b9190612deb565b1115610e4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4390612c91565b60405180910390fd5b8981610e589190612deb565b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b8a811015610eca57610eb733610eb26118df565b6118fa565b8080610ec290612fc9565b915050610e9e565b5050505050505050505050565b610ee8610ee261124c565b83611399565b610f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1e90612cb1565b60405180910390fd5b610f3384848484611918565b50505050565b600c6020528060005260406000206000915090505481565b60098054610f5e90612f66565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8a90612f66565b8015610fd75780601f10610fac57610100808354040283529160200191610fd7565b820191906000526020600020905b815481529060010190602001808311610fba57829003601f168201915b505050505081565b6060610fea82611974565b611029576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102090612bd1565b60405180910390fd5b6008611034836119e0565b6040516020016110459291906129ce565b6040516020818303038152906040529050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61111b61130d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561118b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118290612ad1565b60405180910390fd5b61119481611695565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61120a81611974565b611249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124090612c51565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166112c78361095c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61131561124c565b73ffffffffffffffffffffffffffffffffffffffff16611333610b68565b73ffffffffffffffffffffffffffffffffffffffff1614611389576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138090612c31565b60405180910390fd5b565b600081600001549050919050565b6000806113a58361095c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806113e757506113e6818561107f565b5b8061142557508373ffffffffffffffffffffffffffffffffffffffff1661140d846106d9565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661144e8261095c565b73ffffffffffffffffffffffffffffffffffffffff16146114a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149b90612af1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150b90612b51565b60405180910390fd5b61151f838383611b41565b61152a600082611254565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461157a9190612e72565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115d19190612deb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611690838383611b46565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156117ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c190612b71565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118bb9190612a59565b60405180910390a3505050565b6000826118d58584611b4b565b1490509392505050565b60006118eb6007611ba1565b6118f5600761138b565b905090565b611914828260405180602001604052806000815250611bb7565b5050565b61192384848461142e565b61192f84848484611c12565b61196e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196590612ab1565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60606000821415611a28576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611b3c565b600082905060005b60008214611a5a578080611a4390612fc9565b915050600a82611a539190612e41565b9150611a30565b60008167ffffffffffffffff811115611a7657611a7561312d565b5b6040519080825280601f01601f191660200182016040528015611aa85781602001600182028036833780820191505090505b5090505b60008514611b3557600182611ac19190612e72565b9150600a85611ad09190613040565b6030611adc9190612deb565b60f81b818381518110611af257611af16130fe565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611b2e9190612e41565b9450611aac565b8093505050505b919050565b505050565b505050565b60008082905060005b8451811015611b9657611b8182868381518110611b7457611b736130fe565b5b6020026020010151611da9565b91508080611b8e90612fc9565b915050611b54565b508091505092915050565b6001816000016000828254019250508190555050565b611bc18383611dd4565b611bce6000848484611c12565b611c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0490612ab1565b60405180910390fd5b505050565b6000611c338473ffffffffffffffffffffffffffffffffffffffff16611fae565b15611d9c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611c5c61124c565b8786866040518563ffffffff1660e01b8152600401611c7e9493929190612a0d565b602060405180830381600087803b158015611c9857600080fd5b505af1925050508015611cc957506040513d601f19601f82011682018060405250810190611cc69190612489565b60015b611d4c573d8060008114611cf9576040519150601f19603f3d011682016040523d82523d6000602084013e611cfe565b606091505b50600081511415611d44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3b90612ab1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611da1565b600190505b949350505050565b6000818310611dc157611dbc8284611fd1565b611dcc565b611dcb8383611fd1565b5b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3b90612c11565b60405180910390fd5b611e4d81611974565b15611e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8490612b11565b60405180910390fd5b611e9960008383611b41565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ee99190612deb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611faa60008383611b46565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b828054611ff490612f66565b90600052602060002090601f016020900481019282612016576000855561205d565b82601f1061202f57805160ff191683800117855561205d565b8280016001018555821561205d579182015b8281111561205c578251825591602001919060010190612041565b5b50905061206a919061206e565b5090565b5b8082111561208757600081600090555060010161206f565b5090565b600061209e61209984612d31565b612d0c565b9050828152602081018484840111156120ba576120b961316b565b5b6120c5848285612f24565b509392505050565b60006120e06120db84612d62565b612d0c565b9050828152602081018484840111156120fc576120fb61316b565b5b612107848285612f24565b509392505050565b60008135905061211e816135d0565b92915050565b60008083601f84011261213a57612139613161565b5b8235905067ffffffffffffffff8111156121575761215661315c565b5b60208301915083602082028301111561217357612172613166565b5b9250929050565b600081359050612189816135e7565b92915050565b60008135905061219e816135fe565b92915050565b6000813590506121b381613615565b92915050565b6000815190506121c881613615565b92915050565b600082601f8301126121e3576121e2613161565b5b81356121f384826020860161208b565b91505092915050565b600082601f83011261221157612210613161565b5b81356122218482602086016120cd565b91505092915050565b6000813590506122398161362c565b92915050565b60006020828403121561225557612254613175565b5b60006122638482850161210f565b91505092915050565b6000806040838503121561228357612282613175565b5b60006122918582860161210f565b92505060206122a28582860161210f565b9150509250929050565b6000806000606084860312156122c5576122c4613175565b5b60006122d38682870161210f565b93505060206122e48682870161210f565b92505060406122f58682870161222a565b9150509250925092565b6000806000806080858703121561231957612318613175565b5b60006123278782880161210f565b94505060206123388782880161210f565b93505060406123498782880161222a565b925050606085013567ffffffffffffffff81111561236a57612369613170565b5b612376878288016121ce565b91505092959194509250565b6000806040838503121561239957612398613175565b5b60006123a78582860161210f565b92505060206123b88582860161217a565b9150509250929050565b600080604083850312156123d9576123d8613175565b5b60006123e78582860161210f565b92505060206123f88582860161222a565b9150509250929050565b60006020828403121561241857612417613175565b5b60006124268482850161217a565b91505092915050565b60006020828403121561244557612444613175565b5b60006124538482850161218f565b91505092915050565b60006020828403121561247257612471613175565b5b6000612480848285016121a4565b91505092915050565b60006020828403121561249f5761249e613175565b5b60006124ad848285016121b9565b91505092915050565b6000602082840312156124cc576124cb613175565b5b600082013567ffffffffffffffff8111156124ea576124e9613170565b5b6124f6848285016121fc565b91505092915050565b60006020828403121561251557612514613175565b5b60006125238482850161222a565b91505092915050565b6000806000806060858703121561254657612545613175565b5b60006125548782880161222a565b94505060206125658782880161222a565b935050604085013567ffffffffffffffff81111561258657612585613170565b5b61259287828801612124565b925092505092959194509250565b6125a981612ea6565b82525050565b6125c06125bb82612ea6565b613012565b82525050565b6125cf81612eb8565b82525050565b6125de81612ec4565b82525050565b60006125ef82612da8565b6125f98185612dbe565b9350612609818560208601612f33565b6126128161317a565b840191505092915050565b600061262882612db3565b6126328185612dcf565b9350612642818560208601612f33565b61264b8161317a565b840191505092915050565b600061266182612db3565b61266b8185612de0565b935061267b818560208601612f33565b80840191505092915050565b6000815461269481612f66565b61269e8186612de0565b945060018216600081146126b957600181146126ca576126fd565b60ff198316865281860193506126fd565b6126d385612d93565b60005b838110156126f5578154818901526001820191506020810190506126d6565b838801955050505b50505092915050565b6000612713603283612dcf565b915061271e82613198565b604082019050919050565b6000612736602683612dcf565b9150612741826131e7565b604082019050919050565b6000612759602583612dcf565b915061276482613236565b604082019050919050565b600061277c601c83612dcf565b915061278782613285565b602082019050919050565b600061279f602483612dcf565b91506127aa826132ae565b604082019050919050565b60006127c2602483612dcf565b91506127cd826132fd565b604082019050919050565b60006127e5601983612dcf565b91506127f08261334c565b602082019050919050565b6000612808601c83612dcf565b915061281382613375565b602082019050919050565b600061282b602983612dcf565b91506128368261339e565b604082019050919050565b600061284e601183612dcf565b9150612859826133ed565b602082019050919050565b6000612871603e83612dcf565b915061287c82613416565b604082019050919050565b6000612894602083612dcf565b915061289f82613465565b602082019050919050565b60006128b7602083612dcf565b91506128c28261348e565b602082019050919050565b60006128da601883612dcf565b91506128e5826134b7565b602082019050919050565b60006128fd602183612dcf565b9150612908826134e0565b604082019050919050565b6000612920601583612dcf565b915061292b8261352f565b602082019050919050565b6000612943602e83612dcf565b915061294e82613558565b604082019050919050565b6000612966601583612dcf565b9150612971826135a7565b602082019050919050565b61298581612f1a565b82525050565b61299c61299782612f1a565b613036565b82525050565b60006129ae82856125af565b6014820191506129be828461298b565b6020820191508190509392505050565b60006129da8285612687565b91506129e68284612656565b91508190509392505050565b6000602082019050612a0760008301846125a0565b92915050565b6000608082019050612a2260008301876125a0565b612a2f60208301866125a0565b612a3c604083018561297c565b8181036060830152612a4e81846125e4565b905095945050505050565b6000602082019050612a6e60008301846125c6565b92915050565b6000602082019050612a8960008301846125d5565b92915050565b60006020820190508181036000830152612aa9818461261d565b905092915050565b60006020820190508181036000830152612aca81612706565b9050919050565b60006020820190508181036000830152612aea81612729565b9050919050565b60006020820190508181036000830152612b0a8161274c565b9050919050565b60006020820190508181036000830152612b2a8161276f565b9050919050565b60006020820190508181036000830152612b4a81612792565b9050919050565b60006020820190508181036000830152612b6a816127b5565b9050919050565b60006020820190508181036000830152612b8a816127d8565b9050919050565b60006020820190508181036000830152612baa816127fb565b9050919050565b60006020820190508181036000830152612bca8161281e565b9050919050565b60006020820190508181036000830152612bea81612841565b9050919050565b60006020820190508181036000830152612c0a81612864565b9050919050565b60006020820190508181036000830152612c2a81612887565b9050919050565b60006020820190508181036000830152612c4a816128aa565b9050919050565b60006020820190508181036000830152612c6a816128cd565b9050919050565b60006020820190508181036000830152612c8a816128f0565b9050919050565b60006020820190508181036000830152612caa81612913565b9050919050565b60006020820190508181036000830152612cca81612936565b9050919050565b60006020820190508181036000830152612cea81612959565b9050919050565b6000602082019050612d06600083018461297c565b92915050565b6000612d16612d27565b9050612d228282612f98565b919050565b6000604051905090565b600067ffffffffffffffff821115612d4c57612d4b61312d565b5b612d558261317a565b9050602081019050919050565b600067ffffffffffffffff821115612d7d57612d7c61312d565b5b612d868261317a565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612df682612f1a565b9150612e0183612f1a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e3657612e35613071565b5b828201905092915050565b6000612e4c82612f1a565b9150612e5783612f1a565b925082612e6757612e666130a0565b5b828204905092915050565b6000612e7d82612f1a565b9150612e8883612f1a565b925082821015612e9b57612e9a613071565b5b828203905092915050565b6000612eb182612efa565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612f51578082015181840152602081019050612f36565b83811115612f60576000848401525b50505050565b60006002820490506001821680612f7e57607f821691505b60208210811415612f9257612f916130cf565b5b50919050565b612fa18261317a565b810181811067ffffffffffffffff82111715612fc057612fbf61312d565b5b80604052505050565b6000612fd482612f1a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561300757613006613071565b5b600182019050919050565b600061301d82613024565b9050919050565b600061302f8261318b565b9050919050565b6000819050919050565b600061304b82612f1a565b915061305683612f1a565b925082613066576130656130a0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e6f7420656e6f75676820746f6b656e732072656d61696e696e6720746f206360008201527f6c61696d00000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f50726f6f6620646f6573206e6f7420657869737420696e207472656500000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d617820636c61696d61626c650000000000000000000000600082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f436c61696d206c697374206e6f74206163746976650000000000000000000000600082015250565b6135d981612ea6565b81146135e457600080fd5b50565b6135f081612eb8565b81146135fb57600080fd5b50565b61360781612ec4565b811461361257600080fd5b50565b61361e81612ece565b811461362957600080fd5b50565b61363581612f1a565b811461364057600080fd5b5056fea26469706673582212201693ff715ac00a5f6183acc168a2c5748cfa9769be7aa3f79d74e873121b1af064736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000004768747470733a2f2f75732d63656e7472616c312d636174626c6f782d31663465352e636c6f756466756e6374696f6e732e6e65742f6170692f7462742d70726572657665616c2f00000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101c45760003560e01c80636c0360eb116100f9578063b88d4fde11610097578063c87b56dd11610071578063c87b56dd146104cb578063e8315742146104fb578063e985e9c514610519578063f2fde38b14610549576101c4565b8063b88d4fde14610461578063c503b18a1461047d578063c6ab67a3146104ad576101c4565b80638da5cb5b116100d35780638da5cb5b146103ed57806395d89b411461040b578063a22cb46514610429578063ae0b51df14610445576101c4565b80636c0360eb1461039557806370a08231146103b3578063715018a6146103e3576101c4565b806323b872dd116101665780633732ad1c116101405780633732ad1c1461030f57806342842e0e1461032d57806355f804b3146103495780636352211e14610365576101c4565b806323b872dd146102b957806330ea4199146102d5578063326f9ad3146102f1576101c4565b8063095ea7b3116101a2578063095ea7b314610247578063109695231461026357806315bdebe21461027f57806318160ddd1461029b576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036038101906101de919061245c565b610565565b6040516101f09190612a59565b60405180910390f35b610201610647565b60405161020e9190612a8f565b60405180910390f35b610231600480360381019061022c91906124ff565b6106d9565b60405161023e91906129f2565b60405180910390f35b610261600480360381019061025c91906123c2565b61071f565b005b61027d600480360381019061027891906124b6565b610837565b005b6102996004803603810190610294919061242f565b610859565b005b6102a361086b565b6040516102b09190612cf1565b60405180910390f35b6102d360048036038101906102ce91906122ac565b61087c565b005b6102ef60048036038101906102ea9190612402565b6108dc565b005b6102f9610901565b6040516103069190612a74565b60405180910390f35b610317610907565b6040516103249190612a59565b60405180910390f35b610347600480360381019061034291906122ac565b61091a565b005b610363600480360381019061035e91906124b6565b61093a565b005b61037f600480360381019061037a91906124ff565b61095c565b60405161038c91906129f2565b60405180910390f35b61039d610a0e565b6040516103aa9190612a8f565b60405180910390f35b6103cd60048036038101906103c8919061223f565b610a9c565b6040516103da9190612cf1565b60405180910390f35b6103eb610b54565b005b6103f5610b68565b60405161040291906129f2565b60405180910390f35b610413610b92565b6040516104209190612a8f565b60405180910390f35b610443600480360381019061043e9190612382565b610c24565b005b61045f600480360381019061045a919061252c565b610c3a565b005b61047b600480360381019061047691906122ff565b610ed7565b005b6104976004803603810190610492919061223f565b610f39565b6040516104a49190612cf1565b60405180910390f35b6104b5610f51565b6040516104c29190612a8f565b60405180910390f35b6104e560048036038101906104e091906124ff565b610fdf565b6040516104f29190612a8f565b60405180910390f35b61050361105b565b6040516105109190612cf1565b60405180910390f35b610533600480360381019061052e919061226c565b61107f565b6040516105409190612a59565b60405180910390f35b610563600480360381019061055e919061223f565b611113565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061063057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610640575061063f82611197565b5b9050919050565b60606000805461065690612f66565b80601f016020809104026020016040519081016040528092919081815260200182805461068290612f66565b80156106cf5780601f106106a4576101008083540402835291602001916106cf565b820191906000526020600020905b8154815290600101906020018083116106b257829003601f168201915b5050505050905090565b60006106e482611201565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061072a8261095c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561079b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290612c71565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107ba61124c565b73ffffffffffffffffffffffffffffffffffffffff1614806107e957506107e8816107e361124c565b61107f565b5b610828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081f90612bf1565b60405180910390fd5b6108328383611254565b505050565b61083f61130d565b8060099080519060200190610855929190611fe8565b5050565b61086161130d565b80600b8190555050565b6000610877600761138b565b905090565b61088d61088761124c565b82611399565b6108cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c390612cb1565b60405180910390fd5b6108d783838361142e565b505050565b6108e461130d565b80600a60006101000a81548160ff02191690831515021790555050565b600b5481565b600a60009054906101000a900460ff1681565b61093583838360405180602001604052806000815250610ed7565b505050565b61094261130d565b8060089080519060200190610958929190611fe8565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610a05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fc90612c51565b60405180910390fd5b80915050919050565b60088054610a1b90612f66565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4790612f66565b8015610a945780601f10610a6957610100808354040283529160200191610a94565b820191906000526020600020905b815481529060010190602001808311610a7757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0490612bb1565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b5c61130d565b610b666000611695565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610ba190612f66565b80601f0160208091040260200160405190810160405280929190818152602001828054610bcd90612f66565b8015610c1a5780601f10610bef57610100808354040283529160200191610c1a565b820191906000526020600020905b815481529060010190602001808311610bfd57829003601f168201915b5050505050905090565b610c36610c2f61124c565b838361175b565b5050565b600a60009054906101000a900460ff16610c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8090612cd1565b60405180910390fd5b837f000000000000000000000000000000000000000000000000000000000000190081610cb6600761138b565b610cc09190612deb565b1115610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf890612b31565b60405180910390fd5b8282600b5486610d7b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050833384604051602001610d609291906129a2565b604051602081830303815290604052805190602001206118c8565b610dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db190612b91565b60405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050888a82610e0b9190612deb565b1115610e4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4390612c91565b60405180910390fd5b8981610e589190612deb565b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b8a811015610eca57610eb733610eb26118df565b6118fa565b8080610ec290612fc9565b915050610e9e565b5050505050505050505050565b610ee8610ee261124c565b83611399565b610f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1e90612cb1565b60405180910390fd5b610f3384848484611918565b50505050565b600c6020528060005260406000206000915090505481565b60098054610f5e90612f66565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8a90612f66565b8015610fd75780601f10610fac57610100808354040283529160200191610fd7565b820191906000526020600020905b815481529060010190602001808311610fba57829003601f168201915b505050505081565b6060610fea82611974565b611029576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102090612bd1565b60405180910390fd5b6008611034836119e0565b6040516020016110459291906129ce565b6040516020818303038152906040529050919050565b7f000000000000000000000000000000000000000000000000000000000000190081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61111b61130d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561118b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118290612ad1565b60405180910390fd5b61119481611695565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61120a81611974565b611249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124090612c51565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166112c78361095c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61131561124c565b73ffffffffffffffffffffffffffffffffffffffff16611333610b68565b73ffffffffffffffffffffffffffffffffffffffff1614611389576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138090612c31565b60405180910390fd5b565b600081600001549050919050565b6000806113a58361095c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806113e757506113e6818561107f565b5b8061142557508373ffffffffffffffffffffffffffffffffffffffff1661140d846106d9565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661144e8261095c565b73ffffffffffffffffffffffffffffffffffffffff16146114a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149b90612af1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150b90612b51565b60405180910390fd5b61151f838383611b41565b61152a600082611254565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461157a9190612e72565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115d19190612deb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611690838383611b46565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156117ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c190612b71565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118bb9190612a59565b60405180910390a3505050565b6000826118d58584611b4b565b1490509392505050565b60006118eb6007611ba1565b6118f5600761138b565b905090565b611914828260405180602001604052806000815250611bb7565b5050565b61192384848461142e565b61192f84848484611c12565b61196e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196590612ab1565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60606000821415611a28576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611b3c565b600082905060005b60008214611a5a578080611a4390612fc9565b915050600a82611a539190612e41565b9150611a30565b60008167ffffffffffffffff811115611a7657611a7561312d565b5b6040519080825280601f01601f191660200182016040528015611aa85781602001600182028036833780820191505090505b5090505b60008514611b3557600182611ac19190612e72565b9150600a85611ad09190613040565b6030611adc9190612deb565b60f81b818381518110611af257611af16130fe565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611b2e9190612e41565b9450611aac565b8093505050505b919050565b505050565b505050565b60008082905060005b8451811015611b9657611b8182868381518110611b7457611b736130fe565b5b6020026020010151611da9565b91508080611b8e90612fc9565b915050611b54565b508091505092915050565b6001816000016000828254019250508190555050565b611bc18383611dd4565b611bce6000848484611c12565b611c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0490612ab1565b60405180910390fd5b505050565b6000611c338473ffffffffffffffffffffffffffffffffffffffff16611fae565b15611d9c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611c5c61124c565b8786866040518563ffffffff1660e01b8152600401611c7e9493929190612a0d565b602060405180830381600087803b158015611c9857600080fd5b505af1925050508015611cc957506040513d601f19601f82011682018060405250810190611cc69190612489565b60015b611d4c573d8060008114611cf9576040519150601f19603f3d011682016040523d82523d6000602084013e611cfe565b606091505b50600081511415611d44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3b90612ab1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611da1565b600190505b949350505050565b6000818310611dc157611dbc8284611fd1565b611dcc565b611dcb8383611fd1565b5b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3b90612c11565b60405180910390fd5b611e4d81611974565b15611e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8490612b11565b60405180910390fd5b611e9960008383611b41565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ee99190612deb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611faa60008383611b46565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b828054611ff490612f66565b90600052602060002090601f016020900481019282612016576000855561205d565b82601f1061202f57805160ff191683800117855561205d565b8280016001018555821561205d579182015b8281111561205c578251825591602001919060010190612041565b5b50905061206a919061206e565b5090565b5b8082111561208757600081600090555060010161206f565b5090565b600061209e61209984612d31565b612d0c565b9050828152602081018484840111156120ba576120b961316b565b5b6120c5848285612f24565b509392505050565b60006120e06120db84612d62565b612d0c565b9050828152602081018484840111156120fc576120fb61316b565b5b612107848285612f24565b509392505050565b60008135905061211e816135d0565b92915050565b60008083601f84011261213a57612139613161565b5b8235905067ffffffffffffffff8111156121575761215661315c565b5b60208301915083602082028301111561217357612172613166565b5b9250929050565b600081359050612189816135e7565b92915050565b60008135905061219e816135fe565b92915050565b6000813590506121b381613615565b92915050565b6000815190506121c881613615565b92915050565b600082601f8301126121e3576121e2613161565b5b81356121f384826020860161208b565b91505092915050565b600082601f83011261221157612210613161565b5b81356122218482602086016120cd565b91505092915050565b6000813590506122398161362c565b92915050565b60006020828403121561225557612254613175565b5b60006122638482850161210f565b91505092915050565b6000806040838503121561228357612282613175565b5b60006122918582860161210f565b92505060206122a28582860161210f565b9150509250929050565b6000806000606084860312156122c5576122c4613175565b5b60006122d38682870161210f565b93505060206122e48682870161210f565b92505060406122f58682870161222a565b9150509250925092565b6000806000806080858703121561231957612318613175565b5b60006123278782880161210f565b94505060206123388782880161210f565b93505060406123498782880161222a565b925050606085013567ffffffffffffffff81111561236a57612369613170565b5b612376878288016121ce565b91505092959194509250565b6000806040838503121561239957612398613175565b5b60006123a78582860161210f565b92505060206123b88582860161217a565b9150509250929050565b600080604083850312156123d9576123d8613175565b5b60006123e78582860161210f565b92505060206123f88582860161222a565b9150509250929050565b60006020828403121561241857612417613175565b5b60006124268482850161217a565b91505092915050565b60006020828403121561244557612444613175565b5b60006124538482850161218f565b91505092915050565b60006020828403121561247257612471613175565b5b6000612480848285016121a4565b91505092915050565b60006020828403121561249f5761249e613175565b5b60006124ad848285016121b9565b91505092915050565b6000602082840312156124cc576124cb613175565b5b600082013567ffffffffffffffff8111156124ea576124e9613170565b5b6124f6848285016121fc565b91505092915050565b60006020828403121561251557612514613175565b5b60006125238482850161222a565b91505092915050565b6000806000806060858703121561254657612545613175565b5b60006125548782880161222a565b94505060206125658782880161222a565b935050604085013567ffffffffffffffff81111561258657612585613170565b5b61259287828801612124565b925092505092959194509250565b6125a981612ea6565b82525050565b6125c06125bb82612ea6565b613012565b82525050565b6125cf81612eb8565b82525050565b6125de81612ec4565b82525050565b60006125ef82612da8565b6125f98185612dbe565b9350612609818560208601612f33565b6126128161317a565b840191505092915050565b600061262882612db3565b6126328185612dcf565b9350612642818560208601612f33565b61264b8161317a565b840191505092915050565b600061266182612db3565b61266b8185612de0565b935061267b818560208601612f33565b80840191505092915050565b6000815461269481612f66565b61269e8186612de0565b945060018216600081146126b957600181146126ca576126fd565b60ff198316865281860193506126fd565b6126d385612d93565b60005b838110156126f5578154818901526001820191506020810190506126d6565b838801955050505b50505092915050565b6000612713603283612dcf565b915061271e82613198565b604082019050919050565b6000612736602683612dcf565b9150612741826131e7565b604082019050919050565b6000612759602583612dcf565b915061276482613236565b604082019050919050565b600061277c601c83612dcf565b915061278782613285565b602082019050919050565b600061279f602483612dcf565b91506127aa826132ae565b604082019050919050565b60006127c2602483612dcf565b91506127cd826132fd565b604082019050919050565b60006127e5601983612dcf565b91506127f08261334c565b602082019050919050565b6000612808601c83612dcf565b915061281382613375565b602082019050919050565b600061282b602983612dcf565b91506128368261339e565b604082019050919050565b600061284e601183612dcf565b9150612859826133ed565b602082019050919050565b6000612871603e83612dcf565b915061287c82613416565b604082019050919050565b6000612894602083612dcf565b915061289f82613465565b602082019050919050565b60006128b7602083612dcf565b91506128c28261348e565b602082019050919050565b60006128da601883612dcf565b91506128e5826134b7565b602082019050919050565b60006128fd602183612dcf565b9150612908826134e0565b604082019050919050565b6000612920601583612dcf565b915061292b8261352f565b602082019050919050565b6000612943602e83612dcf565b915061294e82613558565b604082019050919050565b6000612966601583612dcf565b9150612971826135a7565b602082019050919050565b61298581612f1a565b82525050565b61299c61299782612f1a565b613036565b82525050565b60006129ae82856125af565b6014820191506129be828461298b565b6020820191508190509392505050565b60006129da8285612687565b91506129e68284612656565b91508190509392505050565b6000602082019050612a0760008301846125a0565b92915050565b6000608082019050612a2260008301876125a0565b612a2f60208301866125a0565b612a3c604083018561297c565b8181036060830152612a4e81846125e4565b905095945050505050565b6000602082019050612a6e60008301846125c6565b92915050565b6000602082019050612a8960008301846125d5565b92915050565b60006020820190508181036000830152612aa9818461261d565b905092915050565b60006020820190508181036000830152612aca81612706565b9050919050565b60006020820190508181036000830152612aea81612729565b9050919050565b60006020820190508181036000830152612b0a8161274c565b9050919050565b60006020820190508181036000830152612b2a8161276f565b9050919050565b60006020820190508181036000830152612b4a81612792565b9050919050565b60006020820190508181036000830152612b6a816127b5565b9050919050565b60006020820190508181036000830152612b8a816127d8565b9050919050565b60006020820190508181036000830152612baa816127fb565b9050919050565b60006020820190508181036000830152612bca8161281e565b9050919050565b60006020820190508181036000830152612bea81612841565b9050919050565b60006020820190508181036000830152612c0a81612864565b9050919050565b60006020820190508181036000830152612c2a81612887565b9050919050565b60006020820190508181036000830152612c4a816128aa565b9050919050565b60006020820190508181036000830152612c6a816128cd565b9050919050565b60006020820190508181036000830152612c8a816128f0565b9050919050565b60006020820190508181036000830152612caa81612913565b9050919050565b60006020820190508181036000830152612cca81612936565b9050919050565b60006020820190508181036000830152612cea81612959565b9050919050565b6000602082019050612d06600083018461297c565b92915050565b6000612d16612d27565b9050612d228282612f98565b919050565b6000604051905090565b600067ffffffffffffffff821115612d4c57612d4b61312d565b5b612d558261317a565b9050602081019050919050565b600067ffffffffffffffff821115612d7d57612d7c61312d565b5b612d868261317a565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612df682612f1a565b9150612e0183612f1a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e3657612e35613071565b5b828201905092915050565b6000612e4c82612f1a565b9150612e5783612f1a565b925082612e6757612e666130a0565b5b828204905092915050565b6000612e7d82612f1a565b9150612e8883612f1a565b925082821015612e9b57612e9a613071565b5b828203905092915050565b6000612eb182612efa565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612f51578082015181840152602081019050612f36565b83811115612f60576000848401525b50505050565b60006002820490506001821680612f7e57607f821691505b60208210811415612f9257612f916130cf565b5b50919050565b612fa18261317a565b810181811067ffffffffffffffff82111715612fc057612fbf61312d565b5b80604052505050565b6000612fd482612f1a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561300757613006613071565b5b600182019050919050565b600061301d82613024565b9050919050565b600061302f8261318b565b9050919050565b6000819050919050565b600061304b82612f1a565b915061305683612f1a565b925082613066576130656130a0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e6f7420656e6f75676820746f6b656e732072656d61696e696e6720746f206360008201527f6c61696d00000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f50726f6f6620646f6573206e6f7420657869737420696e207472656500000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d617820636c61696d61626c650000000000000000000000600082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f436c61696d206c697374206e6f74206163746976650000000000000000000000600082015250565b6135d981612ea6565b81146135e457600080fd5b50565b6135f081612eb8565b81146135fb57600080fd5b50565b61360781612ec4565b811461361257600080fd5b50565b61361e81612ece565b811461362957600080fd5b50565b61363581612f1a565b811461364057600080fd5b5056fea26469706673582212201693ff715ac00a5f6183acc168a2c5748cfa9769be7aa3f79d74e873121b1af064736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000004768747470733a2f2f75732d63656e7472616c312d636174626c6f782d31663465352e636c6f756466756e6374696f6e732e6e65742f6170692f7462742d70726572657665616c2f00000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _baseURI (string): https://us-central1-catblox-1f4e5.cloudfunctions.net/api/tbt-prereveal/
Arg [1] : _maxTokens (uint256): 6400
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000001900
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000047
Arg [3] : 68747470733a2f2f75732d63656e7472616c312d636174626c6f782d31663465
Arg [4] : 352e636c6f756466756e6374696f6e732e6e65742f6170692f7462742d707265
Arg [5] : 72657665616c2f00000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
48202:3438:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34927:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35854:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37367:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36884:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50645:108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50967:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50363:103;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38067:336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50806:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48468:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48433:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38474:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50537:100;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35565:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48370:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35296:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15463:103;;;:::i;:::-;;14815:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36023:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37610:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49630:662;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38730:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48554:54;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48398:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51359:276;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48511:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37836:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15721:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34927:305;35029:4;35081:25;35066:40;;;:11;:40;;;;:105;;;;35138:33;35123:48;;;:11;:48;;;;35066:105;:158;;;;35188:36;35212:11;35188:23;:36::i;:::-;35066:158;35046:178;;34927:305;;;:::o;35854:100::-;35908:13;35941:5;35934:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35854:100;:::o;37367:171::-;37443:7;37463:23;37478:7;37463:14;:23::i;:::-;37506:15;:24;37522:7;37506:24;;;;;;;;;;;;;;;;;;;;;37499:31;;37367:171;;;:::o;36884:417::-;36965:13;36981:23;36996:7;36981:14;:23::i;:::-;36965:39;;37029:5;37023:11;;:2;:11;;;;37015:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;37123:5;37107:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;37132:37;37149:5;37156:12;:10;:12::i;:::-;37132:16;:37::i;:::-;37107:62;37085:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;37272:21;37281:2;37285:7;37272:8;:21::i;:::-;36954:347;36884:417;;:::o;50645:108::-;14701:13;:11;:13::i;:::-;50740:5:::1;50723:14;:22;;;;;;;;;;;;:::i;:::-;;50645:108:::0;:::o;50967:124::-;14701:13;:11;:13::i;:::-;51072:11:::1;51050:19;:33;;;;50967:124:::0;:::o;50363:103::-;50409:7;50436:22;:12;:20;:22::i;:::-;50429:29;;50363:103;:::o;38067:336::-;38262:41;38281:12;:10;:12::i;:::-;38295:7;38262:18;:41::i;:::-;38254:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;38367:28;38377:4;38383:2;38387:7;38367:9;:28::i;:::-;38067:336;;;:::o;50806:125::-;14701:13;:11;:13::i;:::-;50906:17:::1;50887:16;;:36;;;;;;;;;;;;;;;;;;50806:125:::0;:::o;48468:34::-;;;;:::o;48433:28::-;;;;;;;;;;;;;:::o;38474:185::-;38612:39;38629:4;38635:2;38639:7;38612:39;;;;;;;;;;;;:16;:39::i;:::-;38474:185;;;:::o;50537:100::-;14701:13;:11;:13::i;:::-;50621:8:::1;50611:7;:18;;;;;;;;;;;;:::i;:::-;;50537:100:::0;:::o;35565:222::-;35637:7;35657:13;35673:7;:16;35681:7;35673:16;;;;;;;;;;;;;;;;;;;;;35657:32;;35725:1;35708:19;;:5;:19;;;;35700:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;35774:5;35767:12;;;35565:222;;;:::o;48370:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35296:207::-;35368:7;35413:1;35396:19;;:5;:19;;;;35388:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35479:9;:16;35489:5;35479:16;;;;;;;;;;;;;;;;35472:23;;35296:207;;;:::o;15463:103::-;14701:13;:11;:13::i;:::-;15528:30:::1;15555:1;15528:18;:30::i;:::-;15463:103::o:0;14815:87::-;14861:7;14888:6;;;;;;;;;;;14881:13;;14815:87;:::o;36023:104::-;36079:13;36112:7;36105:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36023:104;:::o;37610:155::-;37705:52;37724:12;:10;:12::i;:::-;37738:8;37748;37705:18;:52::i;:::-;37610:155;;:::o;49630:662::-;48731:16;;;;;;;;;;;48723:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;49826:14:::1;48927:9;48909:14;48884:22;:12;:20;:22::i;:::-;:39;;;;:::i;:::-;:52;;48862:138;;;;;;;;;;;;:::i;:::-;;;;;;;;;49870:11:::2;;49883:19;;49904:12;49157:158;49194:11;;49157:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49224:4;49274:10;49286:12;49257:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49247:53;;;;;;49157:18;:158::i;:::-;49135:236;;;;;;;;;;;;:::i;:::-;;;;;;;;;49934:24:::3;49961:19;:31;49981:10;49961:31;;;;;;;;;;;;;;;;49934:58;;50048:12;50030:14;50011:16;:33;;;;:::i;:::-;:49;;50003:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;50150:14;50131:16;:33;;;;:::i;:::-;50097:19;:31;50117:10;50097:31;;;;;;;;;;;;;;;:67;;;;50182:9;50177:108;50201:14;50197:1;:18;50177:108;;;50237:36;50247:10;50259:13;:11;:13::i;:::-;50237:9;:36::i;:::-;50217:3;;;;;:::i;:::-;;;;50177:108;;;;49923:369;49011:1:::2;;;;48784::::1;49630:662:::0;;;;:::o;38730:323::-;38904:41;38923:12;:10;:12::i;:::-;38937:7;38904:18;:41::i;:::-;38896:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;39007:38;39021:4;39027:2;39031:7;39040:4;39007:13;:38::i;:::-;38730:323;;;;:::o;48554:54::-;;;;;;;;;;;;;;;;;:::o;48398:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51359:276::-;51477:13;51516:16;51524:7;51516;:16::i;:::-;51508:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;51598:7;51607:18;:7;:16;:18::i;:::-;51581:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51567:60;;51359:276;;;:::o;48511:34::-;;;:::o;37836:164::-;37933:4;37957:18;:25;37976:5;37957:25;;;;;;;;;;;;;;;:35;37983:8;37957:35;;;;;;;;;;;;;;;;;;;;;;;;;37950:42;;37836:164;;;;:::o;15721:201::-;14701:13;:11;:13::i;:::-;15830:1:::1;15810:22;;:8;:22;;;;15802:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;15886:28;15905:8;15886:18;:28::i;:::-;15721:201:::0;:::o;27669:157::-;27754:4;27793:25;27778:40;;;:11;:40;;;;27771:47;;27669:157;;;:::o;45342:135::-;45424:16;45432:7;45424;:16::i;:::-;45416:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;45342:135;:::o;13366:98::-;13419:7;13446:10;13439:17;;13366:98;:::o;44621:174::-;44723:2;44696:15;:24;44712:7;44696:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44779:7;44775:2;44741:46;;44750:23;44765:7;44750:14;:23::i;:::-;44741:46;;;;;;;;;;;;44621:174;;:::o;14980:132::-;15055:12;:10;:12::i;:::-;15044:23;;:7;:5;:7::i;:::-;:23;;;15036:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14980:132::o;9597:114::-;9662:7;9689;:14;;;9682:21;;9597:114;;;:::o;40854:264::-;40947:4;40964:13;40980:23;40995:7;40980:14;:23::i;:::-;40964:39;;41033:5;41022:16;;:7;:16;;;:52;;;;41042:32;41059:5;41066:7;41042:16;:32::i;:::-;41022:52;:87;;;;41102:7;41078:31;;:20;41090:7;41078:11;:20::i;:::-;:31;;;41022:87;41014:96;;;40854:264;;;;:::o;43877:625::-;44036:4;44009:31;;:23;44024:7;44009:14;:23::i;:::-;:31;;;44001:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;44115:1;44101:16;;:2;:16;;;;44093:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;44171:39;44192:4;44198:2;44202:7;44171:20;:39::i;:::-;44275:29;44292:1;44296:7;44275:8;:29::i;:::-;44336:1;44317:9;:15;44327:4;44317:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;44365:1;44348:9;:13;44358:2;44348:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;44396:2;44377:7;:16;44385:7;44377:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;44435:7;44431:2;44416:27;;44425:4;44416:27;;;;;;;;;;;;44456:38;44476:4;44482:2;44486:7;44456:19;:38::i;:::-;43877:625;;;:::o;16082:191::-;16156:16;16175:6;;;;;;;;;;;16156:25;;16201:8;16192:6;;:17;;;;;;;;;;;;;;;;;;16256:8;16225:40;;16246:8;16225:40;;;;;;;;;;;;16145:128;16082:191;:::o;44938:315::-;45093:8;45084:17;;:5;:17;;;;45076:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;45180:8;45142:18;:25;45161:5;45142:25;;;;;;;;;;;;;;;:35;45168:8;45142:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;45226:8;45204:41;;45219:5;45204:41;;;45236:8;45204:41;;;;;;:::i;:::-;;;;;;;;44938:315;;;:::o;1219:190::-;1344:4;1397;1368:25;1381:5;1388:4;1368:12;:25::i;:::-;:33;1361:40;;1219:190;;;;;:::o;51156:132::-;51196:7;51216:24;:12;:22;:24::i;:::-;51258:22;:12;:20;:22::i;:::-;51251:29;;51156:132;:::o;41460:110::-;41536:26;41546:2;41550:7;41536:26;;;;;;;;;;;;:9;:26::i;:::-;41460:110;;:::o;39934:313::-;40090:28;40100:4;40106:2;40110:7;40090:9;:28::i;:::-;40137:47;40160:4;40166:2;40170:7;40179:4;40137:22;:47::i;:::-;40129:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;39934:313;;;;:::o;40560:127::-;40625:4;40677:1;40649:30;;:7;:16;40657:7;40649:16;;;;;;;;;;;;;;;;;;;;;:30;;;;40642:37;;40560:127;;;:::o;10620:723::-;10676:13;10906:1;10897:5;:10;10893:53;;;10924:10;;;;;;;;;;;;;;;;;;;;;10893:53;10956:12;10971:5;10956:20;;10987:14;11012:78;11027:1;11019:4;:9;11012:78;;11045:8;;;;;:::i;:::-;;;;11076:2;11068:10;;;;;:::i;:::-;;;11012:78;;;11100:19;11132:6;11122:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11100:39;;11150:154;11166:1;11157:5;:10;11150:154;;11194:1;11184:11;;;;;:::i;:::-;;;11261:2;11253:5;:10;;;;:::i;:::-;11240:2;:24;;;;:::i;:::-;11227:39;;11210:6;11217;11210:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;11290:2;11281:11;;;;;:::i;:::-;;;11150:154;;;11328:6;11314:21;;;;;10620:723;;;;:::o;47466:126::-;;;;:::o;47977:125::-;;;;:::o;2086:296::-;2169:7;2189:20;2212:4;2189:27;;2232:9;2227:118;2251:5;:12;2247:1;:16;2227:118;;;2300:33;2310:12;2324:5;2330:1;2324:8;;;;;;;;:::i;:::-;;;;;;;;2300:9;:33::i;:::-;2285:48;;2265:3;;;;;:::i;:::-;;;;2227:118;;;;2362:12;2355:19;;;2086:296;;;;:::o;9719:127::-;9826:1;9808:7;:14;;;:19;;;;;;;;;;;9719:127;:::o;41797:319::-;41926:18;41932:2;41936:7;41926:5;:18::i;:::-;41977:53;42008:1;42012:2;42016:7;42025:4;41977:22;:53::i;:::-;41955:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;41797:319;;;:::o;46041:853::-;46195:4;46216:15;:2;:13;;;:15::i;:::-;46212:675;;;46268:2;46252:36;;;46289:12;:10;:12::i;:::-;46303:4;46309:7;46318:4;46252:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46248:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46510:1;46493:6;:13;:18;46489:328;;;46536:60;;;;;;;;;;:::i;:::-;;;;;;;;46489:328;46767:6;46761:13;46752:6;46748:2;46744:15;46737:38;46248:584;46384:41;;;46374:51;;;:6;:51;;;;46367:58;;;;;46212:675;46871:4;46864:11;;46041:853;;;;;;;:::o;8293:149::-;8356:7;8387:1;8383;:5;:51;;8414:20;8429:1;8432;8414:14;:20::i;:::-;8383:51;;;8391:20;8406:1;8409;8391:14;:20::i;:::-;8383:51;8376:58;;8293:149;;;;:::o;42452:439::-;42546:1;42532:16;;:2;:16;;;;42524:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;42605:16;42613:7;42605;:16::i;:::-;42604:17;42596:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42667:45;42696:1;42700:2;42704:7;42667:20;:45::i;:::-;42742:1;42725:9;:13;42735:2;42725:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;42773:2;42754:7;:16;42762:7;42754:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42818:7;42814:2;42793:33;;42810:1;42793:33;;;;;;;;;;;;42839:44;42867:1;42871:2;42875:7;42839:19;:44::i;:::-;42452:439;;:::o;17513:326::-;17573:4;17830:1;17808:7;:19;;;:23;17801:30;;17513:326;;;:::o;8450:268::-;8518:13;8625:1;8619:4;8612:15;8654:1;8648:4;8641:15;8695:4;8689;8679:21;8670:30;;8450:268;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:139::-;1762:5;1800:6;1787:20;1778:29;;1816:33;1843:5;1816:33;:::i;:::-;1716:139;;;;:::o;1861:137::-;1906:5;1944:6;1931:20;1922:29;;1960:32;1986:5;1960:32;:::i;:::-;1861:137;;;;:::o;2004:141::-;2060:5;2091:6;2085:13;2076:22;;2107:32;2133:5;2107:32;:::i;:::-;2004:141;;;;:::o;2164:338::-;2219:5;2268:3;2261:4;2253:6;2249:17;2245:27;2235:122;;2276:79;;:::i;:::-;2235:122;2393:6;2380:20;2418:78;2492:3;2484:6;2477:4;2469:6;2465:17;2418:78;:::i;:::-;2409:87;;2225:277;2164:338;;;;:::o;2522:340::-;2578:5;2627:3;2620:4;2612:6;2608:17;2604:27;2594:122;;2635:79;;:::i;:::-;2594:122;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2584:278;2522:340;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2868:139;;;;:::o;3013:329::-;3072:6;3121:2;3109:9;3100:7;3096:23;3092:32;3089:119;;;3127:79;;:::i;:::-;3089:119;3247:1;3272:53;3317:7;3308:6;3297:9;3293:22;3272:53;:::i;:::-;3262:63;;3218:117;3013:329;;;;:::o;3348:474::-;3416:6;3424;3473:2;3461:9;3452:7;3448:23;3444:32;3441:119;;;3479:79;;:::i;:::-;3441:119;3599:1;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3570:117;3726:2;3752:53;3797:7;3788:6;3777:9;3773:22;3752:53;:::i;:::-;3742:63;;3697:118;3348:474;;;;;:::o;3828:619::-;3905:6;3913;3921;3970:2;3958:9;3949:7;3945:23;3941:32;3938:119;;;3976:79;;:::i;:::-;3938:119;4096:1;4121:53;4166:7;4157:6;4146:9;4142:22;4121:53;:::i;:::-;4111:63;;4067:117;4223:2;4249:53;4294:7;4285:6;4274:9;4270:22;4249:53;:::i;:::-;4239:63;;4194:118;4351:2;4377:53;4422:7;4413:6;4402:9;4398:22;4377:53;:::i;:::-;4367:63;;4322:118;3828:619;;;;;:::o;4453:943::-;4548:6;4556;4564;4572;4621:3;4609:9;4600:7;4596:23;4592:33;4589:120;;;4628:79;;:::i;:::-;4589:120;4748:1;4773:53;4818:7;4809:6;4798:9;4794:22;4773:53;:::i;:::-;4763:63;;4719:117;4875:2;4901:53;4946:7;4937:6;4926:9;4922:22;4901:53;:::i;:::-;4891:63;;4846:118;5003:2;5029:53;5074:7;5065:6;5054:9;5050:22;5029:53;:::i;:::-;5019:63;;4974:118;5159:2;5148:9;5144:18;5131:32;5190:18;5182:6;5179:30;5176:117;;;5212:79;;:::i;:::-;5176:117;5317:62;5371:7;5362:6;5351:9;5347:22;5317:62;:::i;:::-;5307:72;;5102:287;4453:943;;;;;;;:::o;5402:468::-;5467:6;5475;5524:2;5512:9;5503:7;5499:23;5495:32;5492:119;;;5530:79;;:::i;:::-;5492:119;5650:1;5675:53;5720:7;5711:6;5700:9;5696:22;5675:53;:::i;:::-;5665:63;;5621:117;5777:2;5803:50;5845:7;5836:6;5825:9;5821:22;5803:50;:::i;:::-;5793:60;;5748:115;5402:468;;;;;:::o;5876:474::-;5944:6;5952;6001:2;5989:9;5980:7;5976:23;5972:32;5969:119;;;6007:79;;:::i;:::-;5969:119;6127:1;6152:53;6197:7;6188:6;6177:9;6173:22;6152:53;:::i;:::-;6142:63;;6098:117;6254:2;6280:53;6325:7;6316:6;6305:9;6301:22;6280:53;:::i;:::-;6270:63;;6225:118;5876:474;;;;;:::o;6356:323::-;6412:6;6461:2;6449:9;6440:7;6436:23;6432:32;6429:119;;;6467:79;;:::i;:::-;6429:119;6587:1;6612:50;6654:7;6645:6;6634:9;6630:22;6612:50;:::i;:::-;6602:60;;6558:114;6356:323;;;;:::o;6685:329::-;6744:6;6793:2;6781:9;6772:7;6768:23;6764:32;6761:119;;;6799:79;;:::i;:::-;6761:119;6919:1;6944:53;6989:7;6980:6;6969:9;6965:22;6944:53;:::i;:::-;6934:63;;6890:117;6685:329;;;;:::o;7020:327::-;7078:6;7127:2;7115:9;7106:7;7102:23;7098:32;7095:119;;;7133:79;;:::i;:::-;7095:119;7253:1;7278:52;7322:7;7313:6;7302:9;7298:22;7278:52;:::i;:::-;7268:62;;7224:116;7020:327;;;;:::o;7353:349::-;7422:6;7471:2;7459:9;7450:7;7446:23;7442:32;7439:119;;;7477:79;;:::i;:::-;7439:119;7597:1;7622:63;7677:7;7668:6;7657:9;7653:22;7622:63;:::i;:::-;7612:73;;7568:127;7353:349;;;;:::o;7708:509::-;7777:6;7826:2;7814:9;7805:7;7801:23;7797:32;7794:119;;;7832:79;;:::i;:::-;7794:119;7980:1;7969:9;7965:17;7952:31;8010:18;8002:6;7999:30;7996:117;;;8032:79;;:::i;:::-;7996:117;8137:63;8192:7;8183:6;8172:9;8168:22;8137:63;:::i;:::-;8127:73;;7923:287;7708:509;;;;:::o;8223:329::-;8282:6;8331:2;8319:9;8310:7;8306:23;8302:32;8299:119;;;8337:79;;:::i;:::-;8299:119;8457:1;8482:53;8527:7;8518:6;8507:9;8503:22;8482:53;:::i;:::-;8472:63;;8428:117;8223:329;;;;:::o;8558:849::-;8662:6;8670;8678;8686;8735:2;8723:9;8714:7;8710:23;8706:32;8703:119;;;8741:79;;:::i;:::-;8703:119;8861:1;8886:53;8931:7;8922:6;8911:9;8907:22;8886:53;:::i;:::-;8876:63;;8832:117;8988:2;9014:53;9059:7;9050:6;9039:9;9035:22;9014:53;:::i;:::-;9004:63;;8959:118;9144:2;9133:9;9129:18;9116:32;9175:18;9167:6;9164:30;9161:117;;;9197:79;;:::i;:::-;9161:117;9310:80;9382:7;9373:6;9362:9;9358:22;9310:80;:::i;:::-;9292:98;;;;9087:313;8558:849;;;;;;;:::o;9413:118::-;9500:24;9518:5;9500:24;:::i;:::-;9495:3;9488:37;9413:118;;:::o;9537:157::-;9642:45;9662:24;9680:5;9662:24;:::i;:::-;9642:45;:::i;:::-;9637:3;9630:58;9537:157;;:::o;9700:109::-;9781:21;9796:5;9781:21;:::i;:::-;9776:3;9769:34;9700:109;;:::o;9815:118::-;9902:24;9920:5;9902:24;:::i;:::-;9897:3;9890:37;9815:118;;:::o;9939:360::-;10025:3;10053:38;10085:5;10053:38;:::i;:::-;10107:70;10170:6;10165:3;10107:70;:::i;:::-;10100:77;;10186:52;10231:6;10226:3;10219:4;10212:5;10208:16;10186:52;:::i;:::-;10263:29;10285:6;10263:29;:::i;:::-;10258:3;10254:39;10247:46;;10029:270;9939:360;;;;:::o;10305:364::-;10393:3;10421:39;10454:5;10421:39;:::i;:::-;10476:71;10540:6;10535:3;10476:71;:::i;:::-;10469:78;;10556:52;10601:6;10596:3;10589:4;10582:5;10578:16;10556:52;:::i;:::-;10633:29;10655:6;10633:29;:::i;:::-;10628:3;10624:39;10617:46;;10397:272;10305:364;;;;:::o;10675:377::-;10781:3;10809:39;10842:5;10809:39;:::i;:::-;10864:89;10946:6;10941:3;10864:89;:::i;:::-;10857:96;;10962:52;11007:6;11002:3;10995:4;10988:5;10984:16;10962:52;:::i;:::-;11039:6;11034:3;11030:16;11023:23;;10785:267;10675:377;;;;:::o;11082:845::-;11185:3;11222:5;11216:12;11251:36;11277:9;11251:36;:::i;:::-;11303:89;11385:6;11380:3;11303:89;:::i;:::-;11296:96;;11423:1;11412:9;11408:17;11439:1;11434:137;;;;11585:1;11580:341;;;;11401:520;;11434:137;11518:4;11514:9;11503;11499:25;11494:3;11487:38;11554:6;11549:3;11545:16;11538:23;;11434:137;;11580:341;11647:38;11679:5;11647:38;:::i;:::-;11707:1;11721:154;11735:6;11732:1;11729:13;11721:154;;;11809:7;11803:14;11799:1;11794:3;11790:11;11783:35;11859:1;11850:7;11846:15;11835:26;;11757:4;11754:1;11750:12;11745:17;;11721:154;;;11904:6;11899:3;11895:16;11888:23;;11587:334;;11401:520;;11189:738;;11082:845;;;;:::o;11933:366::-;12075:3;12096:67;12160:2;12155:3;12096:67;:::i;:::-;12089:74;;12172:93;12261:3;12172:93;:::i;:::-;12290:2;12285:3;12281:12;12274:19;;11933:366;;;:::o;12305:::-;12447:3;12468:67;12532:2;12527:3;12468:67;:::i;:::-;12461:74;;12544:93;12633:3;12544:93;:::i;:::-;12662:2;12657:3;12653:12;12646:19;;12305:366;;;:::o;12677:::-;12819:3;12840:67;12904:2;12899:3;12840:67;:::i;:::-;12833:74;;12916:93;13005:3;12916:93;:::i;:::-;13034:2;13029:3;13025:12;13018:19;;12677:366;;;:::o;13049:::-;13191:3;13212:67;13276:2;13271:3;13212:67;:::i;:::-;13205:74;;13288:93;13377:3;13288:93;:::i;:::-;13406:2;13401:3;13397:12;13390:19;;13049:366;;;:::o;13421:::-;13563:3;13584:67;13648:2;13643:3;13584:67;:::i;:::-;13577:74;;13660:93;13749:3;13660:93;:::i;:::-;13778:2;13773:3;13769:12;13762:19;;13421:366;;;:::o;13793:::-;13935:3;13956:67;14020:2;14015:3;13956:67;:::i;:::-;13949:74;;14032:93;14121:3;14032:93;:::i;:::-;14150:2;14145:3;14141:12;14134:19;;13793:366;;;:::o;14165:::-;14307:3;14328:67;14392:2;14387:3;14328:67;:::i;:::-;14321:74;;14404:93;14493:3;14404:93;:::i;:::-;14522:2;14517:3;14513:12;14506:19;;14165:366;;;:::o;14537:::-;14679:3;14700:67;14764:2;14759:3;14700:67;:::i;:::-;14693:74;;14776:93;14865:3;14776:93;:::i;:::-;14894:2;14889:3;14885:12;14878:19;;14537:366;;;:::o;14909:::-;15051:3;15072:67;15136:2;15131:3;15072:67;:::i;:::-;15065:74;;15148:93;15237:3;15148:93;:::i;:::-;15266:2;15261:3;15257:12;15250:19;;14909:366;;;:::o;15281:::-;15423:3;15444:67;15508:2;15503:3;15444:67;:::i;:::-;15437:74;;15520:93;15609:3;15520:93;:::i;:::-;15638:2;15633:3;15629:12;15622:19;;15281:366;;;:::o;15653:::-;15795:3;15816:67;15880:2;15875:3;15816:67;:::i;:::-;15809:74;;15892:93;15981:3;15892:93;:::i;:::-;16010:2;16005:3;16001:12;15994:19;;15653:366;;;:::o;16025:::-;16167:3;16188:67;16252:2;16247:3;16188:67;:::i;:::-;16181:74;;16264:93;16353:3;16264:93;:::i;:::-;16382:2;16377:3;16373:12;16366:19;;16025:366;;;:::o;16397:::-;16539:3;16560:67;16624:2;16619:3;16560:67;:::i;:::-;16553:74;;16636:93;16725:3;16636:93;:::i;:::-;16754:2;16749:3;16745:12;16738:19;;16397:366;;;:::o;16769:::-;16911:3;16932:67;16996:2;16991:3;16932:67;:::i;:::-;16925:74;;17008:93;17097:3;17008:93;:::i;:::-;17126:2;17121:3;17117:12;17110:19;;16769:366;;;:::o;17141:::-;17283:3;17304:67;17368:2;17363:3;17304:67;:::i;:::-;17297:74;;17380:93;17469:3;17380:93;:::i;:::-;17498:2;17493:3;17489:12;17482:19;;17141:366;;;:::o;17513:::-;17655:3;17676:67;17740:2;17735:3;17676:67;:::i;:::-;17669:74;;17752:93;17841:3;17752:93;:::i;:::-;17870:2;17865:3;17861:12;17854:19;;17513:366;;;:::o;17885:::-;18027:3;18048:67;18112:2;18107:3;18048:67;:::i;:::-;18041:74;;18124:93;18213:3;18124:93;:::i;:::-;18242:2;18237:3;18233:12;18226:19;;17885:366;;;:::o;18257:::-;18399:3;18420:67;18484:2;18479:3;18420:67;:::i;:::-;18413:74;;18496:93;18585:3;18496:93;:::i;:::-;18614:2;18609:3;18605:12;18598:19;;18257:366;;;:::o;18629:118::-;18716:24;18734:5;18716:24;:::i;:::-;18711:3;18704:37;18629:118;;:::o;18753:157::-;18858:45;18878:24;18896:5;18878:24;:::i;:::-;18858:45;:::i;:::-;18853:3;18846:58;18753:157;;:::o;18916:397::-;19056:3;19071:75;19142:3;19133:6;19071:75;:::i;:::-;19171:2;19166:3;19162:12;19155:19;;19184:75;19255:3;19246:6;19184:75;:::i;:::-;19284:2;19279:3;19275:12;19268:19;;19304:3;19297:10;;18916:397;;;;;:::o;19319:429::-;19496:3;19518:92;19606:3;19597:6;19518:92;:::i;:::-;19511:99;;19627:95;19718:3;19709:6;19627:95;:::i;:::-;19620:102;;19739:3;19732:10;;19319:429;;;;;:::o;19754:222::-;19847:4;19885:2;19874:9;19870:18;19862:26;;19898:71;19966:1;19955:9;19951:17;19942:6;19898:71;:::i;:::-;19754:222;;;;:::o;19982:640::-;20177:4;20215:3;20204:9;20200:19;20192:27;;20229:71;20297:1;20286:9;20282:17;20273:6;20229:71;:::i;:::-;20310:72;20378:2;20367:9;20363:18;20354:6;20310:72;:::i;:::-;20392;20460:2;20449:9;20445:18;20436:6;20392:72;:::i;:::-;20511:9;20505:4;20501:20;20496:2;20485:9;20481:18;20474:48;20539:76;20610:4;20601:6;20539:76;:::i;:::-;20531:84;;19982:640;;;;;;;:::o;20628:210::-;20715:4;20753:2;20742:9;20738:18;20730:26;;20766:65;20828:1;20817:9;20813:17;20804:6;20766:65;:::i;:::-;20628:210;;;;:::o;20844:222::-;20937:4;20975:2;20964:9;20960:18;20952:26;;20988:71;21056:1;21045:9;21041:17;21032:6;20988:71;:::i;:::-;20844:222;;;;:::o;21072:313::-;21185:4;21223:2;21212:9;21208:18;21200:26;;21272:9;21266:4;21262:20;21258:1;21247:9;21243:17;21236:47;21300:78;21373:4;21364:6;21300:78;:::i;:::-;21292:86;;21072:313;;;;:::o;21391:419::-;21557:4;21595:2;21584:9;21580:18;21572:26;;21644:9;21638:4;21634:20;21630:1;21619:9;21615:17;21608:47;21672:131;21798:4;21672:131;:::i;:::-;21664:139;;21391:419;;;:::o;21816:::-;21982:4;22020:2;22009:9;22005:18;21997:26;;22069:9;22063:4;22059:20;22055:1;22044:9;22040:17;22033:47;22097:131;22223:4;22097:131;:::i;:::-;22089:139;;21816:419;;;:::o;22241:::-;22407:4;22445:2;22434:9;22430:18;22422:26;;22494:9;22488:4;22484:20;22480:1;22469:9;22465:17;22458:47;22522:131;22648:4;22522:131;:::i;:::-;22514:139;;22241:419;;;:::o;22666:::-;22832:4;22870:2;22859:9;22855:18;22847:26;;22919:9;22913:4;22909:20;22905:1;22894:9;22890:17;22883:47;22947:131;23073:4;22947:131;:::i;:::-;22939:139;;22666:419;;;:::o;23091:::-;23257:4;23295:2;23284:9;23280:18;23272:26;;23344:9;23338:4;23334:20;23330:1;23319:9;23315:17;23308:47;23372:131;23498:4;23372:131;:::i;:::-;23364:139;;23091:419;;;:::o;23516:::-;23682:4;23720:2;23709:9;23705:18;23697:26;;23769:9;23763:4;23759:20;23755:1;23744:9;23740:17;23733:47;23797:131;23923:4;23797:131;:::i;:::-;23789:139;;23516:419;;;:::o;23941:::-;24107:4;24145:2;24134:9;24130:18;24122:26;;24194:9;24188:4;24184:20;24180:1;24169:9;24165:17;24158:47;24222:131;24348:4;24222:131;:::i;:::-;24214:139;;23941:419;;;:::o;24366:::-;24532:4;24570:2;24559:9;24555:18;24547:26;;24619:9;24613:4;24609:20;24605:1;24594:9;24590:17;24583:47;24647:131;24773:4;24647:131;:::i;:::-;24639:139;;24366:419;;;:::o;24791:::-;24957:4;24995:2;24984:9;24980:18;24972:26;;25044:9;25038:4;25034:20;25030:1;25019:9;25015:17;25008:47;25072:131;25198:4;25072:131;:::i;:::-;25064:139;;24791:419;;;:::o;25216:::-;25382:4;25420:2;25409:9;25405:18;25397:26;;25469:9;25463:4;25459:20;25455:1;25444:9;25440:17;25433:47;25497:131;25623:4;25497:131;:::i;:::-;25489:139;;25216:419;;;:::o;25641:::-;25807:4;25845:2;25834:9;25830:18;25822:26;;25894:9;25888:4;25884:20;25880:1;25869:9;25865:17;25858:47;25922:131;26048:4;25922:131;:::i;:::-;25914:139;;25641:419;;;:::o;26066:::-;26232:4;26270:2;26259:9;26255:18;26247:26;;26319:9;26313:4;26309:20;26305:1;26294:9;26290:17;26283:47;26347:131;26473:4;26347:131;:::i;:::-;26339:139;;26066:419;;;:::o;26491:::-;26657:4;26695:2;26684:9;26680:18;26672:26;;26744:9;26738:4;26734:20;26730:1;26719:9;26715:17;26708:47;26772:131;26898:4;26772:131;:::i;:::-;26764:139;;26491:419;;;:::o;26916:::-;27082:4;27120:2;27109:9;27105:18;27097:26;;27169:9;27163:4;27159:20;27155:1;27144:9;27140:17;27133:47;27197:131;27323:4;27197:131;:::i;:::-;27189:139;;26916:419;;;:::o;27341:::-;27507:4;27545:2;27534:9;27530:18;27522:26;;27594:9;27588:4;27584:20;27580:1;27569:9;27565:17;27558:47;27622:131;27748:4;27622:131;:::i;:::-;27614:139;;27341:419;;;:::o;27766:::-;27932:4;27970:2;27959:9;27955:18;27947:26;;28019:9;28013:4;28009:20;28005:1;27994:9;27990:17;27983:47;28047:131;28173:4;28047:131;:::i;:::-;28039:139;;27766:419;;;:::o;28191:::-;28357:4;28395:2;28384:9;28380:18;28372:26;;28444:9;28438:4;28434:20;28430:1;28419:9;28415:17;28408:47;28472:131;28598:4;28472:131;:::i;:::-;28464:139;;28191:419;;;:::o;28616:::-;28782:4;28820:2;28809:9;28805:18;28797:26;;28869:9;28863:4;28859:20;28855:1;28844:9;28840:17;28833:47;28897:131;29023:4;28897:131;:::i;:::-;28889:139;;28616:419;;;:::o;29041:222::-;29134:4;29172:2;29161:9;29157:18;29149:26;;29185:71;29253:1;29242:9;29238:17;29229:6;29185:71;:::i;:::-;29041:222;;;;:::o;29269:129::-;29303:6;29330:20;;:::i;:::-;29320:30;;29359:33;29387:4;29379:6;29359:33;:::i;:::-;29269:129;;;:::o;29404:75::-;29437:6;29470:2;29464:9;29454:19;;29404:75;:::o;29485:307::-;29546:4;29636:18;29628:6;29625:30;29622:56;;;29658:18;;:::i;:::-;29622:56;29696:29;29718:6;29696:29;:::i;:::-;29688:37;;29780:4;29774;29770:15;29762:23;;29485:307;;;:::o;29798:308::-;29860:4;29950:18;29942:6;29939:30;29936:56;;;29972:18;;:::i;:::-;29936:56;30010:29;30032:6;30010:29;:::i;:::-;30002:37;;30094:4;30088;30084:15;30076:23;;29798:308;;;:::o;30112:141::-;30161:4;30184:3;30176:11;;30207:3;30204:1;30197:14;30241:4;30238:1;30228:18;30220:26;;30112:141;;;:::o;30259:98::-;30310:6;30344:5;30338:12;30328:22;;30259:98;;;:::o;30363:99::-;30415:6;30449:5;30443:12;30433:22;;30363:99;;;:::o;30468:168::-;30551:11;30585:6;30580:3;30573:19;30625:4;30620:3;30616:14;30601:29;;30468:168;;;;:::o;30642:169::-;30726:11;30760:6;30755:3;30748:19;30800:4;30795:3;30791:14;30776:29;;30642:169;;;;:::o;30817:148::-;30919:11;30956:3;30941:18;;30817:148;;;;:::o;30971:305::-;31011:3;31030:20;31048:1;31030:20;:::i;:::-;31025:25;;31064:20;31082:1;31064:20;:::i;:::-;31059:25;;31218:1;31150:66;31146:74;31143:1;31140:81;31137:107;;;31224:18;;:::i;:::-;31137:107;31268:1;31265;31261:9;31254:16;;30971:305;;;;:::o;31282:185::-;31322:1;31339:20;31357:1;31339:20;:::i;:::-;31334:25;;31373:20;31391:1;31373:20;:::i;:::-;31368:25;;31412:1;31402:35;;31417:18;;:::i;:::-;31402:35;31459:1;31456;31452:9;31447:14;;31282:185;;;;:::o;31473:191::-;31513:4;31533:20;31551:1;31533:20;:::i;:::-;31528:25;;31567:20;31585:1;31567:20;:::i;:::-;31562:25;;31606:1;31603;31600:8;31597:34;;;31611:18;;:::i;:::-;31597:34;31656:1;31653;31649:9;31641:17;;31473:191;;;;:::o;31670:96::-;31707:7;31736:24;31754:5;31736:24;:::i;:::-;31725:35;;31670:96;;;:::o;31772:90::-;31806:7;31849:5;31842:13;31835:21;31824:32;;31772:90;;;:::o;31868:77::-;31905:7;31934:5;31923:16;;31868:77;;;:::o;31951:149::-;31987:7;32027:66;32020:5;32016:78;32005:89;;31951:149;;;:::o;32106:126::-;32143:7;32183:42;32176:5;32172:54;32161:65;;32106:126;;;:::o;32238:77::-;32275:7;32304:5;32293:16;;32238:77;;;:::o;32321:154::-;32405:6;32400:3;32395;32382:30;32467:1;32458:6;32453:3;32449:16;32442:27;32321:154;;;:::o;32481:307::-;32549:1;32559:113;32573:6;32570:1;32567:13;32559:113;;;32658:1;32653:3;32649:11;32643:18;32639:1;32634:3;32630:11;32623:39;32595:2;32592:1;32588:10;32583:15;;32559:113;;;32690:6;32687:1;32684:13;32681:101;;;32770:1;32761:6;32756:3;32752:16;32745:27;32681:101;32530:258;32481:307;;;:::o;32794:320::-;32838:6;32875:1;32869:4;32865:12;32855:22;;32922:1;32916:4;32912:12;32943:18;32933:81;;32999:4;32991:6;32987:17;32977:27;;32933:81;33061:2;33053:6;33050:14;33030:18;33027:38;33024:84;;;33080:18;;:::i;:::-;33024:84;32845:269;32794:320;;;:::o;33120:281::-;33203:27;33225:4;33203:27;:::i;:::-;33195:6;33191:40;33333:6;33321:10;33318:22;33297:18;33285:10;33282:34;33279:62;33276:88;;;33344:18;;:::i;:::-;33276:88;33384:10;33380:2;33373:22;33163:238;33120:281;;:::o;33407:233::-;33446:3;33469:24;33487:5;33469:24;:::i;:::-;33460:33;;33515:66;33508:5;33505:77;33502:103;;;33585:18;;:::i;:::-;33502:103;33632:1;33625:5;33621:13;33614:20;;33407:233;;;:::o;33646:100::-;33685:7;33714:26;33734:5;33714:26;:::i;:::-;33703:37;;33646:100;;;:::o;33752:94::-;33791:7;33820:20;33834:5;33820:20;:::i;:::-;33809:31;;33752:94;;;:::o;33852:79::-;33891:7;33920:5;33909:16;;33852:79;;;:::o;33937:176::-;33969:1;33986:20;34004:1;33986:20;:::i;:::-;33981:25;;34020:20;34038:1;34020:20;:::i;:::-;34015:25;;34059:1;34049:35;;34064:18;;:::i;:::-;34049:35;34105:1;34102;34098:9;34093:14;;33937:176;;;;:::o;34119:180::-;34167:77;34164:1;34157:88;34264:4;34261:1;34254:15;34288:4;34285:1;34278:15;34305:180;34353:77;34350:1;34343:88;34450:4;34447:1;34440:15;34474:4;34471:1;34464:15;34491:180;34539:77;34536:1;34529:88;34636:4;34633:1;34626:15;34660:4;34657:1;34650:15;34677:180;34725:77;34722:1;34715:88;34822:4;34819:1;34812:15;34846:4;34843:1;34836:15;34863:180;34911:77;34908:1;34901:88;35008:4;35005:1;34998:15;35032:4;35029:1;35022:15;35049:117;35158:1;35155;35148:12;35172:117;35281:1;35278;35271:12;35295:117;35404:1;35401;35394:12;35418:117;35527:1;35524;35517:12;35541:117;35650:1;35647;35640:12;35664:117;35773:1;35770;35763:12;35787:102;35828:6;35879:2;35875:7;35870:2;35863:5;35859:14;35855:28;35845:38;;35787:102;;;:::o;35895:94::-;35928:8;35976:5;35972:2;35968:14;35947:35;;35895:94;;;:::o;35995:237::-;36135:34;36131:1;36123:6;36119:14;36112:58;36204:20;36199:2;36191:6;36187:15;36180:45;35995:237;:::o;36238:225::-;36378:34;36374:1;36366:6;36362:14;36355:58;36447:8;36442:2;36434:6;36430:15;36423:33;36238:225;:::o;36469:224::-;36609:34;36605:1;36597:6;36593:14;36586:58;36678:7;36673:2;36665:6;36661:15;36654:32;36469:224;:::o;36699:178::-;36839:30;36835:1;36827:6;36823:14;36816:54;36699:178;:::o;36883:223::-;37023:34;37019:1;37011:6;37007:14;37000:58;37092:6;37087:2;37079:6;37075:15;37068:31;36883:223;:::o;37112:::-;37252:34;37248:1;37240:6;37236:14;37229:58;37321:6;37316:2;37308:6;37304:15;37297:31;37112:223;:::o;37341:175::-;37481:27;37477:1;37469:6;37465:14;37458:51;37341:175;:::o;37522:178::-;37662:30;37658:1;37650:6;37646:14;37639:54;37522:178;:::o;37706:228::-;37846:34;37842:1;37834:6;37830:14;37823:58;37915:11;37910:2;37902:6;37898:15;37891:36;37706:228;:::o;37940:167::-;38080:19;38076:1;38068:6;38064:14;38057:43;37940:167;:::o;38113:249::-;38253:34;38249:1;38241:6;38237:14;38230:58;38322:32;38317:2;38309:6;38305:15;38298:57;38113:249;:::o;38368:182::-;38508:34;38504:1;38496:6;38492:14;38485:58;38368:182;:::o;38556:::-;38696:34;38692:1;38684:6;38680:14;38673:58;38556:182;:::o;38744:174::-;38884:26;38880:1;38872:6;38868:14;38861:50;38744:174;:::o;38924:220::-;39064:34;39060:1;39052:6;39048:14;39041:58;39133:3;39128:2;39120:6;39116:15;39109:28;38924:220;:::o;39150:171::-;39290:23;39286:1;39278:6;39274:14;39267:47;39150:171;:::o;39327:233::-;39467:34;39463:1;39455:6;39451:14;39444:58;39536:16;39531:2;39523:6;39519:15;39512:41;39327:233;:::o;39566:171::-;39706:23;39702:1;39694:6;39690:14;39683:47;39566:171;:::o;39743:122::-;39816:24;39834:5;39816:24;:::i;:::-;39809:5;39806:35;39796:63;;39855:1;39852;39845:12;39796:63;39743:122;:::o;39871:116::-;39941:21;39956:5;39941:21;:::i;:::-;39934:5;39931:32;39921:60;;39977:1;39974;39967:12;39921:60;39871:116;:::o;39993:122::-;40066:24;40084:5;40066:24;:::i;:::-;40059:5;40056:35;40046:63;;40105:1;40102;40095:12;40046:63;39993:122;:::o;40121:120::-;40193:23;40210:5;40193:23;:::i;:::-;40186:5;40183:34;40173:62;;40231:1;40228;40221:12;40173:62;40121:120;:::o;40247:122::-;40320:24;40338:5;40320:24;:::i;:::-;40313:5;40310:35;40300:63;;40359:1;40356;40349:12;40300:63;40247:122;:::o
Swarm Source
ipfs://1693ff715ac00a5f6183acc168a2c5748cfa9769be7aa3f79d74e873121b1af0
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.