ETH Price: $3,462.88 (-1.25%)
Gas: 3 Gwei

Token

TTTreasures (TTT)
 

Overview

Max Total Supply

369 TTT

Holders

283

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
ephinity.eth
Balance
1 TTT
0x4ba83871fa90f5d899098f350df695b88154651d
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:
ttTreasures

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;

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

// File: @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/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/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: @openzeppelin/contracts/utils/Address.sol


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/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/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/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/ERC721.sol


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

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

// File: @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/cryptography/ECDSA.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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

// File: contracts/tt_treasures_v2_final.sol


pragma solidity ^0.8.0;



contract ttTreasures is ERC721, Ownable {
  using Strings for uint256;
  using ECDSA for bytes32;

  //NFT params
  string public baseURI;
  string public defaultURI;
  string public mycontractURI;
  uint256 private currentSupply;

  //mint structure
  struct StageSettingStr { 
    uint256 price;
    uint256 stageLimit;
    uint256 addrLimit;
    uint8 usePrevMintCountOffset;
  }

  //mint parameters
  uint256 public nextId = 1;
  uint8 public stage;
  mapping(uint8 => StageSettingStr) public stageSettings;  //stageSettings
  mapping(uint8 => mapping(address => uint256)) public mintCount;
  address public signer;     //WL signing key
  bool public mintDisabled;

  //contract state
  bool public paused = false;
  bool public finalizeBaseUri;

  //royalty
  address public royaltyAddr;
  uint256 public royaltyBasis;

  //sale holders
  address[] public fundRecipients = [
    0x9cEC6EAc6c5421B64516221a65223734Ab130952,
    0x1dac58aFEA554a46EA01704acDa519EdE00ad088,
    0x357cA9C566D60C93087207AB2419b05E2a953a53,
    0xb5fF9ffa5De8184a8D886A2bFc80bdbCE5959cbF,
    0x4624B143a154846468fb9Bf78c01abe37829dfF9,
    0x3D957720AD5F6489b670F591C83083dD00a4a584,
    0x1e5bac841a352EFe5e6B274B27DCffA9102ec50E,
    0x557189EC711Eea9a6d95db347016BAb5A6bf1B10,
    0xa671041Fd8058De2Cde34250dfAc7E3a858B50f1,
    0x044c4DfC95d6F15C1ba0aD90BcCEAd931e8073dE,
    0xA9CB2e9b0F760Df088A5Cf3480ebE3B70f10Dc8A,
    0x533e72F8570f41b772B470891a487fa180a9b7c3 ];  //fund recipients
  uint256[] public receivePercentagePt = [ 1500, 1500, 1000, 1200, 1000, 1000, 750, 750, 500, 500, 200, 100];   //distribution in basis points

  //stage2 withdraw
  address public constant TREASURY = 0x662FcE3F30Df2c9DBC40f87792876C818f50cAd8;
  uint256 public constant TREASURYPT = 8000;
  uint256 public constant INITWITHDRAWLIMIT = 6 ether;
  bool public isWithdrawStage2;
  uint256 public withdrawnBal;

  constructor(
    string memory _name,
    string memory _symbol,
    string memory _initBaseURI,
    string memory _defaultURI,
    address _signer,
    address _royaltyAddr,
    uint256 _royaltyBasis
) ERC721(_name, _symbol) {
    setBaseURI(_initBaseURI);
    defaultURI = _defaultURI;
    stageSettings[1] = StageSettingStr(0.1 ether, 800, 0, 0);
    stageSettings[2] = StageSettingStr(0.1 ether, 888, 2, 0);
    signer = _signer;
    royaltyAddr = _royaltyAddr;
    royaltyBasis = _royaltyBasis;
}

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

  // public
  function supportsInterface(bytes4 interfaceId) public view override(ERC721) returns (bool) {
      return interfaceId == 0xe8a3d485 /* contractURI() */ ||
      interfaceId == 0x2a55205a /* ERC-2981 royaltyInfo() */ ||
      super.supportsInterface(interfaceId);
  }

  function mint(uint8 _mint_num, uint8 _wl_max, bytes memory _signature) public payable {
    require(!paused, "Contract paused");
    require(!mintDisabled, "Minting disabled");
    require(stage > 0, "Invalid stage");
    uint256 supply = totalSupply();
    require(supply + _mint_num <= stageSettings[stage].stageLimit, "Hit stage limit");
    require(msg.value >= _mint_num * stageSettings[stage].price, "Insufficient eth");
    require(_mint_num > 0,"at least 1 mint");
    uint8 prevMintCountOffset = stageSettings[stage].usePrevMintCountOffset;
    //check WL condition
    if(_signature.length > 0){
      //mint via WL
      require(checkSig(msg.sender, _wl_max, _signature), "Invalid _signature");
      require(_mint_num + mintCount[stage-prevMintCountOffset][msg.sender] <= _wl_max, "Exceed WL limit");
    } else {
      //public mint
      require(_mint_num + mintCount[stage-prevMintCountOffset][msg.sender] <= stageSettings[stage].addrLimit, "Exceed address mint limit");

    }

    //increment mintCount
    mintCount[stage-prevMintCountOffset][msg.sender] += _mint_num;

    //mint
    currentSupply += _mint_num;
    for (uint256 i = 0; i < _mint_num; i++) {
      _safeMint(msg.sender, nextId + i);
    }
    nextId += _mint_num;
  }


  function checkSig(address _addr, uint8 _wl_max, bytes memory _signature) public view returns(bool){
    return signer == keccak256(abi.encodePacked(address(this), _addr, _wl_max, stage)).recover(_signature);
  }

  function disableMint() public onlyOwner {
    mintDisabled = true;
  }


  function tokensOfOwner(address _owner, uint startId, uint endId) external view returns(uint256[] memory ) {
    uint256 tokenCount = balanceOf(_owner);
    if (tokenCount == 0) {
        return new uint256[](0);
    } else {
        uint256[] memory result = new uint256[](tokenCount);
        uint256 index = 0;

        for (uint256 tokenId = startId; tokenId <= endId; tokenId++) {
            if (index == tokenCount) break;

            if (ownerOf(tokenId) == _owner) {
                result[index] = tokenId;
                index++;
            }
        }
        return result;
    }
  }function totalSupply() public view returns (uint256) {
    return currentSupply;
  }

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

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

  function contractURI() public view returns (string memory) {
    return string(abi.encodePacked(mycontractURI));
  }


  //ERC-2981
  function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view 
  returns (address receiver, uint256 royaltyAmount){
    return (royaltyAddr, _salePrice * royaltyBasis / 10000);
  }

  function setRoyalty(address _royaltyAddr, uint256 _royaltyBasis) public onlyOwner {
    royaltyAddr = _royaltyAddr;
    royaltyBasis = _royaltyBasis;
  }


  function setBaseURI(string memory _newBaseURI) public onlyOwner {
    require(!finalizeBaseUri, "BaseURI already finalized");
    baseURI = _newBaseURI;
  }


  function finalizeBaseURI() public onlyOwner {
    finalizeBaseUri = true;
  }


  function setContractURI(string memory _contractURI) public onlyOwner {
    mycontractURI = _contractURI;
  }

  function nextStage() public onlyOwner {
    require(stageSettings[stage+1].stageLimit != 0, "Stage not initialized");
    stage++;
  }
  function setStageSettings(uint8 _newStage, uint256 _price, uint256 _supplyLimit, uint8 _addrLimit, uint8 _usePrevMintCountOffset) public onlyOwner {
    require(_newStage > stage, "Cannot modify stage");
    require(_newStage - _usePrevMintCountOffset >= 0, "Offset cannot go negative");
    stageSettings[_newStage].price = _price;
    stageSettings[_newStage].stageLimit = _supplyLimit;
    stageSettings[_newStage].addrLimit = _addrLimit;
    stageSettings[_newStage].usePrevMintCountOffset = _usePrevMintCountOffset;
  }


  function pause(bool _state) public onlyOwner {
    paused = _state;
  }
  function reserveMint(uint256 _mintAmount, address _to) public onlyOwner {    
    currentSupply += _mintAmount;
    for (uint256 i = 0; i < _mintAmount; i++) {
      _safeMint(_to, nextId + i);
    }
    nextId += _mintAmount;
  }

  //fund withdraw functions ---

  function withdrawFund() public onlyOwner {
    uint256 currentBal = address(this).balance;
    require(currentBal > 0, "No balance left");

    if(!isWithdrawStage2){
      //stage1 withdraw
      if(currentBal + withdrawnBal >= INITWITHDRAWLIMIT){
        isWithdrawStage2 = true; //next withdraw TX will be stage2
        currentBal = INITWITHDRAWLIMIT - withdrawnBal;    //split only first 6eth for this current TX

      }else{
        //stage1 withdrawal before 6eth
        withdrawnBal += currentBal;
      }
    }else{
      //stage2 withdraw
      uint256 treasuryWithdraw = currentBal * TREASURYPT / 10000;  //treasury takes 80%

      _withdraw(TREASURY, treasuryWithdraw);
      currentBal -= treasuryWithdraw;  //team splits the rest of 20%
    }

    for (uint256 i = 0; i < fundRecipients.length; i++) {
      _withdraw(fundRecipients[i], currentBal * receivePercentagePt[i] / 10000);
    }
  }

  function _withdraw(address _addr, uint256 _amt) private {
    (bool success,) = _addr.call{value: _amt}("");
    require(success, "Transfer failed");
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_defaultURI","type":"string"},{"internalType":"address","name":"_signer","type":"address"},{"internalType":"address","name":"_royaltyAddr","type":"address"},{"internalType":"uint256","name":"_royaltyBasis","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"INITWITHDRAWLIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TREASURY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TREASURYPT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint8","name":"_wl_max","type":"uint8"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"checkSig","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finalizeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finalizeBaseUri","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"fundRecipients","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWithdrawStage2","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mint_num","type":"uint8"},{"internalType":"uint8","name":"_wl_max","type":"uint8"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"address","name":"","type":"address"}],"name":"mintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mycontractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextStage","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"receivePercentagePt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"reserveMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyBasis","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyAddr","type":"address"},{"internalType":"uint256","name":"_royaltyBasis","type":"uint256"}],"name":"setRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_newStage","type":"uint8"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_supplyLimit","type":"uint256"},{"internalType":"uint8","name":"_addrLimit","type":"uint8"},{"internalType":"uint8","name":"_usePrevMintCountOffset","type":"uint8"}],"name":"setStageSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stage","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"stageSettings","outputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"stageLimit","type":"uint256"},{"internalType":"uint256","name":"addrLimit","type":"uint256"},{"internalType":"uint8","name":"usePrevMintCountOffset","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"startId","type":"uint256"},{"internalType":"uint256","name":"endId","type":"uint256"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":[],"name":"withdrawFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawnBal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

6001600b55600f805460ff60a81b19169055610200604052739cec6eac6c5421b64516221a65223734ab1309526080908152731dac58afea554a46ea01704acda519ede00ad08860a05273357ca9c566d60c93087207ab2419b05e2a953a5360c05273b5ff9ffa5de8184a8d886a2bfc80bdbce5959cbf60e052734624b143a154846468fb9bf78c01abe37829dff961010052733d957720ad5f6489b670f591c83083dd00a4a58461012052731e5bac841a352efe5e6b274b27dcffa9102ec50e6101405273557189ec711eea9a6d95db347016bab5a6bf1b106101605273a671041fd8058de2cde34250dfac7e3a858b50f16101805273044c4dfc95d6f15c1ba0ad90bccead931e8073de6101a05273a9cb2e9b0f760df088a5cf3480ebe3b70f10dc8a6101c05273533e72f8570f41b772b470891a487fa180a9b7c36101e0526200015190601290600c6200056d565b5060408051610180810182526105dc80825260208201526103e89181018290526104b060608201526080810182905260a08101919091526102ee60c0820181905260e08201526101f4610100820181905261012082015260c86101408201526064610160820152620001c890601390600c620005d7565b50348015620001d657600080fd5b5060405162003beb38038062003beb833981016040819052620001f99162000783565b865187908790620002129060009060208501906200061b565b508051620002289060019060208401906200061b565b505050620002456200023f6200044260201b60201c565b62000446565b620002508562000498565b8351620002659060089060208701906200061b565b50604080516080808201835267016345785d8a000080835261032060208085019182526000858701818152606080880183815260018452600d80865298517ffd54ff1ed53f34a900b24c5ba64f85761163b5d82d98a47b9bd80e45466993c55594517ffd54ff1ed53f34a900b24c5ba64f85761163b5d82d98a47b9bd80e45466993c65590517ffd54ff1ed53f34a900b24c5ba64f85761163b5d82d98a47b9bd80e45466993c75592517ffd54ff1ed53f34a900b24c5ba64f85761163b5d82d98a47b9bd80e45466993c8805460ff1990811660ff93841617909155885196870189529486526103788684019081526002988701898152948701838152989092529590915292517f10a81eed9d63d16face5e76357905348e6253d3394086026bb2bf2145d7cc2495591517f10a81eed9d63d16face5e76357905348e6253d3394086026bb2bf2145d7cc24a5590517f10a81eed9d63d16face5e76357905348e6253d3394086026bb2bf2145d7cc24b5591517f10a81eed9d63d16face5e76357905348e6253d3394086026bb2bf2145d7cc24c80549093169116179055600f80546001600160a01b03199081166001600160a01b039586161790915560108054909116929093169190911790915560115550620008be92505050565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6006546001600160a01b03163314620004f85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600f54600160b01b900460ff1615620005545760405162461bcd60e51b815260206004820152601960248201527f4261736555524920616c72656164792066696e616c697a6564000000000000006044820152606401620004ef565b8051620005699060079060208401906200061b565b5050565b828054828255906000526020600020908101928215620005c5579160200282015b82811115620005c557825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200058e565b50620005d392915062000698565b5090565b828054828255906000526020600020908101928215620005c5579160200282015b82811115620005c5578251829061ffff16905591602001919060010190620005f8565b82805462000629906200086b565b90600052602060002090601f0160209004810192826200064d5760008555620005c5565b82601f106200066857805160ff1916838001178555620005c5565b82800160010185558215620005c5579182015b82811115620005c55782518255916020019190600101906200067b565b5b80821115620005d3576000815560010162000699565b80516001600160a01b0381168114620006c757600080fd5b919050565b600082601f830112620006de57600080fd5b81516001600160401b0380821115620006fb57620006fb620008a8565b604051601f8301601f19908116603f01168101908282118183101715620007265762000726620008a8565b816040528381526020925086838588010111156200074357600080fd5b600091505b8382101562000767578582018301518183018401529082019062000748565b83821115620007795760008385830101525b9695505050505050565b600080600080600080600060e0888a0312156200079f57600080fd5b87516001600160401b0380821115620007b757600080fd5b620007c58b838c01620006cc565b985060208a0151915080821115620007dc57600080fd5b620007ea8b838c01620006cc565b975060408a01519150808211156200080157600080fd5b6200080f8b838c01620006cc565b965060608a01519150808211156200082657600080fd5b50620008358a828b01620006cc565b9450506200084660808901620006af565b92506200085660a08901620006af565b915060c0880151905092959891949750929550565b600181811c908216806200088057607f821691505b60208210811415620008a257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61331d80620008ce6000396000f3fe6080604052600436106102ff5760003560e01c80636c0360eb11610190578063c040e6b8116100dc578063e8a3d48511610095578063ee3743ab1161006f578063ee3743ab1461095b578063f053d37014610970578063f2fde38b14610991578063fb108c2a146109b157600080fd5b8063e8a3d485146108dd578063e985e9c5146108f2578063eb1503a71461093b57600080fd5b8063c040e6b814610819578063c6ec690914610845578063c839fe941461085b578063c87b56dd14610888578063e07fa3c1146108a8578063e7e989c0146108bd57600080fd5b8063938e3d7b11610149578063a22cb46511610123578063a22cb46514610751578063aba70c5614610771578063b7aa670a146107d9578063b88d4fde146107f957600080fd5b8063938e3d7b146106fb578063956feccf1461071b57806395d89b411461073c57600080fd5b80636c0360eb1461066757806370a082311461067c578063715018a61461069c578063722926af146106b15780638cdee851146106c75780638da5cb5b146106dd57600080fd5b806334452f381161024f5780635c975abb1161020857806361b8ce8c116101e257806361b8ce8c146106095780636352211e1461061f5780636379b51e1461063f578063639d7e111461065257600080fd5b80635c975abb146105905780635e9aa529146105b157806360b02f70146105e957600080fd5b806334452f38146104f557806337c3fdbc1461050a5780633a367a671461051f57806342842e0e146105345780634ae917c51461055457806355f804b31461057057600080fd5b80631289b36e116102bc57806323b872dd1161029657806323b872dd1461044e5780632a55205a1461046e5780632d2c5565146104ad5780633009c083146104d557600080fd5b80631289b36e146103f557806318160ddd1461040f578063238ac9331461042e57600080fd5b806301ffc9a71461030457806302329a291461033957806306fdde031461035b578063081812fc1461037d578063095ea7b3146103b557806310fd332b146103d5575b600080fd5b34801561031057600080fd5b5061032461031f366004612d13565b6109d1565b60405190151581526020015b60405180910390f35b34801561034557600080fd5b50610359610354366004612cf8565b610a17565b005b34801561036757600080fd5b50610370610a68565b6040516103309190613018565b34801561038957600080fd5b5061039d610398366004612d96565b610afa565b6040516001600160a01b039091168152602001610330565b3480156103c157600080fd5b506103596103d0366004612c3d565b610b8f565b3480156103e157600080fd5b506103596103f0366004612c3d565b610ca5565b34801561040157600080fd5b506014546103249060ff1681565b34801561041b57600080fd5b50600a545b604051908152602001610330565b34801561043a57600080fd5b50600f5461039d906001600160a01b031681565b34801561045a57600080fd5b50610359610469366004612b6f565b610cf5565b34801561047a57600080fd5b5061048e610489366004612dd2565b610d26565b604080516001600160a01b039093168352602083019190915201610330565b3480156104b957600080fd5b5061039d73662fce3f30df2c9dbc40f87792876c818f50cad881565b3480156104e157600080fd5b5060105461039d906001600160a01b031681565b34801561050157600080fd5b50610359610d61565b34801561051657600080fd5b50610359610da0565b34801561052b57600080fd5b50610370610ddf565b34801561054057600080fd5b5061035961054f366004612b6f565b610e6d565b34801561056057600080fd5b506104206753444835ec58000081565b34801561057c57600080fd5b5061035961058b366004612d4d565b610e88565b34801561059c57600080fd5b50600f5461032490600160a81b900460ff1681565b3480156105bd57600080fd5b506104206105cc366004612e0f565b600e60209081526000928352604080842090915290825290205481565b3480156105f557600080fd5b50610359610604366004612daf565b610f23565b34801561061557600080fd5b50610420600b5481565b34801561062b57600080fd5b5061039d61063a366004612d96565b610fb5565b61035961064d366004612e82565b61102c565b34801561065e57600080fd5b50610370611487565b34801561067357600080fd5b50610370611494565b34801561068857600080fd5b50610420610697366004612b21565b6114a1565b3480156106a857600080fd5b50610359611528565b3480156106bd57600080fd5b5061042060155481565b3480156106d357600080fd5b50610420611f4081565b3480156106e957600080fd5b506006546001600160a01b031661039d565b34801561070757600080fd5b50610359610716366004612d4d565b61155e565b34801561072757600080fd5b50600f5461032490600160a01b900460ff1681565b34801561074857600080fd5b5061037061159b565b34801561075d57600080fd5b5061035961076c366004612c13565b6115aa565b34801561077d57600080fd5b506107b661078c366004612df4565b600d6020526000908152604090208054600182015460028301546003909301549192909160ff1684565b6040805194855260208501939093529183015260ff166060820152608001610330565b3480156107e557600080fd5b5061039d6107f4366004612d96565b6115b5565b34801561080557600080fd5b50610359610814366004612bab565b6115df565b34801561082557600080fd5b50600c546108339060ff1681565b60405160ff9091168152602001610330565b34801561085157600080fd5b5061042060115481565b34801561086757600080fd5b5061087b610876366004612c67565b611617565b6040516103309190612fd4565b34801561089457600080fd5b506103706108a3366004612d96565b61170e565b3480156108b457600080fd5b50610359611863565b3480156108c957600080fd5b506104206108d8366004612d96565b611a10565b3480156108e957600080fd5b50610370611a31565b3480156108fe57600080fd5b5061032461090d366004612b3c565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561094757600080fd5b50610324610956366004612c9a565b611a59565b34801561096757600080fd5b50610359611aed565b34801561097c57600080fd5b50600f5461032490600160b01b900460ff1681565b34801561099d57600080fd5b506103596109ac366004612b21565b611bb7565b3480156109bd57600080fd5b506103596109cc366004612e2b565b611c52565b600063e8a3d48560e01b6001600160e01b031983161480610a02575063152a902d60e11b6001600160e01b03198316145b80610a115750610a1182611d60565b92915050565b6006546001600160a01b03163314610a4a5760405162461bcd60e51b8152600401610a419061307d565b60405180910390fd5b600f8054911515600160a81b0260ff60a81b19909216919091179055565b606060008054610a77906131d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa3906131d9565b8015610af05780601f10610ac557610100808354040283529160200191610af0565b820191906000526020600020905b815481529060010190602001808311610ad357829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610b735760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a41565b506000908152600460205260409020546001600160a01b031690565b6000610b9a82610fb5565b9050806001600160a01b0316836001600160a01b03161415610c085760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a41565b336001600160a01b0382161480610c245750610c24813361090d565b610c965760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a41565b610ca08383611db0565b505050565b6006546001600160a01b03163314610ccf5760405162461bcd60e51b8152600401610a419061307d565b601080546001600160a01b0319166001600160a01b039390931692909217909155601155565b610cff3382611e1e565b610d1b5760405162461bcd60e51b8152600401610a41906130b2565b610ca0838383611f15565b60105460115460009182916001600160a01b039091169061271090610d4b9086613154565b610d559190613140565b915091505b9250929050565b6006546001600160a01b03163314610d8b5760405162461bcd60e51b8152600401610a419061307d565b600f805460ff60a01b1916600160a01b179055565b6006546001600160a01b03163314610dca5760405162461bcd60e51b8152600401610a419061307d565b600f805460ff60b01b1916600160b01b179055565b60088054610dec906131d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610e18906131d9565b8015610e655780601f10610e3a57610100808354040283529160200191610e65565b820191906000526020600020905b815481529060010190602001808311610e4857829003601f168201915b505050505081565b610ca0838383604051806020016040528060008152506115df565b6006546001600160a01b03163314610eb25760405162461bcd60e51b8152600401610a419061307d565b600f54600160b01b900460ff1615610f0c5760405162461bcd60e51b815260206004820152601960248201527f4261736555524920616c72656164792066696e616c697a6564000000000000006044820152606401610a41565b8051610f1f9060079060208401906129b5565b5050565b6006546001600160a01b03163314610f4d5760405162461bcd60e51b8152600401610a419061307d565b81600a6000828254610f5f9190613103565b90915550600090505b82811015610f9957610f878282600b54610f829190613103565b6120b1565b80610f9181613214565b915050610f68565b5081600b6000828254610fac9190613103565b90915550505050565b6000818152600260205260408120546001600160a01b031680610a115760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610a41565b600f54600160a81b900460ff16156110785760405162461bcd60e51b815260206004820152600f60248201526e10dbdb9d1c9858dd081c185d5cd959608a1b6044820152606401610a41565b600f54600160a01b900460ff16156110c55760405162461bcd60e51b815260206004820152601060248201526f135a5b9d1a5b99c8191a5cd8589b195960821b6044820152606401610a41565b600c5460ff166111075760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420737461676560981b6044820152606401610a41565b6000611112600a5490565b600c5460ff9081166000908152600d602052604090206001015491925061113b90861683613103565b111561117b5760405162461bcd60e51b815260206004820152600f60248201526e121a5d081cdd1859d9481b1a5b5a5d608a1b6044820152606401610a41565b600c5460ff9081166000908152600d602052604090205461119d918616613154565b3410156111df5760405162461bcd60e51b815260206004820152601060248201526f092dce6eaccccd2c6d2cadce840cae8d60831b6044820152606401610a41565b60008460ff16116112245760405162461bcd60e51b815260206004820152600f60248201526e185d081b19585cdd080c481b5a5b9d608a1b6044820152606401610a41565b600c5460ff9081166000908152600d602052604090206003015483519116901561132257611253338585611a59565b6112945760405162461bcd60e51b8152602060048201526012602482015271496e76616c6964205f7369676e617475726560701b6044820152606401610a41565b600c5460ff80861691600e916000916112af9186911661318a565b60ff9081168252602080830193909352604091820160009081203382529093529120546112dd918816613103565b111561131d5760405162461bcd60e51b815260206004820152600f60248201526e115e18d959590815d3081b1a5b5a5d608a1b6044820152606401610a41565b6113c6565b600c5460ff166000818152600d602052604081206002015491600e919061134a90859061318a565b60ff908116825260208083019390935260409182016000908120338252909352912054611378918816613103565b11156113c65760405162461bcd60e51b815260206004820152601960248201527f4578636565642061646472657373206d696e74206c696d6974000000000000006044820152606401610a41565b600c5460ff80871691600e916000916113e19186911661318a565b60ff1681526020808201929092526040908101600090812033825290925281208054909190611411908490613103565b925050819055508460ff16600a600082825461142d9190613103565b90915550600090505b8560ff16811015611465576114533382600b54610f829190613103565b8061145d81613214565b915050611436565b508460ff16600b600082825461147b9190613103565b90915550505050505050565b60098054610dec906131d9565b60078054610dec906131d9565b60006001600160a01b03821661150c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610a41565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146115525760405162461bcd60e51b8152600401610a419061307d565b61155c60006120cb565b565b6006546001600160a01b031633146115885760405162461bcd60e51b8152600401610a419061307d565b8051610f1f9060099060208401906129b5565b606060018054610a77906131d9565b610f1f33838361211d565b601281815481106115c557600080fd5b6000918252602090912001546001600160a01b0316905081565b6115e93383611e1e565b6116055760405162461bcd60e51b8152600401610a41906130b2565b611611848484846121ec565b50505050565b60606000611624856114a1565b905080611641575050604080516000815260208101909152611707565b60008167ffffffffffffffff81111561165c5761165c6132bb565b604051908082528060200260200182016040528015611685578160200160208202803683370190505b5090506000855b85811161170057838214156116a057611700565b876001600160a01b03166116b382610fb5565b6001600160a01b031614156116ee57808383815181106116d5576116d56132a5565b6020908102919091010152816116ea81613214565b9250505b806116f881613214565b91505061168c565b5090925050505b9392505050565b6000818152600260205260409020546060906001600160a01b031661178d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a41565b600061179761221f565b9050600081511161183257600880546117af906131d9565b80601f01602080910402602001604051908101604052809291908181526020018280546117db906131d9565b80156118285780601f106117fd57610100808354040283529160200191611828565b820191906000526020600020905b81548152906001019060200180831161180b57829003601f168201915b5050505050611707565b8061183c8461222e565b60405160200161184d929190612ecc565b6040516020818303038152906040529392505050565b6006546001600160a01b0316331461188d5760405162461bcd60e51b8152600401610a419061307d565b47806118cd5760405162461bcd60e51b815260206004820152600f60248201526e139bc818985b185b98d9481b19599d608a1b6044820152606401610a41565b60145460ff16611939576753444835ec580000601554826118ee9190613103565b1061191c576014805460ff19166001179055601554611915906753444835ec580000613173565b9050611982565b806015600082825461192e9190613103565b909155506119829050565b600061271061194a611f4084613154565b6119549190613140565b905061197473662fce3f30df2c9dbc40f87792876c818f50cad88261232c565b61197e8183613173565b9150505b60005b601254811015610f1f576119fe601282815481106119a5576119a56132a5565b9060005260206000200160009054906101000a90046001600160a01b0316612710601384815481106119d9576119d96132a5565b9060005260206000200154856119ef9190613154565b6119f99190613140565b61232c565b80611a0881613214565b915050611985565b60138181548110611a2057600080fd5b600091825260209091200154905081565b60606009604051602001611a459190612efb565b604051602081830303815290604052905090565b600c546040516bffffffffffffffffffffffff1930606090811b8216602084015286901b1660348201526001600160f81b031960f885811b821660488401529290921b9091166049820152600090611ad4908390604a01604051602081830303815290604052805190602001206123c190919063ffffffff16565b600f546001600160a01b03918216911614949350505050565b6006546001600160a01b03163314611b175760405162461bcd60e51b8152600401610a419061307d565b600c54600d90600090611b2e9060ff16600161311b565b60ff168152602081019190915260400160002060010154611b895760405162461bcd60e51b815260206004820152601560248201527414dd1859d9481b9bdd081a5b9a5d1a585b1a5e9959605a1b6044820152606401610a41565b600c805460ff16906000611b9c8361322f565b91906101000a81548160ff021916908360ff16021790555050565b6006546001600160a01b03163314611be15760405162461bcd60e51b8152600401610a419061307d565b6001600160a01b038116611c465760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a41565b611c4f816120cb565b50565b6006546001600160a01b03163314611c7c5760405162461bcd60e51b8152600401610a419061307d565b600c5460ff90811690861611611cca5760405162461bcd60e51b815260206004820152601360248201527243616e6e6f74206d6f6469667920737461676560681b6044820152606401610a41565b6000611cd6828761318a565b60ff161015611d275760405162461bcd60e51b815260206004820152601960248201527f4f66667365742063616e6e6f7420676f206e65676174697665000000000000006044820152606401610a41565b60ff9485166000908152600d602052604090209384556001840192909255831660028301556003909101805460ff191691909216179055565b60006001600160e01b031982166380ac58cd60e01b1480611d9157506001600160e01b03198216635b5e139f60e01b145b80610a1157506301ffc9a760e01b6001600160e01b0319831614610a11565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611de582610fb5565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611e975760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a41565b6000611ea283610fb5565b9050806001600160a01b0316846001600160a01b03161480611edd5750836001600160a01b0316611ed284610afa565b6001600160a01b0316145b80611f0d57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611f2882610fb5565b6001600160a01b031614611f8c5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610a41565b6001600160a01b038216611fee5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a41565b611ff9600082611db0565b6001600160a01b0383166000908152600360205260408120805460019290612022908490613173565b90915550506001600160a01b0382166000908152600360205260408120805460019290612050908490613103565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610f1f8282604051806020016040528060008152506123e5565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316141561217f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a41565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6121f7848484611f15565b61220384848484612418565b6116115760405162461bcd60e51b8152600401610a419061302b565b606060078054610a77906131d9565b6060816122525750506040805180820190915260018152600360fc1b602082015290565b8160005b811561227c578061226681613214565b91506122759050600a83613140565b9150612256565b60008167ffffffffffffffff811115612297576122976132bb565b6040519080825280601f01601f1916602001820160405280156122c1576020820181803683370190505b5090505b8415611f0d576122d6600183613173565b91506122e3600a8661324f565b6122ee906030613103565b60f81b818381518110612303576123036132a5565b60200101906001600160f81b031916908160001a905350612325600a86613140565b94506122c5565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612379576040519150601f19603f3d011682016040523d82523d6000602084013e61237e565b606091505b5050905080610ca05760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610a41565b60008060006123d08585612525565b915091506123dd81612592565b509392505050565b6123ef838361274d565b6123fc6000848484612418565b610ca05760405162461bcd60e51b8152600401610a419061302b565b60006001600160a01b0384163b1561251a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061245c903390899088908890600401612f97565b602060405180830381600087803b15801561247657600080fd5b505af19250505080156124a6575060408051601f3d908101601f191682019092526124a391810190612d30565b60015b612500573d8080156124d4576040519150601f19603f3d011682016040523d82523d6000602084013e6124d9565b606091505b5080516124f85760405162461bcd60e51b8152600401610a419061302b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f0d565b506001949350505050565b60008082516041141561255c5760208301516040840151606085015160001a6125508782858561288f565b94509450505050610d5a565b825160401415612586576020830151604084015161257b86838361297c565b935093505050610d5a565b50600090506002610d5a565b60008160048111156125a6576125a661328f565b14156125af5750565b60018160048111156125c3576125c361328f565b14156126115760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610a41565b60028160048111156126255761262561328f565b14156126735760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610a41565b60038160048111156126875761268761328f565b14156126e05760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610a41565b60048160048111156126f4576126f461328f565b1415611c4f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610a41565b6001600160a01b0382166127a35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a41565b6000818152600260205260409020546001600160a01b0316156128085760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a41565b6001600160a01b0382166000908152600360205260408120805460019290612831908490613103565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156128c65750600090506003612973565b8460ff16601b141580156128de57508460ff16601c14155b156128ef5750600090506004612973565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612943573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661296c57600060019250925050612973565b9150600090505b94509492505050565b6000806001600160ff1b0383168161299960ff86901c601b613103565b90506129a78782888561288f565b935093505050935093915050565b8280546129c1906131d9565b90600052602060002090601f0160209004810192826129e35760008555612a29565b82601f106129fc57805160ff1916838001178555612a29565b82800160010185558215612a29579182015b82811115612a29578251825591602001919060010190612a0e565b50612a35929150612a39565b5090565b5b80821115612a355760008155600101612a3a565b600067ffffffffffffffff80841115612a6957612a696132bb565b604051601f8501601f19908116603f01168101908282118183101715612a9157612a916132bb565b81604052809350858152868686011115612aaa57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114612adb57600080fd5b919050565b80358015158114612adb57600080fd5b600082601f830112612b0157600080fd5b61170783833560208501612a4e565b803560ff81168114612adb57600080fd5b600060208284031215612b3357600080fd5b61170782612ac4565b60008060408385031215612b4f57600080fd5b612b5883612ac4565b9150612b6660208401612ac4565b90509250929050565b600080600060608486031215612b8457600080fd5b612b8d84612ac4565b9250612b9b60208501612ac4565b9150604084013590509250925092565b60008060008060808587031215612bc157600080fd5b612bca85612ac4565b9350612bd860208601612ac4565b925060408501359150606085013567ffffffffffffffff811115612bfb57600080fd5b612c0787828801612af0565b91505092959194509250565b60008060408385031215612c2657600080fd5b612c2f83612ac4565b9150612b6660208401612ae0565b60008060408385031215612c5057600080fd5b612c5983612ac4565b946020939093013593505050565b600080600060608486031215612c7c57600080fd5b612c8584612ac4565b95602085013595506040909401359392505050565b600080600060608486031215612caf57600080fd5b612cb884612ac4565b9250612cc660208501612b10565b9150604084013567ffffffffffffffff811115612ce257600080fd5b612cee86828701612af0565b9150509250925092565b600060208284031215612d0a57600080fd5b61170782612ae0565b600060208284031215612d2557600080fd5b8135611707816132d1565b600060208284031215612d4257600080fd5b8151611707816132d1565b600060208284031215612d5f57600080fd5b813567ffffffffffffffff811115612d7657600080fd5b8201601f81018413612d8757600080fd5b611f0d84823560208401612a4e565b600060208284031215612da857600080fd5b5035919050565b60008060408385031215612dc257600080fd5b82359150612b6660208401612ac4565b60008060408385031215612de557600080fd5b50508035926020909101359150565b600060208284031215612e0657600080fd5b61170782612b10565b60008060408385031215612e2257600080fd5b612b5883612b10565b600080600080600060a08688031215612e4357600080fd5b612e4c86612b10565b94506020860135935060408601359250612e6860608701612b10565b9150612e7660808701612b10565b90509295509295909350565b600080600060608486031215612e9757600080fd5b612cb884612b10565b60008151808452612eb88160208601602086016131ad565b601f01601f19169290920160200192915050565b60008351612ede8184602088016131ad565b835190830190612ef28183602088016131ad565b01949350505050565b600080835481600182811c915080831680612f1757607f831692505b6020808410821415612f3757634e487b7160e01b86526022600452602486fd5b818015612f4b5760018114612f5c57612f89565b60ff19861689528489019650612f89565b60008a81526020902060005b86811015612f815781548b820152908501908301612f68565b505084890196505b509498975050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612fca90830184612ea0565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561300c57835183529284019291840191600101612ff0565b50909695505050505050565b6020815260006117076020830184612ea0565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561311657613116613263565b500190565b600060ff821660ff84168060ff0382111561313857613138613263565b019392505050565b60008261314f5761314f613279565b500490565b600081600019048311821515161561316e5761316e613263565b500290565b60008282101561318557613185613263565b500390565b600060ff821660ff8416808210156131a4576131a4613263565b90039392505050565b60005b838110156131c85781810151838201526020016131b0565b838111156116115750506000910152565b600181811c908216806131ed57607f821691505b6020821081141561320e57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561322857613228613263565b5060010190565b600060ff821660ff81141561324657613246613263565b60010192915050565b60008261325e5761325e613279565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611c4f57600080fdfea26469706673582212200ed79e70fe1f1d399e02a29bad15c58a306ea498da63c7420d7bba97706ccb0064736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000007b4e7c5aca0316e05f138630b21dc5487ea0db0000000000000000000000000057dac90c84da6437e8a3588ae1bf29d7198f7ca500000000000000000000000000000000000000000000000000000000000002ee000000000000000000000000000000000000000000000000000000000000000b545454726561737572657300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035454540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002268747470733a2f2f74747472656173757265732e636c75622f6170692f74656d702f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102ff5760003560e01c80636c0360eb11610190578063c040e6b8116100dc578063e8a3d48511610095578063ee3743ab1161006f578063ee3743ab1461095b578063f053d37014610970578063f2fde38b14610991578063fb108c2a146109b157600080fd5b8063e8a3d485146108dd578063e985e9c5146108f2578063eb1503a71461093b57600080fd5b8063c040e6b814610819578063c6ec690914610845578063c839fe941461085b578063c87b56dd14610888578063e07fa3c1146108a8578063e7e989c0146108bd57600080fd5b8063938e3d7b11610149578063a22cb46511610123578063a22cb46514610751578063aba70c5614610771578063b7aa670a146107d9578063b88d4fde146107f957600080fd5b8063938e3d7b146106fb578063956feccf1461071b57806395d89b411461073c57600080fd5b80636c0360eb1461066757806370a082311461067c578063715018a61461069c578063722926af146106b15780638cdee851146106c75780638da5cb5b146106dd57600080fd5b806334452f381161024f5780635c975abb1161020857806361b8ce8c116101e257806361b8ce8c146106095780636352211e1461061f5780636379b51e1461063f578063639d7e111461065257600080fd5b80635c975abb146105905780635e9aa529146105b157806360b02f70146105e957600080fd5b806334452f38146104f557806337c3fdbc1461050a5780633a367a671461051f57806342842e0e146105345780634ae917c51461055457806355f804b31461057057600080fd5b80631289b36e116102bc57806323b872dd1161029657806323b872dd1461044e5780632a55205a1461046e5780632d2c5565146104ad5780633009c083146104d557600080fd5b80631289b36e146103f557806318160ddd1461040f578063238ac9331461042e57600080fd5b806301ffc9a71461030457806302329a291461033957806306fdde031461035b578063081812fc1461037d578063095ea7b3146103b557806310fd332b146103d5575b600080fd5b34801561031057600080fd5b5061032461031f366004612d13565b6109d1565b60405190151581526020015b60405180910390f35b34801561034557600080fd5b50610359610354366004612cf8565b610a17565b005b34801561036757600080fd5b50610370610a68565b6040516103309190613018565b34801561038957600080fd5b5061039d610398366004612d96565b610afa565b6040516001600160a01b039091168152602001610330565b3480156103c157600080fd5b506103596103d0366004612c3d565b610b8f565b3480156103e157600080fd5b506103596103f0366004612c3d565b610ca5565b34801561040157600080fd5b506014546103249060ff1681565b34801561041b57600080fd5b50600a545b604051908152602001610330565b34801561043a57600080fd5b50600f5461039d906001600160a01b031681565b34801561045a57600080fd5b50610359610469366004612b6f565b610cf5565b34801561047a57600080fd5b5061048e610489366004612dd2565b610d26565b604080516001600160a01b039093168352602083019190915201610330565b3480156104b957600080fd5b5061039d73662fce3f30df2c9dbc40f87792876c818f50cad881565b3480156104e157600080fd5b5060105461039d906001600160a01b031681565b34801561050157600080fd5b50610359610d61565b34801561051657600080fd5b50610359610da0565b34801561052b57600080fd5b50610370610ddf565b34801561054057600080fd5b5061035961054f366004612b6f565b610e6d565b34801561056057600080fd5b506104206753444835ec58000081565b34801561057c57600080fd5b5061035961058b366004612d4d565b610e88565b34801561059c57600080fd5b50600f5461032490600160a81b900460ff1681565b3480156105bd57600080fd5b506104206105cc366004612e0f565b600e60209081526000928352604080842090915290825290205481565b3480156105f557600080fd5b50610359610604366004612daf565b610f23565b34801561061557600080fd5b50610420600b5481565b34801561062b57600080fd5b5061039d61063a366004612d96565b610fb5565b61035961064d366004612e82565b61102c565b34801561065e57600080fd5b50610370611487565b34801561067357600080fd5b50610370611494565b34801561068857600080fd5b50610420610697366004612b21565b6114a1565b3480156106a857600080fd5b50610359611528565b3480156106bd57600080fd5b5061042060155481565b3480156106d357600080fd5b50610420611f4081565b3480156106e957600080fd5b506006546001600160a01b031661039d565b34801561070757600080fd5b50610359610716366004612d4d565b61155e565b34801561072757600080fd5b50600f5461032490600160a01b900460ff1681565b34801561074857600080fd5b5061037061159b565b34801561075d57600080fd5b5061035961076c366004612c13565b6115aa565b34801561077d57600080fd5b506107b661078c366004612df4565b600d6020526000908152604090208054600182015460028301546003909301549192909160ff1684565b6040805194855260208501939093529183015260ff166060820152608001610330565b3480156107e557600080fd5b5061039d6107f4366004612d96565b6115b5565b34801561080557600080fd5b50610359610814366004612bab565b6115df565b34801561082557600080fd5b50600c546108339060ff1681565b60405160ff9091168152602001610330565b34801561085157600080fd5b5061042060115481565b34801561086757600080fd5b5061087b610876366004612c67565b611617565b6040516103309190612fd4565b34801561089457600080fd5b506103706108a3366004612d96565b61170e565b3480156108b457600080fd5b50610359611863565b3480156108c957600080fd5b506104206108d8366004612d96565b611a10565b3480156108e957600080fd5b50610370611a31565b3480156108fe57600080fd5b5061032461090d366004612b3c565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561094757600080fd5b50610324610956366004612c9a565b611a59565b34801561096757600080fd5b50610359611aed565b34801561097c57600080fd5b50600f5461032490600160b01b900460ff1681565b34801561099d57600080fd5b506103596109ac366004612b21565b611bb7565b3480156109bd57600080fd5b506103596109cc366004612e2b565b611c52565b600063e8a3d48560e01b6001600160e01b031983161480610a02575063152a902d60e11b6001600160e01b03198316145b80610a115750610a1182611d60565b92915050565b6006546001600160a01b03163314610a4a5760405162461bcd60e51b8152600401610a419061307d565b60405180910390fd5b600f8054911515600160a81b0260ff60a81b19909216919091179055565b606060008054610a77906131d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa3906131d9565b8015610af05780601f10610ac557610100808354040283529160200191610af0565b820191906000526020600020905b815481529060010190602001808311610ad357829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610b735760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a41565b506000908152600460205260409020546001600160a01b031690565b6000610b9a82610fb5565b9050806001600160a01b0316836001600160a01b03161415610c085760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a41565b336001600160a01b0382161480610c245750610c24813361090d565b610c965760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a41565b610ca08383611db0565b505050565b6006546001600160a01b03163314610ccf5760405162461bcd60e51b8152600401610a419061307d565b601080546001600160a01b0319166001600160a01b039390931692909217909155601155565b610cff3382611e1e565b610d1b5760405162461bcd60e51b8152600401610a41906130b2565b610ca0838383611f15565b60105460115460009182916001600160a01b039091169061271090610d4b9086613154565b610d559190613140565b915091505b9250929050565b6006546001600160a01b03163314610d8b5760405162461bcd60e51b8152600401610a419061307d565b600f805460ff60a01b1916600160a01b179055565b6006546001600160a01b03163314610dca5760405162461bcd60e51b8152600401610a419061307d565b600f805460ff60b01b1916600160b01b179055565b60088054610dec906131d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610e18906131d9565b8015610e655780601f10610e3a57610100808354040283529160200191610e65565b820191906000526020600020905b815481529060010190602001808311610e4857829003601f168201915b505050505081565b610ca0838383604051806020016040528060008152506115df565b6006546001600160a01b03163314610eb25760405162461bcd60e51b8152600401610a419061307d565b600f54600160b01b900460ff1615610f0c5760405162461bcd60e51b815260206004820152601960248201527f4261736555524920616c72656164792066696e616c697a6564000000000000006044820152606401610a41565b8051610f1f9060079060208401906129b5565b5050565b6006546001600160a01b03163314610f4d5760405162461bcd60e51b8152600401610a419061307d565b81600a6000828254610f5f9190613103565b90915550600090505b82811015610f9957610f878282600b54610f829190613103565b6120b1565b80610f9181613214565b915050610f68565b5081600b6000828254610fac9190613103565b90915550505050565b6000818152600260205260408120546001600160a01b031680610a115760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610a41565b600f54600160a81b900460ff16156110785760405162461bcd60e51b815260206004820152600f60248201526e10dbdb9d1c9858dd081c185d5cd959608a1b6044820152606401610a41565b600f54600160a01b900460ff16156110c55760405162461bcd60e51b815260206004820152601060248201526f135a5b9d1a5b99c8191a5cd8589b195960821b6044820152606401610a41565b600c5460ff166111075760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420737461676560981b6044820152606401610a41565b6000611112600a5490565b600c5460ff9081166000908152600d602052604090206001015491925061113b90861683613103565b111561117b5760405162461bcd60e51b815260206004820152600f60248201526e121a5d081cdd1859d9481b1a5b5a5d608a1b6044820152606401610a41565b600c5460ff9081166000908152600d602052604090205461119d918616613154565b3410156111df5760405162461bcd60e51b815260206004820152601060248201526f092dce6eaccccd2c6d2cadce840cae8d60831b6044820152606401610a41565b60008460ff16116112245760405162461bcd60e51b815260206004820152600f60248201526e185d081b19585cdd080c481b5a5b9d608a1b6044820152606401610a41565b600c5460ff9081166000908152600d602052604090206003015483519116901561132257611253338585611a59565b6112945760405162461bcd60e51b8152602060048201526012602482015271496e76616c6964205f7369676e617475726560701b6044820152606401610a41565b600c5460ff80861691600e916000916112af9186911661318a565b60ff9081168252602080830193909352604091820160009081203382529093529120546112dd918816613103565b111561131d5760405162461bcd60e51b815260206004820152600f60248201526e115e18d959590815d3081b1a5b5a5d608a1b6044820152606401610a41565b6113c6565b600c5460ff166000818152600d602052604081206002015491600e919061134a90859061318a565b60ff908116825260208083019390935260409182016000908120338252909352912054611378918816613103565b11156113c65760405162461bcd60e51b815260206004820152601960248201527f4578636565642061646472657373206d696e74206c696d6974000000000000006044820152606401610a41565b600c5460ff80871691600e916000916113e19186911661318a565b60ff1681526020808201929092526040908101600090812033825290925281208054909190611411908490613103565b925050819055508460ff16600a600082825461142d9190613103565b90915550600090505b8560ff16811015611465576114533382600b54610f829190613103565b8061145d81613214565b915050611436565b508460ff16600b600082825461147b9190613103565b90915550505050505050565b60098054610dec906131d9565b60078054610dec906131d9565b60006001600160a01b03821661150c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610a41565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146115525760405162461bcd60e51b8152600401610a419061307d565b61155c60006120cb565b565b6006546001600160a01b031633146115885760405162461bcd60e51b8152600401610a419061307d565b8051610f1f9060099060208401906129b5565b606060018054610a77906131d9565b610f1f33838361211d565b601281815481106115c557600080fd5b6000918252602090912001546001600160a01b0316905081565b6115e93383611e1e565b6116055760405162461bcd60e51b8152600401610a41906130b2565b611611848484846121ec565b50505050565b60606000611624856114a1565b905080611641575050604080516000815260208101909152611707565b60008167ffffffffffffffff81111561165c5761165c6132bb565b604051908082528060200260200182016040528015611685578160200160208202803683370190505b5090506000855b85811161170057838214156116a057611700565b876001600160a01b03166116b382610fb5565b6001600160a01b031614156116ee57808383815181106116d5576116d56132a5565b6020908102919091010152816116ea81613214565b9250505b806116f881613214565b91505061168c565b5090925050505b9392505050565b6000818152600260205260409020546060906001600160a01b031661178d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a41565b600061179761221f565b9050600081511161183257600880546117af906131d9565b80601f01602080910402602001604051908101604052809291908181526020018280546117db906131d9565b80156118285780601f106117fd57610100808354040283529160200191611828565b820191906000526020600020905b81548152906001019060200180831161180b57829003601f168201915b5050505050611707565b8061183c8461222e565b60405160200161184d929190612ecc565b6040516020818303038152906040529392505050565b6006546001600160a01b0316331461188d5760405162461bcd60e51b8152600401610a419061307d565b47806118cd5760405162461bcd60e51b815260206004820152600f60248201526e139bc818985b185b98d9481b19599d608a1b6044820152606401610a41565b60145460ff16611939576753444835ec580000601554826118ee9190613103565b1061191c576014805460ff19166001179055601554611915906753444835ec580000613173565b9050611982565b806015600082825461192e9190613103565b909155506119829050565b600061271061194a611f4084613154565b6119549190613140565b905061197473662fce3f30df2c9dbc40f87792876c818f50cad88261232c565b61197e8183613173565b9150505b60005b601254811015610f1f576119fe601282815481106119a5576119a56132a5565b9060005260206000200160009054906101000a90046001600160a01b0316612710601384815481106119d9576119d96132a5565b9060005260206000200154856119ef9190613154565b6119f99190613140565b61232c565b80611a0881613214565b915050611985565b60138181548110611a2057600080fd5b600091825260209091200154905081565b60606009604051602001611a459190612efb565b604051602081830303815290604052905090565b600c546040516bffffffffffffffffffffffff1930606090811b8216602084015286901b1660348201526001600160f81b031960f885811b821660488401529290921b9091166049820152600090611ad4908390604a01604051602081830303815290604052805190602001206123c190919063ffffffff16565b600f546001600160a01b03918216911614949350505050565b6006546001600160a01b03163314611b175760405162461bcd60e51b8152600401610a419061307d565b600c54600d90600090611b2e9060ff16600161311b565b60ff168152602081019190915260400160002060010154611b895760405162461bcd60e51b815260206004820152601560248201527414dd1859d9481b9bdd081a5b9a5d1a585b1a5e9959605a1b6044820152606401610a41565b600c805460ff16906000611b9c8361322f565b91906101000a81548160ff021916908360ff16021790555050565b6006546001600160a01b03163314611be15760405162461bcd60e51b8152600401610a419061307d565b6001600160a01b038116611c465760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a41565b611c4f816120cb565b50565b6006546001600160a01b03163314611c7c5760405162461bcd60e51b8152600401610a419061307d565b600c5460ff90811690861611611cca5760405162461bcd60e51b815260206004820152601360248201527243616e6e6f74206d6f6469667920737461676560681b6044820152606401610a41565b6000611cd6828761318a565b60ff161015611d275760405162461bcd60e51b815260206004820152601960248201527f4f66667365742063616e6e6f7420676f206e65676174697665000000000000006044820152606401610a41565b60ff9485166000908152600d602052604090209384556001840192909255831660028301556003909101805460ff191691909216179055565b60006001600160e01b031982166380ac58cd60e01b1480611d9157506001600160e01b03198216635b5e139f60e01b145b80610a1157506301ffc9a760e01b6001600160e01b0319831614610a11565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611de582610fb5565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611e975760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a41565b6000611ea283610fb5565b9050806001600160a01b0316846001600160a01b03161480611edd5750836001600160a01b0316611ed284610afa565b6001600160a01b0316145b80611f0d57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611f2882610fb5565b6001600160a01b031614611f8c5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610a41565b6001600160a01b038216611fee5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a41565b611ff9600082611db0565b6001600160a01b0383166000908152600360205260408120805460019290612022908490613173565b90915550506001600160a01b0382166000908152600360205260408120805460019290612050908490613103565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610f1f8282604051806020016040528060008152506123e5565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316141561217f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a41565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6121f7848484611f15565b61220384848484612418565b6116115760405162461bcd60e51b8152600401610a419061302b565b606060078054610a77906131d9565b6060816122525750506040805180820190915260018152600360fc1b602082015290565b8160005b811561227c578061226681613214565b91506122759050600a83613140565b9150612256565b60008167ffffffffffffffff811115612297576122976132bb565b6040519080825280601f01601f1916602001820160405280156122c1576020820181803683370190505b5090505b8415611f0d576122d6600183613173565b91506122e3600a8661324f565b6122ee906030613103565b60f81b818381518110612303576123036132a5565b60200101906001600160f81b031916908160001a905350612325600a86613140565b94506122c5565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612379576040519150601f19603f3d011682016040523d82523d6000602084013e61237e565b606091505b5050905080610ca05760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610a41565b60008060006123d08585612525565b915091506123dd81612592565b509392505050565b6123ef838361274d565b6123fc6000848484612418565b610ca05760405162461bcd60e51b8152600401610a419061302b565b60006001600160a01b0384163b1561251a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061245c903390899088908890600401612f97565b602060405180830381600087803b15801561247657600080fd5b505af19250505080156124a6575060408051601f3d908101601f191682019092526124a391810190612d30565b60015b612500573d8080156124d4576040519150601f19603f3d011682016040523d82523d6000602084013e6124d9565b606091505b5080516124f85760405162461bcd60e51b8152600401610a419061302b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f0d565b506001949350505050565b60008082516041141561255c5760208301516040840151606085015160001a6125508782858561288f565b94509450505050610d5a565b825160401415612586576020830151604084015161257b86838361297c565b935093505050610d5a565b50600090506002610d5a565b60008160048111156125a6576125a661328f565b14156125af5750565b60018160048111156125c3576125c361328f565b14156126115760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610a41565b60028160048111156126255761262561328f565b14156126735760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610a41565b60038160048111156126875761268761328f565b14156126e05760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610a41565b60048160048111156126f4576126f461328f565b1415611c4f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610a41565b6001600160a01b0382166127a35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a41565b6000818152600260205260409020546001600160a01b0316156128085760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a41565b6001600160a01b0382166000908152600360205260408120805460019290612831908490613103565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156128c65750600090506003612973565b8460ff16601b141580156128de57508460ff16601c14155b156128ef5750600090506004612973565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612943573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661296c57600060019250925050612973565b9150600090505b94509492505050565b6000806001600160ff1b0383168161299960ff86901c601b613103565b90506129a78782888561288f565b935093505050935093915050565b8280546129c1906131d9565b90600052602060002090601f0160209004810192826129e35760008555612a29565b82601f106129fc57805160ff1916838001178555612a29565b82800160010185558215612a29579182015b82811115612a29578251825591602001919060010190612a0e565b50612a35929150612a39565b5090565b5b80821115612a355760008155600101612a3a565b600067ffffffffffffffff80841115612a6957612a696132bb565b604051601f8501601f19908116603f01168101908282118183101715612a9157612a916132bb565b81604052809350858152868686011115612aaa57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114612adb57600080fd5b919050565b80358015158114612adb57600080fd5b600082601f830112612b0157600080fd5b61170783833560208501612a4e565b803560ff81168114612adb57600080fd5b600060208284031215612b3357600080fd5b61170782612ac4565b60008060408385031215612b4f57600080fd5b612b5883612ac4565b9150612b6660208401612ac4565b90509250929050565b600080600060608486031215612b8457600080fd5b612b8d84612ac4565b9250612b9b60208501612ac4565b9150604084013590509250925092565b60008060008060808587031215612bc157600080fd5b612bca85612ac4565b9350612bd860208601612ac4565b925060408501359150606085013567ffffffffffffffff811115612bfb57600080fd5b612c0787828801612af0565b91505092959194509250565b60008060408385031215612c2657600080fd5b612c2f83612ac4565b9150612b6660208401612ae0565b60008060408385031215612c5057600080fd5b612c5983612ac4565b946020939093013593505050565b600080600060608486031215612c7c57600080fd5b612c8584612ac4565b95602085013595506040909401359392505050565b600080600060608486031215612caf57600080fd5b612cb884612ac4565b9250612cc660208501612b10565b9150604084013567ffffffffffffffff811115612ce257600080fd5b612cee86828701612af0565b9150509250925092565b600060208284031215612d0a57600080fd5b61170782612ae0565b600060208284031215612d2557600080fd5b8135611707816132d1565b600060208284031215612d4257600080fd5b8151611707816132d1565b600060208284031215612d5f57600080fd5b813567ffffffffffffffff811115612d7657600080fd5b8201601f81018413612d8757600080fd5b611f0d84823560208401612a4e565b600060208284031215612da857600080fd5b5035919050565b60008060408385031215612dc257600080fd5b82359150612b6660208401612ac4565b60008060408385031215612de557600080fd5b50508035926020909101359150565b600060208284031215612e0657600080fd5b61170782612b10565b60008060408385031215612e2257600080fd5b612b5883612b10565b600080600080600060a08688031215612e4357600080fd5b612e4c86612b10565b94506020860135935060408601359250612e6860608701612b10565b9150612e7660808701612b10565b90509295509295909350565b600080600060608486031215612e9757600080fd5b612cb884612b10565b60008151808452612eb88160208601602086016131ad565b601f01601f19169290920160200192915050565b60008351612ede8184602088016131ad565b835190830190612ef28183602088016131ad565b01949350505050565b600080835481600182811c915080831680612f1757607f831692505b6020808410821415612f3757634e487b7160e01b86526022600452602486fd5b818015612f4b5760018114612f5c57612f89565b60ff19861689528489019650612f89565b60008a81526020902060005b86811015612f815781548b820152908501908301612f68565b505084890196505b509498975050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612fca90830184612ea0565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561300c57835183529284019291840191600101612ff0565b50909695505050505050565b6020815260006117076020830184612ea0565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561311657613116613263565b500190565b600060ff821660ff84168060ff0382111561313857613138613263565b019392505050565b60008261314f5761314f613279565b500490565b600081600019048311821515161561316e5761316e613263565b500290565b60008282101561318557613185613263565b500390565b600060ff821660ff8416808210156131a4576131a4613263565b90039392505050565b60005b838110156131c85781810151838201526020016131b0565b838111156116115750506000910152565b600181811c908216806131ed57607f821691505b6020821081141561320e57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561322857613228613263565b5060010190565b600060ff821660ff81141561324657613246613263565b60010192915050565b60008261325e5761325e613279565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611c4f57600080fdfea26469706673582212200ed79e70fe1f1d399e02a29bad15c58a306ea498da63c7420d7bba97706ccb0064736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000007b4e7c5aca0316e05f138630b21dc5487ea0db0000000000000000000000000057dac90c84da6437e8a3588ae1bf29d7198f7ca500000000000000000000000000000000000000000000000000000000000002ee000000000000000000000000000000000000000000000000000000000000000b545454726561737572657300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035454540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002268747470733a2f2f74747472656173757265732e636c75622f6170692f74656d702f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): TTTreasures
Arg [1] : _symbol (string): TTT
Arg [2] : _initBaseURI (string): https://tttreasures.club/api/temp/
Arg [3] : _defaultURI (string):
Arg [4] : _signer (address): 0x7B4E7C5aca0316E05F138630B21dC5487EA0db00
Arg [5] : _royaltyAddr (address): 0x57dAC90C84da6437e8A3588Ae1BF29D7198f7cA5
Arg [6] : _royaltyBasis (uint256): 750

