Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 332 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Safe Transfer Fr... | 18684110 | 390 days ago | IN | 0 ETH | 0.00130296 | ||||
Safe Transfer Fr... | 18684101 | 390 days ago | IN | 0 ETH | 0.00130591 | ||||
Set Approval For... | 17670699 | 532 days ago | IN | 0 ETH | 0.00116836 | ||||
Set Approval For... | 16690098 | 670 days ago | IN | 0 ETH | 0.00112523 | ||||
Set Approval For... | 16604085 | 682 days ago | IN | 0 ETH | 0.00075435 | ||||
Set Approval For... | 16604083 | 682 days ago | IN | 0 ETH | 0.00073799 | ||||
Safe Transfer Fr... | 16547142 | 690 days ago | IN | 0 ETH | 0.00152972 | ||||
Set Approval For... | 16464212 | 702 days ago | IN | 0 ETH | 0.00048605 | ||||
Set Approval For... | 16460576 | 702 days ago | IN | 0 ETH | 0.00073572 | ||||
Set Approval For... | 16394721 | 712 days ago | IN | 0 ETH | 0.00081748 | ||||
Set Approval For... | 16251559 | 732 days ago | IN | 0 ETH | 0.0005671 | ||||
Transfer From | 15943558 | 775 days ago | IN | 0 ETH | 0.00152276 | ||||
Set Approval For... | 15943541 | 775 days ago | IN | 0 ETH | 0.00256642 | ||||
Set Approval For... | 15726597 | 805 days ago | IN | 0 ETH | 0.00122792 | ||||
Safe Transfer Fr... | 15718437 | 806 days ago | IN | 0 ETH | 0.00257744 | ||||
Set Approval For... | 15660281 | 814 days ago | IN | 0 ETH | 0.00012292 | ||||
Set Approval For... | 15610006 | 821 days ago | IN | 0 ETH | 0.00026031 | ||||
Safe Transfer Fr... | 15597960 | 823 days ago | IN | 0 ETH | 0.00054437 | ||||
Set Approval For... | 15320062 | 866 days ago | IN | 0 ETH | 0.00055139 | ||||
Reserve | 15294322 | 870 days ago | IN | 0 ETH | 0.00038623 | ||||
Set Approval For... | 15281148 | 872 days ago | IN | 0 ETH | 0.00050715 | ||||
Transfer From | 15269694 | 874 days ago | IN | 0 ETH | 0.00068344 | ||||
Set Approval For... | 15250374 | 877 days ago | IN | 0 ETH | 0.00022795 | ||||
Set Approval For... | 15250355 | 877 days ago | IN | 0 ETH | 0.00037639 | ||||
Set Approval For... | 15250333 | 877 days ago | IN | 0 ETH | 0.00037897 |
Latest 14 internal transactions
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
14977848 | 921 days ago | 0.46 ETH | ||||
14822626 | 947 days ago | 1.38 ETH | ||||
14778351 | 954 days ago | 2.76 ETH | ||||
14771542 | 955 days ago | 1.9 ETH | ||||
14734508 | 961 days ago | 2.88 ETH | ||||
14665166 | 972 days ago | 0.72 ETH | ||||
14656498 | 974 days ago | 1.38 ETH | ||||
14648248 | 975 days ago | 0.92 ETH | ||||
14642253 | 976 days ago | 2.88 ETH | ||||
14639305 | 976 days ago | 1.8 ETH | ||||
14639093 | 976 days ago | 2.16 ETH | ||||
14636075 | 977 days ago | 2.16 ETH | ||||
14635258 | 977 days ago | 3.6 ETH | ||||
14634900 | 977 days ago | 13.32 ETH |
Loading...
Loading
Contract Name:
AlphaNft
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-22 */ // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @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); } } // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (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 `IERC721.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 v4.4.1 (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`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) 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 Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @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; } // 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/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // 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: erc721a/contracts/ERC721A.sol // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev This is equivalent to _burn(tokenId, false) */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { 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: alp.sol //SPDX-License-Identifier: MIT pragma solidity ^0.8.4; contract AlphaNft is Ownable, ERC721A, ReentrancyGuard { uint256 public immutable maxQty = 1024; uint256 public _tokensReserved; uint256 public _mintPrice; uint256 public immutable maxMintPerAddr = 1; string private _baseTokenURI; //sale stages: //stage 0: init(no minting, only reserve) //stage 1: whitelist mint+ public mint //stage 2: whitelist mint + team mint + public mint //stage 3: only reserve uint8 public _stage = 0; uint256 public immutable maxQtyStage1 = 200; uint256 public immutable maxQtyStage2 = 800; uint256 public _tokensMintedStage1 = 0; uint256 public _tokensMintedStage2 = 0; bool public _isPublicMintOpen = false; address private _signAdd=0x47Cb18BF441d8e17D3167CcC7aE004eA81657B2F; constructor(string memory baseURI) ERC721A("AlphaSciPass", "AlphaSciPass") { _baseTokenURI = baseURI; } function nextStage(uint256 nextStageMintPrice) external onlyOwner { require(_stage <= 3, "Stage cannot be more than 3"); _stage++; _mintPrice = nextStageMintPrice; _isPublicMintOpen = false; } function setMintPrice(uint256 mintPrice) external onlyOwner { _mintPrice = mintPrice; } function setIsPublicMintOpen(bool isPublicMintOpen) external onlyOwner { _isPublicMintOpen = isPublicMintOpen; } function reserve(address recipient, uint256 quantity) external onlyOwner { require(quantity > 0, "Quantity too low"); uint256 totalsupply = totalSupply(); require(totalsupply + quantity <= maxQty, "Exceed sales max limit"); _safeMint(recipient, quantity); _tokensReserved += quantity; } function whitelistMint(uint256 quantity, bytes memory signature) external payable nonReentrant { require(_stage == 1 || _stage == 2, "invalid stage"); require(isStageMaxQtyExceed(quantity), "Exceed stage sales max limit"); require(verify(signature, _msgSender()), "Verify failed"); require(tx.origin == msg.sender, "Contracts not allowed"); uint256 totalsupply = totalSupply(); require(totalsupply + quantity <= maxQty, "Exceed sales max limit"); require( numberMinted(msg.sender) + quantity <= maxMintPerAddr, "cannot mint this many" ); uint256 cost; unchecked { cost = quantity * _mintPrice; } require(msg.value == cost, "wrong payment"); _safeMint(msg.sender, quantity); increaseTokensMinted(quantity); } function mint(uint256 quantity) external payable nonReentrant { require(_stage == 1 || _stage == 2, "invalid stage"); require(isStageMaxQtyExceed(quantity), "Exceed stage sales max limit"); require(_isPublicMintOpen, "public sales not opening"); require(tx.origin == msg.sender, "Contracts not allowed"); uint256 totalsupply = totalSupply(); require(totalsupply + quantity <= maxQty, "Exceed sales max limit"); require( numberMinted(msg.sender) + quantity <= maxMintPerAddr, "cannot mint this many" ); uint256 cost; unchecked { cost = quantity * _mintPrice; } require(msg.value == cost, "wrong payment"); _safeMint(msg.sender, quantity); increaseTokensMinted(quantity); } function verify(bytes memory signature, address target) internal view returns (bool) { bytes32 messageHash = keccak256( abi.encodePacked("\x19Ethereum Signed Message:\n32", abi.encode(target)) ); return _signAdd == ECDSA.recover(messageHash, signature); } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } function isStageMaxQtyExceed(uint256 quantity) internal view returns (bool) { if (_stage == 1) { return _tokensMintedStage1 + quantity <= maxQtyStage1; } if (_stage == 2) { return _tokensMintedStage2 + quantity <= maxQtyStage2; } return false; } function increaseTokensMinted(uint256 quantity) internal { if (_stage == 1) { _tokensMintedStage1 += quantity; } if (_stage == 2) { _tokensMintedStage2 += quantity; } } function withdraw() external nonReentrant onlyOwner { uint256 balance = address(this).balance; (bool success1, ) = payable(_msgSender()).call{ value: balance }(""); require(success1, "Transfer failed."); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_isPublicMintOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_stage","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokensMintedStage1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokensMintedStage2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokensReserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"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":"maxMintPerAddr","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxQtyStage1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxQtyStage2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nextStageMintPrice","type":"uint256"}],"name":"nextStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"reserve","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":"bool","name":"isPublicMintOpen","type":"bool"}],"name":"setIsPublicMintOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
610100604052610400608090815250600160a0908152506000600d60006101000a81548160ff021916908360ff16021790555060c860c09081525061032060e0908152506000600e556000600f556000601060006101000a81548160ff0219169083151502179055507347cb18bf441d8e17d3167ccc7ae004ea81657b2f601060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000ca57600080fd5b5060405162005165380380620051658339818101604052810190620000f09190620003ed565b6040518060400160405280600c81526020017f416c7068615363695061737300000000000000000000000000000000000000008152506040518060400160405280600c81526020017f416c7068615363695061737300000000000000000000000000000000000000008152506200017c62000170620001ee60201b60201c565b620001f660201b60201c565b816003908051906020019062000194929190620002bf565b508060049080519060200190620001ad929190620002bf565b50620001be620002ba60201b60201c565b6001819055505050600160098190555080600c9080519060200190620001e6929190620002bf565b5050620005c2565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b828054620002cd90620004d3565b90600052602060002090601f016020900481019282620002f157600085556200033d565b82601f106200030c57805160ff19168380011785556200033d565b828001600101855582156200033d579182015b828111156200033c5782518255916020019190600101906200031f565b5b5090506200034c919062000350565b5090565b5b808211156200036b57600081600090555060010162000351565b5090565b600062000386620003808462000467565b6200043e565b905082815260208101848484011115620003a557620003a4620005a2565b5b620003b28482856200049d565b509392505050565b600082601f830112620003d257620003d16200059d565b5b8151620003e48482602086016200036f565b91505092915050565b600060208284031215620004065762000405620005ac565b5b600082015167ffffffffffffffff811115620004275762000426620005a7565b5b6200043584828501620003ba565b91505092915050565b60006200044a6200045d565b905062000458828262000509565b919050565b6000604051905090565b600067ffffffffffffffff8211156200048557620004846200056e565b5b6200049082620005b1565b9050602081019050919050565b60005b83811015620004bd578082015181840152602081019050620004a0565b83811115620004cd576000848401525b50505050565b60006002820490506001821680620004ec57607f821691505b602082108114156200050357620005026200053f565b5b50919050565b6200051482620005b1565b810181811067ffffffffffffffff821117156200053657620005356200056e565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60805160a05160c05160e051614b386200062d60003960008181611bd801526128af0152600081816110a4015261285c01526000818161139a015281816116bb015261199001526000818161132c0152818161164d015281816119b40152611b420152614b386000f3fe60806040526004361061020f5760003560e01c80638da5cb5b11610118578063c87b56dd116100a0578063e4469dee1161006f578063e4469dee1461075f578063e985e9c514610788578063f2fde38b146107c5578063f3e20c3b146107ee578063f4a0a528146108195761020f565b8063c87b56dd14610691578063cc47a40b146106ce578063d6b0129c146106f7578063dc33e681146107225761020f565b8063a0712d68116100e7578063a0712d68146105cd578063a22cb465146105e9578063b88d4fde14610612578063c1dffe321461063b578063c7a95480146106665761020f565b80638da5cb5b146105305780639193cfec1461055b57806395d89b41146105865780639e852f75146105b15761020f565b806340a86a121161019b57806355f804b31161016a57806355f804b31461044d5780636352211e1461047657806370a08231146104b3578063715018a6146104f0578063894edcd4146105075761020f565b806340a86a12146103a357806342842e0e146103ce57806345915899146103f757806351b304b1146104225761020f565b8063095ea7b3116101e2578063095ea7b3146102e457806316396b631461030d57806318160ddd1461033857806323b872dd146103635780633ccfd60b1461038c5761020f565b806301ffc9a7146102145780630387da421461025157806306fdde031461027c578063081812fc146102a7575b600080fd5b34801561022057600080fd5b5061023b600480360381019061023691906139e5565b610842565b6040516102489190613fb2565b60405180910390f35b34801561025d57600080fd5b50610266610924565b6040516102739190614274565b60405180910390f35b34801561028857600080fd5b5061029161092a565b60405161029e9190614012565b60405180910390f35b3480156102b357600080fd5b506102ce60048036038101906102c99190613a8c565b6109bc565b6040516102db9190613f4b565b60405180910390f35b3480156102f057600080fd5b5061030b60048036038101906103069190613978565b610a38565b005b34801561031957600080fd5b50610322610b43565b60405161032f919061428f565b60405180910390f35b34801561034457600080fd5b5061034d610b56565b60405161035a9190614274565b60405180910390f35b34801561036f57600080fd5b5061038a60048036038101906103859190613862565b610b6d565b005b34801561039857600080fd5b506103a1610b7d565b005b3480156103af57600080fd5b506103b8610d0b565b6040516103c59190614274565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f09190613862565b610d11565b005b34801561040357600080fd5b5061040c610d31565b6040516104199190613fb2565b60405180910390f35b34801561042e57600080fd5b50610437610d44565b6040516104449190614274565b60405180910390f35b34801561045957600080fd5b50610474600480360381019061046f9190613a3f565b610d4a565b005b34801561048257600080fd5b5061049d60048036038101906104989190613a8c565b610ddc565b6040516104aa9190613f4b565b60405180910390f35b3480156104bf57600080fd5b506104da60048036038101906104d591906137f5565b610df2565b6040516104e79190614274565b60405180910390f35b3480156104fc57600080fd5b50610505610ec2565b005b34801561051357600080fd5b5061052e60048036038101906105299190613a8c565b610f4a565b005b34801561053c57600080fd5b50610545611079565b6040516105529190613f4b565b60405180910390f35b34801561056757600080fd5b506105706110a2565b60405161057d9190614274565b60405180910390f35b34801561059257600080fd5b5061059b6110c6565b6040516105a89190614012565b60405180910390f35b6105cb60048036038101906105c69190613ab9565b611158565b005b6105e760048036038101906105e29190613a8c565b61147a565b005b3480156105f557600080fd5b50610610600480360381019061060b9190613938565b61179a565b005b34801561061e57600080fd5b50610639600480360381019061063491906138b5565b611912565b005b34801561064757600080fd5b5061065061198e565b60405161065d9190614274565b60405180910390f35b34801561067257600080fd5b5061067b6119b2565b6040516106889190614274565b60405180910390f35b34801561069d57600080fd5b506106b860048036038101906106b39190613a8c565b6119d6565b6040516106c59190614012565b60405180910390f35b3480156106da57600080fd5b506106f560048036038101906106f09190613978565b611a75565b005b34801561070357600080fd5b5061070c611bd6565b6040516107199190614274565b60405180910390f35b34801561072e57600080fd5b50610749600480360381019061074491906137f5565b611bfa565b6040516107569190614274565b60405180910390f35b34801561076b57600080fd5b50610786600480360381019061078191906139b8565b611c0c565b005b34801561079457600080fd5b506107af60048036038101906107aa9190613822565b611ca5565b6040516107bc9190613fb2565b60405180910390f35b3480156107d157600080fd5b506107ec60048036038101906107e791906137f5565b611d39565b005b3480156107fa57600080fd5b50610803611e31565b6040516108109190614274565b60405180910390f35b34801561082557600080fd5b50610840600480360381019061083b9190613a8c565b611e37565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061091d575061091c82611ebd565b5b9050919050565b600b5481565b606060038054610939906144d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610965906144d6565b80156109b25780601f10610987576101008083540402835291602001916109b2565b820191906000526020600020905b81548152906001019060200180831161099557829003601f168201915b5050505050905090565b60006109c782611f27565b6109fd576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a4382610ddc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aab576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610aca611f75565b73ffffffffffffffffffffffffffffffffffffffff1614158015610afc5750610afa81610af5611f75565b611ca5565b155b15610b33576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b3e838383611f7d565b505050565b600d60009054906101000a900460ff1681565b6000610b6061202f565b6002546001540303905090565b610b78838383612034565b505050565b60026009541415610bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bba90614254565b60405180910390fd5b6002600981905550610bd3611f75565b73ffffffffffffffffffffffffffffffffffffffff16610bf1611079565b73ffffffffffffffffffffffffffffffffffffffff1614610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e90614194565b60405180910390fd5b60004790506000610c56611f75565b73ffffffffffffffffffffffffffffffffffffffff1682604051610c7990613f36565b60006040518083038185875af1925050503d8060008114610cb6576040519150601f19603f3d011682016040523d82523d6000602084013e610cbb565b606091505b5050905080610cff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf6906141f4565b60405180910390fd5b50506001600981905550565b600a5481565b610d2c83838360405180602001604052806000815250611912565b505050565b601060009054906101000a900460ff1681565b600e5481565b610d52611f75565b73ffffffffffffffffffffffffffffffffffffffff16610d70611079565b73ffffffffffffffffffffffffffffffffffffffff1614610dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbd90614194565b60405180910390fd5b8181600c9190610dd79291906135e0565b505050565b6000610de7826124ea565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e5a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610eca611f75565b73ffffffffffffffffffffffffffffffffffffffff16610ee8611079565b73ffffffffffffffffffffffffffffffffffffffff1614610f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3590614194565b60405180910390fd5b610f486000612779565b565b610f52611f75565b73ffffffffffffffffffffffffffffffffffffffff16610f70611079565b73ffffffffffffffffffffffffffffffffffffffff1614610fc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbd90614194565b60405180910390fd5b6003600d60009054906101000a900460ff1660ff16111561101c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611013906140d4565b60405180910390fd5b600d600081819054906101000a900460ff168092919061103b90614582565b91906101000a81548160ff021916908360ff1602179055505080600b819055506000601060006101000a81548160ff02191690831515021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060600480546110d5906144d6565b80601f0160208091040260200160405190810160405280929190818152602001828054611101906144d6565b801561114e5780601f106111235761010080835404028352916020019161114e565b820191906000526020600020905b81548152906001019060200180831161113157829003601f168201915b5050505050905090565b6002600954141561119e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119590614254565b60405180910390fd5b60026009819055506001600d60009054906101000a900460ff1660ff1614806111d957506002600d60009054906101000a900460ff1660ff16145b611218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120f90614114565b60405180910390fd5b6112218261283d565b611260576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611257906140f4565b60405180910390fd5b6112718161126c611f75565b6128ef565b6112b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a790614234565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461131e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611315906141b4565b60405180910390fd5b6000611328610b56565b90507f00000000000000000000000000000000000000000000000000000000000000008382611357919061434e565b1115611398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138f90614154565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000836113c333611bfa565b6113cd919061434e565b111561140e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611405906141d4565b60405180910390fd5b6000600b5484029050803414611459576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145090614094565b60405180910390fd5b611463338561299d565b61146c846129bb565b505060016009819055505050565b600260095414156114c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b790614254565b60405180910390fd5b60026009819055506001600d60009054906101000a900460ff1660ff1614806114fb57506002600d60009054906101000a900460ff1660ff16145b61153a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153190614114565b60405180910390fd5b6115438161283d565b611582576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611579906140f4565b60405180910390fd5b601060009054906101000a900460ff166115d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c890614214565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461163f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611636906141b4565b60405180910390fd5b6000611649610b56565b90507f00000000000000000000000000000000000000000000000000000000000000008282611678919061434e565b11156116b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b090614154565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000826116e433611bfa565b6116ee919061434e565b111561172f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611726906141d4565b60405180910390fd5b6000600b548302905080341461177a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177190614094565b60405180910390fd5b611784338461299d565b61178d836129bb565b5050600160098190555050565b6117a2611f75565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611807576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611814611f75565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118c1611f75565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119069190613fb2565b60405180910390a35050565b61191d848484612034565b61193c8373ffffffffffffffffffffffffffffffffffffffff16612a28565b8015611951575061194f84848484612a4b565b155b15611988576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606119e182611f27565b611a17576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611a21612bab565b9050600081511415611a425760405180602001604052806000815250611a6d565b80611a4c84612c3d565b604051602001611a5d929190613ef0565b6040516020818303038152906040525b915050919050565b611a7d611f75565b73ffffffffffffffffffffffffffffffffffffffff16611a9b611079565b73ffffffffffffffffffffffffffffffffffffffff1614611af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae890614194565b60405180910390fd5b60008111611b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2b90614174565b60405180910390fd5b6000611b3e610b56565b90507f00000000000000000000000000000000000000000000000000000000000000008282611b6d919061434e565b1115611bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba590614154565b60405180910390fd5b611bb8838361299d565b81600a6000828254611bca919061434e565b92505081905550505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611c0582612d9e565b9050919050565b611c14611f75565b73ffffffffffffffffffffffffffffffffffffffff16611c32611079565b73ffffffffffffffffffffffffffffffffffffffff1614611c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7f90614194565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d41611f75565b73ffffffffffffffffffffffffffffffffffffffff16611d5f611079565b73ffffffffffffffffffffffffffffffffffffffff1614611db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dac90614194565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614074565b60405180910390fd5b611e2e81612779565b50565b600f5481565b611e3f611f75565b73ffffffffffffffffffffffffffffffffffffffff16611e5d611079565b73ffffffffffffffffffffffffffffffffffffffff1614611eb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eaa90614194565b60405180910390fd5b80600b8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611f3261202f565b11158015611f41575060015482105b8015611f6e575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061203f826124ea565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146120aa576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166120cb611f75565b73ffffffffffffffffffffffffffffffffffffffff1614806120fa57506120f9856120f4611f75565b611ca5565b5b8061213f5750612108611f75565b73ffffffffffffffffffffffffffffffffffffffff16612127846109bc565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612178576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156121df576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121ec8585856001612e08565b6121f860008487611f7d565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561247857600154821461247757878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124e38585856001612e0e565b5050505050565b6124f2613666565b60008290508061250061202f565b1115801561250f575060015481105b15612742576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161274057600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612624578092505050612774565b5b60011561273f57818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461273a578092505050612774565b612625565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001600d60009054906101000a900460ff1660ff161415612892577f000000000000000000000000000000000000000000000000000000000000000082600e54612889919061434e565b111590506128ea565b6002600d60009054906101000a900460ff1660ff1614156128e5577f000000000000000000000000000000000000000000000000000000000000000082600f546128dc919061434e565b111590506128ea565b600090505b919050565b600080826040516020016129039190613f4b565b6040516020818303038152906040526040516020016129229190613f14565b6040516020818303038152906040528051906020012090506129448185612e14565b73ffffffffffffffffffffffffffffffffffffffff16601060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161491505092915050565b6129b7828260405180602001604052806000815250612e3b565b5050565b6001600d60009054906101000a900460ff1660ff1614156129f05780600e60008282546129e8919061434e565b925050819055505b6002600d60009054906101000a900460ff1660ff161415612a255780600f6000828254612a1d919061434e565b925050819055505b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a71611f75565b8786866040518563ffffffff1660e01b8152600401612a939493929190613f66565b602060405180830381600087803b158015612aad57600080fd5b505af1925050508015612ade57506040513d601f19601f82011682018060405250810190612adb9190613a12565b60015b612b58573d8060008114612b0e576040519150601f19603f3d011682016040523d82523d6000602084013e612b13565b606091505b50600081511415612b50576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c8054612bba906144d6565b80601f0160208091040260200160405190810160405280929190818152602001828054612be6906144d6565b8015612c335780601f10612c0857610100808354040283529160200191612c33565b820191906000526020600020905b815481529060010190602001808311612c1657829003601f168201915b5050505050905090565b60606000821415612c85576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d99565b600082905060005b60008214612cb7578080612ca090614539565b915050600a82612cb091906143a4565b9150612c8d565b60008167ffffffffffffffff811115612cd357612cd26146c8565b5b6040519080825280601f01601f191660200182016040528015612d055781602001600182028036833780820191505090505b5090505b60008514612d9257600182612d1e91906143d5565b9150600a85612d2d91906145ac565b6030612d39919061434e565b60f81b818381518110612d4f57612d4e614699565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d8b91906143a4565b9450612d09565b8093505050505b919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b50505050565b50505050565b6000806000612e238585612e4d565b91509150612e3081612ed0565b819250505092915050565b612e4883838360016130a5565b505050565b600080604183511415612e8f5760008060006020860151925060408601519150606086015160001a9050612e8387828585613474565b94509450505050612ec9565b604083511415612ec0576000806020850151915060408501519050612eb5868383613581565b935093505050612ec9565b60006002915091505b9250929050565b60006004811115612ee457612ee361463b565b5b816004811115612ef757612ef661463b565b5b1415612f02576130a2565b60016004811115612f1657612f1561463b565b5b816004811115612f2957612f2861463b565b5b1415612f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6190614034565b60405180910390fd5b60026004811115612f7e57612f7d61463b565b5b816004811115612f9157612f9061463b565b5b1415612fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc990614054565b60405180910390fd5b60036004811115612fe657612fe561463b565b5b816004811115612ff957612ff861463b565b5b141561303a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613031906140b4565b60405180910390fd5b60048081111561304d5761304c61463b565b5b8160048111156130605761305f61463b565b5b14156130a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309890614134565b60405180910390fd5b5b50565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613113576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561314e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61315b6000868387612e08565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561332557506133248773ffffffffffffffffffffffffffffffffffffffff16612a28565b5b156133eb575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461339a6000888480600101955088612a4b565b6133d0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561332b5782600154146133e657600080fd5b613457565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156133ec575b81600181905550505061346d6000868387612e0e565b5050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156134af576000600391509150613578565b601b8560ff16141580156134c75750601c8560ff1614155b156134d9576000600491509150613578565b6000600187878787604051600081526020016040526040516134fe9493929190613fcd565b6020604051602081039080840390855afa158015613520573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561356f57600060019250925050613578565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6135c4919061434e565b90506135d287828885613474565b935093505050935093915050565b8280546135ec906144d6565b90600052602060002090601f01602090048101928261360e5760008555613655565b82601f1061362757803560ff1916838001178555613655565b82800160010185558215613655579182015b82811115613654578235825591602001919060010190613639565b5b50905061366291906136a9565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156136c25760008160009055506001016136aa565b5090565b60006136d96136d4846142cf565b6142aa565b9050828152602081018484840111156136f5576136f4614706565b5b613700848285614494565b509392505050565b60008135905061371781614aa6565b92915050565b60008135905061372c81614abd565b92915050565b60008135905061374181614ad4565b92915050565b60008151905061375681614ad4565b92915050565b600082601f830112613771576137706146fc565b5b81356137818482602086016136c6565b91505092915050565b60008083601f8401126137a05761379f6146fc565b5b8235905067ffffffffffffffff8111156137bd576137bc6146f7565b5b6020830191508360018202830111156137d9576137d8614701565b5b9250929050565b6000813590506137ef81614aeb565b92915050565b60006020828403121561380b5761380a614710565b5b600061381984828501613708565b91505092915050565b6000806040838503121561383957613838614710565b5b600061384785828601613708565b925050602061385885828601613708565b9150509250929050565b60008060006060848603121561387b5761387a614710565b5b600061388986828701613708565b935050602061389a86828701613708565b92505060406138ab868287016137e0565b9150509250925092565b600080600080608085870312156138cf576138ce614710565b5b60006138dd87828801613708565b94505060206138ee87828801613708565b93505060406138ff878288016137e0565b925050606085013567ffffffffffffffff8111156139205761391f61470b565b5b61392c8782880161375c565b91505092959194509250565b6000806040838503121561394f5761394e614710565b5b600061395d85828601613708565b925050602061396e8582860161371d565b9150509250929050565b6000806040838503121561398f5761398e614710565b5b600061399d85828601613708565b92505060206139ae858286016137e0565b9150509250929050565b6000602082840312156139ce576139cd614710565b5b60006139dc8482850161371d565b91505092915050565b6000602082840312156139fb576139fa614710565b5b6000613a0984828501613732565b91505092915050565b600060208284031215613a2857613a27614710565b5b6000613a3684828501613747565b91505092915050565b60008060208385031215613a5657613a55614710565b5b600083013567ffffffffffffffff811115613a7457613a7361470b565b5b613a808582860161378a565b92509250509250929050565b600060208284031215613aa257613aa1614710565b5b6000613ab0848285016137e0565b91505092915050565b60008060408385031215613ad057613acf614710565b5b6000613ade858286016137e0565b925050602083013567ffffffffffffffff811115613aff57613afe61470b565b5b613b0b8582860161375c565b9150509250929050565b613b1e81614409565b82525050565b613b2d8161441b565b82525050565b613b3c81614427565b82525050565b6000613b4d82614300565b613b578185614316565b9350613b678185602086016144a3565b613b7081614715565b840191505092915050565b6000613b8682614300565b613b908185614327565b9350613ba08185602086016144a3565b80840191505092915050565b6000613bb78261430b565b613bc18185614332565b9350613bd18185602086016144a3565b613bda81614715565b840191505092915050565b6000613bf08261430b565b613bfa8185614343565b9350613c0a8185602086016144a3565b80840191505092915050565b6000613c23601883614332565b9150613c2e82614726565b602082019050919050565b6000613c46601f83614332565b9150613c518261474f565b602082019050919050565b6000613c69601c83614343565b9150613c7482614778565b601c82019050919050565b6000613c8c602683614332565b9150613c97826147a1565b604082019050919050565b6000613caf600d83614332565b9150613cba826147f0565b602082019050919050565b6000613cd2602283614332565b9150613cdd82614819565b604082019050919050565b6000613cf5601b83614332565b9150613d0082614868565b602082019050919050565b6000613d18601c83614332565b9150613d2382614891565b602082019050919050565b6000613d3b600d83614332565b9150613d46826148ba565b602082019050919050565b6000613d5e602283614332565b9150613d69826148e3565b604082019050919050565b6000613d81601683614332565b9150613d8c82614932565b602082019050919050565b6000613da4601083614332565b9150613daf8261495b565b602082019050919050565b6000613dc7602083614332565b9150613dd282614984565b602082019050919050565b6000613dea601583614332565b9150613df5826149ad565b602082019050919050565b6000613e0d601583614332565b9150613e18826149d6565b602082019050919050565b6000613e30600083614327565b9150613e3b826149ff565b600082019050919050565b6000613e53601083614332565b9150613e5e82614a02565b602082019050919050565b6000613e76601883614332565b9150613e8182614a2b565b602082019050919050565b6000613e99600d83614332565b9150613ea482614a54565b602082019050919050565b6000613ebc601f83614332565b9150613ec782614a7d565b602082019050919050565b613edb8161447d565b82525050565b613eea81614487565b82525050565b6000613efc8285613be5565b9150613f088284613be5565b91508190509392505050565b6000613f1f82613c5c565b9150613f2b8284613b7b565b915081905092915050565b6000613f4182613e23565b9150819050919050565b6000602082019050613f606000830184613b15565b92915050565b6000608082019050613f7b6000830187613b15565b613f886020830186613b15565b613f956040830185613ed2565b8181036060830152613fa78184613b42565b905095945050505050565b6000602082019050613fc76000830184613b24565b92915050565b6000608082019050613fe26000830187613b33565b613fef6020830186613ee1565b613ffc6040830185613b33565b6140096060830184613b33565b95945050505050565b6000602082019050818103600083015261402c8184613bac565b905092915050565b6000602082019050818103600083015261404d81613c16565b9050919050565b6000602082019050818103600083015261406d81613c39565b9050919050565b6000602082019050818103600083015261408d81613c7f565b9050919050565b600060208201905081810360008301526140ad81613ca2565b9050919050565b600060208201905081810360008301526140cd81613cc5565b9050919050565b600060208201905081810360008301526140ed81613ce8565b9050919050565b6000602082019050818103600083015261410d81613d0b565b9050919050565b6000602082019050818103600083015261412d81613d2e565b9050919050565b6000602082019050818103600083015261414d81613d51565b9050919050565b6000602082019050818103600083015261416d81613d74565b9050919050565b6000602082019050818103600083015261418d81613d97565b9050919050565b600060208201905081810360008301526141ad81613dba565b9050919050565b600060208201905081810360008301526141cd81613ddd565b9050919050565b600060208201905081810360008301526141ed81613e00565b9050919050565b6000602082019050818103600083015261420d81613e46565b9050919050565b6000602082019050818103600083015261422d81613e69565b9050919050565b6000602082019050818103600083015261424d81613e8c565b9050919050565b6000602082019050818103600083015261426d81613eaf565b9050919050565b60006020820190506142896000830184613ed2565b92915050565b60006020820190506142a46000830184613ee1565b92915050565b60006142b46142c5565b90506142c08282614508565b919050565b6000604051905090565b600067ffffffffffffffff8211156142ea576142e96146c8565b5b6142f382614715565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006143598261447d565b91506143648361447d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614399576143986145dd565b5b828201905092915050565b60006143af8261447d565b91506143ba8361447d565b9250826143ca576143c961460c565b5b828204905092915050565b60006143e08261447d565b91506143eb8361447d565b9250828210156143fe576143fd6145dd565b5b828203905092915050565b60006144148261445d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156144c15780820151818401526020810190506144a6565b838111156144d0576000848401525b50505050565b600060028204905060018216806144ee57607f821691505b602082108114156145025761450161466a565b5b50919050565b61451182614715565b810181811067ffffffffffffffff821117156145305761452f6146c8565b5b80604052505050565b60006145448261447d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614577576145766145dd565b5b600182019050919050565b600061458d82614487565b915060ff8214156145a1576145a06145dd565b5b600182019050919050565b60006145b78261447d565b91506145c28361447d565b9250826145d2576145d161460c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f77726f6e67207061796d656e7400000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f53746167652063616e6e6f74206265206d6f7265207468616e20330000000000600082015250565b7f4578636565642073746167652073616c6573206d6178206c696d697400000000600082015250565b7f696e76616c696420737461676500000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565642073616c6573206d6178206c696d697400000000000000000000600082015250565b7f5175616e7469747920746f6f206c6f7700000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f436f6e747261637473206e6f7420616c6c6f7765640000000000000000000000600082015250565b7f63616e6e6f74206d696e742074686973206d616e790000000000000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f7075626c69632073616c6573206e6f74206f70656e696e670000000000000000600082015250565b7f566572696679206661696c656400000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b614aaf81614409565b8114614aba57600080fd5b50565b614ac68161441b565b8114614ad157600080fd5b50565b614add81614431565b8114614ae857600080fd5b50565b614af48161447d565b8114614aff57600080fd5b5056fea26469706673582212205dcec933fa8d1e721e69db825bfeda0197e4c68c3635441edf64a91e128e1e6564736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d56776359567961506a64427262374355545271584166717a39764761523571776d65667a776a76645056476d2f00000000000000000000
Deployed Bytecode
0x60806040526004361061020f5760003560e01c80638da5cb5b11610118578063c87b56dd116100a0578063e4469dee1161006f578063e4469dee1461075f578063e985e9c514610788578063f2fde38b146107c5578063f3e20c3b146107ee578063f4a0a528146108195761020f565b8063c87b56dd14610691578063cc47a40b146106ce578063d6b0129c146106f7578063dc33e681146107225761020f565b8063a0712d68116100e7578063a0712d68146105cd578063a22cb465146105e9578063b88d4fde14610612578063c1dffe321461063b578063c7a95480146106665761020f565b80638da5cb5b146105305780639193cfec1461055b57806395d89b41146105865780639e852f75146105b15761020f565b806340a86a121161019b57806355f804b31161016a57806355f804b31461044d5780636352211e1461047657806370a08231146104b3578063715018a6146104f0578063894edcd4146105075761020f565b806340a86a12146103a357806342842e0e146103ce57806345915899146103f757806351b304b1146104225761020f565b8063095ea7b3116101e2578063095ea7b3146102e457806316396b631461030d57806318160ddd1461033857806323b872dd146103635780633ccfd60b1461038c5761020f565b806301ffc9a7146102145780630387da421461025157806306fdde031461027c578063081812fc146102a7575b600080fd5b34801561022057600080fd5b5061023b600480360381019061023691906139e5565b610842565b6040516102489190613fb2565b60405180910390f35b34801561025d57600080fd5b50610266610924565b6040516102739190614274565b60405180910390f35b34801561028857600080fd5b5061029161092a565b60405161029e9190614012565b60405180910390f35b3480156102b357600080fd5b506102ce60048036038101906102c99190613a8c565b6109bc565b6040516102db9190613f4b565b60405180910390f35b3480156102f057600080fd5b5061030b60048036038101906103069190613978565b610a38565b005b34801561031957600080fd5b50610322610b43565b60405161032f919061428f565b60405180910390f35b34801561034457600080fd5b5061034d610b56565b60405161035a9190614274565b60405180910390f35b34801561036f57600080fd5b5061038a60048036038101906103859190613862565b610b6d565b005b34801561039857600080fd5b506103a1610b7d565b005b3480156103af57600080fd5b506103b8610d0b565b6040516103c59190614274565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f09190613862565b610d11565b005b34801561040357600080fd5b5061040c610d31565b6040516104199190613fb2565b60405180910390f35b34801561042e57600080fd5b50610437610d44565b6040516104449190614274565b60405180910390f35b34801561045957600080fd5b50610474600480360381019061046f9190613a3f565b610d4a565b005b34801561048257600080fd5b5061049d60048036038101906104989190613a8c565b610ddc565b6040516104aa9190613f4b565b60405180910390f35b3480156104bf57600080fd5b506104da60048036038101906104d591906137f5565b610df2565b6040516104e79190614274565b60405180910390f35b3480156104fc57600080fd5b50610505610ec2565b005b34801561051357600080fd5b5061052e60048036038101906105299190613a8c565b610f4a565b005b34801561053c57600080fd5b50610545611079565b6040516105529190613f4b565b60405180910390f35b34801561056757600080fd5b506105706110a2565b60405161057d9190614274565b60405180910390f35b34801561059257600080fd5b5061059b6110c6565b6040516105a89190614012565b60405180910390f35b6105cb60048036038101906105c69190613ab9565b611158565b005b6105e760048036038101906105e29190613a8c565b61147a565b005b3480156105f557600080fd5b50610610600480360381019061060b9190613938565b61179a565b005b34801561061e57600080fd5b50610639600480360381019061063491906138b5565b611912565b005b34801561064757600080fd5b5061065061198e565b60405161065d9190614274565b60405180910390f35b34801561067257600080fd5b5061067b6119b2565b6040516106889190614274565b60405180910390f35b34801561069d57600080fd5b506106b860048036038101906106b39190613a8c565b6119d6565b6040516106c59190614012565b60405180910390f35b3480156106da57600080fd5b506106f560048036038101906106f09190613978565b611a75565b005b34801561070357600080fd5b5061070c611bd6565b6040516107199190614274565b60405180910390f35b34801561072e57600080fd5b50610749600480360381019061074491906137f5565b611bfa565b6040516107569190614274565b60405180910390f35b34801561076b57600080fd5b50610786600480360381019061078191906139b8565b611c0c565b005b34801561079457600080fd5b506107af60048036038101906107aa9190613822565b611ca5565b6040516107bc9190613fb2565b60405180910390f35b3480156107d157600080fd5b506107ec60048036038101906107e791906137f5565b611d39565b005b3480156107fa57600080fd5b50610803611e31565b6040516108109190614274565b60405180910390f35b34801561082557600080fd5b50610840600480360381019061083b9190613a8c565b611e37565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061091d575061091c82611ebd565b5b9050919050565b600b5481565b606060038054610939906144d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610965906144d6565b80156109b25780601f10610987576101008083540402835291602001916109b2565b820191906000526020600020905b81548152906001019060200180831161099557829003601f168201915b5050505050905090565b60006109c782611f27565b6109fd576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a4382610ddc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aab576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610aca611f75565b73ffffffffffffffffffffffffffffffffffffffff1614158015610afc5750610afa81610af5611f75565b611ca5565b155b15610b33576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b3e838383611f7d565b505050565b600d60009054906101000a900460ff1681565b6000610b6061202f565b6002546001540303905090565b610b78838383612034565b505050565b60026009541415610bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bba90614254565b60405180910390fd5b6002600981905550610bd3611f75565b73ffffffffffffffffffffffffffffffffffffffff16610bf1611079565b73ffffffffffffffffffffffffffffffffffffffff1614610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e90614194565b60405180910390fd5b60004790506000610c56611f75565b73ffffffffffffffffffffffffffffffffffffffff1682604051610c7990613f36565b60006040518083038185875af1925050503d8060008114610cb6576040519150601f19603f3d011682016040523d82523d6000602084013e610cbb565b606091505b5050905080610cff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf6906141f4565b60405180910390fd5b50506001600981905550565b600a5481565b610d2c83838360405180602001604052806000815250611912565b505050565b601060009054906101000a900460ff1681565b600e5481565b610d52611f75565b73ffffffffffffffffffffffffffffffffffffffff16610d70611079565b73ffffffffffffffffffffffffffffffffffffffff1614610dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbd90614194565b60405180910390fd5b8181600c9190610dd79291906135e0565b505050565b6000610de7826124ea565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e5a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610eca611f75565b73ffffffffffffffffffffffffffffffffffffffff16610ee8611079565b73ffffffffffffffffffffffffffffffffffffffff1614610f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3590614194565b60405180910390fd5b610f486000612779565b565b610f52611f75565b73ffffffffffffffffffffffffffffffffffffffff16610f70611079565b73ffffffffffffffffffffffffffffffffffffffff1614610fc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbd90614194565b60405180910390fd5b6003600d60009054906101000a900460ff1660ff16111561101c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611013906140d4565b60405180910390fd5b600d600081819054906101000a900460ff168092919061103b90614582565b91906101000a81548160ff021916908360ff1602179055505080600b819055506000601060006101000a81548160ff02191690831515021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f00000000000000000000000000000000000000000000000000000000000000c881565b6060600480546110d5906144d6565b80601f0160208091040260200160405190810160405280929190818152602001828054611101906144d6565b801561114e5780601f106111235761010080835404028352916020019161114e565b820191906000526020600020905b81548152906001019060200180831161113157829003601f168201915b5050505050905090565b6002600954141561119e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119590614254565b60405180910390fd5b60026009819055506001600d60009054906101000a900460ff1660ff1614806111d957506002600d60009054906101000a900460ff1660ff16145b611218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120f90614114565b60405180910390fd5b6112218261283d565b611260576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611257906140f4565b60405180910390fd5b6112718161126c611f75565b6128ef565b6112b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a790614234565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461131e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611315906141b4565b60405180910390fd5b6000611328610b56565b90507f00000000000000000000000000000000000000000000000000000000000004008382611357919061434e565b1115611398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138f90614154565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000001836113c333611bfa565b6113cd919061434e565b111561140e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611405906141d4565b60405180910390fd5b6000600b5484029050803414611459576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145090614094565b60405180910390fd5b611463338561299d565b61146c846129bb565b505060016009819055505050565b600260095414156114c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b790614254565b60405180910390fd5b60026009819055506001600d60009054906101000a900460ff1660ff1614806114fb57506002600d60009054906101000a900460ff1660ff16145b61153a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153190614114565b60405180910390fd5b6115438161283d565b611582576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611579906140f4565b60405180910390fd5b601060009054906101000a900460ff166115d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c890614214565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461163f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611636906141b4565b60405180910390fd5b6000611649610b56565b90507f00000000000000000000000000000000000000000000000000000000000004008282611678919061434e565b11156116b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b090614154565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000001826116e433611bfa565b6116ee919061434e565b111561172f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611726906141d4565b60405180910390fd5b6000600b548302905080341461177a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177190614094565b60405180910390fd5b611784338461299d565b61178d836129bb565b5050600160098190555050565b6117a2611f75565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611807576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611814611f75565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118c1611f75565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119069190613fb2565b60405180910390a35050565b61191d848484612034565b61193c8373ffffffffffffffffffffffffffffffffffffffff16612a28565b8015611951575061194f84848484612a4b565b155b15611988576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b7f000000000000000000000000000000000000000000000000000000000000000181565b7f000000000000000000000000000000000000000000000000000000000000040081565b60606119e182611f27565b611a17576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611a21612bab565b9050600081511415611a425760405180602001604052806000815250611a6d565b80611a4c84612c3d565b604051602001611a5d929190613ef0565b6040516020818303038152906040525b915050919050565b611a7d611f75565b73ffffffffffffffffffffffffffffffffffffffff16611a9b611079565b73ffffffffffffffffffffffffffffffffffffffff1614611af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae890614194565b60405180910390fd5b60008111611b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2b90614174565b60405180910390fd5b6000611b3e610b56565b90507f00000000000000000000000000000000000000000000000000000000000004008282611b6d919061434e565b1115611bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba590614154565b60405180910390fd5b611bb8838361299d565b81600a6000828254611bca919061434e565b92505081905550505050565b7f000000000000000000000000000000000000000000000000000000000000032081565b6000611c0582612d9e565b9050919050565b611c14611f75565b73ffffffffffffffffffffffffffffffffffffffff16611c32611079565b73ffffffffffffffffffffffffffffffffffffffff1614611c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7f90614194565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d41611f75565b73ffffffffffffffffffffffffffffffffffffffff16611d5f611079565b73ffffffffffffffffffffffffffffffffffffffff1614611db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dac90614194565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614074565b60405180910390fd5b611e2e81612779565b50565b600f5481565b611e3f611f75565b73ffffffffffffffffffffffffffffffffffffffff16611e5d611079565b73ffffffffffffffffffffffffffffffffffffffff1614611eb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eaa90614194565b60405180910390fd5b80600b8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611f3261202f565b11158015611f41575060015482105b8015611f6e575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061203f826124ea565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146120aa576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166120cb611f75565b73ffffffffffffffffffffffffffffffffffffffff1614806120fa57506120f9856120f4611f75565b611ca5565b5b8061213f5750612108611f75565b73ffffffffffffffffffffffffffffffffffffffff16612127846109bc565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612178576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156121df576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121ec8585856001612e08565b6121f860008487611f7d565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561247857600154821461247757878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124e38585856001612e0e565b5050505050565b6124f2613666565b60008290508061250061202f565b1115801561250f575060015481105b15612742576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161274057600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612624578092505050612774565b5b60011561273f57818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461273a578092505050612774565b612625565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001600d60009054906101000a900460ff1660ff161415612892577f00000000000000000000000000000000000000000000000000000000000000c882600e54612889919061434e565b111590506128ea565b6002600d60009054906101000a900460ff1660ff1614156128e5577f000000000000000000000000000000000000000000000000000000000000032082600f546128dc919061434e565b111590506128ea565b600090505b919050565b600080826040516020016129039190613f4b565b6040516020818303038152906040526040516020016129229190613f14565b6040516020818303038152906040528051906020012090506129448185612e14565b73ffffffffffffffffffffffffffffffffffffffff16601060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161491505092915050565b6129b7828260405180602001604052806000815250612e3b565b5050565b6001600d60009054906101000a900460ff1660ff1614156129f05780600e60008282546129e8919061434e565b925050819055505b6002600d60009054906101000a900460ff1660ff161415612a255780600f6000828254612a1d919061434e565b925050819055505b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a71611f75565b8786866040518563ffffffff1660e01b8152600401612a939493929190613f66565b602060405180830381600087803b158015612aad57600080fd5b505af1925050508015612ade57506040513d601f19601f82011682018060405250810190612adb9190613a12565b60015b612b58573d8060008114612b0e576040519150601f19603f3d011682016040523d82523d6000602084013e612b13565b606091505b50600081511415612b50576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c8054612bba906144d6565b80601f0160208091040260200160405190810160405280929190818152602001828054612be6906144d6565b8015612c335780601f10612c0857610100808354040283529160200191612c33565b820191906000526020600020905b815481529060010190602001808311612c1657829003601f168201915b5050505050905090565b60606000821415612c85576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d99565b600082905060005b60008214612cb7578080612ca090614539565b915050600a82612cb091906143a4565b9150612c8d565b60008167ffffffffffffffff811115612cd357612cd26146c8565b5b6040519080825280601f01601f191660200182016040528015612d055781602001600182028036833780820191505090505b5090505b60008514612d9257600182612d1e91906143d5565b9150600a85612d2d91906145ac565b6030612d39919061434e565b60f81b818381518110612d4f57612d4e614699565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d8b91906143a4565b9450612d09565b8093505050505b919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b50505050565b50505050565b6000806000612e238585612e4d565b91509150612e3081612ed0565b819250505092915050565b612e4883838360016130a5565b505050565b600080604183511415612e8f5760008060006020860151925060408601519150606086015160001a9050612e8387828585613474565b94509450505050612ec9565b604083511415612ec0576000806020850151915060408501519050612eb5868383613581565b935093505050612ec9565b60006002915091505b9250929050565b60006004811115612ee457612ee361463b565b5b816004811115612ef757612ef661463b565b5b1415612f02576130a2565b60016004811115612f1657612f1561463b565b5b816004811115612f2957612f2861463b565b5b1415612f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6190614034565b60405180910390fd5b60026004811115612f7e57612f7d61463b565b5b816004811115612f9157612f9061463b565b5b1415612fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc990614054565b60405180910390fd5b60036004811115612fe657612fe561463b565b5b816004811115612ff957612ff861463b565b5b141561303a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613031906140b4565b60405180910390fd5b60048081111561304d5761304c61463b565b5b8160048111156130605761305f61463b565b5b14156130a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309890614134565b60405180910390fd5b5b50565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613113576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561314e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61315b6000868387612e08565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561332557506133248773ffffffffffffffffffffffffffffffffffffffff16612a28565b5b156133eb575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461339a6000888480600101955088612a4b565b6133d0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561332b5782600154146133e657600080fd5b613457565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156133ec575b81600181905550505061346d6000868387612e0e565b5050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156134af576000600391509150613578565b601b8560ff16141580156134c75750601c8560ff1614155b156134d9576000600491509150613578565b6000600187878787604051600081526020016040526040516134fe9493929190613fcd565b6020604051602081039080840390855afa158015613520573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561356f57600060019250925050613578565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6135c4919061434e565b90506135d287828885613474565b935093505050935093915050565b8280546135ec906144d6565b90600052602060002090601f01602090048101928261360e5760008555613655565b82601f1061362757803560ff1916838001178555613655565b82800160010185558215613655579182015b82811115613654578235825591602001919060010190613639565b5b50905061366291906136a9565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156136c25760008160009055506001016136aa565b5090565b60006136d96136d4846142cf565b6142aa565b9050828152602081018484840111156136f5576136f4614706565b5b613700848285614494565b509392505050565b60008135905061371781614aa6565b92915050565b60008135905061372c81614abd565b92915050565b60008135905061374181614ad4565b92915050565b60008151905061375681614ad4565b92915050565b600082601f830112613771576137706146fc565b5b81356137818482602086016136c6565b91505092915050565b60008083601f8401126137a05761379f6146fc565b5b8235905067ffffffffffffffff8111156137bd576137bc6146f7565b5b6020830191508360018202830111156137d9576137d8614701565b5b9250929050565b6000813590506137ef81614aeb565b92915050565b60006020828403121561380b5761380a614710565b5b600061381984828501613708565b91505092915050565b6000806040838503121561383957613838614710565b5b600061384785828601613708565b925050602061385885828601613708565b9150509250929050565b60008060006060848603121561387b5761387a614710565b5b600061388986828701613708565b935050602061389a86828701613708565b92505060406138ab868287016137e0565b9150509250925092565b600080600080608085870312156138cf576138ce614710565b5b60006138dd87828801613708565b94505060206138ee87828801613708565b93505060406138ff878288016137e0565b925050606085013567ffffffffffffffff8111156139205761391f61470b565b5b61392c8782880161375c565b91505092959194509250565b6000806040838503121561394f5761394e614710565b5b600061395d85828601613708565b925050602061396e8582860161371d565b9150509250929050565b6000806040838503121561398f5761398e614710565b5b600061399d85828601613708565b92505060206139ae858286016137e0565b9150509250929050565b6000602082840312156139ce576139cd614710565b5b60006139dc8482850161371d565b91505092915050565b6000602082840312156139fb576139fa614710565b5b6000613a0984828501613732565b91505092915050565b600060208284031215613a2857613a27614710565b5b6000613a3684828501613747565b91505092915050565b60008060208385031215613a5657613a55614710565b5b600083013567ffffffffffffffff811115613a7457613a7361470b565b5b613a808582860161378a565b92509250509250929050565b600060208284031215613aa257613aa1614710565b5b6000613ab0848285016137e0565b91505092915050565b60008060408385031215613ad057613acf614710565b5b6000613ade858286016137e0565b925050602083013567ffffffffffffffff811115613aff57613afe61470b565b5b613b0b8582860161375c565b9150509250929050565b613b1e81614409565b82525050565b613b2d8161441b565b82525050565b613b3c81614427565b82525050565b6000613b4d82614300565b613b578185614316565b9350613b678185602086016144a3565b613b7081614715565b840191505092915050565b6000613b8682614300565b613b908185614327565b9350613ba08185602086016144a3565b80840191505092915050565b6000613bb78261430b565b613bc18185614332565b9350613bd18185602086016144a3565b613bda81614715565b840191505092915050565b6000613bf08261430b565b613bfa8185614343565b9350613c0a8185602086016144a3565b80840191505092915050565b6000613c23601883614332565b9150613c2e82614726565b602082019050919050565b6000613c46601f83614332565b9150613c518261474f565b602082019050919050565b6000613c69601c83614343565b9150613c7482614778565b601c82019050919050565b6000613c8c602683614332565b9150613c97826147a1565b604082019050919050565b6000613caf600d83614332565b9150613cba826147f0565b602082019050919050565b6000613cd2602283614332565b9150613cdd82614819565b604082019050919050565b6000613cf5601b83614332565b9150613d0082614868565b602082019050919050565b6000613d18601c83614332565b9150613d2382614891565b602082019050919050565b6000613d3b600d83614332565b9150613d46826148ba565b602082019050919050565b6000613d5e602283614332565b9150613d69826148e3565b604082019050919050565b6000613d81601683614332565b9150613d8c82614932565b602082019050919050565b6000613da4601083614332565b9150613daf8261495b565b602082019050919050565b6000613dc7602083614332565b9150613dd282614984565b602082019050919050565b6000613dea601583614332565b9150613df5826149ad565b602082019050919050565b6000613e0d601583614332565b9150613e18826149d6565b602082019050919050565b6000613e30600083614327565b9150613e3b826149ff565b600082019050919050565b6000613e53601083614332565b9150613e5e82614a02565b602082019050919050565b6000613e76601883614332565b9150613e8182614a2b565b602082019050919050565b6000613e99600d83614332565b9150613ea482614a54565b602082019050919050565b6000613ebc601f83614332565b9150613ec782614a7d565b602082019050919050565b613edb8161447d565b82525050565b613eea81614487565b82525050565b6000613efc8285613be5565b9150613f088284613be5565b91508190509392505050565b6000613f1f82613c5c565b9150613f2b8284613b7b565b915081905092915050565b6000613f4182613e23565b9150819050919050565b6000602082019050613f606000830184613b15565b92915050565b6000608082019050613f7b6000830187613b15565b613f886020830186613b15565b613f956040830185613ed2565b8181036060830152613fa78184613b42565b905095945050505050565b6000602082019050613fc76000830184613b24565b92915050565b6000608082019050613fe26000830187613b33565b613fef6020830186613ee1565b613ffc6040830185613b33565b6140096060830184613b33565b95945050505050565b6000602082019050818103600083015261402c8184613bac565b905092915050565b6000602082019050818103600083015261404d81613c16565b9050919050565b6000602082019050818103600083015261406d81613c39565b9050919050565b6000602082019050818103600083015261408d81613c7f565b9050919050565b600060208201905081810360008301526140ad81613ca2565b9050919050565b600060208201905081810360008301526140cd81613cc5565b9050919050565b600060208201905081810360008301526140ed81613ce8565b9050919050565b6000602082019050818103600083015261410d81613d0b565b9050919050565b6000602082019050818103600083015261412d81613d2e565b9050919050565b6000602082019050818103600083015261414d81613d51565b9050919050565b6000602082019050818103600083015261416d81613d74565b9050919050565b6000602082019050818103600083015261418d81613d97565b9050919050565b600060208201905081810360008301526141ad81613dba565b9050919050565b600060208201905081810360008301526141cd81613ddd565b9050919050565b600060208201905081810360008301526141ed81613e00565b9050919050565b6000602082019050818103600083015261420d81613e46565b9050919050565b6000602082019050818103600083015261422d81613e69565b9050919050565b6000602082019050818103600083015261424d81613e8c565b9050919050565b6000602082019050818103600083015261426d81613eaf565b9050919050565b60006020820190506142896000830184613ed2565b92915050565b60006020820190506142a46000830184613ee1565b92915050565b60006142b46142c5565b90506142c08282614508565b919050565b6000604051905090565b600067ffffffffffffffff8211156142ea576142e96146c8565b5b6142f382614715565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006143598261447d565b91506143648361447d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614399576143986145dd565b5b828201905092915050565b60006143af8261447d565b91506143ba8361447d565b9250826143ca576143c961460c565b5b828204905092915050565b60006143e08261447d565b91506143eb8361447d565b9250828210156143fe576143fd6145dd565b5b828203905092915050565b60006144148261445d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156144c15780820151818401526020810190506144a6565b838111156144d0576000848401525b50505050565b600060028204905060018216806144ee57607f821691505b602082108114156145025761450161466a565b5b50919050565b61451182614715565b810181811067ffffffffffffffff821117156145305761452f6146c8565b5b80604052505050565b60006145448261447d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614577576145766145dd565b5b600182019050919050565b600061458d82614487565b915060ff8214156145a1576145a06145dd565b5b600182019050919050565b60006145b78261447d565b91506145c28361447d565b9250826145d2576145d161460c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f77726f6e67207061796d656e7400000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f53746167652063616e6e6f74206265206d6f7265207468616e20330000000000600082015250565b7f4578636565642073746167652073616c6573206d6178206c696d697400000000600082015250565b7f696e76616c696420737461676500000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565642073616c6573206d6178206c696d697400000000000000000000600082015250565b7f5175616e7469747920746f6f206c6f7700000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f436f6e747261637473206e6f7420616c6c6f7765640000000000000000000000600082015250565b7f63616e6e6f74206d696e742074686973206d616e790000000000000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f7075626c69632073616c6573206e6f74206f70656e696e670000000000000000600082015250565b7f566572696679206661696c656400000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b614aaf81614409565b8114614aba57600080fd5b50565b614ac68161441b565b8114614ad157600080fd5b50565b614add81614431565b8114614ae857600080fd5b50565b614af48161447d565b8114614aff57600080fd5b5056fea26469706673582212205dcec933fa8d1e721e69db825bfeda0197e4c68c3635441edf64a91e128e1e6564736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d56776359567961506a64427262374355545271584166717a39764761523571776d65667a776a76645056476d2f00000000000000000000
-----Decoded View---------------
Arg [0] : baseURI (string): ipfs://QmVwcYVyaPjdBrb7CUTRqXAfqz9vGaR5qwmefzwjvdPVGm/
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [2] : 697066733a2f2f516d56776359567961506a6442726237435554527158416671
Arg [3] : 7a39764761523571776d65667a776a76645056476d2f00000000000000000000
Deployed Bytecode Sourcemap
57097:4632:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36735:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57235:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39848:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41351:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40914:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57535:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35984:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42216:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61503:223;;;;;;;;;;;;;:::i;:::-;;57200:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42457:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57745:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57659:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60893:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39656:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37104:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56193:103;;;;;;;;;;;;;:::i;:::-;;57978:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55542:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57563:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40017:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58748:827;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59581:773;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41627:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42713:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57265:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57157:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40192:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58426:316;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57611:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60666:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58300:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41985:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56451:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57702:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58199:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36735:305;36837:4;36889:25;36874:40;;;:11;:40;;;;:105;;;;36946:33;36931:48;;;:11;:48;;;;36874:105;:158;;;;36996:36;37020:11;36996:23;:36::i;:::-;36874:158;36854:178;;36735:305;;;:::o;57235:25::-;;;;:::o;39848:100::-;39902:13;39935:5;39928:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39848:100;:::o;41351:204::-;41419:7;41444:16;41452:7;41444;:16::i;:::-;41439:64;;41469:34;;;;;;;;;;;;;;41439:64;41523:15;:24;41539:7;41523:24;;;;;;;;;;;;;;;;;;;;;41516:31;;41351:204;;;:::o;40914:371::-;40987:13;41003:24;41019:7;41003:15;:24::i;:::-;40987:40;;41048:5;41042:11;;:2;:11;;;41038:48;;;41062:24;;;;;;;;;;;;;;41038:48;41119:5;41103:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;41129:37;41146:5;41153:12;:10;:12::i;:::-;41129:16;:37::i;:::-;41128:38;41103:63;41099:138;;;41190:35;;;;;;;;;;;;;;41099:138;41249:28;41258:2;41262:7;41271:5;41249:8;:28::i;:::-;40976:309;40914:371;;:::o;57535:23::-;;;;;;;;;;;;;:::o;35984:303::-;36028:7;36253:15;:13;:15::i;:::-;36238:12;;36222:13;;:28;:46;36215:53;;35984:303;:::o;42216:170::-;42350:28;42360:4;42366:2;42370:7;42350:9;:28::i;:::-;42216:170;;;:::o;61503:223::-;30625:1;31223:7;;:19;;31215:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;30625:1;31356:7;:18;;;;55773:12:::1;:10;:12::i;:::-;55762:23;;:7;:5;:7::i;:::-;:23;;;55754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61562:15:::2;61580:21;61562:39;;61609:13;61636:12;:10;:12::i;:::-;61628:26;;61663:7;61628:48;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61608:68;;;61691:8;61683:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;61555:171;;30581:1:::0;31535:7;:22;;;;61503:223::o;57200:30::-;;;;:::o;42457:185::-;42595:39;42612:4;42618:2;42622:7;42595:39;;;;;;;;;;;;:16;:39::i;:::-;42457:185;;;:::o;57745:37::-;;;;;;;;;;;;;:::o;57659:38::-;;;;:::o;60893:100::-;55773:12;:10;:12::i;:::-;55762:23;;:7;:5;:7::i;:::-;:23;;;55754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60980:7:::1;;60964:13;:23;;;;;;;:::i;:::-;;60893:100:::0;;:::o;39656:125::-;39720:7;39747:21;39760:7;39747:12;:21::i;:::-;:26;;;39740:33;;39656:125;;;:::o;37104:206::-;37168:7;37209:1;37192:19;;:5;:19;;;37188:60;;;37220:28;;;;;;;;;;;;;;37188:60;37274:12;:19;37287:5;37274:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;37266:36;;37259:43;;37104:206;;;:::o;56193:103::-;55773:12;:10;:12::i;:::-;55762:23;;:7;:5;:7::i;:::-;:23;;;55754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56258:30:::1;56285:1;56258:18;:30::i;:::-;56193:103::o:0;57978:215::-;55773:12;:10;:12::i;:::-;55762:23;;:7;:5;:7::i;:::-;:23;;;55754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58069:1:::1;58059:6;;;;;;;;;;;:11;;;;58051:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;58109:6;;:8;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;58137:18;58124:10;:31;;;;58182:5;58162:17;;:25;;;;;;;;;;;;;;;;;;57978:215:::0;:::o;55542:87::-;55588:7;55615:6;;;;;;;;;;;55608:13;;55542:87;:::o;57563:43::-;;;:::o;40017:104::-;40073:13;40106:7;40099:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40017:104;:::o;58748:827::-;30625:1;31223:7;;:19;;31215:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;30625:1;31356:7;:18;;;;58886:1:::1;58876:6;;;;;;;;;;;:11;;;:26;;;;58901:1;58891:6;;;;;;;;;;;:11;;;58876:26;58868:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;58935:29;58955:8;58935:19;:29::i;:::-;58927:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;59014:31;59021:9;59032:12;:10;:12::i;:::-;59014:6;:31::i;:::-;59006:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;59093:10;59080:23;;:9;:23;;;59072:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;59136:19;59158:13;:11;:13::i;:::-;59136:35;;59212:6;59200:8;59186:11;:22;;;;:::i;:::-;:32;;59178:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;59307:14;59295:8;59268:24;59281:10;59268:12;:24::i;:::-;:35;;;;:::i;:::-;:53;;59252:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;59369:12;59425:10;;59414:8;:21;59407:28;;59470:4;59457:9;:17;59449:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;59501:31;59511:10;59523:8;59501:9;:31::i;:::-;59539:30;59560:8;59539:20;:30::i;:::-;58861:714;;30581:1:::0;31535:7;:22;;;;58748:827;;:::o;59581:773::-;30625:1;31223:7;;:19;;31215:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;30625:1;31356:7;:18;;;;59668:1:::1;59658:6;;;;;;;;;;;:11;;;:26;;;;59683:1;59673:6;;;;;;;;;;;:11;;;59658:26;59650:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;59717:29;59737:8;59717:19;:29::i;:::-;59709:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;59796:17;;;;;;;;;;;59788:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;59872:10;59859:23;;:9;:23;;;59851:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;59915:19;59937:13;:11;:13::i;:::-;59915:35;;59991:6;59979:8;59965:11;:22;;;;:::i;:::-;:32;;59957:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;60086:14;60074:8;60047:24;60060:10;60047:12;:24::i;:::-;:35;;;;:::i;:::-;:53;;60031:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;60148:12;60204:10;;60193:8;:21;60186:28;;60249:4;60236:9;:17;60228:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;60280:31;60290:10;60302:8;60280:9;:31::i;:::-;60318:30;60339:8;60318:20;:30::i;:::-;59643:711;;30581:1:::0;31535:7;:22;;;;59581:773;:::o;41627:287::-;41738:12;:10;:12::i;:::-;41726:24;;:8;:24;;;41722:54;;;41759:17;;;;;;;;;;;;;;41722:54;41834:8;41789:18;:32;41808:12;:10;:12::i;:::-;41789:32;;;;;;;;;;;;;;;:42;41822:8;41789:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;41887:8;41858:48;;41873:12;:10;:12::i;:::-;41858:48;;;41897:8;41858:48;;;;;;:::i;:::-;;;;;;;;41627:287;;:::o;42713:369::-;42880:28;42890:4;42896:2;42900:7;42880:9;:28::i;:::-;42923:15;:2;:13;;;:15::i;:::-;:76;;;;;42943:56;42974:4;42980:2;42984:7;42993:5;42943:30;:56::i;:::-;42942:57;42923:76;42919:156;;;43023:40;;;;;;;;;;;;;;42919:156;42713:369;;;;:::o;57265:43::-;;;:::o;57157:38::-;;;:::o;40192:318::-;40265:13;40296:16;40304:7;40296;:16::i;:::-;40291:59;;40321:29;;;;;;;;;;;;;;40291:59;40363:21;40387:10;:8;:10::i;:::-;40363:34;;40440:1;40421:7;40415:21;:26;;:87;;;;;;;;;;;;;;;;;40468:7;40477:18;:7;:16;:18::i;:::-;40451:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40415:87;40408:94;;;40192:318;;;:::o;58426:316::-;55773:12;:10;:12::i;:::-;55762:23;;:7;:5;:7::i;:::-;:23;;;55754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58525:1:::1;58514:8;:12;58506:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;58554:19;58576:13;:11;:13::i;:::-;58554:35;;58630:6;58618:8;58604:11;:22;;;;:::i;:::-;:32;;58596:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;58672:30;58682:9;58693:8;58672:9;:30::i;:::-;58728:8;58709:15;;:27;;;;;;;:::i;:::-;;;;;;;;58499:243;58426:316:::0;;:::o;57611:43::-;;;:::o;60666:107::-;60724:7;60747:20;60761:5;60747:13;:20::i;:::-;60740:27;;60666:107;;;:::o;58300:120::-;55773:12;:10;:12::i;:::-;55762:23;;:7;:5;:7::i;:::-;:23;;;55754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58398:16:::1;58378:17;;:36;;;;;;;;;;;;;;;;;;58300:120:::0;:::o;41985:164::-;42082:4;42106:18;:25;42125:5;42106:25;;;;;;;;;;;;;;;:35;42132:8;42106:35;;;;;;;;;;;;;;;;;;;;;;;;;42099:42;;41985:164;;;;:::o;56451:201::-;55773:12;:10;:12::i;:::-;55762:23;;:7;:5;:7::i;:::-;:23;;;55754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56560:1:::1;56540:22;;:8;:22;;;;56532:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;56616:28;56635:8;56616:18;:28::i;:::-;56451:201:::0;:::o;57702:38::-;;;;:::o;58199:95::-;55773:12;:10;:12::i;:::-;55762:23;;:7;:5;:7::i;:::-;:23;;;55754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58279:9:::1;58266:10;:22;;;;58199:95:::0;:::o;22974:157::-;23059:4;23098:25;23083:40;;;:11;:40;;;;23076:47;;22974:157;;;:::o;43337:174::-;43394:4;43437:7;43418:15;:13;:15::i;:::-;:26;;:53;;;;;43458:13;;43448:7;:23;43418:53;:85;;;;;43476:11;:20;43488:7;43476:20;;;;;;;;;;;:27;;;;;;;;;;;;43475:28;43418:85;43411:92;;43337:174;;;:::o;32251:98::-;32304:7;32331:10;32324:17;;32251:98;:::o;51494:196::-;51636:2;51609:15;:24;51625:7;51609:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;51674:7;51670:2;51654:28;;51663:5;51654:28;;;;;;;;;;;;51494:196;;;:::o;35758:92::-;35814:7;35758:92;:::o;46437:2130::-;46552:35;46590:21;46603:7;46590:12;:21::i;:::-;46552:59;;46650:4;46628:26;;:13;:18;;;:26;;;46624:67;;46663:28;;;;;;;;;;;;;;46624:67;46704:22;46746:4;46730:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;46767:36;46784:4;46790:12;:10;:12::i;:::-;46767:16;:36::i;:::-;46730:73;:126;;;;46844:12;:10;:12::i;:::-;46820:36;;:20;46832:7;46820:11;:20::i;:::-;:36;;;46730:126;46704:153;;46875:17;46870:66;;46901:35;;;;;;;;;;;;;;46870:66;46965:1;46951:16;;:2;:16;;;46947:52;;;46976:23;;;;;;;;;;;;;;46947:52;47012:43;47034:4;47040:2;47044:7;47053:1;47012:21;:43::i;:::-;47120:35;47137:1;47141:7;47150:4;47120:8;:35::i;:::-;47481:1;47451:12;:18;47464:4;47451:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47525:1;47497:12;:16;47510:2;47497:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47543:31;47577:11;:20;47589:7;47577:20;;;;;;;;;;;47543:54;;47628:2;47612:8;:13;;;:18;;;;;;;;;;;;;;;;;;47678:15;47645:8;:23;;;:49;;;;;;;;;;;;;;;;;;47946:19;47978:1;47968:7;:11;47946:33;;47994:31;48028:11;:24;48040:11;48028:24;;;;;;;;;;;47994:58;;48096:1;48071:27;;:8;:13;;;;;;;;;;;;:27;;;48067:384;;;48281:13;;48266:11;:28;48262:174;;48335:4;48319:8;:13;;;:20;;;;;;;;;;;;;;;;;;48388:13;:28;;;48362:8;:23;;;:54;;;;;;;;;;;;;;;;;;48262:174;48067:384;47426:1036;;;48498:7;48494:2;48479:27;;48488:4;48479:27;;;;;;;;;;;;48517:42;48538:4;48544:2;48548:7;48557:1;48517:20;:42::i;:::-;46541:2026;;46437:2130;;;:::o;38485:1109::-;38547:21;;:::i;:::-;38581:12;38596:7;38581:22;;38664:4;38645:15;:13;:15::i;:::-;:23;;:47;;;;;38679:13;;38672:4;:20;38645:47;38641:886;;;38713:31;38747:11;:17;38759:4;38747:17;;;;;;;;;;;38713:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38788:9;:16;;;38783:729;;38859:1;38833:28;;:9;:14;;;:28;;;38829:101;;38897:9;38890:16;;;;;;38829:101;39232:261;39239:4;39232:261;;;39272:6;;;;;;;;39317:11;:17;39329:4;39317:17;;;;;;;;;;;39305:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39391:1;39365:28;;:9;:14;;;:28;;;39361:109;;39433:9;39426:16;;;;;;39361:109;39232:261;;;38783:729;38694:833;38641:886;39555:31;;;;;;;;;;;;;;38485:1109;;;;:::o;56812:191::-;56886:16;56905:6;;;;;;;;;;;56886:25;;56931:8;56922:6;;:17;;;;;;;;;;;;;;;;;;56986:8;56955:40;;56976:8;56955:40;;;;;;;;;;;;56875:128;56812:191;:::o;60999:287::-;61069:4;61096:1;61086:6;;;;;;;;;;;:11;;;61082:87;;;61149:12;61137:8;61115:19;;:30;;;;:::i;:::-;:46;;61108:53;;;;61082:87;61189:1;61179:6;;;;;;;;;;;:11;;;61175:87;;;61242:12;61230:8;61208:19;;:30;;;;:::i;:::-;:46;;61201:53;;;;61175:87;61275:5;61268:12;;60999:287;;;;:::o;60360:300::-;60454:4;60470:19;60574:6;60563:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;60510:72;;;;;;;;:::i;:::-;;;;;;;;;;;;;60492:97;;;;;;60470:119;;60617:37;60631:11;60644:9;60617:13;:37::i;:::-;60605:49;;:8;;;;;;;;;;;:49;;;60598:56;;;60360:300;;;;:::o;43519:104::-;43588:27;43598:2;43602:8;43588:27;;;;;;;;;;;;:9;:27::i;:::-;43519:104;;:::o;61292:205::-;61370:1;61360:6;;;;;;;;;;;:11;;;61356:65;;;61405:8;61382:19;;:31;;;;;;;:::i;:::-;;;;;;;;61356:65;61441:1;61431:6;;;;;;;;;;;:11;;;61427:65;;;61476:8;61453:19;;:31;;;;;;;:::i;:::-;;;;;;;;61427:65;61292:205;:::o;12891:326::-;12951:4;13208:1;13186:7;:19;;;:23;13179:30;;12891:326;;;:::o;52182:667::-;52345:4;52382:2;52366:36;;;52403:12;:10;:12::i;:::-;52417:4;52423:7;52432:5;52366:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;52362:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52617:1;52600:6;:13;:18;52596:235;;;52646:40;;;;;;;;;;;;;;52596:235;52789:6;52783:13;52774:6;52770:2;52766:15;52759:38;52362:480;52495:45;;;52485:55;;;:6;:55;;;;52478:62;;;52182:667;;;;;;:::o;60779:108::-;60839:13;60868;60861:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60779:108;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;37392:137::-;37453:7;37488:12;:19;37501:5;37488:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;37480:41;;37473:48;;37392:137;;;:::o;53497:159::-;;;;;:::o;54315:158::-;;;;;:::o;6541:231::-;6619:7;6640:17;6659:18;6681:27;6692:4;6698:9;6681:10;:27::i;:::-;6639:69;;;;6719:18;6731:5;6719:11;:18::i;:::-;6755:9;6748:16;;;;6541:231;;;;:::o;43986:163::-;44109:32;44115:2;44119:8;44129:5;44136:4;44109:5;:32::i;:::-;43986:163;;;:::o;4431:1308::-;4512:7;4521:12;4766:2;4746:9;:16;:22;4742:990;;;4785:9;4809;4833:7;5042:4;5031:9;5027:20;5021:27;5016:32;;5092:4;5081:9;5077:20;5071:27;5066:32;;5150:4;5139:9;5135:20;5129:27;5126:1;5121:36;5116:41;;5193:25;5204:4;5210:1;5213;5216;5193:10;:25::i;:::-;5186:32;;;;;;;;;4742:990;5260:2;5240:9;:16;:22;5236:496;;;5279:9;5303:10;5515:4;5504:9;5500:20;5494:27;5489:32;;5566:4;5555:9;5551:20;5545:27;5539:33;;5608:23;5619:4;5625:1;5628:2;5608:10;:23::i;:::-;5601:30;;;;;;;;5236:496;5680:1;5684:35;5664:56;;;;4431:1308;;;;;;:::o;2702:643::-;2780:20;2771:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;2767:571;;;2817:7;;2767:571;2878:29;2869:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;2865:473;;;2924:34;;;;;;;;;;:::i;:::-;;;;;;;;2865:473;2989:35;2980:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;2976:362;;;3041:41;;;;;;;;;;:::i;:::-;;;;;;;;2976:362;3113:30;3104:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;3100:238;;;3160:44;;;;;;;;;;:::i;:::-;;;;;;;;3100:238;3235:30;3226:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;3222:116;;;3282:44;;;;;;;;;;:::i;:::-;;;;;;;;3222:116;2702:643;;:::o;44408:1775::-;44547:20;44570:13;;44547:36;;44612:1;44598:16;;:2;:16;;;44594:48;;;44623:19;;;;;;;;;;;;;;44594:48;44669:1;44657:8;:13;44653:44;;;44679:18;;;;;;;;;;;;;;44653:44;44710:61;44740:1;44744:2;44748:12;44762:8;44710:21;:61::i;:::-;45083:8;45048:12;:16;45061:2;45048:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45147:8;45107:12;:16;45120:2;45107:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45206:2;45173:11;:25;45185:12;45173:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;45273:15;45223:11;:25;45235:12;45223:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;45306:20;45329:12;45306:35;;45356:11;45385:8;45370:12;:23;45356:37;;45414:4;:23;;;;;45422:15;:2;:13;;;:15::i;:::-;45414:23;45410:641;;;45458:314;45514:12;45510:2;45489:38;;45506:1;45489:38;;;;;;;;;;;;45555:69;45594:1;45598:2;45602:14;;;;;;45618:5;45555:30;:69::i;:::-;45550:174;;45660:40;;;;;;;;;;;;;;45550:174;45767:3;45751:12;:19;;45458:314;;45853:12;45836:13;;:29;45832:43;;45867:8;;;45832:43;45410:641;;;45916:120;45972:14;;;;;;45968:2;45947:40;;45964:1;45947:40;;;;;;;;;;;;46031:3;46015:12;:19;;45916:120;;45410:641;46081:12;46065:13;:28;;;;45023:1082;;46115:60;46144:1;46148:2;46152:12;46166:8;46115:20;:60::i;:::-;44536:1647;44408:1775;;;;:::o;7993:1632::-;8124:7;8133:12;9058:66;9053:1;9045:10;;:79;9041:163;;;9157:1;9161:30;9141:51;;;;;;9041:163;9223:2;9218:1;:7;;;;:18;;;;;9234:2;9229:1;:7;;;;9218:18;9214:102;;;9269:1;9273:30;9253:51;;;;;;9214:102;9413:14;9430:24;9440:4;9446:1;9449;9452;9430:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9413:41;;9487:1;9469:20;;:6;:20;;;9465:103;;;9522:1;9526:29;9506:50;;;;;;;9465:103;9588:6;9596:20;9580:37;;;;;7993:1632;;;;;;;;:::o;7035:344::-;7149:7;7158:12;7183:9;7208:66;7200:75;;7195:2;:80;7183:92;;7286:7;7325:2;7318:3;7311:2;7303:11;;:18;;7302:25;;;;:::i;:::-;7286:42;;7346:25;7357:4;7363:1;7366;7369;7346:10;:25::i;:::-;7339:32;;;;;;7035:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1368:553::-;1426:8;1436:6;1486:3;1479:4;1471:6;1467:17;1463:27;1453:122;;1494:79;;:::i;:::-;1453:122;1607:6;1594:20;1584:30;;1637:18;1629:6;1626:30;1623:117;;;1659:79;;:::i;:::-;1623:117;1773:4;1765:6;1761:17;1749:29;;1827:3;1819:4;1811:6;1807:17;1797:8;1793:32;1790:41;1787:128;;;1834:79;;:::i;:::-;1787:128;1368:553;;;;;:::o;1927:139::-;1973:5;2011:6;1998:20;1989:29;;2027:33;2054:5;2027:33;:::i;:::-;1927:139;;;;:::o;2072:329::-;2131:6;2180:2;2168:9;2159:7;2155:23;2151:32;2148:119;;;2186:79;;:::i;:::-;2148:119;2306:1;2331:53;2376:7;2367:6;2356:9;2352:22;2331:53;:::i;:::-;2321:63;;2277:117;2072:329;;;;:::o;2407:474::-;2475:6;2483;2532:2;2520:9;2511:7;2507:23;2503:32;2500:119;;;2538:79;;:::i;:::-;2500:119;2658:1;2683:53;2728:7;2719:6;2708:9;2704:22;2683:53;:::i;:::-;2673:63;;2629:117;2785:2;2811:53;2856:7;2847:6;2836:9;2832:22;2811:53;:::i;:::-;2801:63;;2756:118;2407:474;;;;;:::o;2887:619::-;2964:6;2972;2980;3029:2;3017:9;3008:7;3004:23;3000:32;2997:119;;;3035:79;;:::i;:::-;2997:119;3155:1;3180:53;3225:7;3216:6;3205:9;3201:22;3180:53;:::i;:::-;3170:63;;3126:117;3282:2;3308:53;3353:7;3344:6;3333:9;3329:22;3308:53;:::i;:::-;3298:63;;3253:118;3410:2;3436:53;3481:7;3472:6;3461:9;3457:22;3436:53;:::i;:::-;3426:63;;3381:118;2887:619;;;;;:::o;3512:943::-;3607:6;3615;3623;3631;3680:3;3668:9;3659:7;3655:23;3651:33;3648:120;;;3687:79;;:::i;:::-;3648:120;3807:1;3832:53;3877:7;3868:6;3857:9;3853:22;3832:53;:::i;:::-;3822:63;;3778:117;3934:2;3960:53;4005:7;3996:6;3985:9;3981:22;3960:53;:::i;:::-;3950:63;;3905:118;4062:2;4088:53;4133:7;4124:6;4113:9;4109:22;4088:53;:::i;:::-;4078:63;;4033:118;4218:2;4207:9;4203:18;4190:32;4249:18;4241:6;4238:30;4235:117;;;4271:79;;:::i;:::-;4235:117;4376:62;4430:7;4421:6;4410:9;4406:22;4376:62;:::i;:::-;4366:72;;4161:287;3512:943;;;;;;;:::o;4461:468::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:50;4904:7;4895:6;4884:9;4880:22;4862:50;:::i;:::-;4852:60;;4807:115;4461:468;;;;;:::o;4935:474::-;5003:6;5011;5060:2;5048:9;5039:7;5035:23;5031:32;5028:119;;;5066:79;;:::i;:::-;5028:119;5186:1;5211:53;5256:7;5247:6;5236:9;5232:22;5211:53;:::i;:::-;5201:63;;5157:117;5313:2;5339:53;5384:7;5375:6;5364:9;5360:22;5339:53;:::i;:::-;5329:63;;5284:118;4935:474;;;;;:::o;5415:323::-;5471:6;5520:2;5508:9;5499:7;5495:23;5491:32;5488:119;;;5526:79;;:::i;:::-;5488:119;5646:1;5671:50;5713:7;5704:6;5693:9;5689:22;5671:50;:::i;:::-;5661:60;;5617:114;5415:323;;;;:::o;5744:327::-;5802:6;5851:2;5839:9;5830:7;5826:23;5822:32;5819:119;;;5857:79;;:::i;:::-;5819:119;5977:1;6002:52;6046:7;6037:6;6026:9;6022:22;6002:52;:::i;:::-;5992:62;;5948:116;5744:327;;;;:::o;6077:349::-;6146:6;6195:2;6183:9;6174:7;6170:23;6166:32;6163:119;;;6201:79;;:::i;:::-;6163:119;6321:1;6346:63;6401:7;6392:6;6381:9;6377:22;6346:63;:::i;:::-;6336:73;;6292:127;6077:349;;;;:::o;6432:529::-;6503:6;6511;6560:2;6548:9;6539:7;6535:23;6531:32;6528:119;;;6566:79;;:::i;:::-;6528:119;6714:1;6703:9;6699:17;6686:31;6744:18;6736:6;6733:30;6730:117;;;6766:79;;:::i;:::-;6730:117;6879:65;6936:7;6927:6;6916:9;6912:22;6879:65;:::i;:::-;6861:83;;;;6657:297;6432:529;;;;;:::o;6967:329::-;7026:6;7075:2;7063:9;7054:7;7050:23;7046:32;7043:119;;;7081:79;;:::i;:::-;7043:119;7201:1;7226:53;7271:7;7262:6;7251:9;7247:22;7226:53;:::i;:::-;7216:63;;7172:117;6967:329;;;;:::o;7302:652::-;7379:6;7387;7436:2;7424:9;7415:7;7411:23;7407:32;7404:119;;;7442:79;;:::i;:::-;7404:119;7562:1;7587:53;7632:7;7623:6;7612:9;7608:22;7587:53;:::i;:::-;7577:63;;7533:117;7717:2;7706:9;7702:18;7689:32;7748:18;7740:6;7737:30;7734:117;;;7770:79;;:::i;:::-;7734:117;7875:62;7929:7;7920:6;7909:9;7905:22;7875:62;:::i;:::-;7865:72;;7660:287;7302:652;;;;;:::o;7960:118::-;8047:24;8065:5;8047:24;:::i;:::-;8042:3;8035:37;7960:118;;:::o;8084:109::-;8165:21;8180:5;8165:21;:::i;:::-;8160:3;8153:34;8084:109;;:::o;8199:118::-;8286:24;8304:5;8286:24;:::i;:::-;8281:3;8274:37;8199:118;;:::o;8323:360::-;8409:3;8437:38;8469:5;8437:38;:::i;:::-;8491:70;8554:6;8549:3;8491:70;:::i;:::-;8484:77;;8570:52;8615:6;8610:3;8603:4;8596:5;8592:16;8570:52;:::i;:::-;8647:29;8669:6;8647:29;:::i;:::-;8642:3;8638:39;8631:46;;8413:270;8323:360;;;;:::o;8689:373::-;8793:3;8821:38;8853:5;8821:38;:::i;:::-;8875:88;8956:6;8951:3;8875:88;:::i;:::-;8868:95;;8972:52;9017:6;9012:3;9005:4;8998:5;8994:16;8972:52;:::i;:::-;9049:6;9044:3;9040:16;9033:23;;8797:265;8689:373;;;;:::o;9068:364::-;9156:3;9184:39;9217:5;9184:39;:::i;:::-;9239:71;9303:6;9298:3;9239:71;:::i;:::-;9232:78;;9319:52;9364:6;9359:3;9352:4;9345:5;9341:16;9319:52;:::i;:::-;9396:29;9418:6;9396:29;:::i;:::-;9391:3;9387:39;9380:46;;9160:272;9068:364;;;;:::o;9438:377::-;9544:3;9572:39;9605:5;9572:39;:::i;:::-;9627:89;9709:6;9704:3;9627:89;:::i;:::-;9620:96;;9725:52;9770:6;9765:3;9758:4;9751:5;9747:16;9725:52;:::i;:::-;9802:6;9797:3;9793:16;9786:23;;9548:267;9438:377;;;;:::o;9821:366::-;9963:3;9984:67;10048:2;10043:3;9984:67;:::i;:::-;9977:74;;10060:93;10149:3;10060:93;:::i;:::-;10178:2;10173:3;10169:12;10162:19;;9821:366;;;:::o;10193:::-;10335:3;10356:67;10420:2;10415:3;10356:67;:::i;:::-;10349:74;;10432:93;10521:3;10432:93;:::i;:::-;10550:2;10545:3;10541:12;10534:19;;10193:366;;;:::o;10565:402::-;10725:3;10746:85;10828:2;10823:3;10746:85;:::i;:::-;10739:92;;10840:93;10929:3;10840:93;:::i;:::-;10958:2;10953:3;10949:12;10942:19;;10565:402;;;:::o;10973:366::-;11115:3;11136:67;11200:2;11195:3;11136:67;:::i;:::-;11129:74;;11212:93;11301:3;11212:93;:::i;:::-;11330:2;11325:3;11321:12;11314:19;;10973:366;;;:::o;11345:::-;11487:3;11508:67;11572:2;11567:3;11508:67;:::i;:::-;11501:74;;11584:93;11673:3;11584:93;:::i;:::-;11702:2;11697:3;11693:12;11686:19;;11345:366;;;:::o;11717:::-;11859:3;11880:67;11944:2;11939:3;11880:67;:::i;:::-;11873:74;;11956:93;12045:3;11956:93;:::i;:::-;12074:2;12069:3;12065:12;12058:19;;11717:366;;;:::o;12089:::-;12231:3;12252:67;12316:2;12311:3;12252:67;:::i;:::-;12245:74;;12328:93;12417:3;12328:93;:::i;:::-;12446:2;12441:3;12437:12;12430:19;;12089:366;;;:::o;12461:::-;12603:3;12624:67;12688:2;12683:3;12624:67;:::i;:::-;12617:74;;12700:93;12789:3;12700:93;:::i;:::-;12818:2;12813:3;12809:12;12802:19;;12461:366;;;:::o;12833:::-;12975:3;12996:67;13060:2;13055:3;12996:67;:::i;:::-;12989:74;;13072:93;13161:3;13072:93;:::i;:::-;13190:2;13185:3;13181:12;13174:19;;12833:366;;;:::o;13205:::-;13347:3;13368:67;13432:2;13427:3;13368:67;:::i;:::-;13361:74;;13444:93;13533:3;13444:93;:::i;:::-;13562:2;13557:3;13553:12;13546:19;;13205:366;;;:::o;13577:::-;13719:3;13740:67;13804:2;13799:3;13740:67;:::i;:::-;13733:74;;13816:93;13905:3;13816:93;:::i;:::-;13934:2;13929:3;13925:12;13918:19;;13577:366;;;:::o;13949:::-;14091:3;14112:67;14176:2;14171:3;14112:67;:::i;:::-;14105:74;;14188:93;14277:3;14188:93;:::i;:::-;14306:2;14301:3;14297:12;14290:19;;13949:366;;;:::o;14321:::-;14463:3;14484:67;14548:2;14543:3;14484:67;:::i;:::-;14477:74;;14560:93;14649:3;14560:93;:::i;:::-;14678:2;14673:3;14669:12;14662:19;;14321:366;;;:::o;14693:::-;14835:3;14856:67;14920:2;14915:3;14856:67;:::i;:::-;14849:74;;14932:93;15021:3;14932:93;:::i;:::-;15050:2;15045:3;15041:12;15034:19;;14693:366;;;:::o;15065:::-;15207:3;15228:67;15292:2;15287:3;15228:67;:::i;:::-;15221:74;;15304:93;15393:3;15304:93;:::i;:::-;15422:2;15417:3;15413:12;15406:19;;15065:366;;;:::o;15437:398::-;15596:3;15617:83;15698:1;15693:3;15617:83;:::i;:::-;15610:90;;15709:93;15798:3;15709:93;:::i;:::-;15827:1;15822:3;15818:11;15811:18;;15437:398;;;:::o;15841:366::-;15983:3;16004:67;16068:2;16063:3;16004:67;:::i;:::-;15997:74;;16080:93;16169:3;16080:93;:::i;:::-;16198:2;16193:3;16189:12;16182:19;;15841:366;;;:::o;16213:::-;16355:3;16376:67;16440:2;16435:3;16376:67;:::i;:::-;16369:74;;16452:93;16541:3;16452:93;:::i;:::-;16570:2;16565:3;16561:12;16554:19;;16213:366;;;:::o;16585:::-;16727:3;16748:67;16812:2;16807:3;16748:67;:::i;:::-;16741:74;;16824:93;16913:3;16824:93;:::i;:::-;16942:2;16937:3;16933:12;16926:19;;16585:366;;;:::o;16957:::-;17099:3;17120:67;17184:2;17179:3;17120:67;:::i;:::-;17113:74;;17196:93;17285:3;17196:93;:::i;:::-;17314:2;17309:3;17305:12;17298:19;;16957:366;;;:::o;17329:118::-;17416:24;17434:5;17416:24;:::i;:::-;17411:3;17404:37;17329:118;;:::o;17453:112::-;17536:22;17552:5;17536:22;:::i;:::-;17531:3;17524:35;17453:112;;:::o;17571:435::-;17751:3;17773:95;17864:3;17855:6;17773:95;:::i;:::-;17766:102;;17885:95;17976:3;17967:6;17885:95;:::i;:::-;17878:102;;17997:3;17990:10;;17571:435;;;;;:::o;18012:537::-;18243:3;18265:148;18409:3;18265:148;:::i;:::-;18258:155;;18430:93;18519:3;18510:6;18430:93;:::i;:::-;18423:100;;18540:3;18533:10;;18012:537;;;;:::o;18555:379::-;18739:3;18761:147;18904:3;18761:147;:::i;:::-;18754:154;;18925:3;18918:10;;18555:379;;;:::o;18940:222::-;19033:4;19071:2;19060:9;19056:18;19048:26;;19084:71;19152:1;19141:9;19137:17;19128:6;19084:71;:::i;:::-;18940:222;;;;:::o;19168:640::-;19363:4;19401:3;19390:9;19386:19;19378:27;;19415:71;19483:1;19472:9;19468:17;19459:6;19415:71;:::i;:::-;19496:72;19564:2;19553:9;19549:18;19540:6;19496:72;:::i;:::-;19578;19646:2;19635:9;19631:18;19622:6;19578:72;:::i;:::-;19697:9;19691:4;19687:20;19682:2;19671:9;19667:18;19660:48;19725:76;19796:4;19787:6;19725:76;:::i;:::-;19717:84;;19168:640;;;;;;;:::o;19814:210::-;19901:4;19939:2;19928:9;19924:18;19916:26;;19952:65;20014:1;20003:9;19999:17;19990:6;19952:65;:::i;:::-;19814:210;;;;:::o;20030:545::-;20203:4;20241:3;20230:9;20226:19;20218:27;;20255:71;20323:1;20312:9;20308:17;20299:6;20255:71;:::i;:::-;20336:68;20400:2;20389:9;20385:18;20376:6;20336:68;:::i;:::-;20414:72;20482:2;20471:9;20467:18;20458:6;20414:72;:::i;:::-;20496;20564:2;20553:9;20549:18;20540:6;20496:72;:::i;:::-;20030:545;;;;;;;:::o;20581:313::-;20694:4;20732:2;20721:9;20717:18;20709:26;;20781:9;20775:4;20771:20;20767:1;20756:9;20752:17;20745:47;20809:78;20882:4;20873:6;20809:78;:::i;:::-;20801:86;;20581:313;;;;:::o;20900:419::-;21066:4;21104:2;21093:9;21089:18;21081:26;;21153:9;21147:4;21143:20;21139:1;21128:9;21124:17;21117:47;21181:131;21307:4;21181:131;:::i;:::-;21173:139;;20900:419;;;:::o;21325:::-;21491:4;21529:2;21518:9;21514:18;21506:26;;21578:9;21572:4;21568:20;21564:1;21553:9;21549:17;21542:47;21606:131;21732:4;21606:131;:::i;:::-;21598:139;;21325:419;;;:::o;21750:::-;21916:4;21954:2;21943:9;21939:18;21931:26;;22003:9;21997:4;21993:20;21989:1;21978:9;21974:17;21967:47;22031:131;22157:4;22031:131;:::i;:::-;22023:139;;21750:419;;;:::o;22175:::-;22341:4;22379:2;22368:9;22364:18;22356:26;;22428:9;22422:4;22418:20;22414:1;22403:9;22399:17;22392:47;22456:131;22582:4;22456:131;:::i;:::-;22448:139;;22175:419;;;:::o;22600:::-;22766:4;22804:2;22793:9;22789:18;22781:26;;22853:9;22847:4;22843:20;22839:1;22828:9;22824:17;22817:47;22881:131;23007:4;22881:131;:::i;:::-;22873:139;;22600:419;;;:::o;23025:::-;23191:4;23229:2;23218:9;23214:18;23206:26;;23278:9;23272:4;23268:20;23264:1;23253:9;23249:17;23242:47;23306:131;23432:4;23306:131;:::i;:::-;23298:139;;23025:419;;;:::o;23450:::-;23616:4;23654:2;23643:9;23639:18;23631:26;;23703:9;23697:4;23693:20;23689:1;23678:9;23674:17;23667:47;23731:131;23857:4;23731:131;:::i;:::-;23723:139;;23450:419;;;:::o;23875:::-;24041:4;24079:2;24068:9;24064:18;24056:26;;24128:9;24122:4;24118:20;24114:1;24103:9;24099:17;24092:47;24156:131;24282:4;24156:131;:::i;:::-;24148:139;;23875:419;;;:::o;24300:::-;24466:4;24504:2;24493:9;24489:18;24481:26;;24553:9;24547:4;24543:20;24539:1;24528:9;24524:17;24517:47;24581:131;24707:4;24581:131;:::i;:::-;24573:139;;24300:419;;;:::o;24725:::-;24891:4;24929:2;24918:9;24914:18;24906:26;;24978:9;24972:4;24968:20;24964:1;24953:9;24949:17;24942:47;25006:131;25132:4;25006:131;:::i;:::-;24998:139;;24725:419;;;:::o;25150:::-;25316:4;25354:2;25343:9;25339:18;25331:26;;25403:9;25397:4;25393:20;25389:1;25378:9;25374:17;25367:47;25431:131;25557:4;25431:131;:::i;:::-;25423:139;;25150:419;;;:::o;25575:::-;25741:4;25779:2;25768:9;25764:18;25756:26;;25828:9;25822:4;25818:20;25814:1;25803:9;25799:17;25792:47;25856:131;25982:4;25856:131;:::i;:::-;25848:139;;25575:419;;;:::o;26000:::-;26166:4;26204:2;26193:9;26189:18;26181:26;;26253:9;26247:4;26243:20;26239:1;26228:9;26224:17;26217:47;26281:131;26407:4;26281:131;:::i;:::-;26273:139;;26000:419;;;:::o;26425:::-;26591:4;26629:2;26618:9;26614:18;26606:26;;26678:9;26672:4;26668:20;26664:1;26653:9;26649:17;26642:47;26706:131;26832:4;26706:131;:::i;:::-;26698:139;;26425:419;;;:::o;26850:::-;27016:4;27054:2;27043:9;27039:18;27031:26;;27103:9;27097:4;27093:20;27089:1;27078:9;27074:17;27067:47;27131:131;27257:4;27131:131;:::i;:::-;27123:139;;26850:419;;;:::o;27275:::-;27441:4;27479:2;27468:9;27464:18;27456:26;;27528:9;27522:4;27518:20;27514:1;27503:9;27499:17;27492:47;27556:131;27682:4;27556:131;:::i;:::-;27548:139;;27275:419;;;:::o;27700:::-;27866:4;27904:2;27893:9;27889:18;27881:26;;27953:9;27947:4;27943:20;27939:1;27928:9;27924:17;27917:47;27981:131;28107:4;27981:131;:::i;:::-;27973:139;;27700:419;;;:::o;28125:::-;28291:4;28329:2;28318:9;28314:18;28306:26;;28378:9;28372:4;28368:20;28364:1;28353:9;28349:17;28342:47;28406:131;28532:4;28406:131;:::i;:::-;28398:139;;28125:419;;;:::o;28550:222::-;28643:4;28681:2;28670:9;28666:18;28658:26;;28694:71;28762:1;28751:9;28747:17;28738:6;28694:71;:::i;:::-;28550:222;;;;:::o;28778:214::-;28867:4;28905:2;28894:9;28890:18;28882:26;;28918:67;28982:1;28971:9;28967:17;28958:6;28918:67;:::i;:::-;28778:214;;;;:::o;28998:129::-;29032:6;29059:20;;:::i;:::-;29049:30;;29088:33;29116:4;29108:6;29088:33;:::i;:::-;28998:129;;;:::o;29133:75::-;29166:6;29199:2;29193:9;29183:19;;29133:75;:::o;29214:307::-;29275:4;29365:18;29357:6;29354:30;29351:56;;;29387:18;;:::i;:::-;29351:56;29425:29;29447:6;29425:29;:::i;:::-;29417:37;;29509:4;29503;29499:15;29491:23;;29214:307;;;:::o;29527:98::-;29578:6;29612:5;29606:12;29596:22;;29527:98;;;:::o;29631:99::-;29683:6;29717:5;29711:12;29701:22;;29631:99;;;:::o;29736:168::-;29819:11;29853:6;29848:3;29841:19;29893:4;29888:3;29884:14;29869:29;;29736:168;;;;:::o;29910:147::-;30011:11;30048:3;30033:18;;29910:147;;;;:::o;30063:169::-;30147:11;30181:6;30176:3;30169:19;30221:4;30216:3;30212:14;30197:29;;30063:169;;;;:::o;30238:148::-;30340:11;30377:3;30362:18;;30238:148;;;;:::o;30392:305::-;30432:3;30451:20;30469:1;30451:20;:::i;:::-;30446:25;;30485:20;30503:1;30485:20;:::i;:::-;30480:25;;30639:1;30571:66;30567:74;30564:1;30561:81;30558:107;;;30645:18;;:::i;:::-;30558:107;30689:1;30686;30682:9;30675:16;;30392:305;;;;:::o;30703:185::-;30743:1;30760:20;30778:1;30760:20;:::i;:::-;30755:25;;30794:20;30812:1;30794:20;:::i;:::-;30789:25;;30833:1;30823:35;;30838:18;;:::i;:::-;30823:35;30880:1;30877;30873:9;30868:14;;30703:185;;;;:::o;30894:191::-;30934:4;30954:20;30972:1;30954:20;:::i;:::-;30949:25;;30988:20;31006:1;30988:20;:::i;:::-;30983:25;;31027:1;31024;31021:8;31018:34;;;31032:18;;:::i;:::-;31018:34;31077:1;31074;31070:9;31062:17;;30894:191;;;;:::o;31091:96::-;31128:7;31157:24;31175:5;31157:24;:::i;:::-;31146:35;;31091:96;;;:::o;31193:90::-;31227:7;31270:5;31263:13;31256:21;31245:32;;31193:90;;;:::o;31289:77::-;31326:7;31355:5;31344:16;;31289:77;;;:::o;31372:149::-;31408:7;31448:66;31441:5;31437:78;31426:89;;31372:149;;;:::o;31527:126::-;31564:7;31604:42;31597:5;31593:54;31582:65;;31527:126;;;:::o;31659:77::-;31696:7;31725:5;31714:16;;31659:77;;;:::o;31742:86::-;31777:7;31817:4;31810:5;31806:16;31795:27;;31742:86;;;:::o;31834:154::-;31918:6;31913:3;31908;31895:30;31980:1;31971:6;31966:3;31962:16;31955:27;31834:154;;;:::o;31994:307::-;32062:1;32072:113;32086:6;32083:1;32080:13;32072:113;;;32171:1;32166:3;32162:11;32156:18;32152:1;32147:3;32143:11;32136:39;32108:2;32105:1;32101:10;32096:15;;32072:113;;;32203:6;32200:1;32197:13;32194:101;;;32283:1;32274:6;32269:3;32265:16;32258:27;32194:101;32043:258;31994:307;;;:::o;32307:320::-;32351:6;32388:1;32382:4;32378:12;32368:22;;32435:1;32429:4;32425:12;32456:18;32446:81;;32512:4;32504:6;32500:17;32490:27;;32446:81;32574:2;32566:6;32563:14;32543:18;32540:38;32537:84;;;32593:18;;:::i;:::-;32537:84;32358:269;32307:320;;;:::o;32633:281::-;32716:27;32738:4;32716:27;:::i;:::-;32708:6;32704:40;32846:6;32834:10;32831:22;32810:18;32798:10;32795:34;32792:62;32789:88;;;32857:18;;:::i;:::-;32789:88;32897:10;32893:2;32886:22;32676:238;32633:281;;:::o;32920:233::-;32959:3;32982:24;33000:5;32982:24;:::i;:::-;32973:33;;33028:66;33021:5;33018:77;33015:103;;;33098:18;;:::i;:::-;33015:103;33145:1;33138:5;33134:13;33127:20;;32920:233;;;:::o;33159:167::-;33196:3;33219:22;33235:5;33219:22;:::i;:::-;33210:31;;33263:4;33256:5;33253:15;33250:41;;;33271:18;;:::i;:::-;33250:41;33318:1;33311:5;33307:13;33300:20;;33159:167;;;:::o;33332:176::-;33364:1;33381:20;33399:1;33381:20;:::i;:::-;33376:25;;33415:20;33433:1;33415:20;:::i;:::-;33410:25;;33454:1;33444:35;;33459:18;;:::i;:::-;33444:35;33500:1;33497;33493:9;33488:14;;33332:176;;;;:::o;33514:180::-;33562:77;33559:1;33552:88;33659:4;33656:1;33649:15;33683:4;33680:1;33673:15;33700:180;33748:77;33745:1;33738:88;33845:4;33842:1;33835:15;33869:4;33866:1;33859:15;33886:180;33934:77;33931:1;33924:88;34031:4;34028:1;34021:15;34055:4;34052:1;34045:15;34072:180;34120:77;34117:1;34110:88;34217:4;34214:1;34207:15;34241:4;34238:1;34231:15;34258:180;34306:77;34303:1;34296:88;34403:4;34400:1;34393:15;34427:4;34424:1;34417:15;34444:180;34492:77;34489:1;34482:88;34589:4;34586:1;34579:15;34613:4;34610:1;34603:15;34630:117;34739:1;34736;34729:12;34753:117;34862:1;34859;34852:12;34876:117;34985:1;34982;34975:12;34999:117;35108:1;35105;35098:12;35122:117;35231:1;35228;35221:12;35245:117;35354:1;35351;35344:12;35368:102;35409:6;35460:2;35456:7;35451:2;35444:5;35440:14;35436:28;35426:38;;35368:102;;;:::o;35476:174::-;35616:26;35612:1;35604:6;35600:14;35593:50;35476:174;:::o;35656:181::-;35796:33;35792:1;35784:6;35780:14;35773:57;35656:181;:::o;35843:214::-;35983:66;35979:1;35971:6;35967:14;35960:90;35843:214;:::o;36063:225::-;36203:34;36199:1;36191:6;36187:14;36180:58;36272:8;36267:2;36259:6;36255:15;36248:33;36063:225;:::o;36294:163::-;36434:15;36430:1;36422:6;36418:14;36411:39;36294:163;:::o;36463:221::-;36603:34;36599:1;36591:6;36587:14;36580:58;36672:4;36667:2;36659:6;36655:15;36648:29;36463:221;:::o;36690:177::-;36830:29;36826:1;36818:6;36814:14;36807:53;36690:177;:::o;36873:178::-;37013:30;37009:1;37001:6;36997:14;36990:54;36873:178;:::o;37057:163::-;37197:15;37193:1;37185:6;37181:14;37174:39;37057:163;:::o;37226:221::-;37366:34;37362:1;37354:6;37350:14;37343:58;37435:4;37430:2;37422:6;37418:15;37411:29;37226:221;:::o;37453:172::-;37593:24;37589:1;37581:6;37577:14;37570:48;37453:172;:::o;37631:166::-;37771:18;37767:1;37759:6;37755:14;37748:42;37631:166;:::o;37803:182::-;37943:34;37939:1;37931:6;37927:14;37920:58;37803:182;:::o;37991:171::-;38131:23;38127:1;38119:6;38115:14;38108:47;37991:171;:::o;38168:::-;38308:23;38304:1;38296:6;38292:14;38285:47;38168:171;:::o;38345:114::-;;:::o;38465:166::-;38605:18;38601:1;38593:6;38589:14;38582:42;38465:166;:::o;38637:174::-;38777:26;38773:1;38765:6;38761:14;38754:50;38637:174;:::o;38817:163::-;38957:15;38953:1;38945:6;38941:14;38934:39;38817:163;:::o;38986:181::-;39126:33;39122:1;39114:6;39110:14;39103:57;38986:181;:::o;39173:122::-;39246:24;39264:5;39246:24;:::i;:::-;39239:5;39236:35;39226:63;;39285:1;39282;39275:12;39226:63;39173:122;:::o;39301:116::-;39371:21;39386:5;39371:21;:::i;:::-;39364:5;39361:32;39351:60;;39407:1;39404;39397:12;39351:60;39301:116;:::o;39423:120::-;39495:23;39512:5;39495:23;:::i;:::-;39488:5;39485:34;39475:62;;39533:1;39530;39523:12;39475:62;39423:120;:::o;39549:122::-;39622:24;39640:5;39622:24;:::i;:::-;39615:5;39612:35;39602:63;;39661:1;39658;39651:12;39602:63;39549:122;:::o
Swarm Source
ipfs://5dcec933fa8d1e721e69db825bfeda0197e4c68c3635441edf64a91e128e1e65
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.