ETH Price: $3,439.76 (-1.35%)

Token

Zombie Apes (ZAPE)
 

Overview

Max Total Supply

6,667 ZAPE

Holders

1,627

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
hsahni.eth
Balance
1 ZAPE
0xf7e7996fb07c67852c91cb82f72ed62ba060ed14
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

6,667 Zombie Ape escaping from a top secret facility onto the Ethereum blockchain! Zombie DAO, passive staking, and much more. The Zombie Apes are stored as ERC-721 tokens on the Ethereum blockchain. Check out our [Zombie Zebr...

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ZombieApes

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-18
*/

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


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

pragma solidity ^0.8.0;

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

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

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

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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


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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

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


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

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;









error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error AuxQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex times
        unchecked {
            return _currentIndex - _burnCounter;
        }
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        if (operator == _msgSender()) revert ApproveToCaller();

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (!_checkOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
                updatedIndex++;
            }

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            isApprovedForAll(prevOwnership.addr, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @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 {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            _ownerships[tokenId].addr = prevOwnership.addr;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
            _ownerships[tokenId].burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert TransferToNonERC721ReceiverImplementer();
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}
// File: ZombieApes.sol


pragma solidity 0.8.11;





contract IStaking {
    mapping(address => mapping(uint256 => uint256)) public depositBlocks;
}

contract IPassiveStaking {
    function updateTransfer(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) external {}
}

contract IERC20 {
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public returns (bool) {}
}

contract ZombieApes is ERC721A, Ownable, ReentrancyGuard {
    uint256 public prePrice = 0.05 ether;
    uint256 public pubPrice = 0.07 ether;

    uint256 public nftLimit = 6667;
    uint256 public reserved = 250;
    uint256 public capPublic = 10;
    uint256 public capWhitelist = 10;
    uint256 public claimReserved = 1666;

    uint256 public freeMultiple = 2;
    address public claimAddress = 0x80D4914685Ba4BCA07a995bB160a8fC4cd4De5B6;
    address public claimStakingAddress =
        0x9b561710fEED0B8d829de89C82F80Bb7B2B364B8;
    address public stakingAddress;

    bool public saleClaim = false;
    bool public saleWhitelist = false;
    bool public salePublic = false;

    bytes32 public merkleRoot;

    string public baseURI = "";

    mapping(uint256 => uint256) public claimedTokens;

    constructor(string memory _initURI, bytes32 _merkleRoot)
        ERC721A("Zombie Apes", "ZAPE")
    {
        baseURI = _initURI;
        merkleRoot = _merkleRoot;
    }

    function mint(uint256 _amount) external payable nonReentrant {
        require(salePublic == true, "ZombieApes: Not Started");
        require(msg.value == pubPrice * _amount, "ZombieApes: Incorrect Value");
        require(_amount <= capPublic, "ZombieApes: Amount Limit");
        _mint(_amount);
    }

    function mintWhitelist(uint256 _amount, bytes32[] calldata proof)
        external
        payable
        nonReentrant
    {
        require(saleWhitelist == true, "ZombieApes: Not Started");
        require(_amount <= capWhitelist, "ZombieApes: Amount Limit");
        require(msg.value == prePrice * _amount, "ZombieApes: Incorrect Value");
        require(
            ERC721A(claimAddress).balanceOf(_msgSender()) > 0 ||
                ERC721A(claimStakingAddress).balanceOf(_msgSender()) > 0 ||
                MerkleProof.verify(
                    proof,
                    merkleRoot,
                    keccak256(abi.encodePacked(_msgSender()))
                ),
            "ZombieApes: Not Whitelisted"
        );
        _mint(_amount);
    }

    function mintClaim(uint256 _amount, uint256[] calldata _tokenIds)
        external
        nonReentrant
    {
        require(saleClaim == true, "ZombieApes: Not Started");
        require(
            _tokenIds.length == _amount * freeMultiple,
            "ZombieApes: Incorrect Token Count"
        );
        for (uint256 i = 0; i < _tokenIds.length; i++) {
            uint256 _tokenId = _tokenIds[i];
            require(claimedTokens[_tokenId] == 0, "ZombieApes: Token Claimed");
            require(
                ERC721A(claimAddress).ownerOf(_tokenId) == _msgSender() ||
                    IStaking(claimStakingAddress).depositBlocks(
                        _msgSender(),
                        _tokenId
                    ) >
                    0,
                "ZombieApes: Not Token Owner"
            );
            claimedTokens[_tokenId] = 1;
        }
        _mint(_amount);
        if (claimReserved >= _amount) {
            claimReserved -= _amount;
        } else {
            claimReserved = 0;
        }
    }

    function _mint(uint256 _amount) internal {
        require(tx.origin == _msgSender(), "ZombieApes: Self Mint Only");
        require(
            totalSupply() + _amount <= (nftLimit - reserved - claimReserved),
            "ZombieApes: Sold Out"
        );
        _safeMint(_msgSender(), _amount);
    }

    function checkClaimedTokens(uint256[] calldata _tokenIds)
        public
        view
        returns (uint256[] memory)
    {
        uint256[] memory claimed = new uint256[](_tokenIds.length);
        for (uint256 i = 0; i < _tokenIds.length; i++) {
            claimed[i] = claimedTokens[_tokenIds[i]];
        }
        return claimed;
    }

    function reserve(address[] calldata _tos, uint256[] calldata _amounts)
        external
        onlyOwner
        nonReentrant
    {
        require(_tos.length == _amounts.length, "ZombieApes: Length mismatch");
        uint256 _reserved;
        for (uint256 i = 0; i < _tos.length; i++) {
            _safeMint(_tos[i], _amounts[i]);
            _reserved += _amounts[i];
        }
        if (reserved >= _reserved) {
            reserved -= _reserved;
        } else {
            reserved = 0;
        }
    }

    function tokensOfOwnerByIndex(address _owner, uint256 _index)
        public
        view
        returns (uint256)
    {
        return tokensOfOwner(_owner)[_index];
    }

    function tokensOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 _tokenCount = balanceOf(_owner);
        uint256[] memory _tokenIds = new uint256[](_tokenCount);
        uint256 _tokenIndex = 0;
        for (uint256 i = 0; i < totalSupply(); i++) {
            if (ownerOf(i) == _owner) {
                _tokenIds[_tokenIndex] = i;
                _tokenIndex++;
            }
        }
        return _tokenIds;
    }

    function withdraw() public payable onlyOwner {
        uint256 _balance = address(this).balance;
        address TEAM4 = 0xd04D56650b5B66e2DA3bD9306D15cD11D20f288e;
        address TEAM3 = 0x80665f9ba68501d383B01B16906775b86e8fe313;
        address TEAM2 = 0xA3535bF71294e5497DD3D8bd23A2650636806b68;

        (bool team4tx, ) = payable(TEAM4).call{value: (_balance * 40) / 100}(
            ""
        );
        require(team4tx, "ZombieApes: Transfer 4 Failed");

        (bool team3tx, ) = payable(TEAM3).call{value: (_balance * 28) / 100}(
            ""
        );
        require(team3tx, "ZombieApes: Transfer 3 Failed");

        (bool team2tx, ) = payable(TEAM2).call{value: (_balance * 9) / 100}("");
        require(team2tx, "ZombieApes: Transfer 2 Failed");

        (bool team1tx, ) = payable(_msgSender()).call{
            value: address(this).balance
        }("");
        require(team1tx, "ZombieApes: Transfer 1 Failed");
    }

    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual override {
        super._beforeTokenTransfers(from, to, startTokenId, quantity);
        if (stakingAddress != address(0) && from != address(0)) {
            IPassiveStaking(stakingAddress).updateTransfer(
                from,
                to,
                startTokenId,
                quantity
            );
        }
    }

    function toggleSaleWhitelist() public onlyOwner {
        saleWhitelist = !saleWhitelist;
    }

    function toggleSalePublic() public onlyOwner {
        salePublic = !salePublic;
    }

    function togleSaleClaim() public onlyOwner {
        saleClaim = !saleClaim;
    }

    function toggleSaleOn() public onlyOwner {
        saleWhitelist = true;
        salePublic = true;
        saleClaim = true;
    }

    function setBaseURI(string calldata _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function setPrice(uint256 _prePrice, uint256 _pubPrice) public onlyOwner {
        prePrice = _prePrice;
        pubPrice = _pubPrice;
    }

    function setNftLimit(uint256 _nftLimit) public onlyOwner {
        nftLimit = _nftLimit;
    }

    function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
        merkleRoot = _merkleRoot;
    }

    function setClaimReserved(uint256 _claimReserved) public onlyOwner {
        claimReserved = _claimReserved;
    }

    function setReserved(uint256 _reserved) public onlyOwner {
        reserved = _reserved;
    }

    function setStakingAddress(address _stakingAddress) public onlyOwner {
        stakingAddress = _stakingAddress;
    }

    function setClaimStakingAddress(address _claimStakingAddress)
        public
        onlyOwner
    {
        claimStakingAddress = _claimStakingAddress;
    }

    function setClaimAddress(address _claimAddress) public onlyOwner {
        claimAddress = _claimAddress;
    }

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

    function contractURI() public view returns (string memory) {
        return string(abi.encodePacked(baseURI, "contract"));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initURI","type":"string"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"capPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"capWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"checkClaimedTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimReserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimStakingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMultiple","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"mintClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pubPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tos","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserved","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":"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":[],"name":"saleClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"salePublic","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_claimAddress","type":"address"}],"name":"setClaimAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimReserved","type":"uint256"}],"name":"setClaimReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_claimStakingAddress","type":"address"}],"name":"setClaimStakingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftLimit","type":"uint256"}],"name":"setNftLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_prePrice","type":"uint256"},{"internalType":"uint256","name":"_pubPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reserved","type":"uint256"}],"name":"setReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakingAddress","type":"address"}],"name":"setStakingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleSaleOn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSalePublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSaleWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togleSaleClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokensOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

66b1a2bc2ec50000600a90815566f8b0a10e470000600b55611a0b600c5560fa600d55600e819055600f556106826010556002601155601280546001600160a01b03199081167380d4914685ba4bca07a995bb160a8fc4cd4de5b61790915560138054909116739b561710feed0b8d829de89c82f80bb7b2b364b81790556014805462ffffff60a01b1916905560a0604081905260006080819052620000a891601691620001d6565b50348015620000b657600080fd5b50604051620035b4380380620035b4833981016040819052620000d99162000292565b604080518082018252600b81526a5a6f6d626965204170657360a81b6020808301918252835180850190945260048452635a41504560e01b9084015281519192916200012891600291620001d6565b5080516200013e906003906020840190620001d6565b5050506200015b620001556200018060201b60201c565b62000184565b6001600955815162000175906016906020850190620001d6565b5060155550620003b4565b3390565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001e49062000377565b90600052602060002090601f01602090048101928262000208576000855562000253565b82601f106200022357805160ff191683800117855562000253565b8280016001018555821562000253579182015b828111156200025357825182559160200191906001019062000236565b506200026192915062000265565b5090565b5b8082111562000261576000815560010162000266565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215620002a657600080fd5b82516001600160401b0380821115620002be57600080fd5b818501915085601f830112620002d357600080fd5b815181811115620002e857620002e86200027c565b604051601f8201601f19908116603f011681019083821181831017156200031357620003136200027c565b816040528281526020935088848487010111156200033057600080fd5b600091505b8282101562000354578482018401518183018501529083019062000335565b82821115620003665760008484830101525b969092015195979596505050505050565b600181811c908216806200038c57607f821691505b60208210811415620003ae57634e487b7160e01b600052602260045260246000fd5b50919050565b6131f080620003c46000396000f3fe60806040526004361061036b5760003560e01c80637cb64759116101c6578063cb4e8326116100f7578063e8a3d48511610095578063f4e0d9ac1161006f578063f4e0d9ac14610991578063f7aa2ffc146109b1578063f7d97577146109d2578063fe60d12c146109f257600080fd5b8063e8a3d48514610913578063e985e9c514610928578063f2fde38b1461097157600080fd5b8063d7b4be24116100d1578063d7b4be2414610890578063e230dbbe146108b0578063e567cad6146108d0578063e5a342a3146108e657600080fd5b8063cb4e832614610844578063d5478d0f1461085a578063d5e13d651461087a57600080fd5b8063a22cb46511610164578063bb3790871161013e578063bb379087146107d9578063bb6d44b7146107f9578063bddb7be71461080e578063c87b56dd1461082457600080fd5b8063a22cb46514610778578063b88d4fde14610798578063b8f929ad146107b857600080fd5b80638da5cb5b116101a05780638da5cb5b1461071d57806395d89b411461073b5780639dac6ebe14610750578063a0712d681461076557600080fd5b80637cb64759146106b057806381d48808146106d05780638462151c146106f057600080fd5b80632eb4a7ab116102a057806355f804b31161023e5780636c0360eb116102185780636c0360eb1461064657806370a082311461065b578063711b9e921461067b578063715018a61461069b57600080fd5b806355f804b3146105e65780636352211e1461060657806369e1cac11461062657600080fd5b806342842e0e1161027a57806342842e0e1461057c5780634707f44f1461059c5780634bffad9f146105bc5780634eabe20b146105d157600080fd5b80632eb4a7ab1461053e5780633ccfd60b14610554578063412786f61461055c57600080fd5b8063095ea7b31161030d57806320a44794116102e757806320a44794146104c757806323b872dd146104e85780632a7065ea146105085780632d6e71b61461051e57600080fd5b8063095ea7b31461046e57806309c2b9fa1461048e57806318160ddd146104ae57600080fd5b806305691ec81161034957806305691ec8146103df578063061431a81461041757806306fdde031461042c578063081812fc1461044e57600080fd5b806301ffc9a71461037057806302fe4728146103a5578063036a7a19146103c9575b600080fd5b34801561037c57600080fd5b5061039061038b3660046129e4565b610a08565b60405190151581526020015b60405180910390f35b3480156103b157600080fd5b506103bb60115481565b60405190815260200161039c565b3480156103d557600080fd5b506103bb60105481565b3480156103eb57600080fd5b506012546103ff906001600160a01b031681565b6040516001600160a01b03909116815260200161039c565b61042a610425366004612a4c565b610a5a565b005b34801561043857600080fd5b50610441610d3f565b60405161039c9190612aef565b34801561045a57600080fd5b506103ff610469366004612b02565b610dd1565b34801561047a57600080fd5b5061042a610489366004612b30565b610e15565b34801561049a57600080fd5b5061042a6104a9366004612b02565b610ea3565b3480156104ba57600080fd5b50600154600054036103bb565b3480156104d357600080fd5b5060145461039090600160b01b900460ff1681565b3480156104f457600080fd5b5061042a610503366004612b5c565b610ed2565b34801561051457600080fd5b506103bb600c5481565b34801561052a57600080fd5b5061042a610539366004612b02565b610edd565b34801561054a57600080fd5b506103bb60155481565b61042a610f0c565b34801561056857600080fd5b5061042a610577366004612a4c565b61122e565b34801561058857600080fd5b5061042a610597366004612b5c565b61152b565b3480156105a857600080fd5b506103bb6105b7366004612b30565b611546565b3480156105c857600080fd5b5061042a611572565b3480156105dd57600080fd5b5061042a6115bd565b3480156105f257600080fd5b5061042a610601366004612b9d565b611608565b34801561061257600080fd5b506103ff610621366004612b02565b61163e565b34801561063257600080fd5b5061042a610641366004612c0e565b611650565b34801561065257600080fd5b506104416117b6565b34801561066757600080fd5b506103bb610676366004612c79565b611844565b34801561068757600080fd5b5061042a610696366004612b02565b611892565b3480156106a757600080fd5b5061042a6118c1565b3480156106bc57600080fd5b5061042a6106cb366004612b02565b6118f7565b3480156106dc57600080fd5b5061042a6106eb366004612c79565b611926565b3480156106fc57600080fd5b5061071061070b366004612c79565b611972565b60405161039c9190612c96565b34801561072957600080fd5b506008546001600160a01b03166103ff565b34801561074757600080fd5b50610441611a43565b34801561075c57600080fd5b5061042a611a52565b61042a610773366004612b02565b611a9d565b34801561078457600080fd5b5061042a610793366004612cda565b611bad565b3480156107a457600080fd5b5061042a6107b3366004612d2e565b611c43565b3480156107c457600080fd5b5060145461039090600160a81b900460ff1681565b3480156107e557600080fd5b5061042a6107f4366004612c79565b611c7d565b34801561080557600080fd5b5061042a611cc9565b34801561081a57600080fd5b506103bb600b5481565b34801561083057600080fd5b5061044161083f366004612b02565b611d0c565b34801561085057600080fd5b506103bb600e5481565b34801561086657600080fd5b50610710610875366004612e0d565b611d91565b34801561088657600080fd5b506103bb600f5481565b34801561089c57600080fd5b506014546103ff906001600160a01b031681565b3480156108bc57600080fd5b506013546103ff906001600160a01b031681565b3480156108dc57600080fd5b506103bb600a5481565b3480156108f257600080fd5b506103bb610901366004612b02565b60176020526000908152604090205481565b34801561091f57600080fd5b50610441611e47565b34801561093457600080fd5b50610390610943366004612e4e565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561097d57600080fd5b5061042a61098c366004612c79565b611e6f565b34801561099d57600080fd5b5061042a6109ac366004612c79565b611f0a565b3480156109bd57600080fd5b5060145461039090600160a01b900460ff1681565b3480156109de57600080fd5b5061042a6109ed366004612e7c565b611f56565b3480156109fe57600080fd5b506103bb600d5481565b60006001600160e01b031982166380ac58cd60e01b1480610a3957506001600160e01b03198216635b5e139f60e01b145b80610a5457506301ffc9a760e01b6001600160e01b03198316145b92915050565b60026009541415610a865760405162461bcd60e51b8152600401610a7d90612e9e565b60405180910390fd5b6002600955601454600160a81b900460ff161515600114610ab95760405162461bcd60e51b8152600401610a7d90612ed5565b600f54831115610b065760405162461bcd60e51b8152602060048201526018602482015277169bdb589a59505c195cce88105b5bdd5b9d08131a5b5a5d60421b6044820152606401610a7d565b82600a54610b149190612f22565b3414610b625760405162461bcd60e51b815260206004820152601b60248201527f5a6f6d626965417065733a20496e636f72726563742056616c756500000000006044820152606401610a7d565b6012546000906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015610bbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdf9190612f41565b1180610c6557506013546000906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015610c3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c639190612f41565b115b80610ce05750610ce0828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506015546040516bffffffffffffffffffffffff193360601b166020820152909250603401905060405160208183030381529060405280519060200120611f8b565b610d2c5760405162461bcd60e51b815260206004820152601b60248201527f5a6f6d626965417065733a204e6f742057686974656c697374656400000000006044820152606401610a7d565b610d3583611fa1565b5050600160095550565b606060028054610d4e90612f5a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7a90612f5a565b8015610dc75780601f10610d9c57610100808354040283529160200191610dc7565b820191906000526020600020905b815481529060010190602001808311610daa57829003601f168201915b5050505050905090565b6000610ddc82612074565b610df9576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610e208261163e565b9050806001600160a01b0316836001600160a01b03161415610e555760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610e755750610e738133610943565b155b15610e93576040516367d9dca160e11b815260040160405180910390fd5b610e9e83838361209f565b505050565b6008546001600160a01b03163314610ecd5760405162461bcd60e51b8152600401610a7d90612f95565b601055565b610e9e8383836120fb565b6008546001600160a01b03163314610f075760405162461bcd60e51b8152600401610a7d90612f95565b600d55565b6008546001600160a01b03163314610f365760405162461bcd60e51b8152600401610a7d90612f95565b4773d04d56650b5b66e2da3bd9306d15cd11d20f288e7380665f9ba68501d383b01b16906775b86e8fe31373a3535bf71294e5497dd3d8bd23a2650636806b686000836064610f86876028612f22565b610f909190612fe0565b604051600081818185875af1925050503d8060008114610fcc576040519150601f19603f3d011682016040523d82523d6000602084013e610fd1565b606091505b50509050806110225760405162461bcd60e51b815260206004820152601d60248201527f5a6f6d626965417065733a205472616e736665722034204661696c65640000006044820152606401610a7d565b60006001600160a01b038416606461103b88601c612f22565b6110459190612fe0565b604051600081818185875af1925050503d8060008114611081576040519150601f19603f3d011682016040523d82523d6000602084013e611086565b606091505b50509050806110d75760405162461bcd60e51b815260206004820152601d60248201527f5a6f6d626965417065733a205472616e736665722033204661696c65640000006044820152606401610a7d565b60006001600160a01b03841660646110f0896009612f22565b6110fa9190612fe0565b604051600081818185875af1925050503d8060008114611136576040519150601f19603f3d011682016040523d82523d6000602084013e61113b565b606091505b505090508061118c5760405162461bcd60e51b815260206004820152601d60248201527f5a6f6d626965417065733a205472616e736665722032204661696c65640000006044820152606401610a7d565b604051600090339047908381818185875af1925050503d80600081146111ce576040519150601f19603f3d011682016040523d82523d6000602084013e6111d3565b606091505b50509050806112245760405162461bcd60e51b815260206004820152601d60248201527f5a6f6d626965417065733a205472616e736665722031204661696c65640000006044820152606401610a7d565b5050505050505050565b600260095414156112515760405162461bcd60e51b8152600401610a7d90612e9e565b6002600955601454600160a01b900460ff1615156001146112845760405162461bcd60e51b8152600401610a7d90612ed5565b6011546112919084612f22565b81146112e95760405162461bcd60e51b815260206004820152602160248201527f5a6f6d626965417065733a20496e636f727265637420546f6b656e20436f756e6044820152601d60fa1b6064820152608401610a7d565b60005b818110156114ec57600083838381811061130857611308612ff4565b90506020020135905060176000828152602001908152602001600020546000146113745760405162461bcd60e51b815260206004820152601960248201527f5a6f6d626965417065733a20546f6b656e20436c61696d6564000000000000006044820152606401610a7d565b336012546040516331a9108f60e11b8152600481018490526001600160a01b039283169290911690636352211e90602401602060405180830381865afa1580156113c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e6919061300a565b6001600160a01b0316148061147c57506013546000906001600160a01b03166306dfe2d1336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101859052604401602060405180830381865afa158015611456573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147a9190612f41565b115b6114c85760405162461bcd60e51b815260206004820152601b60248201527f5a6f6d626965417065733a204e6f7420546f6b656e204f776e657200000000006044820152606401610a7d565b600090815260176020526040902060019055806114e481613027565b9150506112ec565b506114f683611fa1565b826010541061151c5782601060008282546115119190613042565b90915550610d359050565b60006010555050600160095550565b610e9e83838360405180602001604052806000815250611c43565b600061155183611972565b828151811061156257611562612ff4565b6020026020010151905092915050565b6008546001600160a01b0316331461159c5760405162461bcd60e51b8152600401610a7d90612f95565b6014805460ff60b01b198116600160b01b9182900460ff1615909102179055565b6008546001600160a01b031633146115e75760405162461bcd60e51b8152600401610a7d90612f95565b6014805460ff60a81b198116600160a81b9182900460ff1615909102179055565b6008546001600160a01b031633146116325760405162461bcd60e51b8152600401610a7d90612f95565b610e9e60168383612935565b60006116498261231c565b5192915050565b6008546001600160a01b0316331461167a5760405162461bcd60e51b8152600401610a7d90612f95565b6002600954141561169d5760405162461bcd60e51b8152600401610a7d90612e9e565b60026009558281146116f15760405162461bcd60e51b815260206004820152601b60248201527f5a6f6d626965417065733a204c656e677468206d69736d6174636800000000006044820152606401610a7d565b6000805b8481101561177d5761174586868381811061171257611712612ff4565b90506020020160208101906117279190612c79565b85858481811061173957611739612ff4565b90506020020135612435565b83838281811061175757611757612ff4565b90506020020135826117699190613059565b91508061177581613027565b9150506116f5565b5080600d54106117a45780600d60008282546117999190613042565b909155506117aa9050565b6000600d555b50506001600955505050565b601680546117c390612f5a565b80601f01602080910402602001604051908101604052809291908181526020018280546117ef90612f5a565b801561183c5780601f106118115761010080835404028352916020019161183c565b820191906000526020600020905b81548152906001019060200180831161181f57829003601f168201915b505050505081565b60006001600160a01b03821661186d576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146118bc5760405162461bcd60e51b8152600401610a7d90612f95565b600c55565b6008546001600160a01b031633146118eb5760405162461bcd60e51b8152600401610a7d90612f95565b6118f56000612453565b565b6008546001600160a01b031633146119215760405162461bcd60e51b8152600401610a7d90612f95565b601555565b6008546001600160a01b031633146119505760405162461bcd60e51b8152600401610a7d90612f95565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6060600061197f83611844565b90506000816001600160401b0381111561199b5761199b612d18565b6040519080825280602002602001820160405280156119c4578160200160208202803683370190505b5090506000805b60015460005403811015611a3957856001600160a01b03166119ec8261163e565b6001600160a01b03161415611a275780838381518110611a0e57611a0e612ff4565b602090810291909101015281611a2381613027565b9250505b80611a3181613027565b9150506119cb565b5090949350505050565b606060038054610d4e90612f5a565b6008546001600160a01b03163314611a7c5760405162461bcd60e51b8152600401610a7d90612f95565b6014805460ff60a01b198116600160a01b9182900460ff1615909102179055565b60026009541415611ac05760405162461bcd60e51b8152600401610a7d90612e9e565b6002600955601454600160b01b900460ff161515600114611af35760405162461bcd60e51b8152600401610a7d90612ed5565b80600b54611b019190612f22565b3414611b4f5760405162461bcd60e51b815260206004820152601b60248201527f5a6f6d626965417065733a20496e636f72726563742056616c756500000000006044820152606401610a7d565b600e54811115611b9c5760405162461bcd60e51b8152602060048201526018602482015277169bdb589a59505c195cce88105b5bdd5b9d08131a5b5a5d60421b6044820152606401610a7d565b611ba581611fa1565b506001600955565b6001600160a01b038216331415611bd75760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611c4e8484846120fb565b611c5a848484846124a5565b611c77576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b03163314611ca75760405162461bcd60e51b8152600401610a7d90612f95565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b03163314611cf35760405162461bcd60e51b8152600401610a7d90612f95565b6014805462ffffff60a01b19166201010160a01b179055565b6060611d1782612074565b611d3457604051630a14c4b560e41b815260040160405180910390fd5b6000611d3e6125a5565b9050805160001415611d5f5760405180602001604052806000815250611d8a565b80611d69846125b4565b604051602001611d7a929190613071565b6040516020818303038152906040525b9392505050565b60606000826001600160401b03811115611dad57611dad612d18565b604051908082528060200260200182016040528015611dd6578160200160208202803683370190505b50905060005b83811015611e3f5760176000868684818110611dfa57611dfa612ff4565b90506020020135815260200190815260200160002054828281518110611e2257611e22612ff4565b602090810291909101015280611e3781613027565b915050611ddc565b509392505050565b60606016604051602001611e5b91906130a0565b604051602081830303815290604052905090565b6008546001600160a01b03163314611e995760405162461bcd60e51b8152600401610a7d90612f95565b6001600160a01b038116611efe5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a7d565b611f0781612453565b50565b6008546001600160a01b03163314611f345760405162461bcd60e51b8152600401610a7d90612f95565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b03163314611f805760405162461bcd60e51b8152600401610a7d90612f95565b600a91909155600b55565b600082611f9885846126b1565b14949350505050565b323314611ff05760405162461bcd60e51b815260206004820152601a60248201527f5a6f6d626965417065733a2053656c66204d696e74204f6e6c790000000000006044820152606401610a7d565b601054600d54600c546120039190613042565b61200d9190613042565b8161201b6001546000540390565b6120259190613059565b111561206a5760405162461bcd60e51b8152602060048201526014602482015273169bdb589a59505c195cce8814dbdb190813dd5d60621b6044820152606401610a7d565b611f073382612435565b6000805482108015610a54575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006121068261231c565b80519091506000906001600160a01b0316336001600160a01b03161480612134575081516121349033610943565b8061214f57503361214484610dd1565b6001600160a01b0316145b90508061216f57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146121a45760405162a1148160e81b815260040160405180910390fd5b6001600160a01b0384166121cb57604051633a954ecd60e21b815260040160405180910390fd5b6121d8858585600161271d565b6121e8600084846000015161209f565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102179092559086018083529120549091166122d2576000548110156122d257825160008281526004602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b604080516060810182526000808252602082018190529181018290529054829081101561241c57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615159181018290529061241a5780516001600160a01b0316156123b1579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612415579392505050565b6123b1565b505b604051636f96cda160e11b815260040160405180910390fd5b61244f8282604051806020016040528060008152506127b5565b5050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b1561259957604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906124e990339089908890889060040161314c565b6020604051808303816000875af1925050508015612524575060408051601f3d908101601f1916820190925261252191810190613189565b60015b61257f573d808015612552576040519150601f19603f3d011682016040523d82523d6000602084013e612557565b606091505b508051612577576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061259d565b5060015b949350505050565b606060168054610d4e90612f5a565b6060816125d85750506040805180820190915260018152600360fc1b602082015290565b8160005b811561260257806125ec81613027565b91506125fb9050600a83612fe0565b91506125dc565b6000816001600160401b0381111561261c5761261c612d18565b6040519080825280601f01601f191660200182016040528015612646576020820181803683370190505b5090505b841561259d5761265b600183613042565b9150612668600a866131a6565b612673906030613059565b60f81b81838151811061268857612688612ff4565b60200101906001600160f81b031916908160001a9053506126aa600a86612fe0565b945061264a565b600081815b8451811015611e3f5760008582815181106126d3576126d3612ff4565b602002602001015190508083116126f9576000838152602082905260409020925061270a565b600081815260208490526040902092505b508061271581613027565b9150506126b6565b6014546001600160a01b03161580159061273f57506001600160a01b03841615155b15611c7757601454604051630a21e5fb60e11b81526001600160a01b0386811660048301528581166024830152604482018590526064820184905290911690631443cbf690608401600060405180830381600087803b1580156127a157600080fd5b505af1158015611224573d6000803e3d6000fd5b610e9e83838360016000546001600160a01b0385166127e657604051622e076360e81b815260040160405180910390fd5b836128045760405163b562e8dd60e01b815260040160405180910390fd5b612811600086838761271d565b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c018116909202179091558584526004909252822080546001600160e01b031916909317600160a01b42909216919091021790915581905b8581101561292c5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4838015612902575061290060008884886124a5565b155b15612920576040516368d2bf6b60e11b815260040160405180910390fd5b600191820191016128ab565b50600055612315565b82805461294190612f5a565b90600052602060002090601f01602090048101928261296357600085556129a9565b82601f1061297c5782800160ff198235161785556129a9565b828001600101855582156129a9579182015b828111156129a957823582559160200191906001019061298e565b506129b59291506129b9565b5090565b5b808211156129b557600081556001016129ba565b6001600160e01b031981168114611f0757600080fd5b6000602082840312156129f657600080fd5b8135611d8a816129ce565b60008083601f840112612a1357600080fd5b5081356001600160401b03811115612a2a57600080fd5b6020830191508360208260051b8501011115612a4557600080fd5b9250929050565b600080600060408486031215612a6157600080fd5b8335925060208401356001600160401b03811115612a7e57600080fd5b612a8a86828701612a01565b9497909650939450505050565b60005b83811015612ab2578181015183820152602001612a9a565b83811115611c775750506000910152565b60008151808452612adb816020860160208601612a97565b601f01601f19169290920160200192915050565b602081526000611d8a6020830184612ac3565b600060208284031215612b1457600080fd5b5035919050565b6001600160a01b0381168114611f0757600080fd5b60008060408385031215612b4357600080fd5b8235612b4e81612b1b565b946020939093013593505050565b600080600060608486031215612b7157600080fd5b8335612b7c81612b1b565b92506020840135612b8c81612b1b565b929592945050506040919091013590565b60008060208385031215612bb057600080fd5b82356001600160401b0380821115612bc757600080fd5b818501915085601f830112612bdb57600080fd5b813581811115612bea57600080fd5b866020828501011115612bfc57600080fd5b60209290920196919550909350505050565b60008060008060408587031215612c2457600080fd5b84356001600160401b0380821115612c3b57600080fd5b612c4788838901612a01565b90965094506020870135915080821115612c6057600080fd5b50612c6d87828801612a01565b95989497509550505050565b600060208284031215612c8b57600080fd5b8135611d8a81612b1b565b6020808252825182820181905260009190848201906040850190845b81811015612cce57835183529284019291840191600101612cb2565b50909695505050505050565b60008060408385031215612ced57600080fd5b8235612cf881612b1b565b915060208301358015158114612d0d57600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612d4457600080fd5b8435612d4f81612b1b565b93506020850135612d5f81612b1b565b92506040850135915060608501356001600160401b0380821115612d8257600080fd5b818701915087601f830112612d9657600080fd5b813581811115612da857612da8612d18565b604051601f8201601f19908116603f01168101908382118183101715612dd057612dd0612d18565b816040528281528a6020848701011115612de957600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060208385031215612e2057600080fd5b82356001600160401b03811115612e3657600080fd5b612e4285828601612a01565b90969095509350505050565b60008060408385031215612e6157600080fd5b8235612e6c81612b1b565b91506020830135612d0d81612b1b565b60008060408385031215612e8f57600080fd5b50508035926020909101359150565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526017908201527f5a6f6d626965417065733a204e6f742053746172746564000000000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615612f3c57612f3c612f0c565b500290565b600060208284031215612f5357600080fd5b5051919050565b600181811c90821680612f6e57607f821691505b60208210811415612f8f57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601260045260246000fd5b600082612fef57612fef612fca565b500490565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561301c57600080fd5b8151611d8a81612b1b565b600060001982141561303b5761303b612f0c565b5060010190565b60008282101561305457613054612f0c565b500390565b6000821982111561306c5761306c612f0c565b500190565b60008351613083818460208801612a97565b835190830190613097818360208801612a97565b01949350505050565b600080835481600182811c9150808316806130bc57607f831692505b60208084108214156130dc57634e487b7160e01b86526022600452602486fd5b8180156130f057600181146131015761312e565b60ff1986168952848901965061312e565b60008a81526020902060005b868110156131265781548b82015290850190830161310d565b505084890196505b50505050505061259d816718dbdb9d1c9858dd60c21b815260080190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061317f90830184612ac3565b9695505050505050565b60006020828403121561319b57600080fd5b8151611d8a816129ce565b6000826131b5576131b5612fca565b50069056fea264697066735822122004155ec517741cd31dd754b5072783af6864537e07f932c01acd492aa26b4f9064736f6c634300080b00330000000000000000000000000000000000000000000000000000000000000040df8881909db208a512aba2dfc29614616791a2af5403f521d72f29a467032e88000000000000000000000000000000000000000000000000000000000000001f68747470733a2f2f6d657461646174612e7a6f6d626965617065732e696f2f00

Deployed Bytecode

0x60806040526004361061036b5760003560e01c80637cb64759116101c6578063cb4e8326116100f7578063e8a3d48511610095578063f4e0d9ac1161006f578063f4e0d9ac14610991578063f7aa2ffc146109b1578063f7d97577146109d2578063fe60d12c146109f257600080fd5b8063e8a3d48514610913578063e985e9c514610928578063f2fde38b1461097157600080fd5b8063d7b4be24116100d1578063d7b4be2414610890578063e230dbbe146108b0578063e567cad6146108d0578063e5a342a3146108e657600080fd5b8063cb4e832614610844578063d5478d0f1461085a578063d5e13d651461087a57600080fd5b8063a22cb46511610164578063bb3790871161013e578063bb379087146107d9578063bb6d44b7146107f9578063bddb7be71461080e578063c87b56dd1461082457600080fd5b8063a22cb46514610778578063b88d4fde14610798578063b8f929ad146107b857600080fd5b80638da5cb5b116101a05780638da5cb5b1461071d57806395d89b411461073b5780639dac6ebe14610750578063a0712d681461076557600080fd5b80637cb64759146106b057806381d48808146106d05780638462151c146106f057600080fd5b80632eb4a7ab116102a057806355f804b31161023e5780636c0360eb116102185780636c0360eb1461064657806370a082311461065b578063711b9e921461067b578063715018a61461069b57600080fd5b806355f804b3146105e65780636352211e1461060657806369e1cac11461062657600080fd5b806342842e0e1161027a57806342842e0e1461057c5780634707f44f1461059c5780634bffad9f146105bc5780634eabe20b146105d157600080fd5b80632eb4a7ab1461053e5780633ccfd60b14610554578063412786f61461055c57600080fd5b8063095ea7b31161030d57806320a44794116102e757806320a44794146104c757806323b872dd146104e85780632a7065ea146105085780632d6e71b61461051e57600080fd5b8063095ea7b31461046e57806309c2b9fa1461048e57806318160ddd146104ae57600080fd5b806305691ec81161034957806305691ec8146103df578063061431a81461041757806306fdde031461042c578063081812fc1461044e57600080fd5b806301ffc9a71461037057806302fe4728146103a5578063036a7a19146103c9575b600080fd5b34801561037c57600080fd5b5061039061038b3660046129e4565b610a08565b60405190151581526020015b60405180910390f35b3480156103b157600080fd5b506103bb60115481565b60405190815260200161039c565b3480156103d557600080fd5b506103bb60105481565b3480156103eb57600080fd5b506012546103ff906001600160a01b031681565b6040516001600160a01b03909116815260200161039c565b61042a610425366004612a4c565b610a5a565b005b34801561043857600080fd5b50610441610d3f565b60405161039c9190612aef565b34801561045a57600080fd5b506103ff610469366004612b02565b610dd1565b34801561047a57600080fd5b5061042a610489366004612b30565b610e15565b34801561049a57600080fd5b5061042a6104a9366004612b02565b610ea3565b3480156104ba57600080fd5b50600154600054036103bb565b3480156104d357600080fd5b5060145461039090600160b01b900460ff1681565b3480156104f457600080fd5b5061042a610503366004612b5c565b610ed2565b34801561051457600080fd5b506103bb600c5481565b34801561052a57600080fd5b5061042a610539366004612b02565b610edd565b34801561054a57600080fd5b506103bb60155481565b61042a610f0c565b34801561056857600080fd5b5061042a610577366004612a4c565b61122e565b34801561058857600080fd5b5061042a610597366004612b5c565b61152b565b3480156105a857600080fd5b506103bb6105b7366004612b30565b611546565b3480156105c857600080fd5b5061042a611572565b3480156105dd57600080fd5b5061042a6115bd565b3480156105f257600080fd5b5061042a610601366004612b9d565b611608565b34801561061257600080fd5b506103ff610621366004612b02565b61163e565b34801561063257600080fd5b5061042a610641366004612c0e565b611650565b34801561065257600080fd5b506104416117b6565b34801561066757600080fd5b506103bb610676366004612c79565b611844565b34801561068757600080fd5b5061042a610696366004612b02565b611892565b3480156106a757600080fd5b5061042a6118c1565b3480156106bc57600080fd5b5061042a6106cb366004612b02565b6118f7565b3480156106dc57600080fd5b5061042a6106eb366004612c79565b611926565b3480156106fc57600080fd5b5061071061070b366004612c79565b611972565b60405161039c9190612c96565b34801561072957600080fd5b506008546001600160a01b03166103ff565b34801561074757600080fd5b50610441611a43565b34801561075c57600080fd5b5061042a611a52565b61042a610773366004612b02565b611a9d565b34801561078457600080fd5b5061042a610793366004612cda565b611bad565b3480156107a457600080fd5b5061042a6107b3366004612d2e565b611c43565b3480156107c457600080fd5b5060145461039090600160a81b900460ff1681565b3480156107e557600080fd5b5061042a6107f4366004612c79565b611c7d565b34801561080557600080fd5b5061042a611cc9565b34801561081a57600080fd5b506103bb600b5481565b34801561083057600080fd5b5061044161083f366004612b02565b611d0c565b34801561085057600080fd5b506103bb600e5481565b34801561086657600080fd5b50610710610875366004612e0d565b611d91565b34801561088657600080fd5b506103bb600f5481565b34801561089c57600080fd5b506014546103ff906001600160a01b031681565b3480156108bc57600080fd5b506013546103ff906001600160a01b031681565b3480156108dc57600080fd5b506103bb600a5481565b3480156108f257600080fd5b506103bb610901366004612b02565b60176020526000908152604090205481565b34801561091f57600080fd5b50610441611e47565b34801561093457600080fd5b50610390610943366004612e4e565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561097d57600080fd5b5061042a61098c366004612c79565b611e6f565b34801561099d57600080fd5b5061042a6109ac366004612c79565b611f0a565b3480156109bd57600080fd5b5060145461039090600160a01b900460ff1681565b3480156109de57600080fd5b5061042a6109ed366004612e7c565b611f56565b3480156109fe57600080fd5b506103bb600d5481565b60006001600160e01b031982166380ac58cd60e01b1480610a3957506001600160e01b03198216635b5e139f60e01b145b80610a5457506301ffc9a760e01b6001600160e01b03198316145b92915050565b60026009541415610a865760405162461bcd60e51b8152600401610a7d90612e9e565b60405180910390fd5b6002600955601454600160a81b900460ff161515600114610ab95760405162461bcd60e51b8152600401610a7d90612ed5565b600f54831115610b065760405162461bcd60e51b8152602060048201526018602482015277169bdb589a59505c195cce88105b5bdd5b9d08131a5b5a5d60421b6044820152606401610a7d565b82600a54610b149190612f22565b3414610b625760405162461bcd60e51b815260206004820152601b60248201527f5a6f6d626965417065733a20496e636f72726563742056616c756500000000006044820152606401610a7d565b6012546000906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015610bbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdf9190612f41565b1180610c6557506013546000906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015610c3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c639190612f41565b115b80610ce05750610ce0828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506015546040516bffffffffffffffffffffffff193360601b166020820152909250603401905060405160208183030381529060405280519060200120611f8b565b610d2c5760405162461bcd60e51b815260206004820152601b60248201527f5a6f6d626965417065733a204e6f742057686974656c697374656400000000006044820152606401610a7d565b610d3583611fa1565b5050600160095550565b606060028054610d4e90612f5a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7a90612f5a565b8015610dc75780601f10610d9c57610100808354040283529160200191610dc7565b820191906000526020600020905b815481529060010190602001808311610daa57829003601f168201915b5050505050905090565b6000610ddc82612074565b610df9576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610e208261163e565b9050806001600160a01b0316836001600160a01b03161415610e555760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610e755750610e738133610943565b155b15610e93576040516367d9dca160e11b815260040160405180910390fd5b610e9e83838361209f565b505050565b6008546001600160a01b03163314610ecd5760405162461bcd60e51b8152600401610a7d90612f95565b601055565b610e9e8383836120fb565b6008546001600160a01b03163314610f075760405162461bcd60e51b8152600401610a7d90612f95565b600d55565b6008546001600160a01b03163314610f365760405162461bcd60e51b8152600401610a7d90612f95565b4773d04d56650b5b66e2da3bd9306d15cd11d20f288e7380665f9ba68501d383b01b16906775b86e8fe31373a3535bf71294e5497dd3d8bd23a2650636806b686000836064610f86876028612f22565b610f909190612fe0565b604051600081818185875af1925050503d8060008114610fcc576040519150601f19603f3d011682016040523d82523d6000602084013e610fd1565b606091505b50509050806110225760405162461bcd60e51b815260206004820152601d60248201527f5a6f6d626965417065733a205472616e736665722034204661696c65640000006044820152606401610a7d565b60006001600160a01b038416606461103b88601c612f22565b6110459190612fe0565b604051600081818185875af1925050503d8060008114611081576040519150601f19603f3d011682016040523d82523d6000602084013e611086565b606091505b50509050806110d75760405162461bcd60e51b815260206004820152601d60248201527f5a6f6d626965417065733a205472616e736665722033204661696c65640000006044820152606401610a7d565b60006001600160a01b03841660646110f0896009612f22565b6110fa9190612fe0565b604051600081818185875af1925050503d8060008114611136576040519150601f19603f3d011682016040523d82523d6000602084013e61113b565b606091505b505090508061118c5760405162461bcd60e51b815260206004820152601d60248201527f5a6f6d626965417065733a205472616e736665722032204661696c65640000006044820152606401610a7d565b604051600090339047908381818185875af1925050503d80600081146111ce576040519150601f19603f3d011682016040523d82523d6000602084013e6111d3565b606091505b50509050806112245760405162461bcd60e51b815260206004820152601d60248201527f5a6f6d626965417065733a205472616e736665722031204661696c65640000006044820152606401610a7d565b5050505050505050565b600260095414156112515760405162461bcd60e51b8152600401610a7d90612e9e565b6002600955601454600160a01b900460ff1615156001146112845760405162461bcd60e51b8152600401610a7d90612ed5565b6011546112919084612f22565b81146112e95760405162461bcd60e51b815260206004820152602160248201527f5a6f6d626965417065733a20496e636f727265637420546f6b656e20436f756e6044820152601d60fa1b6064820152608401610a7d565b60005b818110156114ec57600083838381811061130857611308612ff4565b90506020020135905060176000828152602001908152602001600020546000146113745760405162461bcd60e51b815260206004820152601960248201527f5a6f6d626965417065733a20546f6b656e20436c61696d6564000000000000006044820152606401610a7d565b336012546040516331a9108f60e11b8152600481018490526001600160a01b039283169290911690636352211e90602401602060405180830381865afa1580156113c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e6919061300a565b6001600160a01b0316148061147c57506013546000906001600160a01b03166306dfe2d1336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101859052604401602060405180830381865afa158015611456573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147a9190612f41565b115b6114c85760405162461bcd60e51b815260206004820152601b60248201527f5a6f6d626965417065733a204e6f7420546f6b656e204f776e657200000000006044820152606401610a7d565b600090815260176020526040902060019055806114e481613027565b9150506112ec565b506114f683611fa1565b826010541061151c5782601060008282546115119190613042565b90915550610d359050565b60006010555050600160095550565b610e9e83838360405180602001604052806000815250611c43565b600061155183611972565b828151811061156257611562612ff4565b6020026020010151905092915050565b6008546001600160a01b0316331461159c5760405162461bcd60e51b8152600401610a7d90612f95565b6014805460ff60b01b198116600160b01b9182900460ff1615909102179055565b6008546001600160a01b031633146115e75760405162461bcd60e51b8152600401610a7d90612f95565b6014805460ff60a81b198116600160a81b9182900460ff1615909102179055565b6008546001600160a01b031633146116325760405162461bcd60e51b8152600401610a7d90612f95565b610e9e60168383612935565b60006116498261231c565b5192915050565b6008546001600160a01b0316331461167a5760405162461bcd60e51b8152600401610a7d90612f95565b6002600954141561169d5760405162461bcd60e51b8152600401610a7d90612e9e565b60026009558281146116f15760405162461bcd60e51b815260206004820152601b60248201527f5a6f6d626965417065733a204c656e677468206d69736d6174636800000000006044820152606401610a7d565b6000805b8481101561177d5761174586868381811061171257611712612ff4565b90506020020160208101906117279190612c79565b85858481811061173957611739612ff4565b90506020020135612435565b83838281811061175757611757612ff4565b90506020020135826117699190613059565b91508061177581613027565b9150506116f5565b5080600d54106117a45780600d60008282546117999190613042565b909155506117aa9050565b6000600d555b50506001600955505050565b601680546117c390612f5a565b80601f01602080910402602001604051908101604052809291908181526020018280546117ef90612f5a565b801561183c5780601f106118115761010080835404028352916020019161183c565b820191906000526020600020905b81548152906001019060200180831161181f57829003601f168201915b505050505081565b60006001600160a01b03821661186d576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146118bc5760405162461bcd60e51b8152600401610a7d90612f95565b600c55565b6008546001600160a01b031633146118eb5760405162461bcd60e51b8152600401610a7d90612f95565b6118f56000612453565b565b6008546001600160a01b031633146119215760405162461bcd60e51b8152600401610a7d90612f95565b601555565b6008546001600160a01b031633146119505760405162461bcd60e51b8152600401610a7d90612f95565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6060600061197f83611844565b90506000816001600160401b0381111561199b5761199b612d18565b6040519080825280602002602001820160405280156119c4578160200160208202803683370190505b5090506000805b60015460005403811015611a3957856001600160a01b03166119ec8261163e565b6001600160a01b03161415611a275780838381518110611a0e57611a0e612ff4565b602090810291909101015281611a2381613027565b9250505b80611a3181613027565b9150506119cb565b5090949350505050565b606060038054610d4e90612f5a565b6008546001600160a01b03163314611a7c5760405162461bcd60e51b8152600401610a7d90612f95565b6014805460ff60a01b198116600160a01b9182900460ff1615909102179055565b60026009541415611ac05760405162461bcd60e51b8152600401610a7d90612e9e565b6002600955601454600160b01b900460ff161515600114611af35760405162461bcd60e51b8152600401610a7d90612ed5565b80600b54611b019190612f22565b3414611b4f5760405162461bcd60e51b815260206004820152601b60248201527f5a6f6d626965417065733a20496e636f72726563742056616c756500000000006044820152606401610a7d565b600e54811115611b9c5760405162461bcd60e51b8152602060048201526018602482015277169bdb589a59505c195cce88105b5bdd5b9d08131a5b5a5d60421b6044820152606401610a7d565b611ba581611fa1565b506001600955565b6001600160a01b038216331415611bd75760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611c4e8484846120fb565b611c5a848484846124a5565b611c77576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b03163314611ca75760405162461bcd60e51b8152600401610a7d90612f95565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b03163314611cf35760405162461bcd60e51b8152600401610a7d90612f95565b6014805462ffffff60a01b19166201010160a01b179055565b6060611d1782612074565b611d3457604051630a14c4b560e41b815260040160405180910390fd5b6000611d3e6125a5565b9050805160001415611d5f5760405180602001604052806000815250611d8a565b80611d69846125b4565b604051602001611d7a929190613071565b6040516020818303038152906040525b9392505050565b60606000826001600160401b03811115611dad57611dad612d18565b604051908082528060200260200182016040528015611dd6578160200160208202803683370190505b50905060005b83811015611e3f5760176000868684818110611dfa57611dfa612ff4565b90506020020135815260200190815260200160002054828281518110611e2257611e22612ff4565b602090810291909101015280611e3781613027565b915050611ddc565b509392505050565b60606016604051602001611e5b91906130a0565b604051602081830303815290604052905090565b6008546001600160a01b03163314611e995760405162461bcd60e51b8152600401610a7d90612f95565b6001600160a01b038116611efe5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a7d565b611f0781612453565b50565b6008546001600160a01b03163314611f345760405162461bcd60e51b8152600401610a7d90612f95565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b03163314611f805760405162461bcd60e51b8152600401610a7d90612f95565b600a91909155600b55565b600082611f9885846126b1565b14949350505050565b323314611ff05760405162461bcd60e51b815260206004820152601a60248201527f5a6f6d626965417065733a2053656c66204d696e74204f6e6c790000000000006044820152606401610a7d565b601054600d54600c546120039190613042565b61200d9190613042565b8161201b6001546000540390565b6120259190613059565b111561206a5760405162461bcd60e51b8152602060048201526014602482015273169bdb589a59505c195cce8814dbdb190813dd5d60621b6044820152606401610a7d565b611f073382612435565b6000805482108015610a54575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006121068261231c565b80519091506000906001600160a01b0316336001600160a01b03161480612134575081516121349033610943565b8061214f57503361214484610dd1565b6001600160a01b0316145b90508061216f57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146121a45760405162a1148160e81b815260040160405180910390fd5b6001600160a01b0384166121cb57604051633a954ecd60e21b815260040160405180910390fd5b6121d8858585600161271d565b6121e8600084846000015161209f565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102179092559086018083529120549091166122d2576000548110156122d257825160008281526004602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b604080516060810182526000808252602082018190529181018290529054829081101561241c57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615159181018290529061241a5780516001600160a01b0316156123b1579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612415579392505050565b6123b1565b505b604051636f96cda160e11b815260040160405180910390fd5b61244f8282604051806020016040528060008152506127b5565b5050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b1561259957604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906124e990339089908890889060040161314c565b6020604051808303816000875af1925050508015612524575060408051601f3d908101601f1916820190925261252191810190613189565b60015b61257f573d808015612552576040519150601f19603f3d011682016040523d82523d6000602084013e612557565b606091505b508051612577576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061259d565b5060015b949350505050565b606060168054610d4e90612f5a565b6060816125d85750506040805180820190915260018152600360fc1b602082015290565b8160005b811561260257806125ec81613027565b91506125fb9050600a83612fe0565b91506125dc565b6000816001600160401b0381111561261c5761261c612d18565b6040519080825280601f01601f191660200182016040528015612646576020820181803683370190505b5090505b841561259d5761265b600183613042565b9150612668600a866131a6565b612673906030613059565b60f81b81838151811061268857612688612ff4565b60200101906001600160f81b031916908160001a9053506126aa600a86612fe0565b945061264a565b600081815b8451811015611e3f5760008582815181106126d3576126d3612ff4565b602002602001015190508083116126f9576000838152602082905260409020925061270a565b600081815260208490526040902092505b508061271581613027565b9150506126b6565b6014546001600160a01b03161580159061273f57506001600160a01b03841615155b15611c7757601454604051630a21e5fb60e11b81526001600160a01b0386811660048301528581166024830152604482018590526064820184905290911690631443cbf690608401600060405180830381600087803b1580156127a157600080fd5b505af1158015611224573d6000803e3d6000fd5b610e9e83838360016000546001600160a01b0385166127e657604051622e076360e81b815260040160405180910390fd5b836128045760405163b562e8dd60e01b815260040160405180910390fd5b612811600086838761271d565b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c018116909202179091558584526004909252822080546001600160e01b031916909317600160a01b42909216919091021790915581905b8581101561292c5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4838015612902575061290060008884886124a5565b155b15612920576040516368d2bf6b60e11b815260040160405180910390fd5b600191820191016128ab565b50600055612315565b82805461294190612f5a565b90600052602060002090601f01602090048101928261296357600085556129a9565b82601f1061297c5782800160ff198235161785556129a9565b828001600101855582156129a9579182015b828111156129a957823582559160200191906001019061298e565b506129b59291506129b9565b5090565b5b808211156129b557600081556001016129ba565b6001600160e01b031981168114611f0757600080fd5b6000602082840312156129f657600080fd5b8135611d8a816129ce565b60008083601f840112612a1357600080fd5b5081356001600160401b03811115612a2a57600080fd5b6020830191508360208260051b8501011115612a4557600080fd5b9250929050565b600080600060408486031215612a6157600080fd5b8335925060208401356001600160401b03811115612a7e57600080fd5b612a8a86828701612a01565b9497909650939450505050565b60005b83811015612ab2578181015183820152602001612a9a565b83811115611c775750506000910152565b60008151808452612adb816020860160208601612a97565b601f01601f19169290920160200192915050565b602081526000611d8a6020830184612ac3565b600060208284031215612b1457600080fd5b5035919050565b6001600160a01b0381168114611f0757600080fd5b60008060408385031215612b4357600080fd5b8235612b4e81612b1b565b946020939093013593505050565b600080600060608486031215612b7157600080fd5b8335612b7c81612b1b565b92506020840135612b8c81612b1b565b929592945050506040919091013590565b60008060208385031215612bb057600080fd5b82356001600160401b0380821115612bc757600080fd5b818501915085601f830112612bdb57600080fd5b813581811115612bea57600080fd5b866020828501011115612bfc57600080fd5b60209290920196919550909350505050565b60008060008060408587031215612c2457600080fd5b84356001600160401b0380821115612c3b57600080fd5b612c4788838901612a01565b90965094506020870135915080821115612c6057600080fd5b50612c6d87828801612a01565b95989497509550505050565b600060208284031215612c8b57600080fd5b8135611d8a81612b1b565b6020808252825182820181905260009190848201906040850190845b81811015612cce57835183529284019291840191600101612cb2565b50909695505050505050565b60008060408385031215612ced57600080fd5b8235612cf881612b1b565b915060208301358015158114612d0d57600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612d4457600080fd5b8435612d4f81612b1b565b93506020850135612d5f81612b1b565b92506040850135915060608501356001600160401b0380821115612d8257600080fd5b818701915087601f830112612d9657600080fd5b813581811115612da857612da8612d18565b604051601f8201601f19908116603f01168101908382118183101715612dd057612dd0612d18565b816040528281528a6020848701011115612de957600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060208385031215612e2057600080fd5b82356001600160401b03811115612e3657600080fd5b612e4285828601612a01565b90969095509350505050565b60008060408385031215612e6157600080fd5b8235612e6c81612b1b565b91506020830135612d0d81612b1b565b60008060408385031215612e8f57600080fd5b50508035926020909101359150565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526017908201527f5a6f6d626965417065733a204e6f742053746172746564000000000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615612f3c57612f3c612f0c565b500290565b600060208284031215612f5357600080fd5b5051919050565b600181811c90821680612f6e57607f821691505b60208210811415612f8f57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601260045260246000fd5b600082612fef57612fef612fca565b500490565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561301c57600080fd5b8151611d8a81612b1b565b600060001982141561303b5761303b612f0c565b5060010190565b60008282101561305457613054612f0c565b500390565b6000821982111561306c5761306c612f0c565b500190565b60008351613083818460208801612a97565b835190830190613097818360208801612a97565b01949350505050565b600080835481600182811c9150808316806130bc57607f831692505b60208084108214156130dc57634e487b7160e01b86526022600452602486fd5b8180156130f057600181146131015761312e565b60ff1986168952848901965061312e565b60008a81526020902060005b868110156131265781548b82015290850190830161310d565b505084890196505b50505050505061259d816718dbdb9d1c9858dd60c21b815260080190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061317f90830184612ac3565b9695505050505050565b60006020828403121561319b57600080fd5b8151611d8a816129ce565b6000826131b5576131b5612fca565b50069056fea264697066735822122004155ec517741cd31dd754b5072783af6864537e07f932c01acd492aa26b4f9064736f6c634300080b0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000000000000000000000000000000000000000040df8881909db208a512aba2dfc29614616791a2af5403f521d72f29a467032e88000000000000000000000000000000000000000000000000000000000000001f68747470733a2f2f6d657461646174612e7a6f6d626965617065732e696f2f00

-----Decoded View---------------
Arg [0] : _initURI (string): https://metadata.zombieapes.io/
Arg [1] : _merkleRoot (bytes32): 0xdf8881909db208a512aba2dfc29614616791a2af5403f521d72f29a467032e88

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : df8881909db208a512aba2dfc29614616791a2af5403f521d72f29a467032e88
Arg [2] : 000000000000000000000000000000000000000000000000000000000000001f
Arg [3] : 68747470733a2f2f6d657461646174612e7a6f6d626965617065732e696f2f00


Deployed Bytecode Sourcemap

50328:8412:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32622:305;;;;;;;;;;-1:-1:-1;32622:305:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;32622:305:0;;;;;;;;50672:31;;;;;;;;;;;;;;;;;;;738:25:1;;;726:2;711:18;50672:31:0;592:177:1;50628:35:0;;;;;;;;;;;;;;;;50710:72;;;;;;;;;;-1:-1:-1;50710:72:0;;;;-1:-1:-1;;;;;50710:72:0;;;;;;-1:-1:-1;;;;;938:32:1;;;920:51;;908:2;893:18;50710:72:0;774:203:1;51662:779:0;;;;;;:::i;:::-;;:::i;:::-;;35980:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;37483:204::-;;;;;;;;;;-1:-1:-1;37483:204:0;;;;;:::i;:::-;;:::i;37046:371::-;;;;;;;;;;-1:-1:-1;37046:371:0;;;;;:::i;:::-;;:::i;57844:116::-;;;;;;;;;;-1:-1:-1;57844:116:0;;;;;:::i;:::-;;:::i;32283:267::-;;;;;;;;;;-1:-1:-1;32519:12:0;;32327:7;32503:13;:28;32283:267;;50998:30;;;;;;;;;;-1:-1:-1;50998:30:0;;;;-1:-1:-1;;;50998:30:0;;;;;;38340:170;;;;;;;;;;-1:-1:-1;38340:170:0;;;;;:::i;:::-;;:::i;50480:30::-;;;;;;;;;;;;;;;;57968:96;;;;;;;;;;-1:-1:-1;57968:96:0;;;;;:::i;:::-;;:::i;51037:25::-;;;;;;;;;;;;;;;;55440:969;;;:::i;52449:1072::-;;;;;;;;;;-1:-1:-1;52449:1072:0;;;;;:::i;:::-;;:::i;38581:185::-;;;;;;;;;;-1:-1:-1;38581:185:0;;;;;:::i;:::-;;:::i;54751:179::-;;;;;;;;;;-1:-1:-1;54751:179:0;;;;;:::i;:::-;;:::i;57032:88::-;;;;;;;;;;;;;:::i;56927:97::-;;;;;;;;;;;;;:::i;57363:106::-;;;;;;;;;;-1:-1:-1;57363:106:0;;;;;:::i;:::-;;:::i;35789:124::-;;;;;;;;;;-1:-1:-1;35789:124:0;;;;;:::i;:::-;;:::i;54212:531::-;;;;;;;;;;-1:-1:-1;54212:531:0;;;;;:::i;:::-;;:::i;51071:26::-;;;;;;;;;;;;;:::i;32991:206::-;;;;;;;;;;-1:-1:-1;32991:206:0;;;;;:::i;:::-;;:::i;57628:96::-;;;;;;;;;;-1:-1:-1;57628:96:0;;;;;:::i;:::-;;:::i;9878:103::-;;;;;;;;;;;;;:::i;57732:104::-;;;;;;;;;;-1:-1:-1;57732:104:0;;;;;:::i;:::-;;:::i;58200:163::-;;;;;;;;;;-1:-1:-1;58200:163:0;;;;;:::i;:::-;;:::i;54938:494::-;;;;;;;;;;-1:-1:-1;54938:494:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;9227:87::-;;;;;;;;;;-1:-1:-1;9300:6:0;;-1:-1:-1;;;;;9300:6:0;9227:87;;36149:104;;;;;;;;;;;;;:::i;57128:84::-;;;;;;;;;;;;;:::i;51345:309::-;;;;;;:::i;:::-;;:::i;37759:279::-;;;;;;;;;;-1:-1:-1;37759:279:0;;;;;:::i;:::-;;:::i;38837:342::-;;;;;;;;;;-1:-1:-1;38837:342:0;;;;;:::i;:::-;;:::i;50958:33::-;;;;;;;;;;-1:-1:-1;50958:33:0;;;;-1:-1:-1;;;50958:33:0;;;;;;58371:112;;;;;;;;;;-1:-1:-1;58371:112:0;;;;;:::i;:::-;;:::i;57220:135::-;;;;;;;;;;;;;:::i;50435:36::-;;;;;;;;;;;;;;;;36324:318;;;;;;;;;;-1:-1:-1;36324:318:0;;;;;:::i;:::-;;:::i;50553:29::-;;;;;;;;;;;;;;;;53849:355;;;;;;;;;;-1:-1:-1;53849:355:0;;;;;:::i;:::-;;:::i;50589:32::-;;;;;;;;;;;;;;;;50884:29;;;;;;;;;;-1:-1:-1;50884:29:0;;;;-1:-1:-1;;;;;50884:29:0;;;50789:88;;;;;;;;;;-1:-1:-1;50789:88:0;;;;-1:-1:-1;;;;;50789:88:0;;;50392:36;;;;;;;;;;;;;;;;51106:48;;;;;;;;;;-1:-1:-1;51106:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;58607:130;;;;;;;;;;;;;:::i;38109:164::-;;;;;;;;;;-1:-1:-1;38109:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;38230:25:0;;;38206:4;38230:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;38109:164;10136:201;;;;;;;;;;-1:-1:-1;10136:201:0;;;;;:::i;:::-;;:::i;58072:120::-;;;;;;;;;;-1:-1:-1;58072:120:0;;;;;:::i;:::-;;:::i;50922:29::-;;;;;;;;;;-1:-1:-1;50922:29:0;;;;-1:-1:-1;;;50922:29:0;;;;;;57477:143;;;;;;;;;;-1:-1:-1;57477:143:0;;;;;:::i;:::-;;:::i;50517:29::-;;;;;;;;;;;;;;;;32622:305;32724:4;-1:-1:-1;;;;;;32761:40:0;;-1:-1:-1;;;32761:40:0;;:105;;-1:-1:-1;;;;;;;32818:48:0;;-1:-1:-1;;;32818:48:0;32761:105;:158;;;-1:-1:-1;;;;;;;;;;22120:40:0;;;32883:36;32741:178;32622:305;-1:-1:-1;;32622:305:0:o;51662:779::-;4201:1;4799:7;;:19;;4791:63;;;;-1:-1:-1;;;4791:63:0;;;;;;;:::i;:::-;;;;;;;;;4201:1;4932:7;:18;51809:13:::1;::::0;-1:-1:-1;;;51809:13:0;::::1;;;:21;;51826:4;51809:21;51801:57;;;;-1:-1:-1::0;;;51801:57:0::1;;;;;;;:::i;:::-;51888:12;;51877:7;:23;;51869:60;;;::::0;-1:-1:-1;;;51869:60:0;;10684:2:1;51869:60:0::1;::::0;::::1;10666:21:1::0;10723:2;10703:18;;;10696:30;-1:-1:-1;;;10742:18:1;;;10735:54;10806:18;;51869:60:0::1;10482:348:1::0;51869:60:0::1;51972:7;51961:8;;:18;;;;:::i;:::-;51948:9;:31;51940:71;;;::::0;-1:-1:-1;;;51940:71:0;;11342:2:1;51940:71:0::1;::::0;::::1;11324:21:1::0;11381:2;11361:18;;;11354:30;11420:29;11400:18;;;11393:57;11467:18;;51940:71:0::1;11140:351:1::0;51940:71:0::1;52052:12;::::0;52092:1:::1;::::0;-1:-1:-1;;;;;52052:12:0::1;52044:31;8031:10:::0;52044:45:::1;::::0;-1:-1:-1;;;;;;52044:45:0::1;::::0;;;;;;-1:-1:-1;;;;;938:32:1;;;52044:45:0::1;::::0;::::1;920:51:1::0;893:18;;52044:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;:126;;;-1:-1:-1::0;52122:19:0::1;::::0;52169:1:::1;::::0;-1:-1:-1;;;;;52122:19:0::1;52114:38;8031:10:::0;52114:52:::1;::::0;-1:-1:-1;;;;;;52114:52:0::1;::::0;;;;;;-1:-1:-1;;;;;938:32:1;;;52114:52:0::1;::::0;::::1;920:51:1::0;893:18;;52114:52:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;52044:126;:309;;;;52191:162;52232:5;;52191:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;52260:10:0::1;::::0;52303:30:::1;::::0;-1:-1:-1;;8031:10:0;11834:2:1;11830:15;11826:53;52303:30:0::1;::::0;::::1;11814:66:1::0;52260:10:0;;-1:-1:-1;11896:12:1;;;-1:-1:-1;52303:30:0::1;;;;;;;;;;;;52293:41;;;;;;52191:18;:162::i;:::-;52022:386;;;::::0;-1:-1:-1;;;52022:386:0;;12121:2:1;52022:386:0::1;::::0;::::1;12103:21:1::0;12160:2;12140:18;;;12133:30;12199:29;12179:18;;;12172:57;12246:18;;52022:386:0::1;11919:351:1::0;52022:386:0::1;52419:14;52425:7;52419:5;:14::i;:::-;-1:-1:-1::0;;4157:1:0;5111:7;:22;-1:-1:-1;51662:779:0:o;35980:100::-;36034:13;36067:5;36060:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35980:100;:::o;37483:204::-;37551:7;37576:16;37584:7;37576;:16::i;:::-;37571:64;;37601:34;;-1:-1:-1;;;37601:34:0;;;;;;;;;;;37571:64;-1:-1:-1;37655:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;37655:24:0;;37483:204::o;37046:371::-;37119:13;37135:24;37151:7;37135:15;:24::i;:::-;37119:40;;37180:5;-1:-1:-1;;;;;37174:11:0;:2;-1:-1:-1;;;;;37174:11:0;;37170:48;;;37194:24;;-1:-1:-1;;;37194:24:0;;;;;;;;;;;37170:48;8031:10;-1:-1:-1;;;;;37235:21:0;;;;;;:63;;-1:-1:-1;37261:37:0;37278:5;8031:10;38109:164;:::i;37261:37::-;37260:38;37235:63;37231:138;;;37322:35;;-1:-1:-1;;;37322:35:0;;;;;;;;;;;37231:138;37381:28;37390:2;37394:7;37403:5;37381:8;:28::i;:::-;37108:309;37046:371;;:::o;57844:116::-;9300:6;;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;57922:13:::1;:30:::0;57844:116::o;38340:170::-;38474:28;38484:4;38490:2;38494:7;38474:9;:28::i;57968:96::-;9300:6;;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;58036:8:::1;:20:::0;57968:96::o;55440:969::-;9300:6;;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;55515:21:::1;55563:42;55632;55701;55496:16;55563:42:::0;55820:3:::1;55803:13;55515:21:::0;55814:2:::1;55803:13;:::i;:::-;55802:21;;;;:::i;:::-;55775:77;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55756:96;;;55871:7;55863:49;;;::::0;-1:-1:-1;;;55863:49:0;;13690:2:1;55863:49:0::1;::::0;::::1;13672:21:1::0;13729:2;13709:18;;;13702:30;13768:31;13748:18;;;13741:59;13817:18;;55863:49:0::1;13488:353:1::0;55863:49:0::1;55926:12;-1:-1:-1::0;;;;;55944:19:0;::::1;55989:3;55972:13;:8:::0;55983:2:::1;55972:13;:::i;:::-;55971:21;;;;:::i;:::-;55944:77;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55925:96;;;56040:7;56032:49;;;::::0;-1:-1:-1;;;56032:49:0;;14048:2:1;56032:49:0::1;::::0;::::1;14030:21:1::0;14087:2;14067:18;;;14060:30;14126:31;14106:18;;;14099:59;14175:18;;56032:49:0::1;13846:353:1::0;56032:49:0::1;56095:12;-1:-1:-1::0;;;;;56113:19:0;::::1;56157:3;56141:12;:8:::0;56152:1:::1;56141:12;:::i;:::-;56140:20;;;;:::i;:::-;56113:52;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56094:71;;;56184:7;56176:49;;;::::0;-1:-1:-1;;;56176:49:0;;14406:2:1;56176:49:0::1;::::0;::::1;14388:21:1::0;14445:2;14425:18;;;14418:30;14484:31;14464:18;;;14457:59;14533:18;;56176:49:0::1;14204:353:1::0;56176:49:0::1;56257:84;::::0;56239:12:::1;::::0;8031:10;;56305:21:::1;::::0;56239:12;56257:84;56239:12;56257:84;56305:21;8031:10;56257:84:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56238:103;;;56360:7;56352:49;;;::::0;-1:-1:-1;;;56352:49:0;;14764:2:1;56352:49:0::1;::::0;::::1;14746:21:1::0;14803:2;14783:18;;;14776:30;14842:31;14822:18;;;14815:59;14891:18;;56352:49:0::1;14562:353:1::0;56352:49:0::1;55485:924;;;;;;;;55440:969::o:0;52449:1072::-;4201:1;4799:7;;:19;;4791:63;;;;-1:-1:-1;;;4791:63:0;;;;;;;:::i;:::-;4201:1;4932:7;:18;52579:9:::1;::::0;-1:-1:-1;;;52579:9:0;::::1;;;:17;;52592:4;52579:17;52571:53;;;;-1:-1:-1::0;;;52571:53:0::1;;;;;;;:::i;:::-;52687:12;::::0;52677:22:::1;::::0;:7;:22:::1;:::i;:::-;52657:42:::0;::::1;52635:125;;;::::0;-1:-1:-1;;;52635:125:0;;15122:2:1;52635:125:0::1;::::0;::::1;15104:21:1::0;15161:2;15141:18;;;15134:30;15200:34;15180:18;;;15173:62;-1:-1:-1;;;15251:18:1;;;15244:31;15292:19;;52635:125:0::1;14920:397:1::0;52635:125:0::1;52776:9;52771:577;52791:20:::0;;::::1;52771:577;;;52833:16;52852:9;;52862:1;52852:12;;;;;;;:::i;:::-;;;;;;;52833:31;;52887:13;:23;52901:8;52887:23;;;;;;;;;;;;52914:1;52887:28;52879:66;;;::::0;-1:-1:-1;;;52879:66:0;;15656:2:1;52879:66:0::1;::::0;::::1;15638:21:1::0;15695:2;15675:18;;;15668:30;15734:27;15714:18;;;15707:55;15779:18;;52879:66:0::1;15454:349:1::0;52879:66:0::1;8031:10:::0;52994:12:::1;::::0;52986:39:::1;::::0;-1:-1:-1;;;52986:39:0;;::::1;::::0;::::1;738:25:1::0;;;-1:-1:-1;;;;;52986:55:0;;::::1;::::0;52994:12;;::::1;::::0;52986:29:::1;::::0;711:18:1;;52986:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52986:55:0::1;;:245;;;-1:-1:-1::0;53075:19:0::1;::::0;53230:1:::1;::::0;-1:-1:-1;;;;;53075:19:0::1;53066:43;8031:10:::0;53066:140:::1;::::0;-1:-1:-1;;;;;;53066:140:0::1;::::0;;;;;;-1:-1:-1;;;;;16256:32:1;;;53066:140:0::1;::::0;::::1;16238:51:1::0;16305:18;;;16298:34;;;16211:18;;53066:140:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:165;52986:245;52960:334;;;::::0;-1:-1:-1;;;52960:334:0;;16545:2:1;52960:334:0::1;::::0;::::1;16527:21:1::0;16584:2;16564:18;;;16557:30;16623:29;16603:18;;;16596:57;16670:18;;52960:334:0::1;16343:351:1::0;52960:334:0::1;53309:23;::::0;;;:13:::1;:23;::::0;;;;53335:1:::1;53309:27:::0;;52813:3;::::1;::::0;::::1;:::i;:::-;;;;52771:577;;;;53358:14;53364:7;53358:5;:14::i;:::-;53404:7;53387:13;;:24;53383:131;;53445:7;53428:13;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;53383:131:0::1;::::0;-1:-1:-1;53383:131:0::1;;53501:1;53485:13;:17:::0;-1:-1:-1;;4157:1:0;5111:7;:22;-1:-1:-1;52449:1072:0:o;38581:185::-;38719:39;38736:4;38742:2;38746:7;38719:39;;;;;;;;;;;;:16;:39::i;54751:179::-;54861:7;54893:21;54907:6;54893:13;:21::i;:::-;54915:6;54893:29;;;;;;;;:::i;:::-;;;;;;;54886:36;;54751:179;;;;:::o;57032:88::-;9300:6;;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;57102:10:::1;::::0;;-1:-1:-1;;;;57088:24:0;::::1;-1:-1:-1::0;;;57102:10:0;;;::::1;;;57101:11;57088:24:::0;;::::1;;::::0;;57032:88::o;56927:97::-;9300:6;;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;57003:13:::1;::::0;;-1:-1:-1;;;;56986:30:0;::::1;-1:-1:-1::0;;;57003:13:0;;;::::1;;;57002:14;56986:30:::0;;::::1;;::::0;;56927:97::o;57363:106::-;9300:6;;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;57440:21:::1;:7;57450:11:::0;;57440:21:::1;:::i;35789:124::-:0;35853:7;35880:20;35892:7;35880:11;:20::i;:::-;:25;;35789:124;-1:-1:-1;;35789:124:0:o;54212:531::-;9300:6;;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;4201:1:::1;4799:7;;:19;;4791:63;;;;-1:-1:-1::0;;;4791:63:0::1;;;;;;;:::i;:::-;4201:1;4932:7;:18:::0;54366:30;;::::2;54358:70;;;::::0;-1:-1:-1;;;54358:70:0;;17171:2:1;54358:70:0::2;::::0;::::2;17153:21:1::0;17210:2;17190:18;;;17183:30;17249:29;17229:18;;;17222:57;17296:18;;54358:70:0::2;16969:351:1::0;54358:70:0::2;54439:17;::::0;54467:139:::2;54487:15:::0;;::::2;54467:139;;;54524:31;54534:4;;54539:1;54534:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;54543:8;;54552:1;54543:11;;;;;;;:::i;:::-;;;;;;;54524:9;:31::i;:::-;54583:8;;54592:1;54583:11;;;;;;;:::i;:::-;;;;;;;54570:24;;;;;:::i;:::-;::::0;-1:-1:-1;54504:3:0;::::2;::::0;::::2;:::i;:::-;;;;54467:139;;;;54632:9;54620:8;;:21;54616:120;;54670:9;54658:8;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;54616:120:0::2;::::0;-1:-1:-1;54616:120:0::2;;54723:1;54712:8;:12:::0;54616:120:::2;-1:-1:-1::0;;4157:1:0::1;5111:7;:22:::0;-1:-1:-1;;;54212:531:0:o;51071:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32991:206::-;33055:7;-1:-1:-1;;;;;33079:19:0;;33075:60;;33107:28;;-1:-1:-1;;;33107:28:0;;;;;;;;;;;33075:60;-1:-1:-1;;;;;;33161:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;33161:27:0;;32991:206::o;57628:96::-;9300:6;;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;57696:8:::1;:20:::0;57628:96::o;9878:103::-;9300:6;;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;9943:30:::1;9970:1;9943:18;:30::i;:::-;9878:103::o:0;57732:104::-;9300:6;;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;57804:10:::1;:24:::0;57732:104::o;58200:163::-;9300:6;;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;58313:19:::1;:42:::0;;-1:-1:-1;;;;;;58313:42:0::1;-1:-1:-1::0;;;;;58313:42:0;;;::::1;::::0;;;::::1;::::0;;58200:163::o;54938:494::-;55025:16;55059:19;55081:17;55091:6;55081:9;:17::i;:::-;55059:39;;55109:26;55152:11;-1:-1:-1;;;;;55138:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55138:26:0;;55109:55;;55175:19;55214:9;55209:189;32519:12;;32327:7;32503:13;:28;55229:1;:17;55209:189;;;55286:6;-1:-1:-1;;;;;55272:20:0;:10;55280:1;55272:7;:10::i;:::-;-1:-1:-1;;;;;55272:20:0;;55268:119;;;55338:1;55313:9;55323:11;55313:22;;;;;;;;:::i;:::-;;;;;;;;;;:26;55358:13;;;;:::i;:::-;;;;55268:119;55248:3;;;;:::i;:::-;;;;55209:189;;;-1:-1:-1;55415:9:0;;54938:494;-1:-1:-1;;;;54938:494:0:o;36149:104::-;36205:13;36238:7;36231:14;;;;;:::i;57128:84::-;9300:6;;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;57195:9:::1;::::0;;-1:-1:-1;;;;57182:22:0;::::1;-1:-1:-1::0;;;57195:9:0;;;::::1;;;57194:10;57182:22:::0;;::::1;;::::0;;57128:84::o;51345:309::-;4201:1;4799:7;;:19;;4791:63;;;;-1:-1:-1;;;4791:63:0;;;;;;;:::i;:::-;4201:1;4932:7;:18;51425:10:::1;::::0;-1:-1:-1;;;51425:10:0;::::1;;;:18;;51439:4;51425:18;51417:54;;;;-1:-1:-1::0;;;51417:54:0::1;;;;;;;:::i;:::-;51514:7;51503:8;;:18;;;;:::i;:::-;51490:9;:31;51482:71;;;::::0;-1:-1:-1;;;51482:71:0;;11342:2:1;51482:71:0::1;::::0;::::1;11324:21:1::0;11381:2;11361:18;;;11354:30;11420:29;11400:18;;;11393:57;11467:18;;51482:71:0::1;11140:351:1::0;51482:71:0::1;51583:9;;51572:7;:20;;51564:57;;;::::0;-1:-1:-1;;;51564:57:0;;10684:2:1;51564:57:0::1;::::0;::::1;10666:21:1::0;10723:2;10703:18;;;10696:30;-1:-1:-1;;;10742:18:1;;;10735:54;10806:18;;51564:57:0::1;10482:348:1::0;51564:57:0::1;51632:14;51638:7;51632:5;:14::i;:::-;-1:-1:-1::0;4157:1:0;5111:7;:22;51345:309::o;37759:279::-;-1:-1:-1;;;;;37850:24:0;;8031:10;37850:24;37846:54;;;37883:17;;-1:-1:-1;;;37883:17:0;;;;;;;;;;;37846:54;8031:10;37913:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;37913:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;37913:53:0;;;;;;;;;;37982:48;;540:41:1;;;37913:42:0;;8031:10;37982:48;;513:18:1;37982:48:0;;;;;;;37759:279;;:::o;38837:342::-;39004:28;39014:4;39020:2;39024:7;39004:9;:28::i;:::-;39048:48;39071:4;39077:2;39081:7;39090:5;39048:22;:48::i;:::-;39043:129;;39120:40;;-1:-1:-1;;;39120:40:0;;;;;;;;;;;39043:129;38837:342;;;;:::o;58371:112::-;9300:6;;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;58447:12:::1;:28:::0;;-1:-1:-1;;;;;;58447:28:0::1;-1:-1:-1::0;;;;;58447:28:0;;;::::1;::::0;;;::::1;::::0;;58371:112::o;57220:135::-;9300:6;;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;57272:13:::1;:20:::0;;-1:-1:-1;;;;57331:16:0;-1:-1:-1;;;57331:16:0;;;57220:135::o;36324:318::-;36397:13;36428:16;36436:7;36428;:16::i;:::-;36423:59;;36453:29;;-1:-1:-1;;;36453:29:0;;;;;;;;;;;36423:59;36495:21;36519:10;:8;:10::i;:::-;36495:34;;36553:7;36547:21;36572:1;36547:26;;:87;;;;;;;;;;;;;;;;;36600:7;36609:18;:7;:16;:18::i;:::-;36583:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36547:87;36540:94;36324:318;-1:-1:-1;;;36324:318:0:o;53849:355::-;53955:16;53989:24;54030:9;-1:-1:-1;;;;;54016:31:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54016:31:0;;53989:58;;54063:9;54058:114;54078:20;;;54058:114;;;54133:13;:27;54147:9;;54157:1;54147:12;;;;;;;:::i;:::-;;;;;;;54133:27;;;;;;;;;;;;54120:7;54128:1;54120:10;;;;;;;;:::i;:::-;;;;;;;;;;:40;54100:3;;;;:::i;:::-;;;;54058:114;;;-1:-1:-1;54189:7:0;53849:355;-1:-1:-1;;;53849:355:0:o;58607:130::-;58651:13;58708:7;58691:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;58677:52;;58607:130;:::o;10136:201::-;9300:6;;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10225:22:0;::::1;10217:73;;;::::0;-1:-1:-1;;;10217:73:0;;19623:2:1;10217:73:0::1;::::0;::::1;19605:21:1::0;19662:2;19642:18;;;19635:30;19701:34;19681:18;;;19674:62;-1:-1:-1;;;19752:18:1;;;19745:36;19798:19;;10217:73:0::1;19421:402:1::0;10217:73:0::1;10301:28;10320:8;10301:18;:28::i;:::-;10136:201:::0;:::o;58072:120::-;9300:6;;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;58152:14:::1;:32:::0;;-1:-1:-1;;;;;;58152:32:0::1;-1:-1:-1::0;;;;;58152:32:0;;;::::1;::::0;;;::::1;::::0;;58072:120::o;57477:143::-;9300:6;;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;57561:8:::1;:20:::0;;;;57592:8:::1;:20:::0;57477:143::o;923:190::-;1048:4;1101;1072:25;1085:5;1092:4;1072:12;:25::i;:::-;:33;;923:190;-1:-1:-1;;;;923:190:0:o;53529:312::-;53589:9;8031:10;53589:25;53581:64;;;;-1:-1:-1;;;53581:64:0;;20030:2:1;53581:64:0;;;20012:21:1;20069:2;20049:18;;;20042:30;20108:28;20088:18;;;20081:56;20154:18;;53581:64:0;19828:350:1;53581:64:0;53728:13;;53717:8;;53706;;:19;;;;:::i;:::-;:35;;;;:::i;:::-;53694:7;53678:13;32519:12;;32327:7;32503:13;:28;;32283:267;53678:13;:23;;;;:::i;:::-;:64;;53656:134;;;;-1:-1:-1;;;53656:134:0;;20385:2:1;53656:134:0;;;20367:21:1;20424:2;20404:18;;;20397:30;-1:-1:-1;;;20443:18:1;;;20436:50;20503:18;;53656:134:0;20183:344:1;53656:134:0;53801:32;8031:10;53825:7;53801:9;:32::i;39434:144::-;39491:4;39525:13;;39515:7;:23;:55;;;;-1:-1:-1;;39543:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;39543:27:0;;;;39542:28;;39434:144::o;46639:196::-;46754:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;46754:29:0;-1:-1:-1;;;;;46754:29:0;;;;;;;;;46799:28;;46754:24;;46799:28;;;;;;;46639:196;;;:::o;42141:2112::-;42256:35;42294:20;42306:7;42294:11;:20::i;:::-;42369:18;;42256:58;;-1:-1:-1;42327:22:0;;-1:-1:-1;;;;;42353:34:0;8031:10;-1:-1:-1;;;;;42353:34:0;;:101;;;-1:-1:-1;42421:18:0;;42404:50;;8031:10;38109:164;:::i;42404:50::-;42353:154;;;-1:-1:-1;8031:10:0;42471:20;42483:7;42471:11;:20::i;:::-;-1:-1:-1;;;;;42471:36:0;;42353:154;42327:181;;42526:17;42521:66;;42552:35;;-1:-1:-1;;;42552:35:0;;;;;;;;;;;42521:66;42624:4;-1:-1:-1;;;;;42602:26:0;:13;:18;;;-1:-1:-1;;;;;42602:26:0;;42598:67;;42637:28;;-1:-1:-1;;;42637:28:0;;;;;;;;;;;42598:67;-1:-1:-1;;;;;42680:16:0;;42676:52;;42705:23;;-1:-1:-1;;;42705:23:0;;;;;;;;;;;42676:52;42741:43;42763:4;42769:2;42773:7;42782:1;42741:21;:43::i;:::-;42849:49;42866:1;42870:7;42879:13;:18;;;42849:8;:49::i;:::-;-1:-1:-1;;;;;43194:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;43194:31:0;;;-1:-1:-1;;;;;43194:31:0;;;-1:-1:-1;;43194:31:0;;;;;;;43240:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;43240:29:0;;;;;;;;;;;43286:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;43331:61:0;;;;-1:-1:-1;;;43376:15:0;43331:61;;;;;;;;;;;43666:11;;;43696:24;;;;;:29;43666:11;;43696:29;43692:445;;43921:13;;43907:11;:27;43903:219;;;43991:18;;;43959:24;;;:11;:24;;;;;;;;:50;;44074:28;;;;-1:-1:-1;;;;;44032:70:0;-1:-1:-1;;;44032:70:0;-1:-1:-1;;;;;;44032:70:0;;;-1:-1:-1;;;;;43959:50:0;;;44032:70;;;;;;;43903:219;43169:979;44184:7;44180:2;-1:-1:-1;;;;;44165:27:0;44174:4;-1:-1:-1;;;;;44165:27:0;;;;;;;;;;;44203:42;42245:2008;;42141:2112;;;:::o;34646:1081::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;34812:13:0;;34756:7;;34805:20;;34801:859;;;34846:31;34880:17;;;:11;:17;;;;;;;;;34846:51;;;;;;;;;-1:-1:-1;;;;;34846:51:0;;;;-1:-1:-1;;;34846:51:0;;-1:-1:-1;;;;;34846:51:0;;;;;;;;-1:-1:-1;;;34846:51:0;;;;;;;;;;;;;;34916:729;;34966:14;;-1:-1:-1;;;;;34966:28:0;;34962:101;;35030:9;34646:1081;-1:-1:-1;;;34646:1081:0:o;34962:101::-;-1:-1:-1;;;35405:6:0;35450:17;;;;:11;:17;;;;;;;;;35438:29;;;;;;;;;-1:-1:-1;;;;;35438:29:0;;;;;-1:-1:-1;;;35438:29:0;;-1:-1:-1;;;;;35438:29:0;;;;;;;;-1:-1:-1;;;35438:29:0;;;;;;;;;;;;;35498:28;35494:109;;35566:9;34646:1081;-1:-1:-1;;;34646:1081:0:o;35494:109::-;35365:261;;;34827:833;34801:859;35688:31;;-1:-1:-1;;;35688:31:0;;;;;;;;;;;39586:104;39655:27;39665:2;39669:8;39655:27;;;;;;;;;;;;:9;:27::i;:::-;39586:104;;:::o;10497:191::-;10590:6;;;-1:-1:-1;;;;;10607:17:0;;;-1:-1:-1;;;;;;10607:17:0;;;;;;;10640:40;;10590:6;;;10607:17;10590:6;;10640:40;;10571:16;;10640:40;10560:128;10497:191;:::o;47400:790::-;47555:4;-1:-1:-1;;;;;47576:13:0;;12223:19;:23;47572:611;;47612:72;;-1:-1:-1;;;47612:72:0;;-1:-1:-1;;;;;47612:36:0;;;;;:72;;8031:10;;47663:4;;47669:7;;47678:5;;47612:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47612:72:0;;;;;;;;-1:-1:-1;;47612:72:0;;;;;;;;;;;;:::i;:::-;;;47608:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47858:13:0;;47854:259;;47908:40;;-1:-1:-1;;;47908:40:0;;;;;;;;;;;47854:259;48063:6;48057:13;48048:6;48044:2;48040:15;48033:38;47608:520;-1:-1:-1;;;;;;47735:55:0;-1:-1:-1;;;47735:55:0;;-1:-1:-1;47728:62:0;;47572:611;-1:-1:-1;48167:4:0;47572:611;47400:790;;;;;;:::o;58491:108::-;58551:13;58584:7;58577:14;;;;;:::i;5513:723::-;5569:13;5790:10;5786:53;;-1:-1:-1;;5817:10:0;;;;;;;;;;;;-1:-1:-1;;;5817:10:0;;;;;5513:723::o;5786:53::-;5864:5;5849:12;5905:78;5912:9;;5905:78;;5938:8;;;;:::i;:::-;;-1:-1:-1;5961:10:0;;-1:-1:-1;5969:2:0;5961:10;;:::i;:::-;;;5905:78;;;5993:19;6025:6;-1:-1:-1;;;;;6015:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6015:17:0;;5993:39;;6043:154;6050:10;;6043:154;;6077:11;6087:1;6077:11;;:::i;:::-;;-1:-1:-1;6146:10:0;6154:2;6146:5;:10;:::i;:::-;6133:24;;:2;:24;:::i;:::-;6120:39;;6103:6;6110;6103:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;6103:56:0;;;;;;;;-1:-1:-1;6174:11:0;6183:2;6174:11;;:::i;:::-;;;6043:154;;1475:675;1558:7;1601:4;1558:7;1616:497;1640:5;:12;1636:1;:16;1616:497;;;1674:20;1697:5;1703:1;1697:8;;;;;;;;:::i;:::-;;;;;;;1674:31;;1740:12;1724;:28;1720:382;;2226:13;2276:15;;;2312:4;2305:15;;;2359:4;2343:21;;1852:57;;1720:382;;;2226:13;2276:15;;;2312:4;2305:15;;;2359:4;2343:21;;2029:57;;1720:382;-1:-1:-1;1654:3:0;;;;:::i;:::-;;;;1616:497;;56417:502;56670:14;;-1:-1:-1;;;;;56670:14:0;:28;;;;:50;;-1:-1:-1;;;;;;56702:18:0;;;;56670:50;56666:246;;;56753:14;;56737:163;;-1:-1:-1;;;56737:163:0;;-1:-1:-1;;;;;21684:15:1;;;56737:163:0;;;21666:34:1;21736:15;;;21716:18;;;21709:43;21768:18;;;21761:34;;;21811:18;;;21804:34;;;56753:14:0;;;;56737:46;;21600:19:1;;56737:163:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40053;40176:32;40182:2;40186:8;40196:5;40203:4;40614:20;40637:13;-1:-1:-1;;;;;40665:16:0;;40661:48;;40690:19;;-1:-1:-1;;;40690:19:0;;;;;;;;;;;40661:48;40724:13;40720:44;;40746:18;;-1:-1:-1;;;40746:18:0;;;;;;;;;;;40720:44;40777:61;40807:1;40811:2;40815:12;40829:8;40777:21;:61::i;:::-;-1:-1:-1;;;;;41115:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;41174:49:0;;-1:-1:-1;;;;;41115:44:0;;;;;;;41174:49;;;;-1:-1:-1;;41115:44:0;;;;;;41174:49;;;;;;;;;;;;;;;;41240:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;41290:66:0;;;;-1:-1:-1;;;41340:15:0;41290:66;;;;;;;;;;;41240:25;;41425:328;41445:8;41441:1;:12;41425:328;;;41484:38;;41509:12;;-1:-1:-1;;;;;41484:38:0;;;41501:1;;41484:38;;41501:1;;41484:38;41545:4;:68;;;;;41554:59;41585:1;41589:2;41593:12;41607:5;41554:22;:59::i;:::-;41553:60;41545:68;41541:164;;;41645:40;;-1:-1:-1;;;41645:40:0;;;;;;;;;;;41541:164;41723:14;;;;;41455:3;41425:328;;;-1:-1:-1;41769:13:0;:28;41819:60;38837:342;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;982:367::-;1045:8;1055:6;1109:3;1102:4;1094:6;1090:17;1086:27;1076:55;;1127:1;1124;1117:12;1076:55;-1:-1:-1;1150:20:1;;-1:-1:-1;;;;;1182:30:1;;1179:50;;;1225:1;1222;1215:12;1179:50;1262:4;1254:6;1250:17;1238:29;;1322:3;1315:4;1305:6;1302:1;1298:14;1290:6;1286:27;1282:38;1279:47;1276:67;;;1339:1;1336;1329:12;1276:67;982:367;;;;;:::o;1354:505::-;1449:6;1457;1465;1518:2;1506:9;1497:7;1493:23;1489:32;1486:52;;;1534:1;1531;1524:12;1486:52;1570:9;1557:23;1547:33;;1631:2;1620:9;1616:18;1603:32;-1:-1:-1;;;;;1650:6:1;1647:30;1644:50;;;1690:1;1687;1680:12;1644:50;1729:70;1791:7;1782:6;1771:9;1767:22;1729:70;:::i;:::-;1354:505;;1818:8;;-1:-1:-1;1703:96:1;;-1:-1:-1;;;;1354:505:1:o;1864:258::-;1936:1;1946:113;1960:6;1957:1;1954:13;1946:113;;;2036:11;;;2030:18;2017:11;;;2010:39;1982:2;1975:10;1946:113;;;2077:6;2074:1;2071:13;2068:48;;;-1:-1:-1;;2112:1:1;2094:16;;2087:27;1864:258::o;2127:::-;2169:3;2207:5;2201:12;2234:6;2229:3;2222:19;2250:63;2306:6;2299:4;2294:3;2290:14;2283:4;2276:5;2272:16;2250:63;:::i;:::-;2367:2;2346:15;-1:-1:-1;;2342:29:1;2333:39;;;;2374:4;2329:50;;2127:258;-1:-1:-1;;2127:258:1:o;2390:220::-;2539:2;2528:9;2521:21;2502:4;2559:45;2600:2;2589:9;2585:18;2577:6;2559:45;:::i;2615:180::-;2674:6;2727:2;2715:9;2706:7;2702:23;2698:32;2695:52;;;2743:1;2740;2733:12;2695:52;-1:-1:-1;2766:23:1;;2615:180;-1:-1:-1;2615:180:1:o;2800:131::-;-1:-1:-1;;;;;2875:31:1;;2865:42;;2855:70;;2921:1;2918;2911:12;2936:315;3004:6;3012;3065:2;3053:9;3044:7;3040:23;3036:32;3033:52;;;3081:1;3078;3071:12;3033:52;3120:9;3107:23;3139:31;3164:5;3139:31;:::i;:::-;3189:5;3241:2;3226:18;;;;3213:32;;-1:-1:-1;;;2936:315:1:o;3256:456::-;3333:6;3341;3349;3402:2;3390:9;3381:7;3377:23;3373:32;3370:52;;;3418:1;3415;3408:12;3370:52;3457:9;3444:23;3476:31;3501:5;3476:31;:::i;:::-;3526:5;-1:-1:-1;3583:2:1;3568:18;;3555:32;3596:33;3555:32;3596:33;:::i;:::-;3256:456;;3648:7;;-1:-1:-1;;;3702:2:1;3687:18;;;;3674:32;;3256:456::o;4409:592::-;4480:6;4488;4541:2;4529:9;4520:7;4516:23;4512:32;4509:52;;;4557:1;4554;4547:12;4509:52;4597:9;4584:23;-1:-1:-1;;;;;4667:2:1;4659:6;4656:14;4653:34;;;4683:1;4680;4673:12;4653:34;4721:6;4710:9;4706:22;4696:32;;4766:7;4759:4;4755:2;4751:13;4747:27;4737:55;;4788:1;4785;4778:12;4737:55;4828:2;4815:16;4854:2;4846:6;4843:14;4840:34;;;4870:1;4867;4860:12;4840:34;4915:7;4910:2;4901:6;4897:2;4893:15;4889:24;4886:37;4883:57;;;4936:1;4933;4926:12;4883:57;4967:2;4959:11;;;;;4989:6;;-1:-1:-1;4409:592:1;;-1:-1:-1;;;;4409:592:1:o;5006:773::-;5128:6;5136;5144;5152;5205:2;5193:9;5184:7;5180:23;5176:32;5173:52;;;5221:1;5218;5211:12;5173:52;5261:9;5248:23;-1:-1:-1;;;;;5331:2:1;5323:6;5320:14;5317:34;;;5347:1;5344;5337:12;5317:34;5386:70;5448:7;5439:6;5428:9;5424:22;5386:70;:::i;:::-;5475:8;;-1:-1:-1;5360:96:1;-1:-1:-1;5563:2:1;5548:18;;5535:32;;-1:-1:-1;5579:16:1;;;5576:36;;;5608:1;5605;5598:12;5576:36;;5647:72;5711:7;5700:8;5689:9;5685:24;5647:72;:::i;:::-;5006:773;;;;-1:-1:-1;5738:8:1;-1:-1:-1;;;;5006:773:1:o;5784:247::-;5843:6;5896:2;5884:9;5875:7;5871:23;5867:32;5864:52;;;5912:1;5909;5902:12;5864:52;5951:9;5938:23;5970:31;5995:5;5970:31;:::i;6221:632::-;6392:2;6444:21;;;6514:13;;6417:18;;;6536:22;;;6363:4;;6392:2;6615:15;;;;6589:2;6574:18;;;6363:4;6658:169;6672:6;6669:1;6666:13;6658:169;;;6733:13;;6721:26;;6802:15;;;;6767:12;;;;6694:1;6687:9;6658:169;;;-1:-1:-1;6844:3:1;;6221:632;-1:-1:-1;;;;;;6221:632:1:o;6858:416::-;6923:6;6931;6984:2;6972:9;6963:7;6959:23;6955:32;6952:52;;;7000:1;6997;6990:12;6952:52;7039:9;7026:23;7058:31;7083:5;7058:31;:::i;:::-;7108:5;-1:-1:-1;7165:2:1;7150:18;;7137:32;7207:15;;7200:23;7188:36;;7178:64;;7238:1;7235;7228:12;7178:64;7261:7;7251:17;;;6858:416;;;;;:::o;7279:127::-;7340:10;7335:3;7331:20;7328:1;7321:31;7371:4;7368:1;7361:15;7395:4;7392:1;7385:15;7411:1266;7506:6;7514;7522;7530;7583:3;7571:9;7562:7;7558:23;7554:33;7551:53;;;7600:1;7597;7590:12;7551:53;7639:9;7626:23;7658:31;7683:5;7658:31;:::i;:::-;7708:5;-1:-1:-1;7765:2:1;7750:18;;7737:32;7778:33;7737:32;7778:33;:::i;:::-;7830:7;-1:-1:-1;7884:2:1;7869:18;;7856:32;;-1:-1:-1;7939:2:1;7924:18;;7911:32;-1:-1:-1;;;;;7992:14:1;;;7989:34;;;8019:1;8016;8009:12;7989:34;8057:6;8046:9;8042:22;8032:32;;8102:7;8095:4;8091:2;8087:13;8083:27;8073:55;;8124:1;8121;8114:12;8073:55;8160:2;8147:16;8182:2;8178;8175:10;8172:36;;;8188:18;;:::i;:::-;8263:2;8257:9;8231:2;8317:13;;-1:-1:-1;;8313:22:1;;;8337:2;8309:31;8305:40;8293:53;;;8361:18;;;8381:22;;;8358:46;8355:72;;;8407:18;;:::i;:::-;8447:10;8443:2;8436:22;8482:2;8474:6;8467:18;8522:7;8517:2;8512;8508;8504:11;8500:20;8497:33;8494:53;;;8543:1;8540;8533:12;8494:53;8599:2;8594;8590;8586:11;8581:2;8573:6;8569:15;8556:46;8644:1;8639:2;8634;8626:6;8622:15;8618:24;8611:35;8665:6;8655:16;;;;;;;7411:1266;;;;;;;:::o;8682:437::-;8768:6;8776;8829:2;8817:9;8808:7;8804:23;8800:32;8797:52;;;8845:1;8842;8835:12;8797:52;8885:9;8872:23;-1:-1:-1;;;;;8910:6:1;8907:30;8904:50;;;8950:1;8947;8940:12;8904:50;8989:70;9051:7;9042:6;9031:9;9027:22;8989:70;:::i;:::-;9078:8;;8963:96;;-1:-1:-1;8682:437:1;-1:-1:-1;;;;8682:437:1:o;9124:388::-;9192:6;9200;9253:2;9241:9;9232:7;9228:23;9224:32;9221:52;;;9269:1;9266;9259:12;9221:52;9308:9;9295:23;9327:31;9352:5;9327:31;:::i;:::-;9377:5;-1:-1:-1;9434:2:1;9419:18;;9406:32;9447:33;9406:32;9447:33;:::i;9517:248::-;9585:6;9593;9646:2;9634:9;9625:7;9621:23;9617:32;9614:52;;;9662:1;9659;9652:12;9614:52;-1:-1:-1;;9685:23:1;;;9755:2;9740:18;;;9727:32;;-1:-1:-1;9517:248:1:o;9770:355::-;9972:2;9954:21;;;10011:2;9991:18;;;9984:30;10050:33;10045:2;10030:18;;10023:61;10116:2;10101:18;;9770:355::o;10130:347::-;10332:2;10314:21;;;10371:2;10351:18;;;10344:30;10410:25;10405:2;10390:18;;10383:53;10468:2;10453:18;;10130:347::o;10835:127::-;10896:10;10891:3;10887:20;10884:1;10877:31;10927:4;10924:1;10917:15;10951:4;10948:1;10941:15;10967:168;11007:7;11073:1;11069;11065:6;11061:14;11058:1;11055:21;11050:1;11043:9;11036:17;11032:45;11029:71;;;11080:18;;:::i;:::-;-1:-1:-1;11120:9:1;;10967:168::o;11496:184::-;11566:6;11619:2;11607:9;11598:7;11594:23;11590:32;11587:52;;;11635:1;11632;11625:12;11587:52;-1:-1:-1;11658:16:1;;11496:184;-1:-1:-1;11496:184:1:o;12275:380::-;12354:1;12350:12;;;;12397;;;12418:61;;12472:4;12464:6;12460:17;12450:27;;12418:61;12525:2;12517:6;12514:14;12494:18;12491:38;12488:161;;;12571:10;12566:3;12562:20;12559:1;12552:31;12606:4;12603:1;12596:15;12634:4;12631:1;12624:15;12488:161;;12275:380;;;:::o;12660:356::-;12862:2;12844:21;;;12881:18;;;12874:30;12940:34;12935:2;12920:18;;12913:62;13007:2;12992:18;;12660:356::o;13021:127::-;13082:10;13077:3;13073:20;13070:1;13063:31;13113:4;13110:1;13103:15;13137:4;13134:1;13127:15;13153:120;13193:1;13219;13209:35;;13224:18;;:::i;:::-;-1:-1:-1;13258:9:1;;13153:120::o;15322:127::-;15383:10;15378:3;15374:20;15371:1;15364:31;15414:4;15411:1;15404:15;15438:4;15435:1;15428:15;15808:251;15878:6;15931:2;15919:9;15910:7;15906:23;15902:32;15899:52;;;15947:1;15944;15937:12;15899:52;15979:9;15973:16;15998:31;16023:5;15998:31;:::i;16699:135::-;16738:3;-1:-1:-1;;16759:17:1;;16756:43;;;16779:18;;:::i;:::-;-1:-1:-1;16826:1:1;16815:13;;16699:135::o;16839:125::-;16879:4;16907:1;16904;16901:8;16898:34;;;16912:18;;:::i;:::-;-1:-1:-1;16949:9:1;;16839:125::o;17325:128::-;17365:3;17396:1;17392:6;17389:1;17386:13;17383:39;;;17402:18;;:::i;:::-;-1:-1:-1;17438:9:1;;17325:128::o;17458:470::-;17637:3;17675:6;17669:13;17691:53;17737:6;17732:3;17725:4;17717:6;17713:17;17691:53;:::i;:::-;17807:13;;17766:16;;;;17829:57;17807:13;17766:16;17863:4;17851:17;;17829:57;:::i;:::-;17902:20;;17458:470;-1:-1:-1;;;;17458:470:1:o;18185:1231::-;18414:3;18443:1;18476:6;18470:13;18506:3;18528:1;18556:9;18552:2;18548:18;18538:28;;18616:2;18605:9;18601:18;18638;18628:61;;18682:4;18674:6;18670:17;18660:27;;18628:61;18708:2;18756;18748:6;18745:14;18725:18;18722:38;18719:165;;;-1:-1:-1;;;18783:33:1;;18839:4;18836:1;18829:15;18869:4;18790:3;18857:17;18719:165;18900:18;18927:104;;;;19045:1;19040:320;;;;18893:467;;18927:104;-1:-1:-1;;18960:24:1;;18948:37;;19005:16;;;;-1:-1:-1;18927:104:1;;19040:320;18006:1;17999:14;;;18043:4;18030:18;;19135:1;19149:165;19163:6;19160:1;19157:13;19149:165;;;19241:14;;19228:11;;;19221:35;19284:16;;;;19178:10;;19149:165;;;19153:3;;19343:6;19338:3;19334:16;19327:23;;18893:467;;;;;;;19376:34;19406:3;-1:-1:-1;;;18124:23:1;;18172:1;18163:11;;18059:121;20532:489;-1:-1:-1;;;;;20801:15:1;;;20783:34;;20853:15;;20848:2;20833:18;;20826:43;20900:2;20885:18;;20878:34;;;20948:3;20943:2;20928:18;;20921:31;;;20726:4;;20969:46;;20995:19;;20987:6;20969:46;:::i;:::-;20961:54;20532:489;-1:-1:-1;;;;;;20532:489:1:o;21026:249::-;21095:6;21148:2;21136:9;21127:7;21123:23;21119:32;21116:52;;;21164:1;21161;21154:12;21116:52;21196:9;21190:16;21215:30;21239:5;21215:30;:::i;21280:112::-;21312:1;21338;21328:35;;21343:18;;:::i;:::-;-1:-1:-1;21377:9:1;;21280:112::o

Swarm Source

ipfs://04155ec517741cd31dd754b5072783af6864537e07f932c01acd492aa26b4f90
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.