ETH Price: $3,399.63 (+2.52%)

Token

Ragnarok (RONIN)
 

Overview

Max Total Supply

7,777 RONIN

Holders

2,434

Market

Volume (24H)

4.8474 ETH

Min Price (24H)

$1,021.25 @ 0.300400 ETH

Max Price (24H)

$2,304.95 @ 0.678000 ETH
0x05538633e38B21E46d2C521f0C7a361407756bbD
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Ragnarök is the first metaRPG. Become one of the 7777 Ronin to get access.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Ragnarok

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license, Audited

Contract Source Code (Solidity)Audit Report

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

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


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

pragma solidity ^0.8.0;

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol


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

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

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


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

pragma solidity ^0.8.0;







/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);
    }

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Pausable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Pausable.sol)

pragma solidity ^0.8.0;



/**
 * @dev ERC1155 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Pausable is ERC1155, Pausable {
    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        require(!paused(), "ERC1155Pausable: token transfer while paused");
    }
}

// File: contracts/Ragnarok.sol


pragma solidity 0.8.13;




contract Ragnarok is ERC1155Pausable, Ownable {
    uint256 private _tokenIds;

    string public constant name = "Ragnarok";
    string public constant symbol = "RONIN";

    enum SaleType {
        NotStarted,
        FirstPublicMint,
        PixelMint,
        PillMint,
        TeamMint,
        LastPublicMint
    }

    address payable public defaultPlatformAddress;
    address public defaultPlatformMintingAddress;
    bytes32 public merkleRootOfPixelMintWhitelistAddresses;
    bytes32 public merkleRootOfPillMintWhitelistAddresses;

    uint256 public immutable defaultSaleStartTime;
    uint256 public constant DEFAULT_MAX_MINTING_SUPPLY = 7777;
    uint256 public constant DEFAULT_MAX_FIRST_PUBLIC_SUPPLY = 3900;
    uint256 public constant DEFAULT_NFT_PRICE = 0.77 * 1 ether;
    uint256 public constant DEFAULT_DECREASE_NFT_PRICE_AFTER_TIME_INTERVAL =
        0.01925 * 1 ether;
    uint256 public constant DEFAULT_TIME_INTERVAL = 7 minutes;
    uint256 public constant MAX_DECREASE_ITERATIONS = 29;

    uint256 public dutchAuctionLastPrice = 0;

    uint256 public constant DEFAULT_INITIAL_PUBLIC_SALE = 24 hours;
    uint256 public constant DEFAULT_PIXELMINT_SALE = 72 hours;
    uint256 public constant DEFAULT_PILLMINT_SALE = 96 hours;
    uint256 public constant DEFAULT_TEAMMINT_SALE = 120 hours;

    uint256 public constant LIMIT_IN_PUBLIC_SALE_PER_WALLET = 3;
    uint256 public constant TEAM_MINT_COUNT = 277;

    mapping(address => uint256) public pixelMintWhitelistedAddresses;
    mapping(address => uint256) public pillMintWhitelistedAddresses;
    mapping(address => uint256) public firstPublicSale;
    mapping(address => uint256) public lastPublicSale;
    bool public teamMintWhitelistedAddress;

    error InvalidBuyNFTPrice(uint256 actualPrice, uint256 invalidInputPrice);
    error MaximumPublicMintSupplyReached();
    error MaximumMintSupplyReached();
    error MaximumMintLimitReachedByUser();
    error WhitelistedAddressAlreadyClaimedNFT();
    error InvalidMerkleProof();
    error UnAuthorizedRequest();
    error ReimbursementAlreadyClaimed();
    error CannotClaimReimbursementInPublicMint();
    error NothingToClaim();
    error AmountReimbursementFailed();
    error InvalidTokenCountZero();
    error TransactionFailed();
    error AirdropTransactionFailed(
        address airdropAddress,
        uint256 airdropAmount
    );

    event PaymentSentInContractForReimbursements(
        uint256 amount,
        address sendBy
    );

    event ReimbursementClaimedOfPublicSale(
        address[] addresses,
        uint256[] values
    );
    event NewURI(string newURI, address updatedBy);
    event UpdatedMerkleRootOfPixelMint(bytes32 newHash, address updatedBy);
    event UpdatedMerkleRootOfPillMint(bytes32 newHash, address updatedBy);
    event UpdatedPlatformWalletAddress(
        address newPlatformAddress,
        address updatedBy
    );
    event UpdatedPlatformMintingAddress(
        address newMintingAddress,
        address updatedBy
    );
    event NewNFTMintedOnFirstPublicSale(
        uint256 tokenID,
        address mintedBy,
        uint256 price
    );
    event NewNFTBatchMintedOnFirstPublicSale(
        uint256[] tokenIDs,
        address mintedBy,
        uint256 price
    );
    event NewNFTBatchMintedOnLastPublicSale(
        uint256[] tokenIDs,
        address mintedBy,
        uint256 price
    );
    event NewNFTMintedOnPixelSale(
        uint256 tokenID,
        address mintedBy,
        uint256 price
    );
    event NewNFTMintedOnPillSale(
        uint256 tokenID,
        address mintedBy,
        uint256 price
    );
    event GenesisNFTMinted(uint256 tokenID, address mintedBy);
    event NewNFTMintedOnTeamSale(uint256[] tokenIDs, address mintedBy);
    event NewNFTMintedOnLastPublicSale(
        uint256 tokenID,
        address mintedBy,
        uint256 price
    );

    event WithdrawnPayment(uint256 contractBalance, address transferTo);
    event UpdatedSaleStartTime(uint256 saleStartTime, address updatedBy);

    constructor(
        address platformAddress,
        address platformMintingAddress,
        bytes32 pixelMerkleRoot,
        bytes32 pillMerkleRoot,
        uint256 startTimestamp,
        string memory newURI
    ) ERC1155(newURI) {
        defaultSaleStartTime = startTimestamp;
        defaultPlatformAddress = payable(platformAddress);
        defaultPlatformMintingAddress = platformMintingAddress;
        merkleRootOfPixelMintWhitelistAddresses = pixelMerkleRoot;
        merkleRootOfPillMintWhitelistAddresses = pillMerkleRoot;

        _mintGenesisNFT();

        emit NewURI(newURI, msg.sender);
        emit UpdatedMerkleRootOfPixelMint(pixelMerkleRoot, msg.sender);
        emit UpdatedMerkleRootOfPillMint(pillMerkleRoot, msg.sender);
        emit UpdatedPlatformWalletAddress(platformAddress, msg.sender);
        emit UpdatedPlatformMintingAddress(platformMintingAddress, msg.sender);
        emit UpdatedSaleStartTime(startTimestamp, msg.sender);
    }

    /**
     * @dev _mintGenesisNFT mints the NFT when the contract gets deployed
     * and genesis NFT will be sent to contract creator
     *
     * Emits a {GenesisNFTMinted} event.
     *
     **/

    function _mintGenesisNFT() internal {
        _tokenIds++;

        emit GenesisNFTMinted(_tokenIds, msg.sender);

        _mint(msg.sender, _tokenIds, 1, "");
    }

    /**
     * @dev getCurrentMintingCount returns the current minting count of NFT .
     *
     */
    function getCurrentMintingCount() external view returns (uint256) {
        return _tokenIds;
    }

    /**
     * @dev getCurrentNFTMintingPrice returns the current minting price of NFT .
     *
     */

    function getCurrentNFTMintingPrice() public view returns (uint256) {
        if (block.timestamp < defaultSaleStartTime) return DEFAULT_NFT_PRICE;

        uint256 calculateTimeDifference = block.timestamp -
            defaultSaleStartTime;

        uint256 calculateIntervals = calculateTimeDifference /
            DEFAULT_TIME_INTERVAL;

        if (calculateIntervals >= MAX_DECREASE_ITERATIONS) {
            uint256 calculatePrice = (DEFAULT_NFT_PRICE -
                (DEFAULT_DECREASE_NFT_PRICE_AFTER_TIME_INTERVAL *
                    MAX_DECREASE_ITERATIONS));

            return calculatePrice;
        } else {
            uint256 calculatePrice = (DEFAULT_NFT_PRICE -
                (DEFAULT_DECREASE_NFT_PRICE_AFTER_TIME_INTERVAL *
                    calculateIntervals));

            return calculatePrice;
        }
    }

    /**
     * @dev checkSaleType returns the current sale type status.
     *
     */

    function checkSaleType() external view returns (SaleType activeSale) {
        if (block.timestamp < defaultSaleStartTime) {
            return SaleType.NotStarted;
        } else if (
            (block.timestamp >= defaultSaleStartTime) &&
            (block.timestamp <
                defaultSaleStartTime + DEFAULT_INITIAL_PUBLIC_SALE)
        ) {
            return SaleType.FirstPublicMint;
        } else if (
            (block.timestamp >=
                defaultSaleStartTime + DEFAULT_INITIAL_PUBLIC_SALE) &&
            (block.timestamp < defaultSaleStartTime + DEFAULT_PIXELMINT_SALE)
        ) {
            return SaleType.PixelMint;
        } else if (
            (block.timestamp >=
                defaultSaleStartTime + DEFAULT_PIXELMINT_SALE) &&
            (block.timestamp < defaultSaleStartTime + DEFAULT_PILLMINT_SALE)
        ) {
            return SaleType.PillMint;
        } else if (
            (block.timestamp >= defaultSaleStartTime + DEFAULT_PILLMINT_SALE) &&
            (block.timestamp < defaultSaleStartTime + DEFAULT_TEAMMINT_SALE)
        ) {
            return SaleType.TeamMint;
        } else if (
            (block.timestamp >= defaultSaleStartTime + DEFAULT_TEAMMINT_SALE)
        ) {
            return SaleType.LastPublicMint;
        }
    }

    /**
     * @dev updateTokenURI updates the new token URI in contract.
     *
     * Emits a {NewURI} event.
     *
     * Requirements:
     *
     * - Only owner of contract can call this function
     **/

    function updateTokenURI(string memory newuri)
        external
        onlyOwner
        returns (bool)
    {
        _setURI(newuri);
        emit NewURI(newuri, msg.sender);
        return true;
    }

    /**
     * @dev updatePixelMintMerkleRoot updates the pixel mint merkle hash in contract.
     *
     * Emits a {UpdatedMerkleRootOfPixelMint} event.
     *
     * Requirements:
     *
     * - Only owner of contract can call this function
     **/

    function updatePixelMintMerkleRoot(bytes32 hash)
        external
        onlyOwner
        returns (bool)
    {
        merkleRootOfPixelMintWhitelistAddresses = hash;
        emit UpdatedMerkleRootOfPixelMint(hash, msg.sender);

        return true;
    }

    /**
     * @dev updatePixelMintMerkleRoot updates the pill mint merkle hash in contract.
     *
     * Emits a {UpdatedMerkleRootOfPillMint} event.
     *
     * Requirements:
     *
     * - Only owner of contract can call this function
     **/

    function updatePillMintMerkleRoot(bytes32 hash)
        external
        onlyOwner
        returns (bool)
    {
        merkleRootOfPillMintWhitelistAddresses = hash;
        emit UpdatedMerkleRootOfPillMint(hash, msg.sender);

        return true;
    }

    /**
     * @dev updatePlatformWalletAddress updates the platform wallet address in contract.
     *
     * Emits a {UpdatedPlatformWalletAddress} event.
     *
     * Requirements:
     *
     * - Only owner of contract can call this function
     **/

    function updatePlatformWalletAddress(address newAddress)
        external
        onlyOwner
        returns (bool)
    {
        defaultPlatformAddress = payable(newAddress);
        emit UpdatedPlatformWalletAddress(newAddress, msg.sender);

        return true;
    }

    /**
     * @dev pauseContract is used to pause contract.
     *
     * Emits a {Paused} event.
     *
     * Requirements:
     *
     * - Only the owner can call this function
     **/

    function pauseContract() external onlyOwner returns (bool) {
        _pause();
        return true;
    }

    /**
     * @dev unpauseContract is used to unpause contract.
     *
     * Emits a {Unpaused} event.
     *
     * Requirements:
     *
     * - Only the owner can call this function
     **/

    function unpauseContract() external onlyOwner returns (bool) {
        _unpause();
        return true;
    }

    /**
     * @dev firstPublicMintingSale mints single NFT in one transaction in First Public Minting.
     *
     * Emits a {NewNFTMintedOnFirstPublicSale} event.
     *
     * Requirements:
     *
     * - User can mint max 3 NFTs in each First Public Sale
     **/

    function firstPublicMintingSale() external payable returns (bool) {
        if (
            (block.timestamp >= defaultSaleStartTime) &&
            (block.timestamp <
                defaultSaleStartTime + DEFAULT_INITIAL_PUBLIC_SALE)
        ) {
            _tokenIds++;

            if (_tokenIds > DEFAULT_MAX_FIRST_PUBLIC_SUPPLY)
                revert MaximumPublicMintSupplyReached();

            if (firstPublicSale[msg.sender] >= LIMIT_IN_PUBLIC_SALE_PER_WALLET)
                revert MaximumMintLimitReachedByUser();

            uint256 getPriceOFNFT = getCurrentNFTMintingPrice();

            if (getPriceOFNFT != msg.value)
                revert InvalidBuyNFTPrice(getPriceOFNFT, msg.value);

            dutchAuctionLastPrice = getPriceOFNFT;

            firstPublicSale[msg.sender] = firstPublicSale[msg.sender] + 1;

            emit NewNFTMintedOnFirstPublicSale(
                _tokenIds,
                msg.sender,
                msg.value
            );

            _mint(msg.sender, _tokenIds, 1, "");

            return true;
        } else {
            revert UnAuthorizedRequest();
        }
    }

    /**
     * @dev pixelMintingSale mints single NFT in one transaction for whitelist address in Pixel Minting.
     *
     * Emits a {NewNFTMintedOnPixelSale} event.
     *
     * Requirements:
     *
     * - User can mint 1 NFT in Pixel sale if his address is whitelisted
     **/

    function pixelMintingSale(bytes32[] calldata _merkleProof)
        external
        payable
        returns (bool)
    {
        if (
            (block.timestamp >=
                defaultSaleStartTime + DEFAULT_INITIAL_PUBLIC_SALE) &&
            (block.timestamp < defaultSaleStartTime + DEFAULT_PIXELMINT_SALE)
        ) {
            _tokenIds++;

            if (dutchAuctionLastPrice != msg.value)
                revert InvalidBuyNFTPrice(dutchAuctionLastPrice, msg.value);

            if (pixelMintWhitelistedAddresses[msg.sender] != 0)
                revert WhitelistedAddressAlreadyClaimedNFT();

            bytes32 leaf = keccak256(abi.encodePacked(msg.sender));

            if (
                !MerkleProof.verify(
                    _merkleProof,
                    merkleRootOfPixelMintWhitelistAddresses,
                    leaf
                )
            ) revert InvalidMerkleProof();

            pixelMintWhitelistedAddresses[msg.sender] = 1;

            emit NewNFTMintedOnPixelSale(_tokenIds, msg.sender, msg.value);

            _mint(msg.sender, _tokenIds, 1, "");

            return true;
        } else {
            revert UnAuthorizedRequest();
        }
    }

    /**
     * @dev pillMintingSale mints single NFT in one transaction for whitelist address in Pill Minting.
     *
     * Emits a {NewNFTMintedOnPillSale} event.
     *
     * Requirements:
     *
     * - User can mint 1 NFT in Pill sale if his address is whitelisted
     **/

    function pillMintingSale(bytes32[] calldata _merkleProof)
        external
        payable
        returns (bool)
    {
        if (
            (block.timestamp >=
                defaultSaleStartTime + DEFAULT_PIXELMINT_SALE) &&
            (block.timestamp < defaultSaleStartTime + DEFAULT_PILLMINT_SALE)
        ) {
            _tokenIds++;

            if (pillMintWhitelistedAddresses[msg.sender] != 0)
                revert WhitelistedAddressAlreadyClaimedNFT();

            if ((dutchAuctionLastPrice / 2) != msg.value)
                revert InvalidBuyNFTPrice(
                    (dutchAuctionLastPrice / 2),
                    msg.value
                );

            bytes32 leaf = keccak256(abi.encodePacked(msg.sender));

            if (
                !MerkleProof.verify(
                    _merkleProof,
                    merkleRootOfPillMintWhitelistAddresses,
                    leaf
                )
            ) revert InvalidMerkleProof();

            pillMintWhitelistedAddresses[msg.sender] = 1;

            emit NewNFTMintedOnPillSale(_tokenIds, msg.sender, msg.value);

            _mint(msg.sender, _tokenIds, 1, "");

            return true;
        } else {
            revert UnAuthorizedRequest();
        }
    }

    /**
     * @dev teamMintingSale mints 277 NFTs in one transaction for platform wallet address in Team Minting.
     *
     * Emits a {NewNFTMintedOnPillSale} event.
     *
     * Requirements:
     *
     * - Team can mint 277 NFTs once in Team sale
     **/

    function teamMintingSale() external returns (bool) {
        if (
            (block.timestamp >= defaultSaleStartTime + DEFAULT_PILLMINT_SALE) &&
            (block.timestamp < defaultSaleStartTime + DEFAULT_TEAMMINT_SALE)
        ) {
            if (msg.sender != defaultPlatformMintingAddress)
                revert UnAuthorizedRequest();
            if (teamMintWhitelistedAddress)
                revert WhitelistedAddressAlreadyClaimedNFT();

            teamMintWhitelistedAddress = true;

            uint256[] memory newIDs = new uint256[](TEAM_MINT_COUNT);
            uint256[] memory newAmounts = new uint256[](TEAM_MINT_COUNT);

            uint256 _internalTokenID = _tokenIds;

            for (uint256 i = 0; i < TEAM_MINT_COUNT; i++) {
                _internalTokenID++;

                newIDs[i] = _internalTokenID;
                newAmounts[i] = 1;
            }

            _tokenIds = _internalTokenID;

            emit NewNFTMintedOnTeamSale(newIDs, msg.sender);

            _mintBatch(msg.sender, newIDs, newAmounts, "");

            return true;
        } else {
            revert UnAuthorizedRequest();
        }
    }

    /**
     * @dev lastPublicMintingSale mints the new NFT depending upon the sale type.
     *
     * Emits a {NewNFTMintedOnLastPublicSale} event.
     *
     * Requirements:
     *
     * - User can mint max 3 NFTs in Last Public Sale
     **/

    function lastPublicMintingSale() external payable returns (bool) {
        if ((block.timestamp >= defaultSaleStartTime + DEFAULT_TEAMMINT_SALE)) {
            _tokenIds++;

            if (_tokenIds > DEFAULT_MAX_MINTING_SUPPLY)
                revert MaximumMintSupplyReached();

            if (lastPublicSale[msg.sender] >= LIMIT_IN_PUBLIC_SALE_PER_WALLET)
                revert MaximumMintLimitReachedByUser();

            if (dutchAuctionLastPrice != msg.value)
                revert InvalidBuyNFTPrice(dutchAuctionLastPrice, msg.value);

            lastPublicSale[msg.sender] = lastPublicSale[msg.sender] + 1;

            emit NewNFTMintedOnLastPublicSale(_tokenIds, msg.sender, msg.value);

            _mint(msg.sender, _tokenIds, 1, "");

            return true;
        } else {
            revert UnAuthorizedRequest();
        }
    }

    /**
     * @dev firstPublicSaleBatchMint mints batch of new NFTs.
     *
     * Emits a {NewNFTBatchMintedOnFirstPublicSale} event.
     *
     * Requirements:
     *
     * - User can mint max 3 NFTs in each First Public Sale
     **/

    function firstPublicSaleBatchMint(uint256 tokenCount)
        external
        payable
        returns (bool)
    {
        if (
            (block.timestamp >= defaultSaleStartTime) &&
            (block.timestamp <
                defaultSaleStartTime + DEFAULT_INITIAL_PUBLIC_SALE)
        ) {
            if (tokenCount == 0) revert InvalidTokenCountZero();

            uint256 getPriceOFNFT = getCurrentNFTMintingPrice();

            if ((getPriceOFNFT * tokenCount) != msg.value)
                revert InvalidBuyNFTPrice(
                    (getPriceOFNFT * tokenCount),
                    msg.value
                );

            if (
                firstPublicSale[msg.sender] + tokenCount >
                LIMIT_IN_PUBLIC_SALE_PER_WALLET
            ) revert MaximumMintLimitReachedByUser();

            firstPublicSale[msg.sender] =
                firstPublicSale[msg.sender] +
                tokenCount;

            uint256[] memory newIDs = new uint256[](tokenCount);
            uint256[] memory newAmounts = new uint256[](tokenCount);

            if (_tokenIds + tokenCount > DEFAULT_MAX_FIRST_PUBLIC_SUPPLY)
                revert MaximumPublicMintSupplyReached();

            dutchAuctionLastPrice = getPriceOFNFT;

            for (uint256 i = 0; i < tokenCount; i++) {
                _tokenIds++;

                newIDs[i] = _tokenIds;
                newAmounts[i] = 1;
            }

            emit NewNFTBatchMintedOnFirstPublicSale(
                newIDs,
                msg.sender,
                msg.value
            );

            _mintBatch(msg.sender, newIDs, newAmounts, "");

            return true;
        } else {
            revert UnAuthorizedRequest();
        }
    }

    /**
     * @dev lastPublicSaleBatchMint mints batch of new NFTs.
     *
     * Emits a {NewNFTBatchMintedOnLastPublicSale} event.
     *
     * Requirements:
     *
     * - User can mint max 3 NFTs in each First Public Sale
     **/

    function lastPublicSaleBatchMint(uint256 tokenCount)
        external
        payable
        returns (bool)
    {
        if ((block.timestamp >= defaultSaleStartTime + DEFAULT_TEAMMINT_SALE)) {
            if (tokenCount == 0) revert InvalidTokenCountZero();

            if (
                lastPublicSale[msg.sender] + tokenCount >
                LIMIT_IN_PUBLIC_SALE_PER_WALLET
            ) revert MaximumMintLimitReachedByUser();

            if ((dutchAuctionLastPrice * tokenCount) != msg.value)
                revert InvalidBuyNFTPrice(
                    (dutchAuctionLastPrice * tokenCount),
                    msg.value
                );

            lastPublicSale[msg.sender] =
                lastPublicSale[msg.sender] +
                tokenCount;

            uint256[] memory newIDs = new uint256[](tokenCount);
            uint256[] memory newAmounts = new uint256[](tokenCount);

            if (_tokenIds + tokenCount > DEFAULT_MAX_MINTING_SUPPLY)
                revert MaximumMintSupplyReached();

            for (uint256 i = 0; i < tokenCount; i++) {
                _tokenIds++;

                newIDs[i] = _tokenIds;
                newAmounts[i] = 1;
            }

            emit NewNFTBatchMintedOnLastPublicSale(
                newIDs,
                msg.sender,
                msg.value
            );

            _mintBatch(msg.sender, newIDs, newAmounts, "");

            return true;
        } else {
            revert UnAuthorizedRequest();
        }
    }

    /**
     * @dev sendPaymentForReimbursement is used to send reimbursement payment on contract for FirstPublicMint buyers can claim it.
     *
     * Emits a {PaymentSentInContractForReimbursements} event.
     *
     * Requirements:
     *
     * - Only the defaultPlatformAddress can call this function
     **/

    function sendPaymentForReimbursement() external payable returns (bool) {
        if (msg.sender != defaultPlatformAddress) revert UnAuthorizedRequest();

        if (msg.value == 0) revert UnAuthorizedRequest();

        emit PaymentSentInContractForReimbursements(msg.value, msg.sender);
        return true;
    }

    /**
     * @dev withdrawPayment is used to withdraw payment from contract.
     *
     * Emits a {WithdrawnPayment} event.
     *
     * Requirements:
     *
     * - Only the defaultPlatformAddress can call this function
     **/

    function withdrawPayment() external returns (bool) {
        if (msg.sender != defaultPlatformAddress) revert UnAuthorizedRequest();

        uint256 contractBalance = address(this).balance;

        if (contractBalance == 0) revert UnAuthorizedRequest();

        (bool sent, ) = defaultPlatformAddress.call{value: contractBalance}("");

        if (!sent) revert TransactionFailed();

        emit WithdrawnPayment(contractBalance, msg.sender);
        return true;
    }

    /**
     * @dev reimbursementAirdrop is used to transfer reimbursement payment to
     * buyers of First Public Sale
     * if they bought the NFT at high price. They'll get return of difference
     * of bought price and last price
     *
     * Emits a {ReimbursementClaimedOfPublicSale} event.
     *
     * Requirements:
     *
     * - Only the First Public Mint holders can claim funds once
     **/

    function reimbursementAirdrop(
        address[] memory addresses,
        uint256[] memory values
    ) external returns (bool) {
        if (
            (block.timestamp >= defaultSaleStartTime) &&
            (block.timestamp <
                defaultSaleStartTime + DEFAULT_INITIAL_PUBLIC_SALE)
        ) revert CannotClaimReimbursementInPublicMint();

        if (msg.sender != defaultPlatformAddress) revert UnAuthorizedRequest();

        if (addresses.length != values.length) revert UnAuthorizedRequest();

        for (uint256 i = 0; i < addresses.length; i++) {
            (bool sent, ) = addresses[i].call{value: values[i]}("");
            if (!sent) revert AirdropTransactionFailed(addresses[i], values[i]);
        }

        emit ReimbursementClaimedOfPublicSale(addresses, values);
        return true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"platformAddress","type":"address"},{"internalType":"address","name":"platformMintingAddress","type":"address"},{"internalType":"bytes32","name":"pixelMerkleRoot","type":"bytes32"},{"internalType":"bytes32","name":"pillMerkleRoot","type":"bytes32"},{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"string","name":"newURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"airdropAddress","type":"address"},{"internalType":"uint256","name":"airdropAmount","type":"uint256"}],"name":"AirdropTransactionFailed","type":"error"},{"inputs":[],"name":"AmountReimbursementFailed","type":"error"},{"inputs":[],"name":"CannotClaimReimbursementInPublicMint","type":"error"},{"inputs":[{"internalType":"uint256","name":"actualPrice","type":"uint256"},{"internalType":"uint256","name":"invalidInputPrice","type":"uint256"}],"name":"InvalidBuyNFTPrice","type":"error"},{"inputs":[],"name":"InvalidMerkleProof","type":"error"},{"inputs":[],"name":"InvalidTokenCountZero","type":"error"},{"inputs":[],"name":"MaximumMintLimitReachedByUser","type":"error"},{"inputs":[],"name":"MaximumMintSupplyReached","type":"error"},{"inputs":[],"name":"MaximumPublicMintSupplyReached","type":"error"},{"inputs":[],"name":"NothingToClaim","type":"error"},{"inputs":[],"name":"ReimbursementAlreadyClaimed","type":"error"},{"inputs":[],"name":"TransactionFailed","type":"error"},{"inputs":[],"name":"UnAuthorizedRequest","type":"error"},{"inputs":[],"name":"WhitelistedAddressAlreadyClaimedNFT","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":false,"internalType":"uint256","name":"tokenID","type":"uint256"},{"indexed":false,"internalType":"address","name":"mintedBy","type":"address"}],"name":"GenesisNFTMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"tokenIDs","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"mintedBy","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"NewNFTBatchMintedOnFirstPublicSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"tokenIDs","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"mintedBy","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"NewNFTBatchMintedOnLastPublicSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenID","type":"uint256"},{"indexed":false,"internalType":"address","name":"mintedBy","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"NewNFTMintedOnFirstPublicSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenID","type":"uint256"},{"indexed":false,"internalType":"address","name":"mintedBy","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"NewNFTMintedOnLastPublicSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenID","type":"uint256"},{"indexed":false,"internalType":"address","name":"mintedBy","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"NewNFTMintedOnPillSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenID","type":"uint256"},{"indexed":false,"internalType":"address","name":"mintedBy","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"NewNFTMintedOnPixelSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"tokenIDs","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"mintedBy","type":"address"}],"name":"NewNFTMintedOnTeamSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"newURI","type":"string"},{"indexed":false,"internalType":"address","name":"updatedBy","type":"address"}],"name":"NewURI","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"sendBy","type":"address"}],"name":"PaymentSentInContractForReimbursements","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"addresses","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"ReimbursementClaimedOfPublicSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"newHash","type":"bytes32"},{"indexed":false,"internalType":"address","name":"updatedBy","type":"address"}],"name":"UpdatedMerkleRootOfPillMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"newHash","type":"bytes32"},{"indexed":false,"internalType":"address","name":"updatedBy","type":"address"}],"name":"UpdatedMerkleRootOfPixelMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newMintingAddress","type":"address"},{"indexed":false,"internalType":"address","name":"updatedBy","type":"address"}],"name":"UpdatedPlatformMintingAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newPlatformAddress","type":"address"},{"indexed":false,"internalType":"address","name":"updatedBy","type":"address"}],"name":"UpdatedPlatformWalletAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"saleStartTime","type":"uint256"},{"indexed":false,"internalType":"address","name":"updatedBy","type":"address"}],"name":"UpdatedSaleStartTime","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"contractBalance","type":"uint256"},{"indexed":false,"internalType":"address","name":"transferTo","type":"address"}],"name":"WithdrawnPayment","type":"event"},{"inputs":[],"name":"DEFAULT_DECREASE_NFT_PRICE_AFTER_TIME_INTERVAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_INITIAL_PUBLIC_SALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_MAX_FIRST_PUBLIC_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_MAX_MINTING_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_NFT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_PILLMINT_SALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_PIXELMINT_SALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_TEAMMINT_SALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_TIME_INTERVAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIMIT_IN_PUBLIC_SALE_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_DECREASE_ITERATIONS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TEAM_MINT_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkSaleType","outputs":[{"internalType":"enum Ragnarok.SaleType","name":"activeSale","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultPlatformAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultPlatformMintingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultSaleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dutchAuctionLastPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"firstPublicMintingSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"firstPublicSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenCount","type":"uint256"}],"name":"firstPublicSaleBatchMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getCurrentMintingCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentNFTMintingPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPublicMintingSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastPublicSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenCount","type":"uint256"}],"name":"lastPublicSaleBatchMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"merkleRootOfPillMintWhitelistAddresses","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRootOfPixelMintWhitelistAddresses","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pillMintWhitelistedAddresses","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"pillMintingSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pixelMintWhitelistedAddresses","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"pixelMintingSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"reimbursementAirdrop","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sendPaymentForReimbursement","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamMintWhitelistedAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamMintingSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"updatePillMintMerkleRoot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"updatePixelMintMerkleRoot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updatePlatformWalletAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"updateTokenURI","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawPayment","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60a060405260006009553480156200001657600080fd5b50604051620047d7380380620047d7833981016040819052620000399162000823565b80620000458162000215565b506003805460ff191690556200005b336200022e565b6080829052600580546001600160a01b038089166001600160a01b031992831617909255600680549288169290911691909117905560078490556008839055620000a462000288565b7fc7908db8c8588ac430ee4efe758e7ba70a0d22e32a138b548fd0d34fa8a483958133604051620000d792919062000938565b60405180910390a1604080518581523360208201527f7fb9029b21ced1ee1b635c453bda40024c21ef902c9c00556148602ca926073d910160405180910390a1604080518481523360208201527f5430b7aa3fe2c6111e2d6876a38b2fd958e996b06d7ed18ea0427db986232744910160405180910390a1604080516001600160a01b03881681523360208201527f56dd00d93a23f62394d31bf3327b495d60841436f0d0c0aca4a77b447f962c09910160405180910390a1604080516001600160a01b03871681523360208201527f1a75f66028ca8686869c55c4593c1d691ec5966315b175bd1b1fd9bfa144f1cc910160405180910390a1604080518381523360208201527f8fe02f2a0879d5d14bb2f41a86221e8497b3e5e8097980d7464d81c7170602f0910160405180910390a150505050505062000b3e565b80516200022a906002906020840190620006e8565b5050565b600380546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600480549060006200029a836200097a565b9091555050600454604080519182523360208301527fca2d84b00bd12e948c8c67928f64a6144517a807d4cf5f82d1a87671caed1fc3910160405180910390a162000300336004546001604051806020016040528060008152506200030260201b60201c565b565b6001600160a01b038416620003685760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084015b60405180910390fd5b336200038e816000876200037c8862000429565b620003878862000429565b8762000477565b6000848152602081815260408083206001600160a01b038916845290915281208054859290620003c090849062000996565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4620004228160008787878762000504565b5050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110620004665762000466620009b1565b602090810291909101015292915050565b62000492868686868686620004fc60201b6200258d1760201c565b60035460ff1615620004fc5760405162461bcd60e51b815260206004820152602c60248201527f455243313135355061757361626c653a20746f6b656e207472616e736665722060448201526b1dda1a5b19481c185d5cd95960a21b60648201526084016200035f565b505050505050565b62000523846001600160a01b0316620006d960201b620025951760201c565b15620004fc5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906200055f9089908990889088908890600401620009c7565b6020604051808303816000875af19250505080156200059d575060408051601f3d908101601f191682019092526200059a9181019062000a0e565b60015b6200065d57620005ac62000a41565b806308c379a003620005ec5750620005c362000a5e565b80620005d05750620005ee565b8060405162461bcd60e51b81526004016200035f919062000aed565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e74657200000000000000000000000060648201526084016200035f565b6001600160e01b0319811663f23a6e6160e01b14620006d05760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b60648201526084016200035f565b50505050505050565b6001600160a01b03163b151590565b828054620006f69062000b02565b90600052602060002090601f0160209004810192826200071a576000855562000765565b82601f106200073557805160ff191683800117855562000765565b8280016001018555821562000765579182015b828111156200076557825182559160200191906001019062000748565b506200077392915062000777565b5090565b5b8082111562000773576000815560010162000778565b80516001600160a01b0381168114620007a657600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b0381118282101715620007e957620007e9620007ab565b6040525050565b60005b838110156200080d578181015183820152602001620007f3565b838111156200081d576000848401525b50505050565b60008060008060008060c087890312156200083d57600080fd5b62000848876200078e565b955062000858602088016200078e565b6040880151606089015160808a015160a08b0151939850919650945092506001600160401b03808211156200088c57600080fd5b818901915089601f830112620008a157600080fd5b815181811115620008b657620008b6620007ab565b6040519150620008d1601f8201601f191660200183620007c1565b8082528a6020828501011115620008e757600080fd5b620008fa816020840160208601620007f0565b5080925050509295509295509295565b6000815180845262000924816020860160208601620007f0565b601f01601f19169290920160200192915050565b6040815260006200094d60408301856200090a565b905060018060a01b03831660208301529392505050565b634e487b7160e01b600052601160045260246000fd5b6000600182016200098f576200098f62000964565b5060010190565b60008219821115620009ac57620009ac62000964565b500190565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009062000a03908301846200090a565b979650505050505050565b60006020828403121562000a2157600080fd5b81516001600160e01b03198116811462000a3a57600080fd5b9392505050565b600060033d111562000a5b5760046000803e5060005160e01c5b90565b600060443d101562000a6d5790565b6040516003193d81016004833e81513d6001600160401b03808311602484018310171562000a9d57505050505090565b828501915081518181111562000ab65750505050505090565b843d870101602082850101111562000ad15750505050505090565b62000ae260208286010187620007c1565b509095945050505050565b60208152600062000a3a60208301846200090a565b600181811c9082168062000b1757607f821691505b60208210810362000b3857634e487b7160e01b600052602260045260246000fd5b50919050565b608051613bc762000c10600039600081816105be01528181610a9f01528181610ad101528181610da201528181610fb101528181610fe3015281816114f1015281816115280152818161171a01528181611751015281816119d201528181611a0401528181611c8b01528181611f9c01528181611fd601528181612061015281816120980152818161224401528181612272015281816122a4015281816122df015281816123160152818161235101528181612388015281816123c3015281816123fa01526124350152613bc76000f3fe60806040526004361061036a5760003560e01c80638925e597116101c6578063affe047a116100f7578063e320acb311610095578063f0a5d3531161006f578063f0a5d35314610989578063f242432a146109ab578063f2fde38b146109cb578063fe87b632146109eb57600080fd5b8063e320acb31461090e578063e985e9c514610924578063ef14e5471461096d57600080fd5b8063b9e5f7fb116100d1578063b9e5f7fb146108a2578063bda1e1c9146108b7578063dbd8e346146108cc578063dbdcb339146108f957600080fd5b8063affe047a14610862578063b0d8e27914610877578063b33712c51461088d57600080fd5b806398cd615311610164578063a118babd1161013e578063a118babd146107fa578063a22cb4651461080f578063a9e233151461082f578063adae1e6b1461084257600080fd5b806398cd6153146107bc5780639b4fdf02146107dc5780639e61dadd146107e457600080fd5b80638c262ecc116101a05780638c262ecc146107335780638da5cb5b1461075357806395d89b411461077657806398bec58c146107a757600080fd5b80638925e597146106c1578063893529b6146106f957806389cdecde1461071357600080fd5b806340b07cd0116102a05780635db8881c1161023e57806370ae3be61161021857806370ae3be61461066c578063715018a614610682578063776cc326146106975780637f866ed6146106ae57600080fd5b80635db8881c1461063b57806367c0dd7f146106435780636e406afc1461065657600080fd5b80634e6fea9c1161027a5780634e6fea9c146105ac578063584e27b2146105e05780635c975abb146105f65780635d39cf6b1461060e57600080fd5b806340b07cd01461054a578063439766ce1461056a5780634e1273f41461057f57600080fd5b80630e89341c1161030d57806333b24f03116102e757806333b24f03146104d85780633630f180146104ef578063377387c6146105025780633a302ffb1461052f57600080fd5b80630e89341c1461048e5780631c82d1ba146104ae5780632eb2c2d6146104b657600080fd5b806306fdde031161034957806306fdde03146103f25780630918f5fc146104335780630a1f61c11461044a5780630c2f2fa91461046157600080fd5b8062fdd58e1461036f57806301b2eec0146103a257806301ffc9a7146103d2575b600080fd5b34801561037b57600080fd5b5061038f61038a3660046130ed565b610a01565b6040519081526020015b60405180910390f35b3480156103ae57600080fd5b506103c26103bd3660046131ed565b610a9b565b6040519015158152602001610399565b3480156103de57600080fd5b506103c26103ed3660046132cd565b610cb3565b3480156103fe57600080fd5b50610426604051806040016040528060088152602001675261676e61726f6b60c01b81525081565b604051610399919061333e565b34801561043f57600080fd5b5061038f6201518081565b34801561045657600080fd5b5061038f6206978081565b34801561046d57600080fd5b5061038f61047c366004613351565b600b6020526000908152604090205481565b34801561049a57600080fd5b506104266104a936600461336c565b610d03565b6103c2610d97565b3480156104c257600080fd5b506104d66104d1366004613402565b610f16565b005b3480156104e457600080fd5b5061038f6205460081565b6103c26104fd36600461336c565b610fad565b34801561050e57600080fd5b5061038f61051d366004613351565b600d6020526000908152604090205481565b34801561053b57600080fd5b5061038f664463c5e3ed200081565b34801561055657600080fd5b506103c261056536600461336c565b61127c565b34801561057657600080fd5b506103c26112f5565b34801561058b57600080fd5b5061059f61059a3660046131ed565b611330565b60405161039991906134e6565b3480156105b857600080fd5b5061038f7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105ec57600080fd5b5061038f60085481565b34801561060257600080fd5b5060035460ff166103c2565b34801561061a57600080fd5b5061038f610629366004613351565b600c6020526000908152604090205481565b6103c2611459565b6103c26106513660046134f9565b6114e6565b34801561066257600080fd5b5061038f611e6181565b34801561067857600080fd5b5061038f60075481565b34801561068e57600080fd5b506104d66116d3565b3480156106a357600080fd5b5061038f6203f48081565b6103c26106bc3660046134f9565b61170f565b3480156106cd57600080fd5b506006546106e1906001600160a01b031681565b6040516001600160a01b039091168152602001610399565b34801561070557600080fd5b50600e546103c29060ff1681565b34801561071f57600080fd5b506005546106e1906001600160a01b031681565b34801561073f57600080fd5b506103c261074e366004613351565b6118db565b34801561075f57600080fd5b5060035461010090046001600160a01b03166106e1565b34801561078257600080fd5b50610426604051806040016040528060058152602001642927a724a760d91b81525081565b3480156107b357600080fd5b5060045461038f565b3480156107c857600080fd5b506103c26107d736600461356d565b611961565b6103c26119ce565b3480156107f057600080fd5b5061038f610f3c81565b34801561080657600080fd5b506103c2611b6b565b34801561081b57600080fd5b506104d661082a3660046135b5565b611c71565b6103c261083d36600461336c565b611c80565b34801561084e57600080fd5b506103c261085d36600461336c565b611ef0565b34801561086e57600080fd5b5061038f601d81565b34801561088357600080fd5b5061038f6101a481565b34801561089957600080fd5b506103c2611f5d565b3480156108ae57600080fd5b5061038f611f98565b3480156108c357600080fd5b506103c2612056565b3480156108d857600080fd5b5061038f6108e7366004613351565b600a6020526000908152604090205481565b34801561090557600080fd5b5061038f600381565b34801561091a57600080fd5b5061038f61011581565b34801561093057600080fd5b506103c261093f3660046135f1565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561097957600080fd5b5061038f670aaf96eb9d0d000081565b34801561099557600080fd5b5061099e612240565b6040516103999190613624565b3480156109b757600080fd5b506104d66109c636600461364c565b612465565b3480156109d757600080fd5b506104d66109e6366004613351565b6124ec565b3480156109f757600080fd5b5061038f60095481565b60006001600160a01b038316610a725760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60007f00000000000000000000000000000000000000000000000000000000000000004210158015610af85750610af5620151807f00000000000000000000000000000000000000000000000000000000000000006136c6565b42105b15610b165760405163fa0e7b7d60e01b815260040160405180910390fd5b6005546001600160a01b03163314610b4157604051638d90d44d60e01b815260040160405180910390fd5b8151835114610b6357604051638d90d44d60e01b815260040160405180910390fd5b60005b8351811015610c70576000848281518110610b8357610b836136de565b60200260200101516001600160a01b0316848381518110610ba657610ba66136de565b602002602001015160405160006040518083038185875af1925050503d8060008114610bee576040519150601f19603f3d011682016040523d82523d6000602084013e610bf3565b606091505b5050905080610c5d57848281518110610c0e57610c0e6136de565b6020026020010151848381518110610c2857610c286136de565b6020908102919091010151604051636272631160e11b81526001600160a01b0390921660048301526024820152604401610a69565b5080610c68816136f4565b915050610b66565b507fc77b80050505b926fff18e9c501407bf6d34df24f4be9f2d7aeaee56d54b41a48383604051610ca292919061370d565b60405180910390a150600192915050565b60006001600160e01b03198216636cdb3d1360e11b1480610ce457506001600160e01b031982166303a24d0760e21b145b80610a9557506301ffc9a760e01b6001600160e01b0319831614610a95565b606060028054610d129061376d565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3e9061376d565b8015610d8b5780601f10610d6057610100808354040283529160200191610d8b565b820191906000526020600020905b815481529060010190602001808311610d6e57829003601f168201915b50505050509050919050565b6000610dc6620697807f00000000000000000000000000000000000000000000000000000000000000006136c6565b4210610efa5760048054906000610ddc836136f4565b9190505550611e616004541115610e065760405163a120045d60e01b815260040160405180910390fd5b336000908152600d6020526040902054600311610e365760405163f739a58f60e01b815260040160405180910390fd5b3460095414610e6557600954604051637087ded160e01b81526004810191909152346024820152604401610a69565b336000908152600d6020526040902054610e809060016136c6565b336000818152600d6020908152604091829020939093556004548151908152928301919091523482820152517f35d7ba9c9051344ac63ee3b275e1ed282a18cba8c52d941e12d14d11e6f8dac39181900360600190a1610ef4336004546001604051806020016040528060008152506125a4565b50600190565b604051638d90d44d60e01b815260040160405180910390fd5b90565b6001600160a01b038516331480610f325750610f32853361093f565b610f995760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610a69565b610fa6858585858561267a565b5050505050565b60007f0000000000000000000000000000000000000000000000000000000000000000421015801561100a5750611007620151807f00000000000000000000000000000000000000000000000000000000000000006136c6565b42105b15610efa5781600003611030576040516319e7854960e11b815260040160405180910390fd5b600061103a611f98565b90503461104784836137a7565b146110795761105683826137a7565b604051637087ded160e01b81526004810191909152346024820152604401610a69565b336000908152600c60205260409020546003906110979085906136c6565b11156110b65760405163f739a58f60e01b815260040160405180910390fd5b336000908152600c60205260409020546110d19084906136c6565b336000908152600c6020526040812091909155836001600160401b038111156110fc576110fc613117565b604051908082528060200260200182016040528015611125578160200160208202803683370190505b5090506000846001600160401b0381111561114257611142613117565b60405190808252806020026020018201604052801561116b578160200160208202803683370190505b509050610f3c8560045461117f91906136c6565b111561119e57604051633aa59ad160e01b815260040160405180910390fd5b600983905560005b8581101561121557600480549060006111be836136f4565b91905055506004548382815181106111d8576111d86136de565b60200260200101818152505060018282815181106111f8576111f86136de565b60209081029190910101528061120d816136f4565b9150506111a6565b507f7d934d8b67cf701e11d53107e39d3fe1015baa6ae71e9674c1ba30a49e95ff40823334604051611249939291906137c6565b60405180910390a161126c3383836040518060200160405280600081525061281c565b506001949350505050565b919050565b6003546000906001600160a01b036101009091041633146112af5760405162461bcd60e51b8152600401610a69906137f4565b6008829055604080518381523360208201527f5430b7aa3fe2c6111e2d6876a38b2fd958e996b06d7ed18ea0427db98623274491015b60405180910390a1506001919050565b6003546000906001600160a01b036101009091041633146113285760405162461bcd60e51b8152600401610a69906137f4565b610ef4612976565b606081518351146113955760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610a69565b600083516001600160401b038111156113b0576113b0613117565b6040519080825280602002602001820160405280156113d9578160200160208202803683370190505b50905060005b8451811015611451576114248582815181106113fd576113fd6136de565b6020026020010151858381518110611417576114176136de565b6020026020010151610a01565b828281518110611436576114366136de565b602090810291909101015261144a816136f4565b90506113df565b509392505050565b6005546000906001600160a01b0316331461148757604051638d90d44d60e01b815260040160405180910390fd5b346000036114a857604051638d90d44d60e01b815260040160405180910390fd5b604080513481523360208201527f49b421a7eb489d4d8bf9c6ccfbae32f551837db461fbe0fd4b821cc8acc40e38910160405180910390a150600190565b60006115156203f4807f00000000000000000000000000000000000000000000000000000000000000006136c6565b421015801561154f575061154c620546007f00000000000000000000000000000000000000000000000000000000000000006136c6565b42105b15610efa5760048054906000611564836136f4565b9091555050336000908152600b602052604090205415611597576040516352aeeef360e11b815260040160405180910390fd5b3460026009546115a79190613829565b146115bb5760026009546110569190613829565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050611635848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506008549150849050612a0e565b6116525760405163582f497d60e11b815260040160405180910390fd5b336000818152600b60209081526040918290206001905560045482519081529081019290925234908201527faaff76f78eebb7934952d1e560848ffbead6b4853b1d6d2e45e2517f0fd8585a906060015b60405180910390a16116c9336004546001604051806020016040528060008152506125a4565b6001915050610a95565b6003546001600160a01b036101009091041633146117035760405162461bcd60e51b8152600401610a69906137f4565b61170d6000612a24565b565b600061173e620151807f00000000000000000000000000000000000000000000000000000000000000006136c6565b421015801561177857506117756203f4807f00000000000000000000000000000000000000000000000000000000000000006136c6565b42105b15610efa576004805490600061178d836136f4565b919050555034600954146117c157600954604051637087ded160e01b81526004810191909152346024820152604401610a69565b336000908152600a6020526040902054156117ef576040516352aeeef360e11b815260040160405180910390fd5b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050611869848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506007549150849050612a0e565b6118865760405163582f497d60e11b815260040160405180910390fd5b336000818152600a60209081526040918290206001905560045482519081529081019290925234908201527f3f67c9a3695a160ecd5104013a62c3dea7fde10ad00ca4aa37e233a5fe618ea3906060016116a3565b6003546000906001600160a01b0361010090910416331461190e5760405162461bcd60e51b8152600401610a69906137f4565b600580546001600160a01b0319166001600160a01b038416908117909155604080519182523360208301527f56dd00d93a23f62394d31bf3327b495d60841436f0d0c0aca4a77b447f962c0991016112e5565b6003546000906001600160a01b036101009091041633146119945760405162461bcd60e51b8152600401610a69906137f4565b61199d82612a7e565b7fc7908db8c8588ac430ee4efe758e7ba70a0d22e32a138b548fd0d34fa8a4839582336040516112e592919061384b565b60007f00000000000000000000000000000000000000000000000000000000000000004210158015611a2b5750611a28620151807f00000000000000000000000000000000000000000000000000000000000000006136c6565b42105b15610efa5760048054906000611a40836136f4565b9190505550610f3c6004541115611a6a57604051633aa59ad160e01b815260040160405180910390fd5b336000908152600c6020526040902054600311611a9a5760405163f739a58f60e01b815260040160405180910390fd5b6000611aa4611f98565b9050348114611acf57604051637087ded160e01b815260048101829052346024820152604401610a69565b6009819055336000908152600c6020526040902054611aef9060016136c6565b336000818152600c6020908152604091829020939093556004548151908152928301919091523482820152517f9592d57d47dfa4895d18972fc47b334199fb370d06704be0fe31e4179826931a9181900360600190a1611b63336004546001604051806020016040528060008152506125a4565b600191505090565b6005546000906001600160a01b03163314611b9957604051638d90d44d60e01b815260040160405180910390fd5b476000819003611bbc57604051638d90d44d60e01b815260040160405180910390fd5b6005546040516000916001600160a01b03169083908381818185875af1925050503d8060008114611c09576040519150601f19603f3d011682016040523d82523d6000602084013e611c0e565b606091505b5050905080611c30576040516317f2c34560e31b815260040160405180910390fd5b604080518381523360208201527fb0caa7e5a1709d95503ec9da196222012fad8495f101214d86c3b72ce101810f910160405180910390a160019250505090565b611c7c338383612a91565b5050565b6000611caf620697807f00000000000000000000000000000000000000000000000000000000000000006136c6565b4210610efa5781600003611cd6576040516319e7854960e11b815260040160405180910390fd5b336000908152600d6020526040902054600390611cf49084906136c6565b1115611d135760405163f739a58f60e01b815260040160405180910390fd5b3482600954611d2291906137a7565b14611d35578160095461105691906137a7565b336000908152600d6020526040902054611d509083906136c6565b336000908152600d6020526040812091909155826001600160401b03811115611d7b57611d7b613117565b604051908082528060200260200182016040528015611da4578160200160208202803683370190505b5090506000836001600160401b03811115611dc157611dc1613117565b604051908082528060200260200182016040528015611dea578160200160208202803683370190505b509050611e6184600454611dfe91906136c6565b1115611e1d5760405163a120045d60e01b815260040160405180910390fd5b60005b84811015611e8f5760048054906000611e38836136f4565b9190505550600454838281518110611e5257611e526136de565b6020026020010181815250506001828281518110611e7257611e726136de565b602090810291909101015280611e87816136f4565b915050611e20565b507fc1c6adeaa10ac93eb80e98666bbc91c451123eac1bf7e81670d15b38f918764a823334604051611ec3939291906137c6565b60405180910390a1611ee63383836040518060200160405280600081525061281c565b5060019392505050565b6003546000906001600160a01b03610100909104163314611f235760405162461bcd60e51b8152600401610a69906137f4565b6007829055604080518381523360208201527f7fb9029b21ced1ee1b635c453bda40024c21ef902c9c00556148602ca926073d91016112e5565b6003546000906001600160a01b03610100909104163314611f905760405162461bcd60e51b8152600401610a69906137f4565b610ef4612b71565b60007f0000000000000000000000000000000000000000000000000000000000000000421015611fcf5750670aaf96eb9d0d000090565b6000611ffb7f000000000000000000000000000000000000000000000000000000000000000042613875565b9050600061200b6101a483613829565b9050601d8110612043576000612029601d664463c5e3ed20006137a7565b61203b90670aaf96eb9d0d0000613875565b949350505050565b600061202982664463c5e3ed20006137a7565b6000612085620546007f00000000000000000000000000000000000000000000000000000000000000006136c6565b42101580156120bf57506120bc620697807f00000000000000000000000000000000000000000000000000000000000000006136c6565b42105b15610efa576006546001600160a01b031633146120ef57604051638d90d44d60e01b815260040160405180910390fd5b600e5460ff1615612113576040516352aeeef360e11b815260040160405180910390fd5b600e805460ff19166001179055604080516101158082526122c08201909252600091602082016122a0803683375050604080516101158082526122c082019092529293506000929150602082016122a0803683370190505060045490915060005b6101158110156121db5781612188816136f4565b9250508184828151811061219e5761219e6136de565b60200260200101818152505060018382815181106121be576121be6136de565b6020908102919091010152806121d3816136f4565b915050612174565b5060048190556040517f6e91d3c1cbfcbd64874ce8db19c59773d82d628d2f82f9201d175f0ee30a26ff90612213908590339061388c565b60405180910390a16122363384846040518060200160405280600081525061281c565b6001935050505090565b60007f00000000000000000000000000000000000000000000000000000000000000004210156122705750600090565b7f000000000000000000000000000000000000000000000000000000000000000042101580156122cb57506122c8620151807f00000000000000000000000000000000000000000000000000000000000000006136c6565b42105b156122d65750600190565b612303620151807f00000000000000000000000000000000000000000000000000000000000000006136c6565b421015801561233d575061233a6203f4807f00000000000000000000000000000000000000000000000000000000000000006136c6565b42105b156123485750600290565b6123756203f4807f00000000000000000000000000000000000000000000000000000000000000006136c6565b42101580156123af57506123ac620546007f00000000000000000000000000000000000000000000000000000000000000006136c6565b42105b156123ba5750600390565b6123e7620546007f00000000000000000000000000000000000000000000000000000000000000006136c6565b4210158015612421575061241e620697807f00000000000000000000000000000000000000000000000000000000000000006136c6565b42105b1561242c5750600490565b612459620697807f00000000000000000000000000000000000000000000000000000000000000006136c6565b4210610f135750600590565b6001600160a01b0385163314806124815750612481853361093f565b6124df5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610a69565b610fa68585858585612beb565b6003546001600160a01b0361010090910416331461251c5760405162461bcd60e51b8152600401610a69906137f4565b6001600160a01b0381166125815760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a69565b61258a81612a24565b50565b505050505050565b6001600160a01b03163b151590565b6001600160a01b0384166125ca5760405162461bcd60e51b8152600401610a699061389f565b336125ea816000876125db88612d08565b6125e488612d08565b87612d53565b6000848152602081815260408083206001600160a01b03891684529091528120805485929061261a9084906136c6565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610fa681600087878787612dbb565b815183511461269b5760405162461bcd60e51b8152600401610a69906138e0565b6001600160a01b0384166126c15760405162461bcd60e51b8152600401610a6990613928565b336126d0818787878787612d53565b60005b84518110156127b65760008582815181106126f0576126f06136de565b60200260200101519050600085838151811061270e5761270e6136de565b602090810291909101810151600084815280835260408082206001600160a01b038e16835290935291909120549091508181101561275e5760405162461bcd60e51b8152600401610a699061396d565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061279b9084906136c6565b92505081905550505050806127af906136f4565b90506126d3565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516128069291906139b7565b60405180910390a461258d818787878787612f16565b6001600160a01b0384166128425760405162461bcd60e51b8152600401610a699061389f565b81518351146128635760405162461bcd60e51b8152600401610a69906138e0565b3361287381600087878787612d53565b60005b845181101561290e57838181518110612891576128916136de565b60200260200101516000808784815181106128ae576128ae6136de565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060008282546128f691906136c6565b90915550819050612906816136f4565b915050612876565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161295f9291906139b7565b60405180910390a4610fa681600087878787612f16565b60035460ff16156129bc5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610a69565b6003805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586129f13390565b6040516001600160a01b03909116815260200160405180910390a1565b600082612a1b8584612fd1565b14949350505050565b600380546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8051611c7c90600290602084019061303d565b816001600160a01b0316836001600160a01b031603612b045760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610a69565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60035460ff16612bba5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610a69565b6003805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336129f1565b6001600160a01b038416612c115760405162461bcd60e51b8152600401610a6990613928565b33612c218187876125db88612d08565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015612c625760405162461bcd60e51b8152600401610a699061396d565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290612c9f9084906136c6565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612cff828888888888612dbb565b50505050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110612d4257612d426136de565b602090810291909101015292915050565b60035460ff161561258d5760405162461bcd60e51b815260206004820152602c60248201527f455243313135355061757361626c653a20746f6b656e207472616e736665722060448201526b1dda1a5b19481c185d5cd95960a21b6064820152608401610a69565b6001600160a01b0384163b1561258d5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190612dff90899089908890889088906004016139e5565b6020604051808303816000875af1925050508015612e3a575060408051601f3d908101601f19168201909252612e3791810190613a2a565b60015b612ee657612e46613a47565b806308c379a003612e7f5750612e5a613a62565b80612e655750612e81565b8060405162461bcd60e51b8152600401610a69919061333e565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610a69565b6001600160e01b0319811663f23a6e6160e01b14612cff5760405162461bcd60e51b8152600401610a6990613aeb565b6001600160a01b0384163b1561258d5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190612f5a9089908990889088908890600401613b33565b6020604051808303816000875af1925050508015612f95575060408051601f3d908101601f19168201909252612f9291810190613a2a565b60015b612fa157612e46613a47565b6001600160e01b0319811663bc197c8160e01b14612cff5760405162461bcd60e51b8152600401610a6990613aeb565b600081815b8451811015611451576000858281518110612ff357612ff36136de565b60200260200101519050808311613019576000838152602082905260409020925061302a565b600081815260208490526040902092505b5080613035816136f4565b915050612fd6565b8280546130499061376d565b90600052602060002090601f01602090048101928261306b57600085556130b1565b82601f1061308457805160ff19168380011785556130b1565b828001600101855582156130b1579182015b828111156130b1578251825591602001919060010190613096565b506130bd9291506130c1565b5090565b5b808211156130bd57600081556001016130c2565b80356001600160a01b038116811461127757600080fd5b6000806040838503121561310057600080fd5b613109836130d6565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b038111828210171561315257613152613117565b6040525050565b60006001600160401b0382111561317257613172613117565b5060051b60200190565b600082601f83011261318d57600080fd5b8135602061319a82613159565b6040516131a7828261312d565b83815260059390931b85018201928281019150868411156131c757600080fd5b8286015b848110156131e257803583529183019183016131cb565b509695505050505050565b6000806040838503121561320057600080fd5b82356001600160401b038082111561321757600080fd5b818501915085601f83011261322b57600080fd5b8135602061323882613159565b604051613245828261312d565b83815260059390931b850182019282810191508984111561326557600080fd5b948201945b8386101561328a5761327b866130d6565b8252948201949082019061326a565b965050860135925050808211156132a057600080fd5b506132ad8582860161317c565b9150509250929050565b6001600160e01b03198116811461258a57600080fd5b6000602082840312156132df57600080fd5b81356132ea816132b7565b9392505050565b6000815180845260005b81811015613317576020818501810151868301820152016132fb565b81811115613329576000602083870101525b50601f01601f19169290920160200192915050565b6020815260006132ea60208301846132f1565b60006020828403121561336357600080fd5b6132ea826130d6565b60006020828403121561337e57600080fd5b5035919050565b60006001600160401b0383111561339e5761339e613117565b6040516133b5601f8501601f19166020018261312d565b8091508381528484840111156133ca57600080fd5b83836020830137600060208583010152509392505050565b600082601f8301126133f357600080fd5b6132ea83833560208501613385565b600080600080600060a0868803121561341a57600080fd5b613423866130d6565b9450613431602087016130d6565b935060408601356001600160401b038082111561344d57600080fd5b61345989838a0161317c565b9450606088013591508082111561346f57600080fd5b61347b89838a0161317c565b9350608088013591508082111561349157600080fd5b5061349e888289016133e2565b9150509295509295909350565b600081518084526020808501945080840160005b838110156134db578151875295820195908201906001016134bf565b509495945050505050565b6020815260006132ea60208301846134ab565b6000806020838503121561350c57600080fd5b82356001600160401b038082111561352357600080fd5b818501915085601f83011261353757600080fd5b81358181111561354657600080fd5b8660208260051b850101111561355b57600080fd5b60209290920196919550909350505050565b60006020828403121561357f57600080fd5b81356001600160401b0381111561359557600080fd5b8201601f810184136135a657600080fd5b61203b84823560208401613385565b600080604083850312156135c857600080fd5b6135d1836130d6565b9150602083013580151581146135e657600080fd5b809150509250929050565b6000806040838503121561360457600080fd5b61360d836130d6565b915061361b602084016130d6565b90509250929050565b602081016006831061364657634e487b7160e01b600052602160045260246000fd5b91905290565b600080600080600060a0868803121561366457600080fd5b61366d866130d6565b945061367b602087016130d6565b9350604086013592506060860135915060808601356001600160401b038111156136a457600080fd5b61349e888289016133e2565b634e487b7160e01b600052601160045260246000fd5b600082198211156136d9576136d96136b0565b500190565b634e487b7160e01b600052603260045260246000fd5b600060018201613706576137066136b0565b5060010190565b604080825283519082018190526000906020906060840190828701845b8281101561374f5781516001600160a01b03168452928401929084019060010161372a565b5050508381038285015261376381866134ab565b9695505050505050565b600181811c9082168061378157607f821691505b6020821081036137a157634e487b7160e01b600052602260045260246000fd5b50919050565b60008160001904831182151516156137c1576137c16136b0565b500290565b6060815260006137d960608301866134ab565b6001600160a01b039490941660208301525060400152919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008261384657634e487b7160e01b600052601260045260246000fd5b500490565b60408152600061385e60408301856132f1565b905060018060a01b03831660208301529392505050565b600082821015613887576138876136b0565b500390565b60408152600061385e60408301856134ab565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6040815260006139ca60408301856134ab565b82810360208401526139dc81856134ab565b95945050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090613a1f908301846132f1565b979650505050505050565b600060208284031215613a3c57600080fd5b81516132ea816132b7565b600060033d1115610f135760046000803e5060005160e01c90565b600060443d1015613a705790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715613a9f57505050505090565b8285019150815181811115613ab75750505050505090565b843d8701016020828501011115613ad15750505050505090565b613ae06020828601018761312d565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a060408201819052600090613b5f908301866134ab565b8281036060840152613b7181866134ab565b90508281036080840152613b8581856132f1565b9897505050505050505056fea26469706673582212204cd49df87662f619ba0a8b621c7fa9dd86011591c6adb0f1aa30be38d18e47cc64736f6c634300080d00330000000000000000000000007910f0923d6e98290c022e01e9b6a10827f1d0df0000000000000000000000006ab8dca25337a1802cfb85d4999234dba71725b4ddaac2f711d324e054766488df719ce30e72ef30e9d177ccb6e81ecdcf71ae710f2a7e1309a3a72f36ff779d697e0cfeb3e0a0526d54e9eb0217db4d3293c57f000000000000000000000000000000000000000000000000000000006269769000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000003968747470733a2f2f70726f7465637465642d6f617369732d32353933362e6865726f6b756170702e636f6d2f6e66742f7b69647d2e6a736f6e00000000000000

