ETH Price: $3,826.42 (+4.73%)

Token

Club Hippo (HIPPO)
 

Overview

Max Total Supply

1,001 HIPPO

Holders

552

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 HIPPO
0x6dd01f10ed673e14063f311f01f631d47f213cfc
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ClubHippo

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-08
*/

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// File: default_workspace/contracts/contract.sol



// 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/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 (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: 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);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits 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 {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev 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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: contracts/1_Storage.sol


pragma solidity ^0.8.4;




contract ClubHippo is ERC721Enumerable, Ownable {
    using Strings for uint256;

    uint256 public tokenPrice = 0.04 ether;

    uint256 public maxTokensPerMint = 6;
    uint256 public maxTokensPerWhitelistedAddress = 3;

    string public tokenBaseURI = "ipfs://QmT5R5TTaeWxAjp4eF95NqSYtaAB5rD2rh6z8NcLAqy4Pe/";

    uint256 public tokensToGift = 5;
    uint256 public tokensToBuyAmount = 3500 - tokensToGift;

    bool public hasPresaleStarted = false;
    bool public hasPublicSaleStarted = false;

    bytes32 public whitelistRoot;
    mapping(address => uint256) public presaleWhitelistPurchased;

    constructor() ERC721("Club Hippo", "HIPPO") {
        
    }

    function setMaxTokensPerMint(uint256 val) external onlyOwner {
        maxTokensPerMint = val;
    }

    function setMaxTokensPerWhitelistedAddress(uint256 val) external onlyOwner {
        maxTokensPerWhitelistedAddress = val;
    }

    function setPresale(bool val) external onlyOwner {
        hasPresaleStarted = val;
    }

    function setPublicSale(bool val) external onlyOwner {
        hasPublicSaleStarted = val;
    }
    
    function setTokenPrice(uint256 val) external onlyOwner {
      tokenPrice = val;
    }

    function gift(address[] calldata receivers) external onlyOwner {
        require(receivers.length <= tokensToGift, "Not enough tokens reserved for gifting");

        uint256 supply = totalSupply();
        for (uint256 i = 0; i < receivers.length; i++) {
            _safeMint(receivers[i], 1 + supply + i);
        }

        tokensToGift -= receivers.length;
    }

    function verify(address account, bytes32[] memory proof) public view returns (bool)
    {
        bytes32 leaf = keccak256(abi.encodePacked(account));
        return MerkleProof.verify(proof, whitelistRoot, leaf);
    }


    function mint(uint256 amount, bytes32[] memory proof) external payable {
        require(msg.value >= tokenPrice * amount, "Incorrect ETH");
        require(hasPresaleStarted, "Cannot mint before presale");
        require(hasPublicSaleStarted || verify(msg.sender, proof), "Buyer not whitelisted for presale");
        require(amount <= maxTokensPerMint, "Cannot mint more than the max tokens per mint");
        require(amount <= tokensToBuyAmount, "No tokens left for minting");
        require(hasPublicSaleStarted || (presaleWhitelistPurchased[msg.sender] + amount <= maxTokensPerWhitelistedAddress),
            "Cannot mint more than the max tokens per whitelisted address");

        uint256 supply = totalSupply();
        for(uint256 i = 0; i < amount; i++) {
            _safeMint(msg.sender, 1 + supply + i);
        }

        if (!hasPublicSaleStarted) {
            presaleWhitelistPurchased[msg.sender] += amount;
        }

        tokensToBuyAmount -= amount;
    }

    function _baseURI() internal view override(ERC721) returns (string memory) {
        return tokenBaseURI;
    }
   
    function setBaseURI(string calldata URI) external onlyOwner {
        tokenBaseURI = URI;
    }

    function setWhitelistRoot(bytes32 _whitelistRoot) public onlyOwner {
        whitelistRoot = _whitelistRoot;
    }

    function withdraw() external onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }

    function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) {
        return string(abi.encodePacked(super.tokenURI(tokenId), ".json"));
    }
}

Contract Security Audit

Contract ABI

[{"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"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hasPresaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasPublicSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokensPerMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokensPerWhitelistedAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mint","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":[{"internalType":"address","name":"","type":"address"}],"name":"presaleWhitelistPurchased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"val","type":"uint256"}],"name":"setMaxTokensPerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setMaxTokensPerWhitelistedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"setPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"setPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_whitelistRoot","type":"bytes32"}],"name":"setWhitelistRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensToBuyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensToGift","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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

