ETH Price: $3,466.14 (+0.48%)
Gas: 6 Gwei

Token

Wumbo Pass (WUMBO)
 

Overview

Max Total Supply

338 WUMBO

Holders

316

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 WUMBO
0x2f9fb6d0D93b9E94F525Fe61950dC2fC5a48FD3D
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

A private community of Wumbologists - top traders, builders, and collectors in the NFT space. Discord bots, tools, and exclusive access to drops via our friends & partners.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
WumboPass

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-05
*/

// File contracts/IERC165.sol

// SPDX-License-Identifier: MIT
// 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 contracts/ERC165.sol

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

pragma solidity ^0.8.0;

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

// File @openzeppelin/contracts/token/ERC721/[email protected]

// OpenZeppelin Contracts (last updated v4.7.0) (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`.
     *
     * 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;

    /**
     * @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 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

// OpenZeppelin Contracts (last updated v4.6.0) (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 @openzeppelin/contracts/token/ERC721/extensions/[email protected]

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

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

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

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

// OpenZeppelin Contracts (last updated v4.7.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
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File @openzeppelin/contracts/utils/[email protected]

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

pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/utils/[email protected]

// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}


// File contracts/ERC721A.sol

// Creator: Chiru Labs

pragma solidity ^0.8.4;








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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

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

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


// File contracts/extensions/ERC721ABurnable.sol

// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @title ERC721A Burnable Token
 * @dev ERC721A Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721ABurnable is Context, ERC721A {

    /**
     * @dev Burns `tokenId`. See {ERC721A-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

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

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();

        _burn(tokenId);
    }
}


// File contracts/extensions/ERC721AOwnersExplicit.sol

// Creator: Chiru Labs

pragma solidity ^0.8.4;

error AllOwnershipsHaveBeenSet();
error QuantityMustBeNonZero();
error NoTokensMintedYet();

abstract contract ERC721AOwnersExplicit is ERC721A {
    uint256 public nextOwnerToExplicitlySet;

    /**
     * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
     */
    function _setOwnersExplicit(uint256 quantity) internal {
        if (quantity == 0) revert QuantityMustBeNonZero();
        if (_currentIndex == _startTokenId()) revert NoTokensMintedYet();
        uint256 _nextOwnerToExplicitlySet = nextOwnerToExplicitlySet;
        if (_nextOwnerToExplicitlySet == 0) {
            _nextOwnerToExplicitlySet = _startTokenId();
        }
        if (_nextOwnerToExplicitlySet >= _currentIndex) revert AllOwnershipsHaveBeenSet();

        // Index underflow is impossible.
        // Counter or index overflow is incredibly unrealistic.
        unchecked {
            uint256 endIndex = _nextOwnerToExplicitlySet + quantity - 1;

            // Set the end index to be the last token index
            if (endIndex + 1 > _currentIndex) {
                endIndex = _currentIndex - 1;
            }

            for (uint256 i = _nextOwnerToExplicitlySet; i <= endIndex; i++) {
                if (_ownerships[i].addr == address(0) && !_ownerships[i].burned) {
                    TokenOwnership memory ownership = ownershipOf(i);
                    _ownerships[i].addr = ownership.addr;
                    _ownerships[i].startTimestamp = ownership.startTimestamp;
                }
            }

            nextOwnerToExplicitlySet = endIndex + 1;
        }
    }
}


// File contracts/mocks/ERC721ABurnableMock.sol

// Creators: Chiru Labs

pragma solidity ^0.8.4;

contract ERC721ABurnableMock is ERC721A, ERC721ABurnable {
    constructor(string memory name_, string memory symbol_) ERC721A(name_, symbol_) {}

    function exists(uint256 tokenId) public view returns (bool) {
        return _exists(tokenId);
    }

    function safeMint(address to, uint256 quantity) public {
        _safeMint(to, quantity);
    }
    
    function getOwnershipAt(uint256 index) public view returns (TokenOwnership memory) {
        return _ownerships[index];
    }

    function totalMinted() public view returns (uint256) {
        return _totalMinted();
    }
}


// File contracts/mocks/ERC721ABurnableOwnersExplicitMock.sol

// Creators: Chiru Labs

pragma solidity ^0.8.4;


contract ERC721ABurnableOwnersExplicitMock is ERC721A, ERC721ABurnable, ERC721AOwnersExplicit {
    constructor(string memory name_, string memory symbol_) ERC721A(name_, symbol_) {}

    function exists(uint256 tokenId) public view returns (bool) {
        return _exists(tokenId);
    }

    function safeMint(address to, uint256 quantity) public {
        _safeMint(to, quantity);
    }

    function setOwnersExplicit(uint256 quantity) public {
        _setOwnersExplicit(quantity);
    }

    function getOwnershipAt(uint256 index) public view returns (TokenOwnership memory) {
        return _ownerships[index];
    }
}


// File contracts/mocks/StartTokenIdHelper.sol

// Creators: Chiru Labs

pragma solidity ^0.8.4;

/**
 * This Helper is used to return a dynmamic value in the overriden _startTokenId() function.
 * Extending this Helper before the ERC721A contract give us access to the herein set `startTokenId`
 * to be returned by the overriden `_startTokenId()` function of ERC721A in the ERC721AStartTokenId mocks.
 */
contract StartTokenIdHelper {
    uint256 public immutable startTokenId;

    constructor(uint256 startTokenId_) {
        startTokenId = startTokenId_;
    }
}



// File contracts/mocks/ERC721AGasReporterMock.sol

// Creators: Chiru Labs

pragma solidity ^0.8.4;

contract ERC721AGasReporterMock is ERC721A {
    constructor(string memory name_, string memory symbol_) ERC721A(name_, symbol_) {}

    function safeMintOne(address to) public {
        _safeMint(to, 1);
    }

    function mintOne(address to) public {
        _mint(to, 1, '', false);
    }

    function safeMintTen(address to) public {
        _safeMint(to, 10);
    }

    function mintTen(address to) public {
        _mint(to, 10, '', false);
    }
}


// File contracts/mocks/ERC721AMock.sol

// Creators: Chiru Labs

pragma solidity ^0.8.4;

contract ERC721AMock is ERC721A {
    constructor(string memory name_, string memory symbol_) ERC721A(name_, symbol_) {}

    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

    function totalMinted() public view returns (uint256) {
        return _totalMinted();
    }

    function getAux(address owner) public view returns (uint64) {
        return _getAux(owner);
    }

    function setAux(address owner, uint64 aux) public {
        _setAux(owner, aux);
    }

    function baseURI() public view returns (string memory) {
        return _baseURI();
    }

    function exists(uint256 tokenId) public view returns (bool) {
        return _exists(tokenId);
    }

    function safeMint(address to, uint256 quantity) public {
        _safeMint(to, quantity);
    }

    function safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) public {
        _safeMint(to, quantity, _data);
    }

    function mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) public {
        _mint(to, quantity, _data, safe);
    }
}


// File contracts/mocks/ERC721AOwnersExplicitMock.sol

// Creators: Chiru Labs

pragma solidity ^0.8.4;

contract ERC721AOwnersExplicitMock is ERC721AOwnersExplicit {
    constructor(string memory name_, string memory symbol_) ERC721A(name_, symbol_) {}

    function safeMint(address to, uint256 quantity) public {
        _safeMint(to, quantity);
    }

    function setOwnersExplicit(uint256 quantity) public {
        _setOwnersExplicit(quantity);
    }

    function getOwnershipAt(uint256 tokenId) public view returns (TokenOwnership memory) {
        return _ownerships[tokenId];
    }
}

// File contracts/mocks/ERC721ReceiverMock.sol

// Creators: Chiru Labs

pragma solidity ^0.8.4;

contract ERC721ReceiverMock is IERC721Receiver {
    enum Error {
        None,
        RevertWithMessage,
        RevertWithoutMessage,
        Panic
    }

    bytes4 private immutable _retval;

    event Received(address operator, address from, uint256 tokenId, bytes data, uint256 gas);

    constructor(bytes4 retval) {
        _retval = retval;
    }

    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes memory data
    ) public override returns (bytes4) {
        emit Received(operator, from, tokenId, data, 20000);
        return _retval;
    }
}


// File @openzeppelin/contracts/access/[email protected]

// OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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


// File @openzeppelin/contracts/interfaces/[email protected]

// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}


// File @openzeppelin/contracts/token/common/[email protected]

// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}


// File @openzeppelin/contracts/utils/cryptography/[email protected]

// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}


// File contracts/WumboPass.sol

/**
╔╦═╦╦╦╦═╦═╦══╦═╗╔═╦══╦══╦══╗
║║║║║║║║║║║╔╗║║║║╬║╔╗║══╣══╣
║║║║║║║║║║║╔╗║║║║╔╣╠╣╠══╠══║
╚═╩═╩═╩╩═╩╩══╩═╝╚╝╚╝╚╩══╩══╝
by @wumbolabs
**/

pragma solidity ^0.8.4;





