ETH Price: $3,445.32 (-1.22%)
Gas: 9 Gwei

Token

Shinobros (SNB)
 

Overview

Max Total Supply

167 SNB

Holders

118

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 SNB
0x0e77213d90c489f49d0ff375b2096416f721c181
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ShinobrosNFT

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: contracts/Shinobros.sol


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 OwnerQueryForNonexistentToken();
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 0;
    }

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

contract ShinobrosNFT is ERC721A, Ownable, ReentrancyGuard {
    using Strings for uint256;

    // TEAM
    address public team1 = 0xeFD08d539D3A23AAd050d63cA3F1d6bAdA97987D;
    address public team2 = 0x57196DCEC6A3E9c99E64f870F15108A61c18852F;
    address public team3 = 0xdf1fb601D1008435e705300Bb7a313fA6457bEAE;
    address public team4 = 0x13998D044A7d576D76FDa3BA294390BC49d22eeE;
    address public team5 = 0x3B85e28a6842ea32F546D15a61beA335FA923861;
    address public team6 = 0x709c8a4c1fB60DB523cECd19652C9296ea7438B5;

    // METADATA
    string public baseURI;
    string public baseExtension = ".json";
    string public notRevealedUri = "ipfs://QmWZv93HoSi9RrctPCHuewDLkYx4sX4hZ928T5sPVbJ8LB";

    // SUPPLY
    uint256 public maxSupply = 5000;

    // MINT
    uint256 public cost = 0.135 ether;
    uint256 public maxMintAmount = 5;

    // Project steps
    bool public paused = true;
    bool public revealed = false;
    bool public onlyWhitelisted = true;

    // WHITELIST
    mapping(address => bool) public whitelist;
    uint256 public nftPerAddressLimit = 3;

    constructor() ERC721A("Shinobros", "SNB") {
    }

    // public
    function mint(uint256 _mintAmount) public payable nonReentrant {
        require(!paused, "the contract is paused, mint is disabled");
        require(
            _mintAmount > 0 && _mintAmount <= maxMintAmount,
            "Invalid mint amount"
        );

        // Verify mint supply
        require(
            _totalMinted() + _mintAmount <= maxSupply,
            "Not enough Shinobros available"
        );

        if (onlyWhitelisted == true) {
            require(whitelist[msg.sender] == true, "User is not whitelisted");
            require(
                _numberMinted(msg.sender) + _mintAmount <= nftPerAddressLimit,
                "Mint amount exceed your WL limit."
            );
        }
        require(msg.value >= cost * _mintAmount, "Insufficient funds");
        _safeMint(msg.sender, _mintAmount);
        refundIfOver(cost * _mintAmount);
    }
    
    function refundIfOver(uint256 price) private {
        if (msg.value > price) {
            payable(msg.sender).transfer(msg.value - price);
        }
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );
        if (revealed == false) {
            return notRevealedUri;
        }
        return
            bytes(baseURI).length > 0
                ? string(
                    abi.encodePacked(baseURI, tokenId.toString(), baseExtension)
                )
                : "";
    }

    //only owner
    function giveMint(uint256 _mintAmount, address _to) public onlyOwner {   
        require(
            _mintAmount > 0 && _mintAmount <= maxMintAmount,
            "Invalid mint amount"
        );
        require(
            _totalMinted() + _mintAmount <= maxSupply,
            "Not enough Shinobros available"
        );
        require(_to == address(_to), "Not a valid address");
        _safeMint(_to, _mintAmount);
    }

    function reveal(string memory _baseURI) public onlyOwner {
        baseURI = _baseURI;
        revealed = true;
        paused = true;
    }

    function emergencyWithdraw() external onlyOwner {
        (bool emergencyWithdrawStatus, ) = team1.call{
            value: address(this).balance
        }("");
        require(emergencyWithdrawStatus, "Failed Emergency Withdraw");
    }

    function withdraw() external onlyOwner {
        require(address(this).balance > 0, "Not enough ether to withdraw");
        uint256 walletBalance = address(this).balance;

        (bool withdraw_1, ) = team1.call{value: (walletBalance * 225) / 1000}("");
        (bool withdraw_2, ) = team2.call{value: (walletBalance * 225) / 1000}("");
        (bool withdraw_3, ) = team3.call{value: (walletBalance * 225) / 1000}("");
        (bool withdraw_4, ) = team4.call{value: (walletBalance * 225) / 1000}("");
        (bool withdraw_5, ) = team5.call{value: (walletBalance * 40) / 1000}("");
        (bool withdraw_6, ) = team6.call{value: address(this).balance}(""); // 60

        require(withdraw_1 && withdraw_2 && withdraw_3 && withdraw_4 && withdraw_5 && withdraw_6, "Failed withdraw");
    }

    function finalize() external onlyOwner {
        selfdestruct(payable(owner()));
    }
    
    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }

    // SETTERS
    function whitelistAdd(address[] calldata whitelistAddresses)
        external
        onlyOwner
    {
        for (uint256 i; i < whitelistAddresses.length; i++) {
            whitelist[whitelistAddresses[i]] = true;
        }
    }

    function whitelistRemove(address[] calldata whitelistAddresses)
        external
        onlyOwner
    {
        for (uint256 i; i < whitelistAddresses.length; i++) {
            whitelist[whitelistAddresses[i]] = false;
        }
    }

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

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

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

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

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

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

    function pause(bool _state) public onlyOwner {
        paused = _state;
    }

    function setOnlyWhitelisted(bool _state) public onlyOwner {
        onlyWhitelisted = _state;
    }
}

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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finalize","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":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"giveMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newNftPerAddressLimit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"team1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"team2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"team3","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"team4","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"team5","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"team6","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[{"internalType":"address[]","name":"whitelistAddresses","type":"address[]"}],"name":"whitelistAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"whitelistAddresses","type":"address[]"}],"name":"whitelistRemove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600a80546001600160a01b031990811673efd08d539d3a23aad050d63ca3f1d6bada97987d17909155600b805482167357196dcec6a3e9c99e64f870f15108a61c18852f179055600c8054821673df1fb601d1008435e705300bb7a313fa6457beae179055600d805482167313998d044a7d576d76fda3ba294390bc49d22eee179055600e80548216733b85e28a6842ea32f546d15a61bea335fa923861179055600f805490911673709c8a4c1fb60db523cecd19652c9296ea7438b517905560c06040526005608081905264173539b7b760d91b60a0908152620000e8916011919062000227565b5060405180606001604052806035815260200162002d68603591398051620001199160129160209091019062000227565b506113886013556701df9dc8e4ad800060145560056015556016805462ffffff19166201000117905560036018553480156200015457600080fd5b5060408051808201825260098152685368696e6f62726f7360b81b60208083019182528351808501909452600384526229a72160e91b908401528151919291620001a19160029162000227565b508051620001b790600390602084019062000227565b5050600160005550620001ca33620001d5565b60016009556200030a565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200023590620002cd565b90600052602060002090601f016020900481019282620002595760008555620002a4565b82601f106200027457805160ff1916838001178555620002a4565b82800160010185558215620002a4579182015b82811115620002a457825182559160200191906001019062000287565b50620002b2929150620002b6565b5090565b5b80821115620002b25760008155600101620002b7565b600181811c90821680620002e257607f821691505b602082108114156200030457634e487b7160e01b600052602260045260246000fd5b50919050565b612a4e806200031a6000396000f3fe6080604052600436106102c95760003560e01c80636c0360eb11610175578063b88d4fde116100dc578063d5abeb0111610095578063e612c0ad1161006f578063e612c0ad14610844578063e985e9c514610864578063f2c4ce1e146108ad578063f2fde38b146108cd57600080fd5b8063d5abeb01146107f9578063da3ef23f1461080f578063db2e21bc1461082f57600080fd5b8063b88d4fde1461074e578063ba7d2c761461076e578063c668286214610784578063c87b56dd14610799578063d0eb26b0146107b9578063d53f6977146107d957600080fd5b806395d89b411161012e57806395d89b41146106965780639b19251a146106ab5780639c70b512146106db5780639cf94943146106fb578063a0712d681461071b578063a22cb4651461072e57600080fd5b80636c0360eb146105ee57806370a0823114610603578063715018a6146106235780637f00c7a6146106385780638c8d2ede146106585780638da5cb5b1461067857600080fd5b80632a404bb3116102345780634bb278f3116101ed5780635566136a116101c75780635566136a1461057457806355f804b3146105945780635c975abb146105b45780636352211e146105ce57600080fd5b80634bb278f3146105205780634c26124714610535578063518302271461055557600080fd5b80632a404bb31461046b57806338b105681461048b5780633c952764146104ab5780633ccfd60b146104cb57806342842e0e146104e057806344a0d68a1461050057600080fd5b80630c82b942116102865780630c82b942146103b457806313faede6146103d457806318160ddd146103f8578063239c70ae1461041557806323b872dd1461042b5780632977363d1461044b57600080fd5b806301ffc9a7146102ce57806302329a291461030357806306fdde0314610325578063081812fc14610347578063081c8c441461037f578063095ea7b314610394575b600080fd5b3480156102da57600080fd5b506102ee6102e9366004612694565b6108ed565b60405190151581526020015b60405180910390f35b34801561030f57600080fd5b5061032361031e36600461267a565b61093f565b005b34801561033157600080fd5b5061033a610985565b6040516102fa9190612880565b34801561035357600080fd5b50610367610362366004612712565b610a17565b6040516001600160a01b0390911681526020016102fa565b34801561038b57600080fd5b5061033a610a5b565b3480156103a057600080fd5b506103236103af3660046125e1565b610ae9565b3480156103c057600080fd5b506103236103cf36600461260a565b610b77565b3480156103e057600080fd5b506103ea60145481565b6040519081526020016102fa565b34801561040457600080fd5b5060015460005403600019016103ea565b34801561042157600080fd5b506103ea60155481565b34801561043757600080fd5b50610323610446366004612504565b610c21565b34801561045757600080fd5b5061032361046636600461272a565b610c2c565b34801561047757600080fd5b50600e54610367906001600160a01b031681565b34801561049757600080fd5b50600c54610367906001600160a01b031681565b3480156104b757600080fd5b506103236104c636600461267a565b610d21565b3480156104d757600080fd5b50610323610d67565b3480156104ec57600080fd5b506103236104fb366004612504565b6110d1565b34801561050c57600080fd5b5061032361051b366004612712565b6110ec565b34801561052c57600080fd5b5061032361111b565b34801561054157600080fd5b506103236105503660046126cc565b611153565b34801561056157600080fd5b506016546102ee90610100900460ff1681565b34801561058057600080fd5b50600f54610367906001600160a01b031681565b3480156105a057600080fd5b506103236105af3660046126cc565b6111a3565b3480156105c057600080fd5b506016546102ee9060ff1681565b3480156105da57600080fd5b506103676105e9366004612712565b6111e0565b3480156105fa57600080fd5b5061033a6111f2565b34801561060f57600080fd5b506103ea61061e3660046124b1565b6111ff565b34801561062f57600080fd5b5061032361124e565b34801561064457600080fd5b50610323610653366004612712565b611284565b34801561066457600080fd5b50600a54610367906001600160a01b031681565b34801561068457600080fd5b506008546001600160a01b0316610367565b3480156106a257600080fd5b5061033a6112b3565b3480156106b757600080fd5b506102ee6106c63660046124b1565b60176020526000908152604090205460ff1681565b3480156106e757600080fd5b506016546102ee9062010000900460ff1681565b34801561070757600080fd5b5061032361071636600461260a565b6112c2565b610323610729366004612712565b61136c565b34801561073a57600080fd5b506103236107493660046125b8565b611648565b34801561075a57600080fd5b5061032361076936600461253f565b6116de565b34801561077a57600080fd5b506103ea60185481565b34801561079057600080fd5b5061033a61172f565b3480156107a557600080fd5b5061033a6107b4366004612712565b61173c565b3480156107c557600080fd5b506103236107d4366004612712565b6118ab565b3480156107e557600080fd5b50600d54610367906001600160a01b031681565b34801561080557600080fd5b506103ea60135481565b34801561081b57600080fd5b5061032361082a3660046126cc565b6118da565b34801561083b57600080fd5b50610323611917565b34801561085057600080fd5b50600b54610367906001600160a01b031681565b34801561087057600080fd5b506102ee61087f3660046124d2565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156108b957600080fd5b506103236108c83660046126cc565b6119e7565b3480156108d957600080fd5b506103236108e83660046124b1565b611a24565b60006001600160e01b031982166380ac58cd60e01b148061091e57506001600160e01b03198216635b5e139f60e01b145b8061093957506301ffc9a760e01b6001600160e01b03198316145b92915050565b6008546001600160a01b031633146109725760405162461bcd60e51b815260040161096990612893565b60405180910390fd5b6016805460ff1916911515919091179055565b60606002805461099490612956565b80601f01602080910402602001604051908101604052809291908181526020018280546109c090612956565b8015610a0d5780601f106109e257610100808354040283529160200191610a0d565b820191906000526020600020905b8154815290600101906020018083116109f057829003601f168201915b5050505050905090565b6000610a2282611abc565b610a3f576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60128054610a6890612956565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9490612956565b8015610ae15780601f10610ab657610100808354040283529160200191610ae1565b820191906000526020600020905b815481529060010190602001808311610ac457829003601f168201915b505050505081565b6000610af4826111e0565b9050806001600160a01b0316836001600160a01b03161415610b295760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610b495750610b47813361087f565b155b15610b67576040516367d9dca160e11b815260040160405180910390fd5b610b72838383611af5565b505050565b6008546001600160a01b03163314610ba15760405162461bcd60e51b815260040161096990612893565b60005b81811015610b7257600060176000858585818110610bd257634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610be791906124b1565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610c1981612991565b915050610ba4565b610b72838383611b51565b6008546001600160a01b03163314610c565760405162461bcd60e51b815260040161096990612893565b600082118015610c6857506015548211155b610caa5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b5a5b9d08185b5bdd5b9d606a1b6044820152606401610969565b60135482610cbb6000546000190190565b610cc591906128c8565b1115610d135760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420656e6f756768205368696e6f62726f7320617661696c61626c6500006044820152606401610969565b610d1d8183611d67565b5050565b6008546001600160a01b03163314610d4b5760405162461bcd60e51b815260040161096990612893565b60168054911515620100000262ff000019909216919091179055565b6008546001600160a01b03163314610d915760405162461bcd60e51b815260040161096990612893565b60004711610de15760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f75676820657468657220746f207769746864726177000000006044820152606401610969565b600a5447906000906001600160a01b03166103e8610e008460e16128f4565b610e0a91906128e0565b604051600081818185875af1925050503d8060008114610e46576040519150601f19603f3d011682016040523d82523d6000602084013e610e4b565b606091505b5050600b549091506000906001600160a01b03166103e8610e6d8560e16128f4565b610e7791906128e0565b604051600081818185875af1925050503d8060008114610eb3576040519150601f19603f3d011682016040523d82523d6000602084013e610eb8565b606091505b5050600c549091506000906001600160a01b03166103e8610eda8660e16128f4565b610ee491906128e0565b604051600081818185875af1925050503d8060008114610f20576040519150601f19603f3d011682016040523d82523d6000602084013e610f25565b606091505b5050600d549091506000906001600160a01b03166103e8610f478760e16128f4565b610f5191906128e0565b604051600081818185875af1925050503d8060008114610f8d576040519150601f19603f3d011682016040523d82523d6000602084013e610f92565b606091505b5050600e549091506000906001600160a01b03166103e8610fb48860286128f4565b610fbe91906128e0565b604051600081818185875af1925050503d8060008114610ffa576040519150601f19603f3d011682016040523d82523d6000602084013e610fff565b606091505b5050600f546040519192506000916001600160a01b039091169047908381818185875af1925050503d8060008114611053576040519150601f19603f3d011682016040523d82523d6000602084013e611058565b606091505b505090508580156110665750845b801561106f5750835b80156110785750825b80156110815750815b801561108a5750805b6110c85760405162461bcd60e51b815260206004820152600f60248201526e4661696c656420776974686472617760881b6044820152606401610969565b50505050505050565b610b72838383604051806020016040528060008152506116de565b6008546001600160a01b031633146111165760405162461bcd60e51b815260040161096990612893565b601455565b6008546001600160a01b031633146111455760405162461bcd60e51b815260040161096990612893565b6008546001600160a01b0316ff5b6008546001600160a01b0316331461117d5760405162461bcd60e51b815260040161096990612893565b8051611190906010906020840190612376565b50506016805461ffff1916610101179055565b6008546001600160a01b031633146111cd5760405162461bcd60e51b815260040161096990612893565b8051610d1d906010906020840190612376565b60006111eb82611d81565b5192915050565b60108054610a6890612956565b60006001600160a01b038216611228576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b031633146112785760405162461bcd60e51b815260040161096990612893565b6112826000611eaa565b565b6008546001600160a01b031633146112ae5760405162461bcd60e51b815260040161096990612893565b601555565b60606003805461099490612956565b6008546001600160a01b031633146112ec5760405162461bcd60e51b815260040161096990612893565b60005b81811015610b725760016017600085858581811061131d57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061133291906124b1565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061136481612991565b9150506112ef565b600260095414156113bf5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610969565b600260095560165460ff16156114285760405162461bcd60e51b815260206004820152602860248201527f74686520636f6e7472616374206973207061757365642c206d696e7420697320604482015267191a5cd8589b195960c21b6064820152608401610969565b60008111801561143a57506015548111155b61147c5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b5a5b9d08185b5bdd5b9d606a1b6044820152606401610969565b6013548161148d6000546000190190565b61149791906128c8565b11156114e55760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420656e6f756768205368696e6f62726f7320617661696c61626c6500006044820152606401610969565b60165462010000900460ff161515600114156115ce573360009081526017602052604090205460ff16151560011461155f5760405162461bcd60e51b815260206004820152601760248201527f55736572206973206e6f742077686974656c69737465640000000000000000006044820152606401610969565b6018548161156c33611efc565b61157691906128c8565b11156115ce5760405162461bcd60e51b815260206004820152602160248201527f4d696e7420616d6f756e742065786365656420796f757220574c206c696d69746044820152601760f91b6064820152608401610969565b806014546115dc91906128f4565b3410156116205760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b6044820152606401610969565b61162a3382611d67565b6116408160145461163b91906128f4565b611f52565b506001600955565b6001600160a01b0382163314156116725760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6116e9848484611b51565b6001600160a01b0383163b1515801561170b575061170984848484611f90565b155b15611729576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60118054610a6890612956565b606061174782611abc565b6117ab5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610969565b601654610100900460ff1661184c57601280546117c790612956565b80601f01602080910402602001604051908101604052809291908181526020018280546117f390612956565b80156118405780601f1061181557610100808354040283529160200191611840565b820191906000526020600020905b81548152906001019060200180831161182357829003601f168201915b50505050509050919050565b60006010805461185b90612956565b9050116118775760405180602001604052806000815250610939565b601061188283612088565b601160405160200161189693929190612810565b60405160208183030381529060405292915050565b6008546001600160a01b031633146118d55760405162461bcd60e51b815260040161096990612893565b601855565b6008546001600160a01b031633146119045760405162461bcd60e51b815260040161096990612893565b8051610d1d906011906020840190612376565b6008546001600160a01b031633146119415760405162461bcd60e51b815260040161096990612893565b600a546040516000916001600160a01b03169047908381818185875af1925050503d806000811461198e576040519150601f19603f3d011682016040523d82523d6000602084013e611993565b606091505b50509050806119e45760405162461bcd60e51b815260206004820152601960248201527f4661696c656420456d657267656e6379205769746864726177000000000000006044820152606401610969565b50565b6008546001600160a01b03163314611a115760405162461bcd60e51b815260040161096990612893565b8051610d1d906012906020840190612376565b6008546001600160a01b03163314611a4e5760405162461bcd60e51b815260040161096990612893565b6001600160a01b038116611ab35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610969565b6119e481611eaa565b600081600111158015611ad0575060005482105b8015610939575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b5c82611d81565b80519091506000906001600160a01b0316336001600160a01b03161480611b8a57508151611b8a903361087f565b80611ba5575033611b9a84610a17565b6001600160a01b0316145b905080611bc557604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b031614611bfa5760405162a1148160e81b815260040160405180910390fd5b6001600160a01b038416611c2157604051633a954ecd60e21b815260040160405180910390fd5b611c316000848460000151611af5565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b429092169190910217909255908601808352912054909116611d1d57600054811015611d1d578251600082815260046020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b610d1d8282604051806020016040528060008152506121a2565b60408051606081018252600080825260208201819052918101919091528180600111158015611db1575060005481105b15611e9157600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff16151591810182905290611e8f5780516001600160a01b031615611e25579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215611e8a579392505050565b611e25565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b038216611f25576040516335ebb31960e01b815260040160405180910390fd5b506001600160a01b0316600090815260056020526040902054600160401b900467ffffffffffffffff1690565b803411156119e457336108fc611f688334612913565b6040518115909202916000818181858888f19350505050158015610d1d573d6000803e3d6000fd5b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611fc5903390899088908890600401612843565b602060405180830381600087803b158015611fdf57600080fd5b505af192505050801561200f575060408051601f3d908101601f1916820190925261200c918101906126b0565b60015b61206a573d80801561203d576040519150601f19603f3d011682016040523d82523d6000602084013e612042565b606091505b508051612062576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816120ac5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156120d657806120c081612991565b91506120cf9050600a836128e0565b91506120b0565b60008167ffffffffffffffff8111156120ff57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612129576020820181803683370190505b5090505b84156120805761213e600183612913565b915061214b600a866129ac565b6121569060306128c8565b60f81b81838151811061217957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061219b600a866128e0565b945061212d565b610b7283838360016000546001600160a01b0385166121d357604051622e076360e81b815260040160405180910390fd5b836121f15760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561229e57506001600160a01b0387163b15155b15612327575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46122ef6000888480600101955088611f90565b61230c576040516368d2bf6b60e11b815260040160405180910390fd5b808214156122a457826000541461232257600080fd5b61236d565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415612328575b50600055611d60565b82805461238290612956565b90600052602060002090601f0160209004810192826123a457600085556123ea565b82601f106123bd57805160ff19168380011785556123ea565b828001600101855582156123ea579182015b828111156123ea5782518255916020019190600101906123cf565b506123f69291506123fa565b5090565b5b808211156123f657600081556001016123fb565b600067ffffffffffffffff8084111561242a5761242a6129ec565b604051601f8501601f19908116603f01168101908282118183101715612452576124526129ec565b8160405280935085815286868601111561246b57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461249c57600080fd5b919050565b8035801515811461249c57600080fd5b6000602082840312156124c2578081fd5b6124cb82612485565b9392505050565b600080604083850312156124e4578081fd5b6124ed83612485565b91506124fb60208401612485565b90509250929050565b600080600060608486031215612518578081fd5b61252184612485565b925061252f60208501612485565b9150604084013590509250925092565b60008060008060808587031215612554578081fd5b61255d85612485565b935061256b60208601612485565b925060408501359150606085013567ffffffffffffffff81111561258d578182fd5b8501601f8101871361259d578182fd5b6125ac8782356020840161240f565b91505092959194509250565b600080604083850312156125ca578182fd5b6125d383612485565b91506124fb602084016124a1565b600080604083850312156125f3578182fd5b6125fc83612485565b946020939093013593505050565b6000806020838503121561261c578182fd5b823567ffffffffffffffff80821115612633578384fd5b818501915085601f830112612646578384fd5b813581811115612654578485fd5b8660208260051b8501011115612668578485fd5b60209290920196919550909350505050565b60006020828403121561268b578081fd5b6124cb826124a1565b6000602082840312156126a5578081fd5b81356124cb81612a02565b6000602082840312156126c1578081fd5b81516124cb81612a02565b6000602082840312156126dd578081fd5b813567ffffffffffffffff8111156126f3578182fd5b8201601f81018413612703578182fd5b6120808482356020840161240f565b600060208284031215612723578081fd5b5035919050565b6000806040838503121561273c578182fd5b823591506124fb60208401612485565b6000815180845261276481602086016020860161292a565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061279257607f831692505b60208084108214156127b257634e487b7160e01b86526022600452602486fd5b8180156127c657600181146127d757612804565b60ff19861689528489019650612804565b60008881526020902060005b868110156127fc5781548b8201529085019083016127e3565b505084890196505b50505050505092915050565b600061281c8286612778565b845161282c81836020890161292a565b61283881830186612778565b979650505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906128769083018461274c565b9695505050505050565b6020815260006124cb602083018461274c565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156128db576128db6129c0565b500190565b6000826128ef576128ef6129d6565b500490565b600081600019048311821515161561290e5761290e6129c0565b500290565b600082821015612925576129256129c0565b500390565b60005b8381101561294557818101518382015260200161292d565b838111156117295750506000910152565b600181811c9082168061296a57607f821691505b6020821081141561298b57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156129a5576129a56129c0565b5060010190565b6000826129bb576129bb6129d6565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146119e457600080fdfea2646970667358221220e6818b8bc552c9a1503e3aac0e35b7856af7b9f3e592265cf6622b836617e5ba64736f6c63430008040033697066733a2f2f516d575a763933486f53693952726374504348756577444c6b597834735834685a3932385435735056624a384c42