668e1bc9bf040000600b556006600c556003600d5560e0604052603660808181529062002abc60a03980516200003e91600e916020909101906200014e565b506005600f8190556200005490610dac620001f4565b6010556011805461ffff191690553480156200006f57600080fd5b50604080518082018252600a815269436c756220486970706f60b01b602080830191825283518085019094526005845264484950504f60d81b908401528151919291620000bf916000916200014e565b508051620000d59060019060208401906200014e565b505050620000f2620000ec620000f860201b60201c565b620000fc565b62000257565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200015c906200021a565b90600052602060002090601f016020900481019282620001805760008555620001cb565b82601f106200019b57805160ff1916838001178555620001cb565b82800160010185558215620001cb579182015b82811115620001cb578251825591602001919060010190620001ae565b50620001d9929150620001dd565b5090565b5b80821115620001d95760008155600101620001de565b6000828210156200021557634e487b7160e01b600052601160045260246000fd5b500390565b600181811c908216806200022f57607f821691505b602082108114156200025157634e487b7160e01b600052602260045260246000fd5b50919050565b61285580620002676000396000f3fe60806040526004361061023b5760003560e01c806370a082311161012e578063ba41b0c6116100ab578063f2fde38b1161006f578063f2fde38b14610697578063f5aa406d146106b7578063fdd4b0f0146106d7578063ff45cb95146106f6578063ffc22fa81461070c57600080fd5b8063ba41b0c6146105e5578063c54e73e3146105f8578063c87b56dd14610618578063e985e9c514610638578063efe3f3931461068157600080fd5b806395d89b41116100f257806395d89b4114610556578063a22cb4651461056b578063b02200151461058b578063b76a0df4146105a5578063b88d4fde146105c557600080fd5b806370a08231146104cd578063715018a6146104ed578063762cda3c146105025780637ff9b596146105225780638da5cb5b1461053857600080fd5b80633ccfd60b116101bc57806355f804b31161018057806355f804b3146104375780635aca1bb61461045757806360033400146104775780636352211e1461048d5780636a61e5fc146104ad57600080fd5b80633ccfd60b146103a057806342842e0e146103b557806348df7424146103d55780634e99b800146104025780634f6ccce71461041757600080fd5b80631746547111610203578063174654711461031157806318160ddd1461033557806323b872dd1461034a5780632f745c591461036a578063386bfc981461038a57600080fd5b806301ffc9a71461024057806306fdde0314610275578063081812fc14610297578063095ea7b3146102cf578063163e1e61146102f1575b600080fd5b34801561024c57600080fd5b5061026061025b3660046123fb565b61072c565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b5061028a610757565b60405161026c9190612587565b3480156102a357600080fd5b506102b76102b23660046123e2565b6107e9565b6040516001600160a01b03909116815260200161026c565b3480156102db57600080fd5b506102ef6102ea366004612328565b610883565b005b3480156102fd57600080fd5b506102ef61030c366004612352565b610999565b34801561031d57600080fd5b50610327600c5481565b60405190815260200161026c565b34801561034157600080fd5b50600854610327565b34801561035657600080fd5b506102ef6103653660046121b4565b610ab3565b34801561037657600080fd5b50610327610385366004612328565b610ae4565b34801561039657600080fd5b5061032760125481565b3480156103ac57600080fd5b506102ef610b7a565b3480156103c157600080fd5b506102ef6103d03660046121b4565b610bca565b3480156103e157600080fd5b506103276103f0366004612166565b60136020526000908152604090205481565b34801561040e57600080fd5b5061028a610be5565b34801561042357600080fd5b506103276104323660046123e2565b610c73565b34801561044357600080fd5b506102ef610452366004612435565b610d06565b34801561046357600080fd5b506102ef6104723660046123c7565b610d3c565b34801561048357600080fd5b50610327600d5481565b34801561049957600080fd5b506102b76104a83660046123e2565b610d80565b3480156104b957600080fd5b506102ef6104c83660046123e2565b610df7565b3480156104d957600080fd5b506103276104e8366004612166565b610e26565b3480156104f957600080fd5b506102ef610ead565b34801561050e57600080fd5b506102ef61051d3660046123e2565b610ee1565b34801561052e57600080fd5b50610327600b5481565b34801561054457600080fd5b50600a546001600160a01b03166102b7565b34801561056257600080fd5b5061028a610f10565b34801561057757600080fd5b506102ef6105863660046122fe565b610f1f565b34801561059757600080fd5b506011546102609060ff1681565b3480156105b157600080fd5b506102606105c03660046122b0565b610f2e565b3480156105d157600080fd5b506102ef6105e03660046121f0565b610f7f565b6102ef6105f3366004612495565b610fb7565b34801561060457600080fd5b506102ef6106133660046123c7565b6112a6565b34801561062457600080fd5b5061028a6106333660046123e2565b6112e3565b34801561064457600080fd5b50610260610653366004612181565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561068d57600080fd5b50610327600f5481565b3480156106a357600080fd5b506102ef6106b2366004612166565b611314565b3480156106c357600080fd5b506102ef6106d23660046123e2565b6113af565b3480156106e357600080fd5b5060115461026090610100900460ff1681565b34801561070257600080fd5b5061032760105481565b34801561071857600080fd5b506102ef6107273660046123e2565b6113de565b60006001600160e01b0319821663780e9d6360e01b148061075157506107518261140d565b92915050565b60606000805461076690612731565b80601f016020809104026020016040519081016040528092919081815260200182805461079290612731565b80156107df5780601f106107b4576101008083540402835291602001916107df565b820191906000526020600020905b8154815290600101906020018083116107c257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108675760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061088e82610d80565b9050806001600160a01b0316836001600160a01b031614156108fc5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161085e565b336001600160a01b038216148061091857506109188133610653565b61098a5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161085e565b610994838361145d565b505050565b600a546001600160a01b031633146109c35760405162461bcd60e51b815260040161085e906125ec565b600f54811115610a245760405162461bcd60e51b815260206004820152602660248201527f4e6f7420656e6f75676820746f6b656e7320726573657276656420666f722067604482015265696674696e6760d01b606482015260840161085e565b6000610a2f60085490565b905060005b82811015610a9357610a81848483818110610a5157610a516127dd565b9050602002016020810190610a669190612166565b82610a728560016126a3565b610a7c91906126a3565b6114cb565b80610a8b8161276c565b915050610a34565b5082829050600f6000828254610aa991906126ee565b9091555050505050565b610abd33826114e5565b610ad95760405162461bcd60e51b815260040161085e90612621565b6109948383836115d8565b6000610aef83610e26565b8210610b515760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161085e565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610ba45760405162461bcd60e51b815260040161085e906125ec565b60405133904780156108fc02916000818181858888f19350505050610bc857600080fd5b565b61099483838360405180602001604052806000815250610f7f565b600e8054610bf290612731565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1e90612731565b8015610c6b5780601f10610c4057610100808354040283529160200191610c6b565b820191906000526020600020905b815481529060010190602001808311610c4e57829003601f168201915b505050505081565b6000610c7e60085490565b8210610ce15760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161085e565b60088281548110610cf457610cf46127dd565b90600052602060002001549050919050565b600a546001600160a01b03163314610d305760405162461bcd60e51b815260040161085e906125ec565b610994600e838361201b565b600a546001600160a01b03163314610d665760405162461bcd60e51b815260040161085e906125ec565b601180549115156101000261ff0019909216919091179055565b6000818152600260205260408120546001600160a01b0316806107515760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161085e565b600a546001600160a01b03163314610e215760405162461bcd60e51b815260040161085e906125ec565b600b55565b60006001600160a01b038216610e915760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161085e565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610ed75760405162461bcd60e51b815260040161085e906125ec565b610bc8600061177f565b600a546001600160a01b03163314610f0b5760405162461bcd60e51b815260040161085e906125ec565b600c55565b60606001805461076690612731565b610f2a3383836117d1565b5050565b6040516bffffffffffffffffffffffff19606084901b1660208201526000908190603401604051602081830303815290604052805190602001209050610f7783601254836118a0565b949350505050565b610f8933836114e5565b610fa55760405162461bcd60e51b815260040161085e90612621565b610fb1848484846118b6565b50505050565b81600b54610fc591906126cf565b3410156110045760405162461bcd60e51b815260206004820152600d60248201526c092dcc6dee4e4cac6e8408aa89609b1b604482015260640161085e565b60115460ff166110565760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f74206d696e74206265666f72652070726573616c65000000000000604482015260640161085e565b601154610100900460ff168061107157506110713382610f2e565b6110c75760405162461bcd60e51b815260206004820152602160248201527f4275796572206e6f742077686974656c697374656420666f722070726573616c6044820152606560f81b606482015260840161085e565b600c5482111561112f5760405162461bcd60e51b815260206004820152602d60248201527f43616e6e6f74206d696e74206d6f7265207468616e20746865206d617820746f60448201526c1ad95b9cc81c195c881b5a5b9d609a1b606482015260840161085e565b6010548211156111815760405162461bcd60e51b815260206004820152601a60248201527f4e6f20746f6b656e73206c65667420666f72206d696e74696e67000000000000604482015260640161085e565b601154610100900460ff16806111b35750600d54336000908152601360205260409020546111b09084906126a3565b11155b6112255760405162461bcd60e51b815260206004820152603c60248201527f43616e6e6f74206d696e74206d6f7265207468616e20746865206d617820746f60448201527f6b656e73207065722077686974656c6973746564206164647265737300000000606482015260840161085e565b600061123060085490565b905060005b8381101561125f5761124d3382610a728560016126a3565b806112578161276c565b915050611235565b50601154610100900460ff1661129457336000908152601360205260408120805485929061128e9084906126a3565b90915550505b8260106000828254610aa991906126ee565b600a546001600160a01b031633146112d05760405162461bcd60e51b815260040161085e906125ec565b6011805460ff1916911515919091179055565b60606112ee826118e9565b6040516020016112fe9190612521565b6040516020818303038152906040529050919050565b600a546001600160a01b0316331461133e5760405162461bcd60e51b815260040161085e906125ec565b6001600160a01b0381166113a35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161085e565b6113ac8161177f565b50565b600a546001600160a01b031633146113d95760405162461bcd60e51b815260040161085e906125ec565b601255565b600a546001600160a01b031633146114085760405162461bcd60e51b815260040161085e906125ec565b600d55565b60006001600160e01b031982166380ac58cd60e01b148061143e57506001600160e01b03198216635b5e139f60e01b145b8061075157506301ffc9a760e01b6001600160e01b0319831614610751565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061149282610d80565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610f2a8282604051806020016040528060008152506119c4565b6000818152600260205260408120546001600160a01b031661155e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161085e565b600061156983610d80565b9050806001600160a01b0316846001600160a01b031614806115a45750836001600160a01b0316611599846107e9565b6001600160a01b0316145b80610f7757506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16610f77565b826001600160a01b03166115eb82610d80565b6001600160a01b03161461164f5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b606482015260840161085e565b6001600160a01b0382166116b15760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161085e565b6116bc8383836119f7565b6116c760008261145d565b6001600160a01b03831660009081526003602052604081208054600192906116f09084906126ee565b90915550506001600160a01b038216600090815260036020526040812080546001929061171e9084906126a3565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156118335760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161085e565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6000826118ad8584611aaf565b14949350505050565b6118c18484846115d8565b6118cd84848484611b23565b610fb15760405162461bcd60e51b815260040161085e9061259a565b6000818152600260205260409020546060906001600160a01b03166119685760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161085e565b6000611972611c30565b9050600081511161199257604051806020016040528060008152506119bd565b8061199c84611c3f565b6040516020016119ad9291906124f2565b6040516020818303038152906040525b9392505050565b6119ce8383611d3d565b6119db6000848484611b23565b6109945760405162461bcd60e51b815260040161085e9061259a565b6001600160a01b038316611a5257611a4d81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611a75565b816001600160a01b0316836001600160a01b031614611a7557611a758382611e8b565b6001600160a01b038216611a8c5761099481611f28565b826001600160a01b0316826001600160a01b031614610994576109948282611fd7565b600081815b8451811015611b1b576000858281518110611ad157611ad16127dd565b60200260200101519050808311611af75760008381526020829052604090209250611b08565b600081815260208490526040902092505b5080611b138161276c565b915050611ab4565b509392505050565b60006001600160a01b0384163b15611c2557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611b6790339089908890889060040161254a565b602060405180830381600087803b158015611b8157600080fd5b505af1925050508015611bb1575060408051601f3d908101601f19168201909252611bae91810190612418565b60015b611c0b573d808015611bdf576040519150601f19603f3d011682016040523d82523d6000602084013e611be4565b606091505b508051611c035760405162461bcd60e51b815260040161085e9061259a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610f77565b506001949350505050565b6060600e805461076690612731565b606081611c635750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611c8d5780611c778161276c565b9150611c869050600a836126bb565b9150611c67565b60008167ffffffffffffffff811115611ca857611ca86127f3565b6040519080825280601f01601f191660200182016040528015611cd2576020820181803683370190505b5090505b8415610f7757611ce76001836126ee565b9150611cf4600a86612787565b611cff9060306126a3565b60f81b818381518110611d1457611d146127dd565b60200101906001600160f81b031916908160001a905350611d36600a866126bb565b9450611cd6565b6001600160a01b038216611d935760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161085e565b6000818152600260205260409020546001600160a01b031615611df85760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161085e565b611e04600083836119f7565b6001600160a01b0382166000908152600360205260408120805460019290611e2d9084906126a3565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001611e9884610e26565b611ea291906126ee565b600083815260076020526040902054909150808214611ef5576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611f3a906001906126ee565b60008381526009602052604081205460088054939450909284908110611f6257611f626127dd565b906000526020600020015490508060088381548110611f8357611f836127dd565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611fbb57611fbb6127c7565b6001900381819060005260206000200160009055905550505050565b6000611fe283610e26565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461202790612731565b90600052602060002090601f016020900481019282612049576000855561208f565b82601f106120625782800160ff1982351617855561208f565b8280016001018555821561208f579182015b8281111561208f578235825591602001919060010190612074565b5061209b92915061209f565b5090565b5b8082111561209b57600081556001016120a0565b80356001600160a01b03811681146120cb57600080fd5b919050565b600082601f8301126120e157600080fd5b8135602067ffffffffffffffff8211156120fd576120fd6127f3565b8160051b61210c828201612672565b83815282810190868401838801850189101561212757600080fd5b600093505b8584101561214a57803583526001939093019291840191840161212c565b50979650505050505050565b803580151581146120cb57600080fd5b60006020828403121561217857600080fd5b6119bd826120b4565b6000806040838503121561219457600080fd5b61219d836120b4565b91506121ab602084016120b4565b90509250929050565b6000806000606084860312156121c957600080fd5b6121d2846120b4565b92506121e0602085016120b4565b9150604084013590509250925092565b6000806000806080858703121561220657600080fd5b61220f856120b4565b9350602061221e8187016120b4565b935060408601359250606086013567ffffffffffffffff8082111561224257600080fd5b818801915088601f83011261225657600080fd5b813581811115612268576122686127f3565b61227a601f8201601f19168501612672565b9150808252898482850101111561229057600080fd5b808484018584013760008482840101525080935050505092959194509250565b600080604083850312156122c357600080fd5b6122cc836120b4565b9150602083013567ffffffffffffffff8111156122e857600080fd5b6122f4858286016120d0565b9150509250929050565b6000806040838503121561231157600080fd5b61231a836120b4565b91506121ab60208401612156565b6000806040838503121561233b57600080fd5b612344836120b4565b946020939093013593505050565b6000806020838503121561236557600080fd5b823567ffffffffffffffff8082111561237d57600080fd5b818501915085601f83011261239157600080fd5b8135818111156123a057600080fd5b8660208260051b85010111156123b557600080fd5b60209290920196919550909350505050565b6000602082840312156123d957600080fd5b6119bd82612156565b6000602082840312156123f457600080fd5b5035919050565b60006020828403121561240d57600080fd5b81356119bd81612809565b60006020828403121561242a57600080fd5b81516119bd81612809565b6000806020838503121561244857600080fd5b823567ffffffffffffffff8082111561246057600080fd5b818501915085601f83011261247457600080fd5b81358181111561248357600080fd5b8660208285010111156123b557600080fd5b600080604083850312156124a857600080fd5b82359150602083013567ffffffffffffffff8111156122e857600080fd5b600081518084526124de816020860160208601612705565b601f01601f19169290920160200192915050565b60008351612504818460208801612705565b835190830190612518818360208801612705565b01949350505050565b60008251612533818460208701612705565b64173539b7b760d91b920191825250600501919050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061257d908301846124c6565b9695505050505050565b6020815260006119bd60208301846124c6565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561269b5761269b6127f3565b604052919050565b600082198211156126b6576126b661279b565b500190565b6000826126ca576126ca6127b1565b500490565b60008160001904831182151516156126e9576126e961279b565b500290565b6000828210156127005761270061279b565b500390565b60005b83811015612720578181015183820152602001612708565b83811115610fb15750506000910152565b600181811c9082168061274557607f821691505b6020821081141561276657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156127805761278061279b565b5060010190565b600082612796576127966127b1565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146113ac57600080fdfea264697066735822122074ba585b90a52097c71a1e9a10e4cf7c252cac3417321d7450ef0d40be13a86664736f6c63430008070033697066733a2f2f516d54355235545461655778416a7034654639354e71535974614142357244327268367a384e634c4171793450652f