contract WumboPass is ERC721A, ERC2981, Ownable {
    using Strings for uint256;

    uint256 public ALLOW_LIST_PRICE = 0.1 ether;
    uint256 public MINT_PRICE = 0.1 ether;
    uint256 constant CLAIM_SUPPLY = 222;
    uint256 constant MINT_SUPPLY = 777;
    uint256 constant MAX_PER_WALLET = 1;

    mapping(address => bool) public whitelist;

    enum Status {
        NOT_LIVE,
        PRESALE,
        LIVE,
        CLAIM,
        ENDED
    }

    // minting variables
    string public baseURI = "ipfs://QmTDw49hJRhKXX9g8fyNuj1sdzVB4ku1xBBHWmQxtTr9jp/";
    Status public state = Status.NOT_LIVE;
    uint256 public mintCount = 0;
    uint256 public claimCount = 0;

    constructor() ERC721A("Wumbo Pass", "WUMBO") {
    }

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

    function mint() external payable {
        require(state == Status.LIVE || state == Status.PRESALE, "Wumbo Pass: Mint Not Active");
        if(state == Status.PRESALE){
            require(whitelist[msg.sender], "Not in whitelist");
        }
        require(mintCount < MINT_SUPPLY, "Wumbo Pass: Mint Supply Exceeded");
        require(msg.value >= (state == Status.LIVE ? MINT_PRICE : ALLOW_LIST_PRICE), "Wumbo Pass: Insufficient ETH");
        require(_numberMinted(msg.sender) < MAX_PER_WALLET, "Wumbo Pass: Exceeds Max Per Wallet");
        mintCount += 1;
        _safeMint(msg.sender, 1);
    }

    function claim() external {
        require(state == Status.CLAIM, "Wumbo Pass: Claim Not Active");
        require(claimCount < CLAIM_SUPPLY, "Wumbo Pass: Mint Supply Exceeded");
        require(_numberMinted(msg.sender) < MAX_PER_WALLET, "Wumbo Pass: Exceeds Max Per Wallet");
        require(whitelist[msg.sender], "Not in whitelist");
        claimCount += 1;
        _safeMint(msg.sender, 1);
    }

    function setAllowList(address[] calldata addresses) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            whitelist[addresses[i]] = true;
        }
    }

    function resetAllowList(address[] calldata addresses) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            whitelist[addresses[i]] = false;
        }
    }
    
    function addWhitelist(address _newEntry) external onlyOwner {
        require(!whitelist[_newEntry], "Already in whitelist");
        whitelist[_newEntry] = true;
    }
  
    function removeWhitelist(address _newEntry) external onlyOwner {
        require(whitelist[_newEntry], "Previous not in whitelist");
        whitelist[_newEntry] = false;
    }

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

    function setState(Status _state) external onlyOwner {
        state = _state;
    }

    function sendRemainingToTreasury(uint256 _qty) external onlyOwner {
        require(state == Status.ENDED, "Wumbo Pass: Cannot Claim Unminted Tokens If Sale Live");
        require(totalSupply() + _qty <= CLAIM_SUPPLY + MINT_SUPPLY, "Wumbo Pass: Total Supply Minted");

        _safeMint(0x823D8C84126Da1756BE69421c78482d0D24d907e, _qty);
    }

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

        return string(abi.encodePacked(base, "wumbopass", ".json"));
    }

    function setMintCost(uint256 _newCost) external onlyOwner {
        MINT_PRICE = _newCost;
    }

    function setAllowListCost(uint256 _newCost) external onlyOwner {
        ALLOW_LIST_PRICE = _newCost;
    }

    /*
     * @dev See {ERC2981-_setDefaultRoyalty}.
     */
    function setDefaultRoyalty(address receiver, uint96 feeNumerator) external onlyOwner {
        _setDefaultRoyalty(receiver, feeNumerator);
    }

    /**
     * @dev See {ERC2981-_deleteDefaultRoyalty}.
     */
    function deleteDefaultRoyalty() external onlyOwner {
        _deleteDefaultRoyalty();
    }

    /**
     * @dev See {ERC2981-_setTokenRoyalty}.
     */
    function setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) external onlyOwner {
        _setTokenRoyalty(tokenId, receiver, feeNumerator);
    }

    /**
     * @dev See {ERC2981-_resetTokenRoyalty}.
     */
    function resetTokenRoyalty(uint256 tokenId) external onlyOwner {
        _resetTokenRoyalty(tokenId);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, ERC2981) returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"MintedQueryForZeroAddress","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ALLOW_LIST_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newEntry","type":"address"}],"name":"addWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deleteDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newEntry","type":"address"}],"name":"removeWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"resetAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"resetTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_qty","type":"uint256"}],"name":"sendRemainingToTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setAllowListCost","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":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setMintCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum WumboPass.Status","name":"_state","type":"uint8"}],"name":"setState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"state","outputs":[{"internalType":"enum WumboPass.Status","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

67016345785d8a0000600b819055600c5560e06040526036608081815290620027eb60a03980516200003a91600e916020909101906200012d565b50600f805460ff19169055600060108190556011553480156200005c57600080fd5b50604080518082018252600a81526957756d626f205061737360b01b60208083019182528351808501909452600584526457554d424f60d81b908401528151919291620000ac916002916200012d565b508051620000c29060039060208401906200012d565b5050600160005550620000d533620000db565b62000210565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200013b90620001d3565b90600052602060002090601f0160209004810192826200015f5760008555620001aa565b82601f106200017a57805160ff1916838001178555620001aa565b82800160010185558215620001aa579182015b82811115620001aa5782518255916020019190600101906200018d565b50620001b8929150620001bc565b5090565b5b80821115620001b85760008155600101620001bd565b600181811c90821680620001e857607f821691505b602082108114156200020a57634e487b7160e01b600052602260045260246000fd5b50919050565b6125cb80620002206000396000f3fe6080604052600436106102465760003560e01c806370a08231116101395780639b19251a116100b6578063c002d23d1161007a578063c002d23d14610698578063c19d93fb146106ae578063c87b56dd146106d5578063e985e9c5146106f5578063f2fde38b1461073e578063f80f5dd51461075e57600080fd5b80639b19251a146105fd578063a22cb4651461062d578063aa1b103f1461064d578063ad570dd514610662578063b88d4fde1461067857600080fd5b80638a616bc0116100fd5780638a616bc01461057e5780638da4d3c91461059e5780638da5cb5b146105b457806395d89b41146105d25780639659867e146105e757600080fd5b806370a08231146104e9578063715018a61461050957806378c8cda71461051e5780637f41bf431461053e5780638545f4ea1461055e57600080fd5b80633ccfd60b116101c75780635944c7531161018b5780635944c753146104545780636352211e146104745780636447c35d146104945780636550385b146104b45780636c0360eb146104d457600080fd5b80633ccfd60b146103ca57806342842e0e146103df5780634e71d92d146103ff57806355f804b31461041457806356de96db1461043457600080fd5b80631249c58b1161020e5780631249c58b1461031c57806318160ddd1461032457806323b872dd1461034b5780632995d6c81461036b5780632a55205a1461038b57600080fd5b806301ffc9a71461024b57806304634d8d1461028057806306fdde03146102a2578063081812fc146102c4578063095ea7b3146102fc575b600080fd5b34801561025757600080fd5b5061026b6102663660046121c6565b61077e565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102a061029b366004612127565b61078f565b005b3480156102ae57600080fd5b506102b76107a5565b60405161027791906123ad565b3480156102d057600080fd5b506102e46102df36600461226a565b610837565b6040516001600160a01b039091168152602001610277565b34801561030857600080fd5b506102a06103173660046120fd565b61087b565b6102a0610909565b34801561033057600080fd5b5060015460005403600019015b604051908152602001610277565b34801561035757600080fd5b506102a0610366366004612009565b610b20565b34801561037757600080fd5b506102a061038636600461226a565b610b2b565b34801561039757600080fd5b506103ab6103a63660046122bf565b610c4b565b604080516001600160a01b039093168352602083019190915201610277565b3480156103d657600080fd5b506102a0610cf7565b3480156103eb57600080fd5b506102a06103fa366004612009565b610d8a565b34801561040b57600080fd5b506102a0610da5565b34801561042057600080fd5b506102a061042f366004612221565b610eea565b34801561044057600080fd5b506102a061044f366004612200565b610f05565b34801561046057600080fd5b506102a061046f366004612283565b610f34565b34801561048057600080fd5b506102e461048f36600461226a565b610f47565b3480156104a057600080fd5b506102a06104af366004612151565b610f59565b3480156104c057600080fd5b506102a06104cf36600461226a565b610fd3565b3480156104e057600080fd5b506102b7610fe0565b3480156104f557600080fd5b5061033d610504366004611fb4565b61106e565b34801561051557600080fd5b506102a06110bd565b34801561052a57600080fd5b506102a0610539366004611fb4565b6110cf565b34801561054a57600080fd5b506102a0610559366004612151565b611160565b34801561056a57600080fd5b506102a061057936600461226a565b6111da565b34801561058a57600080fd5b506102a061059936600461226a565b6111e7565b3480156105aa57600080fd5b5061033d60115481565b3480156105c057600080fd5b50600a546001600160a01b03166102e4565b3480156105de57600080fd5b506102b7611200565b3480156105f357600080fd5b5061033d60105481565b34801561060957600080fd5b5061026b610618366004611fb4565b600d6020526000908152604090205460ff1681565b34801561063957600080fd5b506102a06106483660046120c1565b61120f565b34801561065957600080fd5b506102a06112a5565b34801561066e57600080fd5b5061033d600b5481565b34801561068457600080fd5b506102a0610693366004612045565b6112b7565b3480156106a457600080fd5b5061033d600c5481565b3480156106ba57600080fd5b50600f546106c89060ff1681565b6040516102779190612385565b3480156106e157600080fd5b506102b76106f036600461226a565b611308565b34801561070157600080fd5b5061026b610710366004611fd6565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561074a57600080fd5b506102a0610759366004611fb4565b6113ab565b34801561076a57600080fd5b506102a0610779366004611fb4565b611421565b6000610789826114ad565b92915050565b6107976114d2565b6107a1828261152c565b5050565b6060600280546107b4906124d1565b80601f01602080910402602001604051908101604052809291908181526020018280546107e0906124d1565b801561082d5780601f106108025761010080835404028352916020019161082d565b820191906000526020600020905b81548152906001019060200180831161081057829003601f168201915b5050505050905090565b6000610842826115e6565b61085f576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061088682610f47565b9050806001600160a01b0316836001600160a01b031614156108bb5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906108db57506108d98133610710565b155b156108f9576040516367d9dca160e11b815260040160405180910390fd5b61090483838361161f565b505050565b6002600f5460ff1660048111156109225761092261253d565b148061094457506001600f5460ff1660048111156109425761094261253d565b145b6109955760405162461bcd60e51b815260206004820152601b60248201527f57756d626f20506173733a204d696e74204e6f7420416374697665000000000060448201526064015b60405180910390fd5b6001600f5460ff1660048111156109ae576109ae61253d565b1415610a0657336000908152600d602052604090205460ff16610a065760405162461bcd60e51b815260206004820152601060248201526f139bdd081a5b881dda1a5d195b1a5cdd60821b604482015260640161098c565b61030960105410610a595760405162461bcd60e51b815260206004820181905260248201527f57756d626f20506173733a204d696e7420537570706c79204578636565646564604482015260640161098c565b6002600f5460ff166004811115610a7257610a7261253d565b14610a7f57600b54610a83565b600c545b341015610ad25760405162461bcd60e51b815260206004820152601c60248201527f57756d626f20506173733a20496e73756666696369656e742045544800000000604482015260640161098c565b6001610add3361167b565b10610afa5760405162461bcd60e51b815260040161098c906123c0565b600160106000828254610b0d919061244c565b90915550610b1e90503360016116d1565b565b6109048383836116eb565b610b336114d2565b6004600f5460ff166004811115610b4c57610b4c61253d565b14610bb75760405162461bcd60e51b815260206004820152603560248201527f57756d626f20506173733a2043616e6e6f7420436c61696d20556e6d696e74656044820152746420546f6b656e732049662053616c65204c69766560581b606482015260840161098c565b610bc461030960de61244c565b6001546000548391900360001901610bdc919061244c565b1115610c2a5760405162461bcd60e51b815260206004820152601f60248201527f57756d626f20506173733a20546f74616c20537570706c79204d696e74656400604482015260640161098c565b610c4873823d8c84126da1756be69421c78482d0d24d907e826116d1565b50565b60008281526009602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610cc05750604080518082019091526008546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610cdf906001600160601b031687612486565b610ce99190612464565b915196919550909350505050565b610cff6114d2565b604051600090339047908381818185875af1925050503d8060008114610d41576040519150601f19603f3d011682016040523d82523d6000602084013e610d46565b606091505b5050905080610c485760405162461bcd60e51b815260206004820152601060248201526f2bb4ba34323930bb903330b4b632b21760811b604482015260640161098c565b610904838383604051806020016040528060008152506112b7565b6003600f5460ff166004811115610dbe57610dbe61253d565b14610e0b5760405162461bcd60e51b815260206004820152601c60248201527f57756d626f20506173733a20436c61696d204e6f742041637469766500000000604482015260640161098c565b60de60115410610e5d5760405162461bcd60e51b815260206004820181905260248201527f57756d626f20506173733a204d696e7420537570706c79204578636565646564604482015260640161098c565b6001610e683361167b565b10610e855760405162461bcd60e51b815260040161098c906123c0565b336000908152600d602052604090205460ff16610ed75760405162461bcd60e51b815260206004820152601060248201526f139bdd081a5b881dda1a5d195b1a5cdd60821b604482015260640161098c565b600160116000828254610b0d919061244c565b610ef26114d2565b80516107a190600e906020840190611e72565b610f0d6114d2565b600f805482919060ff19166001836004811115610f2c57610f2c61253d565b021790555050565b610f3c6114d2565b610904838383611901565b6000610f52826119cc565b5192915050565b610f616114d2565b60005b81811015610904576001600d6000858585818110610f8457610f84612553565b9050602002016020810190610f999190611fb4565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610fcb8161250c565b915050610f64565b610fdb6114d2565b600b55565b600e8054610fed906124d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611019906124d1565b80156110665780601f1061103b57610100808354040283529160200191611066565b820191906000526020600020905b81548152906001019060200180831161104957829003601f168201915b505050505081565b60006001600160a01b038216611097576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6110c56114d2565b610b1e6000611af5565b6110d76114d2565b6001600160a01b0381166000908152600d602052604090205460ff1661113f5760405162461bcd60e51b815260206004820152601960248201527f50726576696f7573206e6f7420696e2077686974656c69737400000000000000604482015260640161098c565b6001600160a01b03166000908152600d60205260409020805460ff19169055565b6111686114d2565b60005b81811015610904576000600d600085858581811061118b5761118b612553565b90506020020160208101906111a09190611fb4565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806111d28161250c565b91505061116b565b6111e26114d2565b600c55565b6111ef6114d2565b600090815260096020526040812055565b6060600380546107b4906124d1565b6001600160a01b0382163314156112395760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6112ad6114d2565b610b1e6000600855565b6112c28484846116eb565b6001600160a01b0383163b151580156112e457506112e284848484611b47565b155b15611302576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060611313826115e6565b6113775760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161098c565b6000611381611c3f565b905080604051602001611394919061230d565b604051602081830303815290604052915050919050565b6113b36114d2565b6001600160a01b0381166114185760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161098c565b610c4881611af5565b6114296114d2565b6001600160a01b0381166000908152600d602052604090205460ff16156114895760405162461bcd60e51b8152602060048201526014602482015273105b1c9958591e481a5b881dda1a5d195b1a5cdd60621b604482015260640161098c565b6001600160a01b03166000908152600d60205260409020805460ff19166001179055565b60006001600160e01b0319821663152a902d60e11b1480610789575061078982611c4e565b600a546001600160a01b03163314610b1e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161098c565b6127106001600160601b03821611156115575760405162461bcd60e51b815260040161098c90612402565b6001600160a01b0382166115ad5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640161098c565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600855565b6000816001111580156115fa575060005482105b8015610789575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006001600160a01b0382166116a4576040516335ebb31960e01b815260040160405180910390fd5b506001600160a01b0316600090815260056020526040902054600160401b900467ffffffffffffffff1690565b6107a1828260405180602001604052806000815250611c9e565b60006116f6826119cc565b80519091506000906001600160a01b0316336001600160a01b03161480611724575081516117249033610710565b8061173f57503361173484610837565b6001600160a01b0316145b90508061175f57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146117945760405162a1148160e81b815260040160405180910390fd5b6001600160a01b0384166117bb57604051633a954ecd60e21b815260040160405180910390fd5b6117cb600084846000015161161f565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102179092559086018083529120549091166118b7576000548110156118b7578251600082815260046020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b6127106001600160601b038216111561192c5760405162461bcd60e51b815260040161098c90612402565b6001600160a01b0382166119825760405162461bcd60e51b815260206004820152601b60248201527f455243323938313a20496e76616c696420706172616d65746572730000000000604482015260640161098c565b6040805180820182526001600160a01b0393841681526001600160601b0392831660208083019182526000968752600990529190942093519051909116600160a01b029116179055565b604080516060810182526000808252602082018190529181019190915281806001111580156119fc575060005481105b15611adc57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff16151591810182905290611ada5780516001600160a01b031615611a70579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215611ad5579392505050565b611a70565b505b604051636f96cda160e11b815260040160405180910390fd5b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611b7c903390899088908890600401612348565b602060405180830381600087803b158015611b9657600080fd5b505af1925050508015611bc6575060408051601f3d908101601f19168201909252611bc3918101906121e3565b60015b611c21573d808015611bf4576040519150601f19603f3d011682016040523d82523d6000602084013e611bf9565b606091505b508051611c19576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600e80546107b4906124d1565b60006001600160e01b031982166380ac58cd60e01b1480611c7f57506001600160e01b03198216635b5e139f60e01b145b8061078957506301ffc9a760e01b6001600160e01b0319831614610789565b61090483838360016000546001600160a01b038516611ccf57604051622e076360e81b815260040160405180910390fd5b83611ced5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b429092169190910217905580808501838015611d9a57506001600160a01b0387163b15155b15611e23575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611deb6000888480600101955088611b47565b611e08576040516368d2bf6b60e11b815260040160405180910390fd5b80821415611da0578260005414611e1e57600080fd5b611e69565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415611e24575b506000556118fa565b828054611e7e906124d1565b90600052602060002090601f016020900481019282611ea05760008555611ee6565b82601f10611eb957805160ff1916838001178555611ee6565b82800160010185558215611ee6579182015b82811115611ee6578251825591602001919060010190611ecb565b50611ef2929150611ef6565b5090565b5b80821115611ef25760008155600101611ef7565b600067ffffffffffffffff80841115611f2657611f26612569565b604051601f8501601f19908116603f01168101908282118183101715611f4e57611f4e612569565b81604052809350858152868686011115611f6757600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114611f9857600080fd5b919050565b80356001600160601b0381168114611f9857600080fd5b600060208284031215611fc657600080fd5b611fcf82611f81565b9392505050565b60008060408385031215611fe957600080fd5b611ff283611f81565b915061200060208401611f81565b90509250929050565b60008060006060848603121561201e57600080fd5b61202784611f81565b925061203560208501611f81565b9150604084013590509250925092565b6000806000806080858703121561205b57600080fd5b61206485611f81565b935061207260208601611f81565b925060408501359150606085013567ffffffffffffffff81111561209557600080fd5b8501601f810187136120a657600080fd5b6120b587823560208401611f0b565b91505092959194509250565b600080604083850312156120d457600080fd5b6120dd83611f81565b9150602083013580151581146120f257600080fd5b809150509250929050565b6000806040838503121561211057600080fd5b61211983611f81565b946020939093013593505050565b6000806040838503121561213a57600080fd5b61214383611f81565b915061200060208401611f9d565b6000806020838503121561216457600080fd5b823567ffffffffffffffff8082111561217c57600080fd5b818501915085601f83011261219057600080fd5b81358181111561219f57600080fd5b8660208260051b85010111156121b457600080fd5b60209290920196919550909350505050565b6000602082840312156121d857600080fd5b8135611fcf8161257f565b6000602082840312156121f557600080fd5b8151611fcf8161257f565b60006020828403121561221257600080fd5b813560058110611fcf57600080fd5b60006020828403121561223357600080fd5b813567ffffffffffffffff81111561224a57600080fd5b8201601f8101841361225b57600080fd5b611c3784823560208401611f0b565b60006020828403121561227c57600080fd5b5035919050565b60008060006060848603121561229857600080fd5b833592506122a860208501611f81565b91506122b660408501611f9d565b90509250925092565b600080604083850312156122d257600080fd5b50508035926020909101359150565b600081518084526122f98160208601602086016124a5565b601f01601f19169290920160200192915050565b6000825161231f8184602087016124a5565b6877756d626f7061737360b81b92019182525064173539b7b760d91b6009820152600e01919050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061237b908301846122e1565b9695505050505050565b60208101600583106123a757634e487b7160e01b600052602160045260246000fd5b91905290565b602081526000611fcf60208301846122e1565b60208082526022908201527f57756d626f20506173733a2045786365656473204d6178205065722057616c6c604082015261195d60f21b606082015260800190565b6020808252602a908201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646040820152692073616c65507269636560b01b606082015260800190565b6000821982111561245f5761245f612527565b500190565b60008261248157634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156124a0576124a0612527565b500290565b60005b838110156124c05781810151838201526020016124a8565b838111156113025750506000910152565b600181811c908216806124e557607f821691505b6020821081141561250657634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561252057612520612527565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610c4857600080fdfea2646970667358221220980190c452cd3f90854d243823d1ab1d5c86e855b9f3e6fc9694337714378c2564736f6c63430008070033697066733a2f2f516d5444773439684a52684b585839673866794e756a3173647a5642346b753178424248576d5178745472396a702f

Deployed Bytecode

0x6080604052600436106102465760003560e01c806370a08231116101395780639b19251a116100b6578063c002d23d1161007a578063c002d23d14610698578063c19d93fb146106ae578063c87b56dd146106d5578063e985e9c5146106f5578063f2fde38b1461073e578063f80f5dd51461075e57600080fd5b80639b19251a146105fd578063a22cb4651461062d578063aa1b103f1461064d578063ad570dd514610662578063b88d4fde1461067857600080fd5b80638a616bc0116100fd5780638a616bc01461057e5780638da4d3c91461059e5780638da5cb5b146105b457806395d89b41146105d25780639659867e146105e757600080fd5b806370a08231146104e9578063715018a61461050957806378c8cda71461051e5780637f41bf431461053e5780638545f4ea1461055e57600080fd5b80633ccfd60b116101c75780635944c7531161018b5780635944c753146104545780636352211e146104745780636447c35d146104945780636550385b146104b45780636c0360eb146104d457600080fd5b80633ccfd60b146103ca57806342842e0e146103df5780634e71d92d146103ff57806355f804b31461041457806356de96db1461043457600080fd5b80631249c58b1161020e5780631249c58b1461031c57806318160ddd1461032457806323b872dd1461034b5780632995d6c81461036b5780632a55205a1461038b57600080fd5b806301ffc9a71461024b57806304634d8d1461028057806306fdde03146102a2578063081812fc146102c4578063095ea7b3146102fc575b600080fd5b34801561025757600080fd5b5061026b6102663660046121c6565b61077e565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102a061029b366004612127565b61078f565b005b3480156102ae57600080fd5b506102b76107a5565b60405161027791906123ad565b3480156102d057600080fd5b506102e46102df36600461226a565b610837565b6040516001600160a01b039091168152602001610277565b34801561030857600080fd5b506102a06103173660046120fd565b61087b565b6102a0610909565b34801561033057600080fd5b5060015460005403600019015b604051908152602001610277565b34801561035757600080fd5b506102a0610366366004612009565b610b20565b34801561037757600080fd5b506102a061038636600461226a565b610b2b565b34801561039757600080fd5b506103ab6103a63660046122bf565b610c4b565b604080516001600160a01b039093168352602083019190915201610277565b3480156103d657600080fd5b506102a0610cf7565b3480156103eb57600080fd5b506102a06103fa366004612009565b610d8a565b34801561040b57600080fd5b506102a0610da5565b34801561042057600080fd5b506102a061042f366004612221565b610eea565b34801561044057600080fd5b506102a061044f366004612200565b610f05565b34801561046057600080fd5b506102a061046f366004612283565b610f34565b34801561048057600080fd5b506102e461048f36600461226a565b610f47565b3480156104a057600080fd5b506102a06104af366004612151565b610f59565b3480156104c057600080fd5b506102a06104cf36600461226a565b610fd3565b3480156104e057600080fd5b506102b7610fe0565b3480156104f557600080fd5b5061033d610504366004611fb4565b61106e565b34801561051557600080fd5b506102a06110bd565b34801561052a57600080fd5b506102a0610539366004611fb4565b6110cf565b34801561054a57600080fd5b506102a0610559366004612151565b611160565b34801561056a57600080fd5b506102a061057936600461226a565b6111da565b34801561058a57600080fd5b506102a061059936600461226a565b6111e7565b3480156105aa57600080fd5b5061033d60115481565b3480156105c057600080fd5b50600a546001600160a01b03166102e4565b3480156105de57600080fd5b506102b7611200565b3480156105f357600080fd5b5061033d60105481565b34801561060957600080fd5b5061026b610618366004611fb4565b600d6020526000908152604090205460ff1681565b34801561063957600080fd5b506102a06106483660046120c1565b61120f565b34801561065957600080fd5b506102a06112a5565b34801561066e57600080fd5b5061033d600b5481565b34801561068457600080fd5b506102a0610693366004612045565b6112b7565b3480156106a457600080fd5b5061033d600c5481565b3480156106ba57600080fd5b50600f546106c89060ff1681565b6040516102779190612385565b3480156106e157600080fd5b506102b76106f036600461226a565b611308565b34801561070157600080fd5b5061026b610710366004611fd6565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561074a57600080fd5b506102a0610759366004611fb4565b6113ab565b34801561076a57600080fd5b506102a0610779366004611fb4565b611421565b6000610789826114ad565b92915050565b6107976114d2565b6107a1828261152c565b5050565b6060600280546107b4906124d1565b80601f01602080910402602001604051908101604052809291908181526020018280546107e0906124d1565b801561082d5780601f106108025761010080835404028352916020019161082d565b820191906000526020600020905b81548152906001019060200180831161081057829003601f168201915b5050505050905090565b6000610842826115e6565b61085f576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061088682610f47565b9050806001600160a01b0316836001600160a01b031614156108bb5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906108db57506108d98133610710565b155b156108f9576040516367d9dca160e11b815260040160405180910390fd5b61090483838361161f565b505050565b6002600f5460ff1660048111156109225761092261253d565b148061094457506001600f5460ff1660048111156109425761094261253d565b145b6109955760405162461bcd60e51b815260206004820152601b60248201527f57756d626f20506173733a204d696e74204e6f7420416374697665000000000060448201526064015b60405180910390fd5b6001600f5460ff1660048111156109ae576109ae61253d565b1415610a0657336000908152600d602052604090205460ff16610a065760405162461bcd60e51b815260206004820152601060248201526f139bdd081a5b881dda1a5d195b1a5cdd60821b604482015260640161098c565b61030960105410610a595760405162461bcd60e51b815260206004820181905260248201527f57756d626f20506173733a204d696e7420537570706c79204578636565646564604482015260640161098c565b6002600f5460ff166004811115610a7257610a7261253d565b14610a7f57600b54610a83565b600c545b341015610ad25760405162461bcd60e51b815260206004820152601c60248201527f57756d626f20506173733a20496e73756666696369656e742045544800000000604482015260640161098c565b6001610add3361167b565b10610afa5760405162461bcd60e51b815260040161098c906123c0565b600160106000828254610b0d919061244c565b90915550610b1e90503360016116d1565b565b6109048383836116eb565b610b336114d2565b6004600f5460ff166004811115610b4c57610b4c61253d565b14610bb75760405162461bcd60e51b815260206004820152603560248201527f57756d626f20506173733a2043616e6e6f7420436c61696d20556e6d696e74656044820152746420546f6b656e732049662053616c65204c69766560581b606482015260840161098c565b610bc461030960de61244c565b6001546000548391900360001901610bdc919061244c565b1115610c2a5760405162461bcd60e51b815260206004820152601f60248201527f57756d626f20506173733a20546f74616c20537570706c79204d696e74656400604482015260640161098c565b610c4873823d8c84126da1756be69421c78482d0d24d907e826116d1565b50565b60008281526009602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610cc05750604080518082019091526008546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610cdf906001600160601b031687612486565b610ce99190612464565b915196919550909350505050565b610cff6114d2565b604051600090339047908381818185875af1925050503d8060008114610d41576040519150601f19603f3d011682016040523d82523d6000602084013e610d46565b606091505b5050905080610c485760405162461bcd60e51b815260206004820152601060248201526f2bb4ba34323930bb903330b4b632b21760811b604482015260640161098c565b610904838383604051806020016040528060008152506112b7565b6003600f5460ff166004811115610dbe57610dbe61253d565b14610e0b5760405162461bcd60e51b815260206004820152601c60248201527f57756d626f20506173733a20436c61696d204e6f742041637469766500000000604482015260640161098c565b60de60115410610e5d5760405162461bcd60e51b815260206004820181905260248201527f57756d626f20506173733a204d696e7420537570706c79204578636565646564604482015260640161098c565b6001610e683361167b565b10610e855760405162461bcd60e51b815260040161098c906123c0565b336000908152600d602052604090205460ff16610ed75760405162461bcd60e51b815260206004820152601060248201526f139bdd081a5b881dda1a5d195b1a5cdd60821b604482015260640161098c565b600160116000828254610b0d919061244c565b610ef26114d2565b80516107a190600e906020840190611e72565b610f0d6114d2565b600f805482919060ff19166001836004811115610f2c57610f2c61253d565b021790555050565b610f3c6114d2565b610904838383611901565b6000610f52826119cc565b5192915050565b610f616114d2565b60005b81811015610904576001600d6000858585818110610f8457610f84612553565b9050602002016020810190610f999190611fb4565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610fcb8161250c565b915050610f64565b610fdb6114d2565b600b55565b600e8054610fed906124d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611019906124d1565b80156110665780601f1061103b57610100808354040283529160200191611066565b820191906000526020600020905b81548152906001019060200180831161104957829003601f168201915b505050505081565b60006001600160a01b038216611097576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6110c56114d2565b610b1e6000611af5565b6110d76114d2565b6001600160a01b0381166000908152600d602052604090205460ff1661113f5760405162461bcd60e51b815260206004820152601960248201527f50726576696f7573206e6f7420696e2077686974656c69737400000000000000604482015260640161098c565b6001600160a01b03166000908152600d60205260409020805460ff19169055565b6111686114d2565b60005b81811015610904576000600d600085858581811061118b5761118b612553565b90506020020160208101906111a09190611fb4565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806111d28161250c565b91505061116b565b6111e26114d2565b600c55565b6111ef6114d2565b600090815260096020526040812055565b6060600380546107b4906124d1565b6001600160a01b0382163314156112395760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6112ad6114d2565b610b1e6000600855565b6112c28484846116eb565b6001600160a01b0383163b151580156112e457506112e284848484611b47565b155b15611302576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060611313826115e6565b6113775760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161098c565b6000611381611c3f565b905080604051602001611394919061230d565b604051602081830303815290604052915050919050565b6113b36114d2565b6001600160a01b0381166114185760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161098c565b610c4881611af5565b6114296114d2565b6001600160a01b0381166000908152600d602052604090205460ff16156114895760405162461bcd60e51b8152602060048201526014602482015273105b1c9958591e481a5b881dda1a5d195b1a5cdd60621b604482015260640161098c565b6001600160a01b03166000908152600d60205260409020805460ff19166001179055565b60006001600160e01b0319821663152a902d60e11b1480610789575061078982611c4e565b600a546001600160a01b03163314610b1e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161098c565b6127106001600160601b03821611156115575760405162461bcd60e51b815260040161098c90612402565b6001600160a01b0382166115ad5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640161098c565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600855565b6000816001111580156115fa575060005482105b8015610789575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006001600160a01b0382166116a4576040516335ebb31960e01b815260040160405180910390fd5b506001600160a01b0316600090815260056020526040902054600160401b900467ffffffffffffffff1690565b6107a1828260405180602001604052806000815250611c9e565b60006116f6826119cc565b80519091506000906001600160a01b0316336001600160a01b03161480611724575081516117249033610710565b8061173f57503361173484610837565b6001600160a01b0316145b90508061175f57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146117945760405162a1148160e81b815260040160405180910390fd5b6001600160a01b0384166117bb57604051633a954ecd60e21b815260040160405180910390fd5b6117cb600084846000015161161f565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102179092559086018083529120549091166118b7576000548110156118b7578251600082815260046020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b6127106001600160601b038216111561192c5760405162461bcd60e51b815260040161098c90612402565b6001600160a01b0382166119825760405162461bcd60e51b815260206004820152601b60248201527f455243323938313a20496e76616c696420706172616d65746572730000000000604482015260640161098c565b6040805180820182526001600160a01b0393841681526001600160601b0392831660208083019182526000968752600990529190942093519051909116600160a01b029116179055565b604080516060810182526000808252602082018190529181019190915281806001111580156119fc575060005481105b15611adc57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff16151591810182905290611ada5780516001600160a01b031615611a70579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215611ad5579392505050565b611a70565b505b604051636f96cda160e11b815260040160405180910390fd5b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611b7c903390899088908890600401612348565b602060405180830381600087803b158015611b9657600080fd5b505af1925050508015611bc6575060408051601f3d908101601f19168201909252611bc3918101906121e3565b60015b611c21573d808015611bf4576040519150601f19603f3d011682016040523d82523d6000602084013e611bf9565b606091505b508051611c19576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600e80546107b4906124d1565b60006001600160e01b031982166380ac58cd60e01b1480611c7f57506001600160e01b03198216635b5e139f60e01b145b8061078957506301ffc9a760e01b6001600160e01b0319831614610789565b61090483838360016000546001600160a01b038516611ccf57604051622e076360e81b815260040160405180910390fd5b83611ced5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b429092169190910217905580808501838015611d9a57506001600160a01b0387163b15155b15611e23575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611deb6000888480600101955088611b47565b611e08576040516368d2bf6b60e11b815260040160405180910390fd5b80821415611da0578260005414611e1e57600080fd5b611e69565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415611e24575b506000556118fa565b828054611e7e906124d1565b90600052602060002090601f016020900481019282611ea05760008555611ee6565b82601f10611eb957805160ff1916838001178555611ee6565b82800160010185558215611ee6579182015b82811115611ee6578251825591602001919060010190611ecb565b50611ef2929150611ef6565b5090565b5b80821115611ef25760008155600101611ef7565b600067ffffffffffffffff80841115611f2657611f26612569565b604051601f8501601f19908116603f01168101908282118183101715611f4e57611f4e612569565b81604052809350858152868686011115611f6757600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114611f9857600080fd5b919050565b80356001600160601b0381168114611f9857600080fd5b600060208284031215611fc657600080fd5b611fcf82611f81565b9392505050565b60008060408385031215611fe957600080fd5b611ff283611f81565b915061200060208401611f81565b90509250929050565b60008060006060848603121561201e57600080fd5b61202784611f81565b925061203560208501611f81565b9150604084013590509250925092565b6000806000806080858703121561205b57600080fd5b61206485611f81565b935061207260208601611f81565b925060408501359150606085013567ffffffffffffffff81111561209557600080fd5b8501601f810187136120a657600080fd5b6120b587823560208401611f0b565b91505092959194509250565b600080604083850312156120d457600080fd5b6120dd83611f81565b9150602083013580151581146120f257600080fd5b809150509250929050565b6000806040838503121561211057600080fd5b61211983611f81565b946020939093013593505050565b6000806040838503121561213a57600080fd5b61214383611f81565b915061200060208401611f9d565b6000806020838503121561216457600080fd5b823567ffffffffffffffff8082111561217c57600080fd5b818501915085601f83011261219057600080fd5b81358181111561219f57600080fd5b8660208260051b85010111156121b457600080fd5b60209290920196919550909350505050565b6000602082840312156121d857600080fd5b8135611fcf8161257f565b6000602082840312156121f557600080fd5b8151611fcf8161257f565b60006020828403121561221257600080fd5b813560058110611fcf57600080fd5b60006020828403121561223357600080fd5b813567ffffffffffffffff81111561224a57600080fd5b8201601f8101841361225b57600080fd5b611c3784823560208401611f0b565b60006020828403121561227c57600080fd5b5035919050565b60008060006060848603121561229857600080fd5b833592506122a860208501611f81565b91506122b660408501611f9d565b90509250925092565b600080604083850312156122d257600080fd5b50508035926020909101359150565b600081518084526122f98160208601602086016124a5565b601f01601f19169290920160200192915050565b6000825161231f8184602087016124a5565b6877756d626f7061737360b81b92019182525064173539b7b760d91b6009820152600e01919050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061237b908301846122e1565b9695505050505050565b60208101600583106123a757634e487b7160e01b600052602160045260246000fd5b91905290565b602081526000611fcf60208301846122e1565b60208082526022908201527f57756d626f20506173733a2045786365656473204d6178205065722057616c6c604082015261195d60f21b606082015260800190565b6020808252602a908201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646040820152692073616c65507269636560b01b606082015260800190565b6000821982111561245f5761245f612527565b500190565b60008261248157634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156124a0576124a0612527565b500290565b60005b838110156124c05781810151838201526020016124a8565b838111156113025750506000910152565b600181811c908216806124e557607f821691505b6020821081141561250657634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561252057612520612527565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610c4857600080fdfea2646970667358221220980190c452cd3f90854d243823d1ab1d5c86e855b9f3e6fc9694337714378c2564736f6c63430008070033

Deployed Bytecode Sourcemap

69491:5044:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74175:176;;;;;;;;;;-1:-1:-1;74175:176:0;;;;;:::i;:::-;;:::i;:::-;;;8176:14:1;;8169:22;8151:41;;8139:2;8124:18;74175:176:0;;;;;;;;73333:146;;;;;;;;;;-1:-1:-1;73333:146:0;;;;;:::i;:::-;;:::i;:::-;;29569:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;31072:204::-;;;;;;;;;;-1:-1:-1;31072:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7195:32:1;;;7177:51;;7165:2;7150:18;31072:204:0;7031:203:1;30635:371:0;;;;;;;;;;-1:-1:-1;30635:371:0;;;;;:::i;:::-;;:::i;70369:611::-;;;:::i;25431:303::-;;;;;;;;;;-1:-1:-1;25238:1:0;25685:12;25475:7;25669:13;:28;-1:-1:-1;;25669:46:0;25431:303;;;15231:25:1;;;15219:2;15204:18;25431:303:0;15085:177:1;31929:170:0;;;;;;;;;;-1:-1:-1;31929:170:0;;;;;:::i;:::-;;:::i;72390:349::-;;;;;;;;;;-1:-1:-1;72390:349:0;;;;;:::i;:::-;;:::i;56917:442::-;;;;;;;;;;-1:-1:-1;56917:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;7924:32:1;;;7906:51;;7988:2;7973:18;;7966:34;;;;7879:18;56917:442:0;7732:274:1;74359:173:0;;;;;;;;;;;;;:::i;32170:185::-;;;;;;;;;;-1:-1:-1;32170:185:0;;;;;:::i;:::-;;:::i;70988:410::-;;;;;;;;;;;;;:::i;72183:106::-;;;;;;;;;;-1:-1:-1;72183:106:0;;;;;:::i;:::-;;:::i;72297:85::-;;;;;;;;;;-1:-1:-1;72297:85:0;;;;;:::i;:::-;;:::i;73719:202::-;;;;;;;;;;-1:-1:-1;73719:202:0;;;;;:::i;:::-;;:::i;29378:124::-;;;;;;;;;;-1:-1:-1;29378:124:0;;;;;:::i;:::-;;:::i;71406:193::-;;;;;;;;;;-1:-1:-1;71406:193:0;;;;;:::i;:::-;;:::i;73152:109::-;;;;;;;;;;-1:-1:-1;73152:109:0;;;;;:::i;:::-;;:::i;69988:80::-;;;;;;;;;;;;;:::i;26551:206::-;;;;;;;;;;-1:-1:-1;26551:206:0;;;;;:::i;:::-;;:::i;53538:103::-;;;;;;;;;;;;;:::i;71996:179::-;;;;;;;;;;-1:-1:-1;71996:179:0;;;;;:::i;:::-;;:::i;71607:196::-;;;;;;;;;;-1:-1:-1;71607:196:0;;;;;:::i;:::-;;:::i;73046:98::-;;;;;;;;;;-1:-1:-1;73046:98:0;;;;;:::i;:::-;;:::i;73994:109::-;;;;;;;;;;-1:-1:-1;73994:109:0;;;;;:::i;:::-;;:::i;70154:29::-;;;;;;;;;;;;;;;;52890:87;;;;;;;;;;-1:-1:-1;52963:6:0;;-1:-1:-1;;;;;52963:6:0;52890:87;;29738:104;;;;;;;;;;;;;:::i;70119:28::-;;;;;;;;;;;;;;;;69801:41;;;;;;;;;;-1:-1:-1;69801:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;31348:279;;;;;;;;;;-1:-1:-1;31348:279:0;;;;;:::i;:::-;;:::i;73555:93::-;;;;;;;;;;;;;:::i;69580:43::-;;;;;;;;;;;;;;;;32426:369;;;;;;;;;;-1:-1:-1;32426:369:0;;;;;:::i;:::-;;:::i;69630:37::-;;;;;;;;;;;;;;;;70075;;;;;;;;;;-1:-1:-1;70075:37:0;;;;;;;;;;;;;;;:::i;72747:291::-;;;;;;;;;;-1:-1:-1;72747:291:0;;;;;:::i;:::-;;:::i;31698:164::-;;;;;;;;;;-1:-1:-1;31698:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;31819:25:0;;;31795:4;31819:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;31698:164;53796:201;;;;;;;;;;-1:-1:-1;53796:201:0;;;;;:::i;:::-;;:::i;71815:171::-;;;;;;;;;;-1:-1:-1;71815:171:0;;;;;:::i;:::-;;:::i;74175:176::-;74278:4;74307:36;74331:11;74307:23;:36::i;:::-;74300:43;74175:176;-1:-1:-1;;74175:176:0:o;73333:146::-;52776:13;:11;:13::i;:::-;73429:42:::1;73448:8;73458:12;73429:18;:42::i;:::-;73333:146:::0;;:::o;29569:100::-;29623:13;29656:5;29649:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29569:100;:::o;31072:204::-;31140:7;31165:16;31173:7;31165;:16::i;:::-;31160:64;;31190:34;;-1:-1:-1;;;31190:34:0;;;;;;;;;;;31160:64;-1:-1:-1;31244:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;31244:24:0;;31072:204::o;30635:371::-;30708:13;30724:24;30740:7;30724:15;:24::i;:::-;30708:40;;30769:5;-1:-1:-1;;;;;30763:11:0;:2;-1:-1:-1;;;;;30763:11:0;;30759:48;;;30783:24;;-1:-1:-1;;;30783:24:0;;;;;;;;;;;30759:48;19066:10;-1:-1:-1;;;;;30824:21:0;;;;;;:63;;-1:-1:-1;30850:37:0;30867:5;19066:10;31698:164;:::i;30850:37::-;30849:38;30824:63;30820:138;;;30911:35;;-1:-1:-1;;;30911:35:0;;;;;;;;;;;30820:138;30970:28;30979:2;30983:7;30992:5;30970:8;:28::i;:::-;30697:309;30635:371;;:::o;70369:611::-;70430:11;70421:5;;;;:20;;;;;;;;:::i;:::-;;:47;;;-1:-1:-1;70454:14:0;70445:5;;;;:23;;;;;;;;:::i;:::-;;70421:47;70413:87;;;;-1:-1:-1;;;70413:87:0;;10850:2:1;70413:87:0;;;10832:21:1;10889:2;10869:18;;;10862:30;10928:29;10908:18;;;10901:57;10975:18;;70413:87:0;;;;;;;;;70523:14;70514:5;;;;:23;;;;;;;;:::i;:::-;;70511:104;;;70571:10;70561:21;;;;:9;:21;;;;;;;;70553:50;;;;-1:-1:-1;;;70553:50:0;;11563:2:1;70553:50:0;;;11545:21:1;11602:2;11582:18;;;11575:30;-1:-1:-1;;;11621:18:1;;;11614:46;11677:18;;70553:50:0;11361:340:1;70553:50:0;69747:3;70633:9;;:23;70625:68;;;;-1:-1:-1;;;70625:68:0;;11908:2:1;70625:68:0;;;11890:21:1;;;11927:18;;;11920:30;11986:34;11966:18;;;11959:62;12038:18;;70625:68:0;11706:356:1;70625:68:0;70735:11;70726:5;;;;:20;;;;;;;;:::i;:::-;;:52;;70762:16;;70726:52;;;70749:10;;70726:52;70712:9;:67;;70704:108;;;;-1:-1:-1;;;70704:108:0;;12269:2:1;70704:108:0;;;12251:21:1;12308:2;12288:18;;;12281:30;12347;12327:18;;;12320:58;12395:18;;70704:108:0;12067:352:1;70704:108:0;69791:1;70831:25;70845:10;70831:13;:25::i;:::-;:42;70823:89;;;;-1:-1:-1;;;70823:89:0;;;;;;;:::i;:::-;70936:1;70923:9;;:14;;;;;;;:::i;:::-;;;;-1:-1:-1;70948:24:0;;-1:-1:-1;70958:10:0;70970:1;70948:9;:24::i;:::-;70369:611::o;31929:170::-;32063:28;32073:4;32079:2;32083:7;32063:9;:28::i;72390:349::-;52776:13;:11;:13::i;:::-;72484:12:::1;72475:5;::::0;::::1;;:21;::::0;::::1;;;;;;:::i;:::-;;72467:87;;;::::0;-1:-1:-1;;;72467:87:0;;10083:2:1;72467:87:0::1;::::0;::::1;10065:21:1::0;10122:2;10102:18;;;10095:30;10161:34;10141:18;;;10134:62;-1:-1:-1;;;10212:18:1;;;10205:51;10273:19;;72467:87:0::1;9881:417:1::0;72467:87:0::1;72597:26;69747:3;69706;72597:26;:::i;:::-;25238:1:::0;25685:12;25475:7;25669:13;72589:4;;25669:28;;-1:-1:-1;;25669:46:0;72573:20:::1;;;;:::i;:::-;:50;;72565:94;;;::::0;-1:-1:-1;;;72565:94:0;;13806:2:1;72565:94:0::1;::::0;::::1;13788:21:1::0;13845:2;13825:18;;;13818:30;13884:33;13864:18;;;13857:61;13935:18;;72565:94:0::1;13604:355:1::0;72565:94:0::1;72672:59;72682:42;72726:4;72672:9;:59::i;:::-;72390:349:::0;:::o;56917:442::-;57014:7;57072:27;;;:17;:27;;;;;;;;57043:56;;;;;;;;;-1:-1:-1;;;;;57043:56:0;;;;;-1:-1:-1;;;57043:56:0;;;-1:-1:-1;;;;;57043:56:0;;;;;;;;57014:7;;57112:92;;-1:-1:-1;57163:29:0;;;;;;;;;57173:19;57163:29;-1:-1:-1;;;;;57163:29:0;;;;-1:-1:-1;;;57163:29:0;;-1:-1:-1;;;;;57163:29:0;;;;;57112:92;57254:23;;;;57216:21;;57725:5;;57241:36;;-1:-1:-1;;;;;57241:36:0;:10;:36;:::i;:::-;57240:58;;;;:::i;:::-;57319:16;;;;;-1:-1:-1;56917:442:0;;-1:-1:-1;;;;56917:442:0:o;74359:173::-;52776:13;:11;:13::i;:::-;74428:49:::1;::::0;74410:12:::1;::::0;74428:10:::1;::::0;74451:21:::1;::::0;74410:12;74428:49;74410:12;74428:49;74451:21;74428:10;:49:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74409:68;;;74496:7;74488:36;;;::::0;-1:-1:-1;;;74488:36:0;;10505:2:1;74488:36:0::1;::::0;::::1;10487:21:1::0;10544:2;10524:18;;;10517:30;-1:-1:-1;;;10563:18:1;;;10556:46;10619:18;;74488:36:0::1;10303:340:1::0;32170:185:0;32308:39;32325:4;32331:2;32335:7;32308:39;;;;;;;;;;;;:16;:39::i;70988:410::-;71042:12;71033:5;;;;:21;;;;;;;;:::i;:::-;;71025:62;;;;-1:-1:-1;;;71025:62:0;;11206:2:1;71025:62:0;;;11188:21:1;11245:2;11225:18;;;11218:30;11284;11264:18;;;11257:58;11332:18;;71025:62:0;11004:352:1;71025:62:0;69706:3;71106:10;;:25;71098:70;;;;-1:-1:-1;;;71098:70:0;;11908:2:1;71098:70:0;;;11890:21:1;;;11927:18;;;11920:30;11986:34;11966:18;;;11959:62;12038:18;;71098:70:0;11706:356:1;71098:70:0;69791:1;71187:25;71201:10;71187:13;:25::i;:::-;:42;71179:89;;;;-1:-1:-1;;;71179:89:0;;;;;;;:::i;:::-;71297:10;71287:21;;;;:9;:21;;;;;;;;71279:50;;;;-1:-1:-1;;;71279:50:0;;11563:2:1;71279:50:0;;;11545:21:1;11602:2;11582:18;;;11575:30;-1:-1:-1;;;11621:18:1;;;11614:46;11677:18;;71279:50:0;11361:340:1;71279:50:0;71354:1;71340:10;;:15;;;;;;;:::i;72183:106::-;52776:13;:11;:13::i;:::-;72260:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;72297:85::-:0;52776:13;:11;:13::i;:::-;72360:5:::1;:14:::0;;72368:6;;72360:5;-1:-1:-1;;72360:14:0::1;::::0;72368:6;72360:14:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;72297:85:::0;:::o;73719:202::-;52776:13;:11;:13::i;:::-;73864:49:::1;73881:7;73890:8;73900:12;73864:16;:49::i;29378:124::-:0;29442:7;29469:20;29481:7;29469:11;:20::i;:::-;:25;;29378:124;-1:-1:-1;;29378:124:0:o;71406:193::-;52776:13;:11;:13::i;:::-;71493:9:::1;71488:104;71508:20:::0;;::::1;71488:104;;;71576:4;71550:9;:23;71560:9;;71570:1;71560:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;71550:23:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;71550:23:0;:30;;-1:-1:-1;;71550:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;71530:3;::::1;::::0;::::1;:::i;:::-;;;;71488:104;;73152:109:::0;52776:13;:11;:13::i;:::-;73226:16:::1;:27:::0;73152:109::o;69988:80::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26551:206::-;26615:7;-1:-1:-1;;;;;26639:19:0;;26635:60;;26667:28;;-1:-1:-1;;;26667:28:0;;;;;;;;;;;26635:60;-1:-1:-1;;;;;;26721:19:0;;;;;:12;:19;;;;;:27;;;;26551:206::o;53538:103::-;52776:13;:11;:13::i;:::-;53603:30:::1;53630:1;53603:18;:30::i;71996:179::-:0;52776:13;:11;:13::i;:::-;-1:-1:-1;;;;;72078:20:0;::::1;;::::0;;;:9:::1;:20;::::0;;;;;::::1;;72070:58;;;::::0;-1:-1:-1;;;72070:58:0;;9380:2:1;72070:58:0::1;::::0;::::1;9362:21:1::0;9419:2;9399:18;;;9392:30;9458:27;9438:18;;;9431:55;9503:18;;72070:58:0::1;9178:349:1::0;72070:58:0::1;-1:-1:-1::0;;;;;72139:20:0::1;72162:5;72139:20:::0;;;:9:::1;:20;::::0;;;;:28;;-1:-1:-1;;72139:28:0::1;::::0;;71996:179::o;71607:196::-;52776:13;:11;:13::i;:::-;71696:9:::1;71691:105;71711:20:::0;;::::1;71691:105;;;71779:5;71753:9;:23;71763:9;;71773:1;71763:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;71753:23:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;71753:23:0;:31;;-1:-1:-1;;71753:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;71733:3;::::1;::::0;::::1;:::i;:::-;;;;71691:105;;73046:98:::0;52776:13;:11;:13::i;:::-;73115:10:::1;:21:::0;73046:98::o;73994:109::-;52776:13;:11;:13::i;:::-;59373:26;;;;:17;:26;;;;;59366:33;72390:349::o;29738:104::-;29794:13;29827:7;29820:14;;;;;:::i;31348:279::-;-1:-1:-1;;;;;31439:24:0;;19066:10;31439:24;31435:54;;;31472:17;;-1:-1:-1;;;31472:17:0;;;;;;;;;;;31435:54;19066:10;31502:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;31502:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;31502:53:0;;;;;;;;;;31571:48;;8151:41:1;;;31502:42:0;;19066:10;31571:48;;8124:18:1;31571:48:0;;;;;;;31348:279;;:::o;73555:93::-;52776:13;:11;:13::i;:::-;73617:23:::1;58485:19:::0;;58478:26;58417:95;32426:369;32593:28;32603:4;32609:2;32613:7;32593:9;:28::i;:::-;-1:-1:-1;;;;;32636:13:0;;11276:19;:23;;32636:76;;;;;32656:56;32687:4;32693:2;32697:7;32706:5;32656:30;:56::i;:::-;32655:57;32636:76;32632:156;;;32736:40;;-1:-1:-1;;;32736:40:0;;;;;;;;;;;32632:156;32426:369;;;;:::o;72747:291::-;72813:13;72847:17;72855:8;72847:7;:17::i;:::-;72839:77;;;;-1:-1:-1;;;72839:77:0;;12987:2:1;72839:77:0;;;12969:21:1;13026:2;13006:18;;;12999:30;13065:34;13045:18;;;13038:62;-1:-1:-1;;;13116:18:1;;;13109:45;13171:19;;72839:77:0;12785:411:1;72839:77:0;72927:18;72948:10;:8;:10::i;:::-;72927:31;;73002:4;72985:44;;;;;;;;:::i;:::-;;;;;;;;;;;;;72971:59;;;72747:291;;;:::o;53796:201::-;52776:13;:11;:13::i;:::-;-1:-1:-1;;;;;53885:22:0;::::1;53877:73;;;::::0;-1:-1:-1;;;53877:73:0;;8973:2:1;53877:73:0::1;::::0;::::1;8955:21:1::0;9012:2;8992:18;;;8985:30;9051:34;9031:18;;;9024:62;-1:-1:-1;;;9102:18:1;;;9095:36;9148:19;;53877:73:0::1;8771:402:1::0;53877:73:0::1;53961:28;53980:8;53961:18;:28::i;71815:171::-:0;52776:13;:11;:13::i;:::-;-1:-1:-1;;;;;71895:20:0;::::1;;::::0;;;:9:::1;:20;::::0;;;;;::::1;;71894:21;71886:54;;;::::0;-1:-1:-1;;;71886:54:0;;9734:2:1;71886:54:0::1;::::0;::::1;9716:21:1::0;9773:2;9753:18;;;9746:30;-1:-1:-1;;;9792:18:1;;;9785:50;9852:18;;71886:54:0::1;9532:344:1::0;71886:54:0::1;-1:-1:-1::0;;;;;71951:20:0::1;;::::0;;;:9:::1;:20;::::0;;;;:27;;-1:-1:-1;;71951:27:0::1;71974:4;71951:27;::::0;;71815:171::o;56647:215::-;56749:4;-1:-1:-1;;;;;;56773:41:0;;-1:-1:-1;;;56773:41:0;;:81;;;56818:36;56842:11;56818:23;:36::i;53055:132::-;52963:6;;-1:-1:-1;;;;;52963:6:0;19066:10;53119:23;53111:68;;;;-1:-1:-1;;;53111:68:0;;12626:2:1;53111:68:0;;;12608:21:1;;;12645:18;;;12638:30;12704:34;12684:18;;;12677:62;12756:18;;53111:68:0;12424:356:1;58009:332:0;57725:5;-1:-1:-1;;;;;58112:33:0;;;;58104:88;;;;-1:-1:-1;;;58104:88:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;58211:22:0;;58203:60;;;;-1:-1:-1;;;58203:60:0;;14933:2:1;58203:60:0;;;14915:21:1;14972:2;14952:18;;;14945:30;15011:27;14991:18;;;14984:55;15056:18;;58203:60:0;14731:349:1;58203:60:0;58298:35;;;;;;;;;-1:-1:-1;;;;;58298:35:0;;;;;;-1:-1:-1;;;;;58298:35:0;;;;;;;;;;-1:-1:-1;;;58276:57:0;;;;:19;:57;58009:332::o;33050:187::-;33107:4;33150:7;25238:1;33131:26;;:53;;;;;33171:13;;33161:7;:23;33131:53;:98;;;;-1:-1:-1;;33202:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;33202:27:0;;;;33201:28;;33050:187::o;40661:196::-;40776:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;40776:29:0;-1:-1:-1;;;;;40776:29:0;;;;;;;;;40821:28;;40776:24;;40821:28;;;;;;;40661:196;;;:::o;26839:207::-;26900:7;-1:-1:-1;;;;;26924:19:0;;26920:59;;26952:27;;-1:-1:-1;;;26952:27:0;;;;;;;;;;;26920:59;-1:-1:-1;;;;;;27005:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;27005:32:0;;;;;26839:207::o;33245:104::-;33314:27;33324:2;33328:8;33314:27;;;;;;;;;;;;:9;:27::i;36163:2112::-;36278:35;36316:20;36328:7;36316:11;:20::i;:::-;36391:18;;36278:58;;-1:-1:-1;36349:22:0;;-1:-1:-1;;;;;36375:34:0;19066:10;-1:-1:-1;;;;;36375:34:0;;:101;;;-1:-1:-1;36443:18:0;;36426:50;;19066:10;31698:164;:::i;36426:50::-;36375:154;;;-1:-1:-1;19066:10:0;36493:20;36505:7;36493:11;:20::i;:::-;-1:-1:-1;;;;;36493:36:0;;36375:154;36349:181;;36548:17;36543:66;;36574:35;;-1:-1:-1;;;36574:35:0;;;;;;;;;;;36543:66;36646:4;-1:-1:-1;;;;;36624:26:0;:13;:18;;;-1:-1:-1;;;;;36624:26:0;;36620:67;;36659:28;;-1:-1:-1;;;36659:28:0;;;;;;;;;;;36620:67;-1:-1:-1;;;;;36702:16:0;;36698:52;;36727:23;;-1:-1:-1;;;36727:23:0;;;;;;;;;;;36698:52;36871:49;36888:1;36892:7;36901:13;:18;;;36871:8;:49::i;:::-;-1:-1:-1;;;;;37216:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;37216:31:0;;;;;;;-1:-1:-1;;37216:31:0;;;;;;;37262:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;37262:29:0;;;;;;;;;;;37308:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;37353:61:0;;;;-1:-1:-1;;;37398:15:0;37353:61;;;;;;;;;;;37688:11;;;37718:24;;;;;:29;37688:11;;37718:29;37714:445;;37943:13;;37929:11;:27;37925:219;;;38013:18;;;37981:24;;;:11;:24;;;;;;;;:50;;38096:28;;;;38054:70;;-1:-1:-1;;;38054:70:0;-1:-1:-1;;;;;;38054:70:0;;;-1:-1:-1;;;;;37981:50:0;;;38054:70;;;;;;;37925:219;37191:979;38206:7;38202:2;-1:-1:-1;;;;;38187:27:0;38196:4;-1:-1:-1;;;;;38187:27:0;;;;;;;;;;;38225:42;36267:2008;;36163:2112;;;:::o;58792:390::-;57725:5;-1:-1:-1;;;;;58944:33:0;;;;58936:88;;;;-1:-1:-1;;;58936:88:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;59043:22:0;;59035:62;;;;-1:-1:-1;;;59035:62:0;;14166:2:1;59035:62:0;;;14148:21:1;14205:2;14185:18;;;14178:30;14244:29;14224:18;;;14217:57;14291:18;;59035:62:0;13964:351:1;59035:62:0;59139:35;;;;;;;;-1:-1:-1;;;;;59139:35:0;;;;;-1:-1:-1;;;;;59139:35:0;;;;;;;;;;-1:-1:-1;59110:26:0;;;:17;:26;;;;;;:64;;;;;;;-1:-1:-1;;;59110:64:0;;;;;;58792:390::o;28208:1108::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;28318:7:0;;25238:1;28367:23;;:47;;;;;28401:13;;28394:4;:20;28367:47;28363:886;;;28435:31;28469:17;;;:11;:17;;;;;;;;;28435:51;;;;;;;;;-1:-1:-1;;;;;28435:51:0;;;;-1:-1:-1;;;28435:51:0;;;;;;;;;;;-1:-1:-1;;;28435:51:0;;;;;;;;;;;;;;28505:729;;28555:14;;-1:-1:-1;;;;;28555:28:0;;28551:101;;28619:9;28208:1108;-1:-1:-1;;;28208:1108:0:o;28551:101::-;-1:-1:-1;;;28994:6:0;29039:17;;;;:11;:17;;;;;;;;;29027:29;;;;;;;;;-1:-1:-1;;;;;29027:29:0;;;;;-1:-1:-1;;;29027:29:0;;;;;;;;;;;-1:-1:-1;;;29027:29:0;;;;;;;;;;;;;29087:28;29083:109;;29155:9;28208:1108;-1:-1:-1;;;28208:1108:0:o;29083:109::-;28954:261;;;28416:833;28363:886;29277:31;;-1:-1:-1;;;29277:31:0;;;;;;;;;;;54157:191;54250:6;;;-1:-1:-1;;;;;54267:17:0;;;-1:-1:-1;;;;;;54267:17:0;;;;;;;54300:40;;54250:6;;;54267:17;54250:6;;54300:40;;54231:16;;54300:40;54220:128;54157:191;:::o;41349:667::-;41533:72;;-1:-1:-1;;;41533:72:0;;41512:4;;-1:-1:-1;;;;;41533:36:0;;;;;:72;;19066:10;;41584:4;;41590:7;;41599:5;;41533:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41533:72:0;;;;;;;;-1:-1:-1;;41533:72:0;;;;;;;;;;;;:::i;:::-;;;41529:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41767:13:0;;41763:235;;41813:40;;-1:-1:-1;;;41813:40:0;;;;;;;;;;;41763:235;41956:6;41950:13;41941:6;41937:2;41933:15;41926:38;41529:480;-1:-1:-1;;;;;;41652:55:0;-1:-1:-1;;;41652:55:0;;-1:-1:-1;41529:480:0;41349:667;;;;;;:::o;70253:108::-;70313:13;70346:7;70339:14;;;;;:::i;26182:305::-;26284:4;-1:-1:-1;;;;;;26321:40:0;;-1:-1:-1;;;26321:40:0;;:105;;-1:-1:-1;;;;;;;26378:48:0;;-1:-1:-1;;;26378:48:0;26321:105;:158;;;-1:-1:-1;;;;;;;;;;1850:40:0;;;26443:36;1741:157;33712:163;33835:32;33841:2;33845:8;33855:5;33862:4;34273:20;34296:13;-1:-1:-1;;;;;34324:16:0;;34320:48;;34349:19;;-1:-1:-1;;;34349:19:0;;;;;;;;;;;34320:48;34383:13;34379:44;;34405:18;;-1:-1:-1;;;34405:18:0;;;;;;;;;;;34379:44;-1:-1:-1;;;;;34774:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;34833:49:0;;34774:44;;;;;;;;34833:49;;;-1:-1:-1;;;;;34774:44:0;;;;;;34833:49;;;;;;;;;;;;;;;;34899:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;34949:66:0;;;;-1:-1:-1;;;34999:15:0;34949:66;;;;;;;;;;34899:25;35096:23;;;35140:4;:23;;;;-1:-1:-1;;;;;;35148:13:0;;11276:19;:23;;35148:15;35136:641;;;35184:314;35215:38;;35240:12;;-1:-1:-1;;;;;35215:38:0;;;35232:1;;35215:38;;35232:1;;35215:38;35281:69;35320:1;35324:2;35328:14;;;;;;35344:5;35281:30;:69::i;:::-;35276:174;;35386:40;;-1:-1:-1;;;35386:40:0;;;;;;;;;;;35276:174;35493:3;35477:12;:19;;35184:314;;35579:12;35562:13;;:29;35558:43;;35593:8;;;35558:43;35136:641;;;35642:120;35673:40;;35698:14;;;;;-1:-1:-1;;;;;35673:40:0;;;35690:1;;35673:40;;35690:1;;35673:40;35757:3;35741:12;:19;;35642:120;;35136:641;-1:-1:-1;35791:13:0;:28;35841:60;32426:369;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:179::-;895:20;;-1:-1:-1;;;;;944:38:1;;934:49;;924:77;;997:1;994;987:12;1012:186;1071:6;1124:2;1112:9;1103:7;1099:23;1095:32;1092:52;;;1140:1;1137;1130:12;1092:52;1163:29;1182:9;1163:29;:::i;:::-;1153:39;1012:186;-1:-1:-1;;;1012:186:1:o;1203:260::-;1271:6;1279;1332:2;1320:9;1311:7;1307:23;1303:32;1300:52;;;1348:1;1345;1338:12;1300:52;1371:29;1390:9;1371:29;:::i;:::-;1361:39;;1419:38;1453:2;1442:9;1438:18;1419:38;:::i;:::-;1409:48;;1203:260;;;;;:::o;1468:328::-;1545:6;1553;1561;1614:2;1602:9;1593:7;1589:23;1585:32;1582:52;;;1630:1;1627;1620:12;1582:52;1653:29;1672:9;1653:29;:::i;:::-;1643:39;;1701:38;1735:2;1724:9;1720:18;1701:38;:::i;:::-;1691:48;;1786:2;1775:9;1771:18;1758:32;1748:42;;1468:328;;;;;:::o;1801:666::-;1896:6;1904;1912;1920;1973:3;1961:9;1952:7;1948:23;1944:33;1941:53;;;1990:1;1987;1980:12;1941:53;2013:29;2032:9;2013:29;:::i;:::-;2003:39;;2061:38;2095:2;2084:9;2080:18;2061:38;:::i;:::-;2051:48;;2146:2;2135:9;2131:18;2118:32;2108:42;;2201:2;2190:9;2186:18;2173:32;2228:18;2220:6;2217:30;2214:50;;;2260:1;2257;2250:12;2214:50;2283:22;;2336:4;2328:13;;2324:27;-1:-1:-1;2314:55:1;;2365:1;2362;2355:12;2314:55;2388:73;2453:7;2448:2;2435:16;2430:2;2426;2422:11;2388:73;:::i;:::-;2378:83;;;1801:666;;;;;;;:::o;2472:347::-;2537:6;2545;2598:2;2586:9;2577:7;2573:23;2569:32;2566:52;;;2614:1;2611;2604:12;2566:52;2637:29;2656:9;2637:29;:::i;:::-;2627:39;;2716:2;2705:9;2701:18;2688:32;2763:5;2756:13;2749:21;2742:5;2739:32;2729:60;;2785:1;2782;2775:12;2729:60;2808:5;2798:15;;;2472:347;;;;;:::o;2824:254::-;2892:6;2900;2953:2;2941:9;2932:7;2928:23;2924:32;2921:52;;;2969:1;2966;2959:12;2921:52;2992:29;3011:9;2992:29;:::i;:::-;2982:39;3068:2;3053:18;;;;3040:32;;-1:-1:-1;;;2824:254:1:o;3083:258::-;3150:6;3158;3211:2;3199:9;3190:7;3186:23;3182:32;3179:52;;;3227:1;3224;3217:12;3179:52;3250:29;3269:9;3250:29;:::i;:::-;3240:39;;3298:37;3331:2;3320:9;3316:18;3298:37;:::i;3346:615::-;3432:6;3440;3493:2;3481:9;3472:7;3468:23;3464:32;3461:52;;;3509:1;3506;3499:12;3461:52;3549:9;3536:23;3578:18;3619:2;3611:6;3608:14;3605:34;;;3635:1;3632;3625:12;3605:34;3673:6;3662:9;3658:22;3648:32;;3718:7;3711:4;3707:2;3703:13;3699:27;3689:55;;3740:1;3737;3730:12;3689:55;3780:2;3767:16;3806:2;3798:6;3795:14;3792:34;;;3822:1;3819;3812:12;3792:34;3875:7;3870:2;3860:6;3857:1;3853:14;3849:2;3845:23;3841:32;3838:45;3835:65;;;3896:1;3893;3886:12;3835:65;3927:2;3919:11;;;;;3949:6;;-1:-1:-1;3346:615:1;;-1:-1:-1;;;;3346:615:1:o;3966:245::-;4024:6;4077:2;4065:9;4056:7;4052:23;4048:32;4045:52;;;4093:1;4090;4083:12;4045:52;4132:9;4119:23;4151:30;4175:5;4151:30;:::i;4216:249::-;4285:6;4338:2;4326:9;4317:7;4313:23;4309:32;4306:52;;;4354:1;4351;4344:12;4306:52;4386:9;4380:16;4405:30;4429:5;4405:30;:::i;4470:267::-;4540:6;4593:2;4581:9;4572:7;4568:23;4564:32;4561:52;;;4609:1;4606;4599:12;4561:52;4648:9;4635:23;4687:1;4680:5;4677:12;4667:40;;4703:1;4700;4693:12;4742:450;4811:6;4864:2;4852:9;4843:7;4839:23;4835:32;4832:52;;;4880:1;4877;4870:12;4832:52;4920:9;4907:23;4953:18;4945:6;4942:30;4939:50;;;4985:1;4982;4975:12;4939:50;5008:22;;5061:4;5053:13;;5049:27;-1:-1:-1;5039:55:1;;5090:1;5087;5080:12;5039:55;5113:73;5178:7;5173:2;5160:16;5155:2;5151;5147:11;5113:73;:::i;5197:180::-;5256:6;5309:2;5297:9;5288:7;5284:23;5280:32;5277:52;;;5325:1;5322;5315:12;5277:52;-1:-1:-1;5348:23:1;;5197:180;-1:-1:-1;5197:180:1:o;5382:326::-;5458:6;5466;5474;5527:2;5515:9;5506:7;5502:23;5498:32;5495:52;;;5543:1;5540;5533:12;5495:52;5579:9;5566:23;5556:33;;5608:38;5642:2;5631:9;5627:18;5608:38;:::i;:::-;5598:48;;5665:37;5698:2;5687:9;5683:18;5665:37;:::i;:::-;5655:47;;5382:326;;;;;:::o;5713:248::-;5781:6;5789;5842:2;5830:9;5821:7;5817:23;5813:32;5810:52;;;5858:1;5855;5848:12;5810:52;-1:-1:-1;;5881:23:1;;;5951:2;5936:18;;;5923:32;;-1:-1:-1;5713:248:1:o;5966:257::-;6007:3;6045:5;6039:12;6072:6;6067:3;6060:19;6088:63;6144:6;6137:4;6132:3;6128:14;6121:4;6114:5;6110:16;6088:63;:::i;:::-;6205:2;6184:15;-1:-1:-1;;6180:29:1;6171:39;;;;6212:4;6167:50;;5966:257;-1:-1:-1;;5966:257:1:o;6228:588::-;6561:3;6599:6;6593:13;6615:53;6661:6;6656:3;6649:4;6641:6;6637:17;6615:53;:::i;:::-;-1:-1:-1;;;6690:16:1;;6715:26;;;-1:-1:-1;;;;6768:1:1;6757:13;;6750:30;6807:2;6796:14;;6228:588;-1:-1:-1;6228:588:1:o;7239:488::-;-1:-1:-1;;;;;7508:15:1;;;7490:34;;7560:15;;7555:2;7540:18;;7533:43;7607:2;7592:18;;7585:34;;;7655:3;7650:2;7635:18;;7628:31;;;7433:4;;7676:45;;7701:19;;7693:6;7676:45;:::i;:::-;7668:53;7239:488;-1:-1:-1;;;;;;7239:488:1:o;8203:339::-;8346:2;8331:18;;8379:1;8368:13;;8358:144;;8424:10;8419:3;8415:20;8412:1;8405:31;8459:4;8456:1;8449:15;8487:4;8484:1;8477:15;8358:144;8511:25;;;8203:339;:::o;8547:219::-;8696:2;8685:9;8678:21;8659:4;8716:44;8756:2;8745:9;8741:18;8733:6;8716:44;:::i;13201:398::-;13403:2;13385:21;;;13442:2;13422:18;;;13415:30;13481:34;13476:2;13461:18;;13454:62;-1:-1:-1;;;13547:2:1;13532:18;;13525:32;13589:3;13574:19;;13201:398::o;14320:406::-;14522:2;14504:21;;;14561:2;14541:18;;;14534:30;14600:34;14595:2;14580:18;;14573:62;-1:-1:-1;;;14666:2:1;14651:18;;14644:40;14716:3;14701:19;;14320:406::o;15267:128::-;15307:3;15338:1;15334:6;15331:1;15328:13;15325:39;;;15344:18;;:::i;:::-;-1:-1:-1;15380:9:1;;15267:128::o;15400:217::-;15440:1;15466;15456:132;;15510:10;15505:3;15501:20;15498:1;15491:31;15545:4;15542:1;15535:15;15573:4;15570:1;15563:15;15456:132;-1:-1:-1;15602:9:1;;15400:217::o;15622:168::-;15662:7;15728:1;15724;15720:6;15716:14;15713:1;15710:21;15705:1;15698:9;15691:17;15687:45;15684:71;;;15735:18;;:::i;:::-;-1:-1:-1;15775:9:1;;15622:168::o;15795:258::-;15867:1;15877:113;15891:6;15888:1;15885:13;15877:113;;;15967:11;;;15961:18;15948:11;;;15941:39;15913:2;15906:10;15877:113;;;16008:6;16005:1;16002:13;15999:48;;;-1:-1:-1;;16043:1:1;16025:16;;16018:27;15795:258::o;16058:380::-;16137:1;16133:12;;;;16180;;;16201:61;;16255:4;16247:6;16243:17;16233:27;;16201:61;16308:2;16300:6;16297:14;16277:18;16274:38;16271:161;;;16354:10;16349:3;16345:20;16342:1;16335:31;16389:4;16386:1;16379:15;16417:4;16414:1;16407:15;16271:161;;16058:380;;;:::o;16443:135::-;16482:3;-1:-1:-1;;16503:17:1;;16500:43;;;16523:18;;:::i;:::-;-1:-1:-1;16570:1:1;16559:13;;16443:135::o;16583:127::-;16644:10;16639:3;16635:20;16632:1;16625:31;16675:4;16672:1;16665:15;16699:4;16696:1;16689:15;16715:127;16776:10;16771:3;16767:20;16764:1;16757:31;16807:4;16804:1;16797:15;16831:4;16828:1;16821:15;16847:127;16908:10;16903:3;16899:20;16896:1;16889:31;16939:4;16936:1;16929:15;16963:4;16960:1;16953:15;16979:127;17040:10;17035:3;17031:20;17028:1;17021:31;17071:4;17068:1;17061:15;17095:4;17092:1;17085:15;17111:131;-1:-1:-1;;;;;;17185:32:1;;17175:43;;17165:71;;17232:1;17229;17222:12

Swarm Source

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