ETH Price: $3,276.47 (-3.93%)
Gas: 17 Gwei

Token

 

Overview

Max Total Supply

1,973

Holders

968

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x0743882fa09A0c257B18d53dC1B101d3F32a04E5
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
SuperlativeMagicLaboratory

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-15
*/

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Counters.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/ReentrancyGuard.sol


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, 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);

        _afterTokenTransfer(operator, from, to, ids, amounts, 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);

        _afterTokenTransfer(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();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

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

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

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

        _afterTokenTransfer(operator, address(0), to, ids, amounts, 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);

        _afterTokenTransfer(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();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

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

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

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

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

        _afterTokenTransfer(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 {}

    /**
     * @dev Hook that is called after 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 _afterTokenTransfer(
        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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/extensions/ERC1155Burnable.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Extension of {ERC1155} that allows token holders to destroy both their
 * own tokens and those that they have been approved to use.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Burnable is ERC1155 {
    function burn(
        address account,
        uint256 id,
        uint256 value
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burn(account, id, value);
    }

    function burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory values
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burnBatch(account, ids, values);
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/IERC721Metadata.sol


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

pragma solidity ^0.8.0;


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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

// File: slape.sol

pragma solidity ^0.8.0;




/*
  ______                                 __          _    _                       _                             
.' ____ \                               [  |        / |_ (_)                     / \                            
| (___ \_|__   _  _ .--.   .---.  _ .--. | |  ,--. `| |-'__  _   __  .---.      / _ \    _ .--.   .---.  .--.   
 _.____`.[  | | |[ '/'`\ \/ /__\\[ `/'`\]| | `'_\ : | | [  |[ \ [  ]/ /__\\    / ___ \  [ '/'`\ \/ /__\\( (`\]  
| \____) || \_/ |,| \__/ || \__., | |    | | // | |,| |, | | \ \/ / | \__.,  _/ /   \ \_ | \__/ || \__., `'.'.  
 \______.''.__.'_/| ;.__/  '.__.'[___]  [___]\'-;__/\__/[___] \__/   '.__.' |____| |____|| ;.__/  '.__.'[\__) ) 
                 [__|                                                                   [__|                        
*/


contract SUPERLATIVEAPES is ERC721, Ownable {
   
    using Strings for uint256;
    using Counters for Counters.Counter;

    string public baseURI;
    string public baseExtension = ".json";


    uint256 public maxTx = 5;
    uint256 public maxPreTx = 2;
    uint256 public maxSupply = 4444;
    uint256 public presaleSupply = 2400;
    uint256 public price = 0.069 ether;
   
   
    //December 16th 3AM GMT
    uint256 public presaleTime = 1639623600;
    //December 16th 11PM GMT 
    uint256 public presaleClose = 1639695600;

    //December 17th 3AM GMT
    uint256 public mainsaleTime = 1639710000;
   
    Counters.Counter private _tokenIdTracker;

    mapping (address => bool) public presaleWallets;
    mapping (address => uint256) public presaleWalletLimits;
    mapping (address => uint256) public mainsaleWalletLimits;


    modifier isMainsaleOpen
    {
         require(block.timestamp >= mainsaleTime);
         _;
    }
    modifier isPresaleOpen
    {
         require(block.timestamp >= presaleTime && block.timestamp <= presaleClose, "Presale closed!");
         _;
    }
   
    constructor(string memory _initBaseURI) ERC721("Superlative Apes", "SLAPE")
    {
        setBaseURI(_initBaseURI);
        for(uint256 i=0; i<80; i++)
        {
            _tokenIdTracker.increment();
            _safeMint(msg.sender, totalToken());
        }
        
    }
   
    function setPrice(uint256 newPrice) external onlyOwner  {
        price = newPrice;
    }
   
    function setMaxTx(uint newMax) external onlyOwner {
        maxTx = newMax;
    }

    function totalToken() public view returns (uint256) {
            return _tokenIdTracker.current();
    }

    function mainSale(uint8 mintTotal) public payable isMainsaleOpen
    {
        uint256 totalMinted = mintTotal + mainsaleWalletLimits[msg.sender];
        
        require(mintTotal >= 1 && mintTotal <= maxTx, "Mint Amount Incorrect");
        require(msg.value >= price * mintTotal, "Minting a SLAPE APE Costs 0.069 Ether Each!");
        require(totalToken() <= maxSupply, "SOLD OUT!");
        require(totalMinted <= maxTx, "You'll pass mint limit!");
       
        for(uint i=0;i<mintTotal;i++)
        {
            mainsaleWalletLimits[msg.sender]++;
            _tokenIdTracker.increment();
            require(totalToken() <= maxSupply, "SOLD OUT!");
            _safeMint(msg.sender, totalToken());
        }
    }
   
    function preSale(uint8 mintTotal) public payable isPresaleOpen
    {
        uint256 totalMinted = mintTotal + presaleWalletLimits[msg.sender];

        require(presaleWallets[msg.sender] == true, "You aren't whitelisted!");
        require(mintTotal >= 1 && mintTotal <= maxTx, "Mint Amount Incorrect");
        require(msg.value >= price * mintTotal, "Minting a SLAPE APE Costs 0.069 Ether Each!");
        require(totalToken() <= presaleSupply, "SOLD OUT!");
        require(totalMinted <= maxPreTx, "You'll pass mint limit!");
       
        for(uint i=0; i<mintTotal; i++)
        {
            presaleWalletLimits[msg.sender]++;
            _tokenIdTracker.increment();
            require(totalToken() <= presaleSupply, "SOLD OUT!");
            _safeMint(msg.sender, totalToken());
        }
       
    }
   
    function airdrop(address airdropPatricipent, uint8 tokenID) public payable onlyOwner
    {
        _transfer(address(this), airdropPatricipent, tokenID);
    }
   
    function addWhiteList(address[] memory whiteListedAddresses) public onlyOwner
    {
        for(uint256 i=0; i<whiteListedAddresses.length;i++)
        {
            presaleWallets[whiteListedAddresses[i]] = true;
        }
    }
    function isAddressWhitelisted(address whitelist) public view returns(bool)
    {
        return presaleWallets[whitelist];
    }
       
    function withdrawContractEther(address payable recipient) external onlyOwner
    {
        recipient.transfer(getBalance());
    }
   
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }
   
    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }
   
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory)
    {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension)) : "";
    }
    function getBalance() public view returns(uint)
    {
        return address(this).balance;
    }
   

}
// File: serum.sol

pragma solidity 0.8.7;

/// SPDX-License-Identifier: UNLICENSED