Deployed Bytecode

0x60806040526004361061036a5760003560e01c80638925e597116101c6578063affe047a116100f7578063e320acb311610095578063f0a5d3531161006f578063f0a5d35314610989578063f242432a146109ab578063f2fde38b146109cb578063fe87b632146109eb57600080fd5b8063e320acb31461090e578063e985e9c514610924578063ef14e5471461096d57600080fd5b8063b9e5f7fb116100d1578063b9e5f7fb146108a2578063bda1e1c9146108b7578063dbd8e346146108cc578063dbdcb339146108f957600080fd5b8063affe047a14610862578063b0d8e27914610877578063b33712c51461088d57600080fd5b806398cd615311610164578063a118babd1161013e578063a118babd146107fa578063a22cb4651461080f578063a9e233151461082f578063adae1e6b1461084257600080fd5b806398cd6153146107bc5780639b4fdf02146107dc5780639e61dadd146107e457600080fd5b80638c262ecc116101a05780638c262ecc146107335780638da5cb5b1461075357806395d89b411461077657806398bec58c146107a757600080fd5b80638925e597146106c1578063893529b6146106f957806389cdecde1461071357600080fd5b806340b07cd0116102a05780635db8881c1161023e57806370ae3be61161021857806370ae3be61461066c578063715018a614610682578063776cc326146106975780637f866ed6146106ae57600080fd5b80635db8881c1461063b57806367c0dd7f146106435780636e406afc1461065657600080fd5b80634e6fea9c1161027a5780634e6fea9c146105ac578063584e27b2146105e05780635c975abb146105f65780635d39cf6b1461060e57600080fd5b806340b07cd01461054a578063439766ce1461056a5780634e1273f41461057f57600080fd5b80630e89341c1161030d57806333b24f03116102e757806333b24f03146104d85780633630f180146104ef578063377387c6146105025780633a302ffb1461052f57600080fd5b80630e89341c1461048e5780631c82d1ba146104ae5780632eb2c2d6146104b657600080fd5b806306fdde031161034957806306fdde03146103f25780630918f5fc146104335780630a1f61c11461044a5780630c2f2fa91461046157600080fd5b8062fdd58e1461036f57806301b2eec0146103a257806301ffc9a7146103d2575b600080fd5b34801561037b57600080fd5b5061038f61038a3660046130ed565b610a01565b6040519081526020015b60405180910390f35b3480156103ae57600080fd5b506103c26103bd3660046131ed565b610a9b565b6040519015158152602001610399565b3480156103de57600080fd5b506103c26103ed3660046132cd565b610cb3565b3480156103fe57600080fd5b50610426604051806040016040528060088152602001675261676e61726f6b60c01b81525081565b604051610399919061333e565b34801561043f57600080fd5b5061038f6201518081565b34801561045657600080fd5b5061038f6206978081565b34801561046d57600080fd5b5061038f61047c366004613351565b600b6020526000908152604090205481565b34801561049a57600080fd5b506104266104a936600461336c565b610d03565b6103c2610d97565b3480156104c257600080fd5b506104d66104d1366004613402565b610f16565b005b3480156104e457600080fd5b5061038f6205460081565b6103c26104fd36600461336c565b610fad565b34801561050e57600080fd5b5061038f61051d366004613351565b600d6020526000908152604090205481565b34801561053b57600080fd5b5061038f664463c5e3ed200081565b34801561055657600080fd5b506103c261056536600461336c565b61127c565b34801561057657600080fd5b506103c26112f5565b34801561058b57600080fd5b5061059f61059a3660046131ed565b611330565b60405161039991906134e6565b3480156105b857600080fd5b5061038f7f000000000000000000000000000000000000000000000000000000006269769081565b3480156105ec57600080fd5b5061038f60085481565b34801561060257600080fd5b5060035460ff166103c2565b34801561061a57600080fd5b5061038f610629366004613351565b600c6020526000908152604090205481565b6103c2611459565b6103c26106513660046134f9565b6114e6565b34801561066257600080fd5b5061038f611e6181565b34801561067857600080fd5b5061038f60075481565b34801561068e57600080fd5b506104d66116d3565b3480156106a357600080fd5b5061038f6203f48081565b6103c26106bc3660046134f9565b61170f565b3480156106cd57600080fd5b506006546106e1906001600160a01b031681565b6040516001600160a01b039091168152602001610399565b34801561070557600080fd5b50600e546103c29060ff1681565b34801561071f57600080fd5b506005546106e1906001600160a01b031681565b34801561073f57600080fd5b506103c261074e366004613351565b6118db565b34801561075f57600080fd5b5060035461010090046001600160a01b03166106e1565b34801561078257600080fd5b50610426604051806040016040528060058152602001642927a724a760d91b81525081565b3480156107b357600080fd5b5060045461038f565b3480156107c857600080fd5b506103c26107d736600461356d565b611961565b6103c26119ce565b3480156107f057600080fd5b5061038f610f3c81565b34801561080657600080fd5b506103c2611b6b565b34801561081b57600080fd5b506104d661082a3660046135b5565b611c71565b6103c261083d36600461336c565b611c80565b34801561084e57600080fd5b506103c261085d36600461336c565b611ef0565b34801561086e57600080fd5b5061038f601d81565b34801561088357600080fd5b5061038f6101a481565b34801561089957600080fd5b506103c2611f5d565b3480156108ae57600080fd5b5061038f611f98565b3480156108c357600080fd5b506103c2612056565b3480156108d857600080fd5b5061038f6108e7366004613351565b600a6020526000908152604090205481565b34801561090557600080fd5b5061038f600381565b34801561091a57600080fd5b5061038f61011581565b34801561093057600080fd5b506103c261093f3660046135f1565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561097957600080fd5b5061038f670aaf96eb9d0d000081565b34801561099557600080fd5b5061099e612240565b6040516103999190613624565b3480156109b757600080fd5b506104d66109c636600461364c565b612465565b3480156109d757600080fd5b506104d66109e6366004613351565b6124ec565b3480156109f757600080fd5b5061038f60095481565b60006001600160a01b038316610a725760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60007f00000000000000000000000000000000000000000000000000000000626976904210158015610af85750610af5620151807f00000000000000000000000000000000000000000000000000000000626976906136c6565b42105b15610b165760405163fa0e7b7d60e01b815260040160405180910390fd5b6005546001600160a01b03163314610b4157604051638d90d44d60e01b815260040160405180910390fd5b8151835114610b6357604051638d90d44d60e01b815260040160405180910390fd5b60005b8351811015610c70576000848281518110610b8357610b836136de565b60200260200101516001600160a01b0316848381518110610ba657610ba66136de565b602002602001015160405160006040518083038185875af1925050503d8060008114610bee576040519150601f19603f3d011682016040523d82523d6000602084013e610bf3565b606091505b5050905080610c5d57848281518110610c0e57610c0e6136de565b6020026020010151848381518110610c2857610c286136de565b6020908102919091010151604051636272631160e11b81526001600160a01b0390921660048301526024820152604401610a69565b5080610c68816136f4565b915050610b66565b507fc77b80050505b926fff18e9c501407bf6d34df24f4be9f2d7aeaee56d54b41a48383604051610ca292919061370d565b60405180910390a150600192915050565b60006001600160e01b03198216636cdb3d1360e11b1480610ce457506001600160e01b031982166303a24d0760e21b145b80610a9557506301ffc9a760e01b6001600160e01b0319831614610a95565b606060028054610d129061376d565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3e9061376d565b8015610d8b5780601f10610d6057610100808354040283529160200191610d8b565b820191906000526020600020905b815481529060010190602001808311610d6e57829003601f168201915b50505050509050919050565b6000610dc6620697807f00000000000000000000000000000000000000000000000000000000626976906136c6565b4210610efa5760048054906000610ddc836136f4565b9190505550611e616004541115610e065760405163a120045d60e01b815260040160405180910390fd5b336000908152600d6020526040902054600311610e365760405163f739a58f60e01b815260040160405180910390fd5b3460095414610e6557600954604051637087ded160e01b81526004810191909152346024820152604401610a69565b336000908152600d6020526040902054610e809060016136c6565b336000818152600d6020908152604091829020939093556004548151908152928301919091523482820152517f35d7ba9c9051344ac63ee3b275e1ed282a18cba8c52d941e12d14d11e6f8dac39181900360600190a1610ef4336004546001604051806020016040528060008152506125a4565b50600190565b604051638d90d44d60e01b815260040160405180910390fd5b90565b6001600160a01b038516331480610f325750610f32853361093f565b610f995760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610a69565b610fa6858585858561267a565b5050505050565b60007f0000000000000000000000000000000000000000000000000000000062697690421015801561100a5750611007620151807f00000000000000000000000000000000000000000000000000000000626976906136c6565b42105b15610efa5781600003611030576040516319e7854960e11b815260040160405180910390fd5b600061103a611f98565b90503461104784836137a7565b146110795761105683826137a7565b604051637087ded160e01b81526004810191909152346024820152604401610a69565b336000908152600c60205260409020546003906110979085906136c6565b11156110b65760405163f739a58f60e01b815260040160405180910390fd5b336000908152600c60205260409020546110d19084906136c6565b336000908152600c6020526040812091909155836001600160401b038111156110fc576110fc613117565b604051908082528060200260200182016040528015611125578160200160208202803683370190505b5090506000846001600160401b0381111561114257611142613117565b60405190808252806020026020018201604052801561116b578160200160208202803683370190505b509050610f3c8560045461117f91906136c6565b111561119e57604051633aa59ad160e01b815260040160405180910390fd5b600983905560005b8581101561121557600480549060006111be836136f4565b91905055506004548382815181106111d8576111d86136de565b60200260200101818152505060018282815181106111f8576111f86136de565b60209081029190910101528061120d816136f4565b9150506111a6565b507f7d934d8b67cf701e11d53107e39d3fe1015baa6ae71e9674c1ba30a49e95ff40823334604051611249939291906137c6565b60405180910390a161126c3383836040518060200160405280600081525061281c565b506001949350505050565b919050565b6003546000906001600160a01b036101009091041633146112af5760405162461bcd60e51b8152600401610a69906137f4565b6008829055604080518381523360208201527f5430b7aa3fe2c6111e2d6876a38b2fd958e996b06d7ed18ea0427db98623274491015b60405180910390a1506001919050565b6003546000906001600160a01b036101009091041633146113285760405162461bcd60e51b8152600401610a69906137f4565b610ef4612976565b606081518351146113955760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610a69565b600083516001600160401b038111156113b0576113b0613117565b6040519080825280602002602001820160405280156113d9578160200160208202803683370190505b50905060005b8451811015611451576114248582815181106113fd576113fd6136de565b6020026020010151858381518110611417576114176136de565b6020026020010151610a01565b828281518110611436576114366136de565b602090810291909101015261144a816136f4565b90506113df565b509392505050565b6005546000906001600160a01b0316331461148757604051638d90d44d60e01b815260040160405180910390fd5b346000036114a857604051638d90d44d60e01b815260040160405180910390fd5b604080513481523360208201527f49b421a7eb489d4d8bf9c6ccfbae32f551837db461fbe0fd4b821cc8acc40e38910160405180910390a150600190565b60006115156203f4807f00000000000000000000000000000000000000000000000000000000626976906136c6565b421015801561154f575061154c620546007f00000000000000000000000000000000000000000000000000000000626976906136c6565b42105b15610efa5760048054906000611564836136f4565b9091555050336000908152600b602052604090205415611597576040516352aeeef360e11b815260040160405180910390fd5b3460026009546115a79190613829565b146115bb5760026009546110569190613829565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050611635848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506008549150849050612a0e565b6116525760405163582f497d60e11b815260040160405180910390fd5b336000818152600b60209081526040918290206001905560045482519081529081019290925234908201527faaff76f78eebb7934952d1e560848ffbead6b4853b1d6d2e45e2517f0fd8585a906060015b60405180910390a16116c9336004546001604051806020016040528060008152506125a4565b6001915050610a95565b6003546001600160a01b036101009091041633146117035760405162461bcd60e51b8152600401610a69906137f4565b61170d6000612a24565b565b600061173e620151807f00000000000000000000000000000000000000000000000000000000626976906136c6565b421015801561177857506117756203f4807f00000000000000000000000000000000000000000000000000000000626976906136c6565b42105b15610efa576004805490600061178d836136f4565b919050555034600954146117c157600954604051637087ded160e01b81526004810191909152346024820152604401610a69565b336000908152600a6020526040902054156117ef576040516352aeeef360e11b815260040160405180910390fd5b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050611869848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506007549150849050612a0e565b6118865760405163582f497d60e11b815260040160405180910390fd5b336000818152600a60209081526040918290206001905560045482519081529081019290925234908201527f3f67c9a3695a160ecd5104013a62c3dea7fde10ad00ca4aa37e233a5fe618ea3906060016116a3565b6003546000906001600160a01b0361010090910416331461190e5760405162461bcd60e51b8152600401610a69906137f4565b600580546001600160a01b0319166001600160a01b038416908117909155604080519182523360208301527f56dd00d93a23f62394d31bf3327b495d60841436f0d0c0aca4a77b447f962c0991016112e5565b6003546000906001600160a01b036101009091041633146119945760405162461bcd60e51b8152600401610a69906137f4565b61199d82612a7e565b7fc7908db8c8588ac430ee4efe758e7ba70a0d22e32a138b548fd0d34fa8a4839582336040516112e592919061384b565b60007f00000000000000000000000000000000000000000000000000000000626976904210158015611a2b5750611a28620151807f00000000000000000000000000000000000000000000000000000000626976906136c6565b42105b15610efa5760048054906000611a40836136f4565b9190505550610f3c6004541115611a6a57604051633aa59ad160e01b815260040160405180910390fd5b336000908152600c6020526040902054600311611a9a5760405163f739a58f60e01b815260040160405180910390fd5b6000611aa4611f98565b9050348114611acf57604051637087ded160e01b815260048101829052346024820152604401610a69565b6009819055336000908152600c6020526040902054611aef9060016136c6565b336000818152600c6020908152604091829020939093556004548151908152928301919091523482820152517f9592d57d47dfa4895d18972fc47b334199fb370d06704be0fe31e4179826931a9181900360600190a1611b63336004546001604051806020016040528060008152506125a4565b600191505090565b6005546000906001600160a01b03163314611b9957604051638d90d44d60e01b815260040160405180910390fd5b476000819003611bbc57604051638d90d44d60e01b815260040160405180910390fd5b6005546040516000916001600160a01b03169083908381818185875af1925050503d8060008114611c09576040519150601f19603f3d011682016040523d82523d6000602084013e611c0e565b606091505b5050905080611c30576040516317f2c34560e31b815260040160405180910390fd5b604080518381523360208201527fb0caa7e5a1709d95503ec9da196222012fad8495f101214d86c3b72ce101810f910160405180910390a160019250505090565b611c7c338383612a91565b5050565b6000611caf620697807f00000000000000000000000000000000000000000000000000000000626976906136c6565b4210610efa5781600003611cd6576040516319e7854960e11b815260040160405180910390fd5b336000908152600d6020526040902054600390611cf49084906136c6565b1115611d135760405163f739a58f60e01b815260040160405180910390fd5b3482600954611d2291906137a7565b14611d35578160095461105691906137a7565b336000908152600d6020526040902054611d509083906136c6565b336000908152600d6020526040812091909155826001600160401b03811115611d7b57611d7b613117565b604051908082528060200260200182016040528015611da4578160200160208202803683370190505b5090506000836001600160401b03811115611dc157611dc1613117565b604051908082528060200260200182016040528015611dea578160200160208202803683370190505b509050611e6184600454611dfe91906136c6565b1115611e1d5760405163a120045d60e01b815260040160405180910390fd5b60005b84811015611e8f5760048054906000611e38836136f4565b9190505550600454838281518110611e5257611e526136de565b6020026020010181815250506001828281518110611e7257611e726136de565b602090810291909101015280611e87816136f4565b915050611e20565b507fc1c6adeaa10ac93eb80e98666bbc91c451123eac1bf7e81670d15b38f918764a823334604051611ec3939291906137c6565b60405180910390a1611ee63383836040518060200160405280600081525061281c565b5060019392505050565b6003546000906001600160a01b03610100909104163314611f235760405162461bcd60e51b8152600401610a69906137f4565b6007829055604080518381523360208201527f7fb9029b21ced1ee1b635c453bda40024c21ef902c9c00556148602ca926073d91016112e5565b6003546000906001600160a01b03610100909104163314611f905760405162461bcd60e51b8152600401610a69906137f4565b610ef4612b71565b60007f0000000000000000000000000000000000000000000000000000000062697690421015611fcf5750670aaf96eb9d0d000090565b6000611ffb7f000000000000000000000000000000000000000000000000000000006269769042613875565b9050600061200b6101a483613829565b9050601d8110612043576000612029601d664463c5e3ed20006137a7565b61203b90670aaf96eb9d0d0000613875565b949350505050565b600061202982664463c5e3ed20006137a7565b6000612085620546007f00000000000000000000000000000000000000000000000000000000626976906136c6565b42101580156120bf57506120bc620697807f00000000000000000000000000000000000000000000000000000000626976906136c6565b42105b15610efa576006546001600160a01b031633146120ef57604051638d90d44d60e01b815260040160405180910390fd5b600e5460ff1615612113576040516352aeeef360e11b815260040160405180910390fd5b600e805460ff19166001179055604080516101158082526122c08201909252600091602082016122a0803683375050604080516101158082526122c082019092529293506000929150602082016122a0803683370190505060045490915060005b6101158110156121db5781612188816136f4565b9250508184828151811061219e5761219e6136de565b60200260200101818152505060018382815181106121be576121be6136de565b6020908102919091010152806121d3816136f4565b915050612174565b5060048190556040517f6e91d3c1cbfcbd64874ce8db19c59773d82d628d2f82f9201d175f0ee30a26ff90612213908590339061388c565b60405180910390a16122363384846040518060200160405280600081525061281c565b6001935050505090565b60007f00000000000000000000000000000000000000000000000000000000626976904210156122705750600090565b7f000000000000000000000000000000000000000000000000000000006269769042101580156122cb57506122c8620151807f00000000000000000000000000000000000000000000000000000000626976906136c6565b42105b156122d65750600190565b612303620151807f00000000000000000000000000000000000000000000000000000000626976906136c6565b421015801561233d575061233a6203f4807f00000000000000000000000000000000000000000000000000000000626976906136c6565b42105b156123485750600290565b6123756203f4807f00000000000000000000000000000000000000000000000000000000626976906136c6565b42101580156123af57506123ac620546007f00000000000000000000000000000000000000000000000000000000626976906136c6565b42105b156123ba5750600390565b6123e7620546007f00000000000000000000000000000000000000000000000000000000626976906136c6565b4210158015612421575061241e620697807f00000000000000000000000000000000000000000000000000000000626976906136c6565b42105b1561242c5750600490565b612459620697807f00000000000000000000000000000000000000000000000000000000626976906136c6565b4210610f135750600590565b6001600160a01b0385163314806124815750612481853361093f565b6124df5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610a69565b610fa68585858585612beb565b6003546001600160a01b0361010090910416331461251c5760405162461bcd60e51b8152600401610a69906137f4565b6001600160a01b0381166125815760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a69565b61258a81612a24565b50565b505050505050565b6001600160a01b03163b151590565b6001600160a01b0384166125ca5760405162461bcd60e51b8152600401610a699061389f565b336125ea816000876125db88612d08565b6125e488612d08565b87612d53565b6000848152602081815260408083206001600160a01b03891684529091528120805485929061261a9084906136c6565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610fa681600087878787612dbb565b815183511461269b5760405162461bcd60e51b8152600401610a69906138e0565b6001600160a01b0384166126c15760405162461bcd60e51b8152600401610a6990613928565b336126d0818787878787612d53565b60005b84518110156127b65760008582815181106126f0576126f06136de565b60200260200101519050600085838151811061270e5761270e6136de565b602090810291909101810151600084815280835260408082206001600160a01b038e16835290935291909120549091508181101561275e5760405162461bcd60e51b8152600401610a699061396d565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061279b9084906136c6565b92505081905550505050806127af906136f4565b90506126d3565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516128069291906139b7565b60405180910390a461258d818787878787612f16565b6001600160a01b0384166128425760405162461bcd60e51b8152600401610a699061389f565b81518351146128635760405162461bcd60e51b8152600401610a69906138e0565b3361287381600087878787612d53565b60005b845181101561290e57838181518110612891576128916136de565b60200260200101516000808784815181106128ae576128ae6136de565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060008282546128f691906136c6565b90915550819050612906816136f4565b915050612876565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161295f9291906139b7565b60405180910390a4610fa681600087878787612f16565b60035460ff16156129bc5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610a69565b6003805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586129f13390565b6040516001600160a01b03909116815260200160405180910390a1565b600082612a1b8584612fd1565b14949350505050565b600380546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8051611c7c90600290602084019061303d565b816001600160a01b0316836001600160a01b031603612b045760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610a69565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60035460ff16612bba5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610a69565b6003805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336129f1565b6001600160a01b038416612c115760405162461bcd60e51b8152600401610a6990613928565b33612c218187876125db88612d08565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015612c625760405162461bcd60e51b8152600401610a699061396d565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290612c9f9084906136c6565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612cff828888888888612dbb565b50505050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110612d4257612d426136de565b602090810291909101015292915050565b60035460ff161561258d5760405162461bcd60e51b815260206004820152602c60248201527f455243313135355061757361626c653a20746f6b656e207472616e736665722060448201526b1dda1a5b19481c185d5cd95960a21b6064820152608401610a69565b6001600160a01b0384163b1561258d5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190612dff90899089908890889088906004016139e5565b6020604051808303816000875af1925050508015612e3a575060408051601f3d908101601f19168201909252612e3791810190613a2a565b60015b612ee657612e46613a47565b806308c379a003612e7f5750612e5a613a62565b80612e655750612e81565b8060405162461bcd60e51b8152600401610a69919061333e565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610a69565b6001600160e01b0319811663f23a6e6160e01b14612cff5760405162461bcd60e51b8152600401610a6990613aeb565b6001600160a01b0384163b1561258d5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190612f5a9089908990889088908890600401613b33565b6020604051808303816000875af1925050508015612f95575060408051601f3d908101601f19168201909252612f9291810190613a2a565b60015b612fa157612e46613a47565b6001600160e01b0319811663bc197c8160e01b14612cff5760405162461bcd60e51b8152600401610a6990613aeb565b600081815b8451811015611451576000858281518110612ff357612ff36136de565b60200260200101519050808311613019576000838152602082905260409020925061302a565b600081815260208490526040902092505b5080613035816136f4565b915050612fd6565b8280546130499061376d565b90600052602060002090601f01602090048101928261306b57600085556130b1565b82601f1061308457805160ff19168380011785556130b1565b828001600101855582156130b1579182015b828111156130b1578251825591602001919060010190613096565b506130bd9291506130c1565b5090565b5b808211156130bd57600081556001016130c2565b80356001600160a01b038116811461127757600080fd5b6000806040838503121561310057600080fd5b613109836130d6565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b038111828210171561315257613152613117565b6040525050565b60006001600160401b0382111561317257613172613117565b5060051b60200190565b600082601f83011261318d57600080fd5b8135602061319a82613159565b6040516131a7828261312d565b83815260059390931b85018201928281019150868411156131c757600080fd5b8286015b848110156131e257803583529183019183016131cb565b509695505050505050565b6000806040838503121561320057600080fd5b82356001600160401b038082111561321757600080fd5b818501915085601f83011261322b57600080fd5b8135602061323882613159565b604051613245828261312d565b83815260059390931b850182019282810191508984111561326557600080fd5b948201945b8386101561328a5761327b866130d6565b8252948201949082019061326a565b965050860135925050808211156132a057600080fd5b506132ad8582860161317c565b9150509250929050565b6001600160e01b03198116811461258a57600080fd5b6000602082840312156132df57600080fd5b81356132ea816132b7565b9392505050565b6000815180845260005b81811015613317576020818501810151868301820152016132fb565b81811115613329576000602083870101525b50601f01601f19169290920160200192915050565b6020815260006132ea60208301846132f1565b60006020828403121561336357600080fd5b6132ea826130d6565b60006020828403121561337e57600080fd5b5035919050565b60006001600160401b0383111561339e5761339e613117565b6040516133b5601f8501601f19166020018261312d565b8091508381528484840111156133ca57600080fd5b83836020830137600060208583010152509392505050565b600082601f8301126133f357600080fd5b6132ea83833560208501613385565b600080600080600060a0868803121561341a57600080fd5b613423866130d6565b9450613431602087016130d6565b935060408601356001600160401b038082111561344d57600080fd5b61345989838a0161317c565b9450606088013591508082111561346f57600080fd5b61347b89838a0161317c565b9350608088013591508082111561349157600080fd5b5061349e888289016133e2565b9150509295509295909350565b600081518084526020808501945080840160005b838110156134db578151875295820195908201906001016134bf565b509495945050505050565b6020815260006132ea60208301846134ab565b6000806020838503121561350c57600080fd5b82356001600160401b038082111561352357600080fd5b818501915085601f83011261353757600080fd5b81358181111561354657600080fd5b8660208260051b850101111561355b57600080fd5b60209290920196919550909350505050565b60006020828403121561357f57600080fd5b81356001600160401b0381111561359557600080fd5b8201601f810184136135a657600080fd5b61203b84823560208401613385565b600080604083850312156135c857600080fd5b6135d1836130d6565b9150602083013580151581146135e657600080fd5b809150509250929050565b6000806040838503121561360457600080fd5b61360d836130d6565b915061361b602084016130d6565b90509250929050565b602081016006831061364657634e487b7160e01b600052602160045260246000fd5b91905290565b600080600080600060a0868803121561366457600080fd5b61366d866130d6565b945061367b602087016130d6565b9350604086013592506060860135915060808601356001600160401b038111156136a457600080fd5b61349e888289016133e2565b634e487b7160e01b600052601160045260246000fd5b600082198211156136d9576136d96136b0565b500190565b634e487b7160e01b600052603260045260246000fd5b600060018201613706576137066136b0565b5060010190565b604080825283519082018190526000906020906060840190828701845b8281101561374f5781516001600160a01b03168452928401929084019060010161372a565b5050508381038285015261376381866134ab565b9695505050505050565b600181811c9082168061378157607f821691505b6020821081036137a157634e487b7160e01b600052602260045260246000fd5b50919050565b60008160001904831182151516156137c1576137c16136b0565b500290565b6060815260006137d960608301866134ab565b6001600160a01b039490941660208301525060400152919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008261384657634e487b7160e01b600052601260045260246000fd5b500490565b60408152600061385e60408301856132f1565b905060018060a01b03831660208301529392505050565b600082821015613887576138876136b0565b500390565b60408152600061385e60408301856134ab565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6040815260006139ca60408301856134ab565b82810360208401526139dc81856134ab565b95945050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090613a1f908301846132f1565b979650505050505050565b600060208284031215613a3c57600080fd5b81516132ea816132b7565b600060033d1115610f135760046000803e5060005160e01c90565b600060443d1015613a705790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715613a9f57505050505090565b8285019150815181811115613ab75750505050505090565b843d8701016020828501011115613ad15750505050505090565b613ae06020828601018761312d565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a060408201819052600090613b5f908301866134ab565b8281036060840152613b7181866134ab565b90508281036080840152613b8581856132f1565b9897505050505050505056fea26469706673582212204cd49df87662f619ba0a8b621c7fa9dd86011591c6adb0f1aa30be38d18e47cc64736f6c634300080d0033

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