Deployed Bytecode

0x60806040526004361061023b5760003560e01c806370a082311161012e578063ba41b0c6116100ab578063f2fde38b1161006f578063f2fde38b14610697578063f5aa406d146106b7578063fdd4b0f0146106d7578063ff45cb95146106f6578063ffc22fa81461070c57600080fd5b8063ba41b0c6146105e5578063c54e73e3146105f8578063c87b56dd14610618578063e985e9c514610638578063efe3f3931461068157600080fd5b806395d89b41116100f257806395d89b4114610556578063a22cb4651461056b578063b02200151461058b578063b76a0df4146105a5578063b88d4fde146105c557600080fd5b806370a08231146104cd578063715018a6146104ed578063762cda3c146105025780637ff9b596146105225780638da5cb5b1461053857600080fd5b80633ccfd60b116101bc57806355f804b31161018057806355f804b3146104375780635aca1bb61461045757806360033400146104775780636352211e1461048d5780636a61e5fc146104ad57600080fd5b80633ccfd60b146103a057806342842e0e146103b557806348df7424146103d55780634e99b800146104025780634f6ccce71461041757600080fd5b80631746547111610203578063174654711461031157806318160ddd1461033557806323b872dd1461034a5780632f745c591461036a578063386bfc981461038a57600080fd5b806301ffc9a71461024057806306fdde0314610275578063081812fc14610297578063095ea7b3146102cf578063163e1e61146102f1575b600080fd5b34801561024c57600080fd5b5061026061025b3660046123fb565b61072c565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b5061028a610757565b60405161026c9190612587565b3480156102a357600080fd5b506102b76102b23660046123e2565b6107e9565b6040516001600160a01b03909116815260200161026c565b3480156102db57600080fd5b506102ef6102ea366004612328565b610883565b005b3480156102fd57600080fd5b506102ef61030c366004612352565b610999565b34801561031d57600080fd5b50610327600c5481565b60405190815260200161026c565b34801561034157600080fd5b50600854610327565b34801561035657600080fd5b506102ef6103653660046121b4565b610ab3565b34801561037657600080fd5b50610327610385366004612328565b610ae4565b34801561039657600080fd5b5061032760125481565b3480156103ac57600080fd5b506102ef610b7a565b3480156103c157600080fd5b506102ef6103d03660046121b4565b610bca565b3480156103e157600080fd5b506103276103f0366004612166565b60136020526000908152604090205481565b34801561040e57600080fd5b5061028a610be5565b34801561042357600080fd5b506103276104323660046123e2565b610c73565b34801561044357600080fd5b506102ef610452366004612435565b610d06565b34801561046357600080fd5b506102ef6104723660046123c7565b610d3c565b34801561048357600080fd5b50610327600d5481565b34801561049957600080fd5b506102b76104a83660046123e2565b610d80565b3480156104b957600080fd5b506102ef6104c83660046123e2565b610df7565b3480156104d957600080fd5b506103276104e8366004612166565b610e26565b3480156104f957600080fd5b506102ef610ead565b34801561050e57600080fd5b506102ef61051d3660046123e2565b610ee1565b34801561052e57600080fd5b50610327600b5481565b34801561054457600080fd5b50600a546001600160a01b03166102b7565b34801561056257600080fd5b5061028a610f10565b34801561057757600080fd5b506102ef6105863660046122fe565b610f1f565b34801561059757600080fd5b506011546102609060ff1681565b3480156105b157600080fd5b506102606105c03660046122b0565b610f2e565b3480156105d157600080fd5b506102ef6105e03660046121f0565b610f7f565b6102ef6105f3366004612495565b610fb7565b34801561060457600080fd5b506102ef6106133660046123c7565b6112a6565b34801561062457600080fd5b5061028a6106333660046123e2565b6112e3565b34801561064457600080fd5b50610260610653366004612181565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561068d57600080fd5b50610327600f5481565b3480156106a357600080fd5b506102ef6106b2366004612166565b611314565b3480156106c357600080fd5b506102ef6106d23660046123e2565b6113af565b3480156106e357600080fd5b5060115461026090610100900460ff1681565b34801561070257600080fd5b5061032760105481565b34801561071857600080fd5b506102ef6107273660046123e2565b6113de565b60006001600160e01b0319821663780e9d6360e01b148061075157506107518261140d565b92915050565b60606000805461076690612731565b80601f016020809104026020016040519081016040528092919081815260200182805461079290612731565b80156107df5780601f106107b4576101008083540402835291602001916107df565b820191906000526020600020905b8154815290600101906020018083116107c257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108675760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061088e82610d80565b9050806001600160a01b0316836001600160a01b031614156108fc5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161085e565b336001600160a01b038216148061091857506109188133610653565b61098a5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161085e565b610994838361145d565b505050565b600a546001600160a01b031633146109c35760405162461bcd60e51b815260040161085e906125ec565b600f54811115610a245760405162461bcd60e51b815260206004820152602660248201527f4e6f7420656e6f75676820746f6b656e7320726573657276656420666f722067604482015265696674696e6760d01b606482015260840161085e565b6000610a2f60085490565b905060005b82811015610a9357610a81848483818110610a5157610a516127dd565b9050602002016020810190610a669190612166565b82610a728560016126a3565b610a7c91906126a3565b6114cb565b80610a8b8161276c565b915050610a34565b5082829050600f6000828254610aa991906126ee565b9091555050505050565b610abd33826114e5565b610ad95760405162461bcd60e51b815260040161085e90612621565b6109948383836115d8565b6000610aef83610e26565b8210610b515760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161085e565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610ba45760405162461bcd60e51b815260040161085e906125ec565b60405133904780156108fc02916000818181858888f19350505050610bc857600080fd5b565b61099483838360405180602001604052806000815250610f7f565b600e8054610bf290612731565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1e90612731565b8015610c6b5780601f10610c4057610100808354040283529160200191610c6b565b820191906000526020600020905b815481529060010190602001808311610c4e57829003601f168201915b505050505081565b6000610c7e60085490565b8210610ce15760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161085e565b60088281548110610cf457610cf46127dd565b90600052602060002001549050919050565b600a546001600160a01b03163314610d305760405162461bcd60e51b815260040161085e906125ec565b610994600e838361201b565b600a546001600160a01b03163314610d665760405162461bcd60e51b815260040161085e906125ec565b601180549115156101000261ff0019909216919091179055565b6000818152600260205260408120546001600160a01b0316806107515760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161085e565b600a546001600160a01b03163314610e215760405162461bcd60e51b815260040161085e906125ec565b600b55565b60006001600160a01b038216610e915760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161085e565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610ed75760405162461bcd60e51b815260040161085e906125ec565b610bc8600061177f565b600a546001600160a01b03163314610f0b5760405162461bcd60e51b815260040161085e906125ec565b600c55565b60606001805461076690612731565b610f2a3383836117d1565b5050565b6040516bffffffffffffffffffffffff19606084901b1660208201526000908190603401604051602081830303815290604052805190602001209050610f7783601254836118a0565b949350505050565b610f8933836114e5565b610fa55760405162461bcd60e51b815260040161085e90612621565b610fb1848484846118b6565b50505050565b81600b54610fc591906126cf565b3410156110045760405162461bcd60e51b815260206004820152600d60248201526c092dcc6dee4e4cac6e8408aa89609b1b604482015260640161085e565b60115460ff166110565760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f74206d696e74206265666f72652070726573616c65000000000000604482015260640161085e565b601154610100900460ff168061107157506110713382610f2e565b6110c75760405162461bcd60e51b815260206004820152602160248201527f4275796572206e6f742077686974656c697374656420666f722070726573616c6044820152606560f81b606482015260840161085e565b600c5482111561112f5760405162461bcd60e51b815260206004820152602d60248201527f43616e6e6f74206d696e74206d6f7265207468616e20746865206d617820746f60448201526c1ad95b9cc81c195c881b5a5b9d609a1b606482015260840161085e565b6010548211156111815760405162461bcd60e51b815260206004820152601a60248201527f4e6f20746f6b656e73206c65667420666f72206d696e74696e67000000000000604482015260640161085e565b601154610100900460ff16806111b35750600d54336000908152601360205260409020546111b09084906126a3565b11155b6112255760405162461bcd60e51b815260206004820152603c60248201527f43616e6e6f74206d696e74206d6f7265207468616e20746865206d617820746f60448201527f6b656e73207065722077686974656c6973746564206164647265737300000000606482015260840161085e565b600061123060085490565b905060005b8381101561125f5761124d3382610a728560016126a3565b806112578161276c565b915050611235565b50601154610100900460ff1661129457336000908152601360205260408120805485929061128e9084906126a3565b90915550505b8260106000828254610aa991906126ee565b600a546001600160a01b031633146112d05760405162461bcd60e51b815260040161085e906125ec565b6011805460ff1916911515919091179055565b60606112ee826118e9565b6040516020016112fe9190612521565b6040516020818303038152906040529050919050565b600a546001600160a01b0316331461133e5760405162461bcd60e51b815260040161085e906125ec565b6001600160a01b0381166113a35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161085e565b6113ac8161177f565b50565b600a546001600160a01b031633146113d95760405162461bcd60e51b815260040161085e906125ec565b601255565b600a546001600160a01b031633146114085760405162461bcd60e51b815260040161085e906125ec565b600d55565b60006001600160e01b031982166380ac58cd60e01b148061143e57506001600160e01b03198216635b5e139f60e01b145b8061075157506301ffc9a760e01b6001600160e01b0319831614610751565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061149282610d80565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610f2a8282604051806020016040528060008152506119c4565b6000818152600260205260408120546001600160a01b031661155e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161085e565b600061156983610d80565b9050806001600160a01b0316846001600160a01b031614806115a45750836001600160a01b0316611599846107e9565b6001600160a01b0316145b80610f7757506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16610f77565b826001600160a01b03166115eb82610d80565b6001600160a01b03161461164f5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b606482015260840161085e565b6001600160a01b0382166116b15760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161085e565b6116bc8383836119f7565b6116c760008261145d565b6001600160a01b03831660009081526003602052604081208054600192906116f09084906126ee565b90915550506001600160a01b038216600090815260036020526040812080546001929061171e9084906126a3565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156118335760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161085e565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6000826118ad8584611aaf565b14949350505050565b6118c18484846115d8565b6118cd84848484611b23565b610fb15760405162461bcd60e51b815260040161085e9061259a565b6000818152600260205260409020546060906001600160a01b03166119685760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161085e565b6000611972611c30565b9050600081511161199257604051806020016040528060008152506119bd565b8061199c84611c3f565b6040516020016119ad9291906124f2565b6040516020818303038152906040525b9392505050565b6119ce8383611d3d565b6119db6000848484611b23565b6109945760405162461bcd60e51b815260040161085e9061259a565b6001600160a01b038316611a5257611a4d81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611a75565b816001600160a01b0316836001600160a01b031614611a7557611a758382611e8b565b6001600160a01b038216611a8c5761099481611f28565b826001600160a01b0316826001600160a01b031614610994576109948282611fd7565b600081815b8451811015611b1b576000858281518110611ad157611ad16127dd565b60200260200101519050808311611af75760008381526020829052604090209250611b08565b600081815260208490526040902092505b5080611b138161276c565b915050611ab4565b509392505050565b60006001600160a01b0384163b15611c2557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611b6790339089908890889060040161254a565b602060405180830381600087803b158015611b8157600080fd5b505af1925050508015611bb1575060408051601f3d908101601f19168201909252611bae91810190612418565b60015b611c0b573d808015611bdf576040519150601f19603f3d011682016040523d82523d6000602084013e611be4565b606091505b508051611c035760405162461bcd60e51b815260040161085e9061259a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610f77565b506001949350505050565b6060600e805461076690612731565b606081611c635750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611c8d5780611c778161276c565b9150611c869050600a836126bb565b9150611c67565b60008167ffffffffffffffff811115611ca857611ca86127f3565b6040519080825280601f01601f191660200182016040528015611cd2576020820181803683370190505b5090505b8415610f7757611ce76001836126ee565b9150611cf4600a86612787565b611cff9060306126a3565b60f81b818381518110611d1457611d146127dd565b60200101906001600160f81b031916908160001a905350611d36600a866126bb565b9450611cd6565b6001600160a01b038216611d935760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161085e565b6000818152600260205260409020546001600160a01b031615611df85760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161085e565b611e04600083836119f7565b6001600160a01b0382166000908152600360205260408120805460019290611e2d9084906126a3565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001611e9884610e26565b611ea291906126ee565b600083815260076020526040902054909150808214611ef5576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611f3a906001906126ee565b60008381526009602052604081205460088054939450909284908110611f6257611f626127dd565b906000526020600020015490508060088381548110611f8357611f836127dd565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611fbb57611fbb6127c7565b6001900381819060005260206000200160009055905550505050565b6000611fe283610e26565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461202790612731565b90600052602060002090601f016020900481019282612049576000855561208f565b82601f106120625782800160ff1982351617855561208f565b8280016001018555821561208f579182015b8281111561208f578235825591602001919060010190612074565b5061209b92915061209f565b5090565b5b8082111561209b57600081556001016120a0565b80356001600160a01b03811681146120cb57600080fd5b919050565b600082601f8301126120e157600080fd5b8135602067ffffffffffffffff8211156120fd576120fd6127f3565b8160051b61210c828201612672565b83815282810190868401838801850189101561212757600080fd5b600093505b8584101561214a57803583526001939093019291840191840161212c565b50979650505050505050565b803580151581146120cb57600080fd5b60006020828403121561217857600080fd5b6119bd826120b4565b6000806040838503121561219457600080fd5b61219d836120b4565b91506121ab602084016120b4565b90509250929050565b6000806000606084860312156121c957600080fd5b6121d2846120b4565b92506121e0602085016120b4565b9150604084013590509250925092565b6000806000806080858703121561220657600080fd5b61220f856120b4565b9350602061221e8187016120b4565b935060408601359250606086013567ffffffffffffffff8082111561224257600080fd5b818801915088601f83011261225657600080fd5b813581811115612268576122686127f3565b61227a601f8201601f19168501612672565b9150808252898482850101111561229057600080fd5b808484018584013760008482840101525080935050505092959194509250565b600080604083850312156122c357600080fd5b6122cc836120b4565b9150602083013567ffffffffffffffff8111156122e857600080fd5b6122f4858286016120d0565b9150509250929050565b6000806040838503121561231157600080fd5b61231a836120b4565b91506121ab60208401612156565b6000806040838503121561233b57600080fd5b612344836120b4565b946020939093013593505050565b6000806020838503121561236557600080fd5b823567ffffffffffffffff8082111561237d57600080fd5b818501915085601f83011261239157600080fd5b8135818111156123a057600080fd5b8660208260051b85010111156123b557600080fd5b60209290920196919550909350505050565b6000602082840312156123d957600080fd5b6119bd82612156565b6000602082840312156123f457600080fd5b5035919050565b60006020828403121561240d57600080fd5b81356119bd81612809565b60006020828403121561242a57600080fd5b81516119bd81612809565b6000806020838503121561244857600080fd5b823567ffffffffffffffff8082111561246057600080fd5b818501915085601f83011261247457600080fd5b81358181111561248357600080fd5b8660208285010111156123b557600080fd5b600080604083850312156124a857600080fd5b82359150602083013567ffffffffffffffff8111156122e857600080fd5b600081518084526124de816020860160208601612705565b601f01601f19169290920160200192915050565b60008351612504818460208801612705565b835190830190612518818360208801612705565b01949350505050565b60008251612533818460208701612705565b64173539b7b760d91b920191825250600501919050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061257d908301846124c6565b9695505050505050565b6020815260006119bd60208301846124c6565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561269b5761269b6127f3565b604052919050565b600082198211156126b6576126b661279b565b500190565b6000826126ca576126ca6127b1565b500490565b60008160001904831182151516156126e9576126e961279b565b500290565b6000828210156127005761270061279b565b500390565b60005b83811015612720578181015183820152602001612708565b83811115610fb15750506000910152565b600181811c9082168061274557607f821691505b6020821081141561276657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156127805761278061279b565b5060010190565b600082612796576127966127b1565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146113ac57600080fdfea264697066735822122074ba585b90a52097c71a1e9a10e4cf7c252cac3417321d7450ef0d40be13a86664736f6c63430008070033

