ERC-721
Overview
Max Total Supply
162 TRIB
Holders
116
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 TRIBLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Tribute
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-18 */ // 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 v4.4.1 (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; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 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/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts 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: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 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/token/ERC721/ERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: contracts/rithmdrop.sol pragma solidity ^0.8.0; contract Tribute is ERC721, Ownable { using ECDSA for bytes32; using Strings for uint256; uint256 public MAX_TRIB = 690; uint256 public TRIB_PRICE = 0.06 ether; uint256 public MAX_TRIB_PER_TX = 5; uint256 public totalSaleSupply; bool public publicSaleIsActive = false; bool public whitelistSaleIsActive = false; bool public burnerWhitelistSaleIsActive = false; address private key = 0x1152BE732ebA33ffC8Cdd0D05FFa9F3af3A85F4E; string public _tokenBaseURI; string public BURNER = "BURNER"; string public NORMAL = "NORMAL"; mapping(address => uint256) public boughtBurner; mapping(address => uint256) public boughtNormal; constructor() ERC721("Tribute Series", "TRIB") { } // funds withdrawal for owner function withdrawEther() external onlyOwner { payable(msg.sender).transfer(address(this).balance); } function _baseURI() internal view override returns (string memory) { return _tokenBaseURI; } function setBaseURI(string calldata URI) external onlyOwner { _tokenBaseURI = URI; } function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) { require(_exists(tokenId), 'Token does not exist'); return string(abi.encodePacked(_tokenBaseURI, tokenId.toString())); } function _verify(bytes32 hash, bytes memory signature) internal view returns (bool) { return (hash.recover(signature) == key); } function _hash(address _address, uint256 max, string memory mintType) internal pure returns (bytes32) { return keccak256(abi.encode(_address, max, mintType)); } function mintPublic(uint256 numberOfTokens) public payable { require(numberOfTokens <= MAX_TRIB_PER_TX, "Number of tokens exceeds maximum"); require(publicSaleIsActive, "Sale must be active to mint a tribute."); require(totalSaleSupply + numberOfTokens <= MAX_TRIB, "Purchase would exceed max supply of tributes for sale."); require(TRIB_PRICE * numberOfTokens <= msg.value, "Ether value sent is not correct"); for (uint i = 0; i < numberOfTokens; i++) { uint256 tokenId = totalSaleSupply + 1; totalSaleSupply += 1; _safeMint(msg.sender, tokenId); } } function mintBurnerWhitelist(bytes memory signature, uint256 numberOfTokens, uint256 max) public payable { require(numberOfTokens <= MAX_TRIB_PER_TX, "Number of tokens exceeds maximum"); require(burnerWhitelistSaleIsActive, "Sale must be active to mint a tribute."); require(_verify(_hash(msg.sender, max, BURNER), signature), "This hash's signature is invalid."); require(totalSaleSupply + numberOfTokens <= MAX_TRIB, "Purchase would exceed max supply of tributes for sale."); require(numberOfTokens + boughtBurner[msg.sender] <= max, "Number of tokens would exceed max"); boughtBurner[msg.sender] = boughtBurner[msg.sender] + numberOfTokens; for (uint i = 0; i < numberOfTokens; i++) { uint256 tokenId = totalSaleSupply + 1; totalSaleSupply += 1; _safeMint(msg.sender, tokenId); } } function mintWhitelist(bytes memory signature, uint256 numberOfTokens, uint256 max) public payable { require(numberOfTokens <= MAX_TRIB_PER_TX, "Number of tokens exceeds maximum"); require(whitelistSaleIsActive, "Sale must be active to mint a tribute."); require(_verify(_hash(msg.sender, max, NORMAL), signature), "This hash's signature is invalid."); require(totalSaleSupply + numberOfTokens <= MAX_TRIB, "Purchase would exceed max supply of tributes for sale."); require(numberOfTokens + boughtNormal[msg.sender] <= max, "Number of tokens would exceed max"); require(TRIB_PRICE * numberOfTokens <= msg.value, "Ether value sent is not correct"); boughtNormal[msg.sender] = boughtNormal[msg.sender] + numberOfTokens; for (uint i = 0; i < numberOfTokens; i++) { uint256 tokenId = totalSaleSupply + 1; totalSaleSupply += 1; _safeMint(msg.sender, tokenId); } } function mintAirdrop(address[] calldata addresses) external onlyOwner { for (uint256 i = 0; i < addresses.length; i++) { uint256 tokenId = totalSaleSupply + 1; totalSaleSupply += 1; _safeMint(addresses[i], tokenId); } } function totalSupply() public view returns (uint) { return totalSaleSupply; } function flipPublicSaleState() external onlyOwner { publicSaleIsActive = !publicSaleIsActive; } function flipWhitelistSaleState() external onlyOwner { whitelistSaleIsActive = !whitelistSaleIsActive; } function flipBurnerWhitelistSaleState() external onlyOwner { burnerWhitelistSaleIsActive = !burnerWhitelistSaleIsActive; } receive() external payable { revert(); } fallback() external payable { revert(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"BURNER","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TRIB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TRIB_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NORMAL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRIB_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokenBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"address","name":"","type":"address"}],"name":"boughtBurner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"boughtNormal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnerWhitelistSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipBurnerWhitelistSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPublicSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipWhitelistSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"mintAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"mintBurnerWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","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":"totalSaleSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6102b260075566d529ae9e8600006008556005600955600b80546001600160b81b031916761152be732eba33ffc8cdd0d05ffa9f3af3a85f4e00000017905560c06040526006608081905265212aa92722a960d11b60a09081526200006891600d919062000188565b50604080518082019091526006808252651393d493505360d21b60209092019182526200009891600e9162000188565b50348015620000a657600080fd5b50604080518082018252600e81526d547269627574652053657269657360901b6020808301918252835180850190945260048452632a2924a160e11b908401528151919291620000f99160009162000188565b5080516200010f90600190602084019062000188565b5050506200012c620001266200013260201b60201c565b62000136565b6200026b565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000196906200022e565b90600052602060002090601f016020900481019282620001ba576000855562000205565b82601f10620001d557805160ff191683800117855562000205565b8280016001018555821562000205579182015b8281111562000205578251825591602001919060010190620001e8565b506200021392915062000217565b5090565b5b8082111562000213576000815560010162000218565b600181811c908216806200024357607f821691505b602082108114156200026557634e487b7160e01b600052602260045260246000fd5b50919050565b6128db806200027b6000396000f3fe6080604052600436106102295760003560e01c8063715018a611610123578063b88d4fde116100ab578063cf7287b21161006f578063cf7287b214610609578063d1beca641461061f578063e985e9c514610634578063efd0cbf91461067d578063f2fde38b1461069057600080fd5b8063b88d4fde14610580578063c5953170146105a0578063c73c7414146105c0578063c87b56dd146105d6578063cc726eed146105f657600080fd5b806395d89b41116100f257806395d89b411461050e578063a10866ef14610523578063a22cb46514610538578063ae24595c14610558578063af4925fa1461056d57600080fd5b8063715018a6146104b05780637362377b146104c557806378231978146104da5780638da5cb5b146104f057600080fd5b80632d9ec8f4116101b157806356b644851161017557806356b64485146104015780635fb0f37f146104165780636352211e146104435780636de282ce1461046357806370a082311461049057600080fd5b80632d9ec8f4146103765780633c729fef146103965780633ca4fb76146103ac57806342842e0e146103c157806355f804b3146103e157600080fd5b80630fcf2e75116101f85780630fcf2e75146102e957806310b5454d14610303578063118c4f131461032257806318160ddd1461033757806323b872dd1461035657600080fd5b806301ffc9a71461023857806306fdde031461026d578063081812fc1461028f578063095ea7b3146102c757600080fd5b3661023357600080fd5b600080fd5b34801561024457600080fd5b50610258610253366004612297565b6106b0565b60405190151581526020015b60405180910390f35b34801561027957600080fd5b50610282610702565b60405161026491906124eb565b34801561029b57600080fd5b506102af6102aa36600461237f565b610794565b6040516001600160a01b039091168152602001610264565b3480156102d357600080fd5b506102e76102e23660046121f8565b61082e565b005b3480156102f557600080fd5b50600b546102589060ff1681565b34801561030f57600080fd5b50600b5461025890610100900460ff1681565b34801561032e57600080fd5b50610282610944565b34801561034357600080fd5b50600a545b604051908152602001610264565b34801561036257600080fd5b506102e7610371366004612118565b6109d2565b34801561038257600080fd5b50600b546102589062010000900460ff1681565b3480156103a257600080fd5b5061034860085481565b3480156103b857600080fd5b50610282610a03565b3480156103cd57600080fd5b506102e76103dc366004612118565b610a10565b3480156103ed57600080fd5b506102e76103fc36600461231f565b610a2b565b34801561040d57600080fd5b506102e7610a61565b34801561042257600080fd5b506103486104313660046120c3565b60106020526000908152604090205481565b34801561044f57600080fd5b506102af61045e36600461237f565b610aaa565b34801561046f57600080fd5b5061034861047e3660046120c3565b600f6020526000908152604090205481565b34801561049c57600080fd5b506103486104ab3660046120c3565b610b21565b3480156104bc57600080fd5b506102e7610ba8565b3480156104d157600080fd5b506102e7610bde565b3480156104e657600080fd5b50610348600a5481565b3480156104fc57600080fd5b506006546001600160a01b03166102af565b34801561051a57600080fd5b50610282610c37565b34801561052f57600080fd5b506102e7610c46565b34801561054457600080fd5b506102e76105533660046121bc565b610c84565b34801561056457600080fd5b50610282610c93565b6102e761057b3660046122d1565b610ca0565b34801561058c57600080fd5b506102e761059b366004612154565b610e93565b3480156105ac57600080fd5b506102e76105bb366004612222565b610ec5565b3480156105cc57600080fd5b5061034860075481565b3480156105e257600080fd5b506102826105f136600461237f565b610f69565b6102e76106043660046122d1565b610ff9565b34801561061557600080fd5b5061034860095481565b34801561062b57600080fd5b506102e76111b9565b34801561064057600080fd5b5061025861064f3660046120e5565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6102e761068b36600461237f565b611200565b34801561069c57600080fd5b506102e76106ab3660046120c3565b611324565b60006001600160e01b031982166380ac58cd60e01b14806106e157506001600160e01b03198216635b5e139f60e01b145b806106fc57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610711906127b7565b80601f016020809104026020016040519081016040528092919081815260200182805461073d906127b7565b801561078a5780601f1061075f5761010080835404028352916020019161078a565b820191906000526020600020905b81548152906001019060200180831161076d57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108125760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061083982610aaa565b9050806001600160a01b0316836001600160a01b031614156108a75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610809565b336001600160a01b03821614806108c357506108c3813361064f565b6109355760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610809565b61093f83836113bc565b505050565b600d8054610951906127b7565b80601f016020809104026020016040519081016040528092919081815260200182805461097d906127b7565b80156109ca5780601f1061099f576101008083540402835291602001916109ca565b820191906000526020600020905b8154815290600101906020018083116109ad57829003601f168201915b505050505081565b6109dc338261142a565b6109f85760405162461bcd60e51b815260040161080990612697565b61093f838383611521565b600c8054610951906127b7565b61093f83838360405180602001604052806000815250610e93565b6006546001600160a01b03163314610a555760405162461bcd60e51b815260040161080990612621565b61093f600c8383611f81565b6006546001600160a01b03163314610a8b5760405162461bcd60e51b815260040161080990612621565b600b805462ff0000198116620100009182900460ff1615909102179055565b6000818152600260205260408120546001600160a01b0316806106fc5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610809565b60006001600160a01b038216610b8c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610809565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610bd25760405162461bcd60e51b815260040161080990612621565b610bdc60006116c1565b565b6006546001600160a01b03163314610c085760405162461bcd60e51b815260040161080990612621565b60405133904780156108fc02916000818181858888f19350505050158015610c34573d6000803e3d6000fd5b50565b606060018054610711906127b7565b6006546001600160a01b03163314610c705760405162461bcd60e51b815260040161080990612621565b600b805460ff19811660ff90911615179055565b610c8f338383611713565b5050565b600e8054610951906127b7565b600954821115610cc25760405162461bcd60e51b8152600401610809906124fe565b600b5462010000900460ff16610cea5760405162461bcd60e51b8152600401610809906125db565b610d88610d823383600d8054610cff906127b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2b906127b7565b8015610d785780601f10610d4d57610100808354040283529160200191610d78565b820191906000526020600020905b815481529060010190602001808311610d5b57829003601f168201915b50505050506117e2565b84611818565b610da45760405162461bcd60e51b8152600401610809906126e8565b60075482600a54610db59190612729565b1115610dd35760405162461bcd60e51b815260040161080990612585565b336000908152600f60205260409020548190610def9084612729565b1115610e0d5760405162461bcd60e51b815260040161080990612656565b336000908152600f6020526040902054610e28908390612729565b336000908152600f60205260408120919091555b82811015610e8d576000600a546001610e559190612729565b90506001600a6000828254610e6a9190612729565b90915550610e7a90503382611849565b5080610e85816127f2565b915050610e3c565b50505050565b610e9d338361142a565b610eb95760405162461bcd60e51b815260040161080990612697565b610e8d84848484611863565b6006546001600160a01b03163314610eef5760405162461bcd60e51b815260040161080990612621565b60005b8181101561093f576000600a546001610f0b9190612729565b90506001600a6000828254610f209190612729565b90915550610f569050848484818110610f3b57610f3b612863565b9050602002016020810190610f5091906120c3565b82611849565b5080610f61816127f2565b915050610ef2565b6000818152600260205260409020546060906001600160a01b0316610fc75760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610809565b600c610fd283611896565b604051602001610fe39291906123e0565b6040516020818303038152906040529050919050565b60095482111561101b5760405162461bcd60e51b8152600401610809906124fe565b600b54610100900460ff166110425760405162461bcd60e51b8152600401610809906125db565b611057610d823383600e8054610cff906127b7565b6110735760405162461bcd60e51b8152600401610809906126e8565b60075482600a546110849190612729565b11156110a25760405162461bcd60e51b815260040161080990612585565b3360009081526010602052604090205481906110be9084612729565b11156110dc5760405162461bcd60e51b815260040161080990612656565b34826008546110eb9190612755565b11156111395760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610809565b33600090815260106020526040902054611154908390612729565b336000908152601060205260408120919091555b82811015610e8d576000600a5460016111819190612729565b90506001600a60008282546111969190612729565b909155506111a690503382611849565b50806111b1816127f2565b915050611168565b6006546001600160a01b031633146111e35760405162461bcd60e51b815260040161080990612621565b600b805461ff001981166101009182900460ff1615909102179055565b6009548111156112225760405162461bcd60e51b8152600401610809906124fe565b600b5460ff166112445760405162461bcd60e51b8152600401610809906125db565b60075481600a546112559190612729565b11156112735760405162461bcd60e51b815260040161080990612585565b34816008546112829190612755565b11156112d05760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610809565b60005b81811015610c8f576000600a5460016112ec9190612729565b90506001600a60008282546113019190612729565b9091555061131190503382611849565b508061131c816127f2565b9150506112d3565b6006546001600160a01b0316331461134e5760405162461bcd60e51b815260040161080990612621565b6001600160a01b0381166113b35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610809565b610c34816116c1565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906113f182610aaa565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166114a35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610809565b60006114ae83610aaa565b9050806001600160a01b0316846001600160a01b031614806114e95750836001600160a01b03166114de84610794565b6001600160a01b0316145b8061151957506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661153482610aaa565b6001600160a01b03161461159c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610809565b6001600160a01b0382166115fe5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610809565b6116096000826113bc565b6001600160a01b0383166000908152600360205260408120805460019290611632908490612774565b90915550506001600160a01b0382166000908152600360205260408120805460019290611660908490612729565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156117755760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610809565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60008383836040516020016117f9939291906124c4565b6040516020818303038152906040528051906020012090509392505050565b600b54600090630100000090046001600160a01b03166118388484611994565b6001600160a01b0316149392505050565b610c8f8282604051806020016040528060008152506119b8565b61186e848484611521565b61187a848484846119eb565b610e8d5760405162461bcd60e51b815260040161080990612533565b6060816118ba5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156118e457806118ce816127f2565b91506118dd9050600a83612741565b91506118be565b60008167ffffffffffffffff8111156118ff576118ff612879565b6040519080825280601f01601f191660200182016040528015611929576020820181803683370190505b5090505b84156115195761193e600183612774565b915061194b600a8661280d565b611956906030612729565b60f81b81838151811061196b5761196b612863565b60200101906001600160f81b031916908160001a90535061198d600a86612741565b945061192d565b60008060006119a38585611af8565b915091506119b081611b68565b509392505050565b6119c28383611d23565b6119cf60008484846119eb565b61093f5760405162461bcd60e51b815260040161080990612533565b60006001600160a01b0384163b15611aed57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611a2f903390899088908890600401612487565b602060405180830381600087803b158015611a4957600080fd5b505af1925050508015611a79575060408051601f3d908101601f19168201909252611a76918101906122b4565b60015b611ad3573d808015611aa7576040519150601f19603f3d011682016040523d82523d6000602084013e611aac565b606091505b508051611acb5760405162461bcd60e51b815260040161080990612533565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611519565b506001949350505050565b600080825160411415611b2f5760208301516040840151606085015160001a611b2387828585611e65565b94509450505050611b61565b825160401415611b595760208301516040840151611b4e868383611f52565b935093505050611b61565b506000905060025b9250929050565b6000816004811115611b7c57611b7c61284d565b1415611b855750565b6001816004811115611b9957611b9961284d565b1415611be75760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610809565b6002816004811115611bfb57611bfb61284d565b1415611c495760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610809565b6003816004811115611c5d57611c5d61284d565b1415611cb65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610809565b6004816004811115611cca57611cca61284d565b1415610c345760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610809565b6001600160a01b038216611d795760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610809565b6000818152600260205260409020546001600160a01b031615611dde5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610809565b6001600160a01b0382166000908152600360205260408120805460019290611e07908490612729565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611e9c5750600090506003611f49565b8460ff16601b14158015611eb457508460ff16601c14155b15611ec55750600090506004611f49565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611f19573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611f4257600060019250925050611f49565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b01611f7387828885611e65565b935093505050935093915050565b828054611f8d906127b7565b90600052602060002090601f016020900481019282611faf5760008555611ff5565b82601f10611fc85782800160ff19823516178555611ff5565b82800160010185558215611ff5579182015b82811115611ff5578235825591602001919060010190611fda565b50612001929150612005565b5090565b5b808211156120015760008155600101612006565b80356001600160a01b038116811461203157600080fd5b919050565b600082601f83011261204757600080fd5b813567ffffffffffffffff8082111561206257612062612879565b604051601f8301601f19908116603f0116810190828211818310171561208a5761208a612879565b816040528381528660208588010111156120a357600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000602082840312156120d557600080fd5b6120de8261201a565b9392505050565b600080604083850312156120f857600080fd5b6121018361201a565b915061210f6020840161201a565b90509250929050565b60008060006060848603121561212d57600080fd5b6121368461201a565b92506121446020850161201a565b9150604084013590509250925092565b6000806000806080858703121561216a57600080fd5b6121738561201a565b93506121816020860161201a565b925060408501359150606085013567ffffffffffffffff8111156121a457600080fd5b6121b087828801612036565b91505092959194509250565b600080604083850312156121cf57600080fd5b6121d88361201a565b9150602083013580151581146121ed57600080fd5b809150509250929050565b6000806040838503121561220b57600080fd5b6122148361201a565b946020939093013593505050565b6000806020838503121561223557600080fd5b823567ffffffffffffffff8082111561224d57600080fd5b818501915085601f83011261226157600080fd5b81358181111561227057600080fd5b8660208260051b850101111561228557600080fd5b60209290920196919550909350505050565b6000602082840312156122a957600080fd5b81356120de8161288f565b6000602082840312156122c657600080fd5b81516120de8161288f565b6000806000606084860312156122e657600080fd5b833567ffffffffffffffff8111156122fd57600080fd5b61230986828701612036565b9660208601359650604090950135949350505050565b6000806020838503121561233257600080fd5b823567ffffffffffffffff8082111561234a57600080fd5b818501915085601f83011261235e57600080fd5b81358181111561236d57600080fd5b86602082850101111561228557600080fd5b60006020828403121561239157600080fd5b5035919050565b600081518084526123b081602086016020860161278b565b601f01601f19169290920160200192915050565b600081516123d681856020860161278b565b9290920192915050565b600080845481600182811c9150808316806123fc57607f831692505b602080841082141561241c57634e487b7160e01b86526022600452602486fd5b81801561243057600181146124415761246e565b60ff1986168952848901965061246e565b60008b81526020902060005b868110156124665781548b82015290850190830161244d565b505084890196505b50505050505061247e81856123c4565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906124ba90830184612398565b9695505050505050565b60018060a01b038416815282602082015260606040820152600061247e6060830184612398565b6020815260006120de6020830184612398565b6020808252818101527f4e756d626572206f6620746f6b656e732065786365656473206d6178696d756d604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526036908201527f507572636861736520776f756c6420657863656564206d617820737570706c796040820152751037b3103a3934b13aba32b9903337b91039b0b6329760511b606082015260800190565b60208082526026908201527f53616c65206d7573742062652061637469766520746f206d696e74206120747260408201526534b13aba329760d11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526021908201527f4e756d626572206f6620746f6b656e7320776f756c6420657863656564206d616040820152600f60fb1b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526021908201527f5468697320686173682773207369676e617475726520697320696e76616c69646040820152601760f91b606082015260800190565b6000821982111561273c5761273c612821565b500190565b60008261275057612750612837565b500490565b600081600019048311821515161561276f5761276f612821565b500290565b60008282101561278657612786612821565b500390565b60005b838110156127a657818101518382015260200161278e565b83811115610e8d5750506000910152565b600181811c908216806127cb57607f821691505b602082108114156127ec57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561280657612806612821565b5060010190565b60008261281c5761281c612837565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610c3457600080fdfea264697066735822122014f5926456476a99e3f26f10d6da748961967cf0256c52fe7fe4008bad72d7e164736f6c63430008070033
Deployed Bytecode
0x6080604052600436106102295760003560e01c8063715018a611610123578063b88d4fde116100ab578063cf7287b21161006f578063cf7287b214610609578063d1beca641461061f578063e985e9c514610634578063efd0cbf91461067d578063f2fde38b1461069057600080fd5b8063b88d4fde14610580578063c5953170146105a0578063c73c7414146105c0578063c87b56dd146105d6578063cc726eed146105f657600080fd5b806395d89b41116100f257806395d89b411461050e578063a10866ef14610523578063a22cb46514610538578063ae24595c14610558578063af4925fa1461056d57600080fd5b8063715018a6146104b05780637362377b146104c557806378231978146104da5780638da5cb5b146104f057600080fd5b80632d9ec8f4116101b157806356b644851161017557806356b64485146104015780635fb0f37f146104165780636352211e146104435780636de282ce1461046357806370a082311461049057600080fd5b80632d9ec8f4146103765780633c729fef146103965780633ca4fb76146103ac57806342842e0e146103c157806355f804b3146103e157600080fd5b80630fcf2e75116101f85780630fcf2e75146102e957806310b5454d14610303578063118c4f131461032257806318160ddd1461033757806323b872dd1461035657600080fd5b806301ffc9a71461023857806306fdde031461026d578063081812fc1461028f578063095ea7b3146102c757600080fd5b3661023357600080fd5b600080fd5b34801561024457600080fd5b50610258610253366004612297565b6106b0565b60405190151581526020015b60405180910390f35b34801561027957600080fd5b50610282610702565b60405161026491906124eb565b34801561029b57600080fd5b506102af6102aa36600461237f565b610794565b6040516001600160a01b039091168152602001610264565b3480156102d357600080fd5b506102e76102e23660046121f8565b61082e565b005b3480156102f557600080fd5b50600b546102589060ff1681565b34801561030f57600080fd5b50600b5461025890610100900460ff1681565b34801561032e57600080fd5b50610282610944565b34801561034357600080fd5b50600a545b604051908152602001610264565b34801561036257600080fd5b506102e7610371366004612118565b6109d2565b34801561038257600080fd5b50600b546102589062010000900460ff1681565b3480156103a257600080fd5b5061034860085481565b3480156103b857600080fd5b50610282610a03565b3480156103cd57600080fd5b506102e76103dc366004612118565b610a10565b3480156103ed57600080fd5b506102e76103fc36600461231f565b610a2b565b34801561040d57600080fd5b506102e7610a61565b34801561042257600080fd5b506103486104313660046120c3565b60106020526000908152604090205481565b34801561044f57600080fd5b506102af61045e36600461237f565b610aaa565b34801561046f57600080fd5b5061034861047e3660046120c3565b600f6020526000908152604090205481565b34801561049c57600080fd5b506103486104ab3660046120c3565b610b21565b3480156104bc57600080fd5b506102e7610ba8565b3480156104d157600080fd5b506102e7610bde565b3480156104e657600080fd5b50610348600a5481565b3480156104fc57600080fd5b506006546001600160a01b03166102af565b34801561051a57600080fd5b50610282610c37565b34801561052f57600080fd5b506102e7610c46565b34801561054457600080fd5b506102e76105533660046121bc565b610c84565b34801561056457600080fd5b50610282610c93565b6102e761057b3660046122d1565b610ca0565b34801561058c57600080fd5b506102e761059b366004612154565b610e93565b3480156105ac57600080fd5b506102e76105bb366004612222565b610ec5565b3480156105cc57600080fd5b5061034860075481565b3480156105e257600080fd5b506102826105f136600461237f565b610f69565b6102e76106043660046122d1565b610ff9565b34801561061557600080fd5b5061034860095481565b34801561062b57600080fd5b506102e76111b9565b34801561064057600080fd5b5061025861064f3660046120e5565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6102e761068b36600461237f565b611200565b34801561069c57600080fd5b506102e76106ab3660046120c3565b611324565b60006001600160e01b031982166380ac58cd60e01b14806106e157506001600160e01b03198216635b5e139f60e01b145b806106fc57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610711906127b7565b80601f016020809104026020016040519081016040528092919081815260200182805461073d906127b7565b801561078a5780601f1061075f5761010080835404028352916020019161078a565b820191906000526020600020905b81548152906001019060200180831161076d57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108125760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061083982610aaa565b9050806001600160a01b0316836001600160a01b031614156108a75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610809565b336001600160a01b03821614806108c357506108c3813361064f565b6109355760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610809565b61093f83836113bc565b505050565b600d8054610951906127b7565b80601f016020809104026020016040519081016040528092919081815260200182805461097d906127b7565b80156109ca5780601f1061099f576101008083540402835291602001916109ca565b820191906000526020600020905b8154815290600101906020018083116109ad57829003601f168201915b505050505081565b6109dc338261142a565b6109f85760405162461bcd60e51b815260040161080990612697565b61093f838383611521565b600c8054610951906127b7565b61093f83838360405180602001604052806000815250610e93565b6006546001600160a01b03163314610a555760405162461bcd60e51b815260040161080990612621565b61093f600c8383611f81565b6006546001600160a01b03163314610a8b5760405162461bcd60e51b815260040161080990612621565b600b805462ff0000198116620100009182900460ff1615909102179055565b6000818152600260205260408120546001600160a01b0316806106fc5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610809565b60006001600160a01b038216610b8c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610809565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610bd25760405162461bcd60e51b815260040161080990612621565b610bdc60006116c1565b565b6006546001600160a01b03163314610c085760405162461bcd60e51b815260040161080990612621565b60405133904780156108fc02916000818181858888f19350505050158015610c34573d6000803e3d6000fd5b50565b606060018054610711906127b7565b6006546001600160a01b03163314610c705760405162461bcd60e51b815260040161080990612621565b600b805460ff19811660ff90911615179055565b610c8f338383611713565b5050565b600e8054610951906127b7565b600954821115610cc25760405162461bcd60e51b8152600401610809906124fe565b600b5462010000900460ff16610cea5760405162461bcd60e51b8152600401610809906125db565b610d88610d823383600d8054610cff906127b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2b906127b7565b8015610d785780601f10610d4d57610100808354040283529160200191610d78565b820191906000526020600020905b815481529060010190602001808311610d5b57829003601f168201915b50505050506117e2565b84611818565b610da45760405162461bcd60e51b8152600401610809906126e8565b60075482600a54610db59190612729565b1115610dd35760405162461bcd60e51b815260040161080990612585565b336000908152600f60205260409020548190610def9084612729565b1115610e0d5760405162461bcd60e51b815260040161080990612656565b336000908152600f6020526040902054610e28908390612729565b336000908152600f60205260408120919091555b82811015610e8d576000600a546001610e559190612729565b90506001600a6000828254610e6a9190612729565b90915550610e7a90503382611849565b5080610e85816127f2565b915050610e3c565b50505050565b610e9d338361142a565b610eb95760405162461bcd60e51b815260040161080990612697565b610e8d84848484611863565b6006546001600160a01b03163314610eef5760405162461bcd60e51b815260040161080990612621565b60005b8181101561093f576000600a546001610f0b9190612729565b90506001600a6000828254610f209190612729565b90915550610f569050848484818110610f3b57610f3b612863565b9050602002016020810190610f5091906120c3565b82611849565b5080610f61816127f2565b915050610ef2565b6000818152600260205260409020546060906001600160a01b0316610fc75760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610809565b600c610fd283611896565b604051602001610fe39291906123e0565b6040516020818303038152906040529050919050565b60095482111561101b5760405162461bcd60e51b8152600401610809906124fe565b600b54610100900460ff166110425760405162461bcd60e51b8152600401610809906125db565b611057610d823383600e8054610cff906127b7565b6110735760405162461bcd60e51b8152600401610809906126e8565b60075482600a546110849190612729565b11156110a25760405162461bcd60e51b815260040161080990612585565b3360009081526010602052604090205481906110be9084612729565b11156110dc5760405162461bcd60e51b815260040161080990612656565b34826008546110eb9190612755565b11156111395760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610809565b33600090815260106020526040902054611154908390612729565b336000908152601060205260408120919091555b82811015610e8d576000600a5460016111819190612729565b90506001600a60008282546111969190612729565b909155506111a690503382611849565b50806111b1816127f2565b915050611168565b6006546001600160a01b031633146111e35760405162461bcd60e51b815260040161080990612621565b600b805461ff001981166101009182900460ff1615909102179055565b6009548111156112225760405162461bcd60e51b8152600401610809906124fe565b600b5460ff166112445760405162461bcd60e51b8152600401610809906125db565b60075481600a546112559190612729565b11156112735760405162461bcd60e51b815260040161080990612585565b34816008546112829190612755565b11156112d05760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610809565b60005b81811015610c8f576000600a5460016112ec9190612729565b90506001600a60008282546113019190612729565b9091555061131190503382611849565b508061131c816127f2565b9150506112d3565b6006546001600160a01b0316331461134e5760405162461bcd60e51b815260040161080990612621565b6001600160a01b0381166113b35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610809565b610c34816116c1565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906113f182610aaa565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166114a35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610809565b60006114ae83610aaa565b9050806001600160a01b0316846001600160a01b031614806114e95750836001600160a01b03166114de84610794565b6001600160a01b0316145b8061151957506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661153482610aaa565b6001600160a01b03161461159c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610809565b6001600160a01b0382166115fe5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610809565b6116096000826113bc565b6001600160a01b0383166000908152600360205260408120805460019290611632908490612774565b90915550506001600160a01b0382166000908152600360205260408120805460019290611660908490612729565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156117755760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610809565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60008383836040516020016117f9939291906124c4565b6040516020818303038152906040528051906020012090509392505050565b600b54600090630100000090046001600160a01b03166118388484611994565b6001600160a01b0316149392505050565b610c8f8282604051806020016040528060008152506119b8565b61186e848484611521565b61187a848484846119eb565b610e8d5760405162461bcd60e51b815260040161080990612533565b6060816118ba5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156118e457806118ce816127f2565b91506118dd9050600a83612741565b91506118be565b60008167ffffffffffffffff8111156118ff576118ff612879565b6040519080825280601f01601f191660200182016040528015611929576020820181803683370190505b5090505b84156115195761193e600183612774565b915061194b600a8661280d565b611956906030612729565b60f81b81838151811061196b5761196b612863565b60200101906001600160f81b031916908160001a90535061198d600a86612741565b945061192d565b60008060006119a38585611af8565b915091506119b081611b68565b509392505050565b6119c28383611d23565b6119cf60008484846119eb565b61093f5760405162461bcd60e51b815260040161080990612533565b60006001600160a01b0384163b15611aed57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611a2f903390899088908890600401612487565b602060405180830381600087803b158015611a4957600080fd5b505af1925050508015611a79575060408051601f3d908101601f19168201909252611a76918101906122b4565b60015b611ad3573d808015611aa7576040519150601f19603f3d011682016040523d82523d6000602084013e611aac565b606091505b508051611acb5760405162461bcd60e51b815260040161080990612533565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611519565b506001949350505050565b600080825160411415611b2f5760208301516040840151606085015160001a611b2387828585611e65565b94509450505050611b61565b825160401415611b595760208301516040840151611b4e868383611f52565b935093505050611b61565b506000905060025b9250929050565b6000816004811115611b7c57611b7c61284d565b1415611b855750565b6001816004811115611b9957611b9961284d565b1415611be75760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610809565b6002816004811115611bfb57611bfb61284d565b1415611c495760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610809565b6003816004811115611c5d57611c5d61284d565b1415611cb65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610809565b6004816004811115611cca57611cca61284d565b1415610c345760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610809565b6001600160a01b038216611d795760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610809565b6000818152600260205260409020546001600160a01b031615611dde5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610809565b6001600160a01b0382166000908152600360205260408120805460019290611e07908490612729565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611e9c5750600090506003611f49565b8460ff16601b14158015611eb457508460ff16601c14155b15611ec55750600090506004611f49565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611f19573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611f4257600060019250925050611f49565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b01611f7387828885611e65565b935093505050935093915050565b828054611f8d906127b7565b90600052602060002090601f016020900481019282611faf5760008555611ff5565b82601f10611fc85782800160ff19823516178555611ff5565b82800160010185558215611ff5579182015b82811115611ff5578235825591602001919060010190611fda565b50612001929150612005565b5090565b5b808211156120015760008155600101612006565b80356001600160a01b038116811461203157600080fd5b919050565b600082601f83011261204757600080fd5b813567ffffffffffffffff8082111561206257612062612879565b604051601f8301601f19908116603f0116810190828211818310171561208a5761208a612879565b816040528381528660208588010111156120a357600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000602082840312156120d557600080fd5b6120de8261201a565b9392505050565b600080604083850312156120f857600080fd5b6121018361201a565b915061210f6020840161201a565b90509250929050565b60008060006060848603121561212d57600080fd5b6121368461201a565b92506121446020850161201a565b9150604084013590509250925092565b6000806000806080858703121561216a57600080fd5b6121738561201a565b93506121816020860161201a565b925060408501359150606085013567ffffffffffffffff8111156121a457600080fd5b6121b087828801612036565b91505092959194509250565b600080604083850312156121cf57600080fd5b6121d88361201a565b9150602083013580151581146121ed57600080fd5b809150509250929050565b6000806040838503121561220b57600080fd5b6122148361201a565b946020939093013593505050565b6000806020838503121561223557600080fd5b823567ffffffffffffffff8082111561224d57600080fd5b818501915085601f83011261226157600080fd5b81358181111561227057600080fd5b8660208260051b850101111561228557600080fd5b60209290920196919550909350505050565b6000602082840312156122a957600080fd5b81356120de8161288f565b6000602082840312156122c657600080fd5b81516120de8161288f565b6000806000606084860312156122e657600080fd5b833567ffffffffffffffff8111156122fd57600080fd5b61230986828701612036565b9660208601359650604090950135949350505050565b6000806020838503121561233257600080fd5b823567ffffffffffffffff8082111561234a57600080fd5b818501915085601f83011261235e57600080fd5b81358181111561236d57600080fd5b86602082850101111561228557600080fd5b60006020828403121561239157600080fd5b5035919050565b600081518084526123b081602086016020860161278b565b601f01601f19169290920160200192915050565b600081516123d681856020860161278b565b9290920192915050565b600080845481600182811c9150808316806123fc57607f831692505b602080841082141561241c57634e487b7160e01b86526022600452602486fd5b81801561243057600181146124415761246e565b60ff1986168952848901965061246e565b60008b81526020902060005b868110156124665781548b82015290850190830161244d565b505084890196505b50505050505061247e81856123c4565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906124ba90830184612398565b9695505050505050565b60018060a01b038416815282602082015260606040820152600061247e6060830184612398565b6020815260006120de6020830184612398565b6020808252818101527f4e756d626572206f6620746f6b656e732065786365656473206d6178696d756d604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526036908201527f507572636861736520776f756c6420657863656564206d617820737570706c796040820152751037b3103a3934b13aba32b9903337b91039b0b6329760511b606082015260800190565b60208082526026908201527f53616c65206d7573742062652061637469766520746f206d696e74206120747260408201526534b13aba329760d11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526021908201527f4e756d626572206f6620746f6b656e7320776f756c6420657863656564206d616040820152600f60fb1b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526021908201527f5468697320686173682773207369676e617475726520697320696e76616c69646040820152601760f91b606082015260800190565b6000821982111561273c5761273c612821565b500190565b60008261275057612750612837565b500490565b600081600019048311821515161561276f5761276f612821565b500290565b60008282101561278657612786612821565b500390565b60005b838110156127a657818101518382015260200161278e565b83811115610e8d5750506000910152565b600181811c908216806127cb57607f821691505b602082108114156127ec57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561280657612806612821565b5060010190565b60008261281c5761281c612837565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610c3457600080fdfea264697066735822122014f5926456476a99e3f26f10d6da748961967cf0256c52fe7fe4008bad72d7e164736f6c63430008070033
Deployed Bytecode Sourcemap
45817:5198:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50996:8;;;45817:5198;;;;;;;;;;;;;;;;;;;;;;;;;;50996:8;;;45817:5198;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50996:8;;;45817:5198;;;;;;;;;;;;;;;;;;;;;50996:8;;;45817:5198;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50996:8;;;45817:5198;;;;;;;;;;;;;;;;;;;;;;;;;;50996:8;;;45817:5198;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50996:8;;;45817:5198;;;;;;;;;;;;;;;;;;;;;50996:8;;;45817:5198;;;;50929:8;;;45817:5198;50996:8;;;33308:305;;;;;;;;;;-1:-1:-1;33308:305:0;;;;;:::i;:::-;;:::i;:::-;;;8113:14:1;;8106:22;8088:41;;8076:2;8061:18;33308:305:0;;;;;;;;34253:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;35812:221::-;;;;;;;;;;-1:-1:-1;35812:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7019:32:1;;;7001:51;;6989:2;6974:18;35812:221:0;6855:203:1;35335:411:0;;;;;;;;;;-1:-1:-1;35335:411:0;;;;;:::i;:::-;;:::i;:::-;;46081:38;;;;;;;;;;-1:-1:-1;46081:38:0;;;;;;;;46126:41;;;;;;;;;;-1:-1:-1;46126:41:0;;;;;;;;;;;46333:31;;;;;;;;;;;;;:::i;50400:91::-;;;;;;;;;;-1:-1:-1;50468:15:0;;50400:91;;;19102:25:1;;;19090:2;19075:18;50400:91:0;18956:177:1;36562:339:0;;;;;;;;;;-1:-1:-1;36562:339:0;;;;;:::i;:::-;;:::i;46174:47::-;;;;;;;;;;-1:-1:-1;46174:47:0;;;;;;;;;;;45958:38;;;;;;;;;;;;;;;;46299:27;;;;;;;;;;;;;:::i;36972:185::-;;;;;;;;;;-1:-1:-1;36972:185:0;;;;;:::i;:::-;;:::i;46859:98::-;;;;;;;;;;-1:-1:-1;46859:98:0;;;;;:::i;:::-;;:::i;50747:136::-;;;;;;;;;;;;;:::i;46463:47::-;;;;;;;;;;-1:-1:-1;46463:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;33947:239;;;;;;;;;;-1:-1:-1;33947:239:0;;;;;:::i;:::-;;:::i;46409:47::-;;;;;;;;;;-1:-1:-1;46409:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;33677:208;;;;;;;;;;-1:-1:-1;33677:208:0;;;;;:::i;:::-;;:::i;14296:103::-;;;;;;;;;;;;;:::i;46621:114::-;;;;;;;;;;;;;:::i;46044:30::-;;;;;;;;;;;;;;;;13645:87;;;;;;;;;;-1:-1:-1;13718:6:0;;-1:-1:-1;;;;;13718:6:0;13645:87;;34422:104;;;;;;;;;;;;;:::i;50499:109::-;;;;;;;;;;;;;:::i;36105:155::-;;;;;;;;;;-1:-1:-1;36105:155:0;;;;;:::i;:::-;;:::i;46371:31::-;;;;;;;;;;;;;:::i;48208:900::-;;;;;;:::i;:::-;;:::i;37228:328::-;;;;;;;;;;-1:-1:-1;37228:328:0;;;;;:::i;:::-;;:::i;50111:281::-;;;;;;;;;;-1:-1:-1;50111:281:0;;;;;:::i;:::-;;:::i;45922:29::-;;;;;;;;;;;;;;;;46965:241;;;;;;;;;;-1:-1:-1;46965:241:0;;;;;:::i;:::-;;:::i;49116:983::-;;;;;;:::i;:::-;;:::i;46003:34::-;;;;;;;;;;;;;;;;50616:119;;;;;;;;;;;;;:::i;36331:164::-;;;;;;;;;;-1:-1:-1;36331:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;36452:25:0;;;36428:4;36452:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;36331:164;47551:649;;;;;;:::i;:::-;;:::i;14554:201::-;;;;;;;;;;-1:-1:-1;14554:201:0;;;;;:::i;:::-;;:::i;33308:305::-;33410:4;-1:-1:-1;;;;;;33447:40:0;;-1:-1:-1;;;33447:40:0;;:105;;-1:-1:-1;;;;;;;33504:48:0;;-1:-1:-1;;;33504:48:0;33447:105;:158;;;-1:-1:-1;;;;;;;;;;26186:40:0;;;33569:36;33427:178;33308:305;-1:-1:-1;;33308:305:0:o;34253:100::-;34307:13;34340:5;34333:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34253:100;:::o;35812:221::-;35888:7;39155:16;;;:7;:16;;;;;;-1:-1:-1;;;;;39155:16:0;35908:73;;;;-1:-1:-1;;;35908:73:0;;16350:2:1;35908:73:0;;;16332:21:1;16389:2;16369:18;;;16362:30;16428:34;16408:18;;;16401:62;-1:-1:-1;;;16479:18:1;;;16472:42;16531:19;;35908:73:0;;;;;;;;;-1:-1:-1;36001:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;36001:24:0;;35812:221::o;35335:411::-;35416:13;35432:23;35447:7;35432:14;:23::i;:::-;35416:39;;35480:5;-1:-1:-1;;;;;35474:11:0;:2;-1:-1:-1;;;;;35474:11:0;;;35466:57;;;;-1:-1:-1;;;35466:57:0;;17534:2:1;35466:57:0;;;17516:21:1;17573:2;17553:18;;;17546:30;17612:34;17592:18;;;17585:62;-1:-1:-1;;;17663:18:1;;;17656:31;17704:19;;35466:57:0;17332:397:1;35466:57:0;12449:10;-1:-1:-1;;;;;35558:21:0;;;;:62;;-1:-1:-1;35583:37:0;35600:5;12449:10;36331:164;:::i;35583:37::-;35536:168;;;;-1:-1:-1;;;35536:168:0;;14340:2:1;35536:168:0;;;14322:21:1;14379:2;14359:18;;;14352:30;14418:34;14398:18;;;14391:62;14489:26;14469:18;;;14462:54;14533:19;;35536:168:0;14138:420:1;35536:168:0;35717:21;35726:2;35730:7;35717:8;:21::i;:::-;35405:341;35335:411;;:::o;46333:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36562:339::-;36757:41;12449:10;36790:7;36757:18;:41::i;:::-;36749:103;;;;-1:-1:-1;;;36749:103:0;;;;;;;:::i;:::-;36865:28;36875:4;36881:2;36885:7;36865:9;:28::i;46299:27::-;;;;;;;:::i;36972:185::-;37110:39;37127:4;37133:2;37137:7;37110:39;;;;;;;;;;;;:16;:39::i;46859:98::-;13718:6;;-1:-1:-1;;;;;13718:6:0;12449:10;13865:23;13857:68;;;;-1:-1:-1;;;13857:68:0;;;;;;;:::i;:::-;46930:19:::1;:13;46946:3:::0;;46930:19:::1;:::i;50747:136::-:0;13718:6;;-1:-1:-1;;;;;13718:6:0;12449:10;13865:23;13857:68;;;;-1:-1:-1;;;13857:68:0;;;;;;;:::i;:::-;50848:27:::1;::::0;;-1:-1:-1;;50817:58:0;::::1;50848:27:::0;;;;::::1;;;50847:28;50817:58:::0;;::::1;;::::0;;50747:136::o;33947:239::-;34019:7;34055:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34055:16:0;34090:19;34082:73;;;;-1:-1:-1;;;34082:73:0;;15176:2:1;34082:73:0;;;15158:21:1;15215:2;15195:18;;;15188:30;15254:34;15234:18;;;15227:62;-1:-1:-1;;;15305:18:1;;;15298:39;15354:19;;34082:73:0;14974:405:1;33677:208:0;33749:7;-1:-1:-1;;;;;33777:19:0;;33769:74;;;;-1:-1:-1;;;33769:74:0;;14765:2:1;33769:74:0;;;14747:21:1;14804:2;14784:18;;;14777:30;14843:34;14823:18;;;14816:62;-1:-1:-1;;;14894:18:1;;;14887:40;14944:19;;33769:74:0;14563:406:1;33769:74:0;-1:-1:-1;;;;;;33861:16:0;;;;;:9;:16;;;;;;;33677:208::o;14296:103::-;13718:6;;-1:-1:-1;;;;;13718:6:0;12449:10;13865:23;13857:68;;;;-1:-1:-1;;;13857:68:0;;;;;;;:::i;:::-;14361:30:::1;14388:1;14361:18;:30::i;:::-;14296:103::o:0;46621:114::-;13718:6;;-1:-1:-1;;;;;13718:6:0;12449:10;13865:23;13857:68;;;;-1:-1:-1;;;13857:68:0;;;;;;;:::i;:::-;46676:51:::1;::::0;46684:10:::1;::::0;46705:21:::1;46676:51:::0;::::1;;;::::0;::::1;::::0;;;46705:21;46684:10;46676:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;46621:114::o:0;34422:104::-;34478:13;34511:7;34504:14;;;;;:::i;50499:109::-;13718:6;;-1:-1:-1;;;;;13718:6:0;12449:10;13865:23;13857:68;;;;-1:-1:-1;;;13857:68:0;;;;;;;:::i;:::-;50582:18:::1;::::0;;-1:-1:-1;;50560:40:0;::::1;50582:18;::::0;;::::1;50581:19;50560:40;::::0;;50499:109::o;36105:155::-;36200:52;12449:10;36233:8;36243;36200:18;:52::i;:::-;36105:155;;:::o;46371:31::-;;;;;;;:::i;48208:900::-;48350:15;;48332:14;:33;;48324:78;;;;-1:-1:-1;;;48324:78:0;;;;;;;:::i;:::-;48421:27;;;;;;;48413:78;;;;-1:-1:-1;;;48413:78:0;;;;;;;:::i;:::-;48510:50;48518:30;48524:10;48536:3;48541:6;48518:30;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:30::i;:::-;48550:9;48510:7;:50::i;:::-;48502:96;;;;-1:-1:-1;;;48502:96:0;;;;;;;:::i;:::-;48653:8;;48635:14;48617:15;;:32;;;;:::i;:::-;:44;;48609:111;;;;-1:-1:-1;;;48609:111:0;;;;;;;:::i;:::-;48769:10;48756:24;;;;:12;:24;;;;;;48784:3;;48739:41;;:14;:41;:::i;:::-;:48;;48731:94;;;;-1:-1:-1;;;48731:94:0;;;;;;;:::i;:::-;48876:10;48863:24;;;;:12;:24;;;;;;:41;;48890:14;;48863:41;:::i;:::-;48849:10;48836:24;;;;:12;:24;;;;;:68;;;;48915:186;48936:14;48932:1;:18;48915:186;;;48972:15;48990;;49008:1;48990:19;;;;:::i;:::-;48972:37;;49043:1;49024:15;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;49059:30:0;;-1:-1:-1;49069:10:0;49081:7;49059:9;:30::i;:::-;-1:-1:-1;48952:3:0;;;;:::i;:::-;;;;48915:186;;;;48208:900;;;:::o;37228:328::-;37403:41;12449:10;37436:7;37403:18;:41::i;:::-;37395:103;;;;-1:-1:-1;;;37395:103:0;;;;;;;:::i;:::-;37509:39;37523:4;37529:2;37533:7;37542:5;37509:13;:39::i;50111:281::-;13718:6;;-1:-1:-1;;;;;13718:6:0;12449:10;13865:23;13857:68;;;;-1:-1:-1;;;13857:68:0;;;;;;;:::i;:::-;50197:9:::1;50192:193;50212:20:::0;;::::1;50192:193;;;50254:15;50272;;50290:1;50272:19;;;;:::i;:::-;50254:37;;50325:1;50306:15;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;50341:32:0::1;::::0;-1:-1:-1;50351:9:0;;50361:1;50351:12;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;50365:7;50341:9;:32::i;:::-;-1:-1:-1::0;50234:3:0;::::1;::::0;::::1;:::i;:::-;;;;50192:193;;46965:241:::0;39131:4;39155:16;;;:7;:16;;;;;;47038:13;;-1:-1:-1;;;;;39155:16:0;47064:49;;;;-1:-1:-1;;;47064:49:0;;13578:2:1;47064:49:0;;;13560:21:1;13617:2;13597:18;;;13590:30;-1:-1:-1;;;13636:18:1;;;13629:50;13696:18;;47064:49:0;13376:344:1;47064:49:0;47163:13;47178:18;:7;:16;:18::i;:::-;47146:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47132:66;;46965:241;;;:::o;49116:983::-;49252:15;;49234:14;:33;;49226:78;;;;-1:-1:-1;;;49226:78:0;;;;;;;:::i;:::-;49323:21;;;;;;;49315:72;;;;-1:-1:-1;;;49315:72:0;;;;;;;:::i;:::-;49406:50;49414:30;49420:10;49432:3;49437:6;49414:30;;;;;:::i;49406:50::-;49398:96;;;;-1:-1:-1;;;49398:96:0;;;;;;;:::i;:::-;49549:8;;49531:14;49513:15;;:32;;;;:::i;:::-;:44;;49505:111;;;;-1:-1:-1;;;49505:111:0;;;;;;;:::i;:::-;49665:10;49652:24;;;;:12;:24;;;;;;49680:3;;49635:41;;:14;:41;:::i;:::-;:48;;49627:94;;;;-1:-1:-1;;;49627:94:0;;;;;;;:::i;:::-;49771:9;49753:14;49740:10;;:27;;;;:::i;:::-;:40;;49732:84;;;;-1:-1:-1;;;49732:84:0;;12815:2:1;49732:84:0;;;12797:21:1;12854:2;12834:18;;;12827:30;12893:33;12873:18;;;12866:61;12944:18;;49732:84:0;12613:355:1;49732:84:0;49867:10;49854:24;;;;:12;:24;;;;;;:41;;49881:14;;49854:41;:::i;:::-;49840:10;49827:24;;;;:12;:24;;;;;:68;;;;49906:186;49927:14;49923:1;:18;49906:186;;;49963:15;49981;;49999:1;49981:19;;;;:::i;:::-;49963:37;;50034:1;50015:15;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;50050:30:0;;-1:-1:-1;50060:10:0;50072:7;50050:9;:30::i;:::-;-1:-1:-1;49943:3:0;;;;:::i;:::-;;;;49906:186;;50616:119;13718:6;;-1:-1:-1;;;;;13718:6:0;12449:10;13865:23;13857:68;;;;-1:-1:-1;;;13857:68:0;;;;;;;:::i;:::-;50706:21:::1;::::0;;-1:-1:-1;;50681:46:0;::::1;50706:21;::::0;;;::::1;;;50705:22;50681:46:::0;;::::1;;::::0;;50616:119::o;47551:649::-;47647:15;;47629:14;:33;;47621:78;;;;-1:-1:-1;;;47621:78:0;;;;;;;:::i;:::-;47718:18;;;;47710:69;;;;-1:-1:-1;;;47710:69:0;;;;;;;:::i;:::-;47834:8;;47816:14;47798:15;;:32;;;;:::i;:::-;:44;;47790:111;;;;-1:-1:-1;;;47790:111:0;;;;;;;:::i;:::-;47951:9;47933:14;47920:10;;:27;;;;:::i;:::-;:40;;47912:84;;;;-1:-1:-1;;;47912:84:0;;12815:2:1;47912:84:0;;;12797:21:1;12854:2;12834:18;;;12827:30;12893:33;12873:18;;;12866:61;12944:18;;47912:84:0;12613:355:1;47912:84:0;48012:6;48007:186;48028:14;48024:1;:18;48007:186;;;48064:15;48082;;48100:1;48082:19;;;;:::i;:::-;48064:37;;48135:1;48116:15;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;48151:30:0;;-1:-1:-1;48161:10:0;48173:7;48151:9;:30::i;:::-;-1:-1:-1;48044:3:0;;;;:::i;:::-;;;;48007:186;;14554:201;13718:6;;-1:-1:-1;;;;;13718:6:0;12449:10;13865:23;13857:68;;;;-1:-1:-1;;;13857:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14643:22:0;::::1;14635:73;;;::::0;-1:-1:-1;;;14635:73:0;;10462:2:1;14635:73:0::1;::::0;::::1;10444:21:1::0;10501:2;10481:18;;;10474:30;10540:34;10520:18;;;10513:62;-1:-1:-1;;;10591:18:1;;;10584:36;10637:19;;14635:73:0::1;10260:402:1::0;14635:73:0::1;14719:28;14738:8;14719:18;:28::i;43048:174::-:0;43123:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;43123:29:0;-1:-1:-1;;;;;43123:29:0;;;;;;;;:24;;43177:23;43123:24;43177:14;:23::i;:::-;-1:-1:-1;;;;;43168:46:0;;;;;;;;;;;43048:174;;:::o;39360:348::-;39453:4;39155:16;;;:7;:16;;;;;;-1:-1:-1;;;;;39155:16:0;39470:73;;;;-1:-1:-1;;;39470:73:0;;13927:2:1;39470:73:0;;;13909:21:1;13966:2;13946:18;;;13939:30;14005:34;13985:18;;;13978:62;-1:-1:-1;;;14056:18:1;;;14049:42;14108:19;;39470:73:0;13725:408:1;39470:73:0;39554:13;39570:23;39585:7;39570:14;:23::i;:::-;39554:39;;39623:5;-1:-1:-1;;;;;39612:16:0;:7;-1:-1:-1;;;;;39612:16:0;;:51;;;;39656:7;-1:-1:-1;;;;;39632:31:0;:20;39644:7;39632:11;:20::i;:::-;-1:-1:-1;;;;;39632:31:0;;39612:51;:87;;;-1:-1:-1;;;;;;36452:25:0;;;36428:4;36452:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;39667:32;39604:96;39360:348;-1:-1:-1;;;;39360:348:0:o;42352:578::-;42511:4;-1:-1:-1;;;;;42484:31:0;:23;42499:7;42484:14;:23::i;:::-;-1:-1:-1;;;;;42484:31:0;;42476:85;;;;-1:-1:-1;;;42476:85:0;;17124:2:1;42476:85:0;;;17106:21:1;17163:2;17143:18;;;17136:30;17202:34;17182:18;;;17175:62;-1:-1:-1;;;17253:18:1;;;17246:39;17302:19;;42476:85:0;16922:405:1;42476:85:0;-1:-1:-1;;;;;42580:16:0;;42572:65;;;;-1:-1:-1;;;42572:65:0;;12056:2:1;42572:65:0;;;12038:21:1;12095:2;12075:18;;;12068:30;12134:34;12114:18;;;12107:62;-1:-1:-1;;;12185:18:1;;;12178:34;12229:19;;42572:65:0;11854:400:1;42572:65:0;42754:29;42771:1;42775:7;42754:8;:29::i;:::-;-1:-1:-1;;;;;42796:15:0;;;;;;:9;:15;;;;;:20;;42815:1;;42796:15;:20;;42815:1;;42796:20;:::i;:::-;;;;-1:-1:-1;;;;;;;42827:13:0;;;;;;:9;:13;;;;;:18;;42844:1;;42827:13;:18;;42844:1;;42827:18;:::i;:::-;;;;-1:-1:-1;;42856:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;42856:21:0;-1:-1:-1;;;;;42856:21:0;;;;;;;;;42895:27;;42856:16;;42895:27;;;;;;;42352:578;;;:::o;14915:191::-;15008:6;;;-1:-1:-1;;;;;15025:17:0;;;-1:-1:-1;;;;;;15025:17:0;;;;;;;15058:40;;15008:6;;;15025:17;15008:6;;15058:40;;14989:16;;15058:40;14978:128;14915:191;:::o;43364:315::-;43519:8;-1:-1:-1;;;;;43510:17:0;:5;-1:-1:-1;;;;;43510:17:0;;;43502:55;;;;-1:-1:-1;;;43502:55:0;;12461:2:1;43502:55:0;;;12443:21:1;12500:2;12480:18;;;12473:30;12539:27;12519:18;;;12512:55;12584:18;;43502:55:0;12259:349:1;43502:55:0;-1:-1:-1;;;;;43568:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;43568:46:0;;;;;;;;;;43630:41;;8088::1;;;43630::0;;8061:18:1;43630:41:0;;;;;;;43364:315;;;:::o;47364:179::-;47457:7;47510:8;47520:3;47525:8;47499:35;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47489:46;;;;;;47482:53;;47364:179;;;;;:::o;47214:142::-;47344:3;;47292:4;;47344:3;;;-1:-1:-1;;;;;47344:3:0;47317:23;:4;47330:9;47317:12;:23::i;:::-;-1:-1:-1;;;;;47317:30:0;;;47214:142;-1:-1:-1;;;47214:142:0:o;40050:110::-;40126:26;40136:2;40140:7;40126:26;;;;;;;;;;;;:9;:26::i;38438:315::-;38595:28;38605:4;38611:2;38615:7;38595:9;:28::i;:::-;38642:48;38665:4;38671:2;38675:7;38684:5;38642:22;:48::i;:::-;38634:111;;;;-1:-1:-1;;;38634:111:0;;;;;;;:::i;365:723::-;421:13;642:10;638:53;;-1:-1:-1;;669:10:0;;;;;;;;;;;;-1:-1:-1;;;669:10:0;;;;;365:723::o;638:53::-;716:5;701:12;757:78;764:9;;757:78;;790:8;;;;:::i;:::-;;-1:-1:-1;813:10:0;;-1:-1:-1;821:2:0;813:10;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;867:17:0;;845:39;;895:154;902:10;;895:154;;929:11;939:1;929:11;;:::i;:::-;;-1:-1:-1;998:10:0;1006:2;998:5;:10;:::i;:::-;985:24;;:2;:24;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;955:56:0;;;;;;;;-1:-1:-1;1026:11:0;1035:2;1026:11;;:::i;:::-;;;895:154;;6526:231;6604:7;6625:17;6644:18;6666:27;6677:4;6683:9;6666:10;:27::i;:::-;6624:69;;;;6704:18;6716:5;6704:11;:18::i;:::-;-1:-1:-1;6740:9:0;6526:231;-1:-1:-1;;;6526:231:0:o;40387:321::-;40517:18;40523:2;40527:7;40517:5;:18::i;:::-;40568:54;40599:1;40603:2;40607:7;40616:5;40568:22;:54::i;:::-;40546:154;;;;-1:-1:-1;;;40546:154:0;;;;;;;:::i;44244:799::-;44399:4;-1:-1:-1;;;;;44420:13:0;;16256:20;16304:8;44416:620;;44456:72;;-1:-1:-1;;;44456:72:0;;-1:-1:-1;;;;;44456:36:0;;;;;:72;;12449:10;;44507:4;;44513:7;;44522:5;;44456:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44456:72:0;;;;;;;;-1:-1:-1;;44456:72:0;;;;;;;;;;;;:::i;:::-;;;44452:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44698:13:0;;44694:272;;44741:60;;-1:-1:-1;;;44741:60:0;;;;;;;:::i;44694:272::-;44916:6;44910:13;44901:6;44897:2;44893:15;44886:38;44452:529;-1:-1:-1;;;;;;44579:51:0;-1:-1:-1;;;44579:51:0;;-1:-1:-1;44572:58:0;;44416:620;-1:-1:-1;45020:4:0;44244:799;;;;;;:::o;4416:1308::-;4497:7;4506:12;4731:9;:16;4751:2;4731:22;4727:990;;;5027:4;5012:20;;5006:27;5077:4;5062:20;;5056:27;5135:4;5120:20;;5114:27;4770:9;5106:36;5178:25;5189:4;5106:36;5006:27;5056;5178:10;:25::i;:::-;5171:32;;;;;;;;;4727:990;5225:9;:16;5245:2;5225:22;5221:496;;;5500:4;5485:20;;5479:27;5551:4;5536:20;;5530:27;5593:23;5604:4;5479:27;5530;5593:10;:23::i;:::-;5586:30;;;;;;;;5221:496;-1:-1:-1;5665:1:0;;-1:-1:-1;5669:35:0;5221:496;4416:1308;;;;;:::o;2687:643::-;2765:20;2756:5;:29;;;;;;;;:::i;:::-;;2752:571;;;2687:643;:::o;2752:571::-;2863:29;2854:5;:38;;;;;;;;:::i;:::-;;2850:473;;;2909:34;;-1:-1:-1;;;2909:34:0;;8969:2:1;2909:34:0;;;8951:21:1;9008:2;8988:18;;;8981:30;9047:26;9027:18;;;9020:54;9091:18;;2909:34:0;8767:348:1;2850:473:0;2974:35;2965:5;:44;;;;;;;;:::i;:::-;;2961:362;;;3026:41;;-1:-1:-1;;;3026:41:0;;9322:2:1;3026:41:0;;;9304:21:1;9361:2;9341:18;;;9334:30;9400:33;9380:18;;;9373:61;9451:18;;3026:41:0;9120:355:1;2961:362:0;3098:30;3089:5;:39;;;;;;;;:::i;:::-;;3085:238;;;3145:44;;-1:-1:-1;;;3145:44:0;;13175:2:1;3145:44:0;;;13157:21:1;13214:2;13194:18;;;13187:30;13253:34;13233:18;;;13226:62;-1:-1:-1;;;13304:18:1;;;13297:32;13346:19;;3145:44:0;12973:398:1;3085:238:0;3220:30;3211:5;:39;;;;;;;;:::i;:::-;;3207:116;;;3267:44;;-1:-1:-1;;;3267:44:0;;15586:2:1;3267:44:0;;;15568:21:1;15625:2;15605:18;;;15598:30;15664:34;15644:18;;;15637:62;-1:-1:-1;;;15715:18:1;;;15708:32;15757:19;;3267:44:0;15384:398:1;41044:382:0;-1:-1:-1;;;;;41124:16:0;;41116:61;;;;-1:-1:-1;;;41116:61:0;;15989:2:1;41116:61:0;;;15971:21:1;;;16008:18;;;16001:30;16067:34;16047:18;;;16040:62;16119:18;;41116:61:0;15787:356:1;41116:61:0;39131:4;39155:16;;;:7;:16;;;;;;-1:-1:-1;;;;;39155:16:0;:30;41188:58;;;;-1:-1:-1;;;41188:58:0;;10869:2:1;41188:58:0;;;10851:21:1;10908:2;10888:18;;;10881:30;10947;10927:18;;;10920:58;10995:18;;41188:58:0;10667:352:1;41188:58:0;-1:-1:-1;;;;;41317:13:0;;;;;;:9;:13;;;;;:18;;41334:1;;41317:13;:18;;41334:1;;41317:18;:::i;:::-;;;;-1:-1:-1;;41346:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;41346:21:0;-1:-1:-1;;;;;41346:21:0;;;;;;;;41385:33;;41346:16;;;41385:33;;41346:16;;41385:33;41044:382;;:::o;8025:1632::-;8156:7;;9090:66;9077:79;;9073:163;;;-1:-1:-1;9189:1:0;;-1:-1:-1;9193:30:0;9173:51;;9073:163;9250:1;:7;;9255:2;9250:7;;:18;;;;;9261:1;:7;;9266:2;9261:7;;9250:18;9246:102;;;-1:-1:-1;9301:1:0;;-1:-1:-1;9305:30:0;9285:51;;9246:102;9462:24;;;9445:14;9462:24;;;;;;;;;8367:25:1;;;8440:4;8428:17;;8408:18;;;8401:45;;;;8462:18;;;8455:34;;;8505:18;;;8498:34;;;9462:24:0;;8339:19:1;;9462:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9462:24:0;;-1:-1:-1;;9462:24:0;;;-1:-1:-1;;;;;;;9501:20:0;;9497:103;;9554:1;9558:29;9538:50;;;;;;;9497:103;9620:6;-1:-1:-1;9628:20:0;;-1:-1:-1;8025:1632:0;;;;;;;;:::o;7020:391::-;7134:7;;-1:-1:-1;;;;;7235:75:0;;7337:3;7333:12;;;7347:2;7329:21;7378:25;7389:4;7329:21;7398:1;7235:75;7378:10;:25::i;:::-;7371:32;;;;;;7020:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:718::-;234:5;287:3;280:4;272:6;268:17;264:27;254:55;;305:1;302;295:12;254:55;341:6;328:20;367:18;404:2;400;397:10;394:36;;;410:18;;:::i;:::-;485:2;479:9;453:2;539:13;;-1:-1:-1;;535:22:1;;;559:2;531:31;527:40;515:53;;;583:18;;;603:22;;;580:46;577:72;;;629:18;;:::i;:::-;669:10;665:2;658:22;704:2;696:6;689:18;750:3;743:4;738:2;730:6;726:15;722:26;719:35;716:55;;;767:1;764;757:12;716:55;831:2;824:4;816:6;812:17;805:4;797:6;793:17;780:54;878:1;871:4;866:2;858:6;854:15;850:26;843:37;898:6;889:15;;;;;;192:718;;;;:::o;915:186::-;974:6;1027:2;1015:9;1006:7;1002:23;998:32;995:52;;;1043:1;1040;1033:12;995:52;1066:29;1085:9;1066:29;:::i;:::-;1056:39;915:186;-1:-1:-1;;;915:186:1:o;1106:260::-;1174:6;1182;1235:2;1223:9;1214:7;1210:23;1206:32;1203:52;;;1251:1;1248;1241:12;1203:52;1274:29;1293:9;1274:29;:::i;:::-;1264:39;;1322:38;1356:2;1345:9;1341:18;1322:38;:::i;:::-;1312:48;;1106:260;;;;;:::o;1371:328::-;1448:6;1456;1464;1517:2;1505:9;1496:7;1492:23;1488:32;1485:52;;;1533:1;1530;1523:12;1485:52;1556:29;1575:9;1556:29;:::i;:::-;1546:39;;1604:38;1638:2;1627:9;1623:18;1604:38;:::i;:::-;1594:48;;1689:2;1678:9;1674:18;1661:32;1651:42;;1371:328;;;;;:::o;1704:537::-;1799:6;1807;1815;1823;1876:3;1864:9;1855:7;1851:23;1847:33;1844:53;;;1893:1;1890;1883:12;1844:53;1916:29;1935:9;1916:29;:::i;:::-;1906:39;;1964:38;1998:2;1987:9;1983:18;1964:38;:::i;:::-;1954:48;;2049:2;2038:9;2034:18;2021:32;2011:42;;2104:2;2093:9;2089:18;2076:32;2131:18;2123:6;2120:30;2117:50;;;2163:1;2160;2153:12;2117:50;2186:49;2227:7;2218:6;2207:9;2203:22;2186:49;:::i;:::-;2176:59;;;1704:537;;;;;;;:::o;2246:347::-;2311:6;2319;2372:2;2360:9;2351:7;2347:23;2343:32;2340:52;;;2388:1;2385;2378:12;2340:52;2411:29;2430:9;2411:29;:::i;:::-;2401:39;;2490:2;2479:9;2475:18;2462:32;2537:5;2530:13;2523:21;2516:5;2513:32;2503:60;;2559:1;2556;2549:12;2503:60;2582:5;2572:15;;;2246:347;;;;;:::o;2598:254::-;2666:6;2674;2727:2;2715:9;2706:7;2702:23;2698:32;2695:52;;;2743:1;2740;2733:12;2695:52;2766:29;2785:9;2766:29;:::i;:::-;2756:39;2842:2;2827:18;;;;2814:32;;-1:-1:-1;;;2598:254:1:o;2857:615::-;2943:6;2951;3004:2;2992:9;2983:7;2979:23;2975:32;2972:52;;;3020:1;3017;3010:12;2972:52;3060:9;3047:23;3089:18;3130:2;3122:6;3119:14;3116:34;;;3146:1;3143;3136:12;3116:34;3184:6;3173:9;3169:22;3159:32;;3229:7;3222:4;3218:2;3214:13;3210:27;3200:55;;3251:1;3248;3241:12;3200:55;3291:2;3278:16;3317:2;3309:6;3306:14;3303:34;;;3333:1;3330;3323:12;3303:34;3386:7;3381:2;3371:6;3368:1;3364:14;3360:2;3356:23;3352:32;3349:45;3346:65;;;3407:1;3404;3397:12;3346:65;3438:2;3430:11;;;;;3460:6;;-1:-1:-1;2857:615:1;;-1:-1:-1;;;;2857:615:1:o;3477:245::-;3535:6;3588:2;3576:9;3567:7;3563:23;3559:32;3556:52;;;3604:1;3601;3594:12;3556:52;3643:9;3630:23;3662:30;3686:5;3662:30;:::i;3727:249::-;3796:6;3849:2;3837:9;3828:7;3824:23;3820:32;3817:52;;;3865:1;3862;3855:12;3817:52;3897:9;3891:16;3916:30;3940:5;3916:30;:::i;3981:456::-;4067:6;4075;4083;4136:2;4124:9;4115:7;4111:23;4107:32;4104:52;;;4152:1;4149;4142:12;4104:52;4192:9;4179:23;4225:18;4217:6;4214:30;4211:50;;;4257:1;4254;4247:12;4211:50;4280:49;4321:7;4312:6;4301:9;4297:22;4280:49;:::i;:::-;4270:59;4376:2;4361:18;;4348:32;;-1:-1:-1;4427:2:1;4412:18;;;4399:32;;3981:456;-1:-1:-1;;;;3981:456:1:o;4442:592::-;4513:6;4521;4574:2;4562:9;4553:7;4549:23;4545:32;4542:52;;;4590:1;4587;4580:12;4542:52;4630:9;4617:23;4659:18;4700:2;4692:6;4689:14;4686:34;;;4716:1;4713;4706:12;4686:34;4754:6;4743:9;4739:22;4729:32;;4799:7;4792:4;4788:2;4784:13;4780:27;4770:55;;4821:1;4818;4811:12;4770:55;4861:2;4848:16;4887:2;4879:6;4876:14;4873:34;;;4903:1;4900;4893:12;4873:34;4948:7;4943:2;4934:6;4930:2;4926:15;4922:24;4919:37;4916:57;;;4969:1;4966;4959:12;5039:180;5098:6;5151:2;5139:9;5130:7;5126:23;5122:32;5119:52;;;5167:1;5164;5157:12;5119:52;-1:-1:-1;5190:23:1;;5039:180;-1:-1:-1;5039:180:1:o;5224:257::-;5265:3;5303:5;5297:12;5330:6;5325:3;5318:19;5346:63;5402:6;5395:4;5390:3;5386:14;5379:4;5372:5;5368:16;5346:63;:::i;:::-;5463:2;5442:15;-1:-1:-1;;5438:29:1;5429:39;;;;5470:4;5425:50;;5224:257;-1:-1:-1;;5224:257:1:o;5486:185::-;5528:3;5566:5;5560:12;5581:52;5626:6;5621:3;5614:4;5607:5;5603:16;5581:52;:::i;:::-;5649:16;;;;;5486:185;-1:-1:-1;;5486:185:1:o;5676:1174::-;5852:3;5881:1;5914:6;5908:13;5944:3;5966:1;5994:9;5990:2;5986:18;5976:28;;6054:2;6043:9;6039:18;6076;6066:61;;6120:4;6112:6;6108:17;6098:27;;6066:61;6146:2;6194;6186:6;6183:14;6163:18;6160:38;6157:165;;;-1:-1:-1;;;6221:33:1;;6277:4;6274:1;6267:15;6307:4;6228:3;6295:17;6157:165;6338:18;6365:104;;;;6483:1;6478:320;;;;6331:467;;6365:104;-1:-1:-1;;6398:24:1;;6386:37;;6443:16;;;;-1:-1:-1;6365:104:1;;6478:320;19211:1;19204:14;;;19248:4;19235:18;;6573:1;6587:165;6601:6;6598:1;6595:13;6587:165;;;6679:14;;6666:11;;;6659:35;6722:16;;;;6616:10;;6587:165;;;6591:3;;6781:6;6776:3;6772:16;6765:23;;6331:467;;;;;;;6814:30;6840:3;6832:6;6814:30;:::i;:::-;6807:37;5676:1174;-1:-1:-1;;;;;5676:1174:1:o;7063:488::-;-1:-1:-1;;;;;7332:15:1;;;7314:34;;7384:15;;7379:2;7364:18;;7357:43;7431:2;7416:18;;7409:34;;;7479:3;7474:2;7459:18;;7452:31;;;7257:4;;7500:45;;7525:19;;7517:6;7500:45;:::i;:::-;7492:53;7063:488;-1:-1:-1;;;;;;7063:488:1:o;7556:387::-;7790:1;7786;7781:3;7777:11;7773:19;7765:6;7761:32;7750:9;7743:51;7830:6;7825:2;7814:9;7810:18;7803:34;7873:2;7868;7857:9;7853:18;7846:30;7724:4;7893:44;7933:2;7922:9;7918:18;7910:6;7893:44;:::i;8543:219::-;8692:2;8681:9;8674:21;8655:4;8712:44;8752:2;8741:9;8737:18;8729:6;8712:44;:::i;9480:356::-;9682:2;9664:21;;;9701:18;;;9694:30;9760:34;9755:2;9740:18;;9733:62;9827:2;9812:18;;9480:356::o;9841:414::-;10043:2;10025:21;;;10082:2;10062:18;;;10055:30;10121:34;10116:2;10101:18;;10094:62;-1:-1:-1;;;10187:2:1;10172:18;;10165:48;10245:3;10230:19;;9841:414::o;11024:418::-;11226:2;11208:21;;;11265:2;11245:18;;;11238:30;11304:34;11299:2;11284:18;;11277:62;-1:-1:-1;;;11370:2:1;11355:18;;11348:52;11432:3;11417:19;;11024:418::o;11447:402::-;11649:2;11631:21;;;11688:2;11668:18;;;11661:30;11727:34;11722:2;11707:18;;11700:62;-1:-1:-1;;;11793:2:1;11778:18;;11771:36;11839:3;11824:19;;11447:402::o;16561:356::-;16763:2;16745:21;;;16782:18;;;16775:30;16841:34;16836:2;16821:18;;16814:62;16908:2;16893:18;;16561:356::o;17734:397::-;17936:2;17918:21;;;17975:2;17955:18;;;17948:30;18014:34;18009:2;17994:18;;17987:62;-1:-1:-1;;;18080:2:1;18065:18;;18058:31;18121:3;18106:19;;17734:397::o;18136:413::-;18338:2;18320:21;;;18377:2;18357:18;;;18350:30;18416:34;18411:2;18396:18;;18389:62;-1:-1:-1;;;18482:2:1;18467:18;;18460:47;18539:3;18524:19;;18136:413::o;18554:397::-;18756:2;18738:21;;;18795:2;18775:18;;;18768:30;18834:34;18829:2;18814:18;;18807:62;-1:-1:-1;;;18900:2:1;18885:18;;18878:31;18941:3;18926:19;;18554:397::o;19264:128::-;19304:3;19335:1;19331:6;19328:1;19325:13;19322:39;;;19341:18;;:::i;:::-;-1:-1:-1;19377:9:1;;19264:128::o;19397:120::-;19437:1;19463;19453:35;;19468:18;;:::i;:::-;-1:-1:-1;19502:9:1;;19397:120::o;19522:168::-;19562:7;19628:1;19624;19620:6;19616:14;19613:1;19610:21;19605:1;19598:9;19591:17;19587:45;19584:71;;;19635:18;;:::i;:::-;-1:-1:-1;19675:9:1;;19522:168::o;19695:125::-;19735:4;19763:1;19760;19757:8;19754:34;;;19768:18;;:::i;:::-;-1:-1:-1;19805:9:1;;19695:125::o;19825:258::-;19897:1;19907:113;19921:6;19918:1;19915:13;19907:113;;;19997:11;;;19991:18;19978:11;;;19971:39;19943:2;19936:10;19907:113;;;20038:6;20035:1;20032:13;20029:48;;;-1:-1:-1;;20073:1:1;20055:16;;20048:27;19825:258::o;20088:380::-;20167:1;20163:12;;;;20210;;;20231:61;;20285:4;20277:6;20273:17;20263:27;;20231:61;20338:2;20330:6;20327:14;20307:18;20304:38;20301:161;;;20384:10;20379:3;20375:20;20372:1;20365:31;20419:4;20416:1;20409:15;20447:4;20444:1;20437:15;20301:161;;20088:380;;;:::o;20473:135::-;20512:3;-1:-1:-1;;20533:17:1;;20530:43;;;20553:18;;:::i;:::-;-1:-1:-1;20600:1:1;20589:13;;20473:135::o;20613:112::-;20645:1;20671;20661:35;;20676:18;;:::i;:::-;-1:-1:-1;20710:9:1;;20613:112::o;20730:127::-;20791:10;20786:3;20782:20;20779:1;20772:31;20822:4;20819:1;20812:15;20846:4;20843:1;20836:15;20862:127;20923:10;20918:3;20914:20;20911:1;20904:31;20954:4;20951:1;20944:15;20978:4;20975:1;20968:15;20994:127;21055:10;21050:3;21046:20;21043:1;21036:31;21086:4;21083:1;21076:15;21110:4;21107:1;21100:15;21126:127;21187:10;21182:3;21178:20;21175:1;21168:31;21218:4;21215:1;21208:15;21242:4;21239:1;21232:15;21258:127;21319:10;21314:3;21310:20;21307:1;21300:31;21350:4;21347:1;21340:15;21374:4;21371:1;21364:15;21390:131;-1:-1:-1;;;;;;21464:32:1;;21454:43;;21444:71;;21511:1;21508;21501:12
Swarm Source
ipfs://14f5926456476a99e3f26f10d6da748961967cf0256c52fe7fe4008bad72d7e1
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.