ETH Price: $3,115.42 (+0.94%)
Gas: 3 Gwei

Token

Long Lost (LOST)
 

Overview

Max Total Supply

10,000 LOST

Holders

3,883

Market

Volume (24H)

0.1079 ETH

Min Price (24H)

$77.89 @ 0.025000 ETH

Max Price (24H)

$155.77 @ 0.050000 ETH
Filtered by Token Holder
snocras.eth
Balance
1 LOST
0x53b3e177e55db94a896ab7a2cf61887160b0b319
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Long Lost is a 10,000 piece genesis collection from the '5th Dimension Collective.'

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
LongLost

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-02-05
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts v4.4.1 (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 = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}

// File: @openzeppelin/contracts/utils/Counters.sol


// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts 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 v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

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

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

        emit Transfer(address(0), to, tokenId);
    }

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: LongLostFunction.sol



pragma solidity >=0.7.0 <0.9.0;


contract LongLost is ERC721, Ownable {

    using Strings for uint256;
    using Counters for Counters.Counter;

    Counters.Counter private supply;

    string public uriPrefix = "";
    string public uriSuffix = ".json";
    string public hiddenMetadataUri;

    uint256 public cost = 0.04 ether;
    uint256 public maxSupply = 10000;
    uint256 public maxMintAmountPerTx = 10;

    uint8 public publicMintAmount = 20;
    uint8 public allowListMintAmount = 5;

    bool public paused = true;
    bool public isAllowListActive = true;
    bool public revealed = false;

    bytes32 public whitelistMerkleRoot = 0x0758ddc53129da410a7d4536b32e8f2f00e4edf3568e11b199fdc384d06a55d3;

    mapping(address => uint8) private _mintAllowList;
    mapping(address => uint8) private _mintPublicList;


    
    

    constructor() ERC721("Long Lost", "LOST") {
        setHiddenMetadataUri("ipfs://QmZeF9ef2XnK2iiYC2grQ8W8xTMaUchofPEmn1FF1EryNn/hidden.json");
    }

    // -- compliance checks for tx -- 
    //Checks and records # of mints per wallet address for public. 
    function setMintList(uint8 _mintAmount) internal {


        if(!isAllowListActive) {
            require(_mintPublicList[msg.sender] + _mintAmount <= publicMintAmount);
            _mintPublicList[msg.sender] = _mintPublicList[msg.sender] + _mintAmount;
        }

        if(isAllowListActive) {
            require(_mintAllowList[msg.sender] + _mintAmount <= allowListMintAmount);
            _mintAllowList[msg.sender] = _mintAllowList[msg.sender] + _mintAmount;
        }
    }


    //supply limit / tx checks
    modifier mintCompliance(uint256 _mintAmount) {
        require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Invalid mint amount!");
        require(supply.current() + _mintAmount <= maxSupply, "Max supply exceeded!");
        _;
    }

    //supply check
    function totalSupply() public view returns (uint256) {
        return supply.current();
    }

    //Contract enablement functions
    function setIsAllowListActive(bool _isAllowListActive) external onlyOwner {
        isAllowListActive = _isAllowListActive;
    }

    function setPaused(bool _state) public onlyOwner {
        paused = _state;
    }
    
    //check minting amounts. Doubles as access check
    function remainingAllowListMints(address userAddress) public view returns (uint256) {
            return allowListMintAmount - _mintAllowList[userAddress];
    }
    

    function remainingPublicMints(address userAddress) public view returns (uint256) { 
            return publicMintAmount - _mintPublicList[userAddress];
    }

    //merkletree 
    function _verify(bytes32 leaf, bytes32[] memory proof) internal view returns (bool) {
        return MerkleProof.verify(proof, whitelistMerkleRoot, leaf);
    }

    function _leaf(address account) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(account));
    }

    function setWhitelistMerkleRoot(bytes32 _whitelistMerkleRoot) external onlyOwner {
        whitelistMerkleRoot = _whitelistMerkleRoot;
    }

    
    //public mint function
    function mint(uint8 _mintAmount) public payable mintCompliance(_mintAmount) {
        require(!paused, "The contract is paused!");
        require(!isAllowListActive, "Whitelist is still active");

        require(msg.value >= cost * _mintAmount, "Insufficient funds!");

        setMintList(_mintAmount); //compliance check for public minting limits - check minting # per wallet. 
        _mintLoop(msg.sender, _mintAmount);
    }

    //allowlist mint function
    function mintAllowList(uint8 _mintAmount, bytes32[] calldata proof) public payable mintCompliance(_mintAmount) {
        require(!paused, "The contract is paused"); 
        require(isAllowListActive, "Whitelist is paused");
        
        require(_mintAmount <= allowListMintAmount); 
        require(msg.value >= cost * _mintAmount, "Insufficient funds!");
        require(_verify(_leaf(msg.sender), proof), "Invalid proof");

        
        setMintList(_mintAmount);
        _mintLoop(msg.sender, _mintAmount);
    }

    //freemint function
    function mintForAddress(uint8 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner {
        _mintLoop(_receiver, _mintAmount);
    }

    //safemint function
    function _mintLoop(address _receiver, uint256 _mintAmount) internal {
        for (uint256 i = 0; i < _mintAmount; i++) {
            supply.increment();
            _safeMint(_receiver, supply.current());
        }
    }

    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
        {
            uint256 ownerTokenCount = balanceOf(_owner);
            uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
            uint256 currentTokenId = 1;
            uint256 ownedTokenIndex = 0;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
        address currentTokenOwner = ownerOf(currentTokenId);

            if (currentTokenOwner == _owner) {
            ownedTokenIds[ownedTokenIndex] = currentTokenId;

            ownedTokenIndex++;
            }

        currentTokenId++;
    }

        return ownedTokenIds;
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
    require(
        _exists(_tokenId),
        "ERC721Metadata: URI query for nonexistent token"
    );

    if (revealed == false) {
        return hiddenMetadataUri;
    }

    string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0
            ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix))
            : "";
    }

    function setRevealed(bool _state) public onlyOwner {
        revealed = _state;
    }

    function setCost(uint256 _cost) public onlyOwner {
        cost = _cost;
    }


    function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
        hiddenMetadataUri = _hiddenMetadataUri;
    }

    function setUriPrefix(string memory _uriPrefix) public onlyOwner {
        uriPrefix = _uriPrefix;
    }

    function setUriSuffix(string memory _uriSuffix) public onlyOwner {
        uriSuffix = _uriSuffix;
    }

    

    function withdraw() public onlyOwner {
        
        //50% goes to community wallet
        (bool hs, ) = payable(0x086C47A4E99cd41aF68166Fba0ad163546AAA50e).call{value: address(this).balance * 50 / 100}("");
        require(hs);
        //rest to team wallet
        (bool os, ) = payable(owner()).call{value: address(this).balance}("");
        require(os);

    }

    

    function _baseURI() internal view virtual override returns (string memory) {
        return uriPrefix;
    }
}

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":[],"name":"allowListMintAmount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAllowListActive","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":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintAmount","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintAmount","type":"uint8"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintAllowList","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintAmount","type":"uint8"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintAmount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"remainingAllowListMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"remainingPublicMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isAllowListActive","type":"bool"}],"name":"setIsAllowListActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_whitelistMerkleRoot","type":"bytes32"}],"name":"setWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040819052600060808190526200001b916008916200021f565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200004a916009916200021f565b50668e1bc9bf040000600b55612710600c55600a600d55600e805464ffffffffff191663010105141790557f0758ddc53129da410a7d4536b32e8f2f00e4edf3568e11b199fdc384d06a55d3600f55348015620000a657600080fd5b506040805180820182526009815268131bdb99c8131bdcdd60ba1b6020808301918252835180850190945260048452631313d4d560e21b908401528151919291620000f4916000916200021f565b5080516200010a9060019060208401906200021f565b50505062000127620001216200015160201b60201c565b62000155565b6200014b60405180608001604052806041815260200162002db460419139620001a7565b62000302565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6006546001600160a01b03163314620002065760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b80516200021b90600a9060208401906200021f565b5050565b8280546200022d90620002c5565b90600052602060002090601f0160209004810192826200025157600085556200029c565b82601f106200026c57805160ff19168380011785556200029c565b828001600101855582156200029c579182015b828111156200029c5782518255916020019190600101906200027f565b50620002aa929150620002ae565b5090565b5b80821115620002aa5760008155600101620002af565b600181811c90821680620002da57607f821691505b60208210811415620002fc57634e487b7160e01b600052602260045260246000fd5b50919050565b612aa280620003126000396000f3fe6080604052600436106102675760003560e01c806362b99ad411610144578063a45ba8e7116100b6578063bd32fb661161007a578063bd32fb66146106ff578063c87b56dd1461071f578063d5abeb011461073f578063e0a8085314610755578063e985e9c514610775578063f2fde38b146107be57600080fd5b8063a45ba8e714610669578063aa98e0c61461067e578063ae3c778d14610694578063b88d4fde146106c0578063bab44225146106e057600080fd5b8063718bc4af11610108578063718bc4af146105c05780637ec4a659146105e05780638da5cb5b1461060057806394354fd01461061e57806395d89b4114610634578063a22cb4651461064957600080fd5b806362b99ad4146105435780636352211e146105585780636ecd23061461057857806370a082311461058b578063715018a6146105ab57600080fd5b806330691a1f116101dd57806344a0d68a116101a157806344a0d68a146104995780634fdd43cb146104b957806351830227146104d95780635503a0e8146104fb5780635c975abb14610510578063600996911461053057600080fd5b806330691a1f146103f75780633255064a146104175780633ccfd60b1461043757806342842e0e1461044c578063438b63001461046c57600080fd5b806316ba10e01161022f57806316ba10e01461034157806316c38b3c1461036157806318160ddd1461038157806323b872dd14610396578063277e52a3146103b657806329fc6bae146103d657600080fd5b806301ffc9a71461026c57806306fdde03146102a1578063081812fc146102c3578063095ea7b3146102fb57806313faede61461031d575b600080fd5b34801561027857600080fd5b5061028c6102873660046124c6565b6107de565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b506102b6610830565b6040516102989190612777565b3480156102cf57600080fd5b506102e36102de3660046124ad565b6108c2565b6040516001600160a01b039091168152602001610298565b34801561030757600080fd5b5061031b610316366004612468565b61095c565b005b34801561032957600080fd5b50610333600b5481565b604051908152602001610298565b34801561034d57600080fd5b5061031b61035c366004612500565b610a72565b34801561036d57600080fd5b5061031b61037c366004612492565b610ab3565b34801561038d57600080fd5b50610333610af9565b3480156103a257600080fd5b5061031b6103b1366004612386565b610b09565b3480156103c257600080fd5b506103336103d1366004612338565b610b3a565b3480156103e257600080fd5b50600e5461028c906301000000900460ff1681565b34801561040357600080fd5b50610333610412366004612338565b610b6f565b34801561042357600080fd5b5061031b610432366004612564565b610ba0565b34801561044357600080fd5b5061031b610c3e565b34801561045857600080fd5b5061031b610467366004612386565b610d56565b34801561047857600080fd5b5061048c610487366004612338565b610d71565b6040516102989190612733565b3480156104a557600080fd5b5061031b6104b43660046124ad565b610e52565b3480156104c557600080fd5b5061031b6104d4366004612500565b610e81565b3480156104e557600080fd5b50600e5461028c90640100000000900460ff1681565b34801561050757600080fd5b506102b6610ebe565b34801561051c57600080fd5b50600e5461028c9062010000900460ff1681565b61031b61053e366004612580565b610f4c565b34801561054f57600080fd5b506102b6611191565b34801561056457600080fd5b506102e36105733660046124ad565b61119e565b61031b610586366004612549565b611215565b34801561059757600080fd5b506103336105a6366004612338565b61139b565b3480156105b757600080fd5b5061031b611422565b3480156105cc57600080fd5b5061031b6105db366004612492565b611458565b3480156105ec57600080fd5b5061031b6105fb366004612500565b6114a0565b34801561060c57600080fd5b506006546001600160a01b03166102e3565b34801561062a57600080fd5b50610333600d5481565b34801561064057600080fd5b506102b66114dd565b34801561065557600080fd5b5061031b61066436600461243e565b6114ec565b34801561067557600080fd5b506102b66114f7565b34801561068a57600080fd5b50610333600f5481565b3480156106a057600080fd5b50600e546106ae9060ff1681565b60405160ff9091168152602001610298565b3480156106cc57600080fd5b5061031b6106db3660046123c2565b611504565b3480156106ec57600080fd5b50600e546106ae90610100900460ff1681565b34801561070b57600080fd5b5061031b61071a3660046124ad565b611536565b34801561072b57600080fd5b506102b661073a3660046124ad565b611565565b34801561074b57600080fd5b50610333600c5481565b34801561076157600080fd5b5061031b610770366004612492565b6116e7565b34801561078157600080fd5b5061028c610790366004612353565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107ca57600080fd5b5061031b6107d9366004612338565b611731565b60006001600160e01b031982166380ac58cd60e01b148061080f57506001600160e01b03198216635b5e139f60e01b145b8061082a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461083f90612994565b80601f016020809104026020016040519081016040528092919081815260200182805461086b90612994565b80156108b85780601f1061088d576101008083540402835291602001916108b8565b820191906000526020600020905b81548152906001019060200180831161089b57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109405760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006109678261119e565b9050806001600160a01b0316836001600160a01b031614156109d55760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610937565b336001600160a01b03821614806109f157506109f18133610790565b610a635760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610937565b610a6d83836117cc565b505050565b6006546001600160a01b03163314610a9c5760405162461bcd60e51b81526004016109379061280a565b8051610aaf9060099060208401906121ec565b5050565b6006546001600160a01b03163314610add5760405162461bcd60e51b81526004016109379061280a565b600e8054911515620100000262ff000019909216919091179055565b6000610b0460075490565b905090565b610b13338261183a565b610b2f5760405162461bcd60e51b81526004016109379061286d565b610a6d838383611931565b6001600160a01b038116600090815260116020526040812054600e54610b669160ff9081169116612945565b60ff1692915050565b6001600160a01b038116600090815260106020526040812054600e54610b669160ff90811691610100900416612945565b8160ff16600081118015610bb65750600d548111155b610bd25760405162461bcd60e51b8152600401610937906127dc565b600c5481610bdf60075490565b610be991906128be565b1115610c075760405162461bcd60e51b81526004016109379061283f565b6006546001600160a01b03163314610c315760405162461bcd60e51b81526004016109379061280a565b610a6d828460ff16611ad1565b6006546001600160a01b03163314610c685760405162461bcd60e51b81526004016109379061280a565b600073086c47a4e99cd41af68166fba0ad163546aaa50e6064610c8c47603261290f565b610c9691906128fb565b604051600081818185875af1925050503d8060008114610cd2576040519150601f19603f3d011682016040523d82523d6000602084013e610cd7565b606091505b5050905080610ce557600080fd5b6000610cf96006546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610d43576040519150601f19603f3d011682016040523d82523d6000602084013e610d48565b606091505b5050905080610aaf57600080fd5b610a6d83838360405180602001604052806000815250611504565b60606000610d7e8361139b565b905060008167ffffffffffffffff811115610d9b57610d9b612a40565b604051908082528060200260200182016040528015610dc4578160200160208202803683370190505b509050600160005b8381108015610ddd5750600c548211155b15610e48576000610ded8361119e565b9050866001600160a01b0316816001600160a01b03161415610e355782848381518110610e1c57610e1c612a2a565b602090810291909101015281610e31816129cf565b9250505b82610e3f816129cf565b93505050610dcc565b5090949350505050565b6006546001600160a01b03163314610e7c5760405162461bcd60e51b81526004016109379061280a565b600b55565b6006546001600160a01b03163314610eab5760405162461bcd60e51b81526004016109379061280a565b8051610aaf90600a9060208401906121ec565b60098054610ecb90612994565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef790612994565b8015610f445780601f10610f1957610100808354040283529160200191610f44565b820191906000526020600020905b815481529060010190602001808311610f2757829003601f168201915b505050505081565b8260ff16600081118015610f625750600d548111155b610f7e5760405162461bcd60e51b8152600401610937906127dc565b600c5481610f8b60075490565b610f9591906128be565b1115610fb35760405162461bcd60e51b81526004016109379061283f565b600e5462010000900460ff16156110055760405162461bcd60e51b8152602060048201526016602482015275151a194818dbdb9d1c9858dd081a5cc81c185d5cd95960521b6044820152606401610937565b600e546301000000900460ff166110545760405162461bcd60e51b815260206004820152601360248201527215da1a5d195b1a5cdd081a5cc81c185d5cd959606a1b6044820152606401610937565b600e5460ff6101009091048116908516111561106f57600080fd5b8360ff16600b54611080919061290f565b3410156110c55760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610937565b604080513360601b6bffffffffffffffffffffffff1916602080830191909152825160148184030181526034909201909252805191012061113990848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611b0e92505050565b6111755760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610937565b61117e84611b1d565b61118b338560ff16611ad1565b50505050565b60088054610ecb90612994565b6000818152600260205260408120546001600160a01b03168061082a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610937565b8060ff1660008111801561122b5750600d548111155b6112475760405162461bcd60e51b8152600401610937906127dc565b600c548161125460075490565b61125e91906128be565b111561127c5760405162461bcd60e51b81526004016109379061283f565b600e5462010000900460ff16156112d55760405162461bcd60e51b815260206004820152601760248201527f54686520636f6e747261637420697320706175736564210000000000000000006044820152606401610937565b600e546301000000900460ff161561132f5760405162461bcd60e51b815260206004820152601960248201527f57686974656c697374206973207374696c6c20616374697665000000000000006044820152606401610937565b8160ff16600b54611340919061290f565b3410156113855760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610937565b61138e82611b1d565b610aaf338360ff16611ad1565b60006001600160a01b0382166114065760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610937565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b0316331461144c5760405162461bcd60e51b81526004016109379061280a565b6114566000611c2d565b565b6006546001600160a01b031633146114825760405162461bcd60e51b81526004016109379061280a565b600e805491151563010000000263ff00000019909216919091179055565b6006546001600160a01b031633146114ca5760405162461bcd60e51b81526004016109379061280a565b8051610aaf9060089060208401906121ec565b60606001805461083f90612994565b610aaf338383611c7f565b600a8054610ecb90612994565b61150e338361183a565b61152a5760405162461bcd60e51b81526004016109379061286d565b61118b84848484611d4e565b6006546001600160a01b031633146115605760405162461bcd60e51b81526004016109379061280a565b600f55565b6000818152600260205260409020546060906001600160a01b03166115e45760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610937565b600e54640100000000900460ff1661168857600a805461160390612994565b80601f016020809104026020016040519081016040528092919081815260200182805461162f90612994565b801561167c5780601f106116515761010080835404028352916020019161167c565b820191906000526020600020905b81548152906001019060200180831161165f57829003601f168201915b50505050509050919050565b6000611692611d81565b905060008151116116b257604051806020016040528060008152506116e0565b806116bc84611d90565b60096040516020016116d093929190612632565b6040516020818303038152906040525b9392505050565b6006546001600160a01b031633146117115760405162461bcd60e51b81526004016109379061280a565b600e80549115156401000000000264ff0000000019909216919091179055565b6006546001600160a01b0316331461175b5760405162461bcd60e51b81526004016109379061280a565b6001600160a01b0381166117c05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610937565b6117c981611c2d565b50565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906118018261119e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166118b35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610937565b60006118be8361119e565b9050806001600160a01b0316846001600160a01b031614806118f95750836001600160a01b03166118ee846108c2565b6001600160a01b0316145b8061192957506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166119448261119e565b6001600160a01b0316146119ac5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610937565b6001600160a01b038216611a0e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610937565b611a196000826117cc565b6001600160a01b0383166000908152600360205260408120805460019290611a4290849061292e565b90915550506001600160a01b0382166000908152600360205260408120805460019290611a709084906128be565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60005b81811015610a6d57611aea600780546001019055565b611afc83611af760075490565b611e8e565b80611b06816129cf565b915050611ad4565b60006116e082600f5485611ea8565b600e546301000000900460ff16611ba157600e543360009081526011602052604090205460ff91821691611b53918491166128d6565b60ff161115611b6157600080fd5b33600090815260116020526040902054611b7f90829060ff166128d6565b336000908152601160205260409020805460ff191660ff929092169190911790555b600e546301000000900460ff16156117c957600e543360009081526010602052604090205460ff610100909204821691611bdd918491166128d6565b60ff161115611beb57600080fd5b33600090815260106020526040902054611c0990829060ff166128d6565b336000908152601060205260409020805460ff191660ff9290921691909117905550565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611ce15760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610937565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611d59848484611931565b611d6584848484611ebe565b61118b5760405162461bcd60e51b81526004016109379061278a565b60606008805461083f90612994565b606081611db45750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611dde5780611dc8816129cf565b9150611dd79050600a836128fb565b9150611db8565b60008167ffffffffffffffff811115611df957611df9612a40565b6040519080825280601f01601f191660200182016040528015611e23576020820181803683370190505b5090505b841561192957611e3860018361292e565b9150611e45600a866129ea565b611e509060306128be565b60f81b818381518110611e6557611e65612a2a565b60200101906001600160f81b031916908160001a905350611e87600a866128fb565b9450611e27565b610aaf828260405180602001604052806000815250611fcb565b600082611eb58584611ffe565b14949350505050565b60006001600160a01b0384163b15611fc057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611f029033908990889088906004016126f6565b602060405180830381600087803b158015611f1c57600080fd5b505af1925050508015611f4c575060408051601f3d908101601f19168201909252611f49918101906124e3565b60015b611fa6573d808015611f7a576040519150601f19603f3d011682016040523d82523d6000602084013e611f7f565b606091505b508051611f9e5760405162461bcd60e51b81526004016109379061278a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611929565b506001949350505050565b611fd583836120aa565b611fe26000848484611ebe565b610a6d5760405162461bcd60e51b81526004016109379061278a565b600081815b84518110156120a257600085828151811061202057612020612a2a565b6020026020010151905080831161206257604080516020810185905290810182905260600160405160208183030381529060405280519060200120925061208f565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061209a816129cf565b915050612003565b509392505050565b6001600160a01b0382166121005760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610937565b6000818152600260205260409020546001600160a01b0316156121655760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610937565b6001600160a01b038216600090815260036020526040812080546001929061218e9084906128be565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546121f890612994565b90600052602060002090601f01602090048101928261221a5760008555612260565b82601f1061223357805160ff1916838001178555612260565b82800160010185558215612260579182015b82811115612260578251825591602001919060010190612245565b5061226c929150612270565b5090565b5b8082111561226c5760008155600101612271565b600067ffffffffffffffff808411156122a0576122a0612a40565b604051601f8501601f19908116603f011681019082821181831017156122c8576122c8612a40565b816040528093508581528686860111156122e157600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461231257600080fd5b919050565b8035801515811461231257600080fd5b803560ff8116811461231257600080fd5b60006020828403121561234a57600080fd5b6116e0826122fb565b6000806040838503121561236657600080fd5b61236f836122fb565b915061237d602084016122fb565b90509250929050565b60008060006060848603121561239b57600080fd5b6123a4846122fb565b92506123b2602085016122fb565b9150604084013590509250925092565b600080600080608085870312156123d857600080fd5b6123e1856122fb565b93506123ef602086016122fb565b925060408501359150606085013567ffffffffffffffff81111561241257600080fd5b8501601f8101871361242357600080fd5b61243287823560208401612285565b91505092959194509250565b6000806040838503121561245157600080fd5b61245a836122fb565b915061237d60208401612317565b6000806040838503121561247b57600080fd5b612484836122fb565b946020939093013593505050565b6000602082840312156124a457600080fd5b6116e082612317565b6000602082840312156124bf57600080fd5b5035919050565b6000602082840312156124d857600080fd5b81356116e081612a56565b6000602082840312156124f557600080fd5b81516116e081612a56565b60006020828403121561251257600080fd5b813567ffffffffffffffff81111561252957600080fd5b8201601f8101841361253a57600080fd5b61192984823560208401612285565b60006020828403121561255b57600080fd5b6116e082612327565b6000806040838503121561257757600080fd5b61236f83612327565b60008060006040848603121561259557600080fd5b61259e84612327565b9250602084013567ffffffffffffffff808211156125bb57600080fd5b818601915086601f8301126125cf57600080fd5b8135818111156125de57600080fd5b8760208260051b85010111156125f357600080fd5b6020830194508093505050509250925092565b6000815180845261261e816020860160208601612968565b601f01601f19169290920160200192915050565b6000845160206126458285838a01612968565b8551918401916126588184848a01612968565b8554920191600090600181811c908083168061267557607f831692505b85831081141561269357634e487b7160e01b85526022600452602485fd5b8080156126a757600181146126b8576126e5565b60ff198516885283880195506126e5565b60008b81526020902060005b858110156126dd5781548a8201529084019088016126c4565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061272990830184612606565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561276b5783518352928401929184019160010161274f565b50909695505050505050565b6020815260006116e06020830184612606565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b602080825260149082015273496e76616c6964206d696e7420616d6f756e742160601b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601490820152734d617820737570706c792065786365656465642160601b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156128d1576128d16129fe565b500190565b600060ff821660ff84168060ff038211156128f3576128f36129fe565b019392505050565b60008261290a5761290a612a14565b500490565b6000816000190483118215151615612929576129296129fe565b500290565b600082821015612940576129406129fe565b500390565b600060ff821660ff84168082101561295f5761295f6129fe565b90039392505050565b60005b8381101561298357818101518382015260200161296b565b8381111561118b5750506000910152565b600181811c908216806129a857607f821691505b602082108114156129c957634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156129e3576129e36129fe565b5060010190565b6000826129f9576129f9612a14565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146117c957600080fdfea26469706673582212209dc71ca0a9fcf74ddaa23420dc02b745827901c2e54d9d77c67cb54db152b74164736f6c63430008070033697066733a2f2f516d5a654639656632586e4b32696959433267725138573878544d615563686f6650456d6e314646314572794e6e2f68696464656e2e6a736f6e