Deployed Bytecode Sourcemap

48014:3527:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41795:224;;;;;;;;;;-1:-1:-1;41795:224:0;;;;;:::i;:::-;;:::i;:::-;;;8786:14:1;;8779:22;8761:41;;8749:2;8734:18;41795:224:0;;;;;;;;28615:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30174:221::-;;;;;;;;;;-1:-1:-1;30174:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8084:32:1;;;8066:51;;8054:2;8039:18;30174:221:0;7920:203:1;29697:411:0;;;;;;;;;;-1:-1:-1;29697:411:0;;;;;:::i;:::-;;:::i;:::-;;49264:376;;;;;;;;;;-1:-1:-1;49264:376:0;;;;;:::i;:::-;;:::i;48150:35::-;;;;;;;;;;;;;;;;;;;8959:25:1;;;8947:2;8932:18;48150:35:0;8813:177:1;42435:113:0;;;;;;;;;;-1:-1:-1;42523:10:0;:17;42435:113;;30924:339;;;;;;;;;;-1:-1:-1;30924:339:0;;;;;:::i;:::-;;:::i;42103:256::-;;;;;;;;;;-1:-1:-1;42103:256:0;;;;;:::i;:::-;;:::i;48538:28::-;;;;;;;;;;;;;;;;51244:114;;;;;;;;;;;;;:::i;31334:185::-;;;;;;;;;;-1:-1:-1;31334:185:0;;;;;:::i;:::-;;:::i;48573:60::-;;;;;;;;;;-1:-1:-1;48573:60:0;;;;;:::i;:::-;;;;;;;;;;;;;;48250:85;;;;;;;;;;;;;:::i;42625:233::-;;;;;;;;;;-1:-1:-1;42625:233:0;;;;;:::i;:::-;;:::i;51015:97::-;;;;;;;;;;-1:-1:-1;51015:97:0;;;;;:::i;:::-;;:::i;49059:::-;;;;;;;;;;-1:-1:-1;49059:97:0;;;;;:::i;:::-;;:::i;48192:49::-;;;;;;;;;;;;;;;;28309:239;;;;;;;;;;-1:-1:-1;28309:239:0;;;;;:::i;:::-;;:::i;49168:88::-;;;;;;;;;;-1:-1:-1;49168:88:0;;;;;:::i;:::-;;:::i;28039:208::-;;;;;;;;;;-1:-1:-1;28039:208:0;;;;;:::i;:::-;;:::i;7211:103::-;;;;;;;;;;;;;:::i;48712:102::-;;;;;;;;;;-1:-1:-1;48712:102:0;;;;;:::i;:::-;;:::i;48103:38::-;;;;;;;;;;;;;;;;6560:87;;;;;;;;;;-1:-1:-1;6633:6:0;;-1:-1:-1;;;;;6633:6:0;6560:87;;28784:104;;;;;;;;;;;;;:::i;30467:155::-;;;;;;;;;;-1:-1:-1;30467:155:0;;;;;:::i;:::-;;:::i;48445:37::-;;;;;;;;;;-1:-1:-1;48445:37:0;;;;;;;;49648:223;;;;;;;;;;-1:-1:-1;49648:223:0;;;;;:::i;:::-;;:::i;31590:328::-;;;;;;;;;;-1:-1:-1;31590:328:0;;;;;:::i;:::-;;:::i;49881:1002::-;;;;;;:::i;:::-;;:::i;48960:91::-;;;;;;;;;;-1:-1:-1;48960:91:0;;;;;:::i;:::-;;:::i;51366:172::-;;;;;;;;;;-1:-1:-1;51366:172:0;;;;;:::i;:::-;;:::i;30693:164::-;;;;;;;;;;-1:-1:-1;30693:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;30814:25:0;;;30790:4;30814:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30693:164;48344:31;;;;;;;;;;;;;;;;7469:201;;;;;;;;;;-1:-1:-1;7469:201:0;;;;;:::i;:::-;;:::i;51120:116::-;;;;;;;;;;-1:-1:-1;51120:116:0;;;;;:::i;:::-;;:::i;48489:40::-;;;;;;;;;;-1:-1:-1;48489:40:0;;;;;;;;;;;48382:54;;;;;;;;;;;;;;;;48822:130;;;;;;;;;;-1:-1:-1;48822:130:0;;;;;:::i;:::-;;:::i;41795:224::-;41897:4;-1:-1:-1;;;;;;41921:50:0;;-1:-1:-1;;;41921:50:0;;:90;;;41975:36;41999:11;41975:23;:36::i;:::-;41914:97;41795:224;-1:-1:-1;;41795:224:0:o;28615:100::-;28669:13;28702:5;28695:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28615:100;:::o;30174:221::-;30250:7;33517:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33517:16:0;30270:73;;;;-1:-1:-1;;;30270:73:0;;16121:2:1;30270:73:0;;;16103:21:1;16160:2;16140:18;;;16133:30;16199:34;16179:18;;;16172:62;-1:-1:-1;;;16250:18:1;;;16243:42;16302:19;;30270:73:0;;;;;;;;;-1:-1:-1;30363:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;30363:24:0;;30174:221::o;29697:411::-;29778:13;29794:23;29809:7;29794:14;:23::i;:::-;29778:39;;29842:5;-1:-1:-1;;;;;29836:11:0;:2;-1:-1:-1;;;;;29836:11:0;;;29828:57;;;;-1:-1:-1;;;29828:57:0;;17311:2:1;29828:57:0;;;17293:21:1;17350:2;17330:18;;;17323:30;17389:34;17369:18;;;17362:62;-1:-1:-1;;;17440:18:1;;;17433:31;17481:19;;29828:57:0;17109:397:1;29828:57:0;5364:10;-1:-1:-1;;;;;29920:21:0;;;;:62;;-1:-1:-1;29945:37:0;29962:5;5364:10;30693:164;:::i;29945:37::-;29898:168;;;;-1:-1:-1;;;29898:168:0;;14514:2:1;29898:168:0;;;14496:21:1;14553:2;14533:18;;;14526:30;14592:34;14572:18;;;14565:62;14663:26;14643:18;;;14636:54;14707:19;;29898:168:0;14312:420:1;29898:168:0;30079:21;30088:2;30092:7;30079:8;:21::i;:::-;29767:341;29697:411;;:::o;49264:376::-;6633:6;;-1:-1:-1;;;;;6633:6:0;5364:10;6780:23;6772:68;;;;-1:-1:-1;;;6772:68:0;;;;;;;:::i;:::-;49366:12:::1;::::0;49346:32;::::1;;49338:83;;;::::0;-1:-1:-1;;;49338:83:0;;13705:2:1;49338:83:0::1;::::0;::::1;13687:21:1::0;13744:2;13724:18;;;13717:30;13783:34;13763:18;;;13756:62;-1:-1:-1;;;13834:18:1;;;13827:36;13880:19;;49338:83:0::1;13503:402:1::0;49338:83:0::1;49434:14;49451:13;42523:10:::0;:17;;42435:113;49451:13:::1;49434:30;;49480:9;49475:113;49495:20:::0;;::::1;49475:113;;;49537:39;49547:9;;49557:1;49547:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;49574:1:::0;49561:10:::1;49565:6:::0;49561:1:::1;:10;:::i;:::-;:14;;;;:::i;:::-;49537:9;:39::i;:::-;49517:3:::0;::::1;::::0;::::1;:::i;:::-;;;;49475:113;;;;49616:9;;:16;;49600:12;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;49264:376:0:o;30924:339::-;31119:41;5364:10;31152:7;31119:18;:41::i;:::-;31111:103;;;;-1:-1:-1;;;31111:103:0;;;;;;;:::i;:::-;31227:28;31237:4;31243:2;31247:7;31227:9;:28::i;42103:256::-;42200:7;42236:23;42253:5;42236:16;:23::i;:::-;42228:5;:31;42220:87;;;;-1:-1:-1;;;42220:87:0;;10190:2:1;42220:87:0;;;10172:21:1;10229:2;10209:18;;;10202:30;10268:34;10248:18;;;10241:62;-1:-1:-1;;;10319:18:1;;;10312:41;10370:19;;42220:87:0;9988:407:1;42220:87:0;-1:-1:-1;;;;;;42325:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;42103:256::o;51244:114::-;6633:6;;-1:-1:-1;;;;;6633:6:0;5364:10;6780:23;6772:68;;;;-1:-1:-1;;;6772:68:0;;;;;;;:::i;:::-;51302:47:::1;::::0;51310:10:::1;::::0;51327:21:::1;51302:47:::0;::::1;;;::::0;::::1;::::0;;;51327:21;51310:10;51302:47;::::1;;;;;;51294:56;;;::::0;::::1;;51244:114::o:0;31334:185::-;31472:39;31489:4;31495:2;31499:7;31472:39;;;;;;;;;;;;:16;:39::i;48250:85::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42625:233::-;42700:7;42736:30;42523:10;:17;;42435:113;42736:30;42728:5;:38;42720:95;;;;-1:-1:-1;;;42720:95:0;;18131:2:1;42720:95:0;;;18113:21:1;18170:2;18150:18;;;18143:30;18209:34;18189:18;;;18182:62;-1:-1:-1;;;18260:18:1;;;18253:42;18312:19;;42720:95:0;17929:408:1;42720:95:0;42833:10;42844:5;42833:17;;;;;;;;:::i;:::-;;;;;;;;;42826:24;;42625:233;;;:::o;51015:97::-;6633:6;;-1:-1:-1;;;;;6633:6:0;5364:10;6780:23;6772:68;;;;-1:-1:-1;;;6772:68:0;;;;;;;:::i;:::-;51086:18:::1;:12;51101:3:::0;;51086:18:::1;:::i;49059:97::-:0;6633:6;;-1:-1:-1;;;;;6633:6:0;5364:10;6780:23;6772:68;;;;-1:-1:-1;;;6772:68:0;;;;;;;:::i;:::-;49122:20:::1;:26:::0;;;::::1;;;;-1:-1:-1::0;;49122:26:0;;::::1;::::0;;;::::1;::::0;;49059:97::o;28309:239::-;28381:7;28417:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28417:16:0;28452:19;28444:73;;;;-1:-1:-1;;;28444:73:0;;15350:2:1;28444:73:0;;;15332:21:1;15389:2;15369:18;;;15362:30;15428:34;15408:18;;;15401:62;-1:-1:-1;;;15479:18:1;;;15472:39;15528:19;;28444:73:0;15148:405:1;49168:88:0;6633:6;;-1:-1:-1;;;;;6633:6:0;5364:10;6780:23;6772:68;;;;-1:-1:-1;;;6772:68:0;;;;;;;:::i;:::-;49232:10:::1;:16:::0;49168:88::o;28039:208::-;28111:7;-1:-1:-1;;;;;28139:19:0;;28131:74;;;;-1:-1:-1;;;28131:74:0;;14939:2:1;28131:74:0;;;14921:21:1;14978:2;14958:18;;;14951:30;15017:34;14997:18;;;14990:62;-1:-1:-1;;;15068:18:1;;;15061:40;15118:19;;28131:74:0;14737:406:1;28131:74:0;-1:-1:-1;;;;;;28223:16:0;;;;;:9;:16;;;;;;;28039:208::o;7211:103::-;6633:6;;-1:-1:-1;;;;;6633:6:0;5364:10;6780:23;6772:68;;;;-1:-1:-1;;;6772:68:0;;;;;;;:::i;:::-;7276:30:::1;7303:1;7276:18;:30::i;48712:102::-:0;6633:6;;-1:-1:-1;;;;;6633:6:0;5364:10;6780:23;6772:68;;;;-1:-1:-1;;;6772:68:0;;;;;;;:::i;:::-;48784:16:::1;:22:::0;48712:102::o;28784:104::-;28840:13;28873:7;28866:14;;;;;:::i;30467:155::-;30562:52;5364:10;30595:8;30605;30562:18;:52::i;:::-;30467:155;;:::o;49648:223::-;49773:25;;-1:-1:-1;;6912:2:1;6908:15;;;6904:53;49773:25:0;;;6892:66:1;49726:4:0;;;;6974:12:1;;49773:25:0;;;;;;;;;;;;49763:36;;;;;;49748:51;;49817:46;49836:5;49843:13;;49858:4;49817:18;:46::i;:::-;49810:53;49648:223;-1:-1:-1;;;;49648:223:0:o;31590:328::-;31765:41;5364:10;31798:7;31765:18;:41::i;:::-;31757:103;;;;-1:-1:-1;;;31757:103:0;;;;;;;:::i;:::-;31871:39;31885:4;31891:2;31895:7;31904:5;31871:13;:39::i;:::-;31590:328;;;;:::o;49881:1002::-;49997:6;49984:10;;:19;;;;:::i;:::-;49971:9;:32;;49963:58;;;;-1:-1:-1;;;49963:58:0;;12191:2:1;49963:58:0;;;12173:21:1;12230:2;12210:18;;;12203:30;-1:-1:-1;;;12249:18:1;;;12242:43;12302:18;;49963:58:0;11989:337:1;49963:58:0;50040:17;;;;50032:56;;;;-1:-1:-1;;;50032:56:0;;9421:2:1;50032:56:0;;;9403:21:1;9460:2;9440:18;;;9433:30;9499:28;9479:18;;;9472:56;9545:18;;50032:56:0;9219:350:1;50032:56:0;50107:20;;;;;;;;:49;;;50131:25;50138:10;50150:5;50131:6;:25::i;:::-;50099:95;;;;-1:-1:-1;;;50099:95:0;;14112:2:1;50099:95:0;;;14094:21:1;14151:2;14131:18;;;14124:30;14190:34;14170:18;;;14163:62;-1:-1:-1;;;14241:18:1;;;14234:31;14282:19;;50099:95:0;13910:397:1;50099:95:0;50223:16;;50213:6;:26;;50205:84;;;;-1:-1:-1;;;50205:84:0;;9776:2:1;50205:84:0;;;9758:21:1;9815:2;9795:18;;;9788:30;9854:34;9834:18;;;9827:62;-1:-1:-1;;;9905:18:1;;;9898:43;9958:19;;50205:84:0;9574:409:1;50205:84:0;50318:17;;50308:6;:27;;50300:66;;;;-1:-1:-1;;;50300:66:0;;18544:2:1;50300:66:0;;;18526:21:1;18583:2;18563:18;;;18556:30;18622:28;18602:18;;;18595:56;18668:18;;50300:66:0;18342:350:1;50300:66:0;50385:20;;;;;;;;:106;;-1:-1:-1;50460:30:0;;50436:10;50410:37;;;;:25;:37;;;;;;:46;;50450:6;;50410:46;:::i;:::-;:80;;50385:106;50377:192;;;;-1:-1:-1;;;50377:192:0;;18899:2:1;50377:192:0;;;18881:21:1;18938:2;18918:18;;;18911:30;18977:34;18957:18;;;18950:62;19048:30;19028:18;;;19021:58;19096:19;;50377:192:0;18697:424:1;50377:192:0;50582:14;50599:13;42523:10;:17;;42435:113;50599:13;50582:30;;50627:9;50623:100;50646:6;50642:1;:10;50623:100;;;50674:37;50684:10;50709:1;50696:10;50700:6;50696:1;:10;:::i;50674:37::-;50654:3;;;;:::i;:::-;;;;50623:100;;;-1:-1:-1;50740:20:0;;;;;;;50735:101;;50803:10;50777:37;;;;:25;:37;;;;;:47;;50818:6;;50777:37;:47;;50818:6;;50777:47;:::i;:::-;;;;-1:-1:-1;;50735:101:0;50869:6;50848:17;;:27;;;;;;;:::i;48960:91::-;6633:6;;-1:-1:-1;;;;;6633:6:0;5364:10;6780:23;6772:68;;;;-1:-1:-1;;;6772:68:0;;;;;;;:::i;:::-;49020:17:::1;:23:::0;;-1:-1:-1;;49020:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;48960:91::o;51366:172::-;51439:13;51496:23;51511:7;51496:14;:23::i;:::-;51479:50;;;;;;;;:::i;:::-;;;;;;;;;;;;;51465:65;;51366:172;;;:::o;7469:201::-;6633:6;;-1:-1:-1;;;;;6633:6:0;5364:10;6780:23;6772:68;;;;-1:-1:-1;;;6772:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7558:22:0;::::1;7550:73;;;::::0;-1:-1:-1;;;7550:73:0;;11021:2:1;7550:73:0::1;::::0;::::1;11003:21:1::0;11060:2;11040:18;;;11033:30;11099:34;11079:18;;;11072:62;-1:-1:-1;;;11150:18:1;;;11143:36;11196:19;;7550:73:0::1;10819:402:1::0;7550:73:0::1;7634:28;7653:8;7634:18;:28::i;:::-;7469:201:::0;:::o;51120:116::-;6633:6;;-1:-1:-1;;;;;6633:6:0;5364:10;6780:23;6772:68;;;;-1:-1:-1;;;6772:68:0;;;;;;;:::i;:::-;51198:13:::1;:30:::0;51120:116::o;48822:130::-;6633:6;;-1:-1:-1;;;;;6633:6:0;5364:10;6780:23;6772:68;;;;-1:-1:-1;;;6772:68:0;;;;;;;:::i;:::-;48908:30:::1;:36:::0;48822:130::o;27670:305::-;27772:4;-1:-1:-1;;;;;;27809:40:0;;-1:-1:-1;;;27809:40:0;;:105;;-1:-1:-1;;;;;;;27866:48:0;;-1:-1:-1;;;27866:48:0;27809:105;:158;;;-1:-1:-1;;;;;;;;;;19453:40:0;;;27931:36;19344:157;37574:174;37649:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;37649:29:0;-1:-1:-1;;;;;37649:29:0;;;;;;;;:24;;37703:23;37649:24;37703:14;:23::i;:::-;-1:-1:-1;;;;;37694:46:0;;;;;;;;;;;37574:174;;:::o;34412:110::-;34488:26;34498:2;34502:7;34488:26;;;;;;;;;;;;:9;:26::i;33722:348::-;33815:4;33517:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33517:16:0;33832:73;;;;-1:-1:-1;;;33832:73:0;;13292:2:1;33832:73:0;;;13274:21:1;13331:2;13311:18;;;13304:30;13370:34;13350:18;;;13343:62;-1:-1:-1;;;13421:18:1;;;13414:42;13473:19;;33832:73:0;13090:408:1;33832:73:0;33916:13;33932:23;33947:7;33932:14;:23::i;:::-;33916:39;;33985:5;-1:-1:-1;;;;;33974:16:0;:7;-1:-1:-1;;;;;33974:16:0;;:51;;;;34018:7;-1:-1:-1;;;;;33994:31:0;:20;34006:7;33994:11;:20::i;:::-;-1:-1:-1;;;;;33994:31:0;;33974:51;:87;;;-1:-1:-1;;;;;;30814:25:0;;;30790:4;30814:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;34029:32;30693:164;36831:625;36990:4;-1:-1:-1;;;;;36963:31:0;:23;36978:7;36963:14;:23::i;:::-;-1:-1:-1;;;;;36963:31:0;;36955:81;;;;-1:-1:-1;;;36955:81:0;;11428:2:1;36955:81:0;;;11410:21:1;11467:2;11447:18;;;11440:30;11506:34;11486:18;;;11479:62;-1:-1:-1;;;11557:18:1;;;11550:35;11602:19;;36955:81:0;11226:401:1;36955:81:0;-1:-1:-1;;;;;37055:16:0;;37047:65;;;;-1:-1:-1;;;37047:65:0;;12533:2:1;37047:65:0;;;12515:21:1;12572:2;12552:18;;;12545:30;12611:34;12591:18;;;12584:62;-1:-1:-1;;;12662:18:1;;;12655:34;12706:19;;37047:65:0;12331:400:1;37047:65:0;37125:39;37146:4;37152:2;37156:7;37125:20;:39::i;:::-;37229:29;37246:1;37250:7;37229:8;:29::i;:::-;-1:-1:-1;;;;;37271:15:0;;;;;;:9;:15;;;;;:20;;37290:1;;37271:15;:20;;37290:1;;37271:20;:::i;:::-;;;;-1:-1:-1;;;;;;;37302:13:0;;;;;;:9;:13;;;;;:18;;37319:1;;37302:13;:18;;37319:1;;37302:18;:::i;:::-;;;;-1:-1:-1;;37331:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;37331:21:0;-1:-1:-1;;;;;37331:21:0;;;;;;;;;37370:27;;37331:16;;37370:27;;;;;;;29767:341;29697:411;;:::o;7830:191::-;7923:6;;;-1:-1:-1;;;;;7940:17:0;;;-1:-1:-1;;;;;;7940:17:0;;;;;;;7973:40;;7923:6;;;7940:17;7923:6;;7973:40;;7904:16;;7973:40;7893:128;7830:191;:::o;37890:315::-;38045:8;-1:-1:-1;;;;;38036:17:0;:5;-1:-1:-1;;;;;38036:17:0;;;38028:55;;;;-1:-1:-1;;;38028:55:0;;12938:2:1;38028:55:0;;;12920:21:1;12977:2;12957:18;;;12950:30;13016:27;12996:18;;;12989:55;13061:18;;38028:55:0;12736:349:1;38028:55:0;-1:-1:-1;;;;;38094:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;38094:46:0;;;;;;;;;;38156:41;;8761::1;;;38156::0;;8734:18:1;38156:41:0;;;;;;;37890:315;;;:::o;958:190::-;1083:4;1136;1107:25;1120:5;1127:4;1107:12;:25::i;:::-;:33;;958:190;-1:-1:-1;;;;958:190:0:o;32800:315::-;32957:28;32967:4;32973:2;32977:7;32957:9;:28::i;:::-;33004:48;33027:4;33033:2;33037:7;33046:5;33004:22;:48::i;:::-;32996:111;;;;-1:-1:-1;;;32996:111:0;;;;;;;:::i;28959:334::-;33493:4;33517:16;;;:7;:16;;;;;;29032:13;;-1:-1:-1;;;;;33517:16:0;29058:76;;;;-1:-1:-1;;;29058:76:0;;16895:2:1;29058:76:0;;;16877:21:1;16934:2;16914:18;;;16907:30;16973:34;16953:18;;;16946:62;-1:-1:-1;;;17024:18:1;;;17017:45;17079:19;;29058:76:0;16693:411:1;29058:76:0;29147:21;29171:10;:8;:10::i;:::-;29147:34;;29223:1;29205:7;29199:21;:25;:86;;;;;;;;;;;;;;;;;29251:7;29260:18;:7;:16;:18::i;:::-;29234:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29199:86;29192:93;28959:334;-1:-1:-1;;;28959:334:0:o;34749:321::-;34879:18;34885:2;34889:7;34879:5;:18::i;:::-;34930:54;34961:1;34965:2;34969:7;34978:5;34930:22;:54::i;:::-;34908:154;;;;-1:-1:-1;;;34908:154:0;;;;;;;:::i;43471:589::-;-1:-1:-1;;;;;43677:18:0;;43673:187;;43712:40;43744:7;44887:10;:17;;44860:24;;;;:15;:24;;;;;:44;;;44915:24;;;;;;;;;;;;44783:164;43712:40;43673:187;;;43782:2;-1:-1:-1;;;;;43774:10:0;:4;-1:-1:-1;;;;;43774:10:0;;43770:90;;43801:47;43834:4;43840:7;43801:32;:47::i;:::-;-1:-1:-1;;;;;43874:16:0;;43870:183;;43907:45;43944:7;43907:36;:45::i;43870:183::-;43980:4;-1:-1:-1;;;;;43974:10:0;:2;-1:-1:-1;;;;;43974:10:0;;43970:83;;44001:40;44029:2;44033:7;44001:27;:40::i;1510:675::-;1593:7;1636:4;1593:7;1651:497;1675:5;:12;1671:1;:16;1651:497;;;1709:20;1732:5;1738:1;1732:8;;;;;;;;:::i;:::-;;;;;;;1709:31;;1775:12;1759;:28;1755:382;;2261:13;2311:15;;;2347:4;2340:15;;;2394:4;2378:21;;1887:57;;1755:382;;;2261:13;2311:15;;;2347:4;2340:15;;;2394:4;2378:21;;2064:57;;1755:382;-1:-1:-1;1689:3:0;;;;:::i;:::-;;;;1651:497;;;-1:-1:-1;2165:12:0;1510:675;-1:-1:-1;;;1510:675:0:o;38770:799::-;38925:4;-1:-1:-1;;;;;38946:13:0;;9556:19;:23;38942:620;;38982:72;;-1:-1:-1;;;38982:72:0;;-1:-1:-1;;;;;38982:36:0;;;;;:72;;5364:10;;39033:4;;39039:7;;39048:5;;38982:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38982:72:0;;;;;;;;-1:-1:-1;;38982:72:0;;;;;;;;;;;;:::i;:::-;;;38978:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39224:13:0;;39220:272;;39267:60;;-1:-1:-1;;;39267:60:0;;;;;;;:::i;39220:272::-;39442:6;39436:13;39427:6;39423:2;39419:15;39412:38;38978:529;-1:-1:-1;;;;;;39105:51:0;-1:-1:-1;;;39105:51:0;;-1:-1:-1;39098:58:0;;38942:620;-1:-1:-1;39546:4:0;38770:799;;;;;;:::o;50891:113::-;50951:13;50984:12;50977:19;;;;;:::i;2846:723::-;2902:13;3123:10;3119:53;;-1:-1:-1;;3150:10:0;;;;;;;;;;;;-1:-1:-1;;;3150:10:0;;;;;2846:723::o;3119:53::-;3197:5;3182:12;3238:78;3245:9;;3238:78;;3271:8;;;;:::i;:::-;;-1:-1:-1;3294:10:0;;-1:-1:-1;3302:2:0;3294:10;;:::i;:::-;;;3238:78;;;3326:19;3358:6;3348:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3348:17:0;;3326:39;;3376:154;3383:10;;3376:154;;3410:11;3420:1;3410:11;;:::i;:::-;;-1:-1:-1;3479:10:0;3487:2;3479:5;:10;:::i;:::-;3466:24;;:2;:24;:::i;:::-;3453:39;;3436:6;3443;3436:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;3436:56:0;;;;;;;;-1:-1:-1;3507:11:0;3516:2;3507:11;;:::i;:::-;;;3376:154;;35406:439;-1:-1:-1;;;;;35486:16:0;;35478:61;;;;-1:-1:-1;;;35478:61:0;;15760:2:1;35478:61:0;;;15742:21:1;;;15779:18;;;15772:30;15838:34;15818:18;;;15811:62;15890:18;;35478:61:0;15558:356:1;35478:61:0;33493:4;33517:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33517:16:0;:30;35550:58;;;;-1:-1:-1;;;35550:58:0;;11834:2:1;35550:58:0;;;11816:21:1;11873:2;11853:18;;;11846:30;11912;11892:18;;;11885:58;11960:18;;35550:58:0;11632:352:1;35550:58:0;35621:45;35650:1;35654:2;35658:7;35621:20;:45::i;:::-;-1:-1:-1;;;;;35679:13:0;;;;;;:9;:13;;;;;:18;;35696:1;;35679:13;:18;;35696:1;;35679:18;:::i;:::-;;;;-1:-1:-1;;35708:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35708:21:0;-1:-1:-1;;;;;35708:21:0;;;;;;;;35747:33;;35708:16;;;35747:33;;35708:16;;35747:33;30467:155;;:::o;45574:988::-;45840:22;45890:1;45865:22;45882:4;45865:16;:22::i;:::-;:26;;;;:::i;:::-;45902:18;45923:26;;;:17;:26;;;;;;45840:51;;-1:-1:-1;46056:28:0;;;46052:328;;-1:-1:-1;;;;;46123:18:0;;46101:19;46123:18;;;:12;:18;;;;;;;;:34;;;;;;;;;46174:30;;;;;;:44;;;46291:30;;:17;:30;;;;;:43;;;46052:328;-1:-1:-1;46476:26:0;;;;:17;:26;;;;;;;;46469:33;;;-1:-1:-1;;;;;46520:18:0;;;;;:12;:18;;;;;:34;;;;;;;46513:41;45574:988::o;46857:1079::-;47135:10;:17;47110:22;;47135:21;;47155:1;;47135:21;:::i;:::-;47167:18;47188:24;;;:15;:24;;;;;;47561:10;:26;;47110:46;;-1:-1:-1;47188:24:0;;47110:46;;47561:26;;;;;;:::i;:::-;;;;;;;;;47539:48;;47625:11;47600:10;47611;47600:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;47705:28;;;:15;:28;;;;;;;:41;;;47877:24;;;;;47870:31;47912:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;46928:1008;;;46857:1079;:::o;44361:221::-;44446:14;44463:20;44480:2;44463:16;:20::i;:::-;-1:-1:-1;;;;;44494:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;44539:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;44361:221:0: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:723::-;246:5;299:3;292:4;284:6;280:17;276:27;266:55;;317:1;314;307:12;266:55;353:6;340:20;379:4;402:18;398:2;395:26;392:52;;;424:18;;:::i;:::-;470:2;467:1;463:10;493:28;517:2;513;509:11;493:28;:::i;:::-;555:15;;;586:12;;;;618:15;;;652;;;648:24;;645:33;-1:-1:-1;642:53:1;;;691:1;688;681:12;642:53;713:1;704:10;;723:163;737:2;734:1;731:9;723:163;;;794:17;;782:30;;755:1;748:9;;;;;832:12;;;;864;;723:163;;;-1:-1:-1;904:5:1;192:723;-1:-1:-1;;;;;;;192:723:1:o;920:160::-;985:20;;1041:13;;1034:21;1024:32;;1014:60;;1070:1;1067;1060:12;1085:186;1144:6;1197:2;1185:9;1176:7;1172:23;1168:32;1165:52;;;1213:1;1210;1203:12;1165:52;1236:29;1255:9;1236:29;:::i;1276:260::-;1344:6;1352;1405:2;1393:9;1384:7;1380:23;1376:32;1373:52;;;1421:1;1418;1411:12;1373:52;1444:29;1463:9;1444:29;:::i;:::-;1434:39;;1492:38;1526:2;1515:9;1511:18;1492:38;:::i;:::-;1482:48;;1276:260;;;;;:::o;1541:328::-;1618:6;1626;1634;1687:2;1675:9;1666:7;1662:23;1658:32;1655:52;;;1703:1;1700;1693:12;1655:52;1726:29;1745:9;1726:29;:::i;:::-;1716:39;;1774:38;1808:2;1797:9;1793:18;1774:38;:::i;:::-;1764:48;;1859:2;1848:9;1844:18;1831:32;1821:42;;1541:328;;;;;:::o;1874:980::-;1969:6;1977;1985;1993;2046:3;2034:9;2025:7;2021:23;2017:33;2014:53;;;2063:1;2060;2053:12;2014:53;2086:29;2105:9;2086:29;:::i;:::-;2076:39;;2134:2;2155:38;2189:2;2178:9;2174:18;2155:38;:::i;:::-;2145:48;;2240:2;2229:9;2225:18;2212:32;2202:42;;2295:2;2284:9;2280:18;2267:32;2318:18;2359:2;2351:6;2348:14;2345:34;;;2375:1;2372;2365:12;2345:34;2413:6;2402:9;2398:22;2388:32;;2458:7;2451:4;2447:2;2443:13;2439:27;2429:55;;2480:1;2477;2470:12;2429:55;2516:2;2503:16;2538:2;2534;2531:10;2528:36;;;2544:18;;:::i;:::-;2586:53;2629:2;2610:13;;-1:-1:-1;;2606:27:1;2602:36;;2586:53;:::i;:::-;2573:66;;2662:2;2655:5;2648:17;2702:7;2697:2;2692;2688;2684:11;2680:20;2677:33;2674:53;;;2723:1;2720;2713:12;2674:53;2778:2;2773;2769;2765:11;2760:2;2753:5;2749:14;2736:45;2822:1;2817:2;2812;2805:5;2801:14;2797:23;2790:34;;2843:5;2833:15;;;;;1874:980;;;;;;;:::o;2859:422::-;2952:6;2960;3013:2;3001:9;2992:7;2988:23;2984:32;2981:52;;;3029:1;3026;3019:12;2981:52;3052:29;3071:9;3052:29;:::i;:::-;3042:39;;3132:2;3121:9;3117:18;3104:32;3159:18;3151:6;3148:30;3145:50;;;3191:1;3188;3181:12;3145:50;3214:61;3267:7;3258:6;3247:9;3243:22;3214:61;:::i;:::-;3204:71;;;2859:422;;;;;:::o;3286:254::-;3351:6;3359;3412:2;3400:9;3391:7;3387:23;3383:32;3380:52;;;3428:1;3425;3418:12;3380:52;3451:29;3470:9;3451:29;:::i;:::-;3441:39;;3499:35;3530:2;3519:9;3515:18;3499:35;:::i;3545:254::-;3613:6;3621;3674:2;3662:9;3653:7;3649:23;3645:32;3642:52;;;3690:1;3687;3680:12;3642:52;3713:29;3732:9;3713:29;:::i;:::-;3703:39;3789:2;3774:18;;;;3761:32;;-1:-1:-1;;;3545:254:1:o;3804:615::-;3890:6;3898;3951:2;3939:9;3930:7;3926:23;3922:32;3919:52;;;3967:1;3964;3957:12;3919:52;4007:9;3994:23;4036:18;4077:2;4069:6;4066:14;4063:34;;;4093:1;4090;4083:12;4063:34;4131:6;4120:9;4116:22;4106:32;;4176:7;4169:4;4165:2;4161:13;4157:27;4147:55;;4198:1;4195;4188:12;4147:55;4238:2;4225:16;4264:2;4256:6;4253:14;4250:34;;;4280:1;4277;4270:12;4250:34;4333:7;4328:2;4318:6;4315:1;4311:14;4307:2;4303:23;4299:32;4296:45;4293:65;;;4354:1;4351;4344:12;4293:65;4385:2;4377:11;;;;;4407:6;;-1:-1:-1;3804:615:1;;-1:-1:-1;;;;3804:615:1:o;4424:180::-;4480:6;4533:2;4521:9;4512:7;4508:23;4504:32;4501:52;;;4549:1;4546;4539:12;4501:52;4572:26;4588:9;4572:26;:::i;4609:180::-;4668:6;4721:2;4709:9;4700:7;4696:23;4692:32;4689:52;;;4737:1;4734;4727:12;4689:52;-1:-1:-1;4760:23:1;;4609:180;-1:-1:-1;4609:180:1:o;4794:245::-;4852:6;4905:2;4893:9;4884:7;4880:23;4876:32;4873:52;;;4921:1;4918;4911:12;4873:52;4960:9;4947:23;4979:30;5003:5;4979:30;:::i;5044:249::-;5113:6;5166:2;5154:9;5145:7;5141:23;5137:32;5134:52;;;5182:1;5179;5172:12;5134:52;5214:9;5208:16;5233:30;5257:5;5233:30;:::i;5298:592::-;5369:6;5377;5430:2;5418:9;5409:7;5405:23;5401:32;5398:52;;;5446:1;5443;5436:12;5398:52;5486:9;5473:23;5515:18;5556:2;5548:6;5545:14;5542:34;;;5572:1;5569;5562:12;5542:34;5610:6;5599:9;5595:22;5585:32;;5655:7;5648:4;5644:2;5640:13;5636:27;5626:55;;5677:1;5674;5667:12;5626:55;5717:2;5704:16;5743:2;5735:6;5732:14;5729:34;;;5759:1;5756;5749:12;5729:34;5804:7;5799:2;5790:6;5786:2;5782:15;5778:24;5775:37;5772:57;;;5825:1;5822;5815:12;6080:416;6173:6;6181;6234:2;6222:9;6213:7;6209:23;6205:32;6202:52;;;6250:1;6247;6240:12;6202:52;6286:9;6273:23;6263:33;;6347:2;6336:9;6332:18;6319:32;6374:18;6366:6;6363:30;6360:50;;;6406:1;6403;6396:12;6501:257;6542:3;6580:5;6574:12;6607:6;6602:3;6595:19;6623:63;6679:6;6672:4;6667:3;6663:14;6656:4;6649:5;6645:16;6623:63;:::i;:::-;6740:2;6719:15;-1:-1:-1;;6715:29:1;6706:39;;;;6747:4;6702:50;;6501:257;-1:-1:-1;;6501:257:1:o;6997:470::-;7176:3;7214:6;7208:13;7230:53;7276:6;7271:3;7264:4;7256:6;7252:17;7230:53;:::i;:::-;7346:13;;7305:16;;;;7368:57;7346:13;7305:16;7402:4;7390:17;;7368:57;:::i;:::-;7441:20;;6997:470;-1:-1:-1;;;;6997:470:1:o;7472:443::-;7704:3;7742:6;7736:13;7758:53;7804:6;7799:3;7792:4;7784:6;7780:17;7758:53;:::i;:::-;-1:-1:-1;;;7833:16:1;;7858:22;;;-1:-1:-1;7907:1:1;7896:13;;7472:443;-1:-1:-1;7472:443:1:o;8128:488::-;-1:-1:-1;;;;;8397:15:1;;;8379:34;;8449:15;;8444:2;8429:18;;8422:43;8496:2;8481:18;;8474:34;;;8544:3;8539:2;8524:18;;8517:31;;;8322:4;;8565:45;;8590:19;;8582:6;8565:45;:::i;:::-;8557:53;8128:488;-1:-1:-1;;;;;;8128:488:1:o;8995:219::-;9144:2;9133:9;9126:21;9107:4;9164:44;9204:2;9193:9;9189:18;9181:6;9164:44;:::i;10400:414::-;10602:2;10584:21;;;10641:2;10621:18;;;10614:30;10680:34;10675:2;10660:18;;10653:62;-1:-1:-1;;;10746:2:1;10731:18;;10724:48;10804:3;10789:19;;10400:414::o;16332:356::-;16534:2;16516:21;;;16553:18;;;16546:30;16612:34;16607:2;16592:18;;16585:62;16679:2;16664:18;;16332:356::o;17511:413::-;17713:2;17695:21;;;17752:2;17732:18;;;17725:30;17791:34;17786:2;17771:18;;17764:62;-1:-1:-1;;;17857:2:1;17842:18;;17835:47;17914:3;17899:19;;17511:413::o;19308:275::-;19379:2;19373:9;19444:2;19425:13;;-1:-1:-1;;19421:27:1;19409:40;;19479:18;19464:34;;19500:22;;;19461:62;19458:88;;;19526:18;;:::i;:::-;19562:2;19555:22;19308:275;;-1:-1:-1;19308:275:1:o;19588:128::-;19628:3;19659:1;19655:6;19652:1;19649:13;19646:39;;;19665:18;;:::i;:::-;-1:-1:-1;19701:9:1;;19588:128::o;19721:120::-;19761:1;19787;19777:35;;19792:18;;:::i;:::-;-1:-1:-1;19826:9:1;;19721:120::o;19846:168::-;19886:7;19952:1;19948;19944:6;19940:14;19937:1;19934:21;19929:1;19922:9;19915:17;19911:45;19908:71;;;19959:18;;:::i;:::-;-1:-1:-1;19999:9:1;;19846:168::o;20019:125::-;20059:4;20087:1;20084;20081:8;20078:34;;;20092:18;;:::i;:::-;-1:-1:-1;20129:9:1;;20019:125::o;20149:258::-;20221:1;20231:113;20245:6;20242:1;20239:13;20231:113;;;20321:11;;;20315:18;20302:11;;;20295:39;20267:2;20260:10;20231:113;;;20362:6;20359:1;20356:13;20353:48;;;-1:-1:-1;;20397:1:1;20379:16;;20372:27;20149:258::o;20412:380::-;20491:1;20487:12;;;;20534;;;20555:61;;20609:4;20601:6;20597:17;20587:27;;20555:61;20662:2;20654:6;20651:14;20631:18;20628:38;20625:161;;;20708:10;20703:3;20699:20;20696:1;20689:31;20743:4;20740:1;20733:15;20771:4;20768:1;20761:15;20625:161;;20412:380;;;:::o;20797:135::-;20836:3;-1:-1:-1;;20857:17:1;;20854:43;;;20877:18;;:::i;:::-;-1:-1:-1;20924:1:1;20913:13;;20797:135::o;20937:112::-;20969:1;20995;20985:35;;21000:18;;:::i;:::-;-1:-1:-1;21034:9:1;;20937:112::o;21054:127::-;21115:10;21110:3;21106:20;21103:1;21096:31;21146:4;21143:1;21136:15;21170:4;21167:1;21160:15;21186:127;21247:10;21242:3;21238:20;21235:1;21228:31;21278:4;21275:1;21268:15;21302:4;21299:1;21292:15;21318:127;21379:10;21374:3;21370:20;21367:1;21360:31;21410:4;21407:1;21400:15;21434:4;21431:1;21424:15;21450:127;21511:10;21506:3;21502:20;21499:1;21492:31;21542:4;21539:1;21532:15;21566:4;21563:1;21556:15;21582:127;21643:10;21638:3;21634:20;21631:1;21624:31;21674:4;21671:1;21664:15;21698:4;21695:1;21688:15;21714:131;-1:-1:-1;;;;;;21788:32:1;;21778:43;;21768:71;;21835:1;21832;21825:12

Swarm Source

ipfs://74ba585b90a52097c71a1e9a10e4cf7c252cac3417321d7450ef0d40be13a866
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.