-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [3] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [4] : 0000000000000000000000007b4e7c5aca0316e05f138630b21dc5487ea0db00
Arg [5] : 00000000000000000000000057dac90c84da6437e8a3588ae1bf29d7198f7ca5
Arg [6] : 00000000000000000000000000000000000000000000000000000000000002ee
Arg [7] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [8] : 5454547265617375726573000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [10] : 5454540000000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000022
Arg [12] : 68747470733a2f2f74747472656173757265732e636c75622f6170692f74656d
Arg [13] : 702f000000000000000000000000000000000000000000000000000000000000
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

46787:8606:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49392:270;;;;;;;;;;-1:-1:-1;49392:270:0;;;;;:::i;:::-;;:::i;:::-;;;11606:14:1;;11599:22;11581:41;;11569:2;11554:18;49392:270:0;;;;;;;;53940:73;;;;;;;;;;-1:-1:-1;53940:73:0;;;;;:::i;:::-;;:::i;:::-;;22477:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24036:221::-;;;;;;;;;;-1:-1:-1;24036:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9988:32:1;;;9970:51;;9958:2;9943:18;24036:221:0;9824:203:1;23559:411:0;;;;;;;;;;-1:-1:-1;23559:411:0;;;;;:::i;:::-;;:::i;52726:156::-;;;;;;;;;;-1:-1:-1;52726:156:0;;;;;:::i;:::-;;:::i;48666:28::-;;;;;;;;;;-1:-1:-1;48666:28:0;;;;;;;;51872:86;;;;;;;;;;-1:-1:-1;51939:13:0;;51872:86;;;25506:25:1;;;25494:2;25479:18;51872:86:0;25360:177:1;47408:21:0;;;;;;;;;;-1:-1:-1;47408:21:0;;;;-1:-1:-1;;;;;47408:21:0;;;24786:339;;;;;;;;;;-1:-1:-1;24786:339:0;;;;;:::i;:::-;;:::i;52526:194::-;;;;;;;;;;-1:-1:-1;52526:194:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;10717:32:1;;;10699:51;;10781:2;10766:18;;10759:34;;;;10672:18;52526:194:0;10525:274:1;48482:77:0;;;;;;;;;;;;48517:42;48482:77;;47584:26;;;;;;;;;;-1:-1:-1;47584:26:0;;;;-1:-1:-1;;;;;47584:26:0;;;51176:72;;;;;;;;;;;;;:::i;53057:79::-;;;;;;;;;;;;;:::i;46934:24::-;;;;;;;;;;;;;:::i;25196:185::-;;;;;;;;;;-1:-1:-1;25196:185:0;;;;;:::i;:::-;;:::i;48610:51::-;;;;;;;;;;;;48654:7;48610:51;;52890:159;;;;;;;;;;-1:-1:-1;52890:159:0;;;;;:::i;:::-;;:::i;47506:26::-;;;;;;;;;;-1:-1:-1;47506:26:0;;;;-1:-1:-1;;;47506:26:0;;;;;;47341:62;;;;;;;;;;-1:-1:-1;47341:62:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;54017:236;;;;;;;;;;-1:-1:-1;54017:236:0;;;;;:::i;:::-;;:::i;47212:25::-;;;;;;;;;;;;;;;;22171:239;;;;;;;;;;-1:-1:-1;22171:239:0;;;;;:::i;:::-;;:::i;49668:1281::-;;;;;;:::i;:::-;;:::i;46963:27::-;;;;;;;;;;;;;:::i;46908:21::-;;;;;;;;;;;;;:::i;21901:208::-;;;;;;;;;;-1:-1:-1;21901:208:0;;;;;:::i;:::-;;:::i;36357:103::-;;;;;;;;;;;;;:::i;48699:27::-;;;;;;;;;;;;;;;;48564:41;;;;;;;;;;;;48601:4;48564:41;;35706:87;;;;;;;;;;-1:-1:-1;35779:6:0;;-1:-1:-1;;;;;35779:6:0;35706:87;;53144:110;;;;;;;;;;-1:-1:-1;53144:110:0;;;;;:::i;:::-;;:::i;47455:24::-;;;;;;;;;;-1:-1:-1;47455:24:0;;;;-1:-1:-1;;;47455:24:0;;;;;;22646:104;;;;;;;;;;;;;:::i;24329:155::-;;;;;;;;;;-1:-1:-1;24329:155:0;;;;;:::i;:::-;;:::i;47265:54::-;;;;;;;;;;-1:-1:-1;47265:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25769:25:1;;;25825:2;25810:18;;25803:34;;;;25853:18;;;25846:34;25928:4;25916:17;25911:2;25896:18;;25889:45;25756:3;25741:19;47265:54:0;25542:398:1;47667:624:0;;;;;;;;;;-1:-1:-1;47667:624:0;;;;;:::i;:::-;;:::i;25452:328::-;;;;;;;;;;-1:-1:-1;25452:328:0;;;;;:::i;:::-;;:::i;47242:18::-;;;;;;;;;;-1:-1:-1;47242:18:0;;;;;;;;;;;26117:4:1;26105:17;;;26087:36;;26075:2;26060:18;47242::0;25945:184:1;47615:27:0;;;;;;;;;;;;;;;;51256:616;;;;;;;;;;-1:-1:-1;51256:616:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;51964:416::-;;;;;;;;;;-1:-1:-1;51964:416:0;;;;;:::i;:::-;;:::i;54294:934::-;;;;;;;;;;;;;:::i;48315:106::-;;;;;;;;;;-1:-1:-1;48315:106:0;;;;;:::i;:::-;;:::i;52386:118::-;;;;;;;;;;;;;:::i;24555:164::-;;;;;;;;;;-1:-1:-1;24555:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;24676:25:0;;;24652:4;24676:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24555:164;50957:213;;;;;;;;;;-1:-1:-1;50957:213:0;;;;;:::i;:::-;;:::i;53260:137::-;;;;;;;;;;;;;:::i;47537:27::-;;;;;;;;;;-1:-1:-1;47537:27:0;;;;-1:-1:-1;;;47537:27:0;;;;;;36615:201;;;;;;;;;;-1:-1:-1;36615:201:0;;;;;:::i;:::-;;:::i;53401:531::-;;;;;;;;;;-1:-1:-1;53401:531:0;;;;;:::i;:::-;;:::i;49392:270::-;49477:4;-1:-1:-1;;;;;;;;;49499:25:0;;;;:81;;-1:-1:-1;;;;;;;;;;49555:25:0;;;49499:81;:157;;;;49620:36;49644:11;49620:23;:36::i;:::-;49492:164;49392:270;-1:-1:-1;;49392:270:0:o;53940:73::-;35779:6;;-1:-1:-1;;;;;35779:6:0;16842:10;35926:23;35918:68;;;;-1:-1:-1;;;35918:68:0;;;;;;;:::i;:::-;;;;;;;;;53992:6:::1;:15:::0;;;::::1;;-1:-1:-1::0;;;53992:15:0::1;-1:-1:-1::0;;;;53992:15:0;;::::1;::::0;;;::::1;::::0;;53940:73::o;22477:100::-;22531:13;22564:5;22557:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22477:100;:::o;24036:221::-;24112:7;27379:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27379:16:0;24132:73;;;;-1:-1:-1;;;24132:73:0;;21463:2:1;24132:73:0;;;21445:21:1;21502:2;21482:18;;;21475:30;21541:34;21521:18;;;21514:62;-1:-1:-1;;;21592:18:1;;;21585:42;21644:19;;24132:73:0;21261:408:1;24132:73:0;-1:-1:-1;24225:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24225:24:0;;24036:221::o;23559:411::-;23640:13;23656:23;23671:7;23656:14;:23::i;:::-;23640:39;;23704:5;-1:-1:-1;;;;;23698:11:0;:2;-1:-1:-1;;;;;23698:11:0;;;23690:57;;;;-1:-1:-1;;;23690:57:0;;23352:2:1;23690:57:0;;;23334:21:1;23391:2;23371:18;;;23364:30;23430:34;23410:18;;;23403:62;-1:-1:-1;;;23481:18:1;;;23474:31;23522:19;;23690:57:0;23150:397:1;23690:57:0;16842:10;-1:-1:-1;;;;;23782:21:0;;;;:62;;-1:-1:-1;23807:37:0;23824:5;16842:10;24555:164;:::i;23807:37::-;23760:168;;;;-1:-1:-1;;;23760:168:0;;18756:2:1;23760:168:0;;;18738:21:1;18795:2;18775:18;;;18768:30;18834:34;18814:18;;;18807:62;18905:26;18885:18;;;18878:54;18949:19;;23760:168:0;18554:420:1;23760:168:0;23941:21;23950:2;23954:7;23941:8;:21::i;:::-;23629:341;23559:411;;:::o;52726:156::-;35779:6;;-1:-1:-1;;;;;35779:6:0;16842:10;35926:23;35918:68;;;;-1:-1:-1;;;35918:68:0;;;;;;;:::i;:::-;52815:11:::1;:26:::0;;-1:-1:-1;;;;;;52815:26:0::1;-1:-1:-1::0;;;;;52815:26:0;;;::::1;::::0;;;::::1;::::0;;;52848:12:::1;:28:::0;52726:156::o;24786:339::-;24981:41;16842:10;25014:7;24981:18;:41::i;:::-;24973:103;;;;-1:-1:-1;;;24973:103:0;;;;;;;:::i;:::-;25089:28;25099:4;25105:2;25109:7;25089:9;:28::i;52526:194::-;52667:11;;52693:12;;52612:16;;;;-1:-1:-1;;;;;52667:11:0;;;;52708:5;;52680:25;;:10;:25;:::i;:::-;:33;;;;:::i;:::-;52659:55;;;;52526:194;;;;;;:::o;51176:72::-;35779:6;;-1:-1:-1;;;;;35779:6:0;16842:10;35926:23;35918:68;;;;-1:-1:-1;;;35918:68:0;;;;;;;:::i;:::-;51223:12:::1;:19:::0;;-1:-1:-1;;;;51223:19:0::1;-1:-1:-1::0;;;51223:19:0::1;::::0;;51176:72::o;53057:79::-;35779:6;;-1:-1:-1;;;;;35779:6:0;16842:10;35926:23;35918:68;;;;-1:-1:-1;;;35918:68:0;;;;;;;:::i;:::-;53108:15:::1;:22:::0;;-1:-1:-1;;;;53108:22:0::1;-1:-1:-1::0;;;53108:22:0::1;::::0;;53057:79::o;46934:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25196:185::-;25334:39;25351:4;25357:2;25361:7;25334:39;;;;;;;;;;;;:16;:39::i;52890:159::-;35779:6;;-1:-1:-1;;;;;35779:6:0;16842:10;35926:23;35918:68;;;;-1:-1:-1;;;35918:68:0;;;;;;;:::i;:::-;52970:15:::1;::::0;-1:-1:-1;;;52970:15:0;::::1;;;52969:16;52961:54;;;::::0;-1:-1:-1;;;52961:54:0;;21876:2:1;52961:54:0::1;::::0;::::1;21858:21:1::0;21915:2;21895:18;;;21888:30;21954:27;21934:18;;;21927:55;21999:18;;52961:54:0::1;21674:349:1::0;52961:54:0::1;53022:21:::0;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;52890:159:::0;:::o;54017:236::-;35779:6;;-1:-1:-1;;;;;35779:6:0;16842:10;35926:23;35918:68;;;;-1:-1:-1;;;35918:68:0;;;;;;;:::i;:::-;54117:11:::1;54100:13;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;54140:9:0::1;::::0;-1:-1:-1;54135:85:0::1;54159:11;54155:1;:15;54135:85;;;54186:26;54196:3;54210:1;54201:6;;:10;;;;:::i;:::-;54186:9;:26::i;:::-;54172:3:::0;::::1;::::0;::::1;:::i;:::-;;;;54135:85;;;;54236:11;54226:6;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;54017:236:0:o;22171:239::-;22243:7;22279:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22279:16:0;22314:19;22306:73;;;;-1:-1:-1;;;22306:73:0;;19592:2:1;22306:73:0;;;19574:21:1;19631:2;19611:18;;;19604:30;19670:34;19650:18;;;19643:62;-1:-1:-1;;;19721:18:1;;;19714:39;19770:19;;22306:73:0;19390:405:1;49668:1281:0;49770:6;;-1:-1:-1;;;49770:6:0;;;;49769:7;49761:35;;;;-1:-1:-1;;;49761:35:0;;15804:2:1;49761:35:0;;;15786:21:1;15843:2;15823:18;;;15816:30;-1:-1:-1;;;15862:18:1;;;15855:45;15917:18;;49761:35:0;15602:339:1;49761:35:0;49812:12;;-1:-1:-1;;;49812:12:0;;;;49811:13;49803:42;;;;-1:-1:-1;;;49803:42:0;;22591:2:1;49803:42:0;;;22573:21:1;22630:2;22610:18;;;22603:30;-1:-1:-1;;;22649:18:1;;;22642:46;22705:18;;49803:42:0;22389:340:1;49803:42:0;49860:5;;;;49852:35;;;;-1:-1:-1;;;49852:35:0;;12815:2:1;49852:35:0;;;12797:21:1;12854:2;12834:18;;;12827:30;-1:-1:-1;;;12873:18:1;;;12866:43;12926:18;;49852:35:0;12613:337:1;49852:35:0;49894:14;49911:13;51939;;;51872:86;49911:13;49975:5;;;;;;49961:20;;;;:13;:20;;;;;49975:5;49961:31;;49894:30;;-1:-1:-1;49939:18:0;;;;49894:30;49939:18;:::i;:::-;:53;;49931:81;;;;-1:-1:-1;;;49931:81:0;;16148:2:1;49931:81:0;;;16130:21:1;16187:2;16167:18;;;16160:30;-1:-1:-1;;;16206:18:1;;;16199:45;16261:18;;49931:81:0;15946:339:1;49931:81:0;50066:5;;;;;;50052:20;;;;:13;:20;;;;;:26;50040:38;;;;;:::i;:::-;50027:9;:51;;50019:80;;;;-1:-1:-1;;;50019:80:0;;16492:2:1;50019:80:0;;;16474:21:1;16531:2;16511:18;;;16504:30;-1:-1:-1;;;16550:18:1;;;16543:46;16606:18;;50019:80:0;16290:340:1;50019:80:0;50126:1;50114:9;:13;;;50106:40;;;;-1:-1:-1;;;50106:40:0;;18412:2:1;50106:40:0;;;18394:21:1;18451:2;18431:18;;;18424:30;-1:-1:-1;;;18470:18:1;;;18463:45;18525:18;;50106:40:0;18210:339:1;50106:40:0;50195:5;;;;;;50153:25;50181:20;;;:13;:20;;;;;:43;;;50260:17;;50181:43;;;50260:21;50257:421;;50320:41;50329:10;50341:7;50350:10;50320:8;:41::i;:::-;50312:72;;;;-1:-1:-1;;;50312:72:0;;20766:2:1;50312:72:0;;;20748:21:1;20805:2;20785:18;;;20778:30;-1:-1:-1;;;20824:18:1;;;20817:48;20882:18;;50312:72:0;20564:342:1;50312:72:0;50423:5;;50401:71;;;;;50413:9;;:36;;50423:25;;50429:19;;50423:5;:25;:::i;:::-;50413:36;;;;;;;;;;;;;;;;;;-1:-1:-1;50413:36:0;;;50450:10;50413:48;;;;;;;;50401:60;;;;;:::i;:::-;:71;;50393:99;;;;-1:-1:-1;;;50393:99:0;;24520:2:1;50393:99:0;;;24502:21:1;24559:2;24539:18;;;24532:30;-1:-1:-1;;;24578:18:1;;;24571:45;24633:18;;50393:99:0;24318:339:1;50393:99:0;50257:421;;;50622:5;;;;50608:20;;;;:13;:20;;;;;:30;;;;50556:9;;50608:20;50566:25;;50572:19;;50566:25;:::i;:::-;50556:36;;;;;;;;;;;;;;;;;;-1:-1:-1;50556:36:0;;;50593:10;50556:48;;;;;;;;50544:60;;;;;:::i;:::-;:94;;50536:132;;;;-1:-1:-1;;;50536:132:0;;24864:2:1;50536:132:0;;;24846:21:1;24903:2;24883:18;;;24876:30;24942:27;24922:18;;;24915:55;24987:18;;50536:132:0;24662:349:1;50536:132:0;50723:5;;50713:61;;;;;:9;;:36;;50723:25;;50729:19;;50723:5;:25;:::i;:::-;50713:36;;;;;;;;;;;;;;;;-1:-1:-1;50713:36:0;;;50750:10;50713:48;;;;;;;:61;;:48;;-1:-1:-1;50713:61:0;;;;;:::i;:::-;;;;;;;;50812:9;50795:26;;:13;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;50833:9:0;;-1:-1:-1;50828:90:0;50852:9;50848:13;;:1;:13;50828:90;;;50877:33;50887:10;50908:1;50899:6;;:10;;;;:::i;50877:33::-;50863:3;;;;:::i;:::-;;;;50828:90;;;;50934:9;50924:19;;:6;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;49668:1281:0:o;46963:27::-;;;;;;;:::i;46908:21::-;;;;;;;:::i;21901:208::-;21973:7;-1:-1:-1;;;;;22001:19:0;;21993:74;;;;-1:-1:-1;;;21993:74:0;;19181:2:1;21993:74:0;;;19163:21:1;19220:2;19200:18;;;19193:30;19259:34;19239:18;;;19232:62;-1:-1:-1;;;19310:18:1;;;19303:40;19360:19;;21993:74:0;18979:406:1;21993:74:0;-1:-1:-1;;;;;;22085:16:0;;;;;:9;:16;;;;;;;21901:208::o;36357:103::-;35779:6;;-1:-1:-1;;;;;35779:6:0;16842:10;35926:23;35918:68;;;;-1:-1:-1;;;35918:68:0;;;;;;;:::i;:::-;36422:30:::1;36449:1;36422:18;:30::i;:::-;36357:103::o:0;53144:110::-;35779:6;;-1:-1:-1;;;;;35779:6:0;16842:10;35926:23;35918:68;;;;-1:-1:-1;;;35918:68:0;;;;;;;:::i;:::-;53220:28;;::::1;::::0;:13:::1;::::0;:28:::1;::::0;::::1;::::0;::::1;:::i;22646:104::-:0;22702:13;22735:7;22728:14;;;;;:::i;24329:155::-;24424:52;16842:10;24457:8;24467;24424:18;:52::i;47667:624::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47667:624:0;;-1:-1:-1;47667:624:0;:::o;25452:328::-;25627:41;16842:10;25660:7;25627:18;:41::i;:::-;25619:103;;;;-1:-1:-1;;;25619:103:0;;;;;;;:::i;:::-;25733:39;25747:4;25753:2;25757:7;25766:5;25733:13;:39::i;:::-;25452:328;;;;:::o;51256:616::-;51343:16;51369:18;51390:17;51400:6;51390:9;:17::i;:::-;51369:38;-1:-1:-1;51418:15:0;51414:453;;-1:-1:-1;;51453:16:0;;;51467:1;51453:16;;;;;;;;51446:23;;51414:453;51494:23;51534:10;51520:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51520:25:0;-1:-1:-1;51494:51:0;-1:-1:-1;51556:13:0;51609:7;51586:250;51629:5;51618:7;:16;51586:250;;51675:10;51666:5;:19;51662:30;;;51687:5;;51662:30;51733:6;-1:-1:-1;;;;;51713:26:0;:16;51721:7;51713;:16::i;:::-;-1:-1:-1;;;;;51713:26:0;;51709:116;;;51776:7;51760:6;51767:5;51760:13;;;;;;;;:::i;:::-;;;;;;;;;;:23;51802:7;;;;:::i;:::-;;;;51709:116;51636:9;;;;:::i;:::-;;;;51586:250;;;-1:-1:-1;51853:6:0;;-1:-1:-1;;;51256:616:0;;;;;;:::o;51964:416::-;27355:4;27379:16;;;:7;:16;;;;;;52062:13;;-1:-1:-1;;;;;27379:16:0;52087:97;;;;-1:-1:-1;;;52087:97:0;;22936:2:1;52087:97:0;;;22918:21:1;22975:2;22955:18;;;22948:30;23014:34;22994:18;;;22987:62;-1:-1:-1;;;23065:18:1;;;23058:45;23120:19;;52087:97:0;22734:411:1;52087:97:0;52193:28;52224:10;:8;:10::i;:::-;52193:41;;52279:1;52254:14;52248:28;:32;:126;;52364:10;52248:126;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52316:14;52332:18;:7;:16;:18::i;:::-;52299:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52241:133;51964:416;-1:-1:-1;;;51964:416:0:o;54294:934::-;35779:6;;-1:-1:-1;;;;;35779:6:0;16842:10;35926:23;35918:68;;;;-1:-1:-1;;;35918:68:0;;;;;;;:::i;:::-;54363:21:::1;54399:14:::0;54391:42:::1;;;::::0;-1:-1:-1;;;54391:42:0;;25218:2:1;54391:42:0::1;::::0;::::1;25200:21:1::0;25257:2;25237:18;;;25230:30;-1:-1:-1;;;25276:18:1;;;25269:45;25331:18;;54391:42:0::1;25016:339:1::0;54391:42:0::1;54446:16;::::0;::::1;;54442:631;;48654:7;54513:12;;54500:10;:25;;;;:::i;:::-;:46;54497:325;;54558:16;:23:::0;;-1:-1:-1;;54558:23:0::1;54577:4;54558:23;::::0;;54659:12:::1;::::0;54639:32:::1;::::0;48654:7:::1;54639:32;:::i;:::-;54626:45;;54442:631;;54497:325;54802:10;54786:12;;:26;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;54442:631:0::1;::::0;-1:-1:-1;54442:631:0::1;;54867:24;54920:5;54894:23;48601:4;54894:10:::0;:23:::1;:::i;:::-;:31;;;;:::i;:::-;54867:58;;54958:37;48517:42;54978:16;54958:9;:37::i;:::-;55004:30;55018:16:::0;55004:30;::::1;:::i;:::-;;;54833:240;54442:631;55086:9;55081:142;55105:14;:21:::0;55101:25;::::1;55081:142;;;55142:73;55152:14;55167:1;55152:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;55152:17:0::1;55209:5;55184:19;55204:1;55184:22;;;;;;;;:::i;:::-;;;;;;;;;55171:10;:35;;;;:::i;:::-;:43;;;;:::i;:::-;55142:9;:73::i;:::-;55128:3:::0;::::1;::::0;::::1;:::i;:::-;;;;55081:142;;48315:106:::0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48315:106:0;:::o;52386:118::-;52430:13;52483;52466:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;52452:46;;52386:118;:::o;50957:213::-;51137:5;;51089:54;;-1:-1:-1;;51114:4:0;7780:2:1;7776:15;;;7772:24;;51089:54:0;;;7760:37:1;7831:15;;;7827:24;7813:12;;;7806:46;-1:-1:-1;;;;;;7875:3:1;7918:16;;;7914:25;;7900:12;;;7893:47;7974:16;;;;;;;7956:12;;;7949:47;51050:4:0;;51079:85;;51153:10;;8012:12:1;;51089:54:0;;;;;;;;;;;;51079:65;;;;;;:73;;:85;;;;:::i;:::-;51069:6;;-1:-1:-1;;;;;51069:95:0;;;:6;;:95;;50957:213;-1:-1:-1;;;;50957:213:0:o;53260:137::-;35779:6;;-1:-1:-1;;;;;35779:6:0;16842:10;35926:23;35918:68;;;;-1:-1:-1;;;35918:68:0;;;;;;;:::i;:::-;53327:5:::1;::::0;53313:13:::1;::::0;:22:::1;::::0;53327:7:::1;::::0;:5:::1;;::::0;:7:::1;:::i;:::-;53313:22;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;53313:22:0;:33:::1;;::::0;53305:72:::1;;;::::0;-1:-1:-1;;;53305:72:0;;21113:2:1;53305:72:0::1;::::0;::::1;21095:21:1::0;21152:2;21132:18;;;21125:30;-1:-1:-1;;;21171:18:1;;;21164:51;21232:18;;53305:72:0::1;20911:345:1::0;53305:72:0::1;53384:5;:7:::0;;::::1;;::::0;:5:::1;:7;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;53260:137::o:0;36615:201::-;35779:6;;-1:-1:-1;;;;;35779:6:0;16842:10;35926:23;35918:68;;;;-1:-1:-1;;;35918:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36704:22:0;::::1;36696:73;;;::::0;-1:-1:-1;;;36696:73:0;;14290:2:1;36696:73:0::1;::::0;::::1;14272:21:1::0;14329:2;14309:18;;;14302:30;14368:34;14348:18;;;14341:62;-1:-1:-1;;;14419:18:1;;;14412:36;14465:19;;36696:73:0::1;14088:402:1::0;36696:73:0::1;36780:28;36799:8;36780:18;:28::i;:::-;36615:201:::0;:::o;53401:531::-;35779:6;;-1:-1:-1;;;;;35779:6:0;16842:10;35926:23;35918:68;;;;-1:-1:-1;;;35918:68:0;;;;;;;:::i;:::-;53575:5:::1;::::0;::::1;::::0;;::::1;53563:17:::0;;::::1;;53555:49;;;::::0;-1:-1:-1;;;53555:49:0;;24172:2:1;53555:49:0::1;::::0;::::1;24154:21:1::0;24211:2;24191:18;;;24184:30;-1:-1:-1;;;24230:18:1;;;24223:49;24289:18;;53555:49:0::1;23970:343:1::0;53555:49:0::1;53658:1;53619:35;53631:23:::0;53619:9;:35:::1;:::i;:::-;:40;;;;53611:78;;;::::0;-1:-1:-1;;;53611:78:0;;13936:2:1;53611:78:0::1;::::0;::::1;13918:21:1::0;13975:2;13955:18;;;13948:30;14014:27;13994:18;;;13987:55;14059:18;;53611:78:0::1;13734:349:1::0;53611:78:0::1;53696:24;::::0;;::::1;;::::0;;;:13:::1;:24;::::0;;;;:39;;;53742:35:::1;::::0;::::1;:50:::0;;;;53799:47;::::1;:34;::::0;::::1;:47:::0;53853::::1;::::0;;::::1;:73:::0;;-1:-1:-1;;53853:73:0::1;::::0;;;::::1;;::::0;;53401:531::o;21532:305::-;21634:4;-1:-1:-1;;;;;;21671:40:0;;-1:-1:-1;;;21671:40:0;;:105;;-1:-1:-1;;;;;;;21728:48:0;;-1:-1:-1;;;21728:48:0;21671:105;:158;;;-1:-1:-1;;;;;;;;;;20072:40:0;;;21793:36;19963:157;31436:174;31511:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31511:29:0;-1:-1:-1;;;;;31511:29:0;;;;;;;;:24;;31565:23;31511:24;31565:14;:23::i;:::-;-1:-1:-1;;;;;31556:46:0;;;;;;;;;;;31436:174;;:::o;27584:348::-;27677:4;27379:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27379:16:0;27694:73;;;;-1:-1:-1;;;27694:73:0;;17999:2:1;27694:73:0;;;17981:21:1;18038:2;18018:18;;;18011:30;18077:34;18057:18;;;18050:62;-1:-1:-1;;;18128:18:1;;;18121:42;18180:19;;27694:73:0;17797:408:1;27694:73:0;27778:13;27794:23;27809:7;27794:14;:23::i;:::-;27778:39;;27847:5;-1:-1:-1;;;;;27836:16:0;:7;-1:-1:-1;;;;;27836:16:0;;:51;;;;27880:7;-1:-1:-1;;;;;27856:31:0;:20;27868:7;27856:11;:20::i;:::-;-1:-1:-1;;;;;27856:31:0;;27836:51;:87;;;-1:-1:-1;;;;;;24676:25:0;;;24652:4;24676:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27891:32;27828:96;27584:348;-1:-1:-1;;;;27584:348:0:o;30693:625::-;30852:4;-1:-1:-1;;;;;30825:31:0;:23;30840:7;30825:14;:23::i;:::-;-1:-1:-1;;;;;30825:31:0;;30817:81;;;;-1:-1:-1;;;30817:81:0;;15041:2:1;30817:81:0;;;15023:21:1;15080:2;15060:18;;;15053:30;15119:34;15099:18;;;15092:62;-1:-1:-1;;;15170:18:1;;;15163:35;15215:19;;30817:81:0;14839:401:1;30817:81:0;-1:-1:-1;;;;;30917:16:0;;30909:65;;;;-1:-1:-1;;;30909:65:0;;16837:2:1;30909:65:0;;;16819:21:1;16876:2;16856:18;;;16849:30;16915:34;16895:18;;;16888:62;-1:-1:-1;;;16966:18:1;;;16959:34;17010:19;;30909:65:0;16635:400:1;30909:65:0;31091:29;31108:1;31112:7;31091:8;:29::i;:::-;-1:-1:-1;;;;;31133:15:0;;;;;;:9;:15;;;;;:20;;31152:1;;31133:15;:20;;31152:1;;31133:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31164:13:0;;;;;;:9;:13;;;;;:18;;31181:1;;31164:13;:18;;31181:1;;31164:18;:::i;:::-;;;;-1:-1:-1;;31193:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31193:21:0;-1:-1:-1;;;;;31193:21:0;;;;;;;;;31232:27;;31193:16;;31232:27;;;;;;;23629:341;23559:411;;:::o;28274:110::-;28350:26;28360:2;28364:7;28350:26;;;;;;;;;;;;:9;:26::i;36976:191::-;37069:6;;;-1:-1:-1;;;;;37086:17:0;;;-1:-1:-1;;;;;;37086:17:0;;;;;;;37119:40;;37069:6;;;37086:17;37069:6;;37119:40;;37050:16;;37119:40;37039:128;36976:191;:::o;31752:315::-;31907:8;-1:-1:-1;;;;;31898:17:0;:5;-1:-1:-1;;;;;31898:17:0;;;31890:55;;;;-1:-1:-1;;;31890:55:0;;17242:2:1;31890:55:0;;;17224:21:1;17281:2;17261:18;;;17254:30;17320:27;17300:18;;;17293:55;17365:18;;31890:55:0;17040:349:1;31890:55:0;-1:-1:-1;;;;;31956:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;31956:46:0;;;;;;;;;;32018:41;;11581::1;;;32018::0;;11554:18:1;32018:41:0;;;;;;;31752:315;;;:::o;26662:::-;26819:28;26829:4;26835:2;26839:7;26819:9;:28::i;:::-;26866:48;26889:4;26895:2;26899:7;26908:5;26866:22;:48::i;:::-;26858:111;;;;-1:-1:-1;;;26858:111:0;;;;;;;:::i;49271:102::-;49331:13;49360:7;49353:14;;;;;:::i;17341:723::-;17397:13;17618:10;17614:53;;-1:-1:-1;;17645:10:0;;;;;;;;;;;;-1:-1:-1;;;17645:10:0;;;;;17341:723::o;17614:53::-;17692:5;17677:12;17733:78;17740:9;;17733:78;;17766:8;;;;:::i;:::-;;-1:-1:-1;17789:10:0;;-1:-1:-1;17797:2:0;17789:10;;:::i;:::-;;;17733:78;;;17821:19;17853:6;17843:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17843:17:0;;17821:39;;17871:154;17878:10;;17871:154;;17905:11;17915:1;17905:11;;:::i;:::-;;-1:-1:-1;17974:10:0;17982:2;17974:5;:10;:::i;:::-;17961:24;;:2;:24;:::i;:::-;17948:39;;17931:6;17938;17931:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;17931:56:0;;;;;;;;-1:-1:-1;18002:11:0;18011:2;18002:11;;:::i;:::-;;;17871:154;;55234:156;55298:12;55315:5;-1:-1:-1;;;;;55315:10:0;55333:4;55315:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55297:45;;;55357:7;55349:35;;;;-1:-1:-1;;;55349:35:0;;14697:2:1;55349:35:0;;;14679:21:1;14736:2;14716:18;;;14709:30;-1:-1:-1;;;14755:18:1;;;14748:45;14810:18;;55349:35:0;14495:339:1;41589:231:0;41667:7;41688:17;41707:18;41729:27;41740:4;41746:9;41729:10;:27::i;:::-;41687:69;;;;41767:18;41779:5;41767:11;:18::i;:::-;-1:-1:-1;41803:9:0;41589:231;-1:-1:-1;;;41589:231:0:o;28611:321::-;28741:18;28747:2;28751:7;28741:5;:18::i;:::-;28792:54;28823:1;28827:2;28831:7;28840:5;28792:22;:54::i;:::-;28770:154;;;;-1:-1:-1;;;28770:154:0;;;;;;;:::i;32632:799::-;32787:4;-1:-1:-1;;;;;32808:13:0;;9108:19;:23;32804:620;;32844:72;;-1:-1:-1;;;32844:72:0;;-1:-1:-1;;;;;32844:36:0;;;;;:72;;16842:10;;32895:4;;32901:7;;32910:5;;32844:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32844:72:0;;;;;;;;-1:-1:-1;;32844:72:0;;;;;;;;;;;;:::i;:::-;;;32840:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33086:13:0;;33082:272;;33129:60;;-1:-1:-1;;;33129:60:0;;;;;;;:::i;33082:272::-;33304:6;33298:13;33289:6;33285:2;33281:15;33274:38;32840:529;-1:-1:-1;;;;;;32967:51:0;-1:-1:-1;;;32967:51:0;;-1:-1:-1;32960:58:0;;32804:620;-1:-1:-1;33408:4:0;32632:799;;;;;;:::o;39479:1308::-;39560:7;39569:12;39794:9;:16;39814:2;39794:22;39790:990;;;40090:4;40075:20;;40069:27;40140:4;40125:20;;40119:27;40198:4;40183:20;;40177:27;39833:9;40169:36;40241:25;40252:4;40169:36;40069:27;40119;40241:10;:25::i;:::-;40234:32;;;;;;;;;39790:990;40288:9;:16;40308:2;40288:22;40284:496;;;40563:4;40548:20;;40542:27;40614:4;40599:20;;40593:27;40656:23;40667:4;40542:27;40593;40656:10;:23::i;:::-;40649:30;;;;;;;;40284:496;-1:-1:-1;40728:1:0;;-1:-1:-1;40732:35:0;40712:56;;37750:643;37828:20;37819:5;:29;;;;;;;;:::i;:::-;;37815:571;;;37750:643;:::o;37815:571::-;37926:29;37917:5;:38;;;;;;;;:::i;:::-;;37913:473;;;37972:34;;-1:-1:-1;;;37972:34:0;;12462:2:1;37972:34:0;;;12444:21:1;12501:2;12481:18;;;12474:30;12540:26;12520:18;;;12513:54;12584:18;;37972:34:0;12260:348:1;37913:473:0;38037:35;38028:5;:44;;;;;;;;:::i;:::-;;38024:362;;;38089:41;;-1:-1:-1;;;38089:41:0;;13157:2:1;38089:41:0;;;13139:21:1;13196:2;13176:18;;;13169:30;13235:33;13215:18;;;13208:61;13286:18;;38089:41:0;12955:355:1;38024:362:0;38161:30;38152:5;:39;;;;;;;;:::i;:::-;;38148:238;;;38208:44;;-1:-1:-1;;;38208:44:0;;17596:2:1;38208:44:0;;;17578:21:1;17635:2;17615:18;;;17608:30;17674:34;17654:18;;;17647:62;-1:-1:-1;;;17725:18:1;;;17718:32;17767:19;;38208:44:0;17394:398:1;38148:238:0;38283:30;38274:5;:39;;;;;;;;:::i;:::-;;38270:116;;;38330:44;;-1:-1:-1;;;38330:44:0;;20002:2:1;38330:44:0;;;19984:21:1;20041:2;20021:18;;;20014:30;20080:34;20060:18;;;20053:62;-1:-1:-1;;;20131:18:1;;;20124:32;20173:19;;38330:44:0;19800:398:1;29268:439:0;-1:-1:-1;;;;;29348:16:0;;29340:61;;;;-1:-1:-1;;;29340:61:0;;20405:2:1;29340:61:0;;;20387:21:1;;;20424:18;;;20417:30;20483:34;20463:18;;;20456:62;20535:18;;29340:61:0;20203:356:1;29340:61:0;27355:4;27379:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27379:16:0;:30;29412:58;;;;-1:-1:-1;;;29412:58:0;;15447:2:1;29412:58:0;;;15429:21:1;15486:2;15466:18;;;15459:30;15525;15505:18;;;15498:58;15573:18;;29412:58:0;15245:352:1;29412:58:0;-1:-1:-1;;;;;29541:13:0;;;;;;:9;:13;;;;;:18;;29558:1;;29541:13;:18;;29558:1;;29541:18;:::i;:::-;;;;-1:-1:-1;;29570:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29570:21:0;-1:-1:-1;;;;;29570:21:0;;;;;;;;29609:33;;29570:16;;;29609:33;;29570:16;;29609:33;53022:21:::1;52890:159:::0;:::o;43041:1632::-;43172:7;;44106:66;44093:79;;44089:163;;;-1:-1:-1;44205:1:0;;-1:-1:-1;44209:30:0;44189:51;;44089:163;44266:1;:7;;44271:2;44266:7;;:18;;;;;44277:1;:7;;44282:2;44277:7;;44266:18;44262:102;;;-1:-1:-1;44317:1:0;;-1:-1:-1;44321:30:0;44301:51;;44262:102;44478:24;;;44461:14;44478:24;;;;;;;;;11860:25:1;;;11933:4;11921:17;;11901:18;;;11894:45;;;;11955:18;;;11948:34;;;11998:18;;;11991:34;;;44478:24:0;;11832:19:1;;44478:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44478:24:0;;-1:-1:-1;;44478:24:0;;;-1:-1:-1;;;;;;;44517:20:0;;44513:103;;44570:1;44574:29;44554:50;;;;;;;44513:103;44636:6;-1:-1:-1;44644:20:0;;-1:-1:-1;43041:1632:0;;;;;;;;:::o;42083:344::-;42197:7;;-1:-1:-1;;;;;42243:80:0;;42197:7;42350:25;42366:3;42351:18;;;42373:2;42350:25;:::i;:::-;42334:42;;42394:25;42405:4;42411:1;42414;42417;42394:10;:25::i;:::-;42387:32;;;;;;42083:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:160::-;893:20;;949:13;;942:21;932:32;;922:60;;978:1;975;968:12;993:220;1035:5;1088:3;1081:4;1073:6;1069:17;1065:27;1055:55;;1106:1;1103;1096:12;1055:55;1128:79;1203:3;1194:6;1181:20;1174:4;1166:6;1162:17;1128:79;:::i;1218:156::-;1284:20;;1344:4;1333:16;;1323:27;;1313:55;;1364:1;1361;1354:12;1379:186;1438:6;1491:2;1479:9;1470:7;1466:23;1462:32;1459:52;;;1507:1;1504;1497:12;1459:52;1530:29;1549:9;1530:29;:::i;1570:260::-;1638:6;1646;1699:2;1687:9;1678:7;1674:23;1670:32;1667:52;;;1715:1;1712;1705:12;1667:52;1738:29;1757:9;1738:29;:::i;:::-;1728:39;;1786:38;1820:2;1809:9;1805:18;1786:38;:::i;:::-;1776:48;;1570:260;;;;;:::o;1835:328::-;1912:6;1920;1928;1981:2;1969:9;1960:7;1956:23;1952:32;1949:52;;;1997:1;1994;1987:12;1949:52;2020:29;2039:9;2020:29;:::i;:::-;2010:39;;2068:38;2102:2;2091:9;2087:18;2068:38;:::i;:::-;2058:48;;2153:2;2142:9;2138:18;2125:32;2115:42;;1835:328;;;;;:::o;2168:537::-;2263:6;2271;2279;2287;2340:3;2328:9;2319:7;2315:23;2311:33;2308:53;;;2357:1;2354;2347:12;2308:53;2380:29;2399:9;2380:29;:::i;:::-;2370:39;;2428:38;2462:2;2451:9;2447:18;2428:38;:::i;:::-;2418:48;;2513:2;2502:9;2498:18;2485:32;2475:42;;2568:2;2557:9;2553:18;2540:32;2595:18;2587:6;2584:30;2581:50;;;2627:1;2624;2617:12;2581:50;2650:49;2691:7;2682:6;2671:9;2667:22;2650:49;:::i;:::-;2640:59;;;2168:537;;;;;;;:::o;2710:254::-;2775:6;2783;2836:2;2824:9;2815:7;2811:23;2807:32;2804:52;;;2852:1;2849;2842:12;2804:52;2875:29;2894:9;2875:29;:::i;:::-;2865:39;;2923:35;2954:2;2943:9;2939:18;2923:35;:::i;2969:254::-;3037:6;3045;3098:2;3086:9;3077:7;3073:23;3069:32;3066:52;;;3114:1;3111;3104:12;3066:52;3137:29;3156:9;3137:29;:::i;:::-;3127:39;3213:2;3198:18;;;;3185:32;;-1:-1:-1;;;2969:254:1:o;3228:322::-;3305:6;3313;3321;3374:2;3362:9;3353:7;3349:23;3345:32;3342:52;;;3390:1;3387;3380:12;3342:52;3413:29;3432:9;3413:29;:::i;:::-;3403:39;3489:2;3474:18;;3461:32;;-1:-1:-1;3540:2:1;3525:18;;;3512:32;;3228:322;-1:-1:-1;;;3228:322:1:o;3555:464::-;3639:6;3647;3655;3708:2;3696:9;3687:7;3683:23;3679:32;3676:52;;;3724:1;3721;3714:12;3676:52;3747:29;3766:9;3747:29;:::i;:::-;3737:39;;3795:36;3827:2;3816:9;3812:18;3795:36;:::i;:::-;3785:46;;3882:2;3871:9;3867:18;3854:32;3909:18;3901:6;3898:30;3895:50;;;3941:1;3938;3931:12;3895:50;3964:49;4005:7;3996:6;3985:9;3981:22;3964:49;:::i;:::-;3954:59;;;3555:464;;;;;:::o;4024:180::-;4080:6;4133:2;4121:9;4112:7;4108:23;4104:32;4101:52;;;4149:1;4146;4139:12;4101:52;4172:26;4188:9;4172:26;:::i;4209:245::-;4267:6;4320:2;4308:9;4299:7;4295:23;4291:32;4288:52;;;4336:1;4333;4326:12;4288:52;4375:9;4362:23;4394:30;4418:5;4394:30;:::i;4459:249::-;4528:6;4581:2;4569:9;4560:7;4556:23;4552:32;4549:52;;;4597:1;4594;4587:12;4549:52;4629:9;4623:16;4648:30;4672:5;4648:30;:::i;4713:450::-;4782:6;4835:2;4823:9;4814:7;4810:23;4806:32;4803:52;;;4851:1;4848;4841:12;4803:52;4891:9;4878:23;4924:18;4916:6;4913:30;4910:50;;;4956:1;4953;4946:12;4910:50;4979:22;;5032:4;5024:13;;5020:27;-1:-1:-1;5010:55:1;;5061:1;5058;5051:12;5010:55;5084:73;5149:7;5144:2;5131:16;5126:2;5122;5118:11;5084:73;:::i;5168:180::-;5227:6;5280:2;5268:9;5259:7;5255:23;5251:32;5248:52;;;5296:1;5293;5286:12;5248:52;-1:-1:-1;5319:23:1;;5168:180;-1:-1:-1;5168:180:1:o;5353:254::-;5421:6;5429;5482:2;5470:9;5461:7;5457:23;5453:32;5450:52;;;5498:1;5495;5488:12;5450:52;5534:9;5521:23;5511:33;;5563:38;5597:2;5586:9;5582:18;5563:38;:::i;5612:248::-;5680:6;5688;5741:2;5729:9;5720:7;5716:23;5712:32;5709:52;;;5757:1;5754;5747:12;5709:52;-1:-1:-1;;5780:23:1;;;5850:2;5835:18;;;5822:32;;-1:-1:-1;5612:248:1:o;5865:182::-;5922:6;5975:2;5963:9;5954:7;5950:23;5946:32;5943:52;;;5991:1;5988;5981:12;5943:52;6014:27;6031:9;6014:27;:::i;6052:256::-;6118:6;6126;6179:2;6167:9;6158:7;6154:23;6150:32;6147:52;;;6195:1;6192;6185:12;6147:52;6218:27;6235:9;6218:27;:::i;6313:460::-;6402:6;6410;6418;6426;6434;6487:3;6475:9;6466:7;6462:23;6458:33;6455:53;;;6504:1;6501;6494:12;6455:53;6527:27;6544:9;6527:27;:::i;:::-;6517:37;;6601:2;6590:9;6586:18;6573:32;6563:42;;6652:2;6641:9;6637:18;6624:32;6614:42;;6675:36;6707:2;6696:9;6692:18;6675:36;:::i;:::-;6665:46;;6730:37;6762:3;6751:9;6747:19;6730:37;:::i;:::-;6720:47;;6313:460;;;;;;;;:::o;6778:::-;6860:6;6868;6876;6929:2;6917:9;6908:7;6904:23;6900:32;6897:52;;;6945:1;6942;6935:12;6897:52;6968:27;6985:9;6968:27;:::i;7243:257::-;7284:3;7322:5;7316:12;7349:6;7344:3;7337:19;7365:63;7421:6;7414:4;7409:3;7405:14;7398:4;7391:5;7387:16;7365:63;:::i;:::-;7482:2;7461:15;-1:-1:-1;;7457:29:1;7448:39;;;;7489:4;7444:50;;7243:257;-1:-1:-1;;7243:257:1:o;8035:470::-;8214:3;8252:6;8246:13;8268:53;8314:6;8309:3;8302:4;8294:6;8290:17;8268:53;:::i;:::-;8384:13;;8343:16;;;;8406:57;8384:13;8343:16;8440:4;8428:17;;8406:57;:::i;:::-;8479:20;;8035:470;-1:-1:-1;;;;8035:470:1:o;8510:1099::-;8638:3;8667:1;8700:6;8694:13;8730:3;8752:1;8780:9;8776:2;8772:18;8762:28;;8840:2;8829:9;8825:18;8862;8852:61;;8906:4;8898:6;8894:17;8884:27;;8852:61;8932:2;8980;8972:6;8969:14;8949:18;8946:38;8943:165;;;-1:-1:-1;;;9007:33:1;;9063:4;9060:1;9053:15;9093:4;9014:3;9081:17;8943:165;9124:18;9151:104;;;;9269:1;9264:320;;;;9117:467;;9151:104;-1:-1:-1;;9184:24:1;;9172:37;;9229:16;;;;-1:-1:-1;9151:104:1;;9264:320;26207:1;26200:14;;;26244:4;26231:18;;9359:1;9373:165;9387:6;9384:1;9381:13;9373:165;;;9465:14;;9452:11;;;9445:35;9508:16;;;;9402:10;;9373:165;;;9377:3;;9567:6;9562:3;9558:16;9551:23;;9117:467;-1:-1:-1;9600:3:1;;8510:1099;-1:-1:-1;;;;;;;;8510:1099:1:o;10032:488::-;-1:-1:-1;;;;;10301:15:1;;;10283:34;;10353:15;;10348:2;10333:18;;10326:43;10400:2;10385:18;;10378:34;;;10448:3;10443:2;10428:18;;10421:31;;;10226:4;;10469:45;;10494:19;;10486:6;10469:45;:::i;:::-;10461:53;10032:488;-1:-1:-1;;;;;;10032:488:1:o;10804:632::-;10975:2;11027:21;;;11097:13;;11000:18;;;11119:22;;;10946:4;;10975:2;11198:15;;;;11172:2;11157:18;;;10946:4;11241:169;11255:6;11252:1;11249:13;11241:169;;;11316:13;;11304:26;;11385:15;;;;11350:12;;;;11277:1;11270:9;11241:169;;;-1:-1:-1;11427:3:1;;10804:632;-1:-1:-1;;;;;;10804:632:1:o;12036:219::-;12185:2;12174:9;12167:21;12148:4;12205:44;12245:2;12234:9;12230:18;12222:6;12205:44;:::i;13315:414::-;13517:2;13499:21;;;13556:2;13536:18;;;13529:30;13595:34;13590:2;13575:18;;13568:62;-1:-1:-1;;;13661:2:1;13646:18;;13639:48;13719:3;13704:19;;13315:414::o;22028:356::-;22230:2;22212:21;;;22249:18;;;22242:30;22308:34;22303:2;22288:18;;22281:62;22375:2;22360:18;;22028:356::o;23552:413::-;23754:2;23736:21;;;23793:2;23773:18;;;23766:30;23832:34;23827:2;23812:18;;23805:62;-1:-1:-1;;;23898:2:1;23883:18;;23876:47;23955:3;23940:19;;23552:413::o;26260:128::-;26300:3;26331:1;26327:6;26324:1;26321:13;26318:39;;;26337:18;;:::i;:::-;-1:-1:-1;26373:9:1;;26260:128::o;26393:204::-;26431:3;26467:4;26464:1;26460:12;26499:4;26496:1;26492:12;26534:3;26528:4;26524:14;26519:3;26516:23;26513:49;;;26542:18;;:::i;:::-;26578:13;;26393:204;-1:-1:-1;;;26393:204:1:o;26602:120::-;26642:1;26668;26658:35;;26673:18;;:::i;:::-;-1:-1:-1;26707:9:1;;26602:120::o;26727:168::-;26767:7;26833:1;26829;26825:6;26821:14;26818:1;26815:21;26810:1;26803:9;26796:17;26792:45;26789:71;;;26840:18;;:::i;:::-;-1:-1:-1;26880:9:1;;26727:168::o;26900:125::-;26940:4;26968:1;26965;26962:8;26959:34;;;26973:18;;:::i;:::-;-1:-1:-1;27010:9:1;;26900:125::o;27030:195::-;27068:4;27105;27102:1;27098:12;27137:4;27134:1;27130:12;27162:3;27157;27154:12;27151:38;;;27169:18;;:::i;:::-;27206:13;;;27030:195;-1:-1:-1;;;27030:195:1:o;27230:258::-;27302:1;27312:113;27326:6;27323:1;27320:13;27312:113;;;27402:11;;;27396:18;27383:11;;;27376:39;27348:2;27341:10;27312:113;;;27443:6;27440:1;27437:13;27434:48;;;-1:-1:-1;;27478:1:1;27460:16;;27453:27;27230:258::o;27493:380::-;27572:1;27568:12;;;;27615;;;27636:61;;27690:4;27682:6;27678:17;27668:27;;27636:61;27743:2;27735:6;27732:14;27712:18;27709:38;27706:161;;;27789:10;27784:3;27780:20;27777:1;27770:31;27824:4;27821:1;27814:15;27852:4;27849:1;27842:15;27706:161;;27493:380;;;:::o;27878:135::-;27917:3;-1:-1:-1;;27938:17:1;;27935:43;;;27958:18;;:::i;:::-;-1:-1:-1;28005:1:1;27994:13;;27878:135::o;28018:175::-;28055:3;28099:4;28092:5;28088:16;28128:4;28119:7;28116:17;28113:43;;;28136:18;;:::i;:::-;28185:1;28172:15;;28018:175;-1:-1:-1;;28018:175:1:o;28198:112::-;28230:1;28256;28246:35;;28261:18;;:::i;:::-;-1:-1:-1;28295:9:1;;28198:112::o;28315:127::-;28376:10;28371:3;28367:20;28364:1;28357:31;28407:4;28404:1;28397:15;28431:4;28428:1;28421:15;28447:127;28508:10;28503:3;28499:20;28496:1;28489:31;28539:4;28536:1;28529:15;28563:4;28560:1;28553:15;28579:127;28640:10;28635:3;28631:20;28628:1;28621:31;28671:4;28668:1;28661:15;28695:4;28692:1;28685:15;28711:127;28772:10;28767:3;28763:20;28760:1;28753:31;28803:4;28800:1;28793:15;28827:4;28824:1;28817:15;28843:127;28904:10;28899:3;28895:20;28892:1;28885:31;28935:4;28932:1;28925:15;28959:4;28956:1;28949:15;28975:131;-1:-1:-1;;;;;;29049:32:1;;29039:43;;29029:71;;29096:1;29093;29086:12

Swarm Source

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