contract SuperlativeMagicLaboratory is ERC1155Burnable, Ownable, ReentrancyGuard {

    using Strings for uint256;
    SUPERLATIVEAPES public slapeContract;

    string public baseURI;
    string public baseExtension = ".json";


    uint256 constant public MagicVialMaxReserve = 3333;
    uint256 constant public MagicHerbsMaxReserve = 1106;
    uint256 constant public MagicPotsMaxReserve = 5;

    uint256 public vialMinted;
    uint256 public herbsMinted;
    uint256 public potsMinted;


    bool public WhitelistOpen = false;

    mapping (address => uint256) public totalPresaleMinted;

    mapping (address => bool) public whitelistClaim;

    constructor(string memory _initBaseURI, address slapesAddress) ERC1155(_initBaseURI)
    {
        setBaseURI(_initBaseURI);
        slapeContract = SUPERLATIVEAPES(slapesAddress);

        vialMinted++;
        _mint(msg.sender, 1, 1, ""); 
    }

    function randomNum(uint256 _mod, uint256 _seed, uint256 _salt) internal view returns(uint256)
    {
        return uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, _seed, _salt))) % _mod;
    }

    modifier onlySender {
        require(msg.sender == tx.origin);
        _;
    }

    modifier isClaimOpen
    {
         require(WhitelistOpen == true);
         _;
    }

    function setClaimOpen() public onlyOwner
    {
        WhitelistOpen = !WhitelistOpen;
    }

    function Whitelist() public nonReentrant onlySender isClaimOpen
    {
        bool skipHerbs = false;
        bool skipPots = false;

        require(whitelistClaim[msg.sender] == false, "You have claimed already!");
        require(slapeContract.balanceOf(msg.sender) >= 1, "You dont have anything to claim");
        require((vialMinted < MagicVialMaxReserve || herbsMinted < MagicHerbsMaxReserve || potsMinted < MagicPotsMaxReserve) , "No serums left!");

        if(potsMinted >= MagicPotsMaxReserve)
        {
            skipPots = true;
        }
        else if(herbsMinted >= MagicHerbsMaxReserve)
        {
            skipHerbs = true;
        }

        for(uint256 i=0; i<slapeContract.balanceOf(msg.sender);i++)
        {      
            bool notMintedYet = false;
            while(!notMintedYet)
            {
                uint256 selectedSerum = randomNum(12, (block.timestamp * randomNum(1000, block.timestamp, block.timestamp) * i), (block.timestamp * randomNum(1000, block.timestamp, block.timestamp) * i));
                
                if(selectedSerum == 0 && !skipPots)
                {
                    notMintedYet = true;
                    potsMinted++;
                    _mint(msg.sender, 3, 1, "");                   
                }
                else if(selectedSerum >= 1 && selectedSerum <= 3 && !skipHerbs)
                {
                    notMintedYet = true;
                    herbsMinted++;
                    _mint(msg.sender, 2, 1, "");                   
                }
                else
                {
                    notMintedYet = true;
                    vialMinted++;
                    _mint(msg.sender, 1, 1, "");                  
                }
            }
        }

        whitelistClaim[msg.sender] = true;

    }

    function _withdraw(address payable address_, uint256 amount_) internal {
        (bool success, ) = payable(address_).call{value: amount_}("");
        require(success, "Transfer failed");
    }

    function withdrawEther() external onlyOwner {
        _withdraw(payable(msg.sender), address(this).balance);
    }

    function withdrawEtherTo(address payable to_) external onlyOwner {
        _withdraw(to_, address(this).balance);
    }

    function _baseURI() internal view virtual returns (string memory) {
        return baseURI;
    }
   
    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }
   
    function uri(uint256 tokenId) public view override virtual returns (string memory)
    {
        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension)) : "";
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"address","name":"slapesAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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"},{"inputs":[],"name":"MagicHerbsMaxReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MagicPotsMaxReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MagicVialMaxReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"WhitelistOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"herbsMinted","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":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"potsMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setClaimOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"slapeContract","outputs":[{"internalType":"contract SUPERLATIVEAPES","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalPresaleMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vialMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to_","type":"address"}],"name":"withdrawEtherTo","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040526005608081905264173539b7b760d91b60a090815262000028916007919062000529565b50600b805460ff191690553480156200004057600080fd5b50604051620030d7380380620030d7833981016040819052620000639162000602565b816200006f81620000e9565b506200007b3362000102565b60016004556200008b8262000154565b600580546001600160a01b0319166001600160a01b03831617905560088054906000620000b8836200080c565b9190505550620000e13360018060405180602001604052806000815250620001c960201b60201c565b505062000918565b8051620000fe90600290602084019062000529565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6003546001600160a01b03163314620001b45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b8051620000fe90600690602084019062000529565b6001600160a01b0384166200022b5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401620001ab565b3360006200023985620002e7565b905060006200024885620002e7565b90506000868152602081815260408083206001600160a01b038b168452909152812080548792906200027c90849062000752565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4620002de836000898989896200033d565b50505050505050565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811062000324576200032462000840565b602090810291909101015292915050565b505050505050565b6200035c846001600160a01b03166200051a60201b62000e7e1760201c565b15620003355760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190620003989089908990889088908890600401620006f6565b602060405180830381600087803b158015620003b357600080fd5b505af1925050508015620003e6575060408051601f3d908101601f19168201909252620003e391810190620005cf565b60015b620004a757620003f56200086c565b806308c379a014156200043657506200040d62000889565b806200041a575062000438565b8060405162461bcd60e51b8152600401620001ab91906200073d565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401620001ab565b6001600160e01b0319811663f23a6e6160e01b14620002de5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b6064820152608401620001ab565b6001600160a01b03163b151590565b8280546200053790620007a0565b90600052602060002090601f0160209004810192826200055b5760008555620005a6565b82601f106200057657805160ff1916838001178555620005a6565b82800160010185558215620005a6579182015b82811115620005a657825182559160200191906001019062000589565b50620005b4929150620005b8565b5090565b5b80821115620005b45760008155600101620005b9565b600060208284031215620005e257600080fd5b81516001600160e01b031981168114620005fb57600080fd5b9392505050565b600080604083850312156200061657600080fd5b82516001600160401b03808211156200062e57600080fd5b818501915085601f8301126200064357600080fd5b81518181111562000658576200065862000856565b604051915062000673601f8201601f191660200183620007dd565b8082528660208285010111156200068957600080fd5b6200069c8160208401602086016200076d565b50602085015190935090506001600160a01b0381168114620006bd57600080fd5b809150509250929050565b60008151808452620006e28160208601602086016200076d565b601f01601f19169290920160200192915050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906200073290830184620006c8565b979650505050505050565b602081526000620005fb6020830184620006c8565b600082198211156200076857620007686200082a565b500190565b60005b838110156200078a57818101518382015260200162000770565b838111156200079a576000848401525b50505050565b600181811c90821680620007b557607f821691505b60208210811415620007d757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f191681016001600160401b038111828210171562000805576200080562000856565b6040525050565b60006000198214156200082357620008236200082a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115620008865760046000803e5060005160e01c5b90565b600060443d1015620008985790565b6040516003193d81016004833e81513d6001600160401b038083116024840183101715620008c857505050505090565b8285019150815181811115620008e15750505050505090565b843d8701016020828501011115620008fc5750505050505090565b6200090d60208286010187620007dd565b509095945050505050565b6127af80620009286000396000f3fe608060405234801561001057600080fd5b50600436106101d95760003560e01c8063715018a611610104578063c6325132116100a2578063eedc159a11610071578063eedc159a146103de578063f242432a146103f1578063f2fde38b14610404578063f5298aca1461041757600080fd5b8063c632513214610388578063c668286214610391578063c76bfa0714610399578063e985e9c5146103a257600080fd5b80638da5cb5b116100de5780638da5cb5b1461033b57806397d04f7b146103605780639ebf6d921461036d578063a22cb4651461037557600080fd5b8063715018a6146103225780637362377b1461032a5780637f5b42801461033257600080fd5b80632eb2c2d61161017c5780635b8e70d51161014b5780635b8e70d5146102dc5780636b20c454146102ff5780636c0360eb146103125780636c7839841461031a57600080fd5b80632eb2c2d61461028d5780634e1273f4146102a057806355f804b3146102c057806356e85783146102d357600080fd5b80630e89341c116101b85780630e89341c1461023c578063119186f91461025c57806315be7d22146102655780631f0a0eb01461026d57600080fd5b8062fdd58e146101de57806301ffc9a71461020457806307fa40e414610227575b600080fd5b6101f16101ec366004611ed8565b61042a565b6040519081526020015b60405180910390f35b61021761021236600461200c565b6104c1565b60405190151581526020016101fb565b61023a610235366004611cc2565b610513565b005b61024f61024a36600461208f565b61054a565b6040516101fb91906122d0565b6101f160085481565b6101f1600581565b6101f161027b366004611cc2565b600c6020526000908152604090205481565b61023a61029b366004611d18565b6105ab565b6102b36102ae366004611f39565b610642565b6040516101fb919061228f565b61023a6102ce366004612046565b61076c565b6101f1600a5481565b6102176102ea366004611cc2565b600d6020526000908152604090205460ff1681565b61023a61030d366004611e2f565b6107ad565b61024f6107f5565b61023a610883565b61023a6108c1565b61023a6108f7565b6101f160095481565b6003546001600160a01b03165b6040516001600160a01b0390911681526020016101fb565b600b546102179060ff1681565b61023a61092b565b61023a610383366004611ea5565b610d46565b6101f1610d0581565b61024f610d51565b6101f161045281565b6102176103b0366004611cdf565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b600554610348906001600160a01b031681565b61023a6103ff366004611dc6565b610d5e565b61023a610412366004611cc2565b610da3565b61023a610425366004611f04565b610e3b565b60006001600160a01b03831661049b5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b14806104f257506001600160e01b031982166303a24d0760e21b145b8061050d57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6003546001600160a01b0316331461053d5760405162461bcd60e51b81526004016104929061248a565b6105478147610e8d565b50565b60606000610556610f22565b9050600081511161057657604051806020016040528060008152506105a4565b8061058084610fb4565b600760405160200161059493929190612128565b6040516020818303038152906040525b9392505050565b6001600160a01b0385163314806105c757506105c785336103b0565b61062e5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610492565b61063b85858585856110ba565b5050505050565b606081518351146106a75760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610492565b6000835167ffffffffffffffff8111156106c3576106c3612692565b6040519080825280602002602001820160405280156106ec578160200160208202803683370190505b50905060005b8451811015610764576107378582815181106107105761071061267c565b602002602001015185838151811061072a5761072a61267c565b602002602001015161042a565b8282815181106107495761074961267c565b602090810291909101015261075d81612621565b90506106f2565b509392505050565b6003546001600160a01b031633146107965760405162461bcd60e51b81526004016104929061248a565b80516107a9906006906020840190611b34565b5050565b6001600160a01b0383163314806107c957506107c983336103b0565b6107e55760405162461bcd60e51b81526004016104929061236f565b6107f0838383611256565b505050565b60068054610802906125b9565b80601f016020809104026020016040519081016040528092919081815260200182805461082e906125b9565b801561087b5780601f106108505761010080835404028352916020019161087b565b820191906000526020600020905b81548152906001019060200180831161085e57829003601f168201915b505050505081565b6003546001600160a01b031633146108ad5760405162461bcd60e51b81526004016104929061248a565b600b805460ff19811660ff90911615179055565b6003546001600160a01b031633146108eb5760405162461bcd60e51b81526004016104929061248a565b6108f560006113e2565b565b6003546001600160a01b031633146109215760405162461bcd60e51b81526004016104929061248a565b6108f53347610e8d565b6002600454141561097e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610492565b600260045533321461098f57600080fd5b600b5460ff1615156001146109a357600080fd5b336000908152600d6020526040812054819060ff1615610a055760405162461bcd60e51b815260206004820152601960248201527f596f75206861766520636c61696d656420616c726561647921000000000000006044820152606401610492565b6005546040516370a0823160e01b81523360048201526001916001600160a01b0316906370a082319060240160206040518083038186803b158015610a4957600080fd5b505afa158015610a5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8191906120a8565b1015610acf5760405162461bcd60e51b815260206004820152601f60248201527f596f7520646f6e74206861766520616e797468696e6720746f20636c61696d006044820152606401610492565b610d056008541080610ae45750610452600954105b80610af157506005600a54105b610b2f5760405162461bcd60e51b815260206004820152600f60248201526e4e6f20736572756d73206c6566742160881b6044820152606401610492565b6005600a5410610b4157506001610b51565b61045260095410610b5157600191505b60005b6005546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610b9757600080fd5b505afa158015610bab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bcf91906120a8565b811015610d215760005b80610d0e576000610c2e600c84610bf36103e84242611434565b610bfd9042612557565b610c079190612557565b85610c156103e84242611434565b610c1f9042612557565b610c299190612557565b611434565b905080158015610c3c575083155b15610c7c57600a805460019350906000610c5583612621565b9190505550610c77336003600160405180602001604052806000815250611491565b610d08565b60018110158015610c8e575060038111155b8015610c98575084155b15610cd3576009805460019350906000610cb183612621565b9190505550610c77336002600160405180602001604052806000815250611491565b6008805460019350906000610ce783612621565b9190505550610d083360018060405180602001604052806000815250611491565b50610bd9565b5080610d1981612621565b915050610b54565b5050336000908152600d60205260409020805460ff1916600190811790915560045550565b6107a93383836115a5565b60078054610802906125b9565b6001600160a01b038516331480610d7a5750610d7a85336103b0565b610d965760405162461bcd60e51b81526004016104929061236f565b61063b8585858585611686565b6003546001600160a01b03163314610dcd5760405162461bcd60e51b81526004016104929061248a565b6001600160a01b038116610e325760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610492565b610547816113e2565b6001600160a01b038316331480610e575750610e5783336103b0565b610e735760405162461bcd60e51b81526004016104929061236f565b6107f08383836117b0565b6001600160a01b03163b151590565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610eda576040519150601f19603f3d011682016040523d82523d6000602084013e610edf565b606091505b50509050806107f05760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610492565b606060068054610f31906125b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5d906125b9565b8015610faa5780601f10610f7f57610100808354040283529160200191610faa565b820191906000526020600020905b815481529060010190602001808311610f8d57829003601f168201915b5050505050905090565b606081610fd85750506040805180820190915260018152600360fc1b602082015290565b8160005b81156110025780610fec81612621565b9150610ffb9050600a83612543565b9150610fdc565b60008167ffffffffffffffff81111561101d5761101d612692565b6040519080825280601f01601f191660200182016040528015611047576020820181803683370190505b5090505b84156110b25761105c600183612576565b9150611069600a8661263c565b61107490603061252b565b60f81b8183815181106110895761108961267c565b60200101906001600160f81b031916908160001a9053506110ab600a86612543565b945061104b565b949350505050565b81518351146110db5760405162461bcd60e51b8152600401610492906124bf565b6001600160a01b0384166111015760405162461bcd60e51b8152600401610492906123b8565b3360005b84518110156111e85760008582815181106111225761112261267c565b6020026020010151905060008583815181106111405761114061267c565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156111905760405162461bcd60e51b815260040161049290612440565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906111cd90849061252b565b92505081905550505050806111e190612621565b9050611105565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516112389291906122a2565b60405180910390a461124e8187878787876118b4565b505050505050565b6001600160a01b03831661127c5760405162461bcd60e51b8152600401610492906123fd565b805182511461129d5760405162461bcd60e51b8152600401610492906124bf565b604080516020810190915260009081905233905b83518110156113735760008482815181106112ce576112ce61267c565b6020026020010151905060008483815181106112ec576112ec61267c565b602090810291909101810151600084815280835260408082206001600160a01b038c16835290935291909120549091508181101561133c5760405162461bcd60e51b81526004016104929061232b565b6000928352602083815260408085206001600160a01b038b168652909152909220910390558061136b81612621565b9150506112b1565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516113c49291906122a2565b60405180910390a46040805160208101909152600090525b50505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080514260208201526bffffffffffffffffffffffff193360601b1691810191909152605481018390526074810182905260009084906094016040516020818303038152906040528051906020012060001c6110b2919061263c565b6001600160a01b0384166114f15760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610492565b3360006114fd85611a1f565b9050600061150a85611a1f565b90506000868152602081815260408083206001600160a01b038b1684529091528120805487929061153c90849061252b565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461159c83600089898989611a6a565b50505050505050565b816001600160a01b0316836001600160a01b031614156116195760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610492565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166116ac5760405162461bcd60e51b8152600401610492906123b8565b3360006116b885611a1f565b905060006116c585611a1f565b90506000868152602081815260408083206001600160a01b038c168452909152902054858110156117085760405162461bcd60e51b815260040161049290612440565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a1682528120805488929061174590849061252b565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46117a5848a8a8a8a8a611a6a565b505050505050505050565b6001600160a01b0383166117d65760405162461bcd60e51b8152600401610492906123fd565b3360006117e284611a1f565b905060006117ef84611a1f565b60408051602080820183526000918290528882528181528282206001600160a01b038b168352905220549091508481101561183c5760405162461bcd60e51b81526004016104929061232b565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a460408051602081019091526000905261159c565b6001600160a01b0384163b1561124e5760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906118f890899089908890889088906004016121ec565b602060405180830381600087803b15801561191257600080fd5b505af1925050508015611942575060408051601f3d908101601f1916820190925261193f91810190612029565b60015b6119ef5761194e6126a8565b806308c379a0141561198857506119636126c4565b8061196e575061198a565b8060405162461bcd60e51b815260040161049291906122d0565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610492565b6001600160e01b0319811663bc197c8160e01b1461159c5760405162461bcd60e51b8152600401610492906122e3565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611a5957611a5961267c565b602090810291909101015292915050565b6001600160a01b0384163b1561124e5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611aae908990899088908890889060040161224a565b602060405180830381600087803b158015611ac857600080fd5b505af1925050508015611af8575060408051601f3d908101601f19168201909252611af591810190612029565b60015b611b045761194e6126a8565b6001600160e01b0319811663f23a6e6160e01b1461159c5760405162461bcd60e51b8152600401610492906122e3565b828054611b40906125b9565b90600052602060002090601f016020900481019282611b625760008555611ba8565b82601f10611b7b57805160ff1916838001178555611ba8565b82800160010185558215611ba8579182015b82811115611ba8578251825591602001919060010190611b8d565b50611bb4929150611bb8565b5090565b5b80821115611bb45760008155600101611bb9565b600067ffffffffffffffff831115611be757611be7612692565b604051611bfe601f8501601f1916602001826125f4565b809150838152848484011115611c1357600080fd5b83836020830137600060208583010152509392505050565b600082601f830112611c3c57600080fd5b81356020611c4982612507565b604051611c5682826125f4565b8381528281019150858301600585901b87018401881015611c7657600080fd5b60005b85811015611c9557813584529284019290840190600101611c79565b5090979650505050505050565b600082601f830112611cb357600080fd5b6105a483833560208501611bcd565b600060208284031215611cd457600080fd5b81356105a48161274e565b60008060408385031215611cf257600080fd5b8235611cfd8161274e565b91506020830135611d0d8161274e565b809150509250929050565b600080600080600060a08688031215611d3057600080fd5b8535611d3b8161274e565b94506020860135611d4b8161274e565b9350604086013567ffffffffffffffff80821115611d6857600080fd5b611d7489838a01611c2b565b94506060880135915080821115611d8a57600080fd5b611d9689838a01611c2b565b93506080880135915080821115611dac57600080fd5b50611db988828901611ca2565b9150509295509295909350565b600080600080600060a08688031215611dde57600080fd5b8535611de98161274e565b94506020860135611df98161274e565b93506040860135925060608601359150608086013567ffffffffffffffff811115611e2357600080fd5b611db988828901611ca2565b600080600060608486031215611e4457600080fd5b8335611e4f8161274e565b9250602084013567ffffffffffffffff80821115611e6c57600080fd5b611e7887838801611c2b565b93506040860135915080821115611e8e57600080fd5b50611e9b86828701611c2b565b9150509250925092565b60008060408385031215611eb857600080fd5b8235611ec38161274e565b915060208301358015158114611d0d57600080fd5b60008060408385031215611eeb57600080fd5b8235611ef68161274e565b946020939093013593505050565b600080600060608486031215611f1957600080fd5b8335611f248161274e565b95602085013595506040909401359392505050565b60008060408385031215611f4c57600080fd5b823567ffffffffffffffff80821115611f6457600080fd5b818501915085601f830112611f7857600080fd5b81356020611f8582612507565b604051611f9282826125f4565b8381528281019150858301600585901b870184018b1015611fb257600080fd5b600096505b84871015611fde578035611fca8161274e565b835260019690960195918301918301611fb7565b5096505086013592505080821115611ff557600080fd5b5061200285828601611c2b565b9150509250929050565b60006020828403121561201e57600080fd5b81356105a481612763565b60006020828403121561203b57600080fd5b81516105a481612763565b60006020828403121561205857600080fd5b813567ffffffffffffffff81111561206f57600080fd5b8201601f8101841361208057600080fd5b6110b284823560208401611bcd565b6000602082840312156120a157600080fd5b5035919050565b6000602082840312156120ba57600080fd5b5051919050565b600081518084526020808501945080840160005b838110156120f1578151875295820195908201906001016120d5565b509495945050505050565b6000815180845261211481602086016020860161258d565b601f01601f19169290920160200192915050565b60008451602061213b8285838a0161258d565b85519184019161214e8184848a0161258d565b8554920191600090600181811c908083168061216b57607f831692505b85831081141561218957634e487b7160e01b85526022600452602485fd5b80801561219d57600181146121ae576121db565b60ff198516885283880195506121db565b60008b81526020902060005b858110156121d35781548a8201529084019088016121ba565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0386811682528516602082015260a060408201819052600090612218908301866120c1565b828103606084015261222a81866120c1565b9050828103608084015261223e81856120fc565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612284908301846120fc565b979650505050505050565b6020815260006105a460208301846120c1565b6040815260006122b560408301856120c1565b82810360208401526122c781856120c1565b95945050505050565b6020815260006105a460208301846120fc565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b600067ffffffffffffffff82111561252157612521612692565b5060051b60200190565b6000821982111561253e5761253e612650565b500190565b60008261255257612552612666565b500490565b600081600019048311821515161561257157612571612650565b500290565b60008282101561258857612588612650565b500390565b60005b838110156125a8578181015183820152602001612590565b838111156113dc5750506000910152565b600181811c908216806125cd57607f821691505b602082108114156125ee57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff8111828210171561261a5761261a612692565b6040525050565b600060001982141561263557612635612650565b5060010190565b60008261264b5761264b612666565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d11156126c15760046000803e5060005160e01c5b90565b600060443d10156126d25790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561270257505050505090565b828501915081518181111561271a5750505050505090565b843d87010160208285010111156127345750505050505090565b612743602082860101876125f4565b509095945050505050565b6001600160a01b038116811461054757600080fd5b6001600160e01b03198116811461054757600080fdfea2646970667358221220c02e94dc2e363e97a1907cd9a112892a76a62aad6c05f57614f4389c7875a7c964736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000001e87ee9249cc647af9edeecb73d6b76af14d8c27000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d514e766b36326a4d6837744c69394d46525068394d4b3232614c667554334d4467566f4b39534a79434d6a482f000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101d95760003560e01c8063715018a611610104578063c6325132116100a2578063eedc159a11610071578063eedc159a146103de578063f242432a146103f1578063f2fde38b14610404578063f5298aca1461041757600080fd5b8063c632513214610388578063c668286214610391578063c76bfa0714610399578063e985e9c5146103a257600080fd5b80638da5cb5b116100de5780638da5cb5b1461033b57806397d04f7b146103605780639ebf6d921461036d578063a22cb4651461037557600080fd5b8063715018a6146103225780637362377b1461032a5780637f5b42801461033257600080fd5b80632eb2c2d61161017c5780635b8e70d51161014b5780635b8e70d5146102dc5780636b20c454146102ff5780636c0360eb146103125780636c7839841461031a57600080fd5b80632eb2c2d61461028d5780634e1273f4146102a057806355f804b3146102c057806356e85783146102d357600080fd5b80630e89341c116101b85780630e89341c1461023c578063119186f91461025c57806315be7d22146102655780631f0a0eb01461026d57600080fd5b8062fdd58e146101de57806301ffc9a71461020457806307fa40e414610227575b600080fd5b6101f16101ec366004611ed8565b61042a565b6040519081526020015b60405180910390f35b61021761021236600461200c565b6104c1565b60405190151581526020016101fb565b61023a610235366004611cc2565b610513565b005b61024f61024a36600461208f565b61054a565b6040516101fb91906122d0565b6101f160085481565b6101f1600581565b6101f161027b366004611cc2565b600c6020526000908152604090205481565b61023a61029b366004611d18565b6105ab565b6102b36102ae366004611f39565b610642565b6040516101fb919061228f565b61023a6102ce366004612046565b61076c565b6101f1600a5481565b6102176102ea366004611cc2565b600d6020526000908152604090205460ff1681565b61023a61030d366004611e2f565b6107ad565b61024f6107f5565b61023a610883565b61023a6108c1565b61023a6108f7565b6101f160095481565b6003546001600160a01b03165b6040516001600160a01b0390911681526020016101fb565b600b546102179060ff1681565b61023a61092b565b61023a610383366004611ea5565b610d46565b6101f1610d0581565b61024f610d51565b6101f161045281565b6102176103b0366004611cdf565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b600554610348906001600160a01b031681565b61023a6103ff366004611dc6565b610d5e565b61023a610412366004611cc2565b610da3565b61023a610425366004611f04565b610e3b565b60006001600160a01b03831661049b5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b14806104f257506001600160e01b031982166303a24d0760e21b145b8061050d57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6003546001600160a01b0316331461053d5760405162461bcd60e51b81526004016104929061248a565b6105478147610e8d565b50565b60606000610556610f22565b9050600081511161057657604051806020016040528060008152506105a4565b8061058084610fb4565b600760405160200161059493929190612128565b6040516020818303038152906040525b9392505050565b6001600160a01b0385163314806105c757506105c785336103b0565b61062e5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610492565b61063b85858585856110ba565b5050505050565b606081518351146106a75760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610492565b6000835167ffffffffffffffff8111156106c3576106c3612692565b6040519080825280602002602001820160405280156106ec578160200160208202803683370190505b50905060005b8451811015610764576107378582815181106107105761071061267c565b602002602001015185838151811061072a5761072a61267c565b602002602001015161042a565b8282815181106107495761074961267c565b602090810291909101015261075d81612621565b90506106f2565b509392505050565b6003546001600160a01b031633146107965760405162461bcd60e51b81526004016104929061248a565b80516107a9906006906020840190611b34565b5050565b6001600160a01b0383163314806107c957506107c983336103b0565b6107e55760405162461bcd60e51b81526004016104929061236f565b6107f0838383611256565b505050565b60068054610802906125b9565b80601f016020809104026020016040519081016040528092919081815260200182805461082e906125b9565b801561087b5780601f106108505761010080835404028352916020019161087b565b820191906000526020600020905b81548152906001019060200180831161085e57829003601f168201915b505050505081565b6003546001600160a01b031633146108ad5760405162461bcd60e51b81526004016104929061248a565b600b805460ff19811660ff90911615179055565b6003546001600160a01b031633146108eb5760405162461bcd60e51b81526004016104929061248a565b6108f560006113e2565b565b6003546001600160a01b031633146109215760405162461bcd60e51b81526004016104929061248a565b6108f53347610e8d565b6002600454141561097e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610492565b600260045533321461098f57600080fd5b600b5460ff1615156001146109a357600080fd5b336000908152600d6020526040812054819060ff1615610a055760405162461bcd60e51b815260206004820152601960248201527f596f75206861766520636c61696d656420616c726561647921000000000000006044820152606401610492565b6005546040516370a0823160e01b81523360048201526001916001600160a01b0316906370a082319060240160206040518083038186803b158015610a4957600080fd5b505afa158015610a5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8191906120a8565b1015610acf5760405162461bcd60e51b815260206004820152601f60248201527f596f7520646f6e74206861766520616e797468696e6720746f20636c61696d006044820152606401610492565b610d056008541080610ae45750610452600954105b80610af157506005600a54105b610b2f5760405162461bcd60e51b815260206004820152600f60248201526e4e6f20736572756d73206c6566742160881b6044820152606401610492565b6005600a5410610b4157506001610b51565b61045260095410610b5157600191505b60005b6005546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610b9757600080fd5b505afa158015610bab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bcf91906120a8565b811015610d215760005b80610d0e576000610c2e600c84610bf36103e84242611434565b610bfd9042612557565b610c079190612557565b85610c156103e84242611434565b610c1f9042612557565b610c299190612557565b611434565b905080158015610c3c575083155b15610c7c57600a805460019350906000610c5583612621565b9190505550610c77336003600160405180602001604052806000815250611491565b610d08565b60018110158015610c8e575060038111155b8015610c98575084155b15610cd3576009805460019350906000610cb183612621565b9190505550610c77336002600160405180602001604052806000815250611491565b6008805460019350906000610ce783612621565b9190505550610d083360018060405180602001604052806000815250611491565b50610bd9565b5080610d1981612621565b915050610b54565b5050336000908152600d60205260409020805460ff1916600190811790915560045550565b6107a93383836115a5565b60078054610802906125b9565b6001600160a01b038516331480610d7a5750610d7a85336103b0565b610d965760405162461bcd60e51b81526004016104929061236f565b61063b8585858585611686565b6003546001600160a01b03163314610dcd5760405162461bcd60e51b81526004016104929061248a565b6001600160a01b038116610e325760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610492565b610547816113e2565b6001600160a01b038316331480610e575750610e5783336103b0565b610e735760405162461bcd60e51b81526004016104929061236f565b6107f08383836117b0565b6001600160a01b03163b151590565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610eda576040519150601f19603f3d011682016040523d82523d6000602084013e610edf565b606091505b50509050806107f05760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610492565b606060068054610f31906125b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5d906125b9565b8015610faa5780601f10610f7f57610100808354040283529160200191610faa565b820191906000526020600020905b815481529060010190602001808311610f8d57829003601f168201915b5050505050905090565b606081610fd85750506040805180820190915260018152600360fc1b602082015290565b8160005b81156110025780610fec81612621565b9150610ffb9050600a83612543565b9150610fdc565b60008167ffffffffffffffff81111561101d5761101d612692565b6040519080825280601f01601f191660200182016040528015611047576020820181803683370190505b5090505b84156110b25761105c600183612576565b9150611069600a8661263c565b61107490603061252b565b60f81b8183815181106110895761108961267c565b60200101906001600160f81b031916908160001a9053506110ab600a86612543565b945061104b565b949350505050565b81518351146110db5760405162461bcd60e51b8152600401610492906124bf565b6001600160a01b0384166111015760405162461bcd60e51b8152600401610492906123b8565b3360005b84518110156111e85760008582815181106111225761112261267c565b6020026020010151905060008583815181106111405761114061267c565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156111905760405162461bcd60e51b815260040161049290612440565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906111cd90849061252b565b92505081905550505050806111e190612621565b9050611105565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516112389291906122a2565b60405180910390a461124e8187878787876118b4565b505050505050565b6001600160a01b03831661127c5760405162461bcd60e51b8152600401610492906123fd565b805182511461129d5760405162461bcd60e51b8152600401610492906124bf565b604080516020810190915260009081905233905b83518110156113735760008482815181106112ce576112ce61267c565b6020026020010151905060008483815181106112ec576112ec61267c565b602090810291909101810151600084815280835260408082206001600160a01b038c16835290935291909120549091508181101561133c5760405162461bcd60e51b81526004016104929061232b565b6000928352602083815260408085206001600160a01b038b168652909152909220910390558061136b81612621565b9150506112b1565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516113c49291906122a2565b60405180910390a46040805160208101909152600090525b50505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080514260208201526bffffffffffffffffffffffff193360601b1691810191909152605481018390526074810182905260009084906094016040516020818303038152906040528051906020012060001c6110b2919061263c565b6001600160a01b0384166114f15760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610492565b3360006114fd85611a1f565b9050600061150a85611a1f565b90506000868152602081815260408083206001600160a01b038b1684529091528120805487929061153c90849061252b565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461159c83600089898989611a6a565b50505050505050565b816001600160a01b0316836001600160a01b031614156116195760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610492565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166116ac5760405162461bcd60e51b8152600401610492906123b8565b3360006116b885611a1f565b905060006116c585611a1f565b90506000868152602081815260408083206001600160a01b038c168452909152902054858110156117085760405162461bcd60e51b815260040161049290612440565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a1682528120805488929061174590849061252b565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46117a5848a8a8a8a8a611a6a565b505050505050505050565b6001600160a01b0383166117d65760405162461bcd60e51b8152600401610492906123fd565b3360006117e284611a1f565b905060006117ef84611a1f565b60408051602080820183526000918290528882528181528282206001600160a01b038b168352905220549091508481101561183c5760405162461bcd60e51b81526004016104929061232b565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a460408051602081019091526000905261159c565b6001600160a01b0384163b1561124e5760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906118f890899089908890889088906004016121ec565b602060405180830381600087803b15801561191257600080fd5b505af1925050508015611942575060408051601f3d908101601f1916820190925261193f91810190612029565b60015b6119ef5761194e6126a8565b806308c379a0141561198857506119636126c4565b8061196e575061198a565b8060405162461bcd60e51b815260040161049291906122d0565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610492565b6001600160e01b0319811663bc197c8160e01b1461159c5760405162461bcd60e51b8152600401610492906122e3565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611a5957611a5961267c565b602090810291909101015292915050565b6001600160a01b0384163b1561124e5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611aae908990899088908890889060040161224a565b602060405180830381600087803b158015611ac857600080fd5b505af1925050508015611af8575060408051601f3d908101601f19168201909252611af591810190612029565b60015b611b045761194e6126a8565b6001600160e01b0319811663f23a6e6160e01b1461159c5760405162461bcd60e51b8152600401610492906122e3565b828054611b40906125b9565b90600052602060002090601f016020900481019282611b625760008555611ba8565b82601f10611b7b57805160ff1916838001178555611ba8565b82800160010185558215611ba8579182015b82811115611ba8578251825591602001919060010190611b8d565b50611bb4929150611bb8565b5090565b5b80821115611bb45760008155600101611bb9565b600067ffffffffffffffff831115611be757611be7612692565b604051611bfe601f8501601f1916602001826125f4565b809150838152848484011115611c1357600080fd5b83836020830137600060208583010152509392505050565b600082601f830112611c3c57600080fd5b81356020611c4982612507565b604051611c5682826125f4565b8381528281019150858301600585901b87018401881015611c7657600080fd5b60005b85811015611c9557813584529284019290840190600101611c79565b5090979650505050505050565b600082601f830112611cb357600080fd5b6105a483833560208501611bcd565b600060208284031215611cd457600080fd5b81356105a48161274e565b60008060408385031215611cf257600080fd5b8235611cfd8161274e565b91506020830135611d0d8161274e565b809150509250929050565b600080600080600060a08688031215611d3057600080fd5b8535611d3b8161274e565b94506020860135611d4b8161274e565b9350604086013567ffffffffffffffff80821115611d6857600080fd5b611d7489838a01611c2b565b94506060880135915080821115611d8a57600080fd5b611d9689838a01611c2b565b93506080880135915080821115611dac57600080fd5b50611db988828901611ca2565b9150509295509295909350565b600080600080600060a08688031215611dde57600080fd5b8535611de98161274e565b94506020860135611df98161274e565b93506040860135925060608601359150608086013567ffffffffffffffff811115611e2357600080fd5b611db988828901611ca2565b600080600060608486031215611e4457600080fd5b8335611e4f8161274e565b9250602084013567ffffffffffffffff80821115611e6c57600080fd5b611e7887838801611c2b565b93506040860135915080821115611e8e57600080fd5b50611e9b86828701611c2b565b9150509250925092565b60008060408385031215611eb857600080fd5b8235611ec38161274e565b915060208301358015158114611d0d57600080fd5b60008060408385031215611eeb57600080fd5b8235611ef68161274e565b946020939093013593505050565b600080600060608486031215611f1957600080fd5b8335611f248161274e565b95602085013595506040909401359392505050565b60008060408385031215611f4c57600080fd5b823567ffffffffffffffff80821115611f6457600080fd5b818501915085601f830112611f7857600080fd5b81356020611f8582612507565b604051611f9282826125f4565b8381528281019150858301600585901b870184018b1015611fb257600080fd5b600096505b84871015611fde578035611fca8161274e565b835260019690960195918301918301611fb7565b5096505086013592505080821115611ff557600080fd5b5061200285828601611c2b565b9150509250929050565b60006020828403121561201e57600080fd5b81356105a481612763565b60006020828403121561203b57600080fd5b81516105a481612763565b60006020828403121561205857600080fd5b813567ffffffffffffffff81111561206f57600080fd5b8201601f8101841361208057600080fd5b6110b284823560208401611bcd565b6000602082840312156120a157600080fd5b5035919050565b6000602082840312156120ba57600080fd5b5051919050565b600081518084526020808501945080840160005b838110156120f1578151875295820195908201906001016120d5565b509495945050505050565b6000815180845261211481602086016020860161258d565b601f01601f19169290920160200192915050565b60008451602061213b8285838a0161258d565b85519184019161214e8184848a0161258d565b8554920191600090600181811c908083168061216b57607f831692505b85831081141561218957634e487b7160e01b85526022600452602485fd5b80801561219d57600181146121ae576121db565b60ff198516885283880195506121db565b60008b81526020902060005b858110156121d35781548a8201529084019088016121ba565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0386811682528516602082015260a060408201819052600090612218908301866120c1565b828103606084015261222a81866120c1565b9050828103608084015261223e81856120fc565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612284908301846120fc565b979650505050505050565b6020815260006105a460208301846120c1565b6040815260006122b560408301856120c1565b82810360208401526122c781856120c1565b95945050505050565b6020815260006105a460208301846120fc565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b600067ffffffffffffffff82111561252157612521612692565b5060051b60200190565b6000821982111561253e5761253e612650565b500190565b60008261255257612552612666565b500490565b600081600019048311821515161561257157612571612650565b500290565b60008282101561258857612588612650565b500390565b60005b838110156125a8578181015183820152602001612590565b838111156113dc5750506000910152565b600181811c908216806125cd57607f821691505b602082108114156125ee57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff8111828210171561261a5761261a612692565b6040525050565b600060001982141561263557612635612650565b5060010190565b60008261264b5761264b612666565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d11156126c15760046000803e5060005160e01c5b90565b600060443d10156126d25790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561270257505050505090565b828501915081518181111561271a5750505050505090565b843d87010160208285010111156127345750505050505090565b612743602082860101876125f4565b509095945050505050565b6001600160a01b038116811461054757600080fd5b6001600160e01b03198116811461054757600080fdfea2646970667358221220c02e94dc2e363e97a1907cd9a112892a76a62aad6c05f57614f4389c7875a7c964736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000400000000000000000000000001e87ee9249cc647af9edeecb73d6b76af14d8c27000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d514e766b36326a4d6837744c69394d46525068394d4b3232614c667554334d4467566f4b39534a79434d6a482f000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): https://gateway.pinata.cloud/ipfs/QmQNvk62jMh7tLi9MFRPh9MK22aLfuT3MDgVoK9SJyCMjH/
Arg [1] : slapesAddress (address): 0x1e87eE9249Cc647Af9EDEecB73D6b76AF14d8C27

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000001e87ee9249cc647af9edeecb73d6b76af14d8c27
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000051
Arg [3] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [4] : 732f516d514e766b36326a4d6837744c69394d46525068394d4b3232614c6675
Arg [5] : 54334d4467566f4b39534a79434d6a482f000000000000000000000000000000