0000000000000000000000007910f0923d6e98290c022e01e9b6a10827f1d0df0000000000000000000000006ab8dca25337a1802cfb85d4999234dba71725b4ddaac2f711d324e054766488df719ce30e72ef30e9d177ccb6e81ecdcf71ae710f2a7e1309a3a72f36ff779d697e0cfeb3e0a0526d54e9eb0217db4d3293c57f000000000000000000000000000000000000000000000000000000006269769000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000003968747470733a2f2f70726f7465637465642d6f617369732d32353933362e6865726f6b756170702e636f6d2f6e66742f7b69647d2e6a736f6e00000000000000

-----Decoded View---------------
Arg [0] : platformAddress (address): 0x7910f0923d6E98290C022e01e9b6A10827F1D0df
Arg [1] : platformMintingAddress (address): 0x6AB8DCa25337a1802Cfb85D4999234dba71725B4
Arg [2] : pixelMerkleRoot (bytes32): 0xddaac2f711d324e054766488df719ce30e72ef30e9d177ccb6e81ecdcf71ae71
Arg [3] : pillMerkleRoot (bytes32): 0x0f2a7e1309a3a72f36ff779d697e0cfeb3e0a0526d54e9eb0217db4d3293c57f
Arg [4] : startTimestamp (uint256): 1651078800
Arg [5] : newURI (string): https://protected-oasis-25936.herokuapp.com/nft/{id}.json

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000007910f0923d6e98290c022e01e9b6a10827f1d0df
Arg [1] : 0000000000000000000000006ab8dca25337a1802cfb85d4999234dba71725b4
Arg [2] : ddaac2f711d324e054766488df719ce30e72ef30e9d177ccb6e81ecdcf71ae71
Arg [3] : 0f2a7e1309a3a72f36ff779d697e0cfeb3e0a0526d54e9eb0217db4d3293c57f
Arg [4] : 0000000000000000000000000000000000000000000000000000000062697690
Arg [5] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000039
Arg [7] : 68747470733a2f2f70726f7465637465642d6f617369732d32353933362e6865
Arg [8] : 726f6b756170702e636f6d2f6e66742f7b69647d2e6a736f6e00000000000000