Deployed Bytecode

0x6080604052600436106102c95760003560e01c80636c0360eb11610175578063b88d4fde116100dc578063d5abeb0111610095578063e612c0ad1161006f578063e612c0ad14610844578063e985e9c514610864578063f2c4ce1e146108ad578063f2fde38b146108cd57600080fd5b8063d5abeb01146107f9578063da3ef23f1461080f578063db2e21bc1461082f57600080fd5b8063b88d4fde1461074e578063ba7d2c761461076e578063c668286214610784578063c87b56dd14610799578063d0eb26b0146107b9578063d53f6977146107d957600080fd5b806395d89b411161012e57806395d89b41146106965780639b19251a146106ab5780639c70b512146106db5780639cf94943146106fb578063a0712d681461071b578063a22cb4651461072e57600080fd5b80636c0360eb146105ee57806370a0823114610603578063715018a6146106235780637f00c7a6146106385780638c8d2ede146106585780638da5cb5b1461067857600080fd5b80632a404bb3116102345780634bb278f3116101ed5780635566136a116101c75780635566136a1461057457806355f804b3146105945780635c975abb146105b45780636352211e146105ce57600080fd5b80634bb278f3146105205780634c26124714610535578063518302271461055557600080fd5b80632a404bb31461046b57806338b105681461048b5780633c952764146104ab5780633ccfd60b146104cb57806342842e0e146104e057806344a0d68a1461050057600080fd5b80630c82b942116102865780630c82b942146103b457806313faede6146103d457806318160ddd146103f8578063239c70ae1461041557806323b872dd1461042b5780632977363d1461044b57600080fd5b806301ffc9a7146102ce57806302329a291461030357806306fdde0314610325578063081812fc14610347578063081c8c441461037f578063095ea7b314610394575b600080fd5b3480156102da57600080fd5b506102ee6102e9366004612694565b6108ed565b60405190151581526020015b60405180910390f35b34801561030f57600080fd5b5061032361031e36600461267a565b61093f565b005b34801561033157600080fd5b5061033a610985565b6040516102fa9190612880565b34801561035357600080fd5b50610367610362366004612712565b610a17565b6040516001600160a01b0390911681526020016102fa565b34801561038b57600080fd5b5061033a610a5b565b3480156103a057600080fd5b506103236103af3660046125e1565b610ae9565b3480156103c057600080fd5b506103236103cf36600461260a565b610b77565b3480156103e057600080fd5b506103ea60145481565b6040519081526020016102fa565b34801561040457600080fd5b5060015460005403600019016103ea565b34801561042157600080fd5b506103ea60155481565b34801561043757600080fd5b50610323610446366004612504565b610c21565b34801561045757600080fd5b5061032361046636600461272a565b610c2c565b34801561047757600080fd5b50600e54610367906001600160a01b031681565b34801561049757600080fd5b50600c54610367906001600160a01b031681565b3480156104b757600080fd5b506103236104c636600461267a565b610d21565b3480156104d757600080fd5b50610323610d67565b3480156104ec57600080fd5b506103236104fb366004612504565b6110d1565b34801561050c57600080fd5b5061032361051b366004612712565b6110ec565b34801561052c57600080fd5b5061032361111b565b34801561054157600080fd5b506103236105503660046126cc565b611153565b34801561056157600080fd5b506016546102ee90610100900460ff1681565b34801561058057600080fd5b50600f54610367906001600160a01b031681565b3480156105a057600080fd5b506103236105af3660046126cc565b6111a3565b3480156105c057600080fd5b506016546102ee9060ff1681565b3480156105da57600080fd5b506103676105e9366004612712565b6111e0565b3480156105fa57600080fd5b5061033a6111f2565b34801561060f57600080fd5b506103ea61061e3660046124b1565b6111ff565b34801561062f57600080fd5b5061032361124e565b34801561064457600080fd5b50610323610653366004612712565b611284565b34801561066457600080fd5b50600a54610367906001600160a01b031681565b34801561068457600080fd5b506008546001600160a01b0316610367565b3480156106a257600080fd5b5061033a6112b3565b3480156106b757600080fd5b506102ee6106c63660046124b1565b60176020526000908152604090205460ff1681565b3480156106e757600080fd5b506016546102ee9062010000900460ff1681565b34801561070757600080fd5b5061032361071636600461260a565b6112c2565b610323610729366004612712565b61136c565b34801561073a57600080fd5b506103236107493660046125b8565b611648565b34801561075a57600080fd5b5061032361076936600461253f565b6116de565b34801561077a57600080fd5b506103ea60185481565b34801561079057600080fd5b5061033a61172f565b3480156107a557600080fd5b5061033a6107b4366004612712565b61173c565b3480156107c557600080fd5b506103236107d4366004612712565b6118ab565b3480156107e557600080fd5b50600d54610367906001600160a01b031681565b34801561080557600080fd5b506103ea60135481565b34801561081b57600080fd5b5061032361082a3660046126cc565b6118da565b34801561083b57600080fd5b50610323611917565b34801561085057600080fd5b50600b54610367906001600160a01b031681565b34801561087057600080fd5b506102ee61087f3660046124d2565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156108b957600080fd5b506103236108c83660046126cc565b6119e7565b3480156108d957600080fd5b506103236108e83660046124b1565b611a24565b60006001600160e01b031982166380ac58cd60e01b148061091e57506001600160e01b03198216635b5e139f60e01b145b8061093957506301ffc9a760e01b6001600160e01b03198316145b92915050565b6008546001600160a01b031633146109725760405162461bcd60e51b815260040161096990612893565b60405180910390fd5b6016805460ff1916911515919091179055565b60606002805461099490612956565b80601f01602080910402602001604051908101604052809291908181526020018280546109c090612956565b8015610a0d5780601f106109e257610100808354040283529160200191610a0d565b820191906000526020600020905b8154815290600101906020018083116109f057829003601f168201915b5050505050905090565b6000610a2282611abc565b610a3f576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60128054610a6890612956565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9490612956565b8015610ae15780601f10610ab657610100808354040283529160200191610ae1565b820191906000526020600020905b815481529060010190602001808311610ac457829003601f168201915b505050505081565b6000610af4826111e0565b9050806001600160a01b0316836001600160a01b03161415610b295760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610b495750610b47813361087f565b155b15610b67576040516367d9dca160e11b815260040160405180910390fd5b610b72838383611af5565b505050565b6008546001600160a01b03163314610ba15760405162461bcd60e51b815260040161096990612893565b60005b81811015610b7257600060176000858585818110610bd257634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610be791906124b1565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610c1981612991565b915050610ba4565b610b72838383611b51565b6008546001600160a01b03163314610c565760405162461bcd60e51b815260040161096990612893565b600082118015610c6857506015548211155b610caa5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b5a5b9d08185b5bdd5b9d606a1b6044820152606401610969565b60135482610cbb6000546000190190565b610cc591906128c8565b1115610d135760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420656e6f756768205368696e6f62726f7320617661696c61626c6500006044820152606401610969565b610d1d8183611d67565b5050565b6008546001600160a01b03163314610d4b5760405162461bcd60e51b815260040161096990612893565b60168054911515620100000262ff000019909216919091179055565b6008546001600160a01b03163314610d915760405162461bcd60e51b815260040161096990612893565b60004711610de15760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f75676820657468657220746f207769746864726177000000006044820152606401610969565b600a5447906000906001600160a01b03166103e8610e008460e16128f4565b610e0a91906128e0565b604051600081818185875af1925050503d8060008114610e46576040519150601f19603f3d011682016040523d82523d6000602084013e610e4b565b606091505b5050600b549091506000906001600160a01b03166103e8610e6d8560e16128f4565b610e7791906128e0565b604051600081818185875af1925050503d8060008114610eb3576040519150601f19603f3d011682016040523d82523d6000602084013e610eb8565b606091505b5050600c549091506000906001600160a01b03166103e8610eda8660e16128f4565b610ee491906128e0565b604051600081818185875af1925050503d8060008114610f20576040519150601f19603f3d011682016040523d82523d6000602084013e610f25565b606091505b5050600d549091506000906001600160a01b03166103e8610f478760e16128f4565b610f5191906128e0565b604051600081818185875af1925050503d8060008114610f8d576040519150601f19603f3d011682016040523d82523d6000602084013e610f92565b606091505b5050600e549091506000906001600160a01b03166103e8610fb48860286128f4565b610fbe91906128e0565b604051600081818185875af1925050503d8060008114610ffa576040519150601f19603f3d011682016040523d82523d6000602084013e610fff565b606091505b5050600f546040519192506000916001600160a01b039091169047908381818185875af1925050503d8060008114611053576040519150601f19603f3d011682016040523d82523d6000602084013e611058565b606091505b505090508580156110665750845b801561106f5750835b80156110785750825b80156110815750815b801561108a5750805b6110c85760405162461bcd60e51b815260206004820152600f60248201526e4661696c656420776974686472617760881b6044820152606401610969565b50505050505050565b610b72838383604051806020016040528060008152506116de565b6008546001600160a01b031633146111165760405162461bcd60e51b815260040161096990612893565b601455565b6008546001600160a01b031633146111455760405162461bcd60e51b815260040161096990612893565b6008546001600160a01b0316ff5b6008546001600160a01b0316331461117d5760405162461bcd60e51b815260040161096990612893565b8051611190906010906020840190612376565b50506016805461ffff1916610101179055565b6008546001600160a01b031633146111cd5760405162461bcd60e51b815260040161096990612893565b8051610d1d906010906020840190612376565b60006111eb82611d81565b5192915050565b60108054610a6890612956565b60006001600160a01b038216611228576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b031633146112785760405162461bcd60e51b815260040161096990612893565b6112826000611eaa565b565b6008546001600160a01b031633146112ae5760405162461bcd60e51b815260040161096990612893565b601555565b60606003805461099490612956565b6008546001600160a01b031633146112ec5760405162461bcd60e51b815260040161096990612893565b60005b81811015610b725760016017600085858581811061131d57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061133291906124b1565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061136481612991565b9150506112ef565b600260095414156113bf5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610969565b600260095560165460ff16156114285760405162461bcd60e51b815260206004820152602860248201527f74686520636f6e7472616374206973207061757365642c206d696e7420697320604482015267191a5cd8589b195960c21b6064820152608401610969565b60008111801561143a57506015548111155b61147c5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b5a5b9d08185b5bdd5b9d606a1b6044820152606401610969565b6013548161148d6000546000190190565b61149791906128c8565b11156114e55760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420656e6f756768205368696e6f62726f7320617661696c61626c6500006044820152606401610969565b60165462010000900460ff161515600114156115ce573360009081526017602052604090205460ff16151560011461155f5760405162461bcd60e51b815260206004820152601760248201527f55736572206973206e6f742077686974656c69737465640000000000000000006044820152606401610969565b6018548161156c33611efc565b61157691906128c8565b11156115ce5760405162461bcd60e51b815260206004820152602160248201527f4d696e7420616d6f756e742065786365656420796f757220574c206c696d69746044820152601760f91b6064820152608401610969565b806014546115dc91906128f4565b3410156116205760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b6044820152606401610969565b61162a3382611d67565b6116408160145461163b91906128f4565b611f52565b506001600955565b6001600160a01b0382163314156116725760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6116e9848484611b51565b6001600160a01b0383163b1515801561170b575061170984848484611f90565b155b15611729576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60118054610a6890612956565b606061174782611abc565b6117ab5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610969565b601654610100900460ff1661184c57601280546117c790612956565b80601f01602080910402602001604051908101604052809291908181526020018280546117f390612956565b80156118405780601f1061181557610100808354040283529160200191611840565b820191906000526020600020905b81548152906001019060200180831161182357829003601f168201915b50505050509050919050565b60006010805461185b90612956565b9050116118775760405180602001604052806000815250610939565b601061188283612088565b601160405160200161189693929190612810565b60405160208183030381529060405292915050565b6008546001600160a01b031633146118d55760405162461bcd60e51b815260040161096990612893565b601855565b6008546001600160a01b031633146119045760405162461bcd60e51b815260040161096990612893565b8051610d1d906011906020840190612376565b6008546001600160a01b031633146119415760405162461bcd60e51b815260040161096990612893565b600a546040516000916001600160a01b03169047908381818185875af1925050503d806000811461198e576040519150601f19603f3d011682016040523d82523d6000602084013e611993565b606091505b50509050806119e45760405162461bcd60e51b815260206004820152601960248201527f4661696c656420456d657267656e6379205769746864726177000000000000006044820152606401610969565b50565b6008546001600160a01b03163314611a115760405162461bcd60e51b815260040161096990612893565b8051610d1d906012906020840190612376565b6008546001600160a01b03163314611a4e5760405162461bcd60e51b815260040161096990612893565b6001600160a01b038116611ab35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610969565b6119e481611eaa565b600081600111158015611ad0575060005482105b8015610939575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b5c82611d81565b80519091506000906001600160a01b0316336001600160a01b03161480611b8a57508151611b8a903361087f565b80611ba5575033611b9a84610a17565b6001600160a01b0316145b905080611bc557604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b031614611bfa5760405162a1148160e81b815260040160405180910390fd5b6001600160a01b038416611c2157604051633a954ecd60e21b815260040160405180910390fd5b611c316000848460000151611af5565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b429092169190910217909255908601808352912054909116611d1d57600054811015611d1d578251600082815260046020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b610d1d8282604051806020016040528060008152506121a2565b60408051606081018252600080825260208201819052918101919091528180600111158015611db1575060005481105b15611e9157600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff16151591810182905290611e8f5780516001600160a01b031615611e25579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215611e8a579392505050565b611e25565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b038216611f25576040516335ebb31960e01b815260040160405180910390fd5b506001600160a01b0316600090815260056020526040902054600160401b900467ffffffffffffffff1690565b803411156119e457336108fc611f688334612913565b6040518115909202916000818181858888f19350505050158015610d1d573d6000803e3d6000fd5b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611fc5903390899088908890600401612843565b602060405180830381600087803b158015611fdf57600080fd5b505af192505050801561200f575060408051601f3d908101601f1916820190925261200c918101906126b0565b60015b61206a573d80801561203d576040519150601f19603f3d011682016040523d82523d6000602084013e612042565b606091505b508051612062576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816120ac5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156120d657806120c081612991565b91506120cf9050600a836128e0565b91506120b0565b60008167ffffffffffffffff8111156120ff57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612129576020820181803683370190505b5090505b84156120805761213e600183612913565b915061214b600a866129ac565b6121569060306128c8565b60f81b81838151811061217957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061219b600a866128e0565b945061212d565b610b7283838360016000546001600160a01b0385166121d357604051622e076360e81b815260040160405180910390fd5b836121f15760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561229e57506001600160a01b0387163b15155b15612327575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46122ef6000888480600101955088611f90565b61230c576040516368d2bf6b60e11b815260040160405180910390fd5b808214156122a457826000541461232257600080fd5b61236d565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415612328575b50600055611d60565b82805461238290612956565b90600052602060002090601f0160209004810192826123a457600085556123ea565b82601f106123bd57805160ff19168380011785556123ea565b828001600101855582156123ea579182015b828111156123ea5782518255916020019190600101906123cf565b506123f69291506123fa565b5090565b5b808211156123f657600081556001016123fb565b600067ffffffffffffffff8084111561242a5761242a6129ec565b604051601f8501601f19908116603f01168101908282118183101715612452576124526129ec565b8160405280935085815286868601111561246b57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461249c57600080fd5b919050565b8035801515811461249c57600080fd5b6000602082840312156124c2578081fd5b6124cb82612485565b9392505050565b600080604083850312156124e4578081fd5b6124ed83612485565b91506124fb60208401612485565b90509250929050565b600080600060608486031215612518578081fd5b61252184612485565b925061252f60208501612485565b9150604084013590509250925092565b60008060008060808587031215612554578081fd5b61255d85612485565b935061256b60208601612485565b925060408501359150606085013567ffffffffffffffff81111561258d578182fd5b8501601f8101871361259d578182fd5b6125ac8782356020840161240f565b91505092959194509250565b600080604083850312156125ca578182fd5b6125d383612485565b91506124fb602084016124a1565b600080604083850312156125f3578182fd5b6125fc83612485565b946020939093013593505050565b6000806020838503121561261c578182fd5b823567ffffffffffffffff80821115612633578384fd5b818501915085601f830112612646578384fd5b813581811115612654578485fd5b8660208260051b8501011115612668578485fd5b60209290920196919550909350505050565b60006020828403121561268b578081fd5b6124cb826124a1565b6000602082840312156126a5578081fd5b81356124cb81612a02565b6000602082840312156126c1578081fd5b81516124cb81612a02565b6000602082840312156126dd578081fd5b813567ffffffffffffffff8111156126f3578182fd5b8201601f81018413612703578182fd5b6120808482356020840161240f565b600060208284031215612723578081fd5b5035919050565b6000806040838503121561273c578182fd5b823591506124fb60208401612485565b6000815180845261276481602086016020860161292a565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061279257607f831692505b60208084108214156127b257634e487b7160e01b86526022600452602486fd5b8180156127c657600181146127d757612804565b60ff19861689528489019650612804565b60008881526020902060005b868110156127fc5781548b8201529085019083016127e3565b505084890196505b50505050505092915050565b600061281c8286612778565b845161282c81836020890161292a565b61283881830186612778565b979650505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906128769083018461274c565b9695505050505050565b6020815260006124cb602083018461274c565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156128db576128db6129c0565b500190565b6000826128ef576128ef6129d6565b500490565b600081600019048311821515161561290e5761290e6129c0565b500290565b600082821015612925576129256129c0565b500390565b60005b8381101561294557818101518382015260200161292d565b838111156117295750506000910152565b600181811c9082168061296a57607f821691505b6020821081141561298b57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156129a5576129a56129c0565b5060010190565b6000826129bb576129bb6129d6565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146119e457600080fdfea2646970667358221220e6818b8bc552c9a1503e3aac0e35b7856af7b9f3e592265cf6622b836617e5ba64736f6c63430008040033

