ETH Price: $3,288.72 (+0.72%)
Gas: 19 Gwei

Token

Ghoul Toys (GHOUL TOYS)
 

Overview

Max Total Supply

78 GHOUL TOYS

Holders

33

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 GHOUL TOYS
0x0192488e1524c95ecc83a65895073705f1775272
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:
Ghoultoys

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-04-14
*/

// SPDX-License-Identifier: MIT AND GPL-3.0

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);
}

/**
 * @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;
}


/**
 * @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);
}

/**
 * @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);
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @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;
    }
}

/**
 * @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);
    }
}

/**
 * @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;
    }
}

/**
 * @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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev 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 {}
}

/**
 * @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 tokenId);

    /**
     * @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);
}

/**
 * @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();
    }
}

/**
 * @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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


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

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates merkle trees that are safe
 * against this attack out of the box.
 */
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 Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle 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++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}





// File: contracts/Ghoultoys.sol

pragma solidity >=0.7.0 <0.9.0;

contract Ghoultoys is ERC721Enumerable, Ownable {
    using Strings for uint256;
    string private baseURI;
    string public baseExtension = ".json";
    string public notRevealedUri;
    uint256 public preSaleCost = 0.0099 ether;
    uint256 public cost = 0.0099 ether;
    uint256 public maxSupply = 2888;
    uint256 public preSaleMaxSupply = 2888;
    uint256 public maxMintAmountPresale = 3;
    uint256 public maxMintAmount = 3;
    uint256 public nftPerAddressLimitPresale = 3;
    uint256 public nftPerAddressLimit = 3;
    uint256 public preSaleDate = 1681480800;
    uint256 public preSaleEndDate = 1681484399;
    uint256 public publicSaleDate = 1681484400;

    bytes32 merkleRoot;

    bool public paused = false;
    bool public revealed = false;

    mapping(address => bool) public whitelistSaleClaimed;

    mapping(address => bool) whitelistedAddresses;
    mapping(address => uint256) public addressMintedBalance;

    constructor(string memory _name, string memory _symbol, string memory _initNotRevealedUri) ERC721(_name, _symbol) {
        setNotRevealedURI(_initNotRevealedUri);
    }
    
    //MODIFIERS
    modifier notPaused {
         require(!paused, "the contract is paused");
         _;
    }

    modifier saleStarted {
        require(block.timestamp >= preSaleDate, "Sale has not started yet");
        _;
    }

    modifier minimumMintAmount(uint256 _mintAmount) {
        require(_mintAmount > 0, "need to mint at least 1 NFT");
        _;
    }

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

    function presaleValidations(uint256 _ownerMintedCount, uint256 _mintAmount, uint256 _supply) internal {
            uint256 actualCost;
            block.timestamp < preSaleEndDate ? actualCost = preSaleCost : actualCost = cost;
            require(isWhitelisted(msg.sender), "user is not whitelisted");
            require(_ownerMintedCount + _mintAmount <= nftPerAddressLimitPresale, "max NFT per address exceeded for presale");
            require(msg.value >= actualCost * _mintAmount, "insufficient funds");
            require(_mintAmount <= maxMintAmountPresale,"max mint amount per transaction exceeded");
            require(_supply + _mintAmount <= preSaleMaxSupply,"max NFT presale limit exceeded");
    }

    function wlValidations(uint256 _ownerMintedCount, uint256 _mintAmount, uint256 _supply) internal {
            uint256 actualCost;
            require(_ownerMintedCount + _mintAmount <= nftPerAddressLimitPresale, "max NFT per address exceeded for presale");
            require(msg.value >= actualCost * _mintAmount, "insufficient funds");
            require(_mintAmount <= maxMintAmountPresale,"max mint amount per transaction exceeded");
            require(_supply + _mintAmount <= preSaleMaxSupply,"max NFT presale limit exceeded");
    }

    function publicsaleValidations(uint256 _ownerMintedCount, uint256 _mintAmount) internal {
        require(_ownerMintedCount + _mintAmount <= nftPerAddressLimit,"max NFT per address exceeded");
        require(msg.value >= cost * _mintAmount, "insufficient funds");
        require(_mintAmount <= maxMintAmount,"max mint amount per transaction exceeded");
    }

    //MINT
    function mint(uint256 _mintAmount) public payable notPaused saleStarted minimumMintAmount(_mintAmount) {
        uint256 supply = totalSupply();
        uint256 ownerMintedCount = addressMintedBalance[msg.sender];

        //Do some validations depending on which step of the sale we are in
        block.timestamp < publicSaleDate ? presaleValidations(ownerMintedCount, _mintAmount, supply) : publicsaleValidations(ownerMintedCount, _mintAmount);

        require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded");

        for (uint256 i = 1; i <= _mintAmount; i++) {
            addressMintedBalance[msg.sender]++;
            _safeMint(msg.sender, supply + i);
        }
    }
    
    function gift(uint256 _mintAmount, address destination) public onlyOwner {
        require(_mintAmount > 0, "need to mint at least 1 NFT");
        uint256 supply = totalSupply();
        require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded");

        for (uint256 i = 1; i <= _mintAmount; i++) {
            addressMintedBalance[destination]++;
            _safeMint(destination, supply + i);
        }
    }

    //PUBLIC VIEWS
    function isWhitelisted(address _user) public view returns (bool) {
        return whitelistedAddresses[_user];
    }

    function walletOfOwner(address _owner) public view returns (uint256[] memory) {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

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

        if (!revealed) {
            return notRevealedUri;
        } else {
            string memory currentBaseURI = _baseURI();
            return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI,tokenId.toString(), baseExtension)) : "";
        }
    }

    function getCurrentCost() public view returns (uint256) {
        if (block.timestamp < preSaleEndDate) {
            return preSaleCost;
        } else {
            return cost;
        }
    }

    //ONLY OWNER VIEWS
    function getBaseURI() public view onlyOwner returns (string memory) {
        return baseURI;
    }

    function getContractBalance() public view onlyOwner returns (uint256) {
        return address(this).balance;
    }

    //ONLY OWNER SETTERS

    function reveal() public onlyOwner {
        revealed = true;
    }

    function pause(bool _state) public onlyOwner {
        paused = _state;
    }
    
    function setNftPerAddressLimitPreSale(uint256 _limit) public onlyOwner {
        nftPerAddressLimitPresale = _limit;
    }

    function setNftPerAddressLimit(uint256 _limit) public onlyOwner {
        nftPerAddressLimit = _limit;
    }

    function setPresaleCost(uint256 _newCost) public onlyOwner {
        preSaleCost = _newCost;
    }

    function setCost(uint256 _newCost) public onlyOwner {
        cost = _newCost;
    }
    
    function setmaxMintAmountPreSale(uint256 _newmaxMintAmount) public onlyOwner {
        maxMintAmountPresale = _newmaxMintAmount;
    }

    function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
        maxMintAmount = _newmaxMintAmount;
    }

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

    function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
        baseExtension = _newBaseExtension;
    }

    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }

    function setPresaleMaxSupply(uint256 _newPresaleMaxSupply) public onlyOwner {
        preSaleMaxSupply = _newPresaleMaxSupply;
    }

    function setMaxSupply(uint256 _maxSupply) public onlyOwner {
        maxSupply = _maxSupply;
    }

    function setPreSaleDate(uint256 _preSaleDate) public onlyOwner {
        preSaleDate = _preSaleDate;
    }

    function setPreSaleEndDate(uint256 _preSaleEndDate) public onlyOwner {
        preSaleEndDate = _preSaleEndDate;
    }

    function setPublicSaleDate(uint256 _publicSaleDate) public onlyOwner {
        publicSaleDate = _publicSaleDate;
    }

    function withdraw() public payable onlyOwner {
        (bool success, ) = payable(msg.sender).call{value: address(this).balance}("");
        require(success);
    }

    function checkProof(bytes32[] memory _proof) internal view returns(bool) {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        return MerkleProof.verify(_proof, merkleRoot, leaf);
    }

    function setMerkleRoot(bytes32 _root) external onlyOwner {
        merkleRoot = _root;
    }


    function whitelistMint(uint256 _mintAmount, bytes32[] calldata proof) 
    public 
    payable 
    notPaused 
    minimumMintAmount(_mintAmount) 
    isValidProof(proof)
    {
        uint256 supply = totalSupply();
        uint256 ownerMintedCount = addressMintedBalance[msg.sender];

        //Do some validations depending on which step of the sale we are in
        block.timestamp < publicSaleDate ? wlValidations(ownerMintedCount, _mintAmount, supply) : publicsaleValidations(ownerMintedCount, _mintAmount);

        require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded");

        for (uint256 i = 1; i <= _mintAmount; i++) {
            addressMintedBalance[msg.sender]++;
            _safeMint(msg.sender, supply + i);
        }
    }

    modifier isValidProof(bytes32[] memory proof) {
        require(checkProof(proof), "Invalid proof.");
        _;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","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":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"destination","type":"address"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimitPresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleEndDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimitPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_preSaleDate","type":"uint256"}],"name":"setPreSaleDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_preSaleEndDate","type":"uint256"}],"name":"setPreSaleEndDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setPresaleCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPresaleMaxSupply","type":"uint256"}],"name":"setPresaleMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicSaleDate","type":"uint256"}],"name":"setPublicSaleDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmountPreSale","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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistSaleClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60c06040526005608090815264173539b7b760d91b60a052600c9062000026908262000265565b5066232bff5f46c000600e819055600f55610b48601081905560115560036012819055601381905560148190556015556364395c606016556364396a6f6017556364396a70601855601a805461ffff191690553480156200008657600080fd5b506040516200378238038062003782833981016040819052620000a991620003e0565b82826000620000b9838262000265565b506001620000c8828262000265565b505050620000e5620000df620000f960201b60201c565b620000fd565b620000f0816200014f565b50505062000471565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a546001600160a01b03163314620001ae5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b600d620001bc828262000265565b5050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001eb57607f821691505b6020821081036200020c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200026057600081815260208120601f850160051c810160208610156200023b5750805b601f850160051c820191505b818110156200025c5782815560010162000247565b5050505b505050565b81516001600160401b03811115620002815762000281620001c0565b6200029981620002928454620001d6565b8462000212565b602080601f831160018114620002d15760008415620002b85750858301515b600019600386901b1c1916600185901b1785556200025c565b600085815260208120601f198616915b828110156200030257888601518255948401946001909101908401620002e1565b5085821015620003215787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600082601f8301126200034357600080fd5b81516001600160401b0380821115620003605762000360620001c0565b604051601f8301601f19908116603f011681019082821181831017156200038b576200038b620001c0565b81604052838152602092508683858801011115620003a857600080fd5b600091505b83821015620003cc5785820183015181830184015290820190620003ad565b600093810190920192909252949350505050565b600080600060608486031215620003f657600080fd5b83516001600160401b03808211156200040e57600080fd5b6200041c8783880162000331565b945060208601519150808211156200043357600080fd5b620004418783880162000331565b935060408601519150808211156200045857600080fd5b50620004678682870162000331565b9150509250925092565b61330180620004816000396000f3fe6080604052600436106103ad5760003560e01c80636f9fb98a116101e7578063a18116f11161010d578063d0eb26b0116100a0578063e985e9c51161006f578063e985e9c514610a72578063eced387314610abb578063f2c4ce1e14610ad1578063f2fde38b14610af157600080fd5b8063d0eb26b014610a09578063d2cab05614610a29578063d5abeb0114610a3c578063da3ef23f14610a5257600080fd5b8063ba7d2c76116100dc578063ba7d2c76146109a8578063c6682862146109be578063c87b56dd146109d3578063cc9ff9c6146109f357600080fd5b8063a18116f11461093d578063a22cb46514610953578063a475b5dd14610973578063b88d4fde1461098857600080fd5b80637effc032116101855780638da5cb5b116101545780638da5cb5b146108d75780638fdcf942146108f557806395d89b4114610915578063a0712d681461092a57600080fd5b80637effc0321461086c5780637f00c7a614610882578063831e60de146108a257806383a076be146108b757600080fd5b8063715018a6116101c1578063715018a614610801578063743c7f6b146108165780637967a50a146108365780637cb647591461084c57600080fd5b80636f9fb98a146107b757806370a08231146107cc578063714c5398146107ec57600080fd5b80632e09282e116102d757806344a0d68a1161026a5780635c975abb116102395780635c975abb1461073d5780636352211e14610757578063669736c0146107775780636f8b44b01461079757600080fd5b806344a0d68a146106be5780634f6ccce7146106de57806351830227146106fe57806355f804b31461071d57600080fd5b80633ccfd60b116102a65780633ccfd60b1461064957806342842e0e1461065157806342f0ca0d14610671578063438b63001461069157600080fd5b80632e09282e146105aa5780632f2ea070146105c05780632f745c59146105f05780633af32abf1461061057600080fd5b80630a50716b1161034f57806318cae2691161031e57806318cae269146105315780631985cc651461055e578063239c70ae1461057457806323b872dd1461058a57600080fd5b80630a50716b146104b85780630e54a883146104d857806313faede6146104f857806318160ddd1461051c57600080fd5b8063081812fc1161038b578063081812fc1461042b578063081c8c4414610463578063095ea7b3146104785780630a403f041461049857600080fd5b806301ffc9a7146103b257806302329a29146103e757806306fdde0314610409575b600080fd5b3480156103be57600080fd5b506103d26103cd366004612a3c565b610b11565b60405190151581526020015b60405180910390f35b3480156103f357600080fd5b50610407610402366004612a69565b610b3c565b005b34801561041557600080fd5b5061041e610b82565b6040516103de9190612ad4565b34801561043757600080fd5b5061044b610446366004612ae7565b610c14565b6040516001600160a01b0390911681526020016103de565b34801561046f57600080fd5b5061041e610ca9565b34801561048457600080fd5b50610407610493366004612b17565b610d37565b3480156104a457600080fd5b506104076104b3366004612ae7565b610e4c565b3480156104c457600080fd5b506104076104d3366004612ae7565b610e7b565b3480156104e457600080fd5b506104076104f3366004612ae7565b610eaa565b34801561050457600080fd5b5061050e600f5481565b6040519081526020016103de565b34801561052857600080fd5b5060085461050e565b34801561053d57600080fd5b5061050e61054c366004612b41565b601d6020526000908152604090205481565b34801561056a57600080fd5b5061050e60165481565b34801561058057600080fd5b5061050e60135481565b34801561059657600080fd5b506104076105a5366004612b5c565b610ed9565b3480156105b657600080fd5b5061050e60145481565b3480156105cc57600080fd5b506103d26105db366004612b41565b601b6020526000908152604090205460ff1681565b3480156105fc57600080fd5b5061050e61060b366004612b17565b610f0a565b34801561061c57600080fd5b506103d261062b366004612b41565b6001600160a01b03166000908152601c602052604090205460ff1690565b610407610fa0565b34801561065d57600080fd5b5061040761066c366004612b5c565b611022565b34801561067d57600080fd5b5061040761068c366004612ae7565b61103d565b34801561069d57600080fd5b506106b16106ac366004612b41565b61106c565b6040516103de9190612b98565b3480156106ca57600080fd5b506104076106d9366004612ae7565b61110e565b3480156106ea57600080fd5b5061050e6106f9366004612ae7565b61113d565b34801561070a57600080fd5b50601a546103d290610100900460ff1681565b34801561072957600080fd5b50610407610738366004612c68565b6111d0565b34801561074957600080fd5b50601a546103d29060ff1681565b34801561076357600080fd5b5061044b610772366004612ae7565b61120a565b34801561078357600080fd5b50610407610792366004612ae7565b611281565b3480156107a357600080fd5b506104076107b2366004612ae7565b6112b0565b3480156107c357600080fd5b5061050e6112df565b3480156107d857600080fd5b5061050e6107e7366004612b41565b611311565b3480156107f857600080fd5b5061041e611398565b34801561080d57600080fd5b506104076113d2565b34801561082257600080fd5b50610407610831366004612ae7565b611408565b34801561084257600080fd5b5061050e60175481565b34801561085857600080fd5b50610407610867366004612ae7565b611437565b34801561087857600080fd5b5061050e60125481565b34801561088e57600080fd5b5061040761089d366004612ae7565b611466565b3480156108ae57600080fd5b5061050e611495565b3480156108c357600080fd5b506104076108d2366004612cb1565b6114af565b3480156108e357600080fd5b50600a546001600160a01b031661044b565b34801561090157600080fd5b50610407610910366004612ae7565b611591565b34801561092157600080fd5b5061041e6115c0565b610407610938366004612ae7565b6115cf565b34801561094957600080fd5b5061050e60115481565b34801561095f57600080fd5b5061040761096e366004612cdd565b61174d565b34801561097f57600080fd5b50610407611811565b34801561099457600080fd5b506104076109a3366004612d07565b61184c565b3480156109b457600080fd5b5061050e60155481565b3480156109ca57600080fd5b5061041e61187e565b3480156109df57600080fd5b5061041e6109ee366004612ae7565b61188b565b3480156109ff57600080fd5b5061050e600e5481565b348015610a1557600080fd5b50610407610a24366004612ae7565b611a0f565b610407610a37366004612d83565b611a3e565b348015610a4857600080fd5b5061050e60105481565b348015610a5e57600080fd5b50610407610a6d366004612c68565b611be9565b348015610a7e57600080fd5b506103d2610a8d366004612e02565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610ac757600080fd5b5061050e60185481565b348015610add57600080fd5b50610407610aec366004612c68565b611c1f565b348015610afd57600080fd5b50610407610b0c366004612b41565b611c55565b60006001600160e01b0319821663780e9d6360e01b1480610b365750610b3682611ced565b92915050565b600a546001600160a01b03163314610b6f5760405162461bcd60e51b8152600401610b6690612e2c565b60405180910390fd5b601a805460ff1916911515919091179055565b606060008054610b9190612e61565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbd90612e61565b8015610c0a5780601f10610bdf57610100808354040283529160200191610c0a565b820191906000526020600020905b815481529060010190602001808311610bed57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610c8d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b66565b506000908152600460205260409020546001600160a01b031690565b600d8054610cb690612e61565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce290612e61565b8015610d2f5780601f10610d0457610100808354040283529160200191610d2f565b820191906000526020600020905b815481529060010190602001808311610d1257829003601f168201915b505050505081565b6000610d428261120a565b9050806001600160a01b0316836001600160a01b031603610daf5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b66565b336001600160a01b0382161480610dcb5750610dcb8133610a8d565b610e3d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b66565b610e478383611d3d565b505050565b600a546001600160a01b03163314610e765760405162461bcd60e51b8152600401610b6690612e2c565b601155565b600a546001600160a01b03163314610ea55760405162461bcd60e51b8152600401610b6690612e2c565b601455565b600a546001600160a01b03163314610ed45760405162461bcd60e51b8152600401610b6690612e2c565b601855565b610ee33382611dab565b610eff5760405162461bcd60e51b8152600401610b6690612e9b565b610e47838383611ea2565b6000610f1583611311565b8210610f775760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b66565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610fca5760405162461bcd60e51b8152600401610b6690612e2c565b604051600090339047908381818185875af1925050503d806000811461100c576040519150601f19603f3d011682016040523d82523d6000602084013e611011565b606091505b505090508061101f57600080fd5b50565b610e478383836040518060200160405280600081525061184c565b600a546001600160a01b031633146110675760405162461bcd60e51b8152600401610b6690612e2c565b601755565b6060600061107983611311565b905060008167ffffffffffffffff81111561109657611096612bdc565b6040519080825280602002602001820160405280156110bf578160200160208202803683370190505b50905060005b82811015611106576110d78582610f0a565b8282815181106110e9576110e9612eec565b6020908102919091010152806110fe81612f18565b9150506110c5565b509392505050565b600a546001600160a01b031633146111385760405162461bcd60e51b8152600401610b6690612e2c565b600f55565b600061114860085490565b82106111ab5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b66565b600882815481106111be576111be612eec565b90600052602060002001549050919050565b600a546001600160a01b031633146111fa5760405162461bcd60e51b8152600401610b6690612e2c565b600b6112068282612f7f565b5050565b6000818152600260205260408120546001600160a01b031680610b365760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b66565b600a546001600160a01b031633146112ab5760405162461bcd60e51b8152600401610b6690612e2c565b601255565b600a546001600160a01b031633146112da5760405162461bcd60e51b8152600401610b6690612e2c565b601055565b600a546000906001600160a01b0316331461130c5760405162461bcd60e51b8152600401610b6690612e2c565b504790565b60006001600160a01b03821661137c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b66565b506001600160a01b031660009081526003602052604090205490565b600a546060906001600160a01b031633146113c55760405162461bcd60e51b8152600401610b6690612e2c565b600b8054610b9190612e61565b600a546001600160a01b031633146113fc5760405162461bcd60e51b8152600401610b6690612e2c565b611406600061204d565b565b600a546001600160a01b031633146114325760405162461bcd60e51b8152600401610b6690612e2c565b601655565b600a546001600160a01b031633146114615760405162461bcd60e51b8152600401610b6690612e2c565b601955565b600a546001600160a01b031633146114905760405162461bcd60e51b8152600401610b6690612e2c565b601355565b60006017544210156114a85750600e5490565b50600f5490565b600a546001600160a01b031633146114d95760405162461bcd60e51b8152600401610b6690612e2c565b600082116114f95760405162461bcd60e51b8152600401610b669061303f565b600061150460085490565b6010549091506115148483613076565b11156115325760405162461bcd60e51b8152600401610b6690613089565b60015b83811161158b576001600160a01b0383166000908152601d6020526040812080549161156083612f18565b909155506115799050836115748385613076565b61209f565b8061158381612f18565b915050611535565b50505050565b600a546001600160a01b031633146115bb5760405162461bcd60e51b8152600401610b6690612e2c565b600e55565b606060018054610b9190612e61565b601a5460ff161561161b5760405162461bcd60e51b81526020600482015260166024820152751d1a194818dbdb9d1c9858dd081a5cc81c185d5cd95960521b6044820152606401610b66565b60165442101561166d5760405162461bcd60e51b815260206004820152601860248201527f53616c6520686173206e6f7420737461727465642079657400000000000000006044820152606401610b66565b806000811161168e5760405162461bcd60e51b8152600401610b669061303f565b600061169960085490565b336000908152601d60205260409020546018549192509042106116c5576116c081856120b9565b6116d0565b6116d0818584612188565b6010546116dd8584613076565b11156116fb5760405162461bcd60e51b8152600401610b6690613089565b60015b84811161174657336000908152601d6020526040812080549161172083612f18565b909155506117349050336115748386613076565b8061173e81612f18565b9150506116fe565b5050505050565b336001600160a01b038316036117a55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b66565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b0316331461183b5760405162461bcd60e51b8152600401610b6690612e2c565b601a805461ff001916610100179055565b6118563383611dab565b6118725760405162461bcd60e51b8152600401610b6690612e9b565b61158b8484848461233a565b600c8054610cb690612e61565b6000818152600260205260409020546060906001600160a01b031661190a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b66565b601a54610100900460ff166119ab57600d805461192690612e61565b80601f016020809104026020016040519081016040528092919081815260200182805461195290612e61565b801561199f5780601f106119745761010080835404028352916020019161199f565b820191906000526020600020905b81548152906001019060200180831161198257829003601f168201915b50505050509050919050565b60006119b561236d565b905060008151116119d55760405180602001604052806000815250611a03565b806119df8461237c565b600c6040516020016119f3939291906130b9565b6040516020818303038152906040525b9392505050565b919050565b600a546001600160a01b03163314611a395760405162461bcd60e51b8152600401610b6690612e2c565b601555565b601a5460ff1615611a8a5760405162461bcd60e51b81526020600482015260166024820152751d1a194818dbdb9d1c9858dd081a5cc81c185d5cd95960521b6044820152606401610b66565b8260008111611aab5760405162461bcd60e51b8152600401610b669061303f565b828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611aea925083915061247d9050565b611b275760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b210383937b7b31760911b6044820152606401610b66565b6000611b3260085490565b336000908152601d6020526040902054601854919250904210611b5e57611b5981886120b9565b611b69565b611b698188846124c5565b601054611b768884613076565b1115611b945760405162461bcd60e51b8152600401610b6690613089565b60015b878111611bdf57336000908152601d60205260408120805491611bb983612f18565b90915550611bcd9050336115748386613076565b80611bd781612f18565b915050611b97565b5050505050505050565b600a546001600160a01b03163314611c135760405162461bcd60e51b8152600401610b6690612e2c565b600c6112068282612f7f565b600a546001600160a01b03163314611c495760405162461bcd60e51b8152600401610b6690612e2c565b600d6112068282612f7f565b600a546001600160a01b03163314611c7f5760405162461bcd60e51b8152600401610b6690612e2c565b6001600160a01b038116611ce45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b66565b61101f8161204d565b60006001600160e01b031982166380ac58cd60e01b1480611d1e57506001600160e01b03198216635b5e139f60e01b145b80610b3657506301ffc9a760e01b6001600160e01b0319831614610b36565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d728261120a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611e245760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b66565b6000611e2f8361120a565b9050806001600160a01b0316846001600160a01b03161480611e6a5750836001600160a01b0316611e5f84610c14565b6001600160a01b0316145b80611e9a57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611eb58261120a565b6001600160a01b031614611f1d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610b66565b6001600160a01b038216611f7f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b66565b611f8a8383836124d5565b611f95600082611d3d565b6001600160a01b0383166000908152600360205260408120805460019290611fbe908490613159565b90915550506001600160a01b0382166000908152600360205260408120805460019290611fec908490613076565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61120682826040518060200160405280600081525061258d565b6015546120c68284613076565b11156121145760405162461bcd60e51b815260206004820152601c60248201527f6d6178204e4654207065722061646472657373206578636565646564000000006044820152606401610b66565b80600f54612122919061316c565b3410156121665760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610b66565b6013548111156112065760405162461bcd60e51b8152600401610b6690613183565b6000601754421061219d5750600f54806121a3565b50600e54805b50336000908152601c602052604090205460ff166122035760405162461bcd60e51b815260206004820152601760248201527f75736572206973206e6f742077686974656c69737465640000000000000000006044820152606401610b66565b6014546122108486613076565b111561226f5760405162461bcd60e51b815260206004820152602860248201527f6d6178204e465420706572206164647265737320657863656564656420666f726044820152672070726573616c6560c01b6064820152608401610b66565b612279838261316c565b3410156122bd5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610b66565b6012548311156122df5760405162461bcd60e51b8152600401610b6690613183565b6011546122ec8484613076565b111561158b5760405162461bcd60e51b815260206004820152601e60248201527f6d6178204e46542070726573616c65206c696d697420657863656564656400006044820152606401610b66565b612345848484611ea2565b612351848484846125c0565b61158b5760405162461bcd60e51b8152600401610b66906131cb565b6060600b8054610b9190612e61565b6060816000036123a35750506040805180820190915260018152600360fc1b602082015290565b8160005b81156123cd57806123b781612f18565b91506123c69050600a83613233565b91506123a7565b60008167ffffffffffffffff8111156123e8576123e8612bdc565b6040519080825280601f01601f191660200182016040528015612412576020820181803683370190505b5090505b8415611e9a57612427600183613159565b9150612434600a86613247565b61243f906030613076565b60f81b81838151811061245457612454612eec565b60200101906001600160f81b031916908160001a905350612476600a86613233565b9450612416565b6040516bffffffffffffffffffffffff193360601b1660208201526000908190603401604051602081830303815290604052805190602001209050611a0383601954836126c1565b6014546000906122108486613076565b6001600160a01b0383166125305761252b81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612553565b816001600160a01b0316836001600160a01b0316146125535761255383826126d7565b6001600160a01b03821661256a57610e4781612774565b826001600160a01b0316826001600160a01b031614610e4757610e478282612823565b6125978383612867565b6125a460008484846125c0565b610e475760405162461bcd60e51b8152600401610b66906131cb565b60006001600160a01b0384163b156126b657604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061260490339089908890889060040161325b565b6020604051808303816000875af192505050801561263f575060408051601f3d908101601f1916820190925261263c91810190613298565b60015b61269c573d80801561266d576040519150601f19603f3d011682016040523d82523d6000602084013e612672565b606091505b5080516000036126945760405162461bcd60e51b8152600401610b66906131cb565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e9a565b506001949350505050565b6000826126ce85846129b5565b14949350505050565b600060016126e484611311565b6126ee9190613159565b600083815260076020526040902054909150808214612741576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061278690600190613159565b600083815260096020526040812054600880549394509092849081106127ae576127ae612eec565b9060005260206000200154905080600883815481106127cf576127cf612eec565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612807576128076132b5565b6001900381819060005260206000200160009055905550505050565b600061282e83611311565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166128bd5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b66565b6000818152600260205260409020546001600160a01b0316156129225760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b66565b61292e600083836124d5565b6001600160a01b0382166000908152600360205260408120805460019290612957908490613076565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815b8451811015611106576129e6828683815181106129d9576129d9612eec565b60200260200101516129fa565b9150806129f281612f18565b9150506129ba565b6000818310612a16576000828152602084905260409020611a03565b5060009182526020526040902090565b6001600160e01b03198116811461101f57600080fd5b600060208284031215612a4e57600080fd5b8135611a0381612a26565b80358015158114611a0a57600080fd5b600060208284031215612a7b57600080fd5b611a0382612a59565b60005b83811015612a9f578181015183820152602001612a87565b50506000910152565b60008151808452612ac0816020860160208601612a84565b601f01601f19169290920160200192915050565b602081526000611a036020830184612aa8565b600060208284031215612af957600080fd5b5035919050565b80356001600160a01b0381168114611a0a57600080fd5b60008060408385031215612b2a57600080fd5b612b3383612b00565b946020939093013593505050565b600060208284031215612b5357600080fd5b611a0382612b00565b600080600060608486031215612b7157600080fd5b612b7a84612b00565b9250612b8860208501612b00565b9150604084013590509250925092565b6020808252825182820181905260009190848201906040850190845b81811015612bd057835183529284019291840191600101612bb4565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612c0d57612c0d612bdc565b604051601f8501601f19908116603f01168101908282118183101715612c3557612c35612bdc565b81604052809350858152868686011115612c4e57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612c7a57600080fd5b813567ffffffffffffffff811115612c9157600080fd5b8201601f81018413612ca257600080fd5b611e9a84823560208401612bf2565b60008060408385031215612cc457600080fd5b82359150612cd460208401612b00565b90509250929050565b60008060408385031215612cf057600080fd5b612cf983612b00565b9150612cd460208401612a59565b60008060008060808587031215612d1d57600080fd5b612d2685612b00565b9350612d3460208601612b00565b925060408501359150606085013567ffffffffffffffff811115612d5757600080fd5b8501601f81018713612d6857600080fd5b612d7787823560208401612bf2565b91505092959194509250565b600080600060408486031215612d9857600080fd5b83359250602084013567ffffffffffffffff80821115612db757600080fd5b818601915086601f830112612dcb57600080fd5b813581811115612dda57600080fd5b8760208260051b8501011115612def57600080fd5b6020830194508093505050509250925092565b60008060408385031215612e1557600080fd5b612e1e83612b00565b9150612cd460208401612b00565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612e7557607f821691505b602082108103612e9557634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612f2a57612f2a612f02565b5060010190565b601f821115610e4757600081815260208120601f850160051c81016020861015612f585750805b601f850160051c820191505b81811015612f7757828155600101612f64565b505050505050565b815167ffffffffffffffff811115612f9957612f99612bdc565b612fad81612fa78454612e61565b84612f31565b602080601f831160018114612fe25760008415612fca5750858301515b600019600386901b1c1916600185901b178555612f77565b600085815260208120601f198616915b8281101561301157888601518255948401946001909101908401612ff2565b508582101561302f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6020808252601b908201527f6e65656420746f206d696e74206174206c656173742031204e46540000000000604082015260600190565b80820180821115610b3657610b36612f02565b6020808252601690820152751b585e08139195081b1a5b5a5d08195e18d95959195960521b604082015260600190565b6000845160206130cc8285838a01612a84565b8551918401916130df8184848a01612a84565b85549201916000906130f081612e61565b60018281168015613108576001811461311d57613149565b60ff1984168752821515830287019450613149565b896000528560002060005b8481101561314157815489820152908301908701613128565b505082870194505b50929a9950505050505050505050565b81810381811115610b3657610b36612f02565b8082028115828204841417610b3657610b36612f02565b60208082526028908201527f6d6178206d696e7420616d6f756e7420706572207472616e73616374696f6e20604082015267195e18d95959195960c21b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b6000826132425761324261321d565b500490565b6000826132565761325661321d565b500690565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061328e90830184612aa8565b9695505050505050565b6000602082840312156132aa57600080fd5b8151611a0381612a26565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220c3f389ea1f81681c1ee4ca09b0c61047d74dc4cfc512c4fc11cb7fa5b99d464264736f6c63430008130033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000a47686f756c20546f797300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a47484f554c20544f595300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d4e4d66563147507850457a563442446b31356f68684c746f776b436631465375564354564273646e4b6b515000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103ad5760003560e01c80636f9fb98a116101e7578063a18116f11161010d578063d0eb26b0116100a0578063e985e9c51161006f578063e985e9c514610a72578063eced387314610abb578063f2c4ce1e14610ad1578063f2fde38b14610af157600080fd5b8063d0eb26b014610a09578063d2cab05614610a29578063d5abeb0114610a3c578063da3ef23f14610a5257600080fd5b8063ba7d2c76116100dc578063ba7d2c76146109a8578063c6682862146109be578063c87b56dd146109d3578063cc9ff9c6146109f357600080fd5b8063a18116f11461093d578063a22cb46514610953578063a475b5dd14610973578063b88d4fde1461098857600080fd5b80637effc032116101855780638da5cb5b116101545780638da5cb5b146108d75780638fdcf942146108f557806395d89b4114610915578063a0712d681461092a57600080fd5b80637effc0321461086c5780637f00c7a614610882578063831e60de146108a257806383a076be146108b757600080fd5b8063715018a6116101c1578063715018a614610801578063743c7f6b146108165780637967a50a146108365780637cb647591461084c57600080fd5b80636f9fb98a146107b757806370a08231146107cc578063714c5398146107ec57600080fd5b80632e09282e116102d757806344a0d68a1161026a5780635c975abb116102395780635c975abb1461073d5780636352211e14610757578063669736c0146107775780636f8b44b01461079757600080fd5b806344a0d68a146106be5780634f6ccce7146106de57806351830227146106fe57806355f804b31461071d57600080fd5b80633ccfd60b116102a65780633ccfd60b1461064957806342842e0e1461065157806342f0ca0d14610671578063438b63001461069157600080fd5b80632e09282e146105aa5780632f2ea070146105c05780632f745c59146105f05780633af32abf1461061057600080fd5b80630a50716b1161034f57806318cae2691161031e57806318cae269146105315780631985cc651461055e578063239c70ae1461057457806323b872dd1461058a57600080fd5b80630a50716b146104b85780630e54a883146104d857806313faede6146104f857806318160ddd1461051c57600080fd5b8063081812fc1161038b578063081812fc1461042b578063081c8c4414610463578063095ea7b3146104785780630a403f041461049857600080fd5b806301ffc9a7146103b257806302329a29146103e757806306fdde0314610409575b600080fd5b3480156103be57600080fd5b506103d26103cd366004612a3c565b610b11565b60405190151581526020015b60405180910390f35b3480156103f357600080fd5b50610407610402366004612a69565b610b3c565b005b34801561041557600080fd5b5061041e610b82565b6040516103de9190612ad4565b34801561043757600080fd5b5061044b610446366004612ae7565b610c14565b6040516001600160a01b0390911681526020016103de565b34801561046f57600080fd5b5061041e610ca9565b34801561048457600080fd5b50610407610493366004612b17565b610d37565b3480156104a457600080fd5b506104076104b3366004612ae7565b610e4c565b3480156104c457600080fd5b506104076104d3366004612ae7565b610e7b565b3480156104e457600080fd5b506104076104f3366004612ae7565b610eaa565b34801561050457600080fd5b5061050e600f5481565b6040519081526020016103de565b34801561052857600080fd5b5060085461050e565b34801561053d57600080fd5b5061050e61054c366004612b41565b601d6020526000908152604090205481565b34801561056a57600080fd5b5061050e60165481565b34801561058057600080fd5b5061050e60135481565b34801561059657600080fd5b506104076105a5366004612b5c565b610ed9565b3480156105b657600080fd5b5061050e60145481565b3480156105cc57600080fd5b506103d26105db366004612b41565b601b6020526000908152604090205460ff1681565b3480156105fc57600080fd5b5061050e61060b366004612b17565b610f0a565b34801561061c57600080fd5b506103d261062b366004612b41565b6001600160a01b03166000908152601c602052604090205460ff1690565b610407610fa0565b34801561065d57600080fd5b5061040761066c366004612b5c565b611022565b34801561067d57600080fd5b5061040761068c366004612ae7565b61103d565b34801561069d57600080fd5b506106b16106ac366004612b41565b61106c565b6040516103de9190612b98565b3480156106ca57600080fd5b506104076106d9366004612ae7565b61110e565b3480156106ea57600080fd5b5061050e6106f9366004612ae7565b61113d565b34801561070a57600080fd5b50601a546103d290610100900460ff1681565b34801561072957600080fd5b50610407610738366004612c68565b6111d0565b34801561074957600080fd5b50601a546103d29060ff1681565b34801561076357600080fd5b5061044b610772366004612ae7565b61120a565b34801561078357600080fd5b50610407610792366004612ae7565b611281565b3480156107a357600080fd5b506104076107b2366004612ae7565b6112b0565b3480156107c357600080fd5b5061050e6112df565b3480156107d857600080fd5b5061050e6107e7366004612b41565b611311565b3480156107f857600080fd5b5061041e611398565b34801561080d57600080fd5b506104076113d2565b34801561082257600080fd5b50610407610831366004612ae7565b611408565b34801561084257600080fd5b5061050e60175481565b34801561085857600080fd5b50610407610867366004612ae7565b611437565b34801561087857600080fd5b5061050e60125481565b34801561088e57600080fd5b5061040761089d366004612ae7565b611466565b3480156108ae57600080fd5b5061050e611495565b3480156108c357600080fd5b506104076108d2366004612cb1565b6114af565b3480156108e357600080fd5b50600a546001600160a01b031661044b565b34801561090157600080fd5b50610407610910366004612ae7565b611591565b34801561092157600080fd5b5061041e6115c0565b610407610938366004612ae7565b6115cf565b34801561094957600080fd5b5061050e60115481565b34801561095f57600080fd5b5061040761096e366004612cdd565b61174d565b34801561097f57600080fd5b50610407611811565b34801561099457600080fd5b506104076109a3366004612d07565b61184c565b3480156109b457600080fd5b5061050e60155481565b3480156109ca57600080fd5b5061041e61187e565b3480156109df57600080fd5b5061041e6109ee366004612ae7565b61188b565b3480156109ff57600080fd5b5061050e600e5481565b348015610a1557600080fd5b50610407610a24366004612ae7565b611a0f565b610407610a37366004612d83565b611a3e565b348015610a4857600080fd5b5061050e60105481565b348015610a5e57600080fd5b50610407610a6d366004612c68565b611be9565b348015610a7e57600080fd5b506103d2610a8d366004612e02565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610ac757600080fd5b5061050e60185481565b348015610add57600080fd5b50610407610aec366004612c68565b611c1f565b348015610afd57600080fd5b50610407610b0c366004612b41565b611c55565b60006001600160e01b0319821663780e9d6360e01b1480610b365750610b3682611ced565b92915050565b600a546001600160a01b03163314610b6f5760405162461bcd60e51b8152600401610b6690612e2c565b60405180910390fd5b601a805460ff1916911515919091179055565b606060008054610b9190612e61565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbd90612e61565b8015610c0a5780601f10610bdf57610100808354040283529160200191610c0a565b820191906000526020600020905b815481529060010190602001808311610bed57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610c8d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b66565b506000908152600460205260409020546001600160a01b031690565b600d8054610cb690612e61565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce290612e61565b8015610d2f5780601f10610d0457610100808354040283529160200191610d2f565b820191906000526020600020905b815481529060010190602001808311610d1257829003601f168201915b505050505081565b6000610d428261120a565b9050806001600160a01b0316836001600160a01b031603610daf5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b66565b336001600160a01b0382161480610dcb5750610dcb8133610a8d565b610e3d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b66565b610e478383611d3d565b505050565b600a546001600160a01b03163314610e765760405162461bcd60e51b8152600401610b6690612e2c565b601155565b600a546001600160a01b03163314610ea55760405162461bcd60e51b8152600401610b6690612e2c565b601455565b600a546001600160a01b03163314610ed45760405162461bcd60e51b8152600401610b6690612e2c565b601855565b610ee33382611dab565b610eff5760405162461bcd60e51b8152600401610b6690612e9b565b610e47838383611ea2565b6000610f1583611311565b8210610f775760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b66565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610fca5760405162461bcd60e51b8152600401610b6690612e2c565b604051600090339047908381818185875af1925050503d806000811461100c576040519150601f19603f3d011682016040523d82523d6000602084013e611011565b606091505b505090508061101f57600080fd5b50565b610e478383836040518060200160405280600081525061184c565b600a546001600160a01b031633146110675760405162461bcd60e51b8152600401610b6690612e2c565b601755565b6060600061107983611311565b905060008167ffffffffffffffff81111561109657611096612bdc565b6040519080825280602002602001820160405280156110bf578160200160208202803683370190505b50905060005b82811015611106576110d78582610f0a565b8282815181106110e9576110e9612eec565b6020908102919091010152806110fe81612f18565b9150506110c5565b509392505050565b600a546001600160a01b031633146111385760405162461bcd60e51b8152600401610b6690612e2c565b600f55565b600061114860085490565b82106111ab5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b66565b600882815481106111be576111be612eec565b90600052602060002001549050919050565b600a546001600160a01b031633146111fa5760405162461bcd60e51b8152600401610b6690612e2c565b600b6112068282612f7f565b5050565b6000818152600260205260408120546001600160a01b031680610b365760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b66565b600a546001600160a01b031633146112ab5760405162461bcd60e51b8152600401610b6690612e2c565b601255565b600a546001600160a01b031633146112da5760405162461bcd60e51b8152600401610b6690612e2c565b601055565b600a546000906001600160a01b0316331461130c5760405162461bcd60e51b8152600401610b6690612e2c565b504790565b60006001600160a01b03821661137c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b66565b506001600160a01b031660009081526003602052604090205490565b600a546060906001600160a01b031633146113c55760405162461bcd60e51b8152600401610b6690612e2c565b600b8054610b9190612e61565b600a546001600160a01b031633146113fc5760405162461bcd60e51b8152600401610b6690612e2c565b611406600061204d565b565b600a546001600160a01b031633146114325760405162461bcd60e51b8152600401610b6690612e2c565b601655565b600a546001600160a01b031633146114615760405162461bcd60e51b8152600401610b6690612e2c565b601955565b600a546001600160a01b031633146114905760405162461bcd60e51b8152600401610b6690612e2c565b601355565b60006017544210156114a85750600e5490565b50600f5490565b600a546001600160a01b031633146114d95760405162461bcd60e51b8152600401610b6690612e2c565b600082116114f95760405162461bcd60e51b8152600401610b669061303f565b600061150460085490565b6010549091506115148483613076565b11156115325760405162461bcd60e51b8152600401610b6690613089565b60015b83811161158b576001600160a01b0383166000908152601d6020526040812080549161156083612f18565b909155506115799050836115748385613076565b61209f565b8061158381612f18565b915050611535565b50505050565b600a546001600160a01b031633146115bb5760405162461bcd60e51b8152600401610b6690612e2c565b600e55565b606060018054610b9190612e61565b601a5460ff161561161b5760405162461bcd60e51b81526020600482015260166024820152751d1a194818dbdb9d1c9858dd081a5cc81c185d5cd95960521b6044820152606401610b66565b60165442101561166d5760405162461bcd60e51b815260206004820152601860248201527f53616c6520686173206e6f7420737461727465642079657400000000000000006044820152606401610b66565b806000811161168e5760405162461bcd60e51b8152600401610b669061303f565b600061169960085490565b336000908152601d60205260409020546018549192509042106116c5576116c081856120b9565b6116d0565b6116d0818584612188565b6010546116dd8584613076565b11156116fb5760405162461bcd60e51b8152600401610b6690613089565b60015b84811161174657336000908152601d6020526040812080549161172083612f18565b909155506117349050336115748386613076565b8061173e81612f18565b9150506116fe565b5050505050565b336001600160a01b038316036117a55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b66565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b0316331461183b5760405162461bcd60e51b8152600401610b6690612e2c565b601a805461ff001916610100179055565b6118563383611dab565b6118725760405162461bcd60e51b8152600401610b6690612e9b565b61158b8484848461233a565b600c8054610cb690612e61565b6000818152600260205260409020546060906001600160a01b031661190a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b66565b601a54610100900460ff166119ab57600d805461192690612e61565b80601f016020809104026020016040519081016040528092919081815260200182805461195290612e61565b801561199f5780601f106119745761010080835404028352916020019161199f565b820191906000526020600020905b81548152906001019060200180831161198257829003601f168201915b50505050509050919050565b60006119b561236d565b905060008151116119d55760405180602001604052806000815250611a03565b806119df8461237c565b600c6040516020016119f3939291906130b9565b6040516020818303038152906040525b9392505050565b919050565b600a546001600160a01b03163314611a395760405162461bcd60e51b8152600401610b6690612e2c565b601555565b601a5460ff1615611a8a5760405162461bcd60e51b81526020600482015260166024820152751d1a194818dbdb9d1c9858dd081a5cc81c185d5cd95960521b6044820152606401610b66565b8260008111611aab5760405162461bcd60e51b8152600401610b669061303f565b828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611aea925083915061247d9050565b611b275760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b210383937b7b31760911b6044820152606401610b66565b6000611b3260085490565b336000908152601d6020526040902054601854919250904210611b5e57611b5981886120b9565b611b69565b611b698188846124c5565b601054611b768884613076565b1115611b945760405162461bcd60e51b8152600401610b6690613089565b60015b878111611bdf57336000908152601d60205260408120805491611bb983612f18565b90915550611bcd9050336115748386613076565b80611bd781612f18565b915050611b97565b5050505050505050565b600a546001600160a01b03163314611c135760405162461bcd60e51b8152600401610b6690612e2c565b600c6112068282612f7f565b600a546001600160a01b03163314611c495760405162461bcd60e51b8152600401610b6690612e2c565b600d6112068282612f7f565b600a546001600160a01b03163314611c7f5760405162461bcd60e51b8152600401610b6690612e2c565b6001600160a01b038116611ce45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b66565b61101f8161204d565b60006001600160e01b031982166380ac58cd60e01b1480611d1e57506001600160e01b03198216635b5e139f60e01b145b80610b3657506301ffc9a760e01b6001600160e01b0319831614610b36565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d728261120a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611e245760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b66565b6000611e2f8361120a565b9050806001600160a01b0316846001600160a01b03161480611e6a5750836001600160a01b0316611e5f84610c14565b6001600160a01b0316145b80611e9a57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611eb58261120a565b6001600160a01b031614611f1d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610b66565b6001600160a01b038216611f7f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b66565b611f8a8383836124d5565b611f95600082611d3d565b6001600160a01b0383166000908152600360205260408120805460019290611fbe908490613159565b90915550506001600160a01b0382166000908152600360205260408120805460019290611fec908490613076565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61120682826040518060200160405280600081525061258d565b6015546120c68284613076565b11156121145760405162461bcd60e51b815260206004820152601c60248201527f6d6178204e4654207065722061646472657373206578636565646564000000006044820152606401610b66565b80600f54612122919061316c565b3410156121665760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610b66565b6013548111156112065760405162461bcd60e51b8152600401610b6690613183565b6000601754421061219d5750600f54806121a3565b50600e54805b50336000908152601c602052604090205460ff166122035760405162461bcd60e51b815260206004820152601760248201527f75736572206973206e6f742077686974656c69737465640000000000000000006044820152606401610b66565b6014546122108486613076565b111561226f5760405162461bcd60e51b815260206004820152602860248201527f6d6178204e465420706572206164647265737320657863656564656420666f726044820152672070726573616c6560c01b6064820152608401610b66565b612279838261316c565b3410156122bd5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610b66565b6012548311156122df5760405162461bcd60e51b8152600401610b6690613183565b6011546122ec8484613076565b111561158b5760405162461bcd60e51b815260206004820152601e60248201527f6d6178204e46542070726573616c65206c696d697420657863656564656400006044820152606401610b66565b612345848484611ea2565b612351848484846125c0565b61158b5760405162461bcd60e51b8152600401610b66906131cb565b6060600b8054610b9190612e61565b6060816000036123a35750506040805180820190915260018152600360fc1b602082015290565b8160005b81156123cd57806123b781612f18565b91506123c69050600a83613233565b91506123a7565b60008167ffffffffffffffff8111156123e8576123e8612bdc565b6040519080825280601f01601f191660200182016040528015612412576020820181803683370190505b5090505b8415611e9a57612427600183613159565b9150612434600a86613247565b61243f906030613076565b60f81b81838151811061245457612454612eec565b60200101906001600160f81b031916908160001a905350612476600a86613233565b9450612416565b6040516bffffffffffffffffffffffff193360601b1660208201526000908190603401604051602081830303815290604052805190602001209050611a0383601954836126c1565b6014546000906122108486613076565b6001600160a01b0383166125305761252b81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612553565b816001600160a01b0316836001600160a01b0316146125535761255383826126d7565b6001600160a01b03821661256a57610e4781612774565b826001600160a01b0316826001600160a01b031614610e4757610e478282612823565b6125978383612867565b6125a460008484846125c0565b610e475760405162461bcd60e51b8152600401610b66906131cb565b60006001600160a01b0384163b156126b657604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061260490339089908890889060040161325b565b6020604051808303816000875af192505050801561263f575060408051601f3d908101601f1916820190925261263c91810190613298565b60015b61269c573d80801561266d576040519150601f19603f3d011682016040523d82523d6000602084013e612672565b606091505b5080516000036126945760405162461bcd60e51b8152600401610b66906131cb565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e9a565b506001949350505050565b6000826126ce85846129b5565b14949350505050565b600060016126e484611311565b6126ee9190613159565b600083815260076020526040902054909150808214612741576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061278690600190613159565b600083815260096020526040812054600880549394509092849081106127ae576127ae612eec565b9060005260206000200154905080600883815481106127cf576127cf612eec565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612807576128076132b5565b6001900381819060005260206000200160009055905550505050565b600061282e83611311565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166128bd5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b66565b6000818152600260205260409020546001600160a01b0316156129225760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b66565b61292e600083836124d5565b6001600160a01b0382166000908152600360205260408120805460019290612957908490613076565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815b8451811015611106576129e6828683815181106129d9576129d9612eec565b60200260200101516129fa565b9150806129f281612f18565b9150506129ba565b6000818310612a16576000828152602084905260409020611a03565b5060009182526020526040902090565b6001600160e01b03198116811461101f57600080fd5b600060208284031215612a4e57600080fd5b8135611a0381612a26565b80358015158114611a0a57600080fd5b600060208284031215612a7b57600080fd5b611a0382612a59565b60005b83811015612a9f578181015183820152602001612a87565b50506000910152565b60008151808452612ac0816020860160208601612a84565b601f01601f19169290920160200192915050565b602081526000611a036020830184612aa8565b600060208284031215612af957600080fd5b5035919050565b80356001600160a01b0381168114611a0a57600080fd5b60008060408385031215612b2a57600080fd5b612b3383612b00565b946020939093013593505050565b600060208284031215612b5357600080fd5b611a0382612b00565b600080600060608486031215612b7157600080fd5b612b7a84612b00565b9250612b8860208501612b00565b9150604084013590509250925092565b6020808252825182820181905260009190848201906040850190845b81811015612bd057835183529284019291840191600101612bb4565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612c0d57612c0d612bdc565b604051601f8501601f19908116603f01168101908282118183101715612c3557612c35612bdc565b81604052809350858152868686011115612c4e57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612c7a57600080fd5b813567ffffffffffffffff811115612c9157600080fd5b8201601f81018413612ca257600080fd5b611e9a84823560208401612bf2565b60008060408385031215612cc457600080fd5b82359150612cd460208401612b00565b90509250929050565b60008060408385031215612cf057600080fd5b612cf983612b00565b9150612cd460208401612a59565b60008060008060808587031215612d1d57600080fd5b612d2685612b00565b9350612d3460208601612b00565b925060408501359150606085013567ffffffffffffffff811115612d5757600080fd5b8501601f81018713612d6857600080fd5b612d7787823560208401612bf2565b91505092959194509250565b600080600060408486031215612d9857600080fd5b83359250602084013567ffffffffffffffff80821115612db757600080fd5b818601915086601f830112612dcb57600080fd5b813581811115612dda57600080fd5b8760208260051b8501011115612def57600080fd5b6020830194508093505050509250925092565b60008060408385031215612e1557600080fd5b612e1e83612b00565b9150612cd460208401612b00565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612e7557607f821691505b602082108103612e9557634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612f2a57612f2a612f02565b5060010190565b601f821115610e4757600081815260208120601f850160051c81016020861015612f585750805b601f850160051c820191505b81811015612f7757828155600101612f64565b505050505050565b815167ffffffffffffffff811115612f9957612f99612bdc565b612fad81612fa78454612e61565b84612f31565b602080601f831160018114612fe25760008415612fca5750858301515b600019600386901b1c1916600185901b178555612f77565b600085815260208120601f198616915b8281101561301157888601518255948401946001909101908401612ff2565b508582101561302f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6020808252601b908201527f6e65656420746f206d696e74206174206c656173742031204e46540000000000604082015260600190565b80820180821115610b3657610b36612f02565b6020808252601690820152751b585e08139195081b1a5b5a5d08195e18d95959195960521b604082015260600190565b6000845160206130cc8285838a01612a84565b8551918401916130df8184848a01612a84565b85549201916000906130f081612e61565b60018281168015613108576001811461311d57613149565b60ff1984168752821515830287019450613149565b896000528560002060005b8481101561314157815489820152908301908701613128565b505082870194505b50929a9950505050505050505050565b81810381811115610b3657610b36612f02565b8082028115828204841417610b3657610b36612f02565b60208082526028908201527f6d6178206d696e7420616d6f756e7420706572207472616e73616374696f6e20604082015267195e18d95959195960c21b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b6000826132425761324261321d565b500490565b6000826132565761325661321d565b500690565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061328e90830184612aa8565b9695505050505050565b6000602082840312156132aa57600080fd5b8151611a0381612a26565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220c3f389ea1f81681c1ee4ca09b0c61047d74dc4cfc512c4fc11cb7fa5b99d464264736f6c63430008130033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000a47686f756c20546f797300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a47484f554c20544f595300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d4e4d66563147507850457a563442446b31356f68684c746f776b436631465375564354564273646e4b6b515000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Ghoul Toys