Deployed Bytecode Sourcemap

42774:24603:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28084:231;;;;;;;;;;-1:-1:-1;28084:231:0;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;28084:231:0;;;;;;;;66526:848;;;;;;;;;;-1:-1:-1;66526:848:0;;;;;:::i;:::-;;:::i;:::-;;;3314:14:1;;3307:22;3289:41;;3277:2;3262:18;66526:848:0;3149:187:1;27107:310:0;;;;;;;;;;-1:-1:-1;27107:310:0;;;;;:::i;:::-;;:::i;42861:40::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42861:40:0;;;;;;;;;;;;:::i;43871:62::-;;;;;;;;;;;;43925:8;43871:62;;44067:57;;;;;;;;;;;;44115:9;44067:57;;44324:63;;;;;;;;;;-1:-1:-1;44324:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;27828:105;;;;;;;;;;-1:-1:-1;27828:105:0;;;;;:::i;:::-;;:::i;59964:876::-;;;:::i;30023:442::-;;;;;;;;;;-1:-1:-1;30023:442:0;;;;;:::i;:::-;;:::i;:::-;;44004:56;;;;;;;;;;;;44052:8;44004:56;;61099:1783;;;;;;:::i;:::-;;:::i;44451:49::-;;;;;;;;;;-1:-1:-1;44451:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;43591:99;;;;;;;;;;;;43673:17;43591:99;;52169:263;;;;;;;;;;-1:-1:-1;52169:263:0;;;;;:::i;:::-;;:::i;53194:108::-;;;;;;;;;;;;;:::i;28481:524::-;;;;;;;;;;-1:-1:-1;28481:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;43341:45::-;;;;;;;;;;;;;;;43279:53;;;;;;;;;;;;;;;;6944:86;;;;;;;;;;-1:-1:-1;7015:7:0;;;;6944:86;;44394:50;;;;;;;;;;-1:-1:-1;44394:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;65032:322;;;:::i;56928:1301::-;;;;;;:::i;:::-;;:::i;43393:57::-;;;;;;;;;;;;43446:4;43393:57;;43218:54;;;;;;;;;;;;;;;;4995:103;;;;;;;;;;;;;:::i;43940:57::-;;;;;;;;;;;;43989:8;43940:57;;55389:1239;;;;;;:::i;:::-;;:::i;43167:44::-;;;;;;;;;;-1:-1:-1;43167:44:0;;;;-1:-1:-1;;;;;43167:44:0;;;;;;-1:-1:-1;;;;;8308:32:1;;;8290:51;;8278:2;8263:18;43167:44:0;8144:203:1;44507:38:0;;;;;;;;;;-1:-1:-1;44507:38:0;;;;;;;;43115:45;;;;;;;;;;-1:-1:-1;43115:45:0;;;;-1:-1:-1;;;;;43115:45:0;;;52707:278;;;;;;;;;;-1:-1:-1;52707:278:0;;;;;:::i;:::-;;:::i;4344:87::-;;;;;;;;;;-1:-1:-1;4417:6:0;;;;;-1:-1:-1;;;;;4417:6:0;4344:87;;42908:39;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42908:39:0;;;;;48412:101;;;;;;;;;;-1:-1:-1;48496:9:0;;48412:101;;51151:210;;;;;;;;;;-1:-1:-1;51151:210:0;;;;;:::i;:::-;;:::i;53917:1168::-;;;:::i;43457:62::-;;;;;;;;;;;;43515:4;43457:62;;65608:486;;;;;;;;;;;;;:::i;29078:155::-;;;;;;;;;;-1:-1:-1;29078:155:0;;;;;:::i;:::-;;:::i;63139:1557::-;;;;;;:::i;:::-;;:::i;51633:266::-;;;;;;;;;;-1:-1:-1;51633:266:0;;;;;:::i;:::-;;:::i;43761:52::-;;;;;;;;;;;;43811:2;43761:52;;43697:57;;;;;;;;;;;;43745:9;43697:57;;53517:112;;;;;;;;;;;;;:::i;48631:866::-;;;;;;;;;;;;;:::i;58511:1186::-;;;;;;;;;;;;;:::i;44253:64::-;;;;;;;;;;-1:-1:-1;44253:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;44133:59;;;;;;;;;;;;44191:1;44133:59;;44199:45;;;;;;;;;;;;44241:3;44199:45;;29305:168;;;;;;;;;;-1:-1:-1;29305:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;29428:27:0;;;29404:4;29428:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;29305:168;43526:58;;;;;;;;;;;;43570:14;43526:58;;49598:1323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29545:401::-;;;;;;;;;;-1:-1:-1;29545:401:0;;;;;:::i;:::-;;:::i;5253:201::-;;;;;;;;;;-1:-1:-1;5253:201:0;;;;;:::i;:::-;;:::i;43822:40::-;;;;;;;;;;;;;;;;28084:231;28170:7;-1:-1:-1;;;;;28198:21:0;;28190:77;;;;-1:-1:-1;;;28190:77:0;;10807:2:1;28190:77:0;;;10789:21:1;10846:2;10826:18;;;10819:30;10885:34;10865:18;;;10858:62;-1:-1:-1;;;10936:18:1;;;10929:41;10987:19;;28190:77:0;;;;;;;;;-1:-1:-1;28285:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;28285:22:0;;;;;;;;;;28084:231;;;;;:::o;66526:848::-;66652:4;66707:20;66688:15;:39;;66687:145;;;;-1:-1:-1;66781:50:0;43925:8;66781:20;:50;:::i;:::-;66746:15;:85;66687:145;66669:220;;;66851:38;;-1:-1:-1;;;66851:38:0;;;;;;;;;;;66669:220;66920:22;;-1:-1:-1;;;;;66920:22:0;66906:10;:36;66902:70;;66951:21;;-1:-1:-1;;;66951:21:0;;;;;;;;;;;66902:70;67009:6;:13;66989:9;:16;:33;66985:67;;67031:21;;-1:-1:-1;;;67031:21:0;;;;;;;;;;;66985:67;67070:9;67065:211;67089:9;:16;67085:1;:20;67065:211;;;67128:9;67143;67153:1;67143:12;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;67143:17:0;67168:6;67175:1;67168:9;;;;;;;;:::i;:::-;;;;;;;67143:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67127:55;;;67202:4;67197:67;;67240:9;67250:1;67240:12;;;;;;;;:::i;:::-;;;;;;;67254:6;67261:1;67254:9;;;;;;;;:::i;:::-;;;;;;;;;;;67215:49;;-1:-1:-1;;;67215:49:0;;-1:-1:-1;;;;;11816:32:1;;;67215:49:0;;;11798:51:1;11865:18;;;11858:34;11771:18;;67215:49:0;11624:274:1;67197:67:0;-1:-1:-1;67107:3:0;;;;:::i;:::-;;;;67065:211;;;;67293:51;67326:9;67337:6;67293:51;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;67362:4:0;66526:848;;;;:::o;27107:310::-;27209:4;-1:-1:-1;;;;;;27246:41:0;;-1:-1:-1;;;27246:41:0;;:110;;-1:-1:-1;;;;;;;27304:52:0;;-1:-1:-1;;;27304:52:0;27246:110;:163;;;-1:-1:-1;;;;;;;;;;18524:40:0;;;27373:36;18415:157;27828:105;27888:13;27921:4;27914:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27828:105;;;:::o;59964:876::-;60023:4;60064:44;44115:9;60064:20;:44;:::i;:::-;60045:15;:63;60040:793;;60126:9;:11;;;:9;:11;;;:::i;:::-;;;;;;43446:4;60158:9;;:38;60154:94;;;60222:26;;-1:-1:-1;;;60222:26:0;;;;;;;;;;;60154:94;60284:10;60269:26;;;;:14;:26;;;;;;44191:1;-1:-1:-1;60265:122:0;;60356:31;;-1:-1:-1;;;60356:31:0;;;;;;;;;;;60265:122;60433:9;60408:21;;:34;60404:116;;60487:21;;60468:52;;-1:-1:-1;;;60468:52:0;;;;;13439:25:1;;;;60510:9:0;13480:18:1;;;13473:34;13412:18;;60468:52:0;13265:248:1;60404:116:0;60581:10;60566:26;;;;:14;:26;;;;;;:30;;60595:1;60566:30;:::i;:::-;60552:10;60537:26;;;;:14;:26;;;;;;;;;:59;;;;60647:9;;60618:62;;13720:25:1;;;13761:18;;;13754:60;;;;60670:9:0;13830:18:1;;;13823:34;60618:62:0;;;;;;13708:2:1;60618:62:0;;;60697:35;60703:10;60715:9;;60726:1;60697:35;;;;;;;;;;;;:5;:35::i;:::-;-1:-1:-1;60756:4:0;;59964:876::o;60040:793::-;60800:21;;-1:-1:-1;;;60800:21:0;;;;;;;;;;;60040:793;59964:876;:::o;30023:442::-;-1:-1:-1;;;;;30256:20:0;;3148:10;30256:20;;:60;;-1:-1:-1;30280:36:0;30297:4;3148:10;29305:168;:::i;30280:36::-;30234:160;;;;-1:-1:-1;;;30234:160:0;;14070:2:1;30234:160:0;;;14052:21:1;14109:2;14089:18;;;14082:30;14148:34;14128:18;;;14121:62;-1:-1:-1;;;14199:18:1;;;14192:48;14257:19;;30234:160:0;13868:414:1;30234:160:0;30405:52;30428:4;30434:2;30438:3;30443:7;30452:4;30405:22;:52::i;:::-;30023:442;;;;;:::o;61099:1783::-;61206:4;61266:20;61247:15;:39;;61246:145;;;;-1:-1:-1;61340:50:0;43925:8;61340:20;:50;:::i;:::-;61305:15;:85;61246:145;61228:1647;;;61422:10;61436:1;61422:15;61418:51;;61446:23;;-1:-1:-1;;;61446:23:0;;;;;;;;;;;61418:51;61486:21;61510:27;:25;:27::i;:::-;61486:51;-1:-1:-1;61590:9:0;61559:26;61575:10;61486:51;61559:26;:::i;:::-;61558:41;61554:191;;61667:26;61683:10;61667:13;:26;:::i;:::-;61625:120;;-1:-1:-1;;;61625:120:0;;;;;13439:25:1;;;;61717:9:0;13480:18:1;;;13473:34;13412:18;;61625:120:0;13265:248:1;61554:191:0;61800:10;61784:27;;;;:15;:27;;;;;;44191:1;;61784:40;;61814:10;;61784:40;:::i;:::-;:91;61762:167;;;61898:31;;-1:-1:-1;;;61898:31:0;;;;;;;;;;;61762:167;62009:10;61993:27;;;;:15;:27;;;;;;:57;;62040:10;;61993:57;:::i;:::-;61962:10;61946:27;;;;:15;:27;;;;;:104;;;;62107:10;-1:-1:-1;;;;;62093:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62093:25:0;;62067:51;;62133:27;62177:10;-1:-1:-1;;;;;62163:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62163:25:0;;62133:55;;43515:4;62221:10;62209:9;;:22;;;;:::i;:::-;:56;62205:118;;;62291:32;;-1:-1:-1;;;62291:32:0;;;;;;;;;;;62205:118;62340:21;:37;;;62399:9;62394:165;62418:10;62414:1;:14;62394:165;;;62454:9;:11;;;:9;:11;;;:::i;:::-;;;;;;62498:9;;62486:6;62493:1;62486:9;;;;;;;;:::i;:::-;;;;;;:21;;;;;62542:1;62526:10;62537:1;62526:13;;;;;;;;:::i;:::-;;;;;;;;;;:17;62430:3;;;;:::i;:::-;;;;62394:165;;;;62580:131;62633:6;62658:10;62687:9;62580:131;;;;;;;;:::i;:::-;;;;;;;;62728:46;62739:10;62751:6;62759:10;62728:46;;;;;;;;;;;;:10;:46::i;:::-;-1:-1:-1;62798:4:0;;61099:1783;-1:-1:-1;;;;61099:1783:0:o;61228:1647::-;61099:1783;;;:::o;52169:263::-;4417:6;;52272:4;;-1:-1:-1;;;;;4417:6:0;;;;;3148:10;4564:23;4556:68;;;;-1:-1:-1;;;4556:68:0;;;;;;;:::i;:::-;52294:38:::1;:45:::0;;;52355::::1;::::0;;15429:25:1;;;52389:10:0::1;15485:2:1::0;15470:18;;15463:60;52355:45:0::1;::::0;15402:18:1;52355:45:0::1;;;;;;;;-1:-1:-1::0;52420:4:0::1;52169:263:::0;;;:::o;53194:108::-;4417:6;;53247:4;;-1:-1:-1;;;;;4417:6:0;;;;;3148:10;4564:23;4556:68;;;;-1:-1:-1;;;4556:68:0;;;;;;;:::i;:::-;53264:8:::1;:6;:8::i;28481:524::-:0;28637:16;28698:3;:10;28679:8;:15;:29;28671:83;;;;-1:-1:-1;;;28671:83:0;;15736:2:1;28671:83:0;;;15718:21:1;15775:2;15755:18;;;15748:30;15814:34;15794:18;;;15787:62;-1:-1:-1;;;15865:18:1;;;15858:39;15914:19;;28671:83:0;15534:405:1;28671:83:0;28767:30;28814:8;:15;-1:-1:-1;;;;;28800:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28800:30:0;;28767:63;;28848:9;28843:122;28867:8;:15;28863:1;:19;28843:122;;;28923:30;28933:8;28942:1;28933:11;;;;;;;;:::i;:::-;;;;;;;28946:3;28950:1;28946:6;;;;;;;;:::i;:::-;;;;;;;28923:9;:30::i;:::-;28904:13;28918:1;28904:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;28884:3;;;:::i;:::-;;;28843:122;;;-1:-1:-1;28984:13:0;28481:524;-1:-1:-1;;;28481:524:0:o;65032:322::-;65132:22;;65097:4;;-1:-1:-1;;;;;65132:22:0;65118:10;:36;65114:70;;65163:21;;-1:-1:-1;;;65163:21:0;;;;;;;;;;;65114:70;65201:9;65214:1;65201:14;65197:48;;65224:21;;-1:-1:-1;;;65224:21:0;;;;;;;;;;;65197:48;65263:61;;;65302:9;15429:25:1;;65313:10:0;15485:2:1;15470:18;;15463:60;65263:61:0;;15402:18:1;65263:61:0;;;;;;;-1:-1:-1;65342:4:0;;65032:322::o;56928:1301::-;57039:4;57116:45;43989:8;57116:20;:45;:::i;:::-;57080:15;:81;;57079:164;;;;-1:-1:-1;57198:44:0;44052:8;57198:20;:44;:::i;:::-;57180:15;:62;57079:164;57061:1161;;;57270:9;:11;;;:9;:11;;;:::i;:::-;;;;-1:-1:-1;;57331:10:0;57302:40;;;;:28;:40;;;;;;:45;57298:112;;57373:37;;-1:-1:-1;;;57373:37:0;;;;;;;;;;;57298:112;57462:9;57456:1;57432:21;;:25;;;;:::i;:::-;57431:40;57427:189;;57563:1;57539:21;;:25;;;;:::i;57427:189::-;57658:28;;-1:-1:-1;;57675:10:0;16594:2:1;16590:15;16586:53;57658:28:0;;;16574:66:1;57633:12:0;;16656::1;;57658:28:0;;;;;;;;;;;;57648:39;;;;;;57633:54;;57727:160;57768:12;;57727:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;57803:38:0;;;-1:-1:-1;57864:4:0;;-1:-1:-1;57727:18:0;:160::i;:::-;57704:226;;57910:20;;-1:-1:-1;;;57910:20:0;;;;;;;;;;;57704:226;57976:10;57947:40;;;;:28;:40;;;;;;;;;57990:1;57947:44;;58036:9;;58013:56;;13720:25:1;;;13761:18;;;13754:60;;;;58059:9:0;13830:18:1;;;13823:34;58013:56:0;;13708:2:1;13693:18;58013:56:0;;;;;;;;58086:35;58092:10;58104:9;;58115:1;58086:35;;;;;;;;;;;;:5;:35::i;:::-;58145:4;58138:11;;;;;4995:103;4417:6;;-1:-1:-1;;;;;4417:6:0;;;;;3148:10;4564:23;4556:68;;;;-1:-1:-1;;;4556:68:0;;;;;;;:::i;:::-;5060:30:::1;5087:1;5060:18;:30::i;:::-;4995:103::o:0;55389:1239::-;55501:4;55578:50;43925:8;55578:20;:50;:::i;:::-;55542:15;:86;;55541:170;;;;-1:-1:-1;55665:45:0;43989:8;55665:20;:45;:::i;:::-;55647:15;:63;55541:170;55523:1098;;;55738:9;:11;;;:9;:11;;;:::i;:::-;;;;;;55795:9;55770:21;;:34;55766:116;;55849:21;;55830:52;;-1:-1:-1;;;55830:52:0;;;;;13439:25:1;;;;55872:9:0;13480:18:1;;;13473:34;13412:18;;55830:52:0;13265:248:1;55766:116:0;55933:10;55903:41;;;;:29;:41;;;;;;:46;55899:113;;55975:37;;-1:-1:-1;;;55975:37:0;;;;;;;;;;;55899:113;56054:28;;-1:-1:-1;;56071:10:0;16594:2:1;16590:15;16586:53;56054:28:0;;;16574:66:1;56029:12:0;;16656::1;;56054:28:0;;;;;;;;;;;;56044:39;;;;;;56029:54;;56123:161;56164:12;;56123:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;56199:39:0;;;-1:-1:-1;56261:4:0;;-1:-1:-1;56123:18:0;:161::i;:::-;56100:227;;56307:20;;-1:-1:-1;;;56307:20:0;;;;;;;;;;;56100:227;56374:10;56344:41;;;;:29;:41;;;;;;;;;56388:1;56344:45;;56435:9;;56411:57;;13720:25:1;;;13761:18;;;13754:60;;;;56458:9:0;13830:18:1;;;13823:34;56411:57:0;;13708:2:1;13693:18;56411:57:0;13518:345:1;52707:278:0;4417:6;;52819:4;;-1:-1:-1;;;;;4417:6:0;;;;;3148:10;4564:23;4556:68;;;;-1:-1:-1;;;4556:68:0;;;;;;;:::i;:::-;52841:22:::1;:44:::0;;-1:-1:-1;;;;;;52841:44:0::1;-1:-1:-1::0;;;;;52841:44:0;::::1;::::0;;::::1;::::0;;;52901:52:::1;::::0;;16891:34:1;;;52942:10:0::1;16956:2:1::0;16941:18;;16934:43;52901:52:0::1;::::0;16826:18:1;52901:52:0::1;16679:304:1::0;51151:210:0;4417:6;;51252:4;;-1:-1:-1;;;;;4417:6:0;;;;;3148:10;4564:23;4556:68;;;;-1:-1:-1;;;4556:68:0;;;;;;;:::i;:::-;51274:15:::1;51282:6;51274:7;:15::i;:::-;51305:26;51312:6;51320:10;51305:26;;;;;;;:::i;53917:1168::-:0;53977:4;54032:20;54013:15;:39;;54012:145;;;;-1:-1:-1;54106:50:0;43925:8;54106:20;:50;:::i;:::-;54071:15;:85;54012:145;53994:1084;;;54184:9;:11;;;:9;:11;;;:::i;:::-;;;;;;43515:4;54216:9;;:43;54212:105;;;54285:32;;-1:-1:-1;;;54285:32:0;;;;;;;;;;;54212:105;54354:10;54338:27;;;;:15;:27;;;;;;44191:1;-1:-1:-1;54334:123:0;;54426:31;;-1:-1:-1;;;54426:31:0;;;;;;;;;;;54334:123;54474:21;54498:27;:25;:27::i;:::-;54474:51;;54563:9;54546:13;:26;54542:100;;54598:44;;-1:-1:-1;;;54598:44:0;;;;;13439:25:1;;;54632:9:0;13480:18:1;;;13473:34;13412:18;;54598:44:0;13265:248:1;54542:100:0;54659:21;:37;;;54759:10;54743:27;;;;:15;:27;;;;;;:31;;54773:1;54743:31;:::i;:::-;54729:10;54713:27;;;;:15;:27;;;;;;;;;:61;;;;54844:9;;54796:129;;13720:25:1;;;13761:18;;;13754:60;;;;54901:9:0;13830:18:1;;;13823:34;54796:129:0;;;;;;13708:2:1;54796:129:0;;;54942:35;54948:10;54960:9;;54971:1;54942:35;;;;;;;;;;;;:5;:35::i;:::-;55001:4;54994:11;;;53917:1168;:::o;65608:486::-;65688:22;;65653:4;;-1:-1:-1;;;;;65688:22:0;65674:10;:36;65670:70;;65719:21;;-1:-1:-1;;;65719:21:0;;;;;;;;;;;65670:70;65779:21;65753:23;65817:20;;;65813:54;;65846:21;;-1:-1:-1;;;65846:21:0;;;;;;;;;;;65813:54;65896:22;;:55;;65881:9;;-1:-1:-1;;;;;65896:22:0;;65931:15;;65881:9;65896:55;65881:9;65896:55;65931:15;65896:22;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65880:71;;;65969:4;65964:37;;65982:19;;-1:-1:-1;;;65982:19:0;;;;;;;;;;;65964:37;66019:45;;;15429:25:1;;;66053:10:0;15485:2:1;15470:18;;15463:60;66019:45:0;;15402:18:1;66019:45:0;;;;;;;66082:4;66075:11;;;;65608:486;:::o;29078:155::-;29173:52;3148:10;29206:8;29216;29173:18;:52::i;:::-;29078:155;;:::o;63139:1557::-;63245:4;63291:44;44115:9;63291:20;:44;:::i;:::-;63272:15;:63;63267:1422;;63357:10;63371:1;63357:15;63353:51;;63381:23;;-1:-1:-1;;;63381:23:0;;;;;;;;;;;63353:51;63458:10;63443:26;;;;:14;:26;;;;;;44191:1;;63443:39;;63472:10;;63443:39;:::i;:::-;:90;63421:166;;;63556:31;;-1:-1:-1;;;63556:31:0;;;;;;;;;;;63421:166;63648:9;63633:10;63609:21;;:34;;;;:::i;:::-;63608:49;63604:207;;63749:10;63725:21;;:34;;;;:::i;63604:207::-;63889:10;63874:26;;;;:14;:26;;;;;;:56;;63920:10;;63874:56;:::i;:::-;63843:10;63828:26;;;;:14;:26;;;;;:102;;;;63987:10;-1:-1:-1;;;;;63973:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63973:25:0;;63947:51;;64013:27;64057:10;-1:-1:-1;;;;;64043:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64043:25:0;;64013:55;;43446:4;64101:10;64089:9;;:22;;;;:::i;:::-;:51;64085:107;;;64166:26;;-1:-1:-1;;;64166:26:0;;;;;;;;;;;64085:107;64214:9;64209:165;64233:10;64229:1;:14;64209:165;;;64269:9;:11;;;:9;:11;;;:::i;:::-;;;;;;64313:9;;64301:6;64308:1;64301:9;;;;;;;;:::i;:::-;;;;;;:21;;;;;64357:1;64341:10;64352:1;64341:13;;;;;;;;:::i;:::-;;;;;;;;;;:17;64245:3;;;;:::i;:::-;;;;64209:165;;;;64395:130;64447:6;64472:10;64501:9;64395:130;;;;;;;;:::i;:::-;;;;;;;;64542:46;64553:10;64565:6;64573:10;64542:46;;;;;;;;;;;;:10;:46::i;:::-;-1:-1:-1;64612:4:0;;63139:1557;-1:-1:-1;;;63139:1557:0:o;51633:266::-;4417:6;;51737:4;;-1:-1:-1;;;;;4417:6:0;;;;;3148:10;4564:23;4556:68;;;;-1:-1:-1;;;4556:68:0;;;;;;;:::i;:::-;51759:39:::1;:46:::0;;;51821::::1;::::0;;15429:25:1;;;51856:10:0::1;15485:2:1::0;15470:18;;15463:60;51821:46:0::1;::::0;15402:18:1;51821:46:0::1;15255:274:1::0;53517:112:0;4417:6;;53572:4;;-1:-1:-1;;;;;4417:6:0;;;;;3148:10;4564:23;4556:68;;;;-1:-1:-1;;;4556:68:0;;;;;;;:::i;:::-;53589:10:::1;:8;:10::i;48631:866::-:0;48689:7;48731:20;48713:15;:38;48709:68;;;-1:-1:-1;43570:14:0;;48631:866::o;48709:68::-;48790:31;48824:51;48855:20;48824:15;:51;:::i;:::-;48790:85;-1:-1:-1;48888:26:0;48917:60;43745:9;48790:85;48917:60;:::i;:::-;48888:89;;43811:2;48994:18;:45;48990:500;;49056:22;49120:93;43811:2;43673:17;49120:93;:::i;:::-;49082:132;;43570:14;49082:132;:::i;:::-;49056:159;48631:866;-1:-1:-1;;;;48631:866:0:o;48990:500::-;49286:22;49350:88;49420:18;43673:17;49350:88;:::i;58511:1186::-;58556:4;58611:44;44052:8;58611:20;:44;:::i;:::-;58592:15;:63;;58591:146;;;;-1:-1:-1;58692:44:0;44115:9;58692:20;:44;:::i;:::-;58674:15;:62;58591:146;58573:1117;;;58782:29;;-1:-1:-1;;;;;58782:29:0;58768:10;:43;58764:94;;58837:21;;-1:-1:-1;;;58837:21:0;;;;;;;;;;;58764:94;58877:26;;;;58873:93;;;58929:37;;-1:-1:-1;;;58929:37:0;;;;;;;;;;;58873:93;58983:26;:33;;-1:-1:-1;;58983:33:0;59012:4;58983:33;;;59059:30;;;44241:3;59059:30;;;;;;;;;-1:-1:-1;;59059:30:0;;;;;;;;-1:-1:-1;;59134:30:0;;;44241:3;59134:30;;;;;;;;;59033:56;;-1:-1:-1;59104:27:0;;59134:30;-1:-1:-1;59134:30:0;;;;;;;;;;-1:-1:-1;;59208:9:0;;59104:60;;-1:-1:-1;59181:24:0;59234:184;44241:3;59254:1;:19;59234:184;;;59299:18;;;;:::i;:::-;;;;59350:16;59338:6;59345:1;59338:9;;;;;;;;:::i;:::-;;;;;;:28;;;;;59401:1;59385:10;59396:1;59385:13;;;;;;;;:::i;:::-;;;;;;;;;;:17;59275:3;;;;:::i;:::-;;;;59234:184;;;-1:-1:-1;59434:9:0;:28;;;59484:42;;;;;;59507:6;;59515:10;;59484:42;:::i;:::-;;;;;;;;59543:46;59554:10;59566:6;59574:10;59543:46;;;;;;;;;;;;:10;:46::i;:::-;59613:4;59606:11;;;;;58511:1186;:::o;49598:1323::-;49646:19;49700:20;49682:15;:38;49678:1236;;;-1:-1:-1;49744:19:0;;49598:1323::o;49678:1236::-;49819:20;49800:15;:39;;49799:145;;;;-1:-1:-1;49893:50:0;43925:8;49893:20;:50;:::i;:::-;49858:15;:85;49799:145;49781:1133;;;-1:-1:-1;49978:24:0;;49598:1323::o;49781:1133::-;50075:50;43925:8;50075:20;:50;:::i;:::-;50039:15;:86;;50038:170;;;;-1:-1:-1;50162:45:0;43989:8;50162:20;:45;:::i;:::-;50144:15;:63;50038:170;50020:894;;;-1:-1:-1;50242:18:0;;49598:1323::o;50020:894::-;50333:45;43989:8;50333:20;:45;:::i;:::-;50297:15;:81;;50296:164;;;;-1:-1:-1;50415:44:0;44052:8;50415:20;:44;:::i;:::-;50397:15;:62;50296:164;50278:636;;;-1:-1:-1;50494:17:0;;49598:1323::o;50278:636::-;50567:44;44052:8;50567:20;:44;:::i;:::-;50548:15;:63;;50547:146;;;;-1:-1:-1;50648:44:0;44115:9;50648:20;:44;:::i;:::-;50630:15;:62;50547:146;50529:385;;;-1:-1:-1;50727:17:0;;49598:1323::o;50529:385::-;50800:44;44115:9;50800:20;:44;:::i;:::-;50781:15;:63;50762:152;;-1:-1:-1;50879:23:0;;49598:1323::o;29545:401::-;-1:-1:-1;;;;;29753:20:0;;3148:10;29753:20;;:60;;-1:-1:-1;29777:36:0;29794:4;3148:10;29305:168;:::i;29777:36::-;29731:151;;;;-1:-1:-1;;;29731:151:0;;18005:2:1;29731:151:0;;;17987:21:1;18044:2;18024:18;;;18017:30;18083:34;18063:18;;;18056:62;-1:-1:-1;;;18134:18:1;;;18127:39;18183:19;;29731:151:0;17803:405:1;29731:151:0;29893:45;29911:4;29917:2;29921;29925:6;29933:4;29893:17;:45::i;5253:201::-;4417:6;;-1:-1:-1;;;;;4417:6:0;;;;;3148:10;4564:23;4556:68;;;;-1:-1:-1;;;4556:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5342:22:0;::::1;5334:73;;;::::0;-1:-1:-1;;;5334:73:0;;18415:2:1;5334:73:0::1;::::0;::::1;18397:21:1::0;18454:2;18434:18;;;18427:30;18493:34;18473:18;;;18466:62;-1:-1:-1;;;18544:18:1;;;18537:36;18590:19;;5334:73:0::1;18213:402:1::0;5334:73:0::1;5418:28;5437:8;5418:18;:28::i;:::-;5253:201:::0;:::o;39580:221::-;;;;;;;:::o;9363:326::-;-1:-1:-1;;;;;9658:19:0;;:23;;;9363:326::o;34499:569::-;-1:-1:-1;;;;;34652:16:0;;34644:62;;;;-1:-1:-1;;;34644:62:0;;;;;;;:::i;:::-;3148:10;34763:102;3148:10;34719:16;34806:2;34810:21;34828:2;34810:17;:21::i;:::-;34833:25;34851:6;34833:17;:25::i;:::-;34860:4;34763:20;:102::i;:::-;34878:9;:13;;;;;;;;;;;-1:-1:-1;;;;;34878:17:0;;;;;;;;;:27;;34899:6;;34878:9;:27;;34899:6;;34878:27;:::i;:::-;;;;-1:-1:-1;;34921:52:0;;;13439:25:1;;;13495:2;13480:18;;13473:34;;;-1:-1:-1;;;;;34921:52:0;;;;34954:1;;34921:52;;;;;;13412:18:1;34921:52:0;;;;;;;34986:74;35017:8;35035:1;35039:2;35043;35047:6;35055:4;34986:30;:74::i;32107:1074::-;32334:7;:14;32320:3;:10;:28;32312:81;;;;-1:-1:-1;;;32312:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32412:16:0;;32404:66;;;;-1:-1:-1;;;32404:66:0;;;;;;;:::i;:::-;3148:10;32527:60;3148:10;32558:4;32564:2;32568:3;32573:7;32582:4;32527:20;:60::i;:::-;32605:9;32600:421;32624:3;:10;32620:1;:14;32600:421;;;32656:10;32669:3;32673:1;32669:6;;;;;;;;:::i;:::-;;;;;;;32656:19;;32690:14;32707:7;32715:1;32707:10;;;;;;;;:::i;:::-;;;;;;;;;;;;32734:19;32756:13;;;;;;;;;;-1:-1:-1;;;;;32756:19:0;;;;;;;;;;;;32707:10;;-1:-1:-1;32798:21:0;;;;32790:76;;;;-1:-1:-1;;;32790:76:0;;;;;;;:::i;:::-;32910:9;:13;;;;;;;;;;;-1:-1:-1;;;;;32910:19:0;;;;;;;;;;32932:20;;;32910:42;;32982:17;;;;;;;:27;;32932:20;;32910:9;32982:27;;32932:20;;32982:27;:::i;:::-;;;;;;;;32641:380;;;32636:3;;;;:::i;:::-;;;32600:421;;;;33068:2;-1:-1:-1;;;;;33038:47:0;33062:4;-1:-1:-1;;;;;33038:47:0;33052:8;-1:-1:-1;;;;;33038:47:0;;33072:3;33077:7;33038:47;;;;;;;:::i;:::-;;;;;;;;33098:75;33134:8;33144:4;33150:2;33154:3;33159:7;33168:4;33098:35;:75::i;35424:735::-;-1:-1:-1;;;;;35602:16:0;;35594:62;;;;-1:-1:-1;;;35594:62:0;;;;;;;:::i;:::-;35689:7;:14;35675:3;:10;:28;35667:81;;;;-1:-1:-1;;;35667:81:0;;;;;;;:::i;:::-;3148:10;35805:66;3148:10;35761:16;35848:2;35852:3;35857:7;35866:4;35805:20;:66::i;:::-;35889:9;35884:103;35908:3;:10;35904:1;:14;35884:103;;;35965:7;35973:1;35965:10;;;;;;;;:::i;:::-;;;;;;;35940:9;:17;35950:3;35954:1;35950:6;;;;;;;;:::i;:::-;;;;;;;35940:17;;;;;;;;;;;:21;35958:2;-1:-1:-1;;;;;35940:21:0;-1:-1:-1;;;;;35940:21:0;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;35920:3:0;;-1:-1:-1;35920:3:0;;;:::i;:::-;;;;35884:103;;;;36040:2;-1:-1:-1;;;;;36004:53:0;36036:1;-1:-1:-1;;;;;36004:53:0;36018:8;-1:-1:-1;;;;;36004:53:0;;36044:3;36049:7;36004:53;;;;;;;:::i;:::-;;;;;;;;36070:81;36106:8;36124:1;36128:2;36132:3;36137:7;36146:4;36070:35;:81::i;7744:118::-;7015:7;;;;7269:9;7261:38;;;;-1:-1:-1;;;7261:38:0;;20920:2:1;7261:38:0;;;20902:21:1;20959:2;20939:18;;;20932:30;-1:-1:-1;;;20978:18:1;;;20971:46;21034:18;;7261:38:0;20718:340:1;7261:38:0;7804:7:::1;:14:::0;;-1:-1:-1;;7804:14:0::1;7814:4;7804:14;::::0;;7834:20:::1;7841:12;3148:10:::0;;3068:98;7841:12:::1;7834:20;::::0;-1:-1:-1;;;;;8308:32:1;;;8290:51;;8278:2;8263:18;7834:20:0::1;;;;;;;7744:118::o:0;923:190::-;1048:4;1101;1072:25;1085:5;1092:4;1072:12;:25::i;:::-;:33;;923:190;-1:-1:-1;;;;923:190:0:o;5614:191::-;5707:6;;;-1:-1:-1;;;;;5724:17:0;;;5707:6;5724:17;;;-1:-1:-1;;;;;;5724:17:0;;;;;;5757:40;;5707:6;;;;;;;;5757:40;;5688:16;;5757:40;5677:128;5614:191;:::o;34025:88::-;34092:13;;;;:4;;:13;;;;;:::i;38293:331::-;38448:8;-1:-1:-1;;;;;38439:17:0;:5;-1:-1:-1;;;;;38439:17:0;;38431:71;;;;-1:-1:-1;;;38431:71:0;;21265:2:1;38431:71:0;;;21247:21:1;21304:2;21284:18;;;21277:30;21343:34;21323:18;;;21316:62;-1:-1:-1;;;21394:18:1;;;21387:39;21443:19;;38431:71:0;21063:405:1;38431:71:0;-1:-1:-1;;;;;38513:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;38513:46:0;;;;;;;;;;38575:41;;3289::1;;;38575::0;;3262:18:1;38575:41:0;;;;;;;38293:331;;;:::o;8003:120::-;7015:7;;;;7539:41;;;;-1:-1:-1;;;7539:41:0;;21675:2:1;7539:41:0;;;21657:21:1;21714:2;21694:18;;;21687:30;-1:-1:-1;;;21733:18:1;;;21726:50;21793:18;;7539:41:0;21473:344:1;7539:41:0;8062:7:::1;:15:::0;;-1:-1:-1;;8062:15:0::1;::::0;;8093:22:::1;3148:10:::0;8102:12:::1;3068:98:::0;30929:820;-1:-1:-1;;;;;31117:16:0;;31109:66;;;;-1:-1:-1;;;31109:66:0;;;;;;;:::i;:::-;3148:10;31232:96;3148:10;31263:4;31269:2;31273:21;31291:2;31273:17;:21::i;31232:96::-;31341:19;31363:13;;;;;;;;;;;-1:-1:-1;;;;;31363:19:0;;;;;;;;;;31401:21;;;;31393:76;;;;-1:-1:-1;;;31393:76:0;;;;;;;:::i;:::-;31505:9;:13;;;;;;;;;;;-1:-1:-1;;;;;31505:19:0;;;;;;;;;;31527:20;;;31505:42;;31569:17;;;;;;;:27;;31527:20;;31505:9;31569:27;;31527:20;;31569:27;:::i;:::-;;;;-1:-1:-1;;31614:46:0;;;13439:25:1;;;13495:2;13480:18;;13473:34;;;-1:-1:-1;;;;;31614:46:0;;;;;;;;;;;;;;13412:18:1;31614:46:0;;;;;;;31673:68;31704:8;31714:4;31720:2;31724;31728:6;31736:4;31673:30;:68::i;:::-;31098:651;;30929:820;;;;;:::o;41382:198::-;41502:16;;;41516:1;41502:16;;;;;;;;;41448;;41477:22;;41502:16;;;;;;;;;;;;-1:-1:-1;41502:16:0;41477:41;;41540:7;41529:5;41535:1;41529:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;41567:5;41382:198;-1:-1:-1;;41382:198:0:o;42305:392::-;7015:7;;;;42631:9;42623:66;;;;-1:-1:-1;;;42623:66:0;;22024:2:1;42623:66:0;;;22006:21:1;22063:2;22043:18;;;22036:30;22102:34;22082:18;;;22075:62;-1:-1:-1;;;22153:18:1;;;22146:42;22205:19;;42623:66:0;21822:408:1;39809:744:0;-1:-1:-1;;;;;40024:13:0;;9658:19;:23;40020:526;;40060:72;;-1:-1:-1;;;40060:72:0;;-1:-1:-1;;;;;40060:38:0;;;;;:72;;40099:8;;40109:4;;40115:2;;40119:6;;40127:4;;40060:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40060:72:0;;;;;;;;-1:-1:-1;;40060:72:0;;;;;;;;;;;;:::i;:::-;;;40056:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;40408:6;40401:14;;-1:-1:-1;;;40401:14:0;;;;;;;;:::i;40056:479::-;;;40457:62;;-1:-1:-1;;;40457:62:0;;24117:2:1;40457:62:0;;;24099:21:1;24156:2;24136:18;;;24129:30;24195:34;24175:18;;;24168:62;-1:-1:-1;;;24246:18:1;;;24239:50;24306:19;;40457:62:0;23915:416:1;40056:479:0;-1:-1:-1;;;;;;40182:55:0;;-1:-1:-1;;;40182:55:0;40178:154;;40262:50;;-1:-1:-1;;;40262:50:0;;;;;;;:::i;40561:813::-;-1:-1:-1;;;;;40801:13:0;;9658:19;:23;40797:570;;40837:79;;-1:-1:-1;;;40837:79:0;;-1:-1:-1;;;;;40837:43:0;;;;;:79;;40881:8;;40891:4;;40897:3;;40902:7;;40911:4;;40837:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40837:79:0;;;;;;;;-1:-1:-1;;40837:79:0;;;;;;;;;;;;:::i;:::-;;;40833:523;;;;:::i;:::-;-1:-1:-1;;;;;;40998:60:0;;-1:-1:-1;;;40998:60:0;40994:159;;41083:50;;-1:-1:-1;;;41083:50:0;;;;;;;:::i;1475:675::-;1558:7;1601:4;1558:7;1616:497;1640:5;:12;1636:1;:16;1616:497;;;1674:20;1697:5;1703:1;1697:8;;;;;;;;:::i;:::-;;;;;;;1674:31;;1740:12;1724;:28;1720:382;;2226:13;2276:15;;;2312:4;2305:15;;;2359:4;2343:21;;1852:57;;1720:382;;;2226:13;2276:15;;;2312:4;2305:15;;;2359:4;2343:21;;2029:57;;1720:382;-1:-1:-1;1654:3:0;;;;:::i;:::-;;;;1616:497;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;192:254;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:127::-;694:10;689:3;685:20;682:1;675:31;725:4;722:1;715:15;749:4;746:1;739:15;765:249;875:2;856:13;;-1:-1:-1;;852:27:1;840:40;;-1:-1:-1;;;;;895:34:1;;931:22;;;892:62;889:88;;;957:18;;:::i;:::-;993:2;986:22;-1:-1:-1;;765:249:1:o;1019:183::-;1079:4;-1:-1:-1;;;;;1104:6:1;1101:30;1098:56;;;1134:18;;:::i;:::-;-1:-1:-1;1179:1:1;1175:14;1191:4;1171:25;;1019:183::o;1207:724::-;1261:5;1314:3;1307:4;1299:6;1295:17;1291:27;1281:55;;1332:1;1329;1322:12;1281:55;1368:6;1355:20;1394:4;1417:43;1457:2;1417:43;:::i;:::-;1489:2;1483:9;1501:31;1529:2;1521:6;1501:31;:::i;:::-;1567:18;;;1659:1;1655:10;;;;1643:23;;1639:32;;;1601:15;;;;-1:-1:-1;1683:15:1;;;1680:35;;;1711:1;1708;1701:12;1680:35;1747:2;1739:6;1735:15;1759:142;1775:6;1770:3;1767:15;1759:142;;;1841:17;;1829:30;;1879:12;;;;1792;;1759:142;;;-1:-1:-1;1919:6:1;1207:724;-1:-1:-1;;;;;;1207:724:1:o;1936:1208::-;2054:6;2062;2115:2;2103:9;2094:7;2090:23;2086:32;2083:52;;;2131:1;2128;2121:12;2083:52;2171:9;2158:23;-1:-1:-1;;;;;2241:2:1;2233:6;2230:14;2227:34;;;2257:1;2254;2247:12;2227:34;2295:6;2284:9;2280:22;2270:32;;2340:7;2333:4;2329:2;2325:13;2321:27;2311:55;;2362:1;2359;2352:12;2311:55;2398:2;2385:16;2420:4;2443:43;2483:2;2443:43;:::i;:::-;2515:2;2509:9;2527:31;2555:2;2547:6;2527:31;:::i;:::-;2593:18;;;2681:1;2677:10;;;;2669:19;;2665:28;;;2627:15;;;;-1:-1:-1;2705:19:1;;;2702:39;;;2737:1;2734;2727:12;2702:39;2761:11;;;;2781:148;2797:6;2792:3;2789:15;2781:148;;;2863:23;2882:3;2863:23;:::i;:::-;2851:36;;2814:12;;;;2907;;;;2781:148;;;2948:6;-1:-1:-1;;2992:18:1;;2979:32;;-1:-1:-1;;3023:16:1;;;3020:36;;;3052:1;3049;3042:12;3020:36;;3075:63;3130:7;3119:8;3108:9;3104:24;3075:63;:::i;:::-;3065:73;;;1936:1208;;;;;:::o;3341:131::-;-1:-1:-1;;;;;;3415:32:1;;3405:43;;3395:71;;3462:1;3459;3452:12;3477:245;3535:6;3588:2;3576:9;3567:7;3563:23;3559:32;3556:52;;;3604:1;3601;3594:12;3556:52;3643:9;3630:23;3662:30;3686:5;3662:30;:::i;:::-;3711:5;3477:245;-1:-1:-1;;;3477:245:1:o;3727:472::-;3769:3;3807:5;3801:12;3834:6;3829:3;3822:19;3859:1;3869:162;3883:6;3880:1;3877:13;3869:162;;;3945:4;4001:13;;;3997:22;;3991:29;3973:11;;;3969:20;;3962:59;3898:12;3869:162;;;4049:6;4046:1;4043:13;4040:87;;;4115:1;4108:4;4099:6;4094:3;4090:16;4086:27;4079:38;4040:87;-1:-1:-1;4181:2:1;4160:15;-1:-1:-1;;4156:29:1;4147:39;;;;4188:4;4143:50;;3727:472;-1:-1:-1;;3727:472:1:o;4204:220::-;4353:2;4342:9;4335:21;4316:4;4373:45;4414:2;4403:9;4399:18;4391:6;4373:45;:::i;4429:186::-;4488:6;4541:2;4529:9;4520:7;4516:23;4512:32;4509:52;;;4557:1;4554;4547:12;4509:52;4580:29;4599:9;4580:29;:::i;4620:180::-;4679:6;4732:2;4720:9;4711:7;4707:23;4703:32;4700:52;;;4748:1;4745;4738:12;4700:52;-1:-1:-1;4771:23:1;;4620:180;-1:-1:-1;4620:180:1:o;4805:468::-;4869:5;-1:-1:-1;;;;;4895:6:1;4892:30;4889:56;;;4925:18;;:::i;:::-;4974:2;4968:9;4986:69;5043:2;5022:15;;-1:-1:-1;;5018:29:1;5049:4;5014:40;4968:9;4986:69;:::i;:::-;5073:6;5064:15;;5103:6;5095;5088:22;5143:3;5134:6;5129:3;5125:16;5122:25;5119:45;;;5160:1;5157;5150:12;5119:45;5210:6;5205:3;5198:4;5190:6;5186:17;5173:44;5265:1;5258:4;5249:6;5241;5237:19;5233:30;5226:41;;4805:468;;;;;:::o;5278:220::-;5320:5;5373:3;5366:4;5358:6;5354:17;5350:27;5340:55;;5391:1;5388;5381:12;5340:55;5413:79;5488:3;5479:6;5466:20;5459:4;5451:6;5447:17;5413:79;:::i;5503:943::-;5657:6;5665;5673;5681;5689;5742:3;5730:9;5721:7;5717:23;5713:33;5710:53;;;5759:1;5756;5749:12;5710:53;5782:29;5801:9;5782:29;:::i;:::-;5772:39;;5830:38;5864:2;5853:9;5849:18;5830:38;:::i;:::-;5820:48;;5919:2;5908:9;5904:18;5891:32;-1:-1:-1;;;;;5983:2:1;5975:6;5972:14;5969:34;;;5999:1;5996;5989:12;5969:34;6022:61;6075:7;6066:6;6055:9;6051:22;6022:61;:::i;:::-;6012:71;;6136:2;6125:9;6121:18;6108:32;6092:48;;6165:2;6155:8;6152:16;6149:36;;;6181:1;6178;6171:12;6149:36;6204:63;6259:7;6248:8;6237:9;6233:24;6204:63;:::i;:::-;6194:73;;6320:3;6309:9;6305:19;6292:33;6276:49;;6350:2;6340:8;6337:16;6334:36;;;6366:1;6363;6356:12;6334:36;;6389:51;6432:7;6421:8;6410:9;6406:24;6389:51;:::i;:::-;6379:61;;;5503:943;;;;;;;;:::o;6636:435::-;6689:3;6727:5;6721:12;6754:6;6749:3;6742:19;6780:4;6809:2;6804:3;6800:12;6793:19;;6846:2;6839:5;6835:14;6867:1;6877:169;6891:6;6888:1;6885:13;6877:169;;;6952:13;;6940:26;;6986:12;;;;7021:15;;;;6913:1;6906:9;6877:169;;;-1:-1:-1;7062:3:1;;6636:435;-1:-1:-1;;;;;6636:435:1:o;7076:261::-;7255:2;7244:9;7237:21;7218:4;7275:56;7327:2;7316:9;7312:18;7304:6;7275:56;:::i;7524:615::-;7610:6;7618;7671:2;7659:9;7650:7;7646:23;7642:32;7639:52;;;7687:1;7684;7677:12;7639:52;7727:9;7714:23;-1:-1:-1;;;;;7797:2:1;7789:6;7786:14;7783:34;;;7813:1;7810;7803:12;7783:34;7851:6;7840:9;7836:22;7826:32;;7896:7;7889:4;7885:2;7881:13;7877:27;7867:55;;7918:1;7915;7908:12;7867:55;7958:2;7945:16;7984:2;7976:6;7973:14;7970:34;;;8000:1;7997;7990:12;7970:34;8053:7;8048:2;8038:6;8035:1;8031:14;8027:2;8023:23;8019:32;8016:45;8013:65;;;8074:1;8071;8064:12;8013:65;8105:2;8097:11;;;;;8127:6;;-1:-1:-1;7524:615:1;;-1:-1:-1;;;;7524:615:1:o;8576:450::-;8645:6;8698:2;8686:9;8677:7;8673:23;8669:32;8666:52;;;8714:1;8711;8704:12;8666:52;8754:9;8741:23;-1:-1:-1;;;;;8779:6:1;8776:30;8773:50;;;8819:1;8816;8809:12;8773:50;8842:22;;8895:4;8887:13;;8883:27;-1:-1:-1;8873:55:1;;8924:1;8921;8914:12;8873:55;8947:73;9012:7;9007:2;8994:16;8989:2;8985;8981:11;8947:73;:::i;9031:347::-;9096:6;9104;9157:2;9145:9;9136:7;9132:23;9128:32;9125:52;;;9173:1;9170;9163:12;9125:52;9196:29;9215:9;9196:29;:::i;:::-;9186:39;;9275:2;9264:9;9260:18;9247:32;9322:5;9315:13;9308:21;9301:5;9298:32;9288:60;;9344:1;9341;9334:12;9288:60;9367:5;9357:15;;;9031:347;;;;;:::o;9383:260::-;9451:6;9459;9512:2;9500:9;9491:7;9487:23;9483:32;9480:52;;;9528:1;9525;9518:12;9480:52;9551:29;9570:9;9551:29;:::i;:::-;9541:39;;9599:38;9633:2;9622:9;9618:18;9599:38;:::i;:::-;9589:48;;9383:260;;;;;:::o;9648:341::-;9793:2;9778:18;;9826:1;9815:13;;9805:144;;9871:10;9866:3;9862:20;9859:1;9852:31;9906:4;9903:1;9896:15;9934:4;9931:1;9924:15;9805:144;9958:25;;;9648:341;:::o;9994:606::-;10098:6;10106;10114;10122;10130;10183:3;10171:9;10162:7;10158:23;10154:33;10151:53;;;10200:1;10197;10190:12;10151:53;10223:29;10242:9;10223:29;:::i;:::-;10213:39;;10271:38;10305:2;10294:9;10290:18;10271:38;:::i;:::-;10261:48;;10356:2;10345:9;10341:18;10328:32;10318:42;;10407:2;10396:9;10392:18;10379:32;10369:42;;10462:3;10451:9;10447:19;10434:33;-1:-1:-1;;;;;10482:6:1;10479:30;10476:50;;;10522:1;10519;10512:12;10476:50;10545:49;10586:7;10577:6;10566:9;10562:22;10545:49;:::i;11017:127::-;11078:10;11073:3;11069:20;11066:1;11059:31;11109:4;11106:1;11099:15;11133:4;11130:1;11123:15;11149:128;11189:3;11220:1;11216:6;11213:1;11210:13;11207:39;;;11226:18;;:::i;:::-;-1:-1:-1;11262:9:1;;11149:128::o;11282:127::-;11343:10;11338:3;11334:20;11331:1;11324:31;11374:4;11371:1;11364:15;11398:4;11395:1;11388:15;11903:135;11942:3;11963:17;;;11960:43;;11983:18;;:::i;:::-;-1:-1:-1;12030:1:1;12019:13;;11903:135::o;12043:832::-;12311:2;12323:21;;;12393:13;;12296:18;;;12415:22;;;12263:4;;12490;;12468:2;12453:18;;;12517:15;;;12263:4;12560:195;12574:6;12571:1;12568:13;12560:195;;;12639:13;;-1:-1:-1;;;;;12635:39:1;12623:52;;12695:12;;;;12730:15;;;;12671:1;12589:9;12560:195;;;12564:3;;;12800:9;12795:3;12791:19;12786:2;12775:9;12771:18;12764:47;12828:41;12865:3;12857:6;12828:41;:::i;:::-;12820:49;12043:832;-1:-1:-1;;;;;;12043:832:1:o;12880:380::-;12959:1;12955:12;;;;13002;;;13023:61;;13077:4;13069:6;13065:17;13055:27;;13023:61;13130:2;13122:6;13119:14;13099:18;13096:38;13093:161;;13176:10;13171:3;13167:20;13164:1;13157:31;13211:4;13208:1;13201:15;13239:4;13236:1;13229:15;13093:161;;12880:380;;;:::o;14287:168::-;14327:7;14393:1;14389;14385:6;14381:14;14378:1;14375:21;14370:1;14363:9;14356:17;14352:45;14349:71;;;14400:18;;:::i;:::-;-1:-1:-1;14440:9:1;;14287:168::o;14460:429::-;14695:2;14684:9;14677:21;14658:4;14715:56;14767:2;14756:9;14752:18;14744:6;14715:56;:::i;:::-;-1:-1:-1;;;;;14807:32:1;;;;14802:2;14787:18;;14780:60;-1:-1:-1;14871:2:1;14856:18;14849:34;14707:64;14460:429;-1:-1:-1;14460:429:1:o;14894:356::-;15096:2;15078:21;;;15115:18;;;15108:30;15174:34;15169:2;15154:18;;15147:62;15241:2;15226:18;;14894:356::o;16223:217::-;16263:1;16289;16279:132;;16333:10;16328:3;16324:20;16321:1;16314:31;16368:4;16365:1;16358:15;16396:4;16393:1;16386:15;16279:132;-1:-1:-1;16425:9:1;;16223:217::o;16988:317::-;17165:2;17154:9;17147:21;17128:4;17185:45;17226:2;17215:9;17211:18;17203:6;17185:45;:::i;:::-;17177:53;;17295:1;17291;17286:3;17282:11;17278:19;17270:6;17266:32;17261:2;17250:9;17246:18;17239:60;16988:317;;;;;:::o;17310:125::-;17350:4;17378:1;17375;17372:8;17369:34;;;17383:18;;:::i;:::-;-1:-1:-1;17420:9:1;;17310:125::o;17440:358::-;17647:2;17636:9;17629:21;17610:4;17667:56;17719:2;17708:9;17704:18;17696:6;17667:56;:::i;18620:397::-;18822:2;18804:21;;;18861:2;18841:18;;;18834:30;18900:34;18895:2;18880:18;;18873:62;-1:-1:-1;;;18966:2:1;18951:18;;18944:31;19007:3;18992:19;;18620:397::o;19022:404::-;19224:2;19206:21;;;19263:2;19243:18;;;19236:30;19302:34;19297:2;19282:18;;19275:62;-1:-1:-1;;;19368:2:1;19353:18;;19346:38;19416:3;19401:19;;19022:404::o;19431:401::-;19633:2;19615:21;;;19672:2;19652:18;;;19645:30;19711:34;19706:2;19691:18;;19684:62;-1:-1:-1;;;19777:2:1;19762:18;;19755:35;19822:3;19807:19;;19431:401::o;19837:406::-;20039:2;20021:21;;;20078:2;20058:18;;;20051:30;20117:34;20112:2;20097:18;;20090:62;-1:-1:-1;;;20183:2:1;20168:18;;20161:40;20233:3;20218:19;;19837:406::o;20248:465::-;20505:2;20494:9;20487:21;20468:4;20531:56;20583:2;20572:9;20568:18;20560:6;20531:56;:::i;:::-;20635:9;20627:6;20623:22;20618:2;20607:9;20603:18;20596:50;20663:44;20700:6;20692;20663:44;:::i;:::-;20655:52;20248:465;-1:-1:-1;;;;;20248:465:1:o;22235:561::-;-1:-1:-1;;;;;22532:15:1;;;22514:34;;22584:15;;22579:2;22564:18;;22557:43;22631:2;22616:18;;22609:34;;;22674:2;22659:18;;22652:34;;;22494:3;22717;22702:19;;22695:32;;;22457:4;;22744:46;;22770:19;;22762:6;22744:46;:::i;:::-;22736:54;22235:561;-1:-1:-1;;;;;;;22235:561:1:o;22801:249::-;22870:6;22923:2;22911:9;22902:7;22898:23;22894:32;22891:52;;;22939:1;22936;22929:12;22891:52;22971:9;22965:16;22990:30;23014:5;22990:30;:::i;23055:179::-;23090:3;23132:1;23114:16;23111:23;23108:120;;;23178:1;23175;23172;23157:23;-1:-1:-1;23215:1:1;23209:8;23204:3;23200:18;23055:179;:::o;23239:671::-;23278:3;23320:4;23302:16;23299:26;23296:39;;;23239:671;:::o;23296:39::-;23362:2;23356:9;-1:-1:-1;;23427:16:1;23423:25;;23420:1;23356:9;23399:50;23478:4;23472:11;23502:16;-1:-1:-1;;;;;23608:2:1;23601:4;23593:6;23589:17;23586:25;23581:2;23573:6;23570:14;23567:45;23564:58;;;23615:5;;;;;23239:671;:::o;23564:58::-;23652:6;23646:4;23642:17;23631:28;;23688:3;23682:10;23715:2;23707:6;23704:14;23701:27;;;23721:5;;;;;;23239:671;:::o;23701:27::-;23805:2;23786:16;23780:4;23776:27;23772:36;23765:4;23756:6;23751:3;23747:16;23743:27;23740:69;23737:82;;;23812:5;;;;;;23239:671;:::o;23737:82::-;23828:57;23879:4;23870:6;23862;23858:19;23854:30;23848:4;23828:57;:::i;:::-;-1:-1:-1;23901:3:1;;23239:671;-1:-1:-1;;;;;23239:671:1:o;24336:404::-;24538:2;24520:21;;;24577:2;24557:18;;;24550:30;24616:34;24611:2;24596:18;;24589:62;-1:-1:-1;;;24682:2:1;24667:18;;24660:38;24730:3;24715:19;;24336:404::o;24745:827::-;-1:-1:-1;;;;;25142:15:1;;;25124:34;;25194:15;;25189:2;25174:18;;25167:43;25104:3;25241:2;25226:18;;25219:31;;;25067:4;;25273:57;;25310:19;;25302:6;25273:57;:::i;:::-;25378:9;25370:6;25366:22;25361:2;25350:9;25346:18;25339:50;25412:44;25449:6;25441;25412:44;:::i;:::-;25398:58;;25505:9;25497:6;25493:22;25487:3;25476:9;25472:19;25465:51;25533:33;25559:6;25551;25533:33;:::i;:::-;25525:41;24745:827;-1:-1:-1;;;;;;;;24745:827:1:o

Swarm Source

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