Deployed Bytecode

0x6080604052600436106102675760003560e01c806362b99ad411610144578063a45ba8e7116100b6578063bd32fb661161007a578063bd32fb66146106ff578063c87b56dd1461071f578063d5abeb011461073f578063e0a8085314610755578063e985e9c514610775578063f2fde38b146107be57600080fd5b8063a45ba8e714610669578063aa98e0c61461067e578063ae3c778d14610694578063b88d4fde146106c0578063bab44225146106e057600080fd5b8063718bc4af11610108578063718bc4af146105c05780637ec4a659146105e05780638da5cb5b1461060057806394354fd01461061e57806395d89b4114610634578063a22cb4651461064957600080fd5b806362b99ad4146105435780636352211e146105585780636ecd23061461057857806370a082311461058b578063715018a6146105ab57600080fd5b806330691a1f116101dd57806344a0d68a116101a157806344a0d68a146104995780634fdd43cb146104b957806351830227146104d95780635503a0e8146104fb5780635c975abb14610510578063600996911461053057600080fd5b806330691a1f146103f75780633255064a146104175780633ccfd60b1461043757806342842e0e1461044c578063438b63001461046c57600080fd5b806316ba10e01161022f57806316ba10e01461034157806316c38b3c1461036157806318160ddd1461038157806323b872dd14610396578063277e52a3146103b657806329fc6bae146103d657600080fd5b806301ffc9a71461026c57806306fdde03146102a1578063081812fc146102c3578063095ea7b3146102fb57806313faede61461031d575b600080fd5b34801561027857600080fd5b5061028c6102873660046124c6565b6107de565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b506102b6610830565b6040516102989190612777565b3480156102cf57600080fd5b506102e36102de3660046124ad565b6108c2565b6040516001600160a01b039091168152602001610298565b34801561030757600080fd5b5061031b610316366004612468565b61095c565b005b34801561032957600080fd5b50610333600b5481565b604051908152602001610298565b34801561034d57600080fd5b5061031b61035c366004612500565b610a72565b34801561036d57600080fd5b5061031b61037c366004612492565b610ab3565b34801561038d57600080fd5b50610333610af9565b3480156103a257600080fd5b5061031b6103b1366004612386565b610b09565b3480156103c257600080fd5b506103336103d1366004612338565b610b3a565b3480156103e257600080fd5b50600e5461028c906301000000900460ff1681565b34801561040357600080fd5b50610333610412366004612338565b610b6f565b34801561042357600080fd5b5061031b610432366004612564565b610ba0565b34801561044357600080fd5b5061031b610c3e565b34801561045857600080fd5b5061031b610467366004612386565b610d56565b34801561047857600080fd5b5061048c610487366004612338565b610d71565b6040516102989190612733565b3480156104a557600080fd5b5061031b6104b43660046124ad565b610e52565b3480156104c557600080fd5b5061031b6104d4366004612500565b610e81565b3480156104e557600080fd5b50600e5461028c90640100000000900460ff1681565b34801561050757600080fd5b506102b6610ebe565b34801561051c57600080fd5b50600e5461028c9062010000900460ff1681565b61031b61053e366004612580565b610f4c565b34801561054f57600080fd5b506102b6611191565b34801561056457600080fd5b506102e36105733660046124ad565b61119e565b61031b610586366004612549565b611215565b34801561059757600080fd5b506103336105a6366004612338565b61139b565b3480156105b757600080fd5b5061031b611422565b3480156105cc57600080fd5b5061031b6105db366004612492565b611458565b3480156105ec57600080fd5b5061031b6105fb366004612500565b6114a0565b34801561060c57600080fd5b506006546001600160a01b03166102e3565b34801561062a57600080fd5b50610333600d5481565b34801561064057600080fd5b506102b66114dd565b34801561065557600080fd5b5061031b61066436600461243e565b6114ec565b34801561067557600080fd5b506102b66114f7565b34801561068a57600080fd5b50610333600f5481565b3480156106a057600080fd5b50600e546106ae9060ff1681565b60405160ff9091168152602001610298565b3480156106cc57600080fd5b5061031b6106db3660046123c2565b611504565b3480156106ec57600080fd5b50600e546106ae90610100900460ff1681565b34801561070b57600080fd5b5061031b61071a3660046124ad565b611536565b34801561072b57600080fd5b506102b661073a3660046124ad565b611565565b34801561074b57600080fd5b50610333600c5481565b34801561076157600080fd5b5061031b610770366004612492565b6116e7565b34801561078157600080fd5b5061028c610790366004612353565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107ca57600080fd5b5061031b6107d9366004612338565b611731565b60006001600160e01b031982166380ac58cd60e01b148061080f57506001600160e01b03198216635b5e139f60e01b145b8061082a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461083f90612994565b80601f016020809104026020016040519081016040528092919081815260200182805461086b90612994565b80156108b85780601f1061088d576101008083540402835291602001916108b8565b820191906000526020600020905b81548152906001019060200180831161089b57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109405760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006109678261119e565b9050806001600160a01b0316836001600160a01b031614156109d55760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610937565b336001600160a01b03821614806109f157506109f18133610790565b610a635760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610937565b610a6d83836117cc565b505050565b6006546001600160a01b03163314610a9c5760405162461bcd60e51b81526004016109379061280a565b8051610aaf9060099060208401906121ec565b5050565b6006546001600160a01b03163314610add5760405162461bcd60e51b81526004016109379061280a565b600e8054911515620100000262ff000019909216919091179055565b6000610b0460075490565b905090565b610b13338261183a565b610b2f5760405162461bcd60e51b81526004016109379061286d565b610a6d838383611931565b6001600160a01b038116600090815260116020526040812054600e54610b669160ff9081169116612945565b60ff1692915050565b6001600160a01b038116600090815260106020526040812054600e54610b669160ff90811691610100900416612945565b8160ff16600081118015610bb65750600d548111155b610bd25760405162461bcd60e51b8152600401610937906127dc565b600c5481610bdf60075490565b610be991906128be565b1115610c075760405162461bcd60e51b81526004016109379061283f565b6006546001600160a01b03163314610c315760405162461bcd60e51b81526004016109379061280a565b610a6d828460ff16611ad1565b6006546001600160a01b03163314610c685760405162461bcd60e51b81526004016109379061280a565b600073086c47a4e99cd41af68166fba0ad163546aaa50e6064610c8c47603261290f565b610c9691906128fb565b604051600081818185875af1925050503d8060008114610cd2576040519150601f19603f3d011682016040523d82523d6000602084013e610cd7565b606091505b5050905080610ce557600080fd5b6000610cf96006546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610d43576040519150601f19603f3d011682016040523d82523d6000602084013e610d48565b606091505b5050905080610aaf57600080fd5b610a6d83838360405180602001604052806000815250611504565b60606000610d7e8361139b565b905060008167ffffffffffffffff811115610d9b57610d9b612a40565b604051908082528060200260200182016040528015610dc4578160200160208202803683370190505b509050600160005b8381108015610ddd5750600c548211155b15610e48576000610ded8361119e565b9050866001600160a01b0316816001600160a01b03161415610e355782848381518110610e1c57610e1c612a2a565b602090810291909101015281610e31816129cf565b9250505b82610e3f816129cf565b93505050610dcc565b5090949350505050565b6006546001600160a01b03163314610e7c5760405162461bcd60e51b81526004016109379061280a565b600b55565b6006546001600160a01b03163314610eab5760405162461bcd60e51b81526004016109379061280a565b8051610aaf90600a9060208401906121ec565b60098054610ecb90612994565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef790612994565b8015610f445780601f10610f1957610100808354040283529160200191610f44565b820191906000526020600020905b815481529060010190602001808311610f2757829003601f168201915b505050505081565b8260ff16600081118015610f625750600d548111155b610f7e5760405162461bcd60e51b8152600401610937906127dc565b600c5481610f8b60075490565b610f9591906128be565b1115610fb35760405162461bcd60e51b81526004016109379061283f565b600e5462010000900460ff16156110055760405162461bcd60e51b8152602060048201526016602482015275151a194818dbdb9d1c9858dd081a5cc81c185d5cd95960521b6044820152606401610937565b600e546301000000900460ff166110545760405162461bcd60e51b815260206004820152601360248201527215da1a5d195b1a5cdd081a5cc81c185d5cd959606a1b6044820152606401610937565b600e5460ff6101009091048116908516111561106f57600080fd5b8360ff16600b54611080919061290f565b3410156110c55760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610937565b604080513360601b6bffffffffffffffffffffffff1916602080830191909152825160148184030181526034909201909252805191012061113990848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611b0e92505050565b6111755760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610937565b61117e84611b1d565b61118b338560ff16611ad1565b50505050565b60088054610ecb90612994565b6000818152600260205260408120546001600160a01b03168061082a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610937565b8060ff1660008111801561122b5750600d548111155b6112475760405162461bcd60e51b8152600401610937906127dc565b600c548161125460075490565b61125e91906128be565b111561127c5760405162461bcd60e51b81526004016109379061283f565b600e5462010000900460ff16156112d55760405162461bcd60e51b815260206004820152601760248201527f54686520636f6e747261637420697320706175736564210000000000000000006044820152606401610937565b600e546301000000900460ff161561132f5760405162461bcd60e51b815260206004820152601960248201527f57686974656c697374206973207374696c6c20616374697665000000000000006044820152606401610937565b8160ff16600b54611340919061290f565b3410156113855760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610937565b61138e82611b1d565b610aaf338360ff16611ad1565b60006001600160a01b0382166114065760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610937565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b0316331461144c5760405162461bcd60e51b81526004016109379061280a565b6114566000611c2d565b565b6006546001600160a01b031633146114825760405162461bcd60e51b81526004016109379061280a565b600e805491151563010000000263ff00000019909216919091179055565b6006546001600160a01b031633146114ca5760405162461bcd60e51b81526004016109379061280a565b8051610aaf9060089060208401906121ec565b60606001805461083f90612994565b610aaf338383611c7f565b600a8054610ecb90612994565b61150e338361183a565b61152a5760405162461bcd60e51b81526004016109379061286d565b61118b84848484611d4e565b6006546001600160a01b031633146115605760405162461bcd60e51b81526004016109379061280a565b600f55565b6000818152600260205260409020546060906001600160a01b03166115e45760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610937565b600e54640100000000900460ff1661168857600a805461160390612994565b80601f016020809104026020016040519081016040528092919081815260200182805461162f90612994565b801561167c5780601f106116515761010080835404028352916020019161167c565b820191906000526020600020905b81548152906001019060200180831161165f57829003601f168201915b50505050509050919050565b6000611692611d81565b905060008151116116b257604051806020016040528060008152506116e0565b806116bc84611d90565b60096040516020016116d093929190612632565b6040516020818303038152906040525b9392505050565b6006546001600160a01b031633146117115760405162461bcd60e51b81526004016109379061280a565b600e80549115156401000000000264ff0000000019909216919091179055565b6006546001600160a01b0316331461175b5760405162461bcd60e51b81526004016109379061280a565b6001600160a01b0381166117c05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610937565b6117c981611c2d565b50565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906118018261119e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166118b35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610937565b60006118be8361119e565b9050806001600160a01b0316846001600160a01b031614806118f95750836001600160a01b03166118ee846108c2565b6001600160a01b0316145b8061192957506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166119448261119e565b6001600160a01b0316146119ac5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610937565b6001600160a01b038216611a0e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610937565b611a196000826117cc565b6001600160a01b0383166000908152600360205260408120805460019290611a4290849061292e565b90915550506001600160a01b0382166000908152600360205260408120805460019290611a709084906128be565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60005b81811015610a6d57611aea600780546001019055565b611afc83611af760075490565b611e8e565b80611b06816129cf565b915050611ad4565b60006116e082600f5485611ea8565b600e546301000000900460ff16611ba157600e543360009081526011602052604090205460ff91821691611b53918491166128d6565b60ff161115611b6157600080fd5b33600090815260116020526040902054611b7f90829060ff166128d6565b336000908152601160205260409020805460ff191660ff929092169190911790555b600e546301000000900460ff16156117c957600e543360009081526010602052604090205460ff610100909204821691611bdd918491166128d6565b60ff161115611beb57600080fd5b33600090815260106020526040902054611c0990829060ff166128d6565b336000908152601060205260409020805460ff191660ff9290921691909117905550565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611ce15760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610937565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611d59848484611931565b611d6584848484611ebe565b61118b5760405162461bcd60e51b81526004016109379061278a565b60606008805461083f90612994565b606081611db45750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611dde5780611dc8816129cf565b9150611dd79050600a836128fb565b9150611db8565b60008167ffffffffffffffff811115611df957611df9612a40565b6040519080825280601f01601f191660200182016040528015611e23576020820181803683370190505b5090505b841561192957611e3860018361292e565b9150611e45600a866129ea565b611e509060306128be565b60f81b818381518110611e6557611e65612a2a565b60200101906001600160f81b031916908160001a905350611e87600a866128fb565b9450611e27565b610aaf828260405180602001604052806000815250611fcb565b600082611eb58584611ffe565b14949350505050565b60006001600160a01b0384163b15611fc057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611f029033908990889088906004016126f6565b602060405180830381600087803b158015611f1c57600080fd5b505af1925050508015611f4c575060408051601f3d908101601f19168201909252611f49918101906124e3565b60015b611fa6573d808015611f7a576040519150601f19603f3d011682016040523d82523d6000602084013e611f7f565b606091505b508051611f9e5760405162461bcd60e51b81526004016109379061278a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611929565b506001949350505050565b611fd583836120aa565b611fe26000848484611ebe565b610a6d5760405162461bcd60e51b81526004016109379061278a565b600081815b84518110156120a257600085828151811061202057612020612a2a565b6020026020010151905080831161206257604080516020810185905290810182905260600160405160208183030381529060405280519060200120925061208f565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061209a816129cf565b915050612003565b509392505050565b6001600160a01b0382166121005760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610937565b6000818152600260205260409020546001600160a01b0316156121655760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610937565b6001600160a01b038216600090815260036020526040812080546001929061218e9084906128be565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546121f890612994565b90600052602060002090601f01602090048101928261221a5760008555612260565b82601f1061223357805160ff1916838001178555612260565b82800160010185558215612260579182015b82811115612260578251825591602001919060010190612245565b5061226c929150612270565b5090565b5b8082111561226c5760008155600101612271565b600067ffffffffffffffff808411156122a0576122a0612a40565b604051601f8501601f19908116603f011681019082821181831017156122c8576122c8612a40565b816040528093508581528686860111156122e157600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461231257600080fd5b919050565b8035801515811461231257600080fd5b803560ff8116811461231257600080fd5b60006020828403121561234a57600080fd5b6116e0826122fb565b6000806040838503121561236657600080fd5b61236f836122fb565b915061237d602084016122fb565b90509250929050565b60008060006060848603121561239b57600080fd5b6123a4846122fb565b92506123b2602085016122fb565b9150604084013590509250925092565b600080600080608085870312156123d857600080fd5b6123e1856122fb565b93506123ef602086016122fb565b925060408501359150606085013567ffffffffffffffff81111561241257600080fd5b8501601f8101871361242357600080fd5b61243287823560208401612285565b91505092959194509250565b6000806040838503121561245157600080fd5b61245a836122fb565b915061237d60208401612317565b6000806040838503121561247b57600080fd5b612484836122fb565b946020939093013593505050565b6000602082840312156124a457600080fd5b6116e082612317565b6000602082840312156124bf57600080fd5b5035919050565b6000602082840312156124d857600080fd5b81356116e081612a56565b6000602082840312156124f557600080fd5b81516116e081612a56565b60006020828403121561251257600080fd5b813567ffffffffffffffff81111561252957600080fd5b8201601f8101841361253a57600080fd5b61192984823560208401612285565b60006020828403121561255b57600080fd5b6116e082612327565b6000806040838503121561257757600080fd5b61236f83612327565b60008060006040848603121561259557600080fd5b61259e84612327565b9250602084013567ffffffffffffffff808211156125bb57600080fd5b818601915086601f8301126125cf57600080fd5b8135818111156125de57600080fd5b8760208260051b85010111156125f357600080fd5b6020830194508093505050509250925092565b6000815180845261261e816020860160208601612968565b601f01601f19169290920160200192915050565b6000845160206126458285838a01612968565b8551918401916126588184848a01612968565b8554920191600090600181811c908083168061267557607f831692505b85831081141561269357634e487b7160e01b85526022600452602485fd5b8080156126a757600181146126b8576126e5565b60ff198516885283880195506126e5565b60008b81526020902060005b858110156126dd5781548a8201529084019088016126c4565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061272990830184612606565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561276b5783518352928401929184019160010161274f565b50909695505050505050565b6020815260006116e06020830184612606565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b602080825260149082015273496e76616c6964206d696e7420616d6f756e742160601b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601490820152734d617820737570706c792065786365656465642160601b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156128d1576128d16129fe565b500190565b600060ff821660ff84168060ff038211156128f3576128f36129fe565b019392505050565b60008261290a5761290a612a14565b500490565b6000816000190483118215151615612929576129296129fe565b500290565b600082821015612940576129406129fe565b500390565b600060ff821660ff84168082101561295f5761295f6129fe565b90039392505050565b60005b8381101561298357818101518382015260200161296b565b8381111561118b5750506000910152565b600181811c908216806129a857607f821691505b602082108114156129c957634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156129e3576129e36129fe565b5060010190565b6000826129f9576129f9612a14565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146117c957600080fdfea26469706673582212209dc71ca0a9fcf74ddaa23420dc02b745827901c2e54d9d77c67cb54db152b74164736f6c63430008070033

