ETH Price: $3,532.27 (-4.91%)
 

Overview

Max Total Supply

98 VITOS

Holders

71

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 VITOS
0xe2ca0b055ad5d58dc2daa61f022c86725c6afd62
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
VitoshisCastle

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// 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/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

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


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/VitoshisCastle.sol


pragma solidity ^0.8.4;




contract VitoshisCastle is ERC721Enumerable, Ownable {

  bytes32 immutable public merkleRoot;
  uint256 public constant TOTAL_SUPPLY = 6400;
  uint256 public constant MINT_PRICE = 0.04 ether;
  string public baseTokenURI;
  bool public publicMintingOpen;
  bool public whitelistMintingOpen;
  mapping(address => bool) private claimed;
  uint256 private tokenID;

  modifier CheckSupply() {
    _;
    require(tokenID <= TOTAL_SUPPLY, "Max supply reached");
  }

  constructor(bytes32 _merkleRoot, string memory _baseURI) ERC721("Vitoshis Castle", "VITOS") {
    baseTokenURI = _baseURI;
	  merkleRoot = _merkleRoot;
  }
  
  function airdrop(address[] memory airdrops) CheckSupply external onlyOwner {
    for(uint i = 0; i < airdrops.length; i++) {
      tokenID++;
	    _mint(airdrops[i], tokenID);
    }
  }

  function mintFromWhitelist(bytes32[] calldata _merkleProof) CheckSupply public payable {
    require(whitelistMintingOpen == true, "Whitelist sale hasn't started yet");
    require(MerkleProof.verify(_merkleProof, merkleRoot, keccak256(abi.encodePacked(msg.sender))), "Not whitelisted");
    require(claimed[msg.sender] == false, "Already claimed");
    require(msg.value == MINT_PRICE, "Wrong payment");
    
    claimed[msg.sender] = true;

    tokenID++;
    _mint(msg.sender, tokenID);
  }
  
  function mintFromSale(uint contestantsToMint) CheckSupply public payable {
    require(publicMintingOpen == true, "Public sale hasn't started yet");
	  require(contestantsToMint <= 5, "Only up to 5 contestants can be minted at once");
    
	  uint cost;
    unchecked { cost = contestantsToMint * MINT_PRICE; }
    require(msg.value == cost, "Wrong payment");

    for(uint i = 0; i < contestantsToMint; i++) {
      tokenID++;
	    _mint(msg.sender, tokenID);
    }
  }
  
  function startPublicSale() external onlyOwner {
	  publicMintingOpen = true;
  }

  function startWhitelistSale() external onlyOwner {
	  whitelistMintingOpen = true;
  }

  function retrieveFunds() external onlyOwner {
    payable(owner()).transfer(address(this).balance);
  }

  /// @dev Returns an URI for a given token ID
  function _baseURI() internal view virtual override returns (string memory) {
    return baseTokenURI;
  }

  /// @dev Sets the base token URI prefix.
  function setBaseTokenURI(string memory _baseTokenURI) external onlyOwner {
    baseTokenURI = _baseTokenURI;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"string","name":"_baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"airdrops","type":"address[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"contestantsToMint","type":"uint256"}],"name":"mintFromSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mintFromWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"retrieveFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startWhitelistSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistMintingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60a06040523480156200001157600080fd5b5060405162004c3f38038062004c3f833981810160405281019062000037919062000333565b6040518060400160405280600f81526020017f5669746f7368697320436173746c6500000000000000000000000000000000008152506040518060400160405280600581526020017f5649544f530000000000000000000000000000000000000000000000000000008152508160009080519060200190620000bb929190620001ee565b508060019080519060200190620000d4929190620001ee565b505050620000f7620000eb6200012060201b60201c565b6200012860201b60201c565b80600b90805190602001906200010f929190620001ee565b508160808181525050505062000541565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001fc9062000438565b90600052602060002090601f0160209004810192826200022057600085556200026c565b82601f106200023b57805160ff19168380011785556200026c565b828001600101855582156200026c579182015b828111156200026b5782518255916020019190600101906200024e565b5b5090506200027b91906200027f565b5090565b5b808211156200029a57600081600090555060010162000280565b5090565b6000620002b5620002af84620003c2565b62000399565b905082815260208101848484011115620002d457620002d362000507565b5b620002e184828562000402565b509392505050565b600081519050620002fa8162000527565b92915050565b600082601f83011262000318576200031762000502565b5b81516200032a8482602086016200029e565b91505092915050565b600080604083850312156200034d576200034c62000511565b5b60006200035d85828601620002e9565b925050602083015167ffffffffffffffff8111156200038157620003806200050c565b5b6200038f8582860162000300565b9150509250929050565b6000620003a5620003b8565b9050620003b382826200046e565b919050565b6000604051905090565b600067ffffffffffffffff821115620003e057620003df620004d3565b5b620003eb8262000516565b9050602081019050919050565b6000819050919050565b60005b838110156200042257808201518184015260208101905062000405565b8381111562000432576000848401525b50505050565b600060028204905060018216806200045157607f821691505b60208210811415620004685762000467620004a4565b5b50919050565b620004798262000516565b810181811067ffffffffffffffff821117156200049b576200049a620004d3565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6200053281620003f8565b81146200053e57600080fd5b50565b6080516146db6200056460003960008181610b0b015261136401526146db6000f3fe6080604052600436106101e35760003560e01c8063729ad39e11610102578063cc9359b611610095578063f2fde38b11610064578063f2fde38b146106d3578063f78942f3146106fc578063f8b4d98114610727578063ff44e91514610743576101e3565b8063cc9359b614610624578063d547cfb714610640578063e985e9c51461066b578063f0dff7d3146106a8576101e3565b8063a22cb465116100d1578063a22cb4651461056a578063b88d4fde14610593578063c002d23d146105bc578063c87b56dd146105e7576101e3565b8063729ad39e146104c05780638da5cb5b146104e9578063902d55a51461051457806395d89b411461053f576101e3565b80632f745c591161017a57806361b20d8c1161014957806361b20d8c146104185780636352211e1461042f57806370a082311461046c578063715018a6146104a9576101e3565b80632f745c591461034c57806330176e131461038957806342842e0e146103b25780634f6ccce7146103db576101e3565b80630c1c972a116101b65780630c1c972a146102b657806318160ddd146102cd57806323b872dd146102f85780632eb4a7ab14610321576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a91906131b6565b61075a565b60405161021c919061378d565b60405180910390f35b34801561023157600080fd5b5061023a6107d4565b60405161024791906137c3565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190613259565b610866565b6040516102849190613726565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af91906130e0565b6108eb565b005b3480156102c257600080fd5b506102cb610a03565b005b3480156102d957600080fd5b506102e2610a9c565b6040516102ef9190613b05565b60405180910390f35b34801561030457600080fd5b5061031f600480360381019061031a9190612fca565b610aa9565b005b34801561032d57600080fd5b50610336610b09565b60405161034391906137a8565b60405180910390f35b34801561035857600080fd5b50610373600480360381019061036e91906130e0565b610b2d565b6040516103809190613b05565b60405180910390f35b34801561039557600080fd5b506103b060048036038101906103ab9190613210565b610bd2565b005b3480156103be57600080fd5b506103d960048036038101906103d49190612fca565b610c68565b005b3480156103e757600080fd5b5061040260048036038101906103fd9190613259565b610c88565b60405161040f9190613b05565b60405180910390f35b34801561042457600080fd5b5061042d610cf9565b005b34801561043b57600080fd5b5061045660048036038101906104519190613259565b610dc5565b6040516104639190613726565b60405180910390f35b34801561047857600080fd5b50610493600480360381019061048e9190612f5d565b610e77565b6040516104a09190613b05565b60405180910390f35b3480156104b557600080fd5b506104be610f2f565b005b3480156104cc57600080fd5b506104e760048036038101906104e29190613120565b610fb7565b005b3480156104f557600080fd5b506104fe6110db565b60405161050b9190613726565b60405180910390f35b34801561052057600080fd5b50610529611105565b6040516105369190613b05565b60405180910390f35b34801561054b57600080fd5b5061055461110b565b60405161056191906137c3565b60405180910390f35b34801561057657600080fd5b50610591600480360381019061058c91906130a0565b61119d565b005b34801561059f57600080fd5b506105ba60048036038101906105b5919061301d565b6111b3565b005b3480156105c857600080fd5b506105d1611215565b6040516105de9190613b05565b60405180910390f35b3480156105f357600080fd5b5061060e60048036038101906106099190613259565b611220565b60405161061b91906137c3565b60405180910390f35b61063e60048036038101906106399190613169565b6112c7565b005b34801561064c57600080fd5b50610655611591565b60405161066291906137c3565b60405180910390f35b34801561067757600080fd5b50610692600480360381019061068d9190612f8a565b61161f565b60405161069f919061378d565b60405180910390f35b3480156106b457600080fd5b506106bd6116b3565b6040516106ca919061378d565b60405180910390f35b3480156106df57600080fd5b506106fa60048036038101906106f59190612f5d565b6116c6565b005b34801561070857600080fd5b506107116117be565b60405161071e919061378d565b60405180910390f35b610741600480360381019061073c9190613259565b6117d1565b005b34801561074f57600080fd5b50610758611949565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107cd57506107cc826119e2565b5b9050919050565b6060600080546107e390613d91565b80601f016020809104026020016040519081016040528092919081815260200182805461080f90613d91565b801561085c5780601f106108315761010080835404028352916020019161085c565b820191906000526020600020905b81548152906001019060200180831161083f57829003601f168201915b5050505050905090565b600061087182611ac4565b6108b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a7906139c5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108f682610dc5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095e90613a25565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610986611b30565b73ffffffffffffffffffffffffffffffffffffffff1614806109b557506109b4816109af611b30565b61161f565b5b6109f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109eb906138e5565b60405180910390fd5b6109fe8383611b38565b505050565b610a0b611b30565b73ffffffffffffffffffffffffffffffffffffffff16610a296110db565b73ffffffffffffffffffffffffffffffffffffffff1614610a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a76906139e5565b60405180910390fd5b6001600c60006101000a81548160ff021916908315150217905550565b6000600880549050905090565b610aba610ab4611b30565b82611bf1565b610af9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af090613a45565b60405180910390fd5b610b04838383611ccf565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610b3883610e77565b8210610b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b70906137e5565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610bda611b30565b73ffffffffffffffffffffffffffffffffffffffff16610bf86110db565b73ffffffffffffffffffffffffffffffffffffffff1614610c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c45906139e5565b60405180910390fd5b80600b9080519060200190610c64929190612c7d565b5050565b610c83838383604051806020016040528060008152506111b3565b505050565b6000610c92610a9c565b8210610cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cca90613a85565b60405180910390fd5b60088281548110610ce757610ce6613f4e565b5b90600052602060002001549050919050565b610d01611b30565b73ffffffffffffffffffffffffffffffffffffffff16610d1f6110db565b73ffffffffffffffffffffffffffffffffffffffff1614610d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6c906139e5565b60405180910390fd5b610d7d6110db565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610dc2573d6000803e3d6000fd5b50565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6590613945565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ee8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edf90613925565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f37611b30565b73ffffffffffffffffffffffffffffffffffffffff16610f556110db565b73ffffffffffffffffffffffffffffffffffffffff1614610fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa2906139e5565b60405180910390fd5b610fb56000611f36565b565b610fbf611b30565b73ffffffffffffffffffffffffffffffffffffffff16610fdd6110db565b73ffffffffffffffffffffffffffffffffffffffff1614611033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102a906139e5565b60405180910390fd5b60005b815181101561109057600e600081548092919061105290613df4565b919050555061107d82828151811061106d5761106c613f4e565b5b6020026020010151600e54611ffc565b808061108890613df4565b915050611036565b50611900600e5411156110d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cf90613a65565b60405180910390fd5b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61190081565b60606001805461111a90613d91565b80601f016020809104026020016040519081016040528092919081815260200182805461114690613d91565b80156111935780601f1061116857610100808354040283529160200191611193565b820191906000526020600020905b81548152906001019060200180831161117657829003601f168201915b5050505050905090565b6111af6111a8611b30565b83836121d6565b5050565b6111c46111be611b30565b83611bf1565b611203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fa90613a45565b60405180910390fd5b61120f84848484612343565b50505050565b668e1bc9bf04000081565b606061122b82611ac4565b61126a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126190613a05565b60405180910390fd5b600061127461239f565b9050600081511161129457604051806020016040528060008152506112bf565b8061129e84612431565b6040516020016112af929190613702565b6040516020818303038152906040525b915050919050565b60011515600c60019054906101000a900460ff1615151461131d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131490613965565b60405180910390fd5b6113af828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050507f00000000000000000000000000000000000000000000000000000000000000003360405160200161139491906136e7565b60405160208183030381529060405280519060200120612592565b6113ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e590613905565b60405180910390fd5b60001515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611481576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611478906139a5565b60405180910390fd5b668e1bc9bf04000034146114ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c190613ae5565b60405180910390fd5b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600e600081548092919061153590613df4565b919050555061154633600e54611ffc565b611900600e54111561158d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158490613a65565b60405180910390fd5b5050565b600b805461159e90613d91565b80601f01602080910402602001604051908101604052809291908181526020018280546115ca90613d91565b80156116175780601f106115ec57610100808354040283529160200191611617565b820191906000526020600020905b8154815290600101906020018083116115fa57829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900460ff1681565b6116ce611b30565b73ffffffffffffffffffffffffffffffffffffffff166116ec6110db565b73ffffffffffffffffffffffffffffffffffffffff1614611742576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611739906139e5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a990613825565b60405180910390fd5b6117bb81611f36565b50565b600c60019054906101000a900460ff1681565b60011515600c60009054906101000a900460ff16151514611827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181e90613ac5565b60405180910390fd5b600581111561186b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186290613aa5565b60405180910390fd5b6000668e1bc9bf040000820290508034146118bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b290613ae5565b60405180910390fd5b60005b828110156118fd57600e60008154809291906118d990613df4565b91905055506118ea33600e54611ffc565b80806118f590613df4565b9150506118be565b5050611900600e541115611946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193d90613a65565b60405180910390fd5b50565b611951611b30565b73ffffffffffffffffffffffffffffffffffffffff1661196f6110db565b73ffffffffffffffffffffffffffffffffffffffff16146119c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bc906139e5565b60405180910390fd5b6001600c60016101000a81548160ff021916908315150217905550565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611aad57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611abd5750611abc826125a9565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611bab83610dc5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611bfc82611ac4565b611c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c32906138c5565b60405180910390fd5b6000611c4683610dc5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611cb557508373ffffffffffffffffffffffffffffffffffffffff16611c9d84610866565b73ffffffffffffffffffffffffffffffffffffffff16145b80611cc65750611cc5818561161f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611cef82610dc5565b73ffffffffffffffffffffffffffffffffffffffff1614611d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3c90613845565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dac90613885565b60405180910390fd5b611dc0838383612613565b611dcb600082611b38565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e1b9190613c9d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e729190613c16565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f31838383612727565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561206c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206390613985565b60405180910390fd5b61207581611ac4565b156120b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ac90613865565b60405180910390fd5b6120c160008383612613565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121119190613c16565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121d260008383612727565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223c906138a5565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612336919061378d565b60405180910390a3505050565b61234e848484611ccf565b61235a8484848461272c565b612399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239090613805565b60405180910390fd5b50505050565b6060600b80546123ae90613d91565b80601f01602080910402602001604051908101604052809291908181526020018280546123da90613d91565b80156124275780601f106123fc57610100808354040283529160200191612427565b820191906000526020600020905b81548152906001019060200180831161240a57829003601f168201915b5050505050905090565b60606000821415612479576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061258d565b600082905060005b600082146124ab57808061249490613df4565b915050600a826124a49190613c6c565b9150612481565b60008167ffffffffffffffff8111156124c7576124c6613f7d565b5b6040519080825280601f01601f1916602001820160405280156124f95781602001600182028036833780820191505090505b5090505b60008514612586576001826125129190613c9d565b9150600a856125219190613e61565b603061252d9190613c16565b60f81b81838151811061254357612542613f4e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561257f9190613c6c565b94506124fd565b8093505050505b919050565b60008261259f85846128c3565b1490509392505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61261e838383612938565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126615761265c8161293d565b6126a0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461269f5761269e8382612986565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126e3576126de81612af3565b612722565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612721576127208282612bc4565b5b5b505050565b505050565b600061274d8473ffffffffffffffffffffffffffffffffffffffff16612c43565b156128b6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612776611b30565b8786866040518563ffffffff1660e01b81526004016127989493929190613741565b602060405180830381600087803b1580156127b257600080fd5b505af19250505080156127e357506040513d601f19601f820116820180604052508101906127e091906131e3565b60015b612866573d8060008114612813576040519150601f19603f3d011682016040523d82523d6000602084013e612818565b606091505b5060008151141561285e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285590613805565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128bb565b600190505b949350505050565b60008082905060005b845181101561292d5760008582815181106128ea576128e9613f4e565b5b6020026020010151905080831161290c576129058382612c66565b9250612919565b6129168184612c66565b92505b50808061292590613df4565b9150506128cc565b508091505092915050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161299384610e77565b61299d9190613c9d565b9050600060076000848152602001908152602001600020549050818114612a82576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612b079190613c9d565b9050600060096000848152602001908152602001600020549050600060088381548110612b3757612b36613f4e565b5b906000526020600020015490508060088381548110612b5957612b58613f4e565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612ba857612ba7613f1f565b5b6001900381819060005260206000200160009055905550505050565b6000612bcf83610e77565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b828054612c8990613d91565b90600052602060002090601f016020900481019282612cab5760008555612cf2565b82601f10612cc457805160ff1916838001178555612cf2565b82800160010185558215612cf2579182015b82811115612cf1578251825591602001919060010190612cd6565b5b509050612cff9190612d03565b5090565b5b80821115612d1c576000816000905550600101612d04565b5090565b6000612d33612d2e84613b45565b613b20565b90508083825260208201905082856020860282011115612d5657612d55613fb6565b5b60005b85811015612d865781612d6c8882612e14565b845260208401935060208301925050600181019050612d59565b5050509392505050565b6000612da3612d9e84613b71565b613b20565b905082815260208101848484011115612dbf57612dbe613fbb565b5b612dca848285613d4f565b509392505050565b6000612de5612de084613ba2565b613b20565b905082815260208101848484011115612e0157612e00613fbb565b5b612e0c848285613d4f565b509392505050565b600081359050612e2381614649565b92915050565b600082601f830112612e3e57612e3d613fb1565b5b8135612e4e848260208601612d20565b91505092915050565b60008083601f840112612e6d57612e6c613fb1565b5b8235905067ffffffffffffffff811115612e8a57612e89613fac565b5b602083019150836020820283011115612ea657612ea5613fb6565b5b9250929050565b600081359050612ebc81614660565b92915050565b600081359050612ed181614677565b92915050565b600081519050612ee681614677565b92915050565b600082601f830112612f0157612f00613fb1565b5b8135612f11848260208601612d90565b91505092915050565b600082601f830112612f2f57612f2e613fb1565b5b8135612f3f848260208601612dd2565b91505092915050565b600081359050612f578161468e565b92915050565b600060208284031215612f7357612f72613fc5565b5b6000612f8184828501612e14565b91505092915050565b60008060408385031215612fa157612fa0613fc5565b5b6000612faf85828601612e14565b9250506020612fc085828601612e14565b9150509250929050565b600080600060608486031215612fe357612fe2613fc5565b5b6000612ff186828701612e14565b935050602061300286828701612e14565b925050604061301386828701612f48565b9150509250925092565b6000806000806080858703121561303757613036613fc5565b5b600061304587828801612e14565b945050602061305687828801612e14565b935050604061306787828801612f48565b925050606085013567ffffffffffffffff81111561308857613087613fc0565b5b61309487828801612eec565b91505092959194509250565b600080604083850312156130b7576130b6613fc5565b5b60006130c585828601612e14565b92505060206130d685828601612ead565b9150509250929050565b600080604083850312156130f7576130f6613fc5565b5b600061310585828601612e14565b925050602061311685828601612f48565b9150509250929050565b60006020828403121561313657613135613fc5565b5b600082013567ffffffffffffffff81111561315457613153613fc0565b5b61316084828501612e29565b91505092915050565b600080602083850312156131805761317f613fc5565b5b600083013567ffffffffffffffff81111561319e5761319d613fc0565b5b6131aa85828601612e57565b92509250509250929050565b6000602082840312156131cc576131cb613fc5565b5b60006131da84828501612ec2565b91505092915050565b6000602082840312156131f9576131f8613fc5565b5b600061320784828501612ed7565b91505092915050565b60006020828403121561322657613225613fc5565b5b600082013567ffffffffffffffff81111561324457613243613fc0565b5b61325084828501612f1a565b91505092915050565b60006020828403121561326f5761326e613fc5565b5b600061327d84828501612f48565b91505092915050565b61328f81613cd1565b82525050565b6132a66132a182613cd1565b613e3d565b82525050565b6132b581613ce3565b82525050565b6132c481613cef565b82525050565b60006132d582613bd3565b6132df8185613be9565b93506132ef818560208601613d5e565b6132f881613fca565b840191505092915050565b600061330e82613bde565b6133188185613bfa565b9350613328818560208601613d5e565b61333181613fca565b840191505092915050565b600061334782613bde565b6133518185613c0b565b9350613361818560208601613d5e565b80840191505092915050565b600061337a602b83613bfa565b915061338582613fe8565b604082019050919050565b600061339d603283613bfa565b91506133a882614037565b604082019050919050565b60006133c0602683613bfa565b91506133cb82614086565b604082019050919050565b60006133e3602583613bfa565b91506133ee826140d5565b604082019050919050565b6000613406601c83613bfa565b915061341182614124565b602082019050919050565b6000613429602483613bfa565b91506134348261414d565b604082019050919050565b600061344c601983613bfa565b91506134578261419c565b602082019050919050565b600061346f602c83613bfa565b915061347a826141c5565b604082019050919050565b6000613492603883613bfa565b915061349d82614214565b604082019050919050565b60006134b5600f83613bfa565b91506134c082614263565b602082019050919050565b60006134d8602a83613bfa565b91506134e38261428c565b604082019050919050565b60006134fb602983613bfa565b9150613506826142db565b604082019050919050565b600061351e602183613bfa565b91506135298261432a565b604082019050919050565b6000613541602083613bfa565b915061354c82614379565b602082019050919050565b6000613564600f83613bfa565b915061356f826143a2565b602082019050919050565b6000613587602c83613bfa565b9150613592826143cb565b604082019050919050565b60006135aa602083613bfa565b91506135b58261441a565b602082019050919050565b60006135cd602f83613bfa565b91506135d882614443565b604082019050919050565b60006135f0602183613bfa565b91506135fb82614492565b604082019050919050565b6000613613603183613bfa565b915061361e826144e1565b604082019050919050565b6000613636601283613bfa565b915061364182614530565b602082019050919050565b6000613659602c83613bfa565b915061366482614559565b604082019050919050565b600061367c602e83613bfa565b9150613687826145a8565b604082019050919050565b600061369f601e83613bfa565b91506136aa826145f7565b602082019050919050565b60006136c2600d83613bfa565b91506136cd82614620565b602082019050919050565b6136e181613d45565b82525050565b60006136f38284613295565b60148201915081905092915050565b600061370e828561333c565b915061371a828461333c565b91508190509392505050565b600060208201905061373b6000830184613286565b92915050565b60006080820190506137566000830187613286565b6137636020830186613286565b61377060408301856136d8565b818103606083015261378281846132ca565b905095945050505050565b60006020820190506137a260008301846132ac565b92915050565b60006020820190506137bd60008301846132bb565b92915050565b600060208201905081810360008301526137dd8184613303565b905092915050565b600060208201905081810360008301526137fe8161336d565b9050919050565b6000602082019050818103600083015261381e81613390565b9050919050565b6000602082019050818103600083015261383e816133b3565b9050919050565b6000602082019050818103600083015261385e816133d6565b9050919050565b6000602082019050818103600083015261387e816133f9565b9050919050565b6000602082019050818103600083015261389e8161341c565b9050919050565b600060208201905081810360008301526138be8161343f565b9050919050565b600060208201905081810360008301526138de81613462565b9050919050565b600060208201905081810360008301526138fe81613485565b9050919050565b6000602082019050818103600083015261391e816134a8565b9050919050565b6000602082019050818103600083015261393e816134cb565b9050919050565b6000602082019050818103600083015261395e816134ee565b9050919050565b6000602082019050818103600083015261397e81613511565b9050919050565b6000602082019050818103600083015261399e81613534565b9050919050565b600060208201905081810360008301526139be81613557565b9050919050565b600060208201905081810360008301526139de8161357a565b9050919050565b600060208201905081810360008301526139fe8161359d565b9050919050565b60006020820190508181036000830152613a1e816135c0565b9050919050565b60006020820190508181036000830152613a3e816135e3565b9050919050565b60006020820190508181036000830152613a5e81613606565b9050919050565b60006020820190508181036000830152613a7e81613629565b9050919050565b60006020820190508181036000830152613a9e8161364c565b9050919050565b60006020820190508181036000830152613abe8161366f565b9050919050565b60006020820190508181036000830152613ade81613692565b9050919050565b60006020820190508181036000830152613afe816136b5565b9050919050565b6000602082019050613b1a60008301846136d8565b92915050565b6000613b2a613b3b565b9050613b368282613dc3565b919050565b6000604051905090565b600067ffffffffffffffff821115613b6057613b5f613f7d565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613b8c57613b8b613f7d565b5b613b9582613fca565b9050602081019050919050565b600067ffffffffffffffff821115613bbd57613bbc613f7d565b5b613bc682613fca565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c2182613d45565b9150613c2c83613d45565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c6157613c60613e92565b5b828201905092915050565b6000613c7782613d45565b9150613c8283613d45565b925082613c9257613c91613ec1565b5b828204905092915050565b6000613ca882613d45565b9150613cb383613d45565b925082821015613cc657613cc5613e92565b5b828203905092915050565b6000613cdc82613d25565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613d7c578082015181840152602081019050613d61565b83811115613d8b576000848401525b50505050565b60006002820490506001821680613da957607f821691505b60208210811415613dbd57613dbc613ef0565b5b50919050565b613dcc82613fca565b810181811067ffffffffffffffff82111715613deb57613dea613f7d565b5b80604052505050565b6000613dff82613d45565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e3257613e31613e92565b5b600182019050919050565b6000613e4882613e4f565b9050919050565b6000613e5a82613fdb565b9050919050565b6000613e6c82613d45565b9150613e7783613d45565b925082613e8757613e86613ec1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f57686974656c6973742073616c65206861736e2774207374617274656420796560008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f416c726561647920636c61696d65640000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4d617820737570706c7920726561636865640000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4f6e6c7920757020746f203520636f6e74657374616e74732063616e2062652060008201527f6d696e746564206174206f6e6365000000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206861736e27742073746172746564207965740000600082015250565b7f57726f6e67207061796d656e7400000000000000000000000000000000000000600082015250565b61465281613cd1565b811461465d57600080fd5b50565b61466981613ce3565b811461467457600080fd5b50565b61468081613cf9565b811461468b57600080fd5b50565b61469781613d45565b81146146a257600080fd5b5056fea2646970667358221220d8e4a860c5fcc0aa5f67c1182a6c7f31d2bb91e9416540b19c0b27d2ddef2ac264736f6c63430008070033500b886a907c1c515289718c6a444a34f4cccf93b4347260ce25937999457adb0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002668747470733a2f2f7669746f7368697367616d65732e636f6d2f4e46546d657461646174612f0000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101e35760003560e01c8063729ad39e11610102578063cc9359b611610095578063f2fde38b11610064578063f2fde38b146106d3578063f78942f3146106fc578063f8b4d98114610727578063ff44e91514610743576101e3565b8063cc9359b614610624578063d547cfb714610640578063e985e9c51461066b578063f0dff7d3146106a8576101e3565b8063a22cb465116100d1578063a22cb4651461056a578063b88d4fde14610593578063c002d23d146105bc578063c87b56dd146105e7576101e3565b8063729ad39e146104c05780638da5cb5b146104e9578063902d55a51461051457806395d89b411461053f576101e3565b80632f745c591161017a57806361b20d8c1161014957806361b20d8c146104185780636352211e1461042f57806370a082311461046c578063715018a6146104a9576101e3565b80632f745c591461034c57806330176e131461038957806342842e0e146103b25780634f6ccce7146103db576101e3565b80630c1c972a116101b65780630c1c972a146102b657806318160ddd146102cd57806323b872dd146102f85780632eb4a7ab14610321576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a91906131b6565b61075a565b60405161021c919061378d565b60405180910390f35b34801561023157600080fd5b5061023a6107d4565b60405161024791906137c3565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190613259565b610866565b6040516102849190613726565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af91906130e0565b6108eb565b005b3480156102c257600080fd5b506102cb610a03565b005b3480156102d957600080fd5b506102e2610a9c565b6040516102ef9190613b05565b60405180910390f35b34801561030457600080fd5b5061031f600480360381019061031a9190612fca565b610aa9565b005b34801561032d57600080fd5b50610336610b09565b60405161034391906137a8565b60405180910390f35b34801561035857600080fd5b50610373600480360381019061036e91906130e0565b610b2d565b6040516103809190613b05565b60405180910390f35b34801561039557600080fd5b506103b060048036038101906103ab9190613210565b610bd2565b005b3480156103be57600080fd5b506103d960048036038101906103d49190612fca565b610c68565b005b3480156103e757600080fd5b5061040260048036038101906103fd9190613259565b610c88565b60405161040f9190613b05565b60405180910390f35b34801561042457600080fd5b5061042d610cf9565b005b34801561043b57600080fd5b5061045660048036038101906104519190613259565b610dc5565b6040516104639190613726565b60405180910390f35b34801561047857600080fd5b50610493600480360381019061048e9190612f5d565b610e77565b6040516104a09190613b05565b60405180910390f35b3480156104b557600080fd5b506104be610f2f565b005b3480156104cc57600080fd5b506104e760048036038101906104e29190613120565b610fb7565b005b3480156104f557600080fd5b506104fe6110db565b60405161050b9190613726565b60405180910390f35b34801561052057600080fd5b50610529611105565b6040516105369190613b05565b60405180910390f35b34801561054b57600080fd5b5061055461110b565b60405161056191906137c3565b60405180910390f35b34801561057657600080fd5b50610591600480360381019061058c91906130a0565b61119d565b005b34801561059f57600080fd5b506105ba60048036038101906105b5919061301d565b6111b3565b005b3480156105c857600080fd5b506105d1611215565b6040516105de9190613b05565b60405180910390f35b3480156105f357600080fd5b5061060e60048036038101906106099190613259565b611220565b60405161061b91906137c3565b60405180910390f35b61063e60048036038101906106399190613169565b6112c7565b005b34801561064c57600080fd5b50610655611591565b60405161066291906137c3565b60405180910390f35b34801561067757600080fd5b50610692600480360381019061068d9190612f8a565b61161f565b60405161069f919061378d565b60405180910390f35b3480156106b457600080fd5b506106bd6116b3565b6040516106ca919061378d565b60405180910390f35b3480156106df57600080fd5b506106fa60048036038101906106f59190612f5d565b6116c6565b005b34801561070857600080fd5b506107116117be565b60405161071e919061378d565b60405180910390f35b610741600480360381019061073c9190613259565b6117d1565b005b34801561074f57600080fd5b50610758611949565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107cd57506107cc826119e2565b5b9050919050565b6060600080546107e390613d91565b80601f016020809104026020016040519081016040528092919081815260200182805461080f90613d91565b801561085c5780601f106108315761010080835404028352916020019161085c565b820191906000526020600020905b81548152906001019060200180831161083f57829003601f168201915b5050505050905090565b600061087182611ac4565b6108b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a7906139c5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108f682610dc5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095e90613a25565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610986611b30565b73ffffffffffffffffffffffffffffffffffffffff1614806109b557506109b4816109af611b30565b61161f565b5b6109f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109eb906138e5565b60405180910390fd5b6109fe8383611b38565b505050565b610a0b611b30565b73ffffffffffffffffffffffffffffffffffffffff16610a296110db565b73ffffffffffffffffffffffffffffffffffffffff1614610a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a76906139e5565b60405180910390fd5b6001600c60006101000a81548160ff021916908315150217905550565b6000600880549050905090565b610aba610ab4611b30565b82611bf1565b610af9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af090613a45565b60405180910390fd5b610b04838383611ccf565b505050565b7f500b886a907c1c515289718c6a444a34f4cccf93b4347260ce25937999457adb81565b6000610b3883610e77565b8210610b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b70906137e5565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610bda611b30565b73ffffffffffffffffffffffffffffffffffffffff16610bf86110db565b73ffffffffffffffffffffffffffffffffffffffff1614610c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c45906139e5565b60405180910390fd5b80600b9080519060200190610c64929190612c7d565b5050565b610c83838383604051806020016040528060008152506111b3565b505050565b6000610c92610a9c565b8210610cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cca90613a85565b60405180910390fd5b60088281548110610ce757610ce6613f4e565b5b90600052602060002001549050919050565b610d01611b30565b73ffffffffffffffffffffffffffffffffffffffff16610d1f6110db565b73ffffffffffffffffffffffffffffffffffffffff1614610d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6c906139e5565b60405180910390fd5b610d7d6110db565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610dc2573d6000803e3d6000fd5b50565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6590613945565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ee8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edf90613925565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f37611b30565b73ffffffffffffffffffffffffffffffffffffffff16610f556110db565b73ffffffffffffffffffffffffffffffffffffffff1614610fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa2906139e5565b60405180910390fd5b610fb56000611f36565b565b610fbf611b30565b73ffffffffffffffffffffffffffffffffffffffff16610fdd6110db565b73ffffffffffffffffffffffffffffffffffffffff1614611033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102a906139e5565b60405180910390fd5b60005b815181101561109057600e600081548092919061105290613df4565b919050555061107d82828151811061106d5761106c613f4e565b5b6020026020010151600e54611ffc565b808061108890613df4565b915050611036565b50611900600e5411156110d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cf90613a65565b60405180910390fd5b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61190081565b60606001805461111a90613d91565b80601f016020809104026020016040519081016040528092919081815260200182805461114690613d91565b80156111935780601f1061116857610100808354040283529160200191611193565b820191906000526020600020905b81548152906001019060200180831161117657829003601f168201915b5050505050905090565b6111af6111a8611b30565b83836121d6565b5050565b6111c46111be611b30565b83611bf1565b611203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fa90613a45565b60405180910390fd5b61120f84848484612343565b50505050565b668e1bc9bf04000081565b606061122b82611ac4565b61126a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126190613a05565b60405180910390fd5b600061127461239f565b9050600081511161129457604051806020016040528060008152506112bf565b8061129e84612431565b6040516020016112af929190613702565b6040516020818303038152906040525b915050919050565b60011515600c60019054906101000a900460ff1615151461131d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131490613965565b60405180910390fd5b6113af828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050507f500b886a907c1c515289718c6a444a34f4cccf93b4347260ce25937999457adb3360405160200161139491906136e7565b60405160208183030381529060405280519060200120612592565b6113ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e590613905565b60405180910390fd5b60001515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611481576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611478906139a5565b60405180910390fd5b668e1bc9bf04000034146114ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c190613ae5565b60405180910390fd5b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600e600081548092919061153590613df4565b919050555061154633600e54611ffc565b611900600e54111561158d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158490613a65565b60405180910390fd5b5050565b600b805461159e90613d91565b80601f01602080910402602001604051908101604052809291908181526020018280546115ca90613d91565b80156116175780601f106115ec57610100808354040283529160200191611617565b820191906000526020600020905b8154815290600101906020018083116115fa57829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900460ff1681565b6116ce611b30565b73ffffffffffffffffffffffffffffffffffffffff166116ec6110db565b73ffffffffffffffffffffffffffffffffffffffff1614611742576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611739906139e5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a990613825565b60405180910390fd5b6117bb81611f36565b50565b600c60019054906101000a900460ff1681565b60011515600c60009054906101000a900460ff16151514611827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181e90613ac5565b60405180910390fd5b600581111561186b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186290613aa5565b60405180910390fd5b6000668e1bc9bf040000820290508034146118bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b290613ae5565b60405180910390fd5b60005b828110156118fd57600e60008154809291906118d990613df4565b91905055506118ea33600e54611ffc565b80806118f590613df4565b9150506118be565b5050611900600e541115611946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193d90613a65565b60405180910390fd5b50565b611951611b30565b73ffffffffffffffffffffffffffffffffffffffff1661196f6110db565b73ffffffffffffffffffffffffffffffffffffffff16146119c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bc906139e5565b60405180910390fd5b6001600c60016101000a81548160ff021916908315150217905550565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611aad57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611abd5750611abc826125a9565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611bab83610dc5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611bfc82611ac4565b611c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c32906138c5565b60405180910390fd5b6000611c4683610dc5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611cb557508373ffffffffffffffffffffffffffffffffffffffff16611c9d84610866565b73ffffffffffffffffffffffffffffffffffffffff16145b80611cc65750611cc5818561161f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611cef82610dc5565b73ffffffffffffffffffffffffffffffffffffffff1614611d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3c90613845565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dac90613885565b60405180910390fd5b611dc0838383612613565b611dcb600082611b38565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e1b9190613c9d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e729190613c16565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f31838383612727565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561206c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206390613985565b60405180910390fd5b61207581611ac4565b156120b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ac90613865565b60405180910390fd5b6120c160008383612613565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121119190613c16565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121d260008383612727565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223c906138a5565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612336919061378d565b60405180910390a3505050565b61234e848484611ccf565b61235a8484848461272c565b612399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239090613805565b60405180910390fd5b50505050565b6060600b80546123ae90613d91565b80601f01602080910402602001604051908101604052809291908181526020018280546123da90613d91565b80156124275780601f106123fc57610100808354040283529160200191612427565b820191906000526020600020905b81548152906001019060200180831161240a57829003601f168201915b5050505050905090565b60606000821415612479576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061258d565b600082905060005b600082146124ab57808061249490613df4565b915050600a826124a49190613c6c565b9150612481565b60008167ffffffffffffffff8111156124c7576124c6613f7d565b5b6040519080825280601f01601f1916602001820160405280156124f95781602001600182028036833780820191505090505b5090505b60008514612586576001826125129190613c9d565b9150600a856125219190613e61565b603061252d9190613c16565b60f81b81838151811061254357612542613f4e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561257f9190613c6c565b94506124fd565b8093505050505b919050565b60008261259f85846128c3565b1490509392505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61261e838383612938565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126615761265c8161293d565b6126a0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461269f5761269e8382612986565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126e3576126de81612af3565b612722565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612721576127208282612bc4565b5b5b505050565b505050565b600061274d8473ffffffffffffffffffffffffffffffffffffffff16612c43565b156128b6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612776611b30565b8786866040518563ffffffff1660e01b81526004016127989493929190613741565b602060405180830381600087803b1580156127b257600080fd5b505af19250505080156127e357506040513d601f19601f820116820180604052508101906127e091906131e3565b60015b612866573d8060008114612813576040519150601f19603f3d011682016040523d82523d6000602084013e612818565b606091505b5060008151141561285e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285590613805565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128bb565b600190505b949350505050565b60008082905060005b845181101561292d5760008582815181106128ea576128e9613f4e565b5b6020026020010151905080831161290c576129058382612c66565b9250612919565b6129168184612c66565b92505b50808061292590613df4565b9150506128cc565b508091505092915050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161299384610e77565b61299d9190613c9d565b9050600060076000848152602001908152602001600020549050818114612a82576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612b079190613c9d565b9050600060096000848152602001908152602001600020549050600060088381548110612b3757612b36613f4e565b5b906000526020600020015490508060088381548110612b5957612b58613f4e565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612ba857612ba7613f1f565b5b6001900381819060005260206000200160009055905550505050565b6000612bcf83610e77565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b828054612c8990613d91565b90600052602060002090601f016020900481019282612cab5760008555612cf2565b82601f10612cc457805160ff1916838001178555612cf2565b82800160010185558215612cf2579182015b82811115612cf1578251825591602001919060010190612cd6565b5b509050612cff9190612d03565b5090565b5b80821115612d1c576000816000905550600101612d04565b5090565b6000612d33612d2e84613b45565b613b20565b90508083825260208201905082856020860282011115612d5657612d55613fb6565b5b60005b85811015612d865781612d6c8882612e14565b845260208401935060208301925050600181019050612d59565b5050509392505050565b6000612da3612d9e84613b71565b613b20565b905082815260208101848484011115612dbf57612dbe613fbb565b5b612dca848285613d4f565b509392505050565b6000612de5612de084613ba2565b613b20565b905082815260208101848484011115612e0157612e00613fbb565b5b612e0c848285613d4f565b509392505050565b600081359050612e2381614649565b92915050565b600082601f830112612e3e57612e3d613fb1565b5b8135612e4e848260208601612d20565b91505092915050565b60008083601f840112612e6d57612e6c613fb1565b5b8235905067ffffffffffffffff811115612e8a57612e89613fac565b5b602083019150836020820283011115612ea657612ea5613fb6565b5b9250929050565b600081359050612ebc81614660565b92915050565b600081359050612ed181614677565b92915050565b600081519050612ee681614677565b92915050565b600082601f830112612f0157612f00613fb1565b5b8135612f11848260208601612d90565b91505092915050565b600082601f830112612f2f57612f2e613fb1565b5b8135612f3f848260208601612dd2565b91505092915050565b600081359050612f578161468e565b92915050565b600060208284031215612f7357612f72613fc5565b5b6000612f8184828501612e14565b91505092915050565b60008060408385031215612fa157612fa0613fc5565b5b6000612faf85828601612e14565b9250506020612fc085828601612e14565b9150509250929050565b600080600060608486031215612fe357612fe2613fc5565b5b6000612ff186828701612e14565b935050602061300286828701612e14565b925050604061301386828701612f48565b9150509250925092565b6000806000806080858703121561303757613036613fc5565b5b600061304587828801612e14565b945050602061305687828801612e14565b935050604061306787828801612f48565b925050606085013567ffffffffffffffff81111561308857613087613fc0565b5b61309487828801612eec565b91505092959194509250565b600080604083850312156130b7576130b6613fc5565b5b60006130c585828601612e14565b92505060206130d685828601612ead565b9150509250929050565b600080604083850312156130f7576130f6613fc5565b5b600061310585828601612e14565b925050602061311685828601612f48565b9150509250929050565b60006020828403121561313657613135613fc5565b5b600082013567ffffffffffffffff81111561315457613153613fc0565b5b61316084828501612e29565b91505092915050565b600080602083850312156131805761317f613fc5565b5b600083013567ffffffffffffffff81111561319e5761319d613fc0565b5b6131aa85828601612e57565b92509250509250929050565b6000602082840312156131cc576131cb613fc5565b5b60006131da84828501612ec2565b91505092915050565b6000602082840312156131f9576131f8613fc5565b5b600061320784828501612ed7565b91505092915050565b60006020828403121561322657613225613fc5565b5b600082013567ffffffffffffffff81111561324457613243613fc0565b5b61325084828501612f1a565b91505092915050565b60006020828403121561326f5761326e613fc5565b5b600061327d84828501612f48565b91505092915050565b61328f81613cd1565b82525050565b6132a66132a182613cd1565b613e3d565b82525050565b6132b581613ce3565b82525050565b6132c481613cef565b82525050565b60006132d582613bd3565b6132df8185613be9565b93506132ef818560208601613d5e565b6132f881613fca565b840191505092915050565b600061330e82613bde565b6133188185613bfa565b9350613328818560208601613d5e565b61333181613fca565b840191505092915050565b600061334782613bde565b6133518185613c0b565b9350613361818560208601613d5e565b80840191505092915050565b600061337a602b83613bfa565b915061338582613fe8565b604082019050919050565b600061339d603283613bfa565b91506133a882614037565b604082019050919050565b60006133c0602683613bfa565b91506133cb82614086565b604082019050919050565b60006133e3602583613bfa565b91506133ee826140d5565b604082019050919050565b6000613406601c83613bfa565b915061341182614124565b602082019050919050565b6000613429602483613bfa565b91506134348261414d565b604082019050919050565b600061344c601983613bfa565b91506134578261419c565b602082019050919050565b600061346f602c83613bfa565b915061347a826141c5565b604082019050919050565b6000613492603883613bfa565b915061349d82614214565b604082019050919050565b60006134b5600f83613bfa565b91506134c082614263565b602082019050919050565b60006134d8602a83613bfa565b91506134e38261428c565b604082019050919050565b60006134fb602983613bfa565b9150613506826142db565b604082019050919050565b600061351e602183613bfa565b91506135298261432a565b604082019050919050565b6000613541602083613bfa565b915061354c82614379565b602082019050919050565b6000613564600f83613bfa565b915061356f826143a2565b602082019050919050565b6000613587602c83613bfa565b9150613592826143cb565b604082019050919050565b60006135aa602083613bfa565b91506135b58261441a565b602082019050919050565b60006135cd602f83613bfa565b91506135d882614443565b604082019050919050565b60006135f0602183613bfa565b91506135fb82614492565b604082019050919050565b6000613613603183613bfa565b915061361e826144e1565b604082019050919050565b6000613636601283613bfa565b915061364182614530565b602082019050919050565b6000613659602c83613bfa565b915061366482614559565b604082019050919050565b600061367c602e83613bfa565b9150613687826145a8565b604082019050919050565b600061369f601e83613bfa565b91506136aa826145f7565b602082019050919050565b60006136c2600d83613bfa565b91506136cd82614620565b602082019050919050565b6136e181613d45565b82525050565b60006136f38284613295565b60148201915081905092915050565b600061370e828561333c565b915061371a828461333c565b91508190509392505050565b600060208201905061373b6000830184613286565b92915050565b60006080820190506137566000830187613286565b6137636020830186613286565b61377060408301856136d8565b818103606083015261378281846132ca565b905095945050505050565b60006020820190506137a260008301846132ac565b92915050565b60006020820190506137bd60008301846132bb565b92915050565b600060208201905081810360008301526137dd8184613303565b905092915050565b600060208201905081810360008301526137fe8161336d565b9050919050565b6000602082019050818103600083015261381e81613390565b9050919050565b6000602082019050818103600083015261383e816133b3565b9050919050565b6000602082019050818103600083015261385e816133d6565b9050919050565b6000602082019050818103600083015261387e816133f9565b9050919050565b6000602082019050818103600083015261389e8161341c565b9050919050565b600060208201905081810360008301526138be8161343f565b9050919050565b600060208201905081810360008301526138de81613462565b9050919050565b600060208201905081810360008301526138fe81613485565b9050919050565b6000602082019050818103600083015261391e816134a8565b9050919050565b6000602082019050818103600083015261393e816134cb565b9050919050565b6000602082019050818103600083015261395e816134ee565b9050919050565b6000602082019050818103600083015261397e81613511565b9050919050565b6000602082019050818103600083015261399e81613534565b9050919050565b600060208201905081810360008301526139be81613557565b9050919050565b600060208201905081810360008301526139de8161357a565b9050919050565b600060208201905081810360008301526139fe8161359d565b9050919050565b60006020820190508181036000830152613a1e816135c0565b9050919050565b60006020820190508181036000830152613a3e816135e3565b9050919050565b60006020820190508181036000830152613a5e81613606565b9050919050565b60006020820190508181036000830152613a7e81613629565b9050919050565b60006020820190508181036000830152613a9e8161364c565b9050919050565b60006020820190508181036000830152613abe8161366f565b9050919050565b60006020820190508181036000830152613ade81613692565b9050919050565b60006020820190508181036000830152613afe816136b5565b9050919050565b6000602082019050613b1a60008301846136d8565b92915050565b6000613b2a613b3b565b9050613b368282613dc3565b919050565b6000604051905090565b600067ffffffffffffffff821115613b6057613b5f613f7d565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613b8c57613b8b613f7d565b5b613b9582613fca565b9050602081019050919050565b600067ffffffffffffffff821115613bbd57613bbc613f7d565b5b613bc682613fca565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c2182613d45565b9150613c2c83613d45565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c6157613c60613e92565b5b828201905092915050565b6000613c7782613d45565b9150613c8283613d45565b925082613c9257613c91613ec1565b5b828204905092915050565b6000613ca882613d45565b9150613cb383613d45565b925082821015613cc657613cc5613e92565b5b828203905092915050565b6000613cdc82613d25565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613d7c578082015181840152602081019050613d61565b83811115613d8b576000848401525b50505050565b60006002820490506001821680613da957607f821691505b60208210811415613dbd57613dbc613ef0565b5b50919050565b613dcc82613fca565b810181811067ffffffffffffffff82111715613deb57613dea613f7d565b5b80604052505050565b6000613dff82613d45565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e3257613e31613e92565b5b600182019050919050565b6000613e4882613e4f565b9050919050565b6000613e5a82613fdb565b9050919050565b6000613e6c82613d45565b9150613e7783613d45565b925082613e8757613e86613ec1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f57686974656c6973742073616c65206861736e2774207374617274656420796560008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f416c726561647920636c61696d65640000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4d617820737570706c7920726561636865640000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4f6e6c7920757020746f203520636f6e74657374616e74732063616e2062652060008201527f6d696e746564206174206f6e6365000000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206861736e27742073746172746564207965740000600082015250565b7f57726f6e67207061796d656e7400000000000000000000000000000000000000600082015250565b61465281613cd1565b811461465d57600080fd5b50565b61466981613ce3565b811461467457600080fd5b50565b61468081613cf9565b811461468b57600080fd5b50565b61469781613d45565b81146146a257600080fd5b5056fea2646970667358221220d8e4a860c5fcc0aa5f67c1182a6c7f31d2bb91e9416540b19c0b27d2ddef2ac264736f6c63430008070033

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

500b886a907c1c515289718c6a444a34f4cccf93b4347260ce25937999457adb0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002668747470733a2f2f7669746f7368697367616d65732e636f6d2f4e46546d657461646174612f0000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _merkleRoot (bytes32): 0x500b886a907c1c515289718c6a444a34f4cccf93b4347260ce25937999457adb
Arg [1] : _baseURI (string): https://vitoshisgames.com/NFTmetadata/

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 500b886a907c1c515289718c6a444a34f4cccf93b4347260ce25937999457adb
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000026
Arg [3] : 68747470733a2f2f7669746f7368697367616d65732e636f6d2f4e46546d6574
Arg [4] : 61646174612f0000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

47927:2459:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41703:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28523:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30082:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29605:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49771:82;;;;;;;;;;;;;:::i;:::-;;42343:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30832:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47987:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42011:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50269:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31242:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42533:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49953:105;;;;;;;;;;;;;:::i;:::-;;28217:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27947:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7119:103;;;;;;;;;;;;;:::i;:::-;;48574:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6468:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48027:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28692:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30375:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31498:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48075:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28867:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48770:503;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48127:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30601:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48158:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7377:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48192:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49281:482;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49859:88;;;;;;;;;;;;;:::i;:::-;;41703:224;41805:4;41844:35;41829:50;;;:11;:50;;;;:90;;;;41883:36;41907:11;41883:23;:36::i;:::-;41829:90;41822:97;;41703:224;;;:::o;28523:100::-;28577:13;28610:5;28603:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28523:100;:::o;30082:221::-;30158:7;30186:16;30194:7;30186;:16::i;:::-;30178:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30271:15;:24;30287:7;30271:24;;;;;;;;;;;;;;;;;;;;;30264:31;;30082:221;;;:::o;29605:411::-;29686:13;29702:23;29717:7;29702:14;:23::i;:::-;29686:39;;29750:5;29744:11;;:2;:11;;;;29736:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;29844:5;29828:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;29853:37;29870:5;29877:12;:10;:12::i;:::-;29853:16;:37::i;:::-;29828:62;29806:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;29987:21;29996:2;30000:7;29987:8;:21::i;:::-;29675:341;29605:411;;:::o;49771:82::-;6699:12;:10;:12::i;:::-;6688:23;;:7;:5;:7::i;:::-;:23;;;6680:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49843:4:::1;49823:17;;:24;;;;;;;;;;;;;;;;;;49771:82::o:0;42343:113::-;42404:7;42431:10;:17;;;;42424:24;;42343:113;:::o;30832:339::-;31027:41;31046:12;:10;:12::i;:::-;31060:7;31027:18;:41::i;:::-;31019:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31135:28;31145:4;31151:2;31155:7;31135:9;:28::i;:::-;30832:339;;;:::o;47987:35::-;;;:::o;42011:256::-;42108:7;42144:23;42161:5;42144:16;:23::i;:::-;42136:5;:31;42128:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;42233:12;:19;42246:5;42233:19;;;;;;;;;;;;;;;:26;42253:5;42233:26;;;;;;;;;;;;42226:33;;42011:256;;;;:::o;50269:114::-;6699:12;:10;:12::i;:::-;6688:23;;:7;:5;:7::i;:::-;:23;;;6680:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50364:13:::1;50349:12;:28;;;;;;;;;;;;:::i;:::-;;50269:114:::0;:::o;31242:185::-;31380:39;31397:4;31403:2;31407:7;31380:39;;;;;;;;;;;;:16;:39::i;:::-;31242:185;;;:::o;42533:233::-;42608:7;42644:30;:28;:30::i;:::-;42636:5;:38;42628:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;42741:10;42752:5;42741:17;;;;;;;;:::i;:::-;;;;;;;;;;42734:24;;42533:233;;;:::o;49953:105::-;6699:12;:10;:12::i;:::-;6688:23;;:7;:5;:7::i;:::-;:23;;;6680:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50012:7:::1;:5;:7::i;:::-;50004:25;;:48;50030:21;50004:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;49953:105::o:0;28217:239::-;28289:7;28309:13;28325:7;:16;28333:7;28325:16;;;;;;;;;;;;;;;;;;;;;28309:32;;28377:1;28360:19;;:5;:19;;;;28352:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28443:5;28436:12;;;28217:239;;;:::o;27947:208::-;28019:7;28064:1;28047:19;;:5;:19;;;;28039:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;28131:9;:16;28141:5;28131:16;;;;;;;;;;;;;;;;28124:23;;27947:208;;;:::o;7119:103::-;6699:12;:10;:12::i;:::-;6688:23;;:7;:5;:7::i;:::-;:23;;;6680:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7184:30:::1;7211:1;7184:18;:30::i;:::-;7119:103::o:0;48574:190::-;6699:12:::1;:10;:12::i;:::-;6688:23;;:7;:5;:7::i;:::-;:23;;;6680:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48660:6:::2;48656:103;48676:8;:15;48672:1;:19;48656:103;;;48707:7;;:9;;;;;;;;;:::i;:::-;;;;;;48724:27;48730:8;48739:1;48730:11;;;;;;;;:::i;:::-;;;;;;;;48743:7;;48724:5;:27::i;:::-;48693:3;;;;;:::i;:::-;;;;48656:103;;;;48066:4:::0;48350:7;;:23;;48342:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;48574:190;:::o;6468:87::-;6514:7;6541:6;;;;;;;;;;;6534:13;;6468:87;:::o;48027:43::-;48066:4;48027:43;:::o;28692:104::-;28748:13;28781:7;28774:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28692:104;:::o;30375:155::-;30470:52;30489:12;:10;:12::i;:::-;30503:8;30513;30470:18;:52::i;:::-;30375:155;;:::o;31498:328::-;31673:41;31692:12;:10;:12::i;:::-;31706:7;31673:18;:41::i;:::-;31665:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31779:39;31793:4;31799:2;31803:7;31812:5;31779:13;:39::i;:::-;31498:328;;;;:::o;48075:47::-;48112:10;48075:47;:::o;28867:334::-;28940:13;28974:16;28982:7;28974;:16::i;:::-;28966:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;29055:21;29079:10;:8;:10::i;:::-;29055:34;;29131:1;29113:7;29107:21;:25;:86;;;;;;;;;;;;;;;;;29159:7;29168:18;:7;:16;:18::i;:::-;29142:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29107:86;29100:93;;;28867:334;;;:::o;48770:503::-;48896:4:::1;48872:28;;:20;;;;;;;;;;;:28;;;48864:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;48953:85;48972:12;;48953:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48986:10;49025;49008:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;48998:39;;;;;;48953:18;:85::i;:::-;48945:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;49096:5;49073:28;;:7;:19;49081:10;49073:19;;;;;;;;;;;;;;;;;;;;;;;;;:28;;;49065:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;48112:10;49136:9;:23;49128:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;49212:4;49190:7;:19;49198:10;49190:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;49225:7;;:9;;;;;;;;;:::i;:::-;;;;;;49241:26;49247:10;49259:7;;49241:5;:26::i;:::-;48066:4:::0;48350:7;;:23;;48342:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;48770:503;;:::o;48127:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30601:164::-;30698:4;30722:18;:25;30741:5;30722:25;;;;;;;;;;;;;;;:35;30748:8;30722:35;;;;;;;;;;;;;;;;;;;;;;;;;30715:42;;30601:164;;;;:::o;48158:29::-;;;;;;;;;;;;;:::o;7377:201::-;6699:12;:10;:12::i;:::-;6688:23;;:7;:5;:7::i;:::-;:23;;;6680:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7486:1:::1;7466:22;;:8;:22;;;;7458:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7542:28;7561:8;7542:18;:28::i;:::-;7377:201:::0;:::o;48192:32::-;;;;;;;;;;;;;:::o;49281:482::-;49390:4:::1;49369:25;;:17;;;;;;;;;;;:25;;;49361:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49464:1;49443:17;:22;;49435:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;49528:9;48112:10;49563:17;:30;49556:37;;49623:4;49610:9;:17;49602:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;49658:6;49654:104;49674:17;49670:1;:21;49654:104;;;49707:7;;:9;;;;;;;;;:::i;:::-;;;;;;49724:26;49730:10;49742:7;;49724:5;:26::i;:::-;49693:3;;;;;:::i;:::-;;;;49654:104;;;;49354:409;48066:4:::0;48350:7;;:23;;48342:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;49281:482;:::o;49859:88::-;6699:12;:10;:12::i;:::-;6688:23;;:7;:5;:7::i;:::-;:23;;;6680:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49937:4:::1;49914:20;;:27;;;;;;;;;;;;;;;;;;49859:88::o:0;27578:305::-;27680:4;27732:25;27717:40;;;:11;:40;;;;:105;;;;27789:33;27774:48;;;:11;:48;;;;27717:105;:158;;;;27839:36;27863:11;27839:23;:36::i;:::-;27717:158;27697:178;;27578:305;;;:::o;33336:127::-;33401:4;33453:1;33425:30;;:7;:16;33433:7;33425:16;;;;;;;;;;;;;;;;;;;;;:30;;;;33418:37;;33336:127;;;:::o;5192:98::-;5245:7;5272:10;5265:17;;5192:98;:::o;37482:174::-;37584:2;37557:15;:24;37573:7;37557:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37640:7;37636:2;37602:46;;37611:23;37626:7;37611:14;:23::i;:::-;37602:46;;;;;;;;;;;;37482:174;;:::o;33630:348::-;33723:4;33748:16;33756:7;33748;:16::i;:::-;33740:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33824:13;33840:23;33855:7;33840:14;:23::i;:::-;33824:39;;33893:5;33882:16;;:7;:16;;;:51;;;;33926:7;33902:31;;:20;33914:7;33902:11;:20::i;:::-;:31;;;33882:51;:87;;;;33937:32;33954:5;33961:7;33937:16;:32::i;:::-;33882:87;33874:96;;;33630:348;;;;:::o;36739:625::-;36898:4;36871:31;;:23;36886:7;36871:14;:23::i;:::-;:31;;;36863:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;36977:1;36963:16;;:2;:16;;;;36955:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;37033:39;37054:4;37060:2;37064:7;37033:20;:39::i;:::-;37137:29;37154:1;37158:7;37137:8;:29::i;:::-;37198:1;37179:9;:15;37189:4;37179:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;37227:1;37210:9;:13;37220:2;37210:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37258:2;37239:7;:16;37247:7;37239:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37297:7;37293:2;37278:27;;37287:4;37278:27;;;;;;;;;;;;37318:38;37338:4;37344:2;37348:7;37318:19;:38::i;:::-;36739:625;;;:::o;7738:191::-;7812:16;7831:6;;;;;;;;;;;7812:25;;7857:8;7848:6;;:17;;;;;;;;;;;;;;;;;;7912:8;7881:40;;7902:8;7881:40;;;;;;;;;;;;7801:128;7738:191;:::o;35314:439::-;35408:1;35394:16;;:2;:16;;;;35386:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;35467:16;35475:7;35467;:16::i;:::-;35466:17;35458:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35529:45;35558:1;35562:2;35566:7;35529:20;:45::i;:::-;35604:1;35587:9;:13;35597:2;35587:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35635:2;35616:7;:16;35624:7;35616:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35680:7;35676:2;35655:33;;35672:1;35655:33;;;;;;;;;;;;35701:44;35729:1;35733:2;35737:7;35701:19;:44::i;:::-;35314:439;;:::o;37798:315::-;37953:8;37944:17;;:5;:17;;;;37936:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;38040:8;38002:18;:25;38021:5;38002:25;;;;;;;;;;;;;;;:35;38028:8;38002:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;38086:8;38064:41;;38079:5;38064:41;;;38096:8;38064:41;;;;;;:::i;:::-;;;;;;;;37798:315;;;:::o;32708:::-;32865:28;32875:4;32881:2;32885:7;32865:9;:28::i;:::-;32912:48;32935:4;32941:2;32945:7;32954:5;32912:22;:48::i;:::-;32904:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;32708:315;;;;:::o;50112:107::-;50172:13;50201:12;50194:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50112:107;:::o;2754:723::-;2810:13;3040:1;3031:5;:10;3027:53;;;3058:10;;;;;;;;;;;;;;;;;;;;;3027:53;3090:12;3105:5;3090:20;;3121:14;3146:78;3161:1;3153:4;:9;3146:78;;3179:8;;;;;:::i;:::-;;;;3210:2;3202:10;;;;;:::i;:::-;;;3146:78;;;3234:19;3266:6;3256:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3234:39;;3284:154;3300:1;3291:5;:10;3284:154;;3328:1;3318:11;;;;;:::i;:::-;;;3395:2;3387:5;:10;;;;:::i;:::-;3374:2;:24;;;;:::i;:::-;3361:39;;3344:6;3351;3344:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3424:2;3415:11;;;;;:::i;:::-;;;3284:154;;;3462:6;3448:21;;;;;2754:723;;;;:::o;923:190::-;1048:4;1101;1072:25;1085:5;1092:4;1072:12;:25::i;:::-;:33;1065:40;;923:190;;;;;:::o;19252:157::-;19337:4;19376:25;19361:40;;;:11;:40;;;;19354:47;;19252:157;;;:::o;43379:589::-;43523:45;43550:4;43556:2;43560:7;43523:26;:45::i;:::-;43601:1;43585:18;;:4;:18;;;43581:187;;;43620:40;43652:7;43620:31;:40::i;:::-;43581:187;;;43690:2;43682:10;;:4;:10;;;43678:90;;43709:47;43742:4;43748:7;43709:32;:47::i;:::-;43678:90;43581:187;43796:1;43782:16;;:2;:16;;;43778:183;;;43815:45;43852:7;43815:36;:45::i;:::-;43778:183;;;43888:4;43882:10;;:2;:10;;;43878:83;;43909:40;43937:2;43941:7;43909:27;:40::i;:::-;43878:83;43778:183;43379:589;;;:::o;40560:125::-;;;;:::o;38678:799::-;38833:4;38854:15;:2;:13;;;:15::i;:::-;38850:620;;;38906:2;38890:36;;;38927:12;:10;:12::i;:::-;38941:4;38947:7;38956:5;38890:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38886:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39149:1;39132:6;:13;:18;39128:272;;;39175:60;;;;;;;;;;:::i;:::-;;;;;;;;39128:272;39350:6;39344:13;39335:6;39331:2;39327:15;39320:38;38886:529;39023:41;;;39013:51;;;:6;:51;;;;39006:58;;;;;38850:620;39454:4;39447:11;;38678:799;;;;;;;:::o;1475:675::-;1558:7;1578:20;1601:4;1578:27;;1621:9;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;;1867:42;1882:12;1896;1867:14;:42::i;:::-;1852:57;;1720:382;;;2044:42;2059:12;2073;2044:14;:42::i;:::-;2029:57;;1720:382;1659:454;1654:3;;;;;:::i;:::-;;;;1616:497;;;;2130:12;2123:19;;;1475:675;;;;:::o;40049:126::-;;;;:::o;44691:164::-;44795:10;:17;;;;44768:15;:24;44784:7;44768:24;;;;;;;;;;;:44;;;;44823:10;44839:7;44823:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44691:164;:::o;45482:988::-;45748:22;45798:1;45773:22;45790:4;45773:16;:22::i;:::-;:26;;;;:::i;:::-;45748:51;;45810:18;45831:17;:26;45849:7;45831:26;;;;;;;;;;;;45810:47;;45978:14;45964:10;:28;45960:328;;46009:19;46031:12;:18;46044:4;46031:18;;;;;;;;;;;;;;;:34;46050:14;46031:34;;;;;;;;;;;;46009:56;;46115:11;46082:12;:18;46095:4;46082:18;;;;;;;;;;;;;;;:30;46101:10;46082:30;;;;;;;;;;;:44;;;;46232:10;46199:17;:30;46217:11;46199:30;;;;;;;;;;;:43;;;;45994:294;45960:328;46384:17;:26;46402:7;46384:26;;;;;;;;;;;46377:33;;;46428:12;:18;46441:4;46428:18;;;;;;;;;;;;;;;:34;46447:14;46428:34;;;;;;;;;;;46421:41;;;45563:907;;45482:988;;:::o;46765:1079::-;47018:22;47063:1;47043:10;:17;;;;:21;;;;:::i;:::-;47018:46;;47075:18;47096:15;:24;47112:7;47096:24;;;;;;;;;;;;47075:45;;47447:19;47469:10;47480:14;47469:26;;;;;;;;:::i;:::-;;;;;;;;;;47447:48;;47533:11;47508:10;47519;47508:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;47644:10;47613:15;:28;47629:11;47613:28;;;;;;;;;;;:41;;;;47785:15;:24;47801:7;47785:24;;;;;;;;;;;47778:31;;;47820:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46836:1008;;;46765:1079;:::o;44269:221::-;44354:14;44371:20;44388:2;44371:16;:20::i;:::-;44354:37;;44429:7;44402:12;:16;44415:2;44402:16;;;;;;;;;;;;;;;:24;44419:6;44402:24;;;;;;;;;;;:34;;;;44476:6;44447:17;:26;44465:7;44447:26;;;;;;;;;;;:35;;;;44343:147;44269:221;;:::o;9169:326::-;9229:4;9486:1;9464:7;:19;;;:23;9457:30;;9169:326;;;:::o;2158:224::-;2226:13;2289:1;2283:4;2276:15;2318:1;2312:4;2305:15;2359:4;2353;2343:21;2334:30;;2158:224;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2141:568::-;2214:8;2224:6;2274:3;2267:4;2259:6;2255:17;2251:27;2241:122;;2282:79;;:::i;:::-;2241:122;2395:6;2382:20;2372:30;;2425:18;2417:6;2414:30;2411:117;;;2447:79;;:::i;:::-;2411:117;2561:4;2553:6;2549:17;2537:29;;2615:3;2607:4;2599:6;2595:17;2585:8;2581:32;2578:41;2575:128;;;2622:79;;:::i;:::-;2575:128;2141:568;;;;;:::o;2715:133::-;2758:5;2796:6;2783:20;2774:29;;2812:30;2836:5;2812:30;:::i;:::-;2715:133;;;;:::o;2854:137::-;2899:5;2937:6;2924:20;2915:29;;2953:32;2979:5;2953:32;:::i;:::-;2854:137;;;;:::o;2997:141::-;3053:5;3084:6;3078:13;3069:22;;3100:32;3126:5;3100:32;:::i;:::-;2997:141;;;;:::o;3157:338::-;3212:5;3261:3;3254:4;3246:6;3242:17;3238:27;3228:122;;3269:79;;:::i;:::-;3228:122;3386:6;3373:20;3411:78;3485:3;3477:6;3470:4;3462:6;3458:17;3411:78;:::i;:::-;3402:87;;3218:277;3157:338;;;;:::o;3515:340::-;3571:5;3620:3;3613:4;3605:6;3601:17;3597:27;3587:122;;3628:79;;:::i;:::-;3587:122;3745:6;3732:20;3770:79;3845:3;3837:6;3830:4;3822:6;3818:17;3770:79;:::i;:::-;3761:88;;3577:278;3515:340;;;;:::o;3861:139::-;3907:5;3945:6;3932:20;3923:29;;3961:33;3988:5;3961:33;:::i;:::-;3861:139;;;;:::o;4006:329::-;4065:6;4114:2;4102:9;4093:7;4089:23;4085:32;4082:119;;;4120:79;;:::i;:::-;4082:119;4240:1;4265:53;4310:7;4301:6;4290:9;4286:22;4265:53;:::i;:::-;4255:63;;4211:117;4006:329;;;;:::o;4341:474::-;4409:6;4417;4466:2;4454:9;4445:7;4441:23;4437:32;4434:119;;;4472:79;;:::i;:::-;4434:119;4592:1;4617:53;4662:7;4653:6;4642:9;4638:22;4617:53;:::i;:::-;4607:63;;4563:117;4719:2;4745:53;4790:7;4781:6;4770:9;4766:22;4745:53;:::i;:::-;4735:63;;4690:118;4341:474;;;;;:::o;4821:619::-;4898:6;4906;4914;4963:2;4951:9;4942:7;4938:23;4934:32;4931:119;;;4969:79;;:::i;:::-;4931:119;5089:1;5114:53;5159:7;5150:6;5139:9;5135:22;5114:53;:::i;:::-;5104:63;;5060:117;5216:2;5242:53;5287:7;5278:6;5267:9;5263:22;5242:53;:::i;:::-;5232:63;;5187:118;5344:2;5370:53;5415:7;5406:6;5395:9;5391:22;5370:53;:::i;:::-;5360:63;;5315:118;4821:619;;;;;:::o;5446:943::-;5541:6;5549;5557;5565;5614:3;5602:9;5593:7;5589:23;5585:33;5582:120;;;5621:79;;:::i;:::-;5582:120;5741:1;5766:53;5811:7;5802:6;5791:9;5787:22;5766:53;:::i;:::-;5756:63;;5712:117;5868:2;5894:53;5939:7;5930:6;5919:9;5915:22;5894:53;:::i;:::-;5884:63;;5839:118;5996:2;6022:53;6067:7;6058:6;6047:9;6043:22;6022:53;:::i;:::-;6012:63;;5967:118;6152:2;6141:9;6137:18;6124:32;6183:18;6175:6;6172:30;6169:117;;;6205:79;;:::i;:::-;6169:117;6310:62;6364:7;6355:6;6344:9;6340:22;6310:62;:::i;:::-;6300:72;;6095:287;5446:943;;;;;;;:::o;6395:468::-;6460:6;6468;6517:2;6505:9;6496:7;6492:23;6488:32;6485:119;;;6523:79;;:::i;:::-;6485:119;6643:1;6668:53;6713:7;6704:6;6693:9;6689:22;6668:53;:::i;:::-;6658:63;;6614:117;6770:2;6796:50;6838:7;6829:6;6818:9;6814:22;6796:50;:::i;:::-;6786:60;;6741:115;6395:468;;;;;:::o;6869:474::-;6937:6;6945;6994:2;6982:9;6973:7;6969:23;6965:32;6962:119;;;7000:79;;:::i;:::-;6962:119;7120:1;7145:53;7190:7;7181:6;7170:9;7166:22;7145:53;:::i;:::-;7135:63;;7091:117;7247:2;7273:53;7318:7;7309:6;7298:9;7294:22;7273:53;:::i;:::-;7263:63;;7218:118;6869:474;;;;;:::o;7349:539::-;7433:6;7482:2;7470:9;7461:7;7457:23;7453:32;7450:119;;;7488:79;;:::i;:::-;7450:119;7636:1;7625:9;7621:17;7608:31;7666:18;7658:6;7655:30;7652:117;;;7688:79;;:::i;:::-;7652:117;7793:78;7863:7;7854:6;7843:9;7839:22;7793:78;:::i;:::-;7783:88;;7579:302;7349:539;;;;:::o;7894:559::-;7980:6;7988;8037:2;8025:9;8016:7;8012:23;8008:32;8005:119;;;8043:79;;:::i;:::-;8005:119;8191:1;8180:9;8176:17;8163:31;8221:18;8213:6;8210:30;8207:117;;;8243:79;;:::i;:::-;8207:117;8356:80;8428:7;8419:6;8408:9;8404:22;8356:80;:::i;:::-;8338:98;;;;8134:312;7894:559;;;;;:::o;8459:327::-;8517:6;8566:2;8554:9;8545:7;8541:23;8537:32;8534:119;;;8572:79;;:::i;:::-;8534:119;8692:1;8717:52;8761:7;8752:6;8741:9;8737:22;8717:52;:::i;:::-;8707:62;;8663:116;8459:327;;;;:::o;8792:349::-;8861:6;8910:2;8898:9;8889:7;8885:23;8881:32;8878:119;;;8916:79;;:::i;:::-;8878:119;9036:1;9061:63;9116:7;9107:6;9096:9;9092:22;9061:63;:::i;:::-;9051:73;;9007:127;8792:349;;;;:::o;9147:509::-;9216:6;9265:2;9253:9;9244:7;9240:23;9236:32;9233:119;;;9271:79;;:::i;:::-;9233:119;9419:1;9408:9;9404:17;9391:31;9449:18;9441:6;9438:30;9435:117;;;9471:79;;:::i;:::-;9435:117;9576:63;9631:7;9622:6;9611:9;9607:22;9576:63;:::i;:::-;9566:73;;9362:287;9147:509;;;;:::o;9662:329::-;9721:6;9770:2;9758:9;9749:7;9745:23;9741:32;9738:119;;;9776:79;;:::i;:::-;9738:119;9896:1;9921:53;9966:7;9957:6;9946:9;9942:22;9921:53;:::i;:::-;9911:63;;9867:117;9662:329;;;;:::o;9997:118::-;10084:24;10102:5;10084:24;:::i;:::-;10079:3;10072:37;9997:118;;:::o;10121:157::-;10226:45;10246:24;10264:5;10246:24;:::i;:::-;10226:45;:::i;:::-;10221:3;10214:58;10121:157;;:::o;10284:109::-;10365:21;10380:5;10365:21;:::i;:::-;10360:3;10353:34;10284:109;;:::o;10399:118::-;10486:24;10504:5;10486:24;:::i;:::-;10481:3;10474:37;10399:118;;:::o;10523:360::-;10609:3;10637:38;10669:5;10637:38;:::i;:::-;10691:70;10754:6;10749:3;10691:70;:::i;:::-;10684:77;;10770:52;10815:6;10810:3;10803:4;10796:5;10792:16;10770:52;:::i;:::-;10847:29;10869:6;10847:29;:::i;:::-;10842:3;10838:39;10831:46;;10613:270;10523:360;;;;:::o;10889:364::-;10977:3;11005:39;11038:5;11005:39;:::i;:::-;11060:71;11124:6;11119:3;11060:71;:::i;:::-;11053:78;;11140:52;11185:6;11180:3;11173:4;11166:5;11162:16;11140:52;:::i;:::-;11217:29;11239:6;11217:29;:::i;:::-;11212:3;11208:39;11201:46;;10981:272;10889:364;;;;:::o;11259:377::-;11365:3;11393:39;11426:5;11393:39;:::i;:::-;11448:89;11530:6;11525:3;11448:89;:::i;:::-;11441:96;;11546:52;11591:6;11586:3;11579:4;11572:5;11568:16;11546:52;:::i;:::-;11623:6;11618:3;11614:16;11607:23;;11369:267;11259:377;;;;:::o;11642:366::-;11784:3;11805:67;11869:2;11864:3;11805:67;:::i;:::-;11798:74;;11881:93;11970:3;11881:93;:::i;:::-;11999:2;11994:3;11990:12;11983:19;;11642:366;;;:::o;12014:::-;12156:3;12177:67;12241:2;12236:3;12177:67;:::i;:::-;12170:74;;12253:93;12342:3;12253:93;:::i;:::-;12371:2;12366:3;12362:12;12355:19;;12014:366;;;:::o;12386:::-;12528:3;12549:67;12613:2;12608:3;12549:67;:::i;:::-;12542:74;;12625:93;12714:3;12625:93;:::i;:::-;12743:2;12738:3;12734:12;12727:19;;12386:366;;;:::o;12758:::-;12900:3;12921:67;12985:2;12980:3;12921:67;:::i;:::-;12914:74;;12997:93;13086:3;12997:93;:::i;:::-;13115:2;13110:3;13106:12;13099:19;;12758:366;;;:::o;13130:::-;13272:3;13293:67;13357:2;13352:3;13293:67;:::i;:::-;13286:74;;13369:93;13458:3;13369:93;:::i;:::-;13487:2;13482:3;13478:12;13471:19;;13130:366;;;:::o;13502:::-;13644:3;13665:67;13729:2;13724:3;13665:67;:::i;:::-;13658:74;;13741:93;13830:3;13741:93;:::i;:::-;13859:2;13854:3;13850:12;13843:19;;13502:366;;;:::o;13874:::-;14016:3;14037:67;14101:2;14096:3;14037:67;:::i;:::-;14030:74;;14113:93;14202:3;14113:93;:::i;:::-;14231:2;14226:3;14222:12;14215:19;;13874:366;;;:::o;14246:::-;14388:3;14409:67;14473:2;14468:3;14409:67;:::i;:::-;14402:74;;14485:93;14574:3;14485:93;:::i;:::-;14603:2;14598:3;14594:12;14587:19;;14246:366;;;:::o;14618:::-;14760:3;14781:67;14845:2;14840:3;14781:67;:::i;:::-;14774:74;;14857:93;14946:3;14857:93;:::i;:::-;14975:2;14970:3;14966:12;14959:19;;14618:366;;;:::o;14990:::-;15132:3;15153:67;15217:2;15212:3;15153:67;:::i;:::-;15146:74;;15229:93;15318:3;15229:93;:::i;:::-;15347:2;15342:3;15338:12;15331:19;;14990:366;;;:::o;15362:::-;15504:3;15525:67;15589:2;15584:3;15525:67;:::i;:::-;15518:74;;15601:93;15690:3;15601:93;:::i;:::-;15719:2;15714:3;15710:12;15703:19;;15362:366;;;:::o;15734:::-;15876:3;15897:67;15961:2;15956:3;15897:67;:::i;:::-;15890:74;;15973:93;16062:3;15973:93;:::i;:::-;16091:2;16086:3;16082:12;16075:19;;15734:366;;;:::o;16106:::-;16248:3;16269:67;16333:2;16328:3;16269:67;:::i;:::-;16262:74;;16345:93;16434:3;16345:93;:::i;:::-;16463:2;16458:3;16454:12;16447:19;;16106:366;;;:::o;16478:::-;16620:3;16641:67;16705:2;16700:3;16641:67;:::i;:::-;16634:74;;16717:93;16806:3;16717:93;:::i;:::-;16835:2;16830:3;16826:12;16819:19;;16478:366;;;:::o;16850:::-;16992:3;17013:67;17077:2;17072:3;17013:67;:::i;:::-;17006:74;;17089:93;17178:3;17089:93;:::i;:::-;17207:2;17202:3;17198:12;17191:19;;16850:366;;;:::o;17222:::-;17364:3;17385:67;17449:2;17444:3;17385:67;:::i;:::-;17378:74;;17461:93;17550:3;17461:93;:::i;:::-;17579:2;17574:3;17570:12;17563:19;;17222:366;;;:::o;17594:::-;17736:3;17757:67;17821:2;17816:3;17757:67;:::i;:::-;17750:74;;17833:93;17922:3;17833:93;:::i;:::-;17951:2;17946:3;17942:12;17935:19;;17594:366;;;:::o;17966:::-;18108:3;18129:67;18193:2;18188:3;18129:67;:::i;:::-;18122:74;;18205:93;18294:3;18205:93;:::i;:::-;18323:2;18318:3;18314:12;18307:19;;17966:366;;;:::o;18338:::-;18480:3;18501:67;18565:2;18560:3;18501:67;:::i;:::-;18494:74;;18577:93;18666:3;18577:93;:::i;:::-;18695:2;18690:3;18686:12;18679:19;;18338:366;;;:::o;18710:::-;18852:3;18873:67;18937:2;18932:3;18873:67;:::i;:::-;18866:74;;18949:93;19038:3;18949:93;:::i;:::-;19067:2;19062:3;19058:12;19051:19;;18710:366;;;:::o;19082:::-;19224:3;19245:67;19309:2;19304:3;19245:67;:::i;:::-;19238:74;;19321:93;19410:3;19321:93;:::i;:::-;19439:2;19434:3;19430:12;19423:19;;19082:366;;;:::o;19454:::-;19596:3;19617:67;19681:2;19676:3;19617:67;:::i;:::-;19610:74;;19693:93;19782:3;19693:93;:::i;:::-;19811:2;19806:3;19802:12;19795:19;;19454:366;;;:::o;19826:::-;19968:3;19989:67;20053:2;20048:3;19989:67;:::i;:::-;19982:74;;20065:93;20154:3;20065:93;:::i;:::-;20183:2;20178:3;20174:12;20167:19;;19826:366;;;:::o;20198:::-;20340:3;20361:67;20425:2;20420:3;20361:67;:::i;:::-;20354:74;;20437:93;20526:3;20437:93;:::i;:::-;20555:2;20550:3;20546:12;20539:19;;20198:366;;;:::o;20570:::-;20712:3;20733:67;20797:2;20792:3;20733:67;:::i;:::-;20726:74;;20809:93;20898:3;20809:93;:::i;:::-;20927:2;20922:3;20918:12;20911:19;;20570:366;;;:::o;20942:118::-;21029:24;21047:5;21029:24;:::i;:::-;21024:3;21017:37;20942:118;;:::o;21066:256::-;21178:3;21193:75;21264:3;21255:6;21193:75;:::i;:::-;21293:2;21288:3;21284:12;21277:19;;21313:3;21306:10;;21066:256;;;;:::o;21328:435::-;21508:3;21530:95;21621:3;21612:6;21530:95;:::i;:::-;21523:102;;21642:95;21733:3;21724:6;21642:95;:::i;:::-;21635:102;;21754:3;21747:10;;21328:435;;;;;:::o;21769:222::-;21862:4;21900:2;21889:9;21885:18;21877:26;;21913:71;21981:1;21970:9;21966:17;21957:6;21913:71;:::i;:::-;21769:222;;;;:::o;21997:640::-;22192:4;22230:3;22219:9;22215:19;22207:27;;22244:71;22312:1;22301:9;22297:17;22288:6;22244:71;:::i;:::-;22325:72;22393:2;22382:9;22378:18;22369:6;22325:72;:::i;:::-;22407;22475:2;22464:9;22460:18;22451:6;22407:72;:::i;:::-;22526:9;22520:4;22516:20;22511:2;22500:9;22496:18;22489:48;22554:76;22625:4;22616:6;22554:76;:::i;:::-;22546:84;;21997:640;;;;;;;:::o;22643:210::-;22730:4;22768:2;22757:9;22753:18;22745:26;;22781:65;22843:1;22832:9;22828:17;22819:6;22781:65;:::i;:::-;22643:210;;;;:::o;22859:222::-;22952:4;22990:2;22979:9;22975:18;22967:26;;23003:71;23071:1;23060:9;23056:17;23047:6;23003:71;:::i;:::-;22859:222;;;;:::o;23087:313::-;23200:4;23238:2;23227:9;23223:18;23215:26;;23287:9;23281:4;23277:20;23273:1;23262:9;23258:17;23251:47;23315:78;23388:4;23379:6;23315:78;:::i;:::-;23307:86;;23087:313;;;;:::o;23406:419::-;23572:4;23610:2;23599:9;23595:18;23587:26;;23659:9;23653:4;23649:20;23645:1;23634:9;23630:17;23623:47;23687:131;23813:4;23687:131;:::i;:::-;23679:139;;23406:419;;;:::o;23831:::-;23997:4;24035:2;24024:9;24020:18;24012:26;;24084:9;24078:4;24074:20;24070:1;24059:9;24055:17;24048:47;24112:131;24238:4;24112:131;:::i;:::-;24104:139;;23831:419;;;:::o;24256:::-;24422:4;24460:2;24449:9;24445:18;24437:26;;24509:9;24503:4;24499:20;24495:1;24484:9;24480:17;24473:47;24537:131;24663:4;24537:131;:::i;:::-;24529:139;;24256:419;;;:::o;24681:::-;24847:4;24885:2;24874:9;24870:18;24862:26;;24934:9;24928:4;24924:20;24920:1;24909:9;24905:17;24898:47;24962:131;25088:4;24962:131;:::i;:::-;24954:139;;24681:419;;;:::o;25106:::-;25272:4;25310:2;25299:9;25295:18;25287:26;;25359:9;25353:4;25349:20;25345:1;25334:9;25330:17;25323:47;25387:131;25513:4;25387:131;:::i;:::-;25379:139;;25106:419;;;:::o;25531:::-;25697:4;25735:2;25724:9;25720:18;25712:26;;25784:9;25778:4;25774:20;25770:1;25759:9;25755:17;25748:47;25812:131;25938:4;25812:131;:::i;:::-;25804:139;;25531:419;;;:::o;25956:::-;26122:4;26160:2;26149:9;26145:18;26137:26;;26209:9;26203:4;26199:20;26195:1;26184:9;26180:17;26173:47;26237:131;26363:4;26237:131;:::i;:::-;26229:139;;25956:419;;;:::o;26381:::-;26547:4;26585:2;26574:9;26570:18;26562:26;;26634:9;26628:4;26624:20;26620:1;26609:9;26605:17;26598:47;26662:131;26788:4;26662:131;:::i;:::-;26654:139;;26381:419;;;:::o;26806:::-;26972:4;27010:2;26999:9;26995:18;26987:26;;27059:9;27053:4;27049:20;27045:1;27034:9;27030:17;27023:47;27087:131;27213:4;27087:131;:::i;:::-;27079:139;;26806:419;;;:::o;27231:::-;27397:4;27435:2;27424:9;27420:18;27412:26;;27484:9;27478:4;27474:20;27470:1;27459:9;27455:17;27448:47;27512:131;27638:4;27512:131;:::i;:::-;27504:139;;27231:419;;;:::o;27656:::-;27822:4;27860:2;27849:9;27845:18;27837:26;;27909:9;27903:4;27899:20;27895:1;27884:9;27880:17;27873:47;27937:131;28063:4;27937:131;:::i;:::-;27929:139;;27656:419;;;:::o;28081:::-;28247:4;28285:2;28274:9;28270:18;28262:26;;28334:9;28328:4;28324:20;28320:1;28309:9;28305:17;28298:47;28362:131;28488:4;28362:131;:::i;:::-;28354:139;;28081:419;;;:::o;28506:::-;28672:4;28710:2;28699:9;28695:18;28687:26;;28759:9;28753:4;28749:20;28745:1;28734:9;28730:17;28723:47;28787:131;28913:4;28787:131;:::i;:::-;28779:139;;28506:419;;;:::o;28931:::-;29097:4;29135:2;29124:9;29120:18;29112:26;;29184:9;29178:4;29174:20;29170:1;29159:9;29155:17;29148:47;29212:131;29338:4;29212:131;:::i;:::-;29204:139;;28931:419;;;:::o;29356:::-;29522:4;29560:2;29549:9;29545:18;29537:26;;29609:9;29603:4;29599:20;29595:1;29584:9;29580:17;29573:47;29637:131;29763:4;29637:131;:::i;:::-;29629:139;;29356:419;;;:::o;29781:::-;29947:4;29985:2;29974:9;29970:18;29962:26;;30034:9;30028:4;30024:20;30020:1;30009:9;30005:17;29998:47;30062:131;30188:4;30062:131;:::i;:::-;30054:139;;29781:419;;;:::o;30206:::-;30372:4;30410:2;30399:9;30395:18;30387:26;;30459:9;30453:4;30449:20;30445:1;30434:9;30430:17;30423:47;30487:131;30613:4;30487:131;:::i;:::-;30479:139;;30206:419;;;:::o;30631:::-;30797:4;30835:2;30824:9;30820:18;30812:26;;30884:9;30878:4;30874:20;30870:1;30859:9;30855:17;30848:47;30912:131;31038:4;30912:131;:::i;:::-;30904:139;;30631:419;;;:::o;31056:::-;31222:4;31260:2;31249:9;31245:18;31237:26;;31309:9;31303:4;31299:20;31295:1;31284:9;31280:17;31273:47;31337:131;31463:4;31337:131;:::i;:::-;31329:139;;31056:419;;;:::o;31481:::-;31647:4;31685:2;31674:9;31670:18;31662:26;;31734:9;31728:4;31724:20;31720:1;31709:9;31705:17;31698:47;31762:131;31888:4;31762:131;:::i;:::-;31754:139;;31481:419;;;:::o;31906:::-;32072:4;32110:2;32099:9;32095:18;32087:26;;32159:9;32153:4;32149:20;32145:1;32134:9;32130:17;32123:47;32187:131;32313:4;32187:131;:::i;:::-;32179:139;;31906:419;;;:::o;32331:::-;32497:4;32535:2;32524:9;32520:18;32512:26;;32584:9;32578:4;32574:20;32570:1;32559:9;32555:17;32548:47;32612:131;32738:4;32612:131;:::i;:::-;32604:139;;32331:419;;;:::o;32756:::-;32922:4;32960:2;32949:9;32945:18;32937:26;;33009:9;33003:4;32999:20;32995:1;32984:9;32980:17;32973:47;33037:131;33163:4;33037:131;:::i;:::-;33029:139;;32756:419;;;:::o;33181:::-;33347:4;33385:2;33374:9;33370:18;33362:26;;33434:9;33428:4;33424:20;33420:1;33409:9;33405:17;33398:47;33462:131;33588:4;33462:131;:::i;:::-;33454:139;;33181:419;;;:::o;33606:::-;33772:4;33810:2;33799:9;33795:18;33787:26;;33859:9;33853:4;33849:20;33845:1;33834:9;33830:17;33823:47;33887:131;34013:4;33887:131;:::i;:::-;33879:139;;33606:419;;;:::o;34031:222::-;34124:4;34162:2;34151:9;34147:18;34139:26;;34175:71;34243:1;34232:9;34228:17;34219:6;34175:71;:::i;:::-;34031:222;;;;:::o;34259:129::-;34293:6;34320:20;;:::i;:::-;34310:30;;34349:33;34377:4;34369:6;34349:33;:::i;:::-;34259:129;;;:::o;34394:75::-;34427:6;34460:2;34454:9;34444:19;;34394:75;:::o;34475:311::-;34552:4;34642:18;34634:6;34631:30;34628:56;;;34664:18;;:::i;:::-;34628:56;34714:4;34706:6;34702:17;34694:25;;34774:4;34768;34764:15;34756:23;;34475:311;;;:::o;34792:307::-;34853:4;34943:18;34935:6;34932:30;34929:56;;;34965:18;;:::i;:::-;34929:56;35003:29;35025:6;35003:29;:::i;:::-;34995:37;;35087:4;35081;35077:15;35069:23;;34792:307;;;:::o;35105:308::-;35167:4;35257:18;35249:6;35246:30;35243:56;;;35279:18;;:::i;:::-;35243:56;35317:29;35339:6;35317:29;:::i;:::-;35309:37;;35401:4;35395;35391:15;35383:23;;35105:308;;;:::o;35419:98::-;35470:6;35504:5;35498:12;35488:22;;35419:98;;;:::o;35523:99::-;35575:6;35609:5;35603:12;35593:22;;35523:99;;;:::o;35628:168::-;35711:11;35745:6;35740:3;35733:19;35785:4;35780:3;35776:14;35761:29;;35628:168;;;;:::o;35802:169::-;35886:11;35920:6;35915:3;35908:19;35960:4;35955:3;35951:14;35936:29;;35802:169;;;;:::o;35977:148::-;36079:11;36116:3;36101:18;;35977:148;;;;:::o;36131:305::-;36171:3;36190:20;36208:1;36190:20;:::i;:::-;36185:25;;36224:20;36242:1;36224:20;:::i;:::-;36219:25;;36378:1;36310:66;36306:74;36303:1;36300:81;36297:107;;;36384:18;;:::i;:::-;36297:107;36428:1;36425;36421:9;36414:16;;36131:305;;;;:::o;36442:185::-;36482:1;36499:20;36517:1;36499:20;:::i;:::-;36494:25;;36533:20;36551:1;36533:20;:::i;:::-;36528:25;;36572:1;36562:35;;36577:18;;:::i;:::-;36562:35;36619:1;36616;36612:9;36607:14;;36442:185;;;;:::o;36633:191::-;36673:4;36693:20;36711:1;36693:20;:::i;:::-;36688:25;;36727:20;36745:1;36727:20;:::i;:::-;36722:25;;36766:1;36763;36760:8;36757:34;;;36771:18;;:::i;:::-;36757:34;36816:1;36813;36809:9;36801:17;;36633:191;;;;:::o;36830:96::-;36867:7;36896:24;36914:5;36896:24;:::i;:::-;36885:35;;36830:96;;;:::o;36932:90::-;36966:7;37009:5;37002:13;36995:21;36984:32;;36932:90;;;:::o;37028:77::-;37065:7;37094:5;37083:16;;37028:77;;;:::o;37111:149::-;37147:7;37187:66;37180:5;37176:78;37165:89;;37111:149;;;:::o;37266:126::-;37303:7;37343:42;37336:5;37332:54;37321:65;;37266:126;;;:::o;37398:77::-;37435:7;37464:5;37453:16;;37398:77;;;:::o;37481:154::-;37565:6;37560:3;37555;37542:30;37627:1;37618:6;37613:3;37609:16;37602:27;37481:154;;;:::o;37641:307::-;37709:1;37719:113;37733:6;37730:1;37727:13;37719:113;;;37818:1;37813:3;37809:11;37803:18;37799:1;37794:3;37790:11;37783:39;37755:2;37752:1;37748:10;37743:15;;37719:113;;;37850:6;37847:1;37844:13;37841:101;;;37930:1;37921:6;37916:3;37912:16;37905:27;37841:101;37690:258;37641:307;;;:::o;37954:320::-;37998:6;38035:1;38029:4;38025:12;38015:22;;38082:1;38076:4;38072:12;38103:18;38093:81;;38159:4;38151:6;38147:17;38137:27;;38093:81;38221:2;38213:6;38210:14;38190:18;38187:38;38184:84;;;38240:18;;:::i;:::-;38184:84;38005:269;37954:320;;;:::o;38280:281::-;38363:27;38385:4;38363:27;:::i;:::-;38355:6;38351:40;38493:6;38481:10;38478:22;38457:18;38445:10;38442:34;38439:62;38436:88;;;38504:18;;:::i;:::-;38436:88;38544:10;38540:2;38533:22;38323:238;38280:281;;:::o;38567:233::-;38606:3;38629:24;38647:5;38629:24;:::i;:::-;38620:33;;38675:66;38668:5;38665:77;38662:103;;;38745:18;;:::i;:::-;38662:103;38792:1;38785:5;38781:13;38774:20;;38567:233;;;:::o;38806:100::-;38845:7;38874:26;38894:5;38874:26;:::i;:::-;38863:37;;38806:100;;;:::o;38912:94::-;38951:7;38980:20;38994:5;38980:20;:::i;:::-;38969:31;;38912:94;;;:::o;39012:176::-;39044:1;39061:20;39079:1;39061:20;:::i;:::-;39056:25;;39095:20;39113:1;39095:20;:::i;:::-;39090:25;;39134:1;39124:35;;39139:18;;:::i;:::-;39124:35;39180:1;39177;39173:9;39168:14;;39012:176;;;;:::o;39194:180::-;39242:77;39239:1;39232:88;39339:4;39336:1;39329:15;39363:4;39360:1;39353:15;39380:180;39428:77;39425:1;39418:88;39525:4;39522:1;39515:15;39549:4;39546:1;39539:15;39566:180;39614:77;39611:1;39604:88;39711:4;39708:1;39701:15;39735:4;39732:1;39725:15;39752:180;39800:77;39797:1;39790:88;39897:4;39894:1;39887:15;39921:4;39918:1;39911:15;39938:180;39986:77;39983:1;39976:88;40083:4;40080:1;40073:15;40107:4;40104:1;40097:15;40124:180;40172:77;40169:1;40162:88;40269:4;40266:1;40259:15;40293:4;40290:1;40283:15;40310:117;40419:1;40416;40409:12;40433:117;40542:1;40539;40532:12;40556:117;40665:1;40662;40655:12;40679:117;40788:1;40785;40778:12;40802:117;40911:1;40908;40901:12;40925:117;41034:1;41031;41024:12;41048:102;41089:6;41140:2;41136:7;41131:2;41124:5;41120:14;41116:28;41106:38;;41048:102;;;:::o;41156:94::-;41189:8;41237:5;41233:2;41229:14;41208:35;;41156:94;;;:::o;41256:230::-;41396:34;41392:1;41384:6;41380:14;41373:58;41465:13;41460:2;41452:6;41448:15;41441:38;41256:230;:::o;41492:237::-;41632:34;41628:1;41620:6;41616:14;41609:58;41701:20;41696:2;41688:6;41684:15;41677:45;41492:237;:::o;41735:225::-;41875:34;41871:1;41863:6;41859:14;41852:58;41944:8;41939:2;41931:6;41927:15;41920:33;41735:225;:::o;41966:224::-;42106:34;42102:1;42094:6;42090:14;42083:58;42175:7;42170:2;42162:6;42158:15;42151:32;41966:224;:::o;42196:178::-;42336:30;42332:1;42324:6;42320:14;42313:54;42196:178;:::o;42380:223::-;42520:34;42516:1;42508:6;42504:14;42497:58;42589:6;42584:2;42576:6;42572:15;42565:31;42380:223;:::o;42609:175::-;42749:27;42745:1;42737:6;42733:14;42726:51;42609:175;:::o;42790:231::-;42930:34;42926:1;42918:6;42914:14;42907:58;42999:14;42994:2;42986:6;42982:15;42975:39;42790:231;:::o;43027:243::-;43167:34;43163:1;43155:6;43151:14;43144:58;43236:26;43231:2;43223:6;43219:15;43212:51;43027:243;:::o;43276:165::-;43416:17;43412:1;43404:6;43400:14;43393:41;43276:165;:::o;43447:229::-;43587:34;43583:1;43575:6;43571:14;43564:58;43656:12;43651:2;43643:6;43639:15;43632:37;43447:229;:::o;43682:228::-;43822:34;43818:1;43810:6;43806:14;43799:58;43891:11;43886:2;43878:6;43874:15;43867:36;43682:228;:::o;43916:220::-;44056:34;44052:1;44044:6;44040:14;44033:58;44125:3;44120:2;44112:6;44108:15;44101:28;43916:220;:::o;44142:182::-;44282:34;44278:1;44270:6;44266:14;44259:58;44142:182;:::o;44330:165::-;44470:17;44466:1;44458:6;44454:14;44447:41;44330:165;:::o;44501:231::-;44641:34;44637:1;44629:6;44625:14;44618:58;44710:14;44705:2;44697:6;44693:15;44686:39;44501:231;:::o;44738:182::-;44878:34;44874:1;44866:6;44862:14;44855:58;44738:182;:::o;44926:234::-;45066:34;45062:1;45054:6;45050:14;45043:58;45135:17;45130:2;45122:6;45118:15;45111:42;44926:234;:::o;45166:220::-;45306:34;45302:1;45294:6;45290:14;45283:58;45375:3;45370:2;45362:6;45358:15;45351:28;45166:220;:::o;45392:236::-;45532:34;45528:1;45520:6;45516:14;45509:58;45601:19;45596:2;45588:6;45584:15;45577:44;45392:236;:::o;45634:168::-;45774:20;45770:1;45762:6;45758:14;45751:44;45634:168;:::o;45808:231::-;45948:34;45944:1;45936:6;45932:14;45925:58;46017:14;46012:2;46004:6;46000:15;45993:39;45808:231;:::o;46045:233::-;46185:34;46181:1;46173:6;46169:14;46162:58;46254:16;46249:2;46241:6;46237:15;46230:41;46045:233;:::o;46284:180::-;46424:32;46420:1;46412:6;46408:14;46401:56;46284:180;:::o;46470:163::-;46610:15;46606:1;46598:6;46594:14;46587:39;46470:163;:::o;46639:122::-;46712:24;46730:5;46712:24;:::i;:::-;46705:5;46702:35;46692:63;;46751:1;46748;46741:12;46692:63;46639:122;:::o;46767:116::-;46837:21;46852:5;46837:21;:::i;:::-;46830:5;46827:32;46817:60;;46873:1;46870;46863:12;46817:60;46767:116;:::o;46889:120::-;46961:23;46978:5;46961:23;:::i;:::-;46954:5;46951:34;46941:62;;46999:1;46996;46989:12;46941:62;46889:120;:::o;47015:122::-;47088:24;47106:5;47088:24;:::i;:::-;47081:5;47078:35;47068:63;;47127:1;47124;47117:12;47068:63;47015:122;:::o

Swarm Source

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