Deployed Bytecode Sourcemap

74097:4285:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31453:231;;;;;;:::i;:::-;;:::i;:::-;;;22528:25:1;;;22516:2;22501:18;31453:231:0;;;;;;;;30476:310;;;;;;:::i;:::-;;:::i;:::-;;;14041:14:1;;14034:22;14016:41;;14004:2;13989:18;30476:310:0;13876:187:1;77744:121:0;;;;;;:::i;:::-;;:::i;:::-;;78098:281;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;74511:25::-;;;;;;74455:47;;74501:1;74455:47;;74654:54;;;;;;:::i;:::-;;;;;;;;;;;;;;33392:442;;;;;;:::i;:::-;;:::i;31850:524::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;77983:104::-;;;;;;:::i;:::-;;:::i;74576:25::-;;;;;;74717:47;;;;;;:::i;:::-;;;;;;;;;;;;;;;;47646:353;;;;;;:::i;:::-;;:::i;74264:21::-;;;:::i;75442:95::-;;;:::i;9219:103::-;;;:::i;77620:116::-;;;:::i;74543:26::-;;;;;;8568:87;8641:6;;-1:-1:-1;;;;;8641:6:0;8568:87;;;-1:-1:-1;;;;;11700:32:1;;;11682:51;;11670:2;11655:18;8568:87:0;11536:203:1;74612:33:0;;;;;;;;;75545:1862;;;:::i;32447:155::-;;;;;;:::i;:::-;;:::i;74340:50::-;;74386:4;74340:50;;74292:37;;;:::i;74397:51::-;;74444:4;74397:51;;32674:168;;;;;;:::i;:::-;-1:-1:-1;;;;;32797:27:0;;;32773:4;32797:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;32674:168;74219:36;;;;;-1:-1:-1;;;;;74219:36:0;;;32914:401;;;;;;:::i;:::-;;:::i;9477:201::-;;;;;;:::i;:::-;;:::i;47317:321::-;;;;;;:::i;:::-;;:::i;31453:231::-;31539:7;-1:-1:-1;;;;;31567:21:0;;31559:77;;;;-1:-1:-1;;;31559:77:0;;15556:2:1;31559:77:0;;;15538:21:1;15595:2;15575:18;;;15568:30;15634:34;15614:18;;;15607:62;-1:-1:-1;;;15685:18:1;;;15678:41;15736:19;;31559:77:0;;;;;;;;;-1:-1:-1;31654:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;31654:22:0;;;;;;;;;;;;31453:231::o;30476:310::-;30578:4;-1:-1:-1;;;;;;30615:41:0;;-1:-1:-1;;;30615:41:0;;:110;;-1:-1:-1;;;;;;;30673:52:0;;-1:-1:-1;;;30673:52:0;30615:110;:163;;;-1:-1:-1;;;;;;;;;;29291:40:0;;;30742:36;30595:183;30476:310;-1:-1:-1;;30476:310:0:o;77744:121::-;8641:6;;-1:-1:-1;;;;;8641:6:0;7319:10;8788:23;8780:68;;;;-1:-1:-1;;;8780:68:0;;;;;;;:::i;:::-;77820:37:::1;77830:3;77835:21;77820:9;:37::i;:::-;77744:121:::0;:::o;78098:281::-;78166:13;78197:28;78228:10;:8;:10::i;:::-;78197:41;;78287:1;78262:14;78256:28;:32;:115;;;;;;;;;;;;;;;;;78315:14;78331:18;:7;:16;:18::i;:::-;78351:13;78298:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;78256:115;78249:122;78098:281;-1:-1:-1;;;78098:281:0:o;33392:442::-;-1:-1:-1;;;;;33625:20:0;;7319:10;33625:20;;:60;;-1:-1:-1;33649:36:0;33666:4;7319:10;32674:168;:::i;33649:36::-;33603:160;;;;-1:-1:-1;;;33603:160:0;;17940:2:1;33603:160:0;;;17922:21:1;17979:2;17959:18;;;17952:30;18018:34;17998:18;;;17991:62;-1:-1:-1;;;18069:18:1;;;18062:48;18127:19;;33603:160:0;17738:414:1;33603:160:0;33774:52;33797:4;33803:2;33807:3;33812:7;33821:4;33774:22;:52::i;:::-;33392:442;;;;;:::o;31850:524::-;32006:16;32067:3;:10;32048:8;:15;:29;32040:83;;;;-1:-1:-1;;;32040:83:0;;21003:2:1;32040:83:0;;;20985:21:1;21042:2;21022:18;;;21015:30;21081:34;21061:18;;;21054:62;-1:-1:-1;;;21132:18:1;;;21125:39;21181:19;;32040:83:0;20801:405:1;32040:83:0;32136:30;32183:8;:15;32169:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32169:30:0;;32136:63;;32217:9;32212:122;32236:8;:15;32232:1;:19;32212:122;;;32292:30;32302:8;32311:1;32302:11;;;;;;;;:::i;:::-;;;;;;;32315:3;32319:1;32315:6;;;;;;;;:::i;:::-;;;;;;;32292:9;:30::i;:::-;32273:13;32287:1;32273:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;32253:3;;;:::i;:::-;;;32212:122;;;-1:-1:-1;32353:13:0;31850:524;-1:-1:-1;;;31850:524:0:o;77983:104::-;8641:6;;-1:-1:-1;;;;;8641:6:0;7319:10;8788:23;8780:68;;;;-1:-1:-1;;;8780:68:0;;;;;;;:::i;:::-;78058:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;77983:104:::0;:::o;47646:353::-;-1:-1:-1;;;;;47811:23:0;;7319:10;47811:23;;:66;;-1:-1:-1;47838:39:0;47855:7;7319:10;32674:168;:::i;47838:39::-;47789:157;;;;-1:-1:-1;;;47789:157:0;;;;;;;:::i;:::-;47959:32;47970:7;47979:3;47984:6;47959:10;:32::i;:::-;47646:353;;;:::o;74264:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;75442:95::-;8641:6;;-1:-1:-1;;;;;8641:6:0;7319:10;8788:23;8780:68;;;;-1:-1:-1;;;8780:68:0;;;;;;;:::i;:::-;75516:13:::1;::::0;;-1:-1:-1;;75499:30:0;::::1;75516:13;::::0;;::::1;75515:14;75499:30;::::0;;75442:95::o;9219:103::-;8641:6;;-1:-1:-1;;;;;8641:6:0;7319:10;8788:23;8780:68;;;;-1:-1:-1;;;8780:68:0;;;;;;;:::i;:::-;9284:30:::1;9311:1;9284:18;:30::i;:::-;9219:103::o:0;77620:116::-;8641:6;;-1:-1:-1;;;;;8641:6:0;7319:10;8788:23;8780:68;;;;-1:-1:-1;;;8780:68:0;;;;;;;:::i;:::-;77675:53:::1;77693:10;77706:21;77675:9;:53::i;75545:1862::-:0;3383:1;3981:7;;:19;;3973:63;;;;-1:-1:-1;;;3973:63:0;;22224:2:1;3973:63:0;;;22206:21:1;22263:2;22243:18;;;22236:30;22302:33;22282:18;;;22275:61;22353:18;;3973:63:0;22022:355:1;3973:63:0;3383:1;4114:7;:18;75293:10:::1;75307:9;75293:23;75285:32;;;::::0;::::1;;75391:13:::2;::::0;::::2;;:21;;:13:::0;:21:::2;75383:30;;;::::0;::::2;;75715:10:::3;75625:14;75700:26:::0;;;:14:::3;:26;::::0;;;;;75625:14;;75700:26:::3;;:35;75692:73;;;::::0;-1:-1:-1;;;75692:73:0;;19879:2:1;75692:73:0::3;::::0;::::3;19861:21:1::0;19918:2;19898:18;;;19891:30;19957:27;19937:18;;;19930:55;20002:18;;75692:73:0::3;19677:349:1::0;75692:73:0::3;75784:13;::::0;:35:::3;::::0;-1:-1:-1;;;75784:35:0;;75808:10:::3;75784:35;::::0;::::3;11682:51:1::0;75823:1:0::3;::::0;-1:-1:-1;;;;;75784:13:0::3;::::0;:23:::3;::::0;11655:18:1;;75784:35:0::3;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;;75776:84;;;::::0;-1:-1:-1;;;75776:84:0;;20233:2:1;75776:84:0::3;::::0;::::3;20215:21:1::0;20272:2;20252:18;;;20245:30;20311:33;20291:18;;;20284:61;20362:18;;75776:84:0::3;20031:355:1::0;75776:84:0::3;74386:4;75880:10;;:32;:70;;;;74444:4;75916:11;;:34;75880:70;:106;;;;74501:1;75954:10;;:32;75880:106;75871:137;;;::::0;-1:-1:-1;;;75871:137:0;;19174:2:1;75871:137:0::3;::::0;::::3;19156:21:1::0;19213:2;19193:18;;;19186:30;-1:-1:-1;;;19232:18:1;;;19225:45;19287:18;;75871:137:0::3;18972:339:1::0;75871:137:0::3;74501:1;76024:10;;:33;76021:196;;-1:-1:-1::0;76094:4:0::3;76021:196;;;74444:4;76128:11;;:35;76125:92;;76201:4;76189:16;;76125:92;76233:9;76229:1123;76248:13;::::0;:35:::3;::::0;-1:-1:-1;;;76248:35:0;;76272:10:::3;76248:35;::::0;::::3;11682:51:1::0;-1:-1:-1;;;;;76248:13:0;;::::3;::::0;:23:::3;::::0;11655:18:1;;76248:35:0::3;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76246:1;:37;76229:1123;;;76319:17;76359:982;76366:12;76359:982;;76412:21;76436:163;76446:2;76521:1;76469:49;76479:4;76485:15;76502;76469:9;:49::i;:::-;76451:67;::::0;:15:::3;:67;:::i;:::-;:71;;;;:::i;:::-;76596:1;76544:49;76554:4;76560:15;76577;76544:9;:49::i;:::-;76526:67;::::0;:15:::3;:67;:::i;:::-;:71;;;;:::i;:::-;76436:9;:163::i;:::-;76412:187:::0;-1:-1:-1;76639:18:0;;:31;::::3;;;;76662:8;76661:9;76639:31;76636:690;;;76754:10;:12:::0;;76727:4:::3;::::0;-1:-1:-1;76754:12:0;:10:::3;:12;::::0;::::3;:::i;:::-;;;;;;76789:27;76795:10;76807:1;76810;76789:27;;;;;;;;;;;::::0;:5:::3;:27::i;:::-;76636:690;;;76898:1;76881:13;:18;;:40;;;;;76920:1;76903:13;:18;;76881:40;:54;;;;;76926:9;76925:10;76881:54;76878:448;;;77019:11;:13:::0;;76992:4:::3;::::0;-1:-1:-1;77019:13:0;:11:::3;:13;::::0;::::3;:::i;:::-;;;;;;77055:27;77061:10;77073:1;77076;77055:27;;;;;;;;;;;::::0;:5:::3;:27::i;76878:448::-;77226:10;:12:::0;;77199:4:::3;::::0;-1:-1:-1;77226:12:0;:10:::3;:12;::::0;::::3;:::i;:::-;;;;;;77261:27;77267:10;77279:1;77282::::0;77261:27:::3;;;;;;;;;;;::::0;:5:::3;:27::i;:::-;76393:948;76359:982;;;-1:-1:-1::0;76284:3:0;::::3;::::0;::::3;:::i;:::-;;;;76229:1123;;;-1:-1:-1::0;;77379:10:0::3;77364:26;::::0;;;:14:::3;:26;::::0;;;;:33;;-1:-1:-1;;77364:33:0::3;77393:4;77364:33:::0;;::::3;::::0;;;4293:7;:22;-1:-1:-1;75545:1862:0:o;32447:155::-;32542:52;7319:10;32575:8;32585;32542:18;:52::i;74292:37::-;;;;;;;:::i;32914:401::-;-1:-1:-1;;;;;33122:20:0;;7319:10;33122:20;;:60;;-1:-1:-1;33146:36:0;33163:4;7319:10;32674:168;:::i;33146:36::-;33100:151;;;;-1:-1:-1;;;33100:151:0;;;;;;;:::i;:::-;33262:45;33280:4;33286:2;33290;33294:6;33302:4;33262:17;:45::i;9477:201::-;8641:6;;-1:-1:-1;;;;;8641:6:0;7319:10;8788:23;8780:68;;;;-1:-1:-1;;;8780:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9566:22:0;::::1;9558:73;;;::::0;-1:-1:-1;;;9558:73:0;;15968:2:1;9558:73:0::1;::::0;::::1;15950:21:1::0;16007:2;15987:18;;;15980:30;16046:34;16026:18;;;16019:62;-1:-1:-1;;;16097:18:1;;;16090:36;16143:19;;9558:73:0::1;15766:402:1::0;9558:73:0::1;9642:28;9661:8;9642:18;:28::i;47317:321::-:0;-1:-1:-1;;;;;47457:23:0;;7319:10;47457:23;;:66;;-1:-1:-1;47484:39:0;47501:7;7319:10;32674:168;:::i;47484:39::-;47435:157;;;;-1:-1:-1;;;47435:157:0;;;;;;;:::i;:::-;47605:25;47611:7;47620:2;47624:5;47605;:25::i;11322:326::-;-1:-1:-1;;;;;11617:19:0;;:23;;;11322:326::o;77415:197::-;77498:12;77524:8;-1:-1:-1;;;;;77516:22:0;77546:7;77516:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77497:61;;;77577:7;77569:35;;;;-1:-1:-1;;;77569:35:0;;16375:2:1;77569:35:0;;;16357:21:1;16414:2;16394:18;;;16387:30;-1:-1:-1;;;16433:18:1;;;16426:45;16488:18;;77569:35:0;16173:339:1;77873:99:0;77924:13;77957:7;77950:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77873:99;:::o;4748:723::-;4804:13;5025:10;5021:53;;-1:-1:-1;;5052:10:0;;;;;;;;;;;;-1:-1:-1;;;5052:10:0;;;;;4748:723::o;5021:53::-;5099:5;5084:12;5140:78;5147:9;;5140:78;;5173:8;;;;:::i;:::-;;-1:-1:-1;5196:10:0;;-1:-1:-1;5204:2:0;5196:10;;:::i;:::-;;;5140:78;;;5228:19;5260:6;5250:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5250:17:0;;5228:39;;5278:154;5285:10;;5278:154;;5312:11;5322:1;5312:11;;:::i;:::-;;-1:-1:-1;5381:10:0;5389:2;5381:5;:10;:::i;:::-;5368:24;;:2;:24;:::i;:::-;5355:39;;5338:6;5345;5338:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;5338:56:0;;;;;;;;-1:-1:-1;5409:11:0;5418:2;5409:11;;:::i;:::-;;;5278:154;;;5456:6;4748:723;-1:-1:-1;;;;4748:723:0:o;35630:1146::-;35857:7;:14;35843:3;:10;:28;35835:81;;;;-1:-1:-1;;;35835:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35935:16:0;;35927:66;;;;-1:-1:-1;;;35927:66:0;;;;;;;:::i;:::-;7319:10;36006:16;36123:421;36147:3;:10;36143:1;:14;36123:421;;;36179:10;36192:3;36196:1;36192:6;;;;;;;;:::i;:::-;;;;;;;36179:19;;36213:14;36230:7;36238:1;36230:10;;;;;;;;:::i;:::-;;;;;;;;;;;;36257:19;36279:13;;;;;;;;;;-1:-1:-1;;;;;36279:19:0;;;;;;;;;;;;36230:10;;-1:-1:-1;36321:21:0;;;;36313:76;;;;-1:-1:-1;;;36313:76:0;;;;;;;:::i;:::-;36433:9;:13;;;;;;;;;;;-1:-1:-1;;;;;36433:19:0;;;;;;;;;;36455:20;;;36433:42;;36505:17;;;;;;;:27;;36455:20;;36433:9;36505:27;;36455:20;;36505:27;:::i;:::-;;;;;;;;36164:380;;;36159:3;;;;:::i;:::-;;;36123:421;;;;36591:2;-1:-1:-1;;;;;36561:47:0;36585:4;-1:-1:-1;;;;;36561:47:0;36575:8;-1:-1:-1;;;;;36561:47:0;;36595:3;36600:7;36561:47;;;;;;;:::i;:::-;;;;;;;;36621:75;36657:8;36667:4;36673:2;36677:3;36682:7;36691:4;36621:35;:75::i;:::-;35824:952;35630:1146;;;;;:::o;41253:969::-;-1:-1:-1;;;;;41405:18:0;;41397:66;;;;-1:-1:-1;;;41397:66:0;;;;;;;:::i;:::-;41496:7;:14;41482:3;:10;:28;41474:81;;;;-1:-1:-1;;;41474:81:0;;;;;;;:::i;:::-;41612:66;;;;;;;;;41568:16;41612:66;;;;7319:10;;41691:373;41715:3;:10;41711:1;:14;41691:373;;;41747:10;41760:3;41764:1;41760:6;;;;;;;;:::i;:::-;;;;;;;41747:19;;41781:14;41798:7;41806:1;41798:10;;;;;;;;:::i;:::-;;;;;;;;;;;;41825:19;41847:13;;;;;;;;;;-1:-1:-1;;;;;41847:19:0;;;;;;;;;;;;41798:10;;-1:-1:-1;41889:21:0;;;;41881:70;;;;-1:-1:-1;;;41881:70:0;;;;;;;:::i;:::-;41995:9;:13;;;;;;;;;;;-1:-1:-1;;;;;41995:19:0;;;;;;;;;;42017:20;;41995:42;;41727:3;;;;:::i;:::-;;;;41691:373;;;;42119:1;-1:-1:-1;;;;;42081:55:0;42105:4;-1:-1:-1;;;;;42081:55:0;42095:8;-1:-1:-1;;;;;42081:55:0;;42123:3;42128:7;42081:55;;;;;;;:::i;:::-;;;;;;;;42149:65;;;;;;;;;42193:1;42149:65;;;41386:836;41253:969;;;:::o;9838:191::-;9931:6;;;-1:-1:-1;;;;;9948:17:0;;;-1:-1:-1;;;;;;9948:17:0;;;;;;;9981:40;;9931:6;;;9948:17;9931:6;;9981:40;;9912:16;;9981:40;9901:128;9838:191;:::o;75035:211::-;75170:59;;;75187:15;75170:59;;;11319:19:1;-1:-1:-1;;75204:10:0;11376:2:1;11372:15;11368:53;11354:12;;;11347:75;;;;11438:12;;;11431:28;;;11475:12;;;11468:28;;;75120:7:0;;75234:4;;11512:13:1;;75170:59:0;;;;;;;;;;;;75160:70;;;;;;75152:79;;:86;;;;:::i;38094:729::-;-1:-1:-1;;;;;38247:16:0;;38239:62;;;;-1:-1:-1;;;38239:62:0;;21822:2:1;38239:62:0;;;21804:21:1;21861:2;21841:18;;;21834:30;21900:34;21880:18;;;21873:62;-1:-1:-1;;;21951:18:1;;;21944:31;21992:19;;38239:62:0;21620:397:1;38239:62:0;7319:10;38314:16;38379:21;38397:2;38379:17;:21::i;:::-;38356:44;;38411:24;38438:25;38456:6;38438:17;:25::i;:::-;38411:52;;38555:9;:13;;;;;;;;;;;-1:-1:-1;;;;;38555:17:0;;;;;;;;;:27;;38576:6;;38555:9;:27;;38576:6;;38555:27;:::i;:::-;;;;-1:-1:-1;;38598:52:0;;;22738:25:1;;;22794:2;22779:18;;22772:34;;;-1:-1:-1;;;;;38598:52:0;;;;38631:1;;38598:52;;;;;;22711:18:1;38598:52:0;;;;;;;38663:74;38694:8;38712:1;38716:2;38720;38724:6;38732:4;38663:30;:74::i;:::-;38228:595;;;38094:729;;;;:::o;42364:331::-;42519:8;-1:-1:-1;;;;;42510:17:0;:5;-1:-1:-1;;;;;42510:17:0;;;42502:71;;;;-1:-1:-1;;;42502:71:0;;20593:2:1;42502:71:0;;;20575:21:1;20632:2;20612:18;;;20605:30;20671:34;20651:18;;;20644:62;-1:-1:-1;;;20722:18:1;;;20715:39;20771:19;;42502:71:0;20391:405:1;42502:71:0;-1:-1:-1;;;;;42584:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;42584:46:0;;;;;;;;;;42646:41;;14016::1;;;42646::0;;13989:18:1;42646:41:0;;;;;;;42364:331;;;:::o;34298:974::-;-1:-1:-1;;;;;34486:16:0;;34478:66;;;;-1:-1:-1;;;34478:66:0;;;;;;;:::i;:::-;7319:10;34557:16;34622:21;34640:2;34622:17;:21::i;:::-;34599:44;;34654:24;34681:25;34699:6;34681:17;:25::i;:::-;34654:52;;34792:19;34814:13;;;;;;;;;;;-1:-1:-1;;;;;34814:19:0;;;;;;;;;;34852:21;;;;34844:76;;;;-1:-1:-1;;;34844:76:0;;;;;;;:::i;:::-;34956:9;:13;;;;;;;;;;;-1:-1:-1;;;;;34956:19:0;;;;;;;;;;34978:20;;;34956:42;;35020:17;;;;;;;:27;;34978:20;;34956:9;35020:27;;34978:20;;35020:27;:::i;:::-;;;;-1:-1:-1;;35065:46:0;;;22738:25:1;;;22794:2;22779:18;;22772:34;;;-1:-1:-1;;;;;35065:46:0;;;;;;;;;;;;;;22711:18:1;35065:46:0;;;;;;;35124:68;35155:8;35165:4;35171:2;35175;35179:6;35187:4;35124:30;:68::i;:::-;34467:805;;;;34298:974;;;;;:::o;40242:808::-;-1:-1:-1;;;;;40369:18:0;;40361:66;;;;-1:-1:-1;;;40361:66:0;;;;;;;:::i;:::-;7319:10;40440:16;40505:21;40523:2;40505:17;:21::i;:::-;40482:44;;40537:24;40564:25;40582:6;40564:17;:25::i;:::-;40602:66;;;;;;;;;-1:-1:-1;40602:66:0;;;;40703:13;;;;;;;;;-1:-1:-1;;;;;40703:19:0;;;;;;;;40537:52;;-1:-1:-1;40741:21:0;;;;40733:70;;;;-1:-1:-1;;;40733:70:0;;;;;;;:::i;:::-;40839:9;:13;;;;;;;;;;;-1:-1:-1;;;;;40839:19:0;;;;;;;;;;;;40861:20;;;40839:42;;40910:54;;22738:25:1;;;22779:18;;;22772:34;;;40839:19:0;;40910:54;;;;;;22711:18:1;40910:54:0;;;;;;;40977:65;;;;;;;;;41021:1;40977:65;;;35630:1146;45807:813;-1:-1:-1;;;;;46047:13:0;;11617:19;:23;46043:570;;46083:79;;-1:-1:-1;;;46083:79:0;;-1:-1:-1;;;;;46083:43:0;;;;;:79;;46127:8;;46137:4;;46143:3;;46148:7;;46157:4;;46083:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46083:79:0;;;;;;;;-1:-1:-1;;46083:79:0;;;;;;;;;;;;:::i;:::-;;;46079:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;46475:6;46468:14;;-1:-1:-1;;;46468:14:0;;;;;;;;:::i;46079:523::-;;;46524:62;;-1:-1:-1;;;46524:62:0;;14726:2:1;46524:62:0;;;14708:21:1;14765:2;14745:18;;;14738:30;14804:34;14784:18;;;14777:62;-1:-1:-1;;;14855:18:1;;;14848:50;14915:19;;46524:62:0;14524:416:1;46079:523:0;-1:-1:-1;;;;;;46244:60:0;;-1:-1:-1;;;46244:60:0;46240:159;;46329:50;;-1:-1:-1;;;46329:50:0;;;;;;;:::i;46628:198::-;46748:16;;;46762:1;46748:16;;;;;;;;;46694;;46723:22;;46748:16;;;;;;;;;;;;-1:-1:-1;46748:16:0;46723:41;;46786:7;46775:5;46781:1;46775:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;46813:5;46628:198;-1:-1:-1;;46628:198:0:o;45055:744::-;-1:-1:-1;;;;;45270:13:0;;11617:19;:23;45266:526;;45306:72;;-1:-1:-1;;;45306:72:0;;-1:-1:-1;;;;;45306:38:0;;;;;:72;;45345:8;;45355:4;;45361:2;;45365:6;;45373:4;;45306:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45306:72:0;;;;;;;;-1:-1:-1;;45306:72:0;;;;;;;;;;;;:::i;:::-;;;45302:479;;;;:::i;:::-;-1:-1:-1;;;;;;45428:55:0;;-1:-1:-1;;;45428:55:0;45424:154;;45508:50;;-1:-1:-1;;;45508:50:0;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:468:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;183:2;177:9;195:69;252:2;231:15;;-1:-1:-1;;227:29:1;258:4;223:40;177:9;195:69;:::i;:::-;282:6;273:15;;312:6;304;297:22;352:3;343:6;338:3;334:16;331:25;328:45;;;369:1;366;359:12;328:45;419:6;414:3;407:4;399:6;395:17;382:44;474:1;467:4;458:6;450;446:19;442:30;435:41;;14:468;;;;;:::o;487:735::-;541:5;594:3;587:4;579:6;575:17;571:27;561:55;;612:1;609;602:12;561:55;648:6;635:20;674:4;697:43;737:2;697:43;:::i;:::-;769:2;763:9;781:31;809:2;801:6;781:31;:::i;:::-;847:18;;;881:15;;;;-1:-1:-1;916:15:1;;;966:1;962:10;;;950:23;;946:32;;943:41;-1:-1:-1;940:61:1;;;997:1;994;987:12;940:61;1019:1;1029:163;1043:2;1040:1;1037:9;1029:163;;;1100:17;;1088:30;;1138:12;;;;1170;;;;1061:1;1054:9;1029:163;;;-1:-1:-1;1210:6:1;;487:735;-1:-1:-1;;;;;;;487:735:1:o;1227:220::-;1269:5;1322:3;1315:4;1307:6;1303:17;1299:27;1289:55;;1340:1;1337;1330:12;1289:55;1362:79;1437:3;1428:6;1415:20;1408:4;1400:6;1396:17;1362:79;:::i;1452:247::-;1511:6;1564:2;1552:9;1543:7;1539:23;1535:32;1532:52;;;1580:1;1577;1570:12;1532:52;1619:9;1606:23;1638:31;1663:5;1638:31;:::i;1964:388::-;2032:6;2040;2093:2;2081:9;2072:7;2068:23;2064:32;2061:52;;;2109:1;2106;2099:12;2061:52;2148:9;2135:23;2167:31;2192:5;2167:31;:::i;:::-;2217:5;-1:-1:-1;2274:2:1;2259:18;;2246:32;2287:33;2246:32;2287:33;:::i;:::-;2339:7;2329:17;;;1964:388;;;;;:::o;2357:1071::-;2511:6;2519;2527;2535;2543;2596:3;2584:9;2575:7;2571:23;2567:33;2564:53;;;2613:1;2610;2603:12;2564:53;2652:9;2639:23;2671:31;2696:5;2671:31;:::i;:::-;2721:5;-1:-1:-1;2778:2:1;2763:18;;2750:32;2791:33;2750:32;2791:33;:::i;:::-;2843:7;-1:-1:-1;2901:2:1;2886:18;;2873:32;2924:18;2954:14;;;2951:34;;;2981:1;2978;2971:12;2951:34;3004:61;3057:7;3048:6;3037:9;3033:22;3004:61;:::i;:::-;2994:71;;3118:2;3107:9;3103:18;3090:32;3074:48;;3147:2;3137:8;3134:16;3131:36;;;3163:1;3160;3153:12;3131:36;3186:63;3241:7;3230:8;3219:9;3215:24;3186:63;:::i;:::-;3176:73;;3302:3;3291:9;3287:19;3274:33;3258:49;;3332:2;3322:8;3319:16;3316:36;;;3348:1;3345;3338:12;3316:36;;3371:51;3414:7;3403:8;3392:9;3388:24;3371:51;:::i;:::-;3361:61;;;2357:1071;;;;;;;;:::o;3433:734::-;3537:6;3545;3553;3561;3569;3622:3;3610:9;3601:7;3597:23;3593:33;3590:53;;;3639:1;3636;3629:12;3590:53;3678:9;3665:23;3697:31;3722:5;3697:31;:::i;:::-;3747:5;-1:-1:-1;3804:2:1;3789:18;;3776:32;3817:33;3776:32;3817:33;:::i;:::-;3869:7;-1:-1:-1;3923:2:1;3908:18;;3895:32;;-1:-1:-1;3974:2:1;3959:18;;3946:32;;-1:-1:-1;4029:3:1;4014:19;;4001:33;4057:18;4046:30;;4043:50;;;4089:1;4086;4079:12;4043:50;4112:49;4153:7;4144:6;4133:9;4129:22;4112:49;:::i;4172:730::-;4299:6;4307;4315;4368:2;4356:9;4347:7;4343:23;4339:32;4336:52;;;4384:1;4381;4374:12;4336:52;4423:9;4410:23;4442:31;4467:5;4442:31;:::i;:::-;4492:5;-1:-1:-1;4548:2:1;4533:18;;4520:32;4571:18;4601:14;;;4598:34;;;4628:1;4625;4618:12;4598:34;4651:61;4704:7;4695:6;4684:9;4680:22;4651:61;:::i;:::-;4641:71;;4765:2;4754:9;4750:18;4737:32;4721:48;;4794:2;4784:8;4781:16;4778:36;;;4810:1;4807;4800:12;4778:36;;4833:63;4888:7;4877:8;4866:9;4862:24;4833:63;:::i;:::-;4823:73;;;4172:730;;;;;:::o;4907:416::-;4972:6;4980;5033:2;5021:9;5012:7;5008:23;5004:32;5001:52;;;5049:1;5046;5039:12;5001:52;5088:9;5075:23;5107:31;5132:5;5107:31;:::i;:::-;5157:5;-1:-1:-1;5214:2:1;5199:18;;5186:32;5256:15;;5249:23;5237:36;;5227:64;;5287:1;5284;5277:12;5328:315;5396:6;5404;5457:2;5445:9;5436:7;5432:23;5428:32;5425:52;;;5473:1;5470;5463:12;5425:52;5512:9;5499:23;5531:31;5556:5;5531:31;:::i;:::-;5581:5;5633:2;5618:18;;;;5605:32;;-1:-1:-1;;;5328:315:1:o;5648:383::-;5725:6;5733;5741;5794:2;5782:9;5773:7;5769:23;5765:32;5762:52;;;5810:1;5807;5800:12;5762:52;5849:9;5836:23;5868:31;5893:5;5868:31;:::i;:::-;5918:5;5970:2;5955:18;;5942:32;;-1:-1:-1;6021:2:1;6006:18;;;5993:32;;5648:383;-1:-1:-1;;;5648:383:1:o;6036:1288::-;6154:6;6162;6215:2;6203:9;6194:7;6190:23;6186:32;6183:52;;;6231:1;6228;6221:12;6183:52;6271:9;6258:23;6300:18;6341:2;6333:6;6330:14;6327:34;;;6357:1;6354;6347:12;6327:34;6395:6;6384:9;6380:22;6370:32;;6440:7;6433:4;6429:2;6425:13;6421:27;6411:55;;6462:1;6459;6452:12;6411:55;6498:2;6485:16;6520:4;6543:43;6583:2;6543:43;:::i;:::-;6615:2;6609:9;6627:31;6655:2;6647:6;6627:31;:::i;:::-;6693:18;;;6727:15;;;;-1:-1:-1;6762:11:1;;;6804:1;6800:10;;;6792:19;;6788:28;;6785:41;-1:-1:-1;6782:61:1;;;6839:1;6836;6829:12;6782:61;6861:1;6852:10;;6871:238;6885:2;6882:1;6879:9;6871:238;;;6956:3;6943:17;6973:31;6998:5;6973:31;:::i;:::-;7017:18;;6903:1;6896:9;;;;;7055:12;;;;7087;;6871:238;;;-1:-1:-1;7128:6:1;-1:-1:-1;;7172:18:1;;7159:32;;-1:-1:-1;;7203:16:1;;;7200:36;;;7232:1;7229;7222:12;7200:36;;7255:63;7310:7;7299:8;7288:9;7284:24;7255:63;:::i;:::-;7245:73;;;6036:1288;;;;;:::o;7329:245::-;7387:6;7440:2;7428:9;7419:7;7415:23;7411:32;7408:52;;;7456:1;7453;7446:12;7408:52;7495:9;7482:23;7514:30;7538:5;7514:30;:::i;7579:249::-;7648:6;7701:2;7689:9;7680:7;7676:23;7672:32;7669:52;;;7717:1;7714;7707:12;7669:52;7749:9;7743:16;7768:30;7792:5;7768:30;:::i;7833:450::-;7902:6;7955:2;7943:9;7934:7;7930:23;7926:32;7923:52;;;7971:1;7968;7961:12;7923:52;8011:9;7998:23;8044:18;8036:6;8033:30;8030:50;;;8076:1;8073;8066:12;8030:50;8099:22;;8152:4;8144:13;;8140:27;-1:-1:-1;8130:55:1;;8181:1;8178;8171:12;8130:55;8204:73;8269:7;8264:2;8251:16;8246:2;8242;8238:11;8204:73;:::i;8288:180::-;8347:6;8400:2;8388:9;8379:7;8375:23;8371:32;8368:52;;;8416:1;8413;8406:12;8368:52;-1:-1:-1;8439:23:1;;8288:180;-1:-1:-1;8288:180:1:o;8473:184::-;8543:6;8596:2;8584:9;8575:7;8571:23;8567:32;8564:52;;;8612:1;8609;8602:12;8564:52;-1:-1:-1;8635:16:1;;8473:184;-1:-1:-1;8473:184:1:o;8662:435::-;8715:3;8753:5;8747:12;8780:6;8775:3;8768:19;8806:4;8835:2;8830:3;8826:12;8819:19;;8872:2;8865:5;8861:14;8893:1;8903:169;8917:6;8914:1;8911:13;8903:169;;;8978:13;;8966:26;;9012:12;;;;9047:15;;;;8939:1;8932:9;8903:169;;;-1:-1:-1;9088:3:1;;8662:435;-1:-1:-1;;;;;8662:435:1:o;9102:257::-;9143:3;9181:5;9175:12;9208:6;9203:3;9196:19;9224:63;9280:6;9273:4;9268:3;9264:14;9257:4;9250:5;9246:16;9224:63;:::i;:::-;9341:2;9320:15;-1:-1:-1;;9316:29:1;9307:39;;;;9348:4;9303:50;;9102:257;-1:-1:-1;;9102:257:1:o;9364:1527::-;9588:3;9626:6;9620:13;9652:4;9665:51;9709:6;9704:3;9699:2;9691:6;9687:15;9665:51;:::i;:::-;9779:13;;9738:16;;;;9801:55;9779:13;9738:16;9823:15;;;9801:55;:::i;:::-;9945:13;;9878:20;;;9918:1;;10005;10027:18;;;;10080;;;;10107:93;;10185:4;10175:8;10171:19;10159:31;;10107:93;10248:2;10238:8;10235:16;10215:18;10212:40;10209:167;;;-1:-1:-1;;;10275:33:1;;10331:4;10328:1;10321:15;10361:4;10282:3;10349:17;10209:167;10392:18;10419:110;;;;10543:1;10538:328;;;;10385:481;;10419:110;-1:-1:-1;;10454:24:1;;10440:39;;10499:20;;;;-1:-1:-1;10419:110:1;;10538:328;23078:1;23071:14;;;23115:4;23102:18;;10633:1;10647:169;10661:8;10658:1;10655:15;10647:169;;;10743:14;;10728:13;;;10721:37;10786:16;;;;10678:10;;10647:169;;;10651:3;;10847:8;10840:5;10836:20;10829:27;;10385:481;-1:-1:-1;10882:3:1;;9364:1527;-1:-1:-1;;;;;;;;;;;9364:1527:1:o;11744:826::-;-1:-1:-1;;;;;12141:15:1;;;12123:34;;12193:15;;12188:2;12173:18;;12166:43;12103:3;12240:2;12225:18;;12218:31;;;12066:4;;12272:57;;12309:19;;12301:6;12272:57;:::i;:::-;12377:9;12369:6;12365:22;12360:2;12349:9;12345:18;12338:50;12411:44;12448:6;12440;12411:44;:::i;:::-;12397:58;;12504:9;12496:6;12492:22;12486:3;12475:9;12471:19;12464:51;12532:32;12557:6;12549;12532:32;:::i;:::-;12524:40;11744:826;-1:-1:-1;;;;;;;;11744:826:1:o;12575:560::-;-1:-1:-1;;;;;12872:15:1;;;12854:34;;12924:15;;12919:2;12904:18;;12897:43;12971:2;12956:18;;12949:34;;;13014:2;12999:18;;12992:34;;;12834:3;13057;13042:19;;13035:32;;;12797:4;;13084:45;;13109:19;;13101:6;13084:45;:::i;:::-;13076:53;12575:560;-1:-1:-1;;;;;;;12575:560:1:o;13140:261::-;13319:2;13308:9;13301:21;13282:4;13339:56;13391:2;13380:9;13376:18;13368:6;13339:56;:::i;13406:465::-;13663:2;13652:9;13645:21;13626:4;13689:56;13741:2;13730:9;13726:18;13718:6;13689:56;:::i;:::-;13793:9;13785:6;13781:22;13776:2;13765:9;13761:18;13754:50;13821:44;13858:6;13850;13821:44;:::i;:::-;13813:52;13406:465;-1:-1:-1;;;;;13406:465:1:o;14300:219::-;14449:2;14438:9;14431:21;14412:4;14469:44;14509:2;14498:9;14494:18;14486:6;14469:44;:::i;14945:404::-;15147:2;15129:21;;;15186:2;15166:18;;;15159:30;15225:34;15220:2;15205:18;;15198:62;-1:-1:-1;;;15291:2:1;15276:18;;15269:38;15339:3;15324:19;;14945:404::o;16517:400::-;16719:2;16701:21;;;16758:2;16738:18;;;16731:30;16797:34;16792:2;16777:18;;16770:62;-1:-1:-1;;;16863:2:1;16848:18;;16841:34;16907:3;16892:19;;16517:400::o;16922:405::-;17124:2;17106:21;;;17163:2;17143:18;;;17136:30;17202:34;17197:2;17182:18;;17175:62;-1:-1:-1;;;17268:2:1;17253:18;;17246:39;17317:3;17302:19;;16922:405::o;17332:401::-;17534:2;17516:21;;;17573:2;17553:18;;;17546:30;17612:34;17607:2;17592:18;;17585:62;-1:-1:-1;;;17678:2:1;17663:18;;17656:35;17723:3;17708:19;;17332:401::o;18157:399::-;18359:2;18341:21;;;18398:2;18378:18;;;18371:30;18437:34;18432:2;18417:18;;18410:62;-1:-1:-1;;;18503:2:1;18488:18;;18481:33;18546:3;18531:19;;18157:399::o;18561:406::-;18763:2;18745:21;;;18802:2;18782:18;;;18775:30;18841:34;18836:2;18821:18;;18814:62;-1:-1:-1;;;18907:2:1;18892:18;;18885:40;18957:3;18942:19;;18561:406::o;19316:356::-;19518:2;19500:21;;;19537:18;;;19530:30;19596:34;19591:2;19576:18;;19569:62;19663:2;19648:18;;19316:356::o;21211:404::-;21413:2;21395:21;;;21452:2;21432:18;;;21425:30;21491:34;21486:2;21471:18;;21464:62;-1:-1:-1;;;21557:2:1;21542:18;;21535:38;21605:3;21590:19;;21211:404::o;22817:183::-;22877:4;22910:18;22902:6;22899:30;22896:56;;;22932:18;;:::i;:::-;-1:-1:-1;22977:1:1;22973:14;22989:4;22969:25;;22817:183::o;23131:128::-;23171:3;23202:1;23198:6;23195:1;23192:13;23189:39;;;23208:18;;:::i;:::-;-1:-1:-1;23244:9:1;;23131:128::o;23264:120::-;23304:1;23330;23320:35;;23335:18;;:::i;:::-;-1:-1:-1;23369:9:1;;23264:120::o;23389:168::-;23429:7;23495:1;23491;23487:6;23483:14;23480:1;23477:21;23472:1;23465:9;23458:17;23454:45;23451:71;;;23502:18;;:::i;:::-;-1:-1:-1;23542:9:1;;23389:168::o;23562:125::-;23602:4;23630:1;23627;23624:8;23621:34;;;23635:18;;:::i;:::-;-1:-1:-1;23672:9:1;;23562:125::o;23692:258::-;23764:1;23774:113;23788:6;23785:1;23782:13;23774:113;;;23864:11;;;23858:18;23845:11;;;23838:39;23810:2;23803:10;23774:113;;;23905:6;23902:1;23899:13;23896:48;;;-1:-1:-1;;23940:1:1;23922:16;;23915:27;23692:258::o;23955:380::-;24034:1;24030:12;;;;24077;;;24098:61;;24152:4;24144:6;24140:17;24130:27;;24098:61;24205:2;24197:6;24194:14;24174:18;24171:38;24168:161;;;24251:10;24246:3;24242:20;24239:1;24232:31;24286:4;24283:1;24276:15;24314:4;24311:1;24304:15;24168:161;;23955:380;;;:::o;24340:249::-;24450:2;24431:13;;-1:-1:-1;;24427:27:1;24415:40;;24485:18;24470:34;;24506:22;;;24467:62;24464:88;;;24532:18;;:::i;:::-;24568:2;24561:22;-1:-1:-1;;24340:249:1:o;24594:135::-;24633:3;-1:-1:-1;;24654:17:1;;24651:43;;;24674:18;;:::i;:::-;-1:-1:-1;24721:1:1;24710:13;;24594:135::o;24734:112::-;24766:1;24792;24782:35;;24797:18;;:::i;:::-;-1:-1:-1;24831:9:1;;24734:112::o;24851:127::-;24912:10;24907:3;24903:20;24900:1;24893:31;24943:4;24940:1;24933:15;24967:4;24964:1;24957:15;24983:127;25044:10;25039:3;25035:20;25032:1;25025:31;25075:4;25072:1;25065:15;25099:4;25096:1;25089:15;25115:127;25176:10;25171:3;25167:20;25164:1;25157:31;25207:4;25204:1;25197:15;25231:4;25228:1;25221:15;25247:127;25308:10;25303:3;25299:20;25296:1;25289:31;25339:4;25336:1;25329:15;25363:4;25360:1;25353:15;25379:179;25414:3;25456:1;25438:16;25435:23;25432:120;;;25502:1;25499;25496;25481:23;-1:-1:-1;25539:1:1;25533:8;25528:3;25524:18;25432:120;25379:179;:::o;25563:671::-;25602:3;25644:4;25626:16;25623:26;25620:39;;;25563:671;:::o;25620:39::-;25686:2;25680:9;-1:-1:-1;;25751:16:1;25747:25;;25744:1;25680:9;25723:50;25802:4;25796:11;25826:16;25861:18;25932:2;25925:4;25917:6;25913:17;25910:25;25905:2;25897:6;25894:14;25891:45;25888:58;;;25939:5;;;;;25563:671;:::o;25888:58::-;25976:6;25970:4;25966:17;25955:28;;26012:3;26006:10;26039:2;26031:6;26028:14;26025:27;;;26045:5;;;;;;25563:671;:::o;26025:27::-;26129:2;26110:16;26104:4;26100:27;26096:36;26089:4;26080:6;26075:3;26071:16;26067:27;26064:69;26061:82;;;26136:5;;;;;;25563:671;:::o;26061:82::-;26152:57;26203:4;26194:6;26186;26182:19;26178:30;26172:4;26152:57;:::i;:::-;-1:-1:-1;26225:3:1;;25563:671;-1:-1:-1;;;;;25563:671:1:o;26239:131::-;-1:-1:-1;;;;;26314:31:1;;26304:42;;26294:70;;26360:1;26357;26350:12;26375:131;-1:-1:-1;;;;;;26449:32:1;;26439:43;;26429:71;;26496:1;26493;26486:12

Swarm Source

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