Deployed Bytecode Sourcemap

49143:6231:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30955:355;;;;;;;;;;-1:-1:-1;30955:355:0;;;;;:::i;:::-;;:::i;:::-;;;8172:14:1;;8165:22;8147:41;;8135:2;8120:18;30955:355:0;;;;;;;;55183:79;;;;;;;;;;-1:-1:-1;55183:79:0;;;;;:::i;:::-;;:::i;:::-;;34424:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;36024:245::-;;;;;;;;;;-1:-1:-1;36024:245:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7470:32:1;;;7452:51;;7440:2;7425:18;36024:245:0;7407:102:1;49779:86:0;;;;;;;;;;;;;:::i;35587:371::-;;;;;;;;;;-1:-1:-1;35587:371:0;;;;;:::i;:::-;;:::i;54136:243::-;;;;;;;;;;-1:-1:-1;54136:243:0;;;;;:::i;:::-;;:::i;49942:33::-;;;;;;;;;;;;;;;;;;;13733:25:1;;;13721:2;13706:18;49942:33:0;13688:76:1;30204:303:0;;;;;;;;;;-1:-1:-1;53856:1:0;30458:12;30248:7;30442:13;:28;-1:-1:-1;;30442:46:0;30204:303;;49982:32;;;;;;;;;;;;;;;;37012:170;;;;;;;;;;-1:-1:-1;37012:170:0;;;;;:::i;:::-;;:::i;52002:439::-;;;;;;;;;;-1:-1:-1;52002:439:0;;;;;:::i;:::-;;:::i;49544:65::-;;;;;;;;;;-1:-1:-1;49544:65:0;;;;-1:-1:-1;;;;;49544:65:0;;;49400;;;;;;;;;;-1:-1:-1;49400:65:0;;;;-1:-1:-1;;;;;49400:65:0;;;55270:101;;;;;;;;;;-1:-1:-1;55270:101:0;;;;;:::i;:::-;;:::i;52851:805::-;;;;;;;;;;;;;:::i;37253:185::-;;;;;;;;;;-1:-1:-1;37253:185:0;;;;;:::i;:::-;;:::i;54387:86::-;;;;;;;;;;-1:-1:-1;54387:86:0;;;;;:::i;:::-;;:::i;53664:88::-;;;;;;;;;;;;;:::i;52449:144::-;;;;;;;;;;-1:-1:-1;52449:144:0;;;;;:::i;:::-;;:::i;50077:28::-;;;;;;;;;;-1:-1:-1;50077:28:0;;;;;;;;;;;49616:65;;;;;;;;;;-1:-1:-1;49616:65:0;;;;-1:-1:-1;;;;;49616:65:0;;;54784:98;;;;;;;;;;-1:-1:-1;54784:98:0;;;;;:::i;:::-;;:::i;50045:25::-;;;;;;;;;;-1:-1:-1;50045:25:0;;;;;;;;34232:125;;;;;;;;;;-1:-1:-1;34232:125:0;;;;;:::i;:::-;;:::i;49707:21::-;;;;;;;;;;;;;:::i;31374:206::-;;;;;;;;;;-1:-1:-1;31374:206:0;;;;;:::i;:::-;;:::i;7522:103::-;;;;;;;;;;;;;:::i;54654:122::-;;;;;;;;;;-1:-1:-1;54654:122:0;;;;;:::i;:::-;;:::i;49256:65::-;;;;;;;;;;-1:-1:-1;49256:65:0;;;;-1:-1:-1;;;;;49256:65:0;;;6871:87;;;;;;;;;;-1:-1:-1;6944:6:0;;-1:-1:-1;;;;;6944:6:0;6871:87;;34593:104;;;;;;;;;;;;;:::i;50173:41::-;;;;;;;;;;-1:-1:-1;50173:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;50112:34;;;;;;;;;;-1:-1:-1;50112:34:0;;;;;;;;;;;53889:239;;;;;;;;;;-1:-1:-1;53889:239:0;;;;;:::i;:::-;;:::i;50340:899::-;;;;;;:::i;:::-;;:::i;36341:319::-;;;;;;;;;;-1:-1:-1;36341:319:0;;;;;:::i;:::-;;:::i;37509:406::-;;;;;;;;;;-1:-1:-1;37509:406:0;;;;;:::i;:::-;;:::i;50221:37::-;;;;;;;;;;;;;;;;49735;;;;;;;;;;;;;:::i;51419:557::-;;;;;;;;;;-1:-1:-1;51419:557:0;;;;;:::i;:::-;;:::i;54481:165::-;;;;;;;;;;-1:-1:-1;54481:165:0;;;;;:::i;:::-;;:::i;49472:65::-;;;;;;;;;;-1:-1:-1;49472:65:0;;;;-1:-1:-1;;;;;49472:65:0;;;49889:31;;;;;;;;;;;;;;;;54890:151;;;;;;;;;;-1:-1:-1;54890:151:0;;;;;:::i;:::-;;:::i;52601:242::-;;;;;;;;;;;;;:::i;49328:65::-;;;;;;;;;;-1:-1:-1;49328:65:0;;;;-1:-1:-1;;;;;49328:65:0;;;36731:214;;;;;;;;;;-1:-1:-1;36731:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;36902:25:0;;;36873:4;36902:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;36731:214;55049:126;;;;;;;;;;-1:-1:-1;55049:126:0;;;;;:::i;:::-;;:::i;7780:201::-;;;;;;;;;;-1:-1:-1;7780:201:0;;;;;:::i;:::-;;:::i;30955:355::-;31102:4;-1:-1:-1;;;;;;31144:40:0;;-1:-1:-1;;;31144:40:0;;:105;;-1:-1:-1;;;;;;;31201:48:0;;-1:-1:-1;;;31201:48:0;31144:105;:158;;;-1:-1:-1;;;;;;;;;;19764:40:0;;;31266:36;31124:178;30955:355;-1:-1:-1;;30955:355:0:o;55183:79::-;6944:6;;-1:-1:-1;;;;;6944:6:0;5675:10;7091:23;7083:68;;;;-1:-1:-1;;;7083:68:0;;;;;;;:::i;:::-;;;;;;;;;55239:6:::1;:15:::0;;-1:-1:-1;;55239:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55183:79::o;34424:100::-;34478:13;34511:5;34504:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34424:100;:::o;36024:245::-;36128:7;36158:16;36166:7;36158;:16::i;:::-;36153:64;;36183:34;;-1:-1:-1;;;36183:34:0;;;;;;;;;;;36153:64;-1:-1:-1;36237:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;36237:24:0;;36024:245::o;49779:86::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35587:371::-;35660:13;35676:24;35692:7;35676:15;:24::i;:::-;35660:40;;35721:5;-1:-1:-1;;;;;35715:11:0;:2;-1:-1:-1;;;;;35715:11:0;;35711:48;;;35735:24;;-1:-1:-1;;;35735:24:0;;;;;;;;;;;35711:48;5675:10;-1:-1:-1;;;;;35776:21:0;;;;;;:63;;-1:-1:-1;35802:37:0;35819:5;5675:10;36731:214;:::i;35802:37::-;35801:38;35776:63;35772:138;;;35863:35;;-1:-1:-1;;;35863:35:0;;;;;;;;;;;35772:138;35922:28;35931:2;35935:7;35944:5;35922:8;:28::i;:::-;35587:371;;;:::o;54136:243::-;6944:6;;-1:-1:-1;;;;;6944:6:0;5675:10;7091:23;7083:68;;;;-1:-1:-1;;;7083:68:0;;;;;;;:::i;:::-;54258:9:::1;54253:119;54269:29:::0;;::::1;54253:119;;;54355:5;54320:9;:32;54330:18;;54349:1;54330:21;;;;;-1:-1:-1::0;;;54330:21:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;54320:32:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;54320:32:0;:40;;-1:-1:-1;;54320:40:0::1;::::0;::::1;;::::0;;;::::1;::::0;;54300:3;::::1;::::0;::::1;:::i;:::-;;;;54253:119;;37012:170:::0;37146:28;37156:4;37162:2;37166:7;37146:9;:28::i;52002:439::-;6944:6;;-1:-1:-1;;;;;6944:6:0;5675:10;7091:23;7083:68;;;;-1:-1:-1;;;7083:68:0;;;;;;;:::i;:::-;52121:1:::1;52107:11;:15;:47;;;;;52141:13;;52126:11;:28;;52107:47;52085:116;;;::::0;-1:-1:-1;;;52085:116:0;;13081:2:1;52085:116:0::1;::::0;::::1;13063:21:1::0;13120:2;13100:18;;;13093:30;-1:-1:-1;;;13139:18:1;;;13132:49;13198:18;;52085:116:0::1;13053:169:1::0;52085:116:0::1;52266:9;;52251:11;52234:14;30647:7:::0;30833:13;-1:-1:-1;;30833:31:0;;30600:283;52234:14:::1;:28;;;;:::i;:::-;:41;;52212:121;;;::::0;-1:-1:-1;;;52212:121:0;;10136:2:1;52212:121:0::1;::::0;::::1;10118:21:1::0;10175:2;10155:18;;;10148:30;10214:32;10194:18;;;10187:60;10264:18;;52212:121:0::1;10108:180:1::0;52212:121:0::1;52406:27;52416:3;52421:11;52406:9;:27::i;:::-;52002:439:::0;;:::o;55270:101::-;6944:6;;-1:-1:-1;;;;;6944:6:0;5675:10;7091:23;7083:68;;;;-1:-1:-1;;;7083:68:0;;;;;;;:::i;:::-;55339:15:::1;:24:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;55339:24:0;;::::1;::::0;;;::::1;::::0;;55270:101::o;52851:805::-;6944:6;;-1:-1:-1;;;;;6944:6:0;5675:10;7091:23;7083:68;;;;-1:-1:-1;;;7083:68:0;;;;;;;:::i;:::-;52933:1:::1;52909:21;:25;52901:66;;;::::0;-1:-1:-1;;;52901:66:0;;12724:2:1;52901:66:0::1;::::0;::::1;12706:21:1::0;12763:2;12743:18;;;12736:30;12802;12782:18;;;12775:58;12850:18;;52901:66:0::1;12696:178:1::0;52901:66:0::1;53058:5;::::0;53002:21:::1;::::0;52978::::1;::::0;-1:-1:-1;;;;;53058:5:0::1;53100:4;53077:19;53002:21:::0;53093:3:::1;53077:19;:::i;:::-;53076:28;;;;:::i;:::-;53058:51;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;53142:5:0::1;::::0;53036:73;;-1:-1:-1;53121:15:0::1;::::0;-1:-1:-1;;;;;53142:5:0::1;53184:4;53161:19;:13:::0;53177:3:::1;53161:19;:::i;:::-;53160:28;;;;:::i;:::-;53142:51;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;53226:5:0::1;::::0;53120:73;;-1:-1:-1;53205:15:0::1;::::0;-1:-1:-1;;;;;53226:5:0::1;53268:4;53245:19;:13:::0;53261:3:::1;53245:19;:::i;:::-;53244:28;;;;:::i;:::-;53226:51;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;53310:5:0::1;::::0;53204:73;;-1:-1:-1;53289:15:0::1;::::0;-1:-1:-1;;;;;53310:5:0::1;53352:4;53329:19;:13:::0;53345:3:::1;53329:19;:::i;:::-;53328:28;;;;:::i;:::-;53310:51;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;53394:5:0::1;::::0;53288:73;;-1:-1:-1;53373:15:0::1;::::0;-1:-1:-1;;;;;53394:5:0::1;53435:4;53413:18;:13:::0;53429:2:::1;53413:18;:::i;:::-;53412:27;;;;:::i;:::-;53394:50;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;53477:5:0::1;::::0;:44:::1;::::0;53372:72;;-1:-1:-1;53456:15:0::1;::::0;-1:-1:-1;;;;;53477:5:0;;::::1;::::0;53495:21:::1;::::0;53456:15;53477:44;53456:15;53477:44;53495:21;53477:5;:44:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53455:66;;;53548:10;:24;;;;;53562:10;53548:24;:38;;;;;53576:10;53548:38;:52;;;;;53590:10;53548:52;:66;;;;;53604:10;53548:66;:80;;;;;53618:10;53548:80;53540:108;;;::::0;-1:-1:-1;;;53540:108:0;;12380:2:1;53540:108:0::1;::::0;::::1;12362:21:1::0;12419:2;12399:18;;;12392:30;-1:-1:-1;;;12438:18:1;;;12431:45;12493:18;;53540:108:0::1;12352:165:1::0;53540:108:0::1;7162:1;;;;;;;52851:805::o:0;37253:185::-;37391:39;37408:4;37414:2;37418:7;37391:39;;;;;;;;;;;;:16;:39::i;54387:86::-;6944:6;;-1:-1:-1;;;;;6944:6:0;5675:10;7091:23;7083:68;;;;-1:-1:-1;;;7083:68:0;;;;;;;:::i;:::-;54450:4:::1;:15:::0;54387:86::o;53664:88::-;6944:6;;-1:-1:-1;;;;;6944:6:0;5675:10;7091:23;7083:68;;;;-1:-1:-1;;;7083:68:0;;;;;;;:::i;:::-;6944:6;;-1:-1:-1;;;;;6944:6:0;53714:30:::1;52449:144:::0;6944:6;;-1:-1:-1;;;;;6944:6:0;5675:10;7091:23;7083:68;;;;-1:-1:-1;;;7083:68:0;;;;;;;:::i;:::-;52517:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;52546:8:0::1;:15:::0;;-1:-1:-1;;52572:13:0;;;;;52449:144::o;54784:98::-;6944:6;;-1:-1:-1;;;;;6944:6:0;5675:10;7091:23;7083:68;;;;-1:-1:-1;;;7083:68:0;;;;;;;:::i;:::-;54856:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;34232:125::-:0;34296:7;34323:21;34336:7;34323:12;:21::i;:::-;:26;;34232:125;-1:-1:-1;;34232:125:0:o;49707:21::-;;;;;;;:::i;31374:206::-;31438:7;-1:-1:-1;;;;;31462:19:0;;31458:60;;31490:28;;-1:-1:-1;;;31490:28:0;;;;;;;;;;;31458:60;-1:-1:-1;;;;;;31544:19:0;;;;;:12;:19;;;;;:27;;;;31374:206::o;7522:103::-;6944:6;;-1:-1:-1;;;;;6944:6:0;5675:10;7091:23;7083:68;;;;-1:-1:-1;;;7083:68:0;;;;;;;:::i;:::-;7587:30:::1;7614:1;7587:18;:30::i;:::-;7522:103::o:0;54654:122::-;6944:6;;-1:-1:-1;;;;;6944:6:0;5675:10;7091:23;7083:68;;;;-1:-1:-1;;;7083:68:0;;;;;;;:::i;:::-;54735:13:::1;:33:::0;54654:122::o;34593:104::-;34649:13;34682:7;34675:14;;;;;:::i;53889:239::-;6944:6;;-1:-1:-1;;;;;6944:6:0;5675:10;7091:23;7083:68;;;;-1:-1:-1;;;7083:68:0;;;;;;;:::i;:::-;54008:9:::1;54003:118;54019:29:::0;;::::1;54003:118;;;54105:4;54070:9;:32;54080:18;;54099:1;54080:21;;;;;-1:-1:-1::0;;;54080:21:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;54070:32:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;54070:32:0;:39;;-1:-1:-1;;54070:39:0::1;::::0;::::1;;::::0;;;::::1;::::0;;54050:3;::::1;::::0;::::1;:::i;:::-;;;;54003:118;;50340:899:::0;1845:1;2443:7;;:19;;2435:63;;;;-1:-1:-1;;;2435:63:0;;13429:2:1;2435:63:0;;;13411:21:1;13468:2;13448:18;;;13441:30;13507:33;13487:18;;;13480:61;13558:18;;2435:63:0;13401:181:1;2435:63:0;1845:1;2576:7;:18;50423:6:::1;::::0;::::1;;50422:7;50414:60;;;::::0;-1:-1:-1;;;50414:60:0;;10495:2:1;50414:60:0::1;::::0;::::1;10477:21:1::0;10534:2;10514:18;;;10507:30;10573:34;10553:18;;;10546:62;-1:-1:-1;;;10624:18:1;;;10617:38;10672:19;;50414:60:0::1;10467:230:1::0;50414:60:0::1;50521:1;50507:11;:15;:47;;;;;50541:13;;50526:11;:28;;50507:47;50485:116;;;::::0;-1:-1:-1;;;50485:116:0;;13081:2:1;50485:116:0::1;::::0;::::1;13063:21:1::0;13120:2;13100:18;;;13093:30;-1:-1:-1;;;13139:18:1;;;13132:49;13198:18;;50485:116:0::1;13053:169:1::0;50485:116:0::1;50699:9;;50684:11;50667:14;30647:7:::0;30833:13;-1:-1:-1;;30833:31:0;;30600:283;50667:14:::1;:28;;;;:::i;:::-;:41;;50645:121;;;::::0;-1:-1:-1;;;50645:121:0;;10136:2:1;50645:121:0::1;::::0;::::1;10118:21:1::0;10175:2;10155:18;;;10148:30;10214:32;10194:18;;;10187:60;10264:18;;50645:121:0::1;10108:180:1::0;50645:121:0::1;50783:15;::::0;;;::::1;;;:23;;50802:4;50783:23;50779:292;;;50841:10;50831:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;:29;;:21:::0;:29:::1;50823:65;;;::::0;-1:-1:-1;;;50823:65:0;;11251:2:1;50823:65:0::1;::::0;::::1;11233:21:1::0;11290:2;11270:18;;;11263:30;11329:25;11309:18;;;11302:53;11372:18;;50823:65:0::1;11223:173:1::0;50823:65:0::1;50972:18;;50957:11;50929:25;50943:10;50929:13;:25::i;:::-;:39;;;;:::i;:::-;:61;;50903:156;;;::::0;-1:-1:-1;;;50903:156:0;;9386:2:1;50903:156:0::1;::::0;::::1;9368:21:1::0;9425:2;9405:18;;;9398:30;9464:34;9444:18;;;9437:62;-1:-1:-1;;;9515:18:1;;;9508:31;9556:19;;50903:156:0::1;9358:223:1::0;50903:156:0::1;51109:11;51102:4;;:18;;;;:::i;:::-;51089:9;:31;;51081:62;;;::::0;-1:-1:-1;;;51081:62:0;;10904:2:1;51081:62:0::1;::::0;::::1;10886:21:1::0;10943:2;10923:18;;;10916:30;-1:-1:-1;;;10962:18:1;;;10955:48;11020:18;;51081:62:0::1;10876:168:1::0;51081:62:0::1;51154:34;51164:10;51176:11;51154:9;:34::i;:::-;51199:32;51219:11;51212:4;;:18;;;;:::i;:::-;51199:12;:32::i;:::-;-1:-1:-1::0;1801:1:0;2755:7;:22;50340:899::o;36341:319::-;-1:-1:-1;;;;;36472:24:0;;5675:10;36472:24;36468:54;;;36505:17;;-1:-1:-1;;;36505:17:0;;;;;;;;;;;36468:54;5675:10;36535:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;36535:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;36535:53:0;;;;;;;;;;36604:48;;8147:41:1;;;36535:42:0;;5675:10;36604:48;;8120:18:1;36604:48:0;;;;;;;36341:319;;:::o;37509:406::-;37676:28;37686:4;37692:2;37696:7;37676:9;:28::i;:::-;-1:-1:-1;;;;;37733:13:0;;9867:19;:23;;37733:89;;;;;37766:56;37797:4;37803:2;37807:7;37816:5;37766:30;:56::i;:::-;37765:57;37733:89;37715:193;;;37856:40;;-1:-1:-1;;;37856:40:0;;;;;;;;;;;37715:193;37509:406;;;;:::o;49735:37::-;;;;;;;:::i;51419:557::-;51537:13;51590:16;51598:7;51590;:16::i;:::-;51568:113;;;;-1:-1:-1;;;51568:113:0;;11964:2:1;51568:113:0;;;11946:21:1;12003:2;11983:18;;;11976:30;12042:34;12022:18;;;12015:62;-1:-1:-1;;;12093:18:1;;;12086:45;12148:19;;51568:113:0;11936:237:1;51568:113:0;51696:8;;;;;;;51692:71;;51737:14;51730:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51419:557;;;:::o;51692:71::-;51817:1;51799:7;51793:21;;;;;:::i;:::-;;;:25;:175;;;;;;;;;;;;;;;;;51884:7;51893:18;:7;:16;:18::i;:::-;51913:13;51867:60;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51773:195;51419:557;-1:-1:-1;;51419:557:0:o;54481:165::-;6944:6;;-1:-1:-1;;;;;6944:6:0;5675:10;7091:23;7083:68;;;;-1:-1:-1;;;7083:68:0;;;;;;;:::i;:::-;54595:18:::1;:43:::0;54481:165::o;54890:151::-;6944:6;;-1:-1:-1;;;;;6944:6:0;5675:10;7091:23;7083:68;;;;-1:-1:-1;;;7083:68:0;;;;;;;:::i;:::-;55000:33;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;52601:242::-:0;6944:6;;-1:-1:-1;;;;;6944:6:0;5675:10;7091:23;7083:68;;;;-1:-1:-1;;;7083:68:0;;;;;;;:::i;:::-;52695:5:::1;::::0;:68:::1;::::0;52661:28:::1;::::0;-1:-1:-1;;;;;52695:5:0::1;::::0;52727:21:::1;::::0;52661:28;52695:68;52661:28;52695:68;52727:21;52695:5;:68:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52660:103;;;52782:23;52774:61;;;::::0;-1:-1:-1;;;52774:61:0;;8625:2:1;52774:61:0::1;::::0;::::1;8607:21:1::0;8664:2;8644:18;;;8637:30;8703:27;8683:18;;;8676:55;8748:18;;52774:61:0::1;8597:175:1::0;52774:61:0::1;7162:1;52601:242::o:0;55049:126::-;6944:6;;-1:-1:-1;;;;;6944:6:0;5675:10;7091:23;7083:68;;;;-1:-1:-1;;;7083:68:0;;;;;;;:::i;:::-;55135:32;;::::1;::::0;:14:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;7780:201::-:0;6944:6;;-1:-1:-1;;;;;6944:6:0;5675:10;7091:23;7083:68;;;;-1:-1:-1;;;7083:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7869:22:0;::::1;7861:73;;;::::0;-1:-1:-1;;;7861:73:0;;8979:2:1;7861:73:0::1;::::0;::::1;8961:21:1::0;9018:2;8998:18;;;8991:30;9057:34;9037:18;;;9030:62;-1:-1:-1;;;9108:18:1;;;9101:36;9154:19;;7861:73:0::1;8951:228:1::0;7861:73:0::1;7945:28;7964:8;7945:18;:28::i;38170:213::-:0;38227:4;38283:7;53856:1;38264:26;;:66;;;;;38317:13;;38307:7;:23;38264:66;:111;;;;-1:-1:-1;;38348:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;38348:27:0;;;;38347:28;;38170:213::o;46052:196::-;46167:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;46167:29:0;-1:-1:-1;;;;;46167:29:0;;;;;;;;;46212:28;;46167:24;;46212:28;;;;;;;46052:196;;;:::o;41500:2139::-;41615:35;41653:21;41666:7;41653:12;:21::i;:::-;41729:18;;41615:59;;-1:-1:-1;41687:22:0;;-1:-1:-1;;;;;41713:34:0;5675:10;-1:-1:-1;;;;;41713:34:0;;:101;;;-1:-1:-1;41781:18:0;;41764:50;;5675:10;36731:214;:::i;41764:50::-;41713:154;;;-1:-1:-1;5675:10:0;41831:20;41843:7;41831:11;:20::i;:::-;-1:-1:-1;;;;;41831:36:0;;41713:154;41687:181;;41886:17;41881:66;;41912:35;;-1:-1:-1;;;41912:35:0;;;;;;;;;;;41881:66;41984:4;-1:-1:-1;;;;;41962:26:0;:13;:18;;;-1:-1:-1;;;;;41962:26:0;;41958:67;;41997:28;;-1:-1:-1;;;41997:28:0;;;;;;;;;;;41958:67;-1:-1:-1;;;;;42040:16:0;;42036:52;;42065:23;;-1:-1:-1;;;42065:23:0;;;;;;;;;;;42036:52;42209:49;42226:1;42230:7;42239:13;:18;;;42209:8;:49::i;:::-;-1:-1:-1;;;;;42554:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;42554:31:0;;;;;;;-1:-1:-1;;42554:31:0;;;;;;;42600:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;42600:29:0;;;;;;;;;;;42646:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;42691:61:0;;;;-1:-1:-1;;;42736:15:0;42691:61;;;;;;;;;;;43026:11;;;43056:24;;;;;:29;43026:11;;43056:29;43052:471;;43281:13;;43267:11;:27;43263:245;;;43351:18;;;43319:24;;;:11;:24;;;;;;;;:50;;43434:54;;;;43392:96;;-1:-1:-1;;;43392:96:0;-1:-1:-1;;;;;;43392:96:0;;;-1:-1:-1;;;;;43319:50:0;;;43392:96;;;;;;;43263:245;41500:2139;43570:7;43566:2;-1:-1:-1;;;;;43551:27:0;43560:4;-1:-1:-1;;;;;43551:27:0;;;;;;;;;;;43589:42;41500:2139;;;;;:::o;38391:104::-;38460:27;38470:2;38474:8;38460:27;;;;;;;;;;;;:9;:27::i;33029:1141::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;33172:7:0;;53856:1;33221:23;;:47;;;;;33255:13;;33248:4;:20;33221:47;33217:886;;;33289:31;33323:17;;;:11;:17;;;;;;;;;33289:51;;;;;;;;;-1:-1:-1;;;;;33289:51:0;;;;-1:-1:-1;;;33289:51:0;;;;;;;;;;;-1:-1:-1;;;33289:51:0;;;;;;;;;;;;;;33359:729;;33409:14;;-1:-1:-1;;;;;33409:28:0;;33405:101;;33473:9;33029:1141;-1:-1:-1;;;33029:1141:0:o;33405:101::-;-1:-1:-1;;;33848:6:0;33893:17;;;;:11;:17;;;;;;;;;33881:29;;;;;;;;;-1:-1:-1;;;;;33881:29:0;;;;;-1:-1:-1;;;33881:29:0;;;;;;;;;;;-1:-1:-1;;;33881:29:0;;;;;;;;;;;;;33941:28;33937:109;;34009:9;33029:1141;-1:-1:-1;;;33029:1141:0:o;33937:109::-;33808:261;;;33217:886;;34131:31;;-1:-1:-1;;;34131:31:0;;;;;;;;;;;8141:191;8234:6;;;-1:-1:-1;;;;;8251:17:0;;;-1:-1:-1;;;;;;8251:17:0;;;;;;;8284:40;;8234:6;;;8251:17;8234:6;;8284:40;;8215:16;;8284:40;8141:191;;:::o;31662:207::-;31723:7;-1:-1:-1;;;;;31747:19:0;;31743:59;;31775:27;;-1:-1:-1;;;31775:27:0;;;;;;;;;;;31743:59;-1:-1:-1;;;;;;31828:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;31828:32:0;;;;;31662:207::o;51251:160::-;51323:5;51311:9;:17;51307:97;;;51353:10;51345:47;51374:17;51386:5;51374:9;:17;:::i;:::-;51345:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46740:772;46937:155;;-1:-1:-1;;;46937:155:0;;46903:4;;-1:-1:-1;;;;;46937:36:0;;;;;:155;;5675:10;;47023:4;;47046:7;;47072:5;;46937:155;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46937:155:0;;;;;;;;-1:-1:-1;;46937:155:0;;;;;;;;;;;;:::i;:::-;;;46920:585;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47263:13:0;;47259:235;;47309:40;;-1:-1:-1;;;47309:40:0;;;;;;;;;;;47259:235;47452:6;47446:13;47437:6;47433:2;47429:15;47422:38;46920:585;-1:-1:-1;;;;;;47148:55:0;-1:-1:-1;;;47148:55:0;;-1:-1:-1;46920:585:0;46740:772;;;;;;:::o;3157:723::-;3213:13;3434:10;3430:53;;-1:-1:-1;;3461:10:0;;;;;;;;;;;;-1:-1:-1;;;3461:10:0;;;;;3157:723::o;3430:53::-;3508:5;3493:12;3549:78;3556:9;;3549:78;;3582:8;;;;:::i;:::-;;-1:-1:-1;3605:10:0;;-1:-1:-1;3613:2:0;3605:10;;:::i;:::-;;;3549:78;;;3637:19;3669:6;3659:17;;;;;;-1:-1:-1;;;3659:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3659:17:0;;3637:39;;3687:154;3694:10;;3687:154;;3721:11;3731:1;3721:11;;:::i;:::-;;-1:-1:-1;3790:10:0;3798:2;3790:5;:10;:::i;:::-;3777:24;;:2;:24;:::i;:::-;3764:39;;3747:6;3754;3747:14;;;;;;-1:-1:-1;;;3747:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;3747:56:0;;;;;;;;-1:-1:-1;3818:11:0;3827:2;3818:11;;:::i;:::-;;;3687:154;;38858:163;38981:32;38987:2;38991:8;39001:5;39008:4;39419:20;39442:13;-1:-1:-1;;;;;39470:16:0;;39466:48;;39495:19;;-1:-1:-1;;;39495:19:0;;;;;;;;;;;39466:48;39529:13;39525:44;;39551:18;;-1:-1:-1;;;39551:18:0;;;;;;;;;;;39525:44;-1:-1:-1;;;;;39920:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;39979:49:0;;39920:44;;;;;;;;39979:49;;;-1:-1:-1;;;;;39920:44:0;;;;;;39979:49;;;;;;;;;;;;;;;;40045:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;40095:66:0;;;;-1:-1:-1;;;40145:15:0;40095:66;;;;;;;;;;40045:25;40242:23;;;40286:4;:23;;;;-1:-1:-1;;;;;;40294:13:0;;9867:19;:23;;40294:15;40282:832;;;40330:505;40361:38;;40386:12;;-1:-1:-1;;;;;40361:38:0;;;40378:1;;40361:38;;40378:1;;40361:38;40453:212;40522:1;40555:2;40588:14;;;;;;40633:5;40453:30;:212::i;:::-;40422:365;;40723:40;;-1:-1:-1;;;40723:40:0;;;;;;;;;;;40422:365;40830:3;40814:12;:19;;40330:505;;40916:12;40899:13;;:29;40895:43;;40930:8;;;40895:43;40282:832;;;40979:120;41010:40;;41035:14;;;;;-1:-1:-1;;;;;41010:40:0;;;41027:1;;41010:40;;41027:1;;41010:40;41094:3;41078:12;:19;;40979:120;;40282:832;-1:-1:-1;41128:13:0;:28;41178:60;37509:406;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:2;;;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:2;;;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:2;;;532:1;529;522:12;491:2;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;;;;88:557;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:2;;813:1;810;803:12;747:2;699:124;;;:::o;828:160::-;893:20;;949:13;;942:21;932:32;;922:2;;978:1;975;968:12;993:196;1052:6;1105:2;1093:9;1084:7;1080:23;1076:32;1073:2;;;1126:6;1118;1111:22;1073:2;1154:29;1173:9;1154:29;:::i;:::-;1144:39;1063:126;-1:-1:-1;;;1063:126:1:o;1194:270::-;1262:6;1270;1323:2;1311:9;1302:7;1298:23;1294:32;1291:2;;;1344:6;1336;1329:22;1291:2;1372:29;1391:9;1372:29;:::i;:::-;1362:39;;1420:38;1454:2;1443:9;1439:18;1420:38;:::i;:::-;1410:48;;1281:183;;;;;:::o;1469:338::-;1546:6;1554;1562;1615:2;1603:9;1594:7;1590:23;1586:32;1583:2;;;1636:6;1628;1621:22;1583:2;1664:29;1683:9;1664:29;:::i;:::-;1654:39;;1712:38;1746:2;1735:9;1731:18;1712:38;:::i;:::-;1702:48;;1797:2;1786:9;1782:18;1769:32;1759:42;;1573:234;;;;;:::o;1812:696::-;1907:6;1915;1923;1931;1984:3;1972:9;1963:7;1959:23;1955:33;1952:2;;;2006:6;1998;1991:22;1952:2;2034:29;2053:9;2034:29;:::i;:::-;2024:39;;2082:38;2116:2;2105:9;2101:18;2082:38;:::i;:::-;2072:48;;2167:2;2156:9;2152:18;2139:32;2129:42;;2222:2;2211:9;2207:18;2194:32;2249:18;2241:6;2238:30;2235:2;;;2286:6;2278;2271:22;2235:2;2314:22;;2367:4;2359:13;;2355:27;-1:-1:-1;2345:2:1;;2401:6;2393;2386:22;2345:2;2429:73;2494:7;2489:2;2476:16;2471:2;2467;2463:11;2429:73;:::i;:::-;2419:83;;;1942:566;;;;;;;:::o;2513:264::-;2578:6;2586;2639:2;2627:9;2618:7;2614:23;2610:32;2607:2;;;2660:6;2652;2645:22;2607:2;2688:29;2707:9;2688:29;:::i;:::-;2678:39;;2736:35;2767:2;2756:9;2752:18;2736:35;:::i;2782:264::-;2850:6;2858;2911:2;2899:9;2890:7;2886:23;2882:32;2879:2;;;2932:6;2924;2917:22;2879:2;2960:29;2979:9;2960:29;:::i;:::-;2950:39;3036:2;3021:18;;;;3008:32;;-1:-1:-1;;;2869:177:1:o;3051:665::-;3137:6;3145;3198:2;3186:9;3177:7;3173:23;3169:32;3166:2;;;3219:6;3211;3204:22;3166:2;3264:9;3251:23;3293:18;3334:2;3326:6;3323:14;3320:2;;;3355:6;3347;3340:22;3320:2;3398:6;3387:9;3383:22;3373:32;;3443:7;3436:4;3432:2;3428:13;3424:27;3414:2;;3470:6;3462;3455:22;3414:2;3515;3502:16;3541:2;3533:6;3530:14;3527:2;;;3562:6;3554;3547:22;3527:2;3620:7;3615:2;3605:6;3602:1;3598:14;3594:2;3590:23;3586:32;3583:45;3580:2;;;3646:6;3638;3631:22;3580:2;3682;3674:11;;;;;3704:6;;-1:-1:-1;3156:560:1;;-1:-1:-1;;;;3156:560:1:o;3721:190::-;3777:6;3830:2;3818:9;3809:7;3805:23;3801:32;3798:2;;;3851:6;3843;3836:22;3798:2;3879:26;3895:9;3879:26;:::i;3916:255::-;3974:6;4027:2;4015:9;4006:7;4002:23;3998:32;3995:2;;;4048:6;4040;4033:22;3995:2;4092:9;4079:23;4111:30;4135:5;4111:30;:::i;4176:259::-;4245:6;4298:2;4286:9;4277:7;4273:23;4269:32;4266:2;;;4319:6;4311;4304:22;4266:2;4356:9;4350:16;4375:30;4399:5;4375:30;:::i;4440:480::-;4509:6;4562:2;4550:9;4541:7;4537:23;4533:32;4530:2;;;4583:6;4575;4568:22;4530:2;4628:9;4615:23;4661:18;4653:6;4650:30;4647:2;;;4698:6;4690;4683:22;4647:2;4726:22;;4779:4;4771:13;;4767:27;-1:-1:-1;4757:2:1;;4813:6;4805;4798:22;4757:2;4841:73;4906:7;4901:2;4888:16;4883:2;4879;4875:11;4841:73;:::i;4925:190::-;4984:6;5037:2;5025:9;5016:7;5012:23;5008:32;5005:2;;;5058:6;5050;5043:22;5005:2;-1:-1:-1;5086:23:1;;4995:120;-1:-1:-1;4995:120:1:o;5120:264::-;5188:6;5196;5249:2;5237:9;5228:7;5224:23;5220:32;5217:2;;;5270:6;5262;5255:22;5217:2;5311:9;5298:23;5288:33;;5340:38;5374:2;5363:9;5359:18;5340:38;:::i;5389:257::-;5430:3;5468:5;5462:12;5495:6;5490:3;5483:19;5511:63;5567:6;5560:4;5555:3;5551:14;5544:4;5537:5;5533:16;5511:63;:::i;:::-;5628:2;5607:15;-1:-1:-1;;5603:29:1;5594:39;;;;5635:4;5590:50;;5438:208;-1:-1:-1;;5438:208:1:o;5651:979::-;5736:12;;5701:3;;5793:1;5813:18;;;;5866;;;;5893:2;;5947:4;5939:6;5935:17;5925:27;;5893:2;5973;6021;6013:6;6010:14;5990:18;5987:38;5984:2;;;-1:-1:-1;;;6048:33:1;;6104:4;6101:1;6094:15;6134:4;6055:3;6122:17;5984:2;6165:18;6192:104;;;;6310:1;6305:319;;;;6158:466;;6192:104;-1:-1:-1;;6225:24:1;;6213:37;;6270:16;;;;-1:-1:-1;6192:104:1;;6305:319;13816:4;13835:17;;;13885:4;13869:21;;6399:1;6413:165;6427:6;6424:1;6421:13;6413:165;;;6505:14;;6492:11;;;6485:35;6548:16;;;;6442:10;;6413:165;;;6417:3;;6607:6;6602:3;6598:16;6591:23;;6158:466;;;;;;;5709:921;;;;:::o;6635:456::-;6856:3;6884:38;6918:3;6910:6;6884:38;:::i;:::-;6951:6;6945:13;6967:52;7012:6;7008:2;7001:4;6993:6;6989:17;6967:52;:::i;:::-;7035:50;7077:6;7073:2;7069:15;7061:6;7035:50;:::i;:::-;7028:57;6864:227;-1:-1:-1;;;;;;;6864:227:1:o;7514:488::-;-1:-1:-1;;;;;7783:15:1;;;7765:34;;7835:15;;7830:2;7815:18;;7808:43;7882:2;7867:18;;7860:34;;;7930:3;7925:2;7910:18;;7903:31;;;7708:4;;7951:45;;7976:19;;7968:6;7951:45;:::i;:::-;7943:53;7717:285;-1:-1:-1;;;;;;7717:285:1:o;8199:219::-;8348:2;8337:9;8330:21;8311:4;8368:44;8408:2;8397:9;8393:18;8385:6;8368:44;:::i;11401:356::-;11603:2;11585:21;;;11622:18;;;11615:30;11681:34;11676:2;11661:18;;11654:62;11748:2;11733:18;;11575:182::o;13901:128::-;13941:3;13972:1;13968:6;13965:1;13962:13;13959:2;;;13978:18;;:::i;:::-;-1:-1:-1;14014:9:1;;13949:80::o;14034:120::-;14074:1;14100;14090:2;;14105:18;;:::i;:::-;-1:-1:-1;14139:9:1;;14080:74::o;14159:168::-;14199:7;14265:1;14261;14257:6;14253:14;14250:1;14247:21;14242:1;14235:9;14228:17;14224:45;14221:2;;;14272:18;;:::i;:::-;-1:-1:-1;14312:9:1;;14211:116::o;14332:125::-;14372:4;14400:1;14397;14394:8;14391:2;;;14405:18;;:::i;:::-;-1:-1:-1;14442:9:1;;14381:76::o;14462:258::-;14534:1;14544:113;14558:6;14555:1;14552:13;14544:113;;;14634:11;;;14628:18;14615:11;;;14608:39;14580:2;14573:10;14544:113;;;14675:6;14672:1;14669:13;14666:2;;;-1:-1:-1;;14710:1:1;14692:16;;14685:27;14515:205::o;14725:380::-;14804:1;14800:12;;;;14847;;;14868:2;;14922:4;14914:6;14910:17;14900:27;;14868:2;14975;14967:6;14964:14;14944:18;14941:38;14938:2;;;15021:10;15016:3;15012:20;15009:1;15002:31;15056:4;15053:1;15046:15;15084:4;15081:1;15074:15;14938:2;;14780:325;;;:::o;15110:135::-;15149:3;-1:-1:-1;;15170:17:1;;15167:2;;;15190:18;;:::i;:::-;-1:-1:-1;15237:1:1;15226:13;;15157:88::o;15250:112::-;15282:1;15308;15298:2;;15313:18;;:::i;:::-;-1:-1:-1;15347:9:1;;15288:74::o;15367:127::-;15428:10;15423:3;15419:20;15416:1;15409:31;15459:4;15456:1;15449:15;15483:4;15480:1;15473:15;15499:127;15560:10;15555:3;15551:20;15548:1;15541:31;15591:4;15588:1;15581:15;15615:4;15612:1;15605:15;15631:127;15692:10;15687:3;15683:20;15680:1;15673:31;15723:4;15720:1;15713:15;15747:4;15744:1;15737:15;15763:131;-1:-1:-1;;;;;;15837:32:1;;15827:43;;15817:2;;15884:1;15881;15874:12

Swarm Source

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