Deployed Bytecode Sourcemap

39922:7011:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27408:305;;;;;;;;;;-1:-1:-1;27408:305:0;;;;;:::i;:::-;;:::i;:::-;;;9777:14:1;;9770:22;9752:41;;9740:2;9725:18;27408:305:0;;;;;;;;28353:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29912:221::-;;;;;;;;;;-1:-1:-1;29912:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8438:32:1;;;8420:51;;8408:2;8393:18;29912:221:0;8274:203:1;29435:411:0;;;;;;;;;;-1:-1:-1;29435:411:0;;;;;:::i;:::-;;:::i;:::-;;40199:32;;;;;;;;;;;;;;;;;;;9950:25:1;;;9938:2;9923:18;40199:32:0;9804:177:1;46304:106:0;;;;;;;;;;-1:-1:-1;46304:106:0;;;;;:::i;:::-;;:::i;42121:83::-;;;;;;;;;;-1:-1:-1;42121:83:0;;;;;:::i;:::-;;:::i;41842:95::-;;;;;;;;;;;;;:::i;30662:339::-;;;;;;;;;;-1:-1:-1;30662:339:0;;;;;:::i;:::-;;:::i;42447:159::-;;;;;;;;;;-1:-1:-1;42447:159:0;;;;;:::i;:::-;;:::i;40442:36::-;;;;;;;;;;-1:-1:-1;40442:36:0;;;;;;;;;;;42270:163;;;;;;;;;;-1:-1:-1;42270:163:0;;;;;:::i;:::-;;:::i;44166:159::-;;;;;;;;;;-1:-1:-1;44166:159:0;;;;;:::i;:::-;;:::i;46426:378::-;;;;;;;;;;;;;:::i;31072:185::-;;;;;;;;;;-1:-1:-1;31072:185:0;;;;;:::i;:::-;;:::i;44592:715::-;;;;;;;;;;-1:-1:-1;44592:715:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;45954:80::-;;;;;;;;;;-1:-1:-1;45954:80:0;;;;;:::i;:::-;;:::i;46044:138::-;;;;;;;;;;-1:-1:-1;46044:138:0;;;;;:::i;:::-;;:::i;40485:28::-;;;;;;;;;;-1:-1:-1;40485:28:0;;;;;;;;;;;40119:33;;;;;;;;;;;;;:::i;40410:25::-;;;;;;;;;;-1:-1:-1;40410:25:0;;;;;;;;;;;43599:534;;;;;;:::i;:::-;;:::i;40084:28::-;;;;;;;;;;;;;:::i;28047:239::-;;;;;;;;;;-1:-1:-1;28047:239:0;;;;;:::i;:::-;;:::i;43121:439::-;;;;;;:::i;:::-;;:::i;27777:208::-;;;;;;;;;;-1:-1:-1;27777:208:0;;;;;:::i;:::-;;:::i;8396:103::-;;;;;;;;;;;;;:::i;41982:131::-;;;;;;;;;;-1:-1:-1;41982:131:0;;;;;:::i;:::-;;:::i;46190:106::-;;;;;;;;;;-1:-1:-1;46190:106:0;;;;;:::i;:::-;;:::i;7745:87::-;;;;;;;;;;-1:-1:-1;7818:6:0;;-1:-1:-1;;;;;7818:6:0;7745:87;;40277:38;;;;;;;;;;;;;;;;28522:104;;;;;;;;;;;;;:::i;30205:155::-;;;;;;;;;;-1:-1:-1;30205:155:0;;;;;:::i;:::-;;:::i;40159:31::-;;;;;;;;;;;;;:::i;40522:103::-;;;;;;;;;;;;;;;;40324:34;;;;;;;;;;-1:-1:-1;40324:34:0;;;;;;;;;;;19739:4:1;19727:17;;;19709:36;;19697:2;19682:18;40324:34:0;19567:184:1;31328:328:0;;;;;;;;;;-1:-1:-1;31328:328:0;;;;;:::i;:::-;;:::i;40365:36::-;;;;;;;;;;-1:-1:-1;40365:36:0;;;;;;;;;;;42937:142;;;;;;;;;;-1:-1:-1;42937:142:0;;;;;:::i;:::-;;:::i;45315:536::-;;;;;;;;;;-1:-1:-1;45315:536:0;;;;;:::i;:::-;;:::i;40238:32::-;;;;;;;;;;;;;;;;45859:87;;;;;;;;;;-1:-1:-1;45859:87:0;;;;;:::i;:::-;;:::i;30431:164::-;;;;;;;;;;-1:-1:-1;30431:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;30552:25:0;;;30528:4;30552:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30431:164;8654:201;;;;;;;;;;-1:-1:-1;8654:201:0;;;;;:::i;:::-;;:::i;27408:305::-;27510:4;-1:-1:-1;;;;;;27547:40:0;;-1:-1:-1;;;27547:40:0;;:105;;-1:-1:-1;;;;;;;27604:48:0;;-1:-1:-1;;;27604:48:0;27547:105;:158;;;-1:-1:-1;;;;;;;;;;20286:40:0;;;27669:36;27527:178;27408:305;-1:-1:-1;;27408:305:0:o;28353:100::-;28407:13;28440:5;28433:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28353:100;:::o;29912:221::-;29988:7;33255:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33255:16:0;30008:73;;;;-1:-1:-1;;;30008:73:0;;15422:2:1;30008:73:0;;;15404:21:1;15461:2;15441:18;;;15434:30;15500:34;15480:18;;;15473:62;-1:-1:-1;;;15551:18:1;;;15544:42;15603:19;;30008:73:0;;;;;;;;;-1:-1:-1;30101:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;30101:24:0;;29912:221::o;29435:411::-;29516:13;29532:23;29547:7;29532:14;:23::i;:::-;29516:39;;29580:5;-1:-1:-1;;;;;29574:11:0;:2;-1:-1:-1;;;;;29574:11:0;;;29566:57;;;;-1:-1:-1;;;29566:57:0;;17374:2:1;29566:57:0;;;17356:21:1;17413:2;17393:18;;;17386:30;17452:34;17432:18;;;17425:62;-1:-1:-1;;;17503:18:1;;;17496:31;17544:19;;29566:57:0;17172:397:1;29566:57:0;6549:10;-1:-1:-1;;;;;29658:21:0;;;;:62;;-1:-1:-1;29683:37:0;29700:5;6549:10;30431:164;:::i;29683:37::-;29636:168;;;;-1:-1:-1;;;29636:168:0;;13815:2:1;29636:168:0;;;13797:21:1;13854:2;13834:18;;;13827:30;13893:34;13873:18;;;13866:62;13964:26;13944:18;;;13937:54;14008:19;;29636:168:0;13613:420:1;29636:168:0;29817:21;29826:2;29830:7;29817:8;:21::i;:::-;29505:341;29435:411;;:::o;46304:106::-;7818:6;;-1:-1:-1;;;;;7818:6:0;6549:10;7965:23;7957:68;;;;-1:-1:-1;;;7957:68:0;;;;;;;:::i;:::-;46380:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;46304:106:::0;:::o;42121:83::-;7818:6;;-1:-1:-1;;;;;7818:6:0;6549:10;7965:23;7957:68;;;;-1:-1:-1;;;7957:68:0;;;;;;;:::i;:::-;42181:6:::1;:15:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;42181:15:0;;::::1;::::0;;;::::1;::::0;;42121:83::o;41842:95::-;41886:7;41913:16;:6;3165:14;;3073:114;41913:16;41906:23;;41842:95;:::o;30662:339::-;30857:41;6549:10;30890:7;30857:18;:41::i;:::-;30849:103;;;;-1:-1:-1;;;30849:103:0;;;;;;;:::i;:::-;30965:28;30975:4;30981:2;30985:7;30965:9;:28::i;42447:159::-;-1:-1:-1;;;;;42570:28:0;;42519:7;42570:28;;;:15;:28;;;;;;42551:16;;:47;;42570:28;;;;;42551:16;:47;:::i;:::-;42544:54;;;42447:159;-1:-1:-1;;42447:159:0:o;42270:163::-;-1:-1:-1;;;;;42398:27:0;;42345:7;42398:27;;;:14;:27;;;;;;42376:19;;:49;;42398:27;;;;;;42376:19;;;:49;:::i;44166:159::-;44250:11;41566:248;;41644:1;41630:11;:15;:52;;;;;41664:18;;41649:11;:33;;41630:52;41622:85;;;;-1:-1:-1;;;41622:85:0;;;;;;;:::i;:::-;41760:9;;41745:11;41726:16;:6;3165:14;;3073:114;41726:16;:30;;;;:::i;:::-;:43;;41718:76;;;;-1:-1:-1;;;41718:76:0;;;;;;;:::i;:::-;7818:6;;-1:-1:-1;;;;;7818:6:0;6549:10;7965:23:::1;7957:68;;;;-1:-1:-1::0;;;7957:68:0::1;;;;;;;:::i;:::-;44284:33:::2;44294:9;44305:11;44284:33;;:9;:33::i;46426:378::-:0;7818:6;;-1:-1:-1;;;;;7818:6:0;6549:10;7965:23;7957:68;;;;-1:-1:-1;;;7957:68:0;;;;;;;:::i;:::-;46525:7:::1;46546:42;46631:3;46602:26;:21;46626:2;46602:26;:::i;:::-;:32;;;;:::i;:::-;46538:101;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46524:115;;;46658:2;46650:11;;;::::0;::::1;;46704:7;46725;7818:6:::0;;-1:-1:-1;;;;;7818:6:0;;7745:87;46725:7:::1;-1:-1:-1::0;;;;;46717:21:0::1;46746;46717:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46703:69;;;46791:2;46783:11;;;::::0;::::1;31072:185:::0;31210:39;31227:4;31233:2;31237:7;31210:39;;;;;;;;;;;;:16;:39::i;44592:715::-;44679:16;44721:23;44747:17;44757:6;44747:9;:17::i;:::-;44721:43;;44779:30;44826:15;44812:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44812:30:0;-1:-1:-1;44779:63:0;-1:-1:-1;44882:1:0;44857:22;44934:333;44959:15;44941;:33;:64;;;;;44996:9;;44978:14;:27;;44941:64;44934:333;;;45018:25;45046:23;45054:14;45046:7;:23::i;:::-;45018:51;;45111:6;-1:-1:-1;;;;;45090:27:0;:17;-1:-1:-1;;;;;45090:27:0;;45086:145;;;45167:14;45134:13;45148:15;45134:30;;;;;;;;:::i;:::-;;;;;;;;;;:47;45198:17;;;;:::i;:::-;;;;45086:145;45243:16;;;;:::i;:::-;;;;45007:260;44934:333;;;-1:-1:-1;45286:13:0;;44592:715;-1:-1:-1;;;;44592:715:0:o;45954:80::-;7818:6;;-1:-1:-1;;;;;7818:6:0;6549:10;7965:23;7957:68;;;;-1:-1:-1;;;7957:68:0;;;;;;;:::i;:::-;46014:4:::1;:12:::0;45954:80::o;46044:138::-;7818:6;;-1:-1:-1;;;;;7818:6:0;6549:10;7965:23;7957:68;;;;-1:-1:-1;;;7957:68:0;;;;;;;:::i;:::-;46136:38;;::::1;::::0;:17:::1;::::0;:38:::1;::::0;::::1;::::0;::::1;:::i;40119:33::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43599:534::-;43697:11;41566:248;;41644:1;41630:11;:15;:52;;;;;41664:18;;41649:11;:33;;41630:52;41622:85;;;;-1:-1:-1;;;41622:85:0;;;;;;;:::i;:::-;41760:9;;41745:11;41726:16;:6;3165:14;;3073:114;41726:16;:30;;;;:::i;:::-;:43;;41718:76;;;;-1:-1:-1;;;41718:76:0;;;;;;;:::i;:::-;43730:6:::1;::::0;;;::::1;;;43729:7;43721:42;;;::::0;-1:-1:-1;;;43721:42:0;;10831:2:1;43721:42:0::1;::::0;::::1;10813:21:1::0;10870:2;10850:18;;;10843:30;-1:-1:-1;;;10889:18:1;;;10882:52;10951:18;;43721:42:0::1;10629:346:1::0;43721:42:0::1;43783:17;::::0;;;::::1;;;43775:49;;;::::0;-1:-1:-1;;;43775:49:0;;12295:2:1;43775:49:0::1;::::0;::::1;12277:21:1::0;12334:2;12314:18;;;12307:30;-1:-1:-1;;;12353:18:1;;;12346:49;12412:18;;43775:49:0::1;12093:343:1::0;43775:49:0::1;43868:19;::::0;::::1;;::::0;;::::1;::::0;::::1;43853:34:::0;;::::1;;;43845:43;;;::::0;::::1;;43928:11;43921:18;;:4;;:18;;;;:::i;:::-;43908:9;:31;;43900:63;;;::::0;-1:-1:-1;;;43900:63:0;;19239:2:1;43900:63:0::1;::::0;::::1;19221:21:1::0;19278:2;19258:18;;;19251:30;-1:-1:-1;;;19297:18:1;;;19290:49;19356:18;;43900:63:0::1;19037:343:1::0;43900:63:0::1;42895:25:::0;;;43996:10:::1;6195:2:1::0;6191:15;-1:-1:-1;;6187:53:1;42895:25:0;;;;6175:66:1;;;;42895:25:0;;;;;;;;;6257:12:1;;;;42895:25:0;;;42885:36;;;;;43982:33:::1;::::0;44009:5:::1;;43982:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;43982:7:0::1;::::0;-1:-1:-1;;;43982:33:0:i:1;:::-;43974:59;;;::::0;-1:-1:-1;;;43974:59:0;;18543:2:1;43974:59:0::1;::::0;::::1;18525:21:1::0;18582:2;18562:18;;;18555:30;-1:-1:-1;;;18601:18:1;;;18594:43;18654:18;;43974:59:0::1;18341:337:1::0;43974:59:0::1;44056:24;44068:11;44056;:24::i;:::-;44091:34;44101:10;44113:11;44091:34;;:9;:34::i;:::-;43599:534:::0;;;;:::o;40084:28::-;;;;;;;:::i;28047:239::-;28119:7;28155:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28155:16:0;28190:19;28182:73;;;;-1:-1:-1;;;28182:73:0;;14651:2:1;28182:73:0;;;14633:21:1;14690:2;14670:18;;;14663:30;14729:34;14709:18;;;14702:62;-1:-1:-1;;;14780:18:1;;;14773:39;14829:19;;28182:73:0;14449:405:1;43121:439:0;43184:11;41566:248;;41644:1;41630:11;:15;:52;;;;;41664:18;;41649:11;:33;;41630:52;41622:85;;;;-1:-1:-1;;;41622:85:0;;;;;;;:::i;:::-;41760:9;;41745:11;41726:16;:6;3165:14;;3073:114;41726:16;:30;;;;:::i;:::-;:43;;41718:76;;;;-1:-1:-1;;;41718:76:0;;;;;;;:::i;:::-;43217:6:::1;::::0;;;::::1;;;43216:7;43208:43;;;::::0;-1:-1:-1;;;43208:43:0;;16196:2:1;43208:43:0::1;::::0;::::1;16178:21:1::0;16235:2;16215:18;;;16208:30;16274:25;16254:18;;;16247:53;16317:18;;43208:43:0::1;15994:347:1::0;43208:43:0::1;43271:17;::::0;;;::::1;;;43270:18;43262:56;;;::::0;-1:-1:-1;;;43262:56:0;;18885:2:1;43262:56:0::1;::::0;::::1;18867:21:1::0;18924:2;18904:18;;;18897:30;18963:27;18943:18;;;18936:55;19008:18;;43262:56:0::1;18683:349:1::0;43262:56:0::1;43359:11;43352:18;;:4;;:18;;;;:::i;:::-;43339:9;:31;;43331:63;;;::::0;-1:-1:-1;;;43331:63:0;;19239:2:1;43331:63:0::1;::::0;::::1;19221:21:1::0;19278:2;19258:18;;;19251:30;-1:-1:-1;;;19297:18:1;;;19290:49;19356:18;;43331:63:0::1;19037:343:1::0;43331:63:0::1;43407:24;43419:11;43407;:24::i;:::-;43518:34;43528:10;43540:11;43518:34;;:9;:34::i;27777:208::-:0;27849:7;-1:-1:-1;;;;;27877:19:0;;27869:74;;;;-1:-1:-1;;;27869:74:0;;14240:2:1;27869:74:0;;;14222:21:1;14279:2;14259:18;;;14252:30;14318:34;14298:18;;;14291:62;-1:-1:-1;;;14369:18:1;;;14362:40;14419:19;;27869:74:0;14038:406:1;27869:74:0;-1:-1:-1;;;;;;27961:16:0;;;;;:9;:16;;;;;;;27777:208::o;8396:103::-;7818:6;;-1:-1:-1;;;;;7818:6:0;6549:10;7965:23;7957:68;;;;-1:-1:-1;;;7957:68:0;;;;;;;:::i;:::-;8461:30:::1;8488:1;8461:18;:30::i;:::-;8396:103::o:0;41982:131::-;7818:6;;-1:-1:-1;;;;;7818:6:0;6549:10;7965:23;7957:68;;;;-1:-1:-1;;;7957:68:0;;;;;;;:::i;:::-;42067:17:::1;:38:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;42067:38:0;;::::1;::::0;;;::::1;::::0;;41982:131::o;46190:106::-;7818:6;;-1:-1:-1;;;;;7818:6:0;6549:10;7965:23;7957:68;;;;-1:-1:-1;;;7957:68:0;;;;;;;:::i;:::-;46266:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;28522:104::-:0;28578:13;28611:7;28604:14;;;;;:::i;30205:155::-;30300:52;6549:10;30333:8;30343;30300:18;:52::i;40159:31::-;;;;;;;:::i;31328:328::-;31503:41;6549:10;31536:7;31503:18;:41::i;:::-;31495:103;;;;-1:-1:-1;;;31495:103:0;;;;;;;:::i;:::-;31609:39;31623:4;31629:2;31633:7;31642:5;31609:13;:39::i;42937:142::-;7818:6;;-1:-1:-1;;;;;7818:6:0;6549:10;7965:23;7957:68;;;;-1:-1:-1;;;7957:68:0;;;;;;;:::i;:::-;43029:19:::1;:42:::0;42937:142::o;45315:536::-;33231:4;33255:16;;;:7;:16;;;;;;45434:13;;-1:-1:-1;;;;;33255:16:0;45461:102;;;;-1:-1:-1;;;45461:102:0;;16958:2:1;45461:102:0;;;16940:21:1;16997:2;16977:18;;;16970:30;17036:34;17016:18;;;17009:62;-1:-1:-1;;;17087:18:1;;;17080:45;17142:19;;45461:102:0;16756:411:1;45461:102:0;45576:8;;;;;;;45572:66;;45613:17;45606:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45315:536;;;:::o;45572:66::-;45646:28;45677:10;:8;:10::i;:::-;45646:41;;45736:1;45711:14;45705:28;:32;:138;;;;;;;;;;;;;;;;;45777:14;45793:19;:8;:17;:19::i;:::-;45814:9;45760:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45705:138;45698:145;45315:536;-1:-1:-1;;;45315:536:0:o;45859:87::-;7818:6;;-1:-1:-1;;;;;7818:6:0;6549:10;7965:23;7957:68;;;;-1:-1:-1;;;7957:68:0;;;;;;;:::i;:::-;45921:8:::1;:17:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;45921:17:0;;::::1;::::0;;;::::1;::::0;;45859:87::o;8654:201::-;7818:6;;-1:-1:-1;;;;;7818:6:0;6549:10;7965:23;7957:68;;;;-1:-1:-1;;;7957:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8743:22:0;::::1;8735:73;;;::::0;-1:-1:-1;;;8735:73:0;;11182:2:1;8735:73:0::1;::::0;::::1;11164:21:1::0;11221:2;11201:18;;;11194:30;11260:34;11240:18;;;11233:62;-1:-1:-1;;;11311:18:1;;;11304:36;11357:19;;8735:73:0::1;10980:402:1::0;8735:73:0::1;8819:28;8838:8;8819:18;:28::i;:::-;8654:201:::0;:::o;37148:174::-;37223:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;37223:29:0;-1:-1:-1;;;;;37223:29:0;;;;;;;;:24;;37277:23;37223:24;37277:14;:23::i;:::-;-1:-1:-1;;;;;37268:46:0;;;;;;;;;;;37148:174;;:::o;33460:348::-;33553:4;33255:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33255:16:0;33570:73;;;;-1:-1:-1;;;33570:73:0;;13402:2:1;33570:73:0;;;13384:21:1;13441:2;13421:18;;;13414:30;13480:34;13460:18;;;13453:62;-1:-1:-1;;;13531:18:1;;;13524:42;13583:19;;33570:73:0;13200:408:1;33570:73:0;33654:13;33670:23;33685:7;33670:14;:23::i;:::-;33654:39;;33723:5;-1:-1:-1;;;;;33712:16:0;:7;-1:-1:-1;;;;;33712:16:0;;:51;;;;33756:7;-1:-1:-1;;;;;33732:31:0;:20;33744:7;33732:11;:20::i;:::-;-1:-1:-1;;;;;33732:31:0;;33712:51;:87;;;-1:-1:-1;;;;;;30552:25:0;;;30528:4;30552:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;33767:32;33704:96;33460:348;-1:-1:-1;;;;33460:348:0:o;36452:578::-;36611:4;-1:-1:-1;;;;;36584:31:0;:23;36599:7;36584:14;:23::i;:::-;-1:-1:-1;;;;;36584:31:0;;36576:85;;;;-1:-1:-1;;;36576:85:0;;16548:2:1;36576:85:0;;;16530:21:1;16587:2;16567:18;;;16560:30;16626:34;16606:18;;;16599:62;-1:-1:-1;;;16677:18:1;;;16670:39;16726:19;;36576:85:0;16346:405:1;36576:85:0;-1:-1:-1;;;;;36680:16:0;;36672:65;;;;-1:-1:-1;;;36672:65:0;;12643:2:1;36672:65:0;;;12625:21:1;12682:2;12662:18;;;12655:30;12721:34;12701:18;;;12694:62;-1:-1:-1;;;12772:18:1;;;12765:34;12816:19;;36672:65:0;12441:400:1;36672:65:0;36854:29;36871:1;36875:7;36854:8;:29::i;:::-;-1:-1:-1;;;;;36896:15:0;;;;;;:9;:15;;;;;:20;;36915:1;;36896:15;:20;;36915:1;;36896:20;:::i;:::-;;;;-1:-1:-1;;;;;;;36927:13:0;;;;;;:9;:13;;;;;:18;;36944:1;;36927:13;:18;;36944:1;;36927:18;:::i;:::-;;;;-1:-1:-1;;36956:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36956:21:0;-1:-1:-1;;;;;36956:21:0;;;;;;;;;36995:27;;36956:16;;36995:27;;;;;;;36452:578;;;:::o;44358:226::-;44442:9;44437:140;44461:11;44457:1;:15;44437:140;;;44494:18;:6;3284:19;;3302:1;3284:19;;;3195:127;44494:18;44527:38;44537:9;44548:16;:6;3165:14;;3073:114;44548:16;44527:9;:38::i;:::-;44474:3;;;;:::i;:::-;;;;44437:140;;42633:162;42711:4;42735:52;42754:5;42761:19;;42782:4;42735:18;:52::i;41030:494::-;41098:17;;;;;;;41094:206;;41185:16;;41156:10;41185:16;41140:27;;;:15;:27;;;;;;41185:16;;;;;41140:41;;41170:11;;41140:27;:41;:::i;:::-;:61;;;;41132:70;;;;;;41263:10;41247:27;;;;:15;:27;;;;;;:41;;41277:11;;41247:27;;:41;:::i;:::-;41233:10;41217:27;;;;:15;:27;;;;;:71;;-1:-1:-1;;41217:71:0;;;;;;;;;;;;41094:206;41315:17;;;;;;;41312:205;;;41401:19;;41372:10;41357:26;;;;:14;:26;;;;;;41401:19;;;;;;;;41357:40;;41386:11;;41357:26;:40;:::i;:::-;:63;;;;41349:72;;;;;;41480:10;41465:26;;;;:14;:26;;;;;;:40;;41494:11;;41465:26;;:40;:::i;:::-;41451:10;41436:26;;;;:14;:26;;;;;:69;;-1:-1:-1;;41436:69:0;;;;;;;;;;;;-1:-1:-1;41030:494:0:o;9015:191::-;9108:6;;;-1:-1:-1;;;;;9125:17:0;;;-1:-1:-1;;;;;;9125:17:0;;;;;;;9158:40;;9108:6;;;9125:17;9108:6;;9158:40;;9089:16;;9158:40;9078:128;9015:191;:::o;37464:315::-;37619:8;-1:-1:-1;;;;;37610:17:0;:5;-1:-1:-1;;;;;37610:17:0;;;37602:55;;;;-1:-1:-1;;;37602:55:0;;13048:2:1;37602:55:0;;;13030:21:1;13087:2;13067:18;;;13060:30;13126:27;13106:18;;;13099:55;13171:18;;37602:55:0;12846:349:1;37602:55:0;-1:-1:-1;;;;;37668:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;37668:46:0;;;;;;;;;;37730:41;;9752::1;;;37730::0;;9725:18:1;37730:41:0;;;;;;;37464:315;;;:::o;32538:::-;32695:28;32705:4;32711:2;32715:7;32695:9;:28::i;:::-;32742:48;32765:4;32771:2;32775:7;32784:5;32742:22;:48::i;:::-;32734:111;;;;-1:-1:-1;;;32734:111:0;;;;;;;:::i;46820:110::-;46880:13;46913:9;46906:16;;;;;:::i;4031:723::-;4087:13;4308:10;4304:53;;-1:-1:-1;;4335:10:0;;;;;;;;;;;;-1:-1:-1;;;4335:10:0;;;;;4031:723::o;4304:53::-;4382:5;4367:12;4423:78;4430:9;;4423:78;;4456:8;;;;:::i;:::-;;-1:-1:-1;4479:10:0;;-1:-1:-1;4487:2:0;4479:10;;:::i;:::-;;;4423:78;;;4511:19;4543:6;4533:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4533:17:0;;4511:39;;4561:154;4568:10;;4561:154;;4595:11;4605:1;4595:11;;:::i;:::-;;-1:-1:-1;4664:10:0;4672:2;4664:5;:10;:::i;:::-;4651:24;;:2;:24;:::i;:::-;4638:39;;4621:6;4628;4621:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;4621:56:0;;;;;;;;-1:-1:-1;4692:11:0;4701:2;4692:11;;:::i;:::-;;;4561:154;;34150:110;34226:26;34236:2;34240:7;34226:26;;;;;;;;;;;;:9;:26::i;941:190::-;1066:4;1119;1090:25;1103:5;1110:4;1090:12;:25::i;:::-;:33;;941:190;-1:-1:-1;;;;941:190:0:o;38344:799::-;38499:4;-1:-1:-1;;;;;38520:13:0;;10356:20;10404:8;38516:620;;38556:72;;-1:-1:-1;;;38556:72:0;;-1:-1:-1;;;;;38556:36:0;;;;;:72;;6549:10;;38607:4;;38613:7;;38622:5;;38556:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38556:72:0;;;;;;;;-1:-1:-1;;38556:72:0;;;;;;;;;;;;:::i;:::-;;;38552:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38798:13:0;;38794:272;;38841:60;;-1:-1:-1;;;38841:60:0;;;;;;;:::i;38794:272::-;39016:6;39010:13;39001:6;38997:2;38993:15;38986:38;38552:529;-1:-1:-1;;;;;;38679:51:0;-1:-1:-1;;;38679:51:0;;-1:-1:-1;38672:58:0;;38516:620;-1:-1:-1;39120:4:0;38344:799;;;;;;:::o;34487:321::-;34617:18;34623:2;34627:7;34617:5;:18::i;:::-;34668:54;34699:1;34703:2;34707:7;34716:5;34668:22;:54::i;:::-;34646:154;;;;-1:-1:-1;;;34646:154:0;;;;;;;:::i;1493:701::-;1576:7;1619:4;1576:7;1634:523;1658:5;:12;1654:1;:16;1634:523;;;1692:20;1715:5;1721:1;1715:8;;;;;;;;:::i;:::-;;;;;;;1692:31;;1758:12;1742;:28;1738:408;;1895:44;;;;;;6437:19:1;;;6472:12;;;6465:28;;;6509:12;;1895:44:0;;;;;;;;;;;;1885:55;;;;;;1870:70;;1738:408;;;2085:44;;;;;;6437:19:1;;;6472:12;;;6465:28;;;6509:12;;2085:44:0;;;;;;;;;;;;2075:55;;;;;;2060:70;;1738:408;-1:-1:-1;1672:3:0;;;;:::i;:::-;;;;1634:523;;;-1:-1:-1;2174:12:0;1493:701;-1:-1:-1;;;1493:701:0:o;35144:382::-;-1:-1:-1;;;;;35224:16:0;;35216:61;;;;-1:-1:-1;;;35216:61:0;;15061:2:1;35216:61:0;;;15043:21:1;;;15080:18;;;15073:30;15139:34;15119:18;;;15112:62;15191:18;;35216:61:0;14859:356:1;35216:61:0;33231:4;33255:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33255:16:0;:30;35288:58;;;;-1:-1:-1;;;35288:58:0;;11589:2:1;35288:58:0;;;11571:21:1;11628:2;11608:18;;;11601:30;11667;11647:18;;;11640:58;11715:18;;35288:58:0;11387:352:1;35288:58:0;-1:-1:-1;;;;;35417:13:0;;;;;;:9;:13;;;;;:18;;35434:1;;35417:13;:18;;35434:1;;35417:18;:::i;:::-;;;;-1:-1:-1;;35446:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35446:21:0;-1:-1:-1;;;;;35446:21:0;;;;;;;;35485:33;;35446:16;;;35485:33;;35446:16;;35485:33;35144:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:160::-;893:20;;949:13;;942:21;932:32;;922:60;;978:1;975;968:12;993:156;1059:20;;1119:4;1108:16;;1098:27;;1088:55;;1139:1;1136;1129:12;1154:186;1213:6;1266:2;1254:9;1245:7;1241:23;1237:32;1234:52;;;1282:1;1279;1272:12;1234:52;1305:29;1324:9;1305:29;:::i;1345:260::-;1413:6;1421;1474:2;1462:9;1453:7;1449:23;1445:32;1442:52;;;1490:1;1487;1480:12;1442:52;1513:29;1532:9;1513:29;:::i;:::-;1503:39;;1561:38;1595:2;1584:9;1580:18;1561:38;:::i;:::-;1551:48;;1345:260;;;;;:::o;1610:328::-;1687:6;1695;1703;1756:2;1744:9;1735:7;1731:23;1727:32;1724:52;;;1772:1;1769;1762:12;1724:52;1795:29;1814:9;1795:29;:::i;:::-;1785:39;;1843:38;1877:2;1866:9;1862:18;1843:38;:::i;:::-;1833:48;;1928:2;1917:9;1913:18;1900:32;1890:42;;1610:328;;;;;:::o;1943:666::-;2038:6;2046;2054;2062;2115:3;2103:9;2094:7;2090:23;2086:33;2083:53;;;2132:1;2129;2122:12;2083:53;2155:29;2174:9;2155:29;:::i;:::-;2145:39;;2203:38;2237:2;2226:9;2222:18;2203:38;:::i;:::-;2193:48;;2288:2;2277:9;2273:18;2260:32;2250:42;;2343:2;2332:9;2328:18;2315:32;2370:18;2362:6;2359:30;2356:50;;;2402:1;2399;2392:12;2356:50;2425:22;;2478:4;2470:13;;2466:27;-1:-1:-1;2456:55:1;;2507:1;2504;2497:12;2456:55;2530:73;2595:7;2590:2;2577:16;2572:2;2568;2564:11;2530:73;:::i;:::-;2520:83;;;1943:666;;;;;;;:::o;2614:254::-;2679:6;2687;2740:2;2728:9;2719:7;2715:23;2711:32;2708:52;;;2756:1;2753;2746:12;2708:52;2779:29;2798:9;2779:29;:::i;:::-;2769:39;;2827:35;2858:2;2847:9;2843:18;2827:35;:::i;2873:254::-;2941:6;2949;3002:2;2990:9;2981:7;2977:23;2973:32;2970:52;;;3018:1;3015;3008:12;2970:52;3041:29;3060:9;3041:29;:::i;:::-;3031:39;3117:2;3102:18;;;;3089:32;;-1:-1:-1;;;2873:254:1:o;3132:180::-;3188:6;3241:2;3229:9;3220:7;3216:23;3212:32;3209:52;;;3257:1;3254;3247:12;3209:52;3280:26;3296:9;3280:26;:::i;3317:180::-;3376:6;3429:2;3417:9;3408:7;3404:23;3400:32;3397:52;;;3445:1;3442;3435:12;3397:52;-1:-1:-1;3468:23:1;;3317:180;-1:-1:-1;3317:180:1:o;3502:245::-;3560:6;3613:2;3601:9;3592:7;3588:23;3584:32;3581:52;;;3629:1;3626;3619:12;3581:52;3668:9;3655:23;3687:30;3711:5;3687:30;:::i;3752:249::-;3821:6;3874:2;3862:9;3853:7;3849:23;3845:32;3842:52;;;3890:1;3887;3880:12;3842:52;3922:9;3916:16;3941:30;3965:5;3941:30;:::i;4006:450::-;4075:6;4128:2;4116:9;4107:7;4103:23;4099:32;4096:52;;;4144:1;4141;4134:12;4096:52;4184:9;4171:23;4217:18;4209:6;4206:30;4203:50;;;4249:1;4246;4239:12;4203:50;4272:22;;4325:4;4317:13;;4313:27;-1:-1:-1;4303:55:1;;4354:1;4351;4344:12;4303:55;4377:73;4442:7;4437:2;4424:16;4419:2;4415;4411:11;4377:73;:::i;4646:182::-;4703:6;4756:2;4744:9;4735:7;4731:23;4727:32;4724:52;;;4772:1;4769;4762:12;4724:52;4795:27;4812:9;4795:27;:::i;4833:256::-;4899:6;4907;4960:2;4948:9;4939:7;4935:23;4931:32;4928:52;;;4976:1;4973;4966:12;4928:52;4999:27;5016:9;4999:27;:::i;5094:685::-;5187:6;5195;5203;5256:2;5244:9;5235:7;5231:23;5227:32;5224:52;;;5272:1;5269;5262:12;5224:52;5295:27;5312:9;5295:27;:::i;:::-;5285:37;;5373:2;5362:9;5358:18;5345:32;5396:18;5437:2;5429:6;5426:14;5423:34;;;5453:1;5450;5443:12;5423:34;5491:6;5480:9;5476:22;5466:32;;5536:7;5529:4;5525:2;5521:13;5517:27;5507:55;;5558:1;5555;5548:12;5507:55;5598:2;5585:16;5624:2;5616:6;5613:14;5610:34;;;5640:1;5637;5630:12;5610:34;5693:7;5688:2;5678:6;5675:1;5671:14;5667:2;5663:23;5659:32;5656:45;5653:65;;;5714:1;5711;5704:12;5653:65;5745:2;5741;5737:11;5727:21;;5767:6;5757:16;;;;;5094:685;;;;;:::o;5784:257::-;5825:3;5863:5;5857:12;5890:6;5885:3;5878:19;5906:63;5962:6;5955:4;5950:3;5946:14;5939:4;5932:5;5928:16;5906:63;:::i;:::-;6023:2;6002:15;-1:-1:-1;;5998:29:1;5989:39;;;;6030:4;5985:50;;5784:257;-1:-1:-1;;5784:257:1:o;6532:1527::-;6756:3;6794:6;6788:13;6820:4;6833:51;6877:6;6872:3;6867:2;6859:6;6855:15;6833:51;:::i;:::-;6947:13;;6906:16;;;;6969:55;6947:13;6906:16;6991:15;;;6969:55;:::i;:::-;7113:13;;7046:20;;;7086:1;;7173;7195:18;;;;7248;;;;7275:93;;7353:4;7343:8;7339:19;7327:31;;7275:93;7416:2;7406:8;7403:16;7383:18;7380:40;7377:167;;;-1:-1:-1;;;7443:33:1;;7499:4;7496:1;7489:15;7529:4;7450:3;7517:17;7377:167;7560:18;7587:110;;;;7711:1;7706:328;;;;7553:481;;7587:110;-1:-1:-1;;7622:24:1;;7608:39;;7667:20;;;;-1:-1:-1;7587:110:1;;7706:328;19829:1;19822:14;;;19866:4;19853:18;;7801:1;7815:169;7829:8;7826:1;7823:15;7815:169;;;7911:14;;7896:13;;;7889:37;7954:16;;;;7846:10;;7815:169;;;7819:3;;8015:8;8008:5;8004:20;7997:27;;7553:481;-1:-1:-1;8050:3:1;;6532:1527;-1:-1:-1;;;;;;;;;;;6532:1527:1:o;8482:488::-;-1:-1:-1;;;;;8751:15:1;;;8733:34;;8803:15;;8798:2;8783:18;;8776:43;8850:2;8835:18;;8828:34;;;8898:3;8893:2;8878:18;;8871:31;;;8676:4;;8919:45;;8944:19;;8936:6;8919:45;:::i;:::-;8911:53;8482:488;-1:-1:-1;;;;;;8482:488:1:o;8975:632::-;9146:2;9198:21;;;9268:13;;9171:18;;;9290:22;;;9117:4;;9146:2;9369:15;;;;9343:2;9328:18;;;9117:4;9412:169;9426:6;9423:1;9420:13;9412:169;;;9487:13;;9475:26;;9556:15;;;;9521:12;;;;9448:1;9441:9;9412:169;;;-1:-1:-1;9598:3:1;;8975:632;-1:-1:-1;;;;;;8975:632:1:o;9986:219::-;10135:2;10124:9;10117:21;10098:4;10155:44;10195:2;10184:9;10180:18;10172:6;10155:44;:::i;10210:414::-;10412:2;10394:21;;;10451:2;10431:18;;;10424:30;10490:34;10485:2;10470:18;;10463:62;-1:-1:-1;;;10556:2:1;10541:18;;10534:48;10614:3;10599:19;;10210:414::o;11744:344::-;11946:2;11928:21;;;11985:2;11965:18;;;11958:30;-1:-1:-1;;;12019:2:1;12004:18;;11997:50;12079:2;12064:18;;11744:344::o;15633:356::-;15835:2;15817:21;;;15854:18;;;15847:30;15913:34;15908:2;15893:18;;15886:62;15980:2;15965:18;;15633:356::o;17574:344::-;17776:2;17758:21;;;17815:2;17795:18;;;17788:30;-1:-1:-1;;;17849:2:1;17834:18;;17827:50;17909:2;17894:18;;17574:344::o;17923:413::-;18125:2;18107:21;;;18164:2;18144:18;;;18137:30;18203:34;18198:2;18183:18;;18176:62;-1:-1:-1;;;18269:2:1;18254:18;;18247:47;18326:3;18311:19;;17923:413::o;19882:128::-;19922:3;19953:1;19949:6;19946:1;19943:13;19940:39;;;19959:18;;:::i;:::-;-1:-1:-1;19995:9:1;;19882:128::o;20015:204::-;20053:3;20089:4;20086:1;20082:12;20121:4;20118:1;20114:12;20156:3;20150:4;20146:14;20141:3;20138:23;20135:49;;;20164:18;;:::i;:::-;20200:13;;20015:204;-1:-1:-1;;;20015:204:1:o;20224:120::-;20264:1;20290;20280:35;;20295:18;;:::i;:::-;-1:-1:-1;20329:9:1;;20224:120::o;20349:168::-;20389:7;20455:1;20451;20447:6;20443:14;20440:1;20437:21;20432:1;20425:9;20418:17;20414:45;20411:71;;;20462:18;;:::i;:::-;-1:-1:-1;20502:9:1;;20349:168::o;20522:125::-;20562:4;20590:1;20587;20584:8;20581:34;;;20595:18;;:::i;:::-;-1:-1:-1;20632:9:1;;20522:125::o;20652:195::-;20690:4;20727;20724:1;20720:12;20759:4;20756:1;20752:12;20784:3;20779;20776:12;20773:38;;;20791:18;;:::i;:::-;20828:13;;;20652:195;-1:-1:-1;;;20652:195:1:o;20852:258::-;20924:1;20934:113;20948:6;20945:1;20942:13;20934:113;;;21024:11;;;21018:18;21005:11;;;20998:39;20970:2;20963:10;20934:113;;;21065:6;21062:1;21059:13;21056:48;;;-1:-1:-1;;21100:1:1;21082:16;;21075:27;20852:258::o;21115:380::-;21194:1;21190:12;;;;21237;;;21258:61;;21312:4;21304:6;21300:17;21290:27;;21258:61;21365:2;21357:6;21354:14;21334:18;21331:38;21328:161;;;21411:10;21406:3;21402:20;21399:1;21392:31;21446:4;21443:1;21436:15;21474:4;21471:1;21464:15;21328:161;;21115:380;;;:::o;21500:135::-;21539:3;-1:-1:-1;;21560:17:1;;21557:43;;;21580:18;;:::i;:::-;-1:-1:-1;21627:1:1;21616:13;;21500:135::o;21640:112::-;21672:1;21698;21688:35;;21703:18;;:::i;:::-;-1:-1:-1;21737:9:1;;21640:112::o;21757:127::-;21818:10;21813:3;21809:20;21806:1;21799:31;21849:4;21846:1;21839:15;21873:4;21870:1;21863:15;21889:127;21950:10;21945:3;21941:20;21938:1;21931:31;21981:4;21978:1;21971:15;22005:4;22002:1;21995:15;22021:127;22082:10;22077:3;22073:20;22070:1;22063:31;22113:4;22110:1;22103:15;22137:4;22134:1;22127:15;22153:127;22214:10;22209:3;22205:20;22202:1;22195:31;22245:4;22242:1;22235:15;22269:4;22266:1;22259:15;22285:131;-1:-1:-1;;;;;;22359:32:1;;22349:43;;22339:71;;22406:1;22403;22396:12

Swarm Source

ipfs://9dc71ca0a9fcf74ddaa23420dc02b745827901c2e54d9d77c67cb54db152b741
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.