Arg [1] : _symbol (string): GHOUL TOYS
Arg [2] : _initNotRevealedUri (string): https://gateway.pinata.cloud/ipfs/QmNMfV1GPxPEzV4BDk15ohhLtowkCf1FSuVCTVBsdnKkQP

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [4] : 47686f756c20546f797300000000000000000000000000000000000000000000
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [6] : 47484f554c20544f595300000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [8] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [9] : 732f516d4e4d66563147507850457a563442446b31356f68684c746f776b4366
Arg [10] : 31465375564354564273646e4b6b515000000000000000000000000000000000


Deployed Bytecode Sourcemap

51548:9291:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33668:224;;;;;;;;;;-1:-1:-1;33668:224:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;33668:224:0;;;;;;;;57609:79;;;;;;;;;;-1:-1:-1;57609:79:0;;;;;:::i;:::-;;:::i;:::-;;20800:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;22359:221::-;;;;;;;;;;-1:-1:-1;22359:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2047:32:1;;;2029:51;;2017:2;2002:18;22359:221:0;1883:203:1;51708:28:0;;;;;;;;;;;;;:::i;21882:411::-;;;;;;;;;;-1:-1:-1;21882:411:0;;;;;:::i;:::-;;:::i;58812:134::-;;;;;;;;;;-1:-1:-1;58812:134:0;;;;;:::i;:::-;;:::i;57700:124::-;;;;;;;;;;-1:-1:-1;57700:124:0;;;;;:::i;:::-;;:::i;59306:120::-;;;;;;;;;;-1:-1:-1;59306:120:0;;;;;:::i;:::-;;:::i;51791:34::-;;;;;;;;;;;;;;;;;;;2674:25:1;;;2662:2;2647:18;51791:34:0;2528:177:1;34308:113:0;;;;;;;;;;-1:-1:-1;34396:10:0;:17;34308:113;;52451:55;;;;;;;;;;-1:-1:-1;52451:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;52095:39;;;;;;;;;;;;;;;;51961:32;;;;;;;;;;;;;;;;23249:339;;;;;;;;;;-1:-1:-1;23249:339:0;;;;;:::i;:::-;;:::i;52000:44::-;;;;;;;;;;;;;;;;52338:52;;;;;;;;;;-1:-1:-1;52338:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;33976:256;;;;;;;;;;-1:-1:-1;33976:256:0;;;;;:::i;:::-;;:::i;56069:118::-;;;;;;;;;;-1:-1:-1;56069:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;56152:27:0;56128:4;56152:27;;;:20;:27;;;;;;;;;56069:118;59434:168;;;:::i;23659:185::-;;;;;;;;;;-1:-1:-1;23659:185:0;;;;;:::i;:::-;;:::i;59178:120::-;;;;;;;;;;-1:-1:-1;59178:120:0;;;;;:::i;:::-;;:::i;56195:358::-;;;;;;;;;;-1:-1:-1;56195:358:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;58058:86::-;;;;;;;;;;-1:-1:-1;58058:86:0;;;;;:::i;:::-;;:::i;34498:233::-;;;;;;;;;;-1:-1:-1;34498:233:0;;;;;:::i;:::-;;:::i;52301:28::-;;;;;;;;;;-1:-1:-1;52301:28:0;;;;;;;;;;;58430:104;;;;;;;;;;-1:-1:-1;58430:104:0;;;;;:::i;:::-;;:::i;52268:26::-;;;;;;;;;;-1:-1:-1;52268:26:0;;;;;;;;20494:239;;;;;;;;;;-1:-1:-1;20494:239:0;;;;;:::i;:::-;;:::i;58156:136::-;;;;;;;;;;-1:-1:-1;58156:136:0;;;;;:::i;:::-;;:::i;58954:100::-;;;;;;;;;;-1:-1:-1;58954:100:0;;;;;:::i;:::-;;:::i;57379:117::-;;;;;;;;;;;;;:::i;20224:208::-;;;;;;;;;;-1:-1:-1;20224:208:0;;;;;:::i;:::-;;:::i;57270:101::-;;;;;;;;;;;;;:::i;41377:94::-;;;;;;;;;;;;;:::i;59062:108::-;;;;;;;;;;-1:-1:-1;59062:108:0;;;;;:::i;:::-;;:::i;52141:42::-;;;;;;;;;;;;;;;;59826:94;;;;;;;;;;-1:-1:-1;59826:94:0;;;;;:::i;:::-;;:::i;51915:39::-;;;;;;;;;;;;;;;;58300:122;;;;;;;;;;-1:-1:-1;58300:122:0;;;;;:::i;:::-;;:::i;57037:201::-;;;;;;;;;;;;;:::i;55608:433::-;;;;;;;;;;-1:-1:-1;55608:433:0;;;;;:::i;:::-;;:::i;40726:87::-;;;;;;;;;;-1:-1:-1;40799:6:0;;-1:-1:-1;;;;;40799:6:0;40726:87;;57950:100;;;;;;;;;;-1:-1:-1;57950:100:0;;;;;:::i;:::-;;:::i;20969:104::-;;;;;;;;;;;;;:::i;54892:704::-;;;;;;:::i;:::-;;:::i;51870:38::-;;;;;;;;;;;;;;;;22652:295;;;;;;;;;;-1:-1:-1;22652:295:0;;;;;:::i;:::-;;:::i;57532:69::-;;;;;;;;;;;;;:::i;23915:328::-;;;;;;;;;;-1:-1:-1;23915:328:0;;;;;:::i;:::-;;:::i;52051:37::-;;;;;;;;;;;;;;;;51664;;;;;;;;;;;;;:::i;56561:468::-;;;;;;;;;;-1:-1:-1;56561:468:0;;;;;:::i;:::-;;:::i;51743:41::-;;;;;;;;;;;;;;;;57832:110;;;;;;;;;;-1:-1:-1;57832:110:0;;;;;:::i;:::-;;:::i;59930:777::-;;;;;;:::i;:::-;;:::i;51832:31::-;;;;;;;;;;;;;;;;58542:128;;;;;;;;;;-1:-1:-1;58542:128:0;;;;;:::i;:::-;;:::i;23018:164::-;;;;;;;;;;-1:-1:-1;23018:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;23139:25:0;;;23115:4;23139:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23018:164;52190:42;;;;;;;;;;;;;;;;58678:126;;;;;;;;;;-1:-1:-1;58678:126:0;;;;;:::i;:::-;;:::i;41626:192::-;;;;;;;;;;-1:-1:-1;41626:192:0;;;;;:::i;:::-;;:::i;33668:224::-;33770:4;-1:-1:-1;;;;;;33794:50:0;;-1:-1:-1;;;33794:50:0;;:90;;;33848:36;33872:11;33848:23;:36::i;:::-;33787:97;33668:224;-1:-1:-1;;33668:224:0:o;57609:79::-;40799:6;;-1:-1:-1;;;;;40799:6:0;15647:10;40946:23;40938:68;;;;-1:-1:-1;;;40938:68:0;;;;;;;:::i;:::-;;;;;;;;;57665:6:::1;:15:::0;;-1:-1:-1;;57665:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;57609:79::o;20800:100::-;20854:13;20887:5;20880:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20800:100;:::o;22359:221::-;22435:7;25842:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25842:16:0;22455:73;;;;-1:-1:-1;;;22455:73:0;;8372:2:1;22455:73:0;;;8354:21:1;8411:2;8391:18;;;8384:30;8450:34;8430:18;;;8423:62;-1:-1:-1;;;8501:18:1;;;8494:42;8553:19;;22455:73:0;8170:408:1;22455:73:0;-1:-1:-1;22548:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;22548:24:0;;22359:221::o;51708:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21882:411::-;21963:13;21979:23;21994:7;21979:14;:23::i;:::-;21963:39;;22027:5;-1:-1:-1;;;;;22021:11:0;:2;-1:-1:-1;;;;;22021:11:0;;22013:57;;;;-1:-1:-1;;;22013:57:0;;8785:2:1;22013:57:0;;;8767:21:1;8824:2;8804:18;;;8797:30;8863:34;8843:18;;;8836:62;-1:-1:-1;;;8914:18:1;;;8907:31;8955:19;;22013:57:0;8583:397:1;22013:57:0;15647:10;-1:-1:-1;;;;;22105:21:0;;;;:62;;-1:-1:-1;22130:37:0;22147:5;15647:10;23018:164;:::i;22130:37::-;22083:168;;;;-1:-1:-1;;;22083:168:0;;9187:2:1;22083:168:0;;;9169:21:1;9226:2;9206:18;;;9199:30;9265:34;9245:18;;;9238:62;9336:26;9316:18;;;9309:54;9380:19;;22083:168:0;8985:420:1;22083:168:0;22264:21;22273:2;22277:7;22264:8;:21::i;:::-;21952:341;21882:411;;:::o;58812:134::-;40799:6;;-1:-1:-1;;;;;40799:6:0;15647:10;40946:23;40938:68;;;;-1:-1:-1;;;40938:68:0;;;;;;;:::i;:::-;58899:16:::1;:39:::0;58812:134::o;57700:124::-;40799:6;;-1:-1:-1;;;;;40799:6:0;15647:10;40946:23;40938:68;;;;-1:-1:-1;;;40938:68:0;;;;;;;:::i;:::-;57782:25:::1;:34:::0;57700:124::o;59306:120::-;40799:6;;-1:-1:-1;;;;;40799:6:0;15647:10;40946:23;40938:68;;;;-1:-1:-1;;;40938:68:0;;;;;;;:::i;:::-;59386:14:::1;:32:::0;59306:120::o;23249:339::-;23444:41;15647:10;23477:7;23444:18;:41::i;:::-;23436:103;;;;-1:-1:-1;;;23436:103:0;;;;;;;:::i;:::-;23552:28;23562:4;23568:2;23572:7;23552:9;:28::i;33976:256::-;34073:7;34109:23;34126:5;34109:16;:23::i;:::-;34101:5;:31;34093:87;;;;-1:-1:-1;;;34093:87:0;;10030:2:1;34093:87:0;;;10012:21:1;10069:2;10049:18;;;10042:30;10108:34;10088:18;;;10081:62;-1:-1:-1;;;10159:18:1;;;10152:41;10210:19;;34093:87:0;9828:407:1;34093:87:0;-1:-1:-1;;;;;;34198:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;33976:256::o;59434:168::-;40799:6;;-1:-1:-1;;;;;40799:6:0;15647:10;40946:23;40938:68;;;;-1:-1:-1;;;40938:68:0;;;;;;;:::i;:::-;59509:58:::1;::::0;59491:12:::1;::::0;59517:10:::1;::::0;59541:21:::1;::::0;59491:12;59509:58;59491:12;59509:58;59541:21;59517:10;59509:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59490:77;;;59586:7;59578:16;;;::::0;::::1;;59479:123;59434:168::o:0;23659:185::-;23797:39;23814:4;23820:2;23824:7;23797:39;;;;;;;;;;;;:16;:39::i;59178:120::-;40799:6;;-1:-1:-1;;;;;40799:6:0;15647:10;40946:23;40938:68;;;;-1:-1:-1;;;40938:68:0;;;;;;;:::i;:::-;59258:14:::1;:32:::0;59178:120::o;56195:358::-;56255:16;56284:23;56310:17;56320:6;56310:9;:17::i;:::-;56284:43;;56338:25;56380:15;56366:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56366:30:0;;56338:58;;56412:9;56407:113;56427:15;56423:1;:19;56407:113;;;56478:30;56498:6;56506:1;56478:19;:30::i;:::-;56464:8;56473:1;56464:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;56444:3;;;;:::i;:::-;;;;56407:113;;;-1:-1:-1;56537:8:0;56195:358;-1:-1:-1;;;56195:358:0:o;58058:86::-;40799:6;;-1:-1:-1;;;;;40799:6:0;15647:10;40946:23;40938:68;;;;-1:-1:-1;;;40938:68:0;;;;;;;:::i;:::-;58121:4:::1;:15:::0;58058:86::o;34498:233::-;34573:7;34609:30;34396:10;:17;;34308:113;34609:30;34601:5;:38;34593:95;;;;-1:-1:-1;;;34593:95:0;;11056:2:1;34593:95:0;;;11038:21:1;11095:2;11075:18;;;11068:30;11134:34;11114:18;;;11107:62;-1:-1:-1;;;11185:18:1;;;11178:42;11237:19;;34593:95:0;10854:408:1;34593:95:0;34706:10;34717:5;34706:17;;;;;;;;:::i;:::-;;;;;;;;;34699:24;;34498:233;;;:::o;58430:104::-;40799:6;;-1:-1:-1;;;;;40799:6:0;15647:10;40946:23;40938:68;;;;-1:-1:-1;;;40938:68:0;;;;;;;:::i;:::-;58505:7:::1;:21;58515:11:::0;58505:7;:21:::1;:::i;:::-;;58430:104:::0;:::o;20494:239::-;20566:7;20602:16;;;:7;:16;;;;;;-1:-1:-1;;;;;20602:16:0;;20629:73;;;;-1:-1:-1;;;20629:73:0;;13673:2:1;20629:73:0;;;13655:21:1;13712:2;13692:18;;;13685:30;13751:34;13731:18;;;13724:62;-1:-1:-1;;;13802:18:1;;;13795:39;13851:19;;20629:73:0;13471:405:1;58156:136:0;40799:6;;-1:-1:-1;;;;;40799:6:0;15647:10;40946:23;40938:68;;;;-1:-1:-1;;;40938:68:0;;;;;;;:::i;:::-;58244:20:::1;:40:::0;58156:136::o;58954:100::-;40799:6;;-1:-1:-1;;;;;40799:6:0;15647:10;40946:23;40938:68;;;;-1:-1:-1;;;40938:68:0;;;;;;;:::i;:::-;59024:9:::1;:22:::0;58954:100::o;57379:117::-;40799:6;;57440:7;;-1:-1:-1;;;;;40799:6:0;15647:10;40946:23;40938:68;;;;-1:-1:-1;;;40938:68:0;;;;;;;:::i;:::-;-1:-1:-1;57467:21:0::1;57379:117:::0;:::o;20224:208::-;20296:7;-1:-1:-1;;;;;20324:19:0;;20316:74;;;;-1:-1:-1;;;20316:74:0;;14083:2:1;20316:74:0;;;14065:21:1;14122:2;14102:18;;;14095:30;14161:34;14141:18;;;14134:62;-1:-1:-1;;;14212:18:1;;;14205:40;14262:19;;20316:74:0;13881:406:1;20316:74:0;-1:-1:-1;;;;;;20408:16:0;;;;;:9;:16;;;;;;;20224:208::o;57270:101::-;40799:6;;57323:13;;-1:-1:-1;;;;;40799:6:0;15647:10;40946:23;40938:68;;;;-1:-1:-1;;;40938:68:0;;;;;;;:::i;:::-;57356:7:::1;57349:14;;;;;:::i;41377:94::-:0;40799:6;;-1:-1:-1;;;;;40799:6:0;15647:10;40946:23;40938:68;;;;-1:-1:-1;;;40938:68:0;;;;;;;:::i;:::-;41442:21:::1;41460:1;41442:9;:21::i;:::-;41377:94::o:0;59062:108::-;40799:6;;-1:-1:-1;;;;;40799:6:0;15647:10;40946:23;40938:68;;;;-1:-1:-1;;;40938:68:0;;;;;;;:::i;:::-;59136:11:::1;:26:::0;59062:108::o;59826:94::-;40799:6;;-1:-1:-1;;;;;40799:6:0;15647:10;40946:23;40938:68;;;;-1:-1:-1;;;40938:68:0;;;;;;;:::i;:::-;59894:10:::1;:18:::0;59826:94::o;58300:122::-;40799:6;;-1:-1:-1;;;;;40799:6:0;15647:10;40946:23;40938:68;;;;-1:-1:-1;;;40938:68:0;;;;;;;:::i;:::-;58381:13:::1;:33:::0;58300:122::o;57037:201::-;57084:7;57126:14;;57108:15;:32;57104:127;;;-1:-1:-1;57164:11:0;;;57037:201::o;57104:127::-;-1:-1:-1;57215:4:0;;;57037:201::o;55608:433::-;40799:6;;-1:-1:-1;;;;;40799:6:0;15647:10;40946:23;40938:68;;;;-1:-1:-1;;;40938:68:0;;;;;;;:::i;:::-;55714:1:::1;55700:11;:15;55692:55;;;;-1:-1:-1::0;;;55692:55:0::1;;;;;;;:::i;:::-;55758:14;55775:13;34396:10:::0;:17;;34308:113;55775:13:::1;55831:9;::::0;55758:30;;-1:-1:-1;55807:20:0::1;55816:11:::0;55758:30;55807:20:::1;:::i;:::-;:33;;55799:68;;;;-1:-1:-1::0;;;55799:68:0::1;;;;;;;:::i;:::-;55897:1;55880:154;55905:11;55900:1;:16;55880:154;;-1:-1:-1::0;;;;;55938:33:0;::::1;;::::0;;;:20:::1;:33;::::0;;;;:35;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;55988:34:0::1;::::0;-1:-1:-1;55998:11:0;56011:10:::1;56020:1:::0;56011:6;:10:::1;:::i;:::-;55988:9;:34::i;:::-;55918:3:::0;::::1;::::0;::::1;:::i;:::-;;;;55880:154;;;;55681:360;55608:433:::0;;:::o;57950:100::-;40799:6;;-1:-1:-1;;;;;40799:6:0;15647:10;40946:23;40938:68;;;;-1:-1:-1;;;40938:68:0;;;;;;;:::i;:::-;58020:11:::1;:22:::0;57950:100::o;20969:104::-;21025:13;21058:7;21051:14;;;;;:::i;54892:704::-;52755:6;;;;52754:7;52746:42;;;;-1:-1:-1;;;52746:42:0;;15331:2:1;52746:42:0;;;15313:21:1;15370:2;15350:18;;;15343:30;-1:-1:-1;;;15389:18:1;;;15382:52;15451:18;;52746:42:0;15129:346:1;52746:42:0;52876:11:::1;;52857:15;:30;;52849:67;;;::::0;-1:-1:-1;;;52849:67:0;;15682:2:1;52849:67:0::1;::::0;::::1;15664:21:1::0;15721:2;15701:18;;;15694:30;15760:26;15740:18;;;15733:54;15804:18;;52849:67:0::1;15480:348:1::0;52849:67:0::1;54982:11:::2;53025:1;53011:11;:15;53003:55;;;;-1:-1:-1::0;;;53003:55:0::2;;;;;;;:::i;:::-;55006:14:::3;55023:13;34396:10:::0;:17;;34308:113;55023:13:::3;55095:10;55047:24;55074:32:::0;;;:20:::3;:32;::::0;;;;;55214:14:::3;::::0;55006:30;;-1:-1:-1;55074:32:0;55196:15:::3;:32;:147;;55291:52;55313:16;55331:11;55291:21;:52::i;:::-;55196:147;;;55231:57;55250:16;55268:11;55281:6;55231:18;:57::i;:::-;55388:9;::::0;55364:20:::3;55373:11:::0;55364:6;:20:::3;:::i;:::-;:33;;55356:68;;;;-1:-1:-1::0;;;55356:68:0::3;;;;;;;:::i;:::-;55454:1;55437:152;55462:11;55457:1;:16;55437:152;;55516:10;55495:32;::::0;;;:20:::3;:32;::::0;;;;:34;;;::::3;::::0;::::3;:::i;:::-;::::0;;;-1:-1:-1;55544:33:0::3;::::0;-1:-1:-1;55554:10:0::3;55566;55575:1:::0;55566:6;:10:::3;:::i;55544:33::-;55475:3:::0;::::3;::::0;::::3;:::i;:::-;;;;55437:152;;;;54995:601;;52927:1:::2;54892:704:::0;:::o;22652:295::-;15647:10;-1:-1:-1;;;;;22755:24:0;;;22747:62;;;;-1:-1:-1;;;22747:62:0;;16035:2:1;22747:62:0;;;16017:21:1;16074:2;16054:18;;;16047:30;16113:27;16093:18;;;16086:55;16158:18;;22747:62:0;15833:349:1;22747:62:0;15647:10;22822:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;22822:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;22822:53:0;;;;;;;;;;22891:48;;540:41:1;;;22822:42:0;;15647:10;22891:48;;513:18:1;22891:48:0;;;;;;;22652:295;;:::o;57532:69::-;40799:6;;-1:-1:-1;;;;;40799:6:0;15647:10;40946:23;40938:68;;;;-1:-1:-1;;;40938:68:0;;;;;;;:::i;:::-;57578:8:::1;:15:::0;;-1:-1:-1;;57578:15:0::1;;;::::0;;57532:69::o;23915:328::-;24090:41;15647:10;24123:7;24090:18;:41::i;:::-;24082:103;;;;-1:-1:-1;;;24082:103:0;;;;;;;:::i;:::-;24196:39;24210:4;24216:2;24220:7;24229:5;24196:13;:39::i;51664:37::-;;;;;;;:::i;56561:468::-;25818:4;25842:16;;;:7;:16;;;;;;56634:13;;-1:-1:-1;;;;;25842:16:0;56660:76;;;;-1:-1:-1;;;56660:76:0;;16389:2:1;56660:76:0;;;16371:21:1;16428:2;16408:18;;;16401:30;16467:34;16447:18;;;16440:62;-1:-1:-1;;;16518:18:1;;;16511:45;16573:19;;56660:76:0;16187:411:1;56660:76:0;56754:8;;;;;;;56749:273;;56786:14;56779:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56561:468;;;:::o;56749:273::-;56833:28;56864:10;:8;:10::i;:::-;56833:41;;56927:1;56902:14;56896:28;:32;:114;;;;;;;;;;;;;;;;;56955:14;56970:18;:7;:16;:18::i;:::-;56990:13;56938:66;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56896:114;56889:121;56561:468;-1:-1:-1;;;56561:468:0:o;56749:273::-;56561:468;;;:::o;57832:110::-;40799:6;;-1:-1:-1;;;;;40799:6:0;15647:10;40946:23;40938:68;;;;-1:-1:-1;;;40938:68:0;;;;;;;:::i;:::-;57907:18:::1;:27:::0;57832:110::o;59930:777::-;52755:6;;;;52754:7;52746:42;;;;-1:-1:-1;;;52746:42:0;;15331:2:1;52746:42:0;;;15313:21:1;15370:2;15350:18;;;15343:30;-1:-1:-1;;;15389:18:1;;;15382:52;15451:18;;52746:42:0;15129:346:1;52746:42:0;60067:11:::1;53025:1;53011:11;:15;53003:55;;;;-1:-1:-1::0;;;53003:55:0::1;;;;;;;:::i;:::-;60099:5:::2;;60715:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;60780:17:0::2;::::0;-1:-1:-1;60791:5:0;;-1:-1:-1;60780:10:0::2;::::0;-1:-1:-1;60780:17:0:i:2;:::-;60772:44;;;::::0;-1:-1:-1;;;60772:44:0;;18066:2:1;60772:44:0::2;::::0;::::2;18048:21:1::0;18105:2;18085:18;;;18078:30;-1:-1:-1;;;18124:18:1;;;18117:44;18178:18;;60772:44:0::2;17864:338:1::0;60772:44:0::2;60122:14:::3;60139:13;34396:10:::0;:17;;34308:113;60139:13:::3;60211:10;60163:24;60190:32:::0;;;:20:::3;:32;::::0;;;;;60330:14:::3;::::0;60122:30;;-1:-1:-1;60190:32:0;60312:15:::3;:32;:142;;60402:52;60424:16;60442:11;60402:21;:52::i;:::-;60312:142;;;60347:52;60361:16;60379:11;60392:6;60347:13;:52::i;:::-;60499:9;::::0;60475:20:::3;60484:11:::0;60475:6;:20:::3;:::i;:::-;:33;;60467:68;;;;-1:-1:-1::0;;;60467:68:0::3;;;;;;;:::i;:::-;60565:1;60548:152;60573:11;60568:1;:16;60548:152;;60627:10;60606:32;::::0;;;:20:::3;:32;::::0;;;;:34;;;::::3;::::0;::::3;:::i;:::-;::::0;;;-1:-1:-1;60655:33:0::3;::::0;-1:-1:-1;60665:10:0::3;60677;60686:1:::0;60677:6;:10:::3;:::i;60655:33::-;60586:3:::0;::::3;::::0;::::3;:::i;:::-;;;;60548:152;;;;60111:596;;53069:1:::2;52800::::1;59930:777:::0;;;:::o;58542:128::-;40799:6;;-1:-1:-1;;;;;40799:6:0;15647:10;40946:23;40938:68;;;;-1:-1:-1;;;40938:68:0;;;;;;;:::i;:::-;58629:13:::1;:33;58645:17:::0;58629:13;:33:::1;:::i;58678:126::-:0;40799:6;;-1:-1:-1;;;;;40799:6:0;15647:10;40946:23;40938:68;;;;-1:-1:-1;;;40938:68:0;;;;;;;:::i;:::-;58764:14:::1;:32;58781:15:::0;58764:14;:32:::1;:::i;41626:192::-:0;40799:6;;-1:-1:-1;;;;;40799:6:0;15647:10;40946:23;40938:68;;;;-1:-1:-1;;;40938:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41715:22:0;::::1;41707:73;;;::::0;-1:-1:-1;;;41707:73:0;;18409:2:1;41707:73:0::1;::::0;::::1;18391:21:1::0;18448:2;18428:18;;;18421:30;18487:34;18467:18;;;18460:62;-1:-1:-1;;;18538:18:1;;;18531:36;18584:19;;41707:73:0::1;18207:402:1::0;41707:73:0::1;41791:19;41801:8;41791:9;:19::i;19855:305::-:0;19957:4;-1:-1:-1;;;;;;19994:40:0;;-1:-1:-1;;;19994:40:0;;:105;;-1:-1:-1;;;;;;;20051:48:0;;-1:-1:-1;;;20051:48:0;19994:105;:158;;;-1:-1:-1;;;;;;;;;;18573:40:0;;;20116:36;18464:157;29735:174;29810:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;29810:29:0;-1:-1:-1;;;;;29810:29:0;;;;;;;;:24;;29864:23;29810:24;29864:14;:23::i;:::-;-1:-1:-1;;;;;29855:46:0;;;;;;;;;;;29735:174;;:::o;26047:348::-;26140:4;25842:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25842:16:0;26157:73;;;;-1:-1:-1;;;26157:73:0;;18816:2:1;26157:73:0;;;18798:21:1;18855:2;18835:18;;;18828:30;18894:34;18874:18;;;18867:62;-1:-1:-1;;;18945:18:1;;;18938:42;18997:19;;26157:73:0;18614:408:1;26157:73:0;26241:13;26257:23;26272:7;26257:14;:23::i;:::-;26241:39;;26310:5;-1:-1:-1;;;;;26299:16:0;:7;-1:-1:-1;;;;;26299:16:0;;:51;;;;26343:7;-1:-1:-1;;;;;26319:31:0;:20;26331:7;26319:11;:20::i;:::-;-1:-1:-1;;;;;26319:31:0;;26299:51;:87;;;-1:-1:-1;;;;;;23139:25:0;;;23115:4;23139:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;26354:32;26291:96;26047:348;-1:-1:-1;;;;26047:348:0:o;29039:578::-;29198:4;-1:-1:-1;;;;;29171:31:0;:23;29186:7;29171:14;:23::i;:::-;-1:-1:-1;;;;;29171:31:0;;29163:85;;;;-1:-1:-1;;;29163:85:0;;19229:2:1;29163:85:0;;;19211:21:1;19268:2;19248:18;;;19241:30;19307:34;19287:18;;;19280:62;-1:-1:-1;;;19358:18:1;;;19351:39;19407:19;;29163:85:0;19027:405:1;29163:85:0;-1:-1:-1;;;;;29267:16:0;;29259:65;;;;-1:-1:-1;;;29259:65:0;;19639:2:1;29259:65:0;;;19621:21:1;19678:2;19658:18;;;19651:30;19717:34;19697:18;;;19690:62;-1:-1:-1;;;19768:18:1;;;19761:34;19812:19;;29259:65:0;19437:400:1;29259:65:0;29337:39;29358:4;29364:2;29368:7;29337:20;:39::i;:::-;29441:29;29458:1;29462:7;29441:8;:29::i;:::-;-1:-1:-1;;;;;29483:15:0;;;;;;:9;:15;;;;;:20;;29502:1;;29483:15;:20;;29502:1;;29483:20;:::i;:::-;;;;-1:-1:-1;;;;;;;29514:13:0;;;;;;:9;:13;;;;;:18;;29531:1;;29514:13;:18;;29531:1;;29514:18;:::i;:::-;;;;-1:-1:-1;;29543:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29543:21:0;-1:-1:-1;;;;;29543:21:0;;;;;;;;;29582:27;;29543:16;;29582:27;;;;;;;29039:578;;;:::o;41826:173::-;41901:6;;;-1:-1:-1;;;;;41918:17:0;;;-1:-1:-1;;;;;;41918:17:0;;;;;;;41951:40;;41901:6;;;41918:17;41901:6;;41951:40;;41882:16;;41951:40;41871:128;41826:173;:::o;26737:110::-;26813:26;26823:2;26827:7;26813:26;;;;;;;;;;;;:9;:26::i;54508:364::-;54650:18;;54615:31;54635:11;54615:17;:31;:::i;:::-;:53;;54607:93;;;;-1:-1:-1;;;54607:93:0;;20177:2:1;54607:93:0;;;20159:21:1;20216:2;20196:18;;;20189:30;20255;20235:18;;;20228:58;20303:18;;54607:93:0;19975:352:1;54607:93:0;54739:11;54732:4;;:18;;;;:::i;:::-;54719:9;:31;;54711:62;;;;-1:-1:-1;;;54711:62:0;;20707:2:1;54711:62:0;;;20689:21:1;20746:2;20726:18;;;20719:30;-1:-1:-1;;;20765:18:1;;;20758:48;20823:18;;54711:62:0;20505:342:1;54711:62:0;54807:13;;54792:11;:28;;54784:80;;;;-1:-1:-1;;;54784:80:0;;;;;;;:::i;53219:724::-;53336:18;53387:14;;53369:15;:32;:79;;-1:-1:-1;53444:4:0;;;53369:79;;;-1:-1:-1;53417:11:0;;;53369:79;-1:-1:-1;53485:10:0;56128:4;56152:27;;;:20;:27;;;;;;;;53463:61;;;;-1:-1:-1;;;53463:61:0;;21463:2:1;53463:61:0;;;21445:21:1;21502:2;21482:18;;;21475:30;21541:25;21521:18;;;21514:53;21584:18;;53463:61:0;21261:347:1;53463:61:0;53582:25;;53547:31;53567:11;53547:17;:31;:::i;:::-;:60;;53539:113;;;;-1:-1:-1;;;53539:113:0;;21815:2:1;53539:113:0;;;21797:21:1;21854:2;21834:18;;;21827:30;21893:34;21873:18;;;21866:62;-1:-1:-1;;;21944:18:1;;;21937:38;21992:19;;53539:113:0;21613:404:1;53539:113:0;53688:24;53701:11;53688:10;:24;:::i;:::-;53675:9;:37;;53667:68;;;;-1:-1:-1;;;53667:68:0;;20707:2:1;53667:68:0;;;20689:21:1;20746:2;20726:18;;;20719:30;-1:-1:-1;;;20765:18:1;;;20758:48;20823:18;;53667:68:0;20505:342:1;53667:68:0;53773:20;;53758:11;:35;;53750:87;;;;-1:-1:-1;;;53750:87:0;;;;;;;:::i;:::-;53885:16;;53860:21;53870:11;53860:7;:21;:::i;:::-;:41;;53852:83;;;;-1:-1:-1;;;53852:83:0;;22224:2:1;53852:83:0;;;22206:21:1;22263:2;22243:18;;;22236:30;22302:32;22282:18;;;22275:60;22352:18;;53852:83:0;22022:354:1;25125:315:0;25282:28;25292:4;25298:2;25302:7;25282:9;:28::i;:::-;25329:48;25352:4;25358:2;25362:7;25371:5;25329:22;:48::i;:::-;25321:111;;;;-1:-1:-1;;;25321:111:0;;;;;;;:::i;53103:108::-;53163:13;53196:7;53189:14;;;;;:::i;16007:723::-;16063:13;16284:5;16293:1;16284:10;16280:53;;-1:-1:-1;;16311:10:0;;;;;;;;;;;;-1:-1:-1;;;16311:10:0;;;;;16007:723::o;16280:53::-;16358:5;16343:12;16399:78;16406:9;;16399:78;;16432:8;;;;:::i;:::-;;-1:-1:-1;16455:10:0;;-1:-1:-1;16463:2:0;16455:10;;:::i;:::-;;;16399:78;;;16487:19;16519:6;16509:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16509:17:0;;16487:39;;16537:154;16544:10;;16537:154;;16571:11;16581:1;16571:11;;:::i;:::-;;-1:-1:-1;16640:10:0;16648:2;16640:5;:10;:::i;:::-;16627:24;;:2;:24;:::i;:::-;16614:39;;16597:6;16604;16597:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;16597:56:0;;;;;;;;-1:-1:-1;16668:11:0;16677:2;16668:11;;:::i;:::-;;;16537:154;;59610:208;59719:28;;-1:-1:-1;;59736:10:0;23323:2:1;23319:15;23315:53;59719:28:0;;;23303:66:1;59677:4:0;;;;23385:12:1;;59719:28:0;;;;;;;;;;;;59709:39;;;;;;59694:54;;59766:44;59785:6;59793:10;;59805:4;59766:18;:44::i;53951:549::-;54139:25;;54063:18;;54104:31;54124:11;54104:17;:31;:::i;35344:589::-;-1:-1:-1;;;;;35550:18:0;;35546:187;;35585:40;35617:7;36760:10;:17;;36733:24;;;;:15;:24;;;;;:44;;;36788:24;;;;;;;;;;;;36656:164;35585:40;35546:187;;;35655:2;-1:-1:-1;;;;;35647:10:0;:4;-1:-1:-1;;;;;35647:10:0;;35643:90;;35674:47;35707:4;35713:7;35674:32;:47::i;:::-;-1:-1:-1;;;;;35747:16:0;;35743:183;;35780:45;35817:7;35780:36;:45::i;35743:183::-;35853:4;-1:-1:-1;;;;;35847:10:0;:2;-1:-1:-1;;;;;35847:10:0;;35843:83;;35874:40;35902:2;35906:7;35874:27;:40::i;27074:321::-;27204:18;27210:2;27214:7;27204:5;:18::i;:::-;27255:54;27286:1;27290:2;27294:7;27303:5;27255:22;:54::i;:::-;27233:154;;;;-1:-1:-1;;;27233:154:0;;;;;;;:::i;30474:799::-;30629:4;-1:-1:-1;;;;;30650:13:0;;8019:20;8067:8;30646:620;;30686:72;;-1:-1:-1;;;30686:72:0;;-1:-1:-1;;;;;30686:36:0;;;;;:72;;15647:10;;30737:4;;30743:7;;30752:5;;30686:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30686:72:0;;;;;;;;-1:-1:-1;;30686:72:0;;;;;;;;;;;;:::i;:::-;;;30682:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30928:6;:13;30945:1;30928:18;30924:272;;30971:60;;-1:-1:-1;;;30971:60:0;;;;;;;:::i;30924:272::-;31146:6;31140:13;31131:6;31127:2;31123:15;31116:38;30682:529;-1:-1:-1;;;;;;30809:51:0;-1:-1:-1;;;30809:51:0;;-1:-1:-1;30802:58:0;;30646:620;-1:-1:-1;31250:4:0;30474:799;;;;;;:::o;43130:190::-;43255:4;43308;43279:25;43292:5;43299:4;43279:12;:25::i;:::-;:33;;43130:190;-1:-1:-1;;;;43130:190:0:o;37447:988::-;37713:22;37763:1;37738:22;37755:4;37738:16;:22::i;:::-;:26;;;;:::i;:::-;37775:18;37796:26;;;:17;:26;;;;;;37713:51;;-1:-1:-1;37929:28:0;;;37925:328;;-1:-1:-1;;;;;37996:18:0;;37974:19;37996:18;;;:12;:18;;;;;;;;:34;;;;;;;;;38047:30;;;;;;:44;;;38164:30;;:17;:30;;;;;:43;;;37925:328;-1:-1:-1;38349:26:0;;;;:17;:26;;;;;;;;38342:33;;;-1:-1:-1;;;;;38393:18:0;;;;;:12;:18;;;;;:34;;;;;;;38386:41;37447:988::o;38730:1079::-;39008:10;:17;38983:22;;39008:21;;39028:1;;39008:21;:::i;:::-;39040:18;39061:24;;;:15;:24;;;;;;39434:10;:26;;38983:46;;-1:-1:-1;39061:24:0;;38983:46;;39434:26;;;;;;:::i;:::-;;;;;;;;;39412:48;;39498:11;39473:10;39484;39473:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;39578:28;;;:15;:28;;;;;;;:41;;;39750:24;;;;;39743:31;39785:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;38801:1008;;;38730:1079;:::o;36234:221::-;36319:14;36336:20;36353:2;36336:16;:20::i;:::-;-1:-1:-1;;;;;36367:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;36412:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;36234:221:0:o;27731:382::-;-1:-1:-1;;;;;27811:16:0;;27803:61;;;;-1:-1:-1;;;27803:61:0;;24490:2:1;27803:61:0;;;24472:21:1;;;24509:18;;;24502:30;24568:34;24548:18;;;24541:62;24620:18;;27803:61:0;24288:356:1;27803:61:0;25818:4;25842:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25842:16:0;:30;27875:58;;;;-1:-1:-1;;;27875:58:0;;24851:2:1;27875:58:0;;;24833:21:1;24890:2;24870:18;;;24863:30;24929;24909:18;;;24902:58;24977:18;;27875:58:0;24649:352:1;27875:58:0;27946:45;27975:1;27979:2;27983:7;27946:20;:45::i;:::-;-1:-1:-1;;;;;28004:13:0;;;;;;:9;:13;;;;;:18;;28021:1;;28004:13;:18;;28021:1;;28004:18;:::i;:::-;;;;-1:-1:-1;;28033:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28033:21:0;-1:-1:-1;;;;;28033:21:0;;;;;;;;28072:33;;28033:16;;;28072:33;;28033:16;;28072:33;27731:382;;:::o;43997:296::-;44080:7;44123:4;44080:7;44138:118;44162:5;:12;44158:1;:16;44138:118;;;44211:33;44221:12;44235:5;44241:1;44235:8;;;;;;;;:::i;:::-;;;;;;;44211:9;:33::i;:::-;44196:48;-1:-1:-1;44176:3:0;;;;:::i;:::-;;;;44138:118;;51037:149;51100:7;51131:1;51127;:5;:51;;51262:13;51356:15;;;51392:4;51385:15;;;51439:4;51423:21;;51127:51;;;-1:-1:-1;51262:13:0;51356:15;;;51392:4;51385:15;51439:4;51423:21;;;51037:149::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:160::-;657:20;;713:13;;706:21;696:32;;686:60;;742:1;739;732:12;757:180;813:6;866:2;854:9;845:7;841:23;837:32;834:52;;;882:1;879;872:12;834:52;905:26;921:9;905:26;:::i;942:250::-;1027:1;1037:113;1051:6;1048:1;1045:13;1037:113;;;1127:11;;;1121:18;1108:11;;;1101:39;1073:2;1066:10;1037:113;;;-1:-1:-1;;1184:1:1;1166:16;;1159:27;942:250::o;1197:271::-;1239:3;1277:5;1271:12;1304:6;1299:3;1292:19;1320:76;1389:6;1382:4;1377:3;1373:14;1366:4;1359:5;1355:16;1320:76;:::i;:::-;1450:2;1429:15;-1:-1:-1;;1425:29:1;1416:39;;;;1457:4;1412:50;;1197:271;-1:-1:-1;;1197:271:1:o;1473:220::-;1622:2;1611:9;1604:21;1585:4;1642:45;1683:2;1672:9;1668:18;1660:6;1642:45;:::i;1698:180::-;1757:6;1810:2;1798:9;1789:7;1785:23;1781:32;1778:52;;;1826:1;1823;1816:12;1778:52;-1:-1:-1;1849:23:1;;1698:180;-1:-1:-1;1698:180:1:o;2091:173::-;2159:20;;-1:-1:-1;;;;;2208:31:1;;2198:42;;2188:70;;2254:1;2251;2244:12;2269:254;2337:6;2345;2398:2;2386:9;2377:7;2373:23;2369:32;2366:52;;;2414:1;2411;2404:12;2366:52;2437:29;2456:9;2437:29;:::i;:::-;2427:39;2513:2;2498:18;;;;2485:32;;-1:-1:-1;;;2269:254:1:o;2710:186::-;2769:6;2822:2;2810:9;2801:7;2797:23;2793:32;2790:52;;;2838:1;2835;2828:12;2790:52;2861:29;2880:9;2861:29;:::i;2901:328::-;2978:6;2986;2994;3047:2;3035:9;3026:7;3022:23;3018:32;3015:52;;;3063:1;3060;3053:12;3015:52;3086:29;3105:9;3086:29;:::i;:::-;3076:39;;3134:38;3168:2;3157:9;3153:18;3134:38;:::i;:::-;3124:48;;3219:2;3208:9;3204:18;3191:32;3181:42;;2901:328;;;;;:::o;3234:632::-;3405:2;3457:21;;;3527:13;;3430:18;;;3549:22;;;3376:4;;3405:2;3628:15;;;;3602:2;3587:18;;;3376:4;3671:169;3685:6;3682:1;3679:13;3671:169;;;3746:13;;3734:26;;3815:15;;;;3780:12;;;;3707:1;3700:9;3671:169;;;-1:-1:-1;3857:3:1;;3234:632;-1:-1:-1;;;;;;3234:632:1:o;3871:127::-;3932:10;3927:3;3923:20;3920:1;3913:31;3963:4;3960:1;3953:15;3987:4;3984:1;3977:15;4003:632;4068:5;4098:18;4139:2;4131:6;4128:14;4125:40;;;4145:18;;:::i;:::-;4220:2;4214:9;4188:2;4274:15;;-1:-1:-1;;4270:24:1;;;4296:2;4266:33;4262:42;4250:55;;;4320:18;;;4340:22;;;4317:46;4314:72;;;4366:18;;:::i;:::-;4406:10;4402:2;4395:22;4435:6;4426:15;;4465:6;4457;4450:22;4505:3;4496:6;4491:3;4487:16;4484:25;4481:45;;;4522:1;4519;4512:12;4481:45;4572:6;4567:3;4560:4;4552:6;4548:17;4535:44;4627:1;4620:4;4611:6;4603;4599:19;4595:30;4588:41;;;;4003:632;;;;;:::o;4640:451::-;4709:6;4762:2;4750:9;4741:7;4737:23;4733:32;4730:52;;;4778:1;4775;4768:12;4730:52;4818:9;4805:23;4851:18;4843:6;4840:30;4837:50;;;4883:1;4880;4873:12;4837:50;4906:22;;4959:4;4951:13;;4947:27;-1:-1:-1;4937:55:1;;4988:1;4985;4978:12;4937:55;5011:74;5077:7;5072:2;5059:16;5054:2;5050;5046:11;5011:74;:::i;5281:254::-;5349:6;5357;5410:2;5398:9;5389:7;5385:23;5381:32;5378:52;;;5426:1;5423;5416:12;5378:52;5462:9;5449:23;5439:33;;5491:38;5525:2;5514:9;5510:18;5491:38;:::i;:::-;5481:48;;5281:254;;;;;:::o;5540:::-;5605:6;5613;5666:2;5654:9;5645:7;5641:23;5637:32;5634:52;;;5682:1;5679;5672:12;5634:52;5705:29;5724:9;5705:29;:::i;:::-;5695:39;;5753:35;5784:2;5773:9;5769:18;5753:35;:::i;5799:667::-;5894:6;5902;5910;5918;5971:3;5959:9;5950:7;5946:23;5942:33;5939:53;;;5988:1;5985;5978:12;5939:53;6011:29;6030:9;6011:29;:::i;:::-;6001:39;;6059:38;6093:2;6082:9;6078:18;6059:38;:::i;:::-;6049:48;;6144:2;6133:9;6129:18;6116:32;6106:42;;6199:2;6188:9;6184:18;6171:32;6226:18;6218:6;6215:30;6212:50;;;6258:1;6255;6248:12;6212:50;6281:22;;6334:4;6326:13;;6322:27;-1:-1:-1;6312:55:1;;6363:1;6360;6353:12;6312:55;6386:74;6452:7;6447:2;6434:16;6429:2;6425;6421:11;6386:74;:::i;:::-;6376:84;;;5799:667;;;;;;;:::o;6471:683::-;6566:6;6574;6582;6635:2;6623:9;6614:7;6610:23;6606:32;6603:52;;;6651:1;6648;6641:12;6603:52;6687:9;6674:23;6664:33;;6748:2;6737:9;6733:18;6720:32;6771:18;6812:2;6804:6;6801:14;6798:34;;;6828:1;6825;6818:12;6798:34;6866:6;6855:9;6851:22;6841:32;;6911:7;6904:4;6900:2;6896:13;6892:27;6882:55;;6933:1;6930;6923:12;6882:55;6973:2;6960:16;6999:2;6991:6;6988:14;6985:34;;;7015:1;7012;7005:12;6985:34;7068:7;7063:2;7053:6;7050:1;7046:14;7042:2;7038:23;7034:32;7031:45;7028:65;;;7089:1;7086;7079:12;7028:65;7120:2;7116;7112:11;7102:21;;7142:6;7132:16;;;;;6471:683;;;;;:::o;7159:260::-;7227:6;7235;7288:2;7276:9;7267:7;7263:23;7259:32;7256:52;;;7304:1;7301;7294:12;7256:52;7327:29;7346:9;7327:29;:::i;:::-;7317:39;;7375:38;7409:2;7398:9;7394:18;7375:38;:::i;7424:356::-;7626:2;7608:21;;;7645:18;;;7638:30;7704:34;7699:2;7684:18;;7677:62;7771:2;7756:18;;7424:356::o;7785:380::-;7864:1;7860:12;;;;7907;;;7928:61;;7982:4;7974:6;7970:17;7960:27;;7928:61;8035:2;8027:6;8024:14;8004:18;8001:38;7998:161;;8081:10;8076:3;8072:20;8069:1;8062:31;8116:4;8113:1;8106:15;8144:4;8141:1;8134:15;7998:161;;7785:380;;;:::o;9410:413::-;9612:2;9594:21;;;9651:2;9631:18;;;9624:30;9690:34;9685:2;9670:18;;9663:62;-1:-1:-1;;;9756:2:1;9741:18;;9734:47;9813:3;9798:19;;9410:413::o;10450:127::-;10511:10;10506:3;10502:20;10499:1;10492:31;10542:4;10539:1;10532:15;10566:4;10563:1;10556:15;10582:127;10643:10;10638:3;10634:20;10631:1;10624:31;10674:4;10671:1;10664:15;10698:4;10695:1;10688:15;10714:135;10753:3;10774:17;;;10771:43;;10794:18;;:::i;:::-;-1:-1:-1;10841:1:1;10830:13;;10714:135::o;11393:545::-;11495:2;11490:3;11487:11;11484:448;;;11531:1;11556:5;11552:2;11545:17;11601:4;11597:2;11587:19;11671:2;11659:10;11655:19;11652:1;11648:27;11642:4;11638:38;11707:4;11695:10;11692:20;11689:47;;;-1:-1:-1;11730:4:1;11689:47;11785:2;11780:3;11776:12;11773:1;11769:20;11763:4;11759:31;11749:41;;11840:82;11858:2;11851:5;11848:13;11840:82;;;11903:17;;;11884:1;11873:13;11840:82;;;11844:3;;;11393:545;;;:::o;12114:1352::-;12240:3;12234:10;12267:18;12259:6;12256:30;12253:56;;;12289:18;;:::i;:::-;12318:97;12408:6;12368:38;12400:4;12394:11;12368:38;:::i;:::-;12362:4;12318:97;:::i;:::-;12470:4;;12534:2;12523:14;;12551:1;12546:663;;;;13253:1;13270:6;13267:89;;;-1:-1:-1;13322:19:1;;;13316:26;13267:89;-1:-1:-1;;12071:1:1;12067:11;;;12063:24;12059:29;12049:40;12095:1;12091:11;;;12046:57;13369:81;;12516:944;;12546:663;11340:1;11333:14;;;11377:4;11364:18;;-1:-1:-1;;12582:20:1;;;12700:236;12714:7;12711:1;12708:14;12700:236;;;12803:19;;;12797:26;12782:42;;12895:27;;;;12863:1;12851:14;;;;12730:19;;12700:236;;;12704:3;12964:6;12955:7;12952:19;12949:201;;;13025:19;;;13019:26;-1:-1:-1;;13108:1:1;13104:14;;;13120:3;13100:24;13096:37;13092:42;13077:58;13062:74;;12949:201;-1:-1:-1;;;;;13196:1:1;13180:14;;;13176:22;13163:36;;-1:-1:-1;12114:1352:1:o;14292:351::-;14494:2;14476:21;;;14533:2;14513:18;;;14506:30;14572:29;14567:2;14552:18;;14545:57;14634:2;14619:18;;14292:351::o;14648:125::-;14713:9;;;14734:10;;;14731:36;;;14747:18;;:::i;14778:346::-;14980:2;14962:21;;;15019:2;14999:18;;;14992:30;-1:-1:-1;;;15053:2:1;15038:18;;15031:52;15115:2;15100:18;;14778:346::o;16603:1256::-;16827:3;16865:6;16859:13;16891:4;16904:64;16961:6;16956:3;16951:2;16943:6;16939:15;16904:64;:::i;:::-;17031:13;;16990:16;;;;17053:68;17031:13;16990:16;17088:15;;;17053:68;:::i;:::-;17210:13;;17143:20;;;17183:1;;17248:36;17210:13;17248:36;:::i;:::-;17303:1;17320:18;;;17347:141;;;;17502:1;17497:337;;;;17313:521;;17347:141;-1:-1:-1;;17382:24:1;;17368:39;;17459:16;;17452:24;17438:39;;17427:51;;;-1:-1:-1;17347:141:1;;17497:337;17528:6;17525:1;17518:17;17576:2;17573:1;17563:16;17601:1;17615:169;17629:8;17626:1;17623:15;17615:169;;;17711:14;;17696:13;;;17689:37;17754:16;;;;17646:10;;17615:169;;;17619:3;;17815:8;17808:5;17804:20;17797:27;;17313:521;-1:-1:-1;17850:3:1;;16603:1256;-1:-1:-1;;;;;;;;;;16603:1256:1:o;19842:128::-;19909:9;;;19930:11;;;19927:37;;;19944:18;;:::i;20332:168::-;20405:9;;;20436;;20453:15;;;20447:22;;20433:37;20423:71;;20474:18;;:::i;20852:404::-;21054:2;21036:21;;;21093:2;21073:18;;;21066:30;21132:34;21127:2;21112:18;;21105:62;-1:-1:-1;;;21198:2:1;21183:18;;21176:38;21246:3;21231:19;;20852:404::o;22381:414::-;22583:2;22565:21;;;22622:2;22602:18;;;22595:30;22661:34;22656:2;22641:18;;22634:62;-1:-1:-1;;;22727:2:1;22712:18;;22705:48;22785:3;22770:19;;22381:414::o;22800:127::-;22861:10;22856:3;22852:20;22849:1;22842:31;22892:4;22889:1;22882:15;22916:4;22913:1;22906:15;22932:120;22972:1;22998;22988:35;;23003:18;;:::i;:::-;-1:-1:-1;23037:9:1;;22932:120::o;23057:112::-;23089:1;23115;23105:35;;23120:18;;:::i;:::-;-1:-1:-1;23154:9:1;;23057:112::o;23408:489::-;-1:-1:-1;;;;;23677:15:1;;;23659:34;;23729:15;;23724:2;23709:18;;23702:43;23776:2;23761:18;;23754:34;;;23824:3;23819:2;23804:18;;23797:31;;;23602:4;;23845:46;;23871:19;;23863:6;23845:46;:::i;:::-;23837:54;23408:489;-1:-1:-1;;;;;;23408:489:1:o;23902:249::-;23971:6;24024:2;24012:9;24003:7;23999:23;23995:32;23992:52;;;24040:1;24037;24030:12;23992:52;24072:9;24066:16;24091:30;24115:5;24091:30;:::i;24156:127::-;24217:10;24212:3;24208:20;24205:1;24198:31;24248:4;24245:1;24238:15;24272:4;24269:1;24262:15

Swarm Source

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