ETH Price: $3,251.36 (-3.11%)

Token

InfiniGods: Elder Gods (GODS)
 

Overview

Max Total Supply

4,052 GODS

Holders

683

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
thruster.eth
Balance
1 GODS
0x6F54d40ccc174F9C7Bd23252E4Db8f1cA4291173
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:
ElderGODS

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-28
*/

// File: ElderGods.sol


pragma solidity 0.8.17;

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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

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

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

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

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

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

abstract contract Ownable is Context {
    address private _owner;

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

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

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

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

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

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

abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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: address zero is not a valid owner");
        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: invalid token ID");
        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) {
        _requireMinted(tokenId);

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

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

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        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: caller is not token owner or 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: caller is not token owner or 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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * 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
        delete _tokenApprovals[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
        delete _tokenApprovals[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 an {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 an {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 Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    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 {}
}

interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

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

interface IInfiniGods {
    function getTokenRarity(uint256 tokenId) external view returns (uint8);
}

interface IERC4907 {

    // Logged when the user of an NFT is changed or expires is changed
    /// @notice Emitted when the `user` of an NFT or the `expires` of the `user` is changed
    /// The zero address for user indicates that there is no user address
    event UpdateUser(uint256 indexed tokenId, address indexed user, uint64 expires);

    /// @notice set the user and expires of an NFT
    /// @dev The zero address indicates there is no user
    /// Throws if `tokenId` is not valid NFT
    /// @param user  The new user of the NFT
    /// @param expires  UNIX timestamp, The new user could use the NFT before expires
    function setUser(uint256 tokenId, address user, uint64 expires) external;

    /// @notice Get the user address of an NFT
    /// @dev The zero address indicates that there is no user or the user is expired
    /// @param tokenId The NFT to get the user address for
    /// @return The user address for this NFT
    function userOf(uint256 tokenId) external view returns(address);

    /// @notice Get the user expires of an NFT
    /// @dev The zero value indicates that there is no user
    /// @param tokenId The NFT to get the user expires for
    /// @return The user expires for this NFT
    function userExpires(uint256 tokenId) external view returns(uint256);
}

contract ElderGODS is ERC721Enumerable, Ownable, IERC4907, ReentrancyGuard {
    using Address for address payable;
    using Strings for uint256;
    using SafeERC20 for IERC20;

    mapping (uint256  => bool) public isSloth; 

    mapping (uint256 => uint256) public mintedAmount; // mapping of InfiniGods Token Id -> how many minted (max 2)
    mapping (uint256 => bool) public hasMinted;

    uint256 private constant MAX_SUPPLY = 4488;
    uint256 private constant MAX_MINT = 4228;

    address public immutable INFINIGODS;

    uint256 private slothAirdropTokenCount;
    uint256 private normalAirdropTokenCount;

    uint256 private constant sale_start_time = 1669914000; // Dec 1 @ 1200 EST
    uint256 private sale_end_time = 1670518800;   // Dec 8 @ 1200 EST
    bool public sale_active = true;

    string private notRevealedURI;
    bool public revealed;
    string private baseURI_;
    string private baseExtension_;

    address private treasury;

    constructor (string memory name_, string memory symbol_, address _ig) ERC721(name_, symbol_) {
        INFINIGODS = _ig;
        allowedTokens[WETH] = true;
    }

    function airdropSloth(uint256 gasLimit) external onlyOwner nonReentrant {
        address to;

        for (uint256 x = slothAirdropTokenCount + 1; x <= IERC721Enumerable(INFINIGODS).totalSupply() && gasleft() > gasLimit;) {
            if (IInfiniGods(INFINIGODS).getTokenRarity(x) == 1) {
                slothAirdropTokenCount = x;
                to = IERC721(INFINIGODS).ownerOf(x);
                _safeMint(to, totalSupply() + 1);
                isSloth[totalSupply()] = true;
            }
            unchecked {
                ++x;
            }
        }
    }

    function airdropStandard(uint256 gasLimit) external onlyOwner nonReentrant {
        address to;
        for (uint256 x = normalAirdropTokenCount + 1; x <= IERC721Enumerable(INFINIGODS).totalSupply() && gasleft() > gasLimit;) {
            if (IInfiniGods(INFINIGODS).getTokenRarity(x) == 1) {
                normalAirdropTokenCount = x;
                to = IERC721(INFINIGODS).ownerOf(x);
                for (uint256 i; i < 4;) {
                    _safeMint(to, totalSupply() + 1);
                    unchecked {
                        ++i;
                    }
                }
            }
            unchecked {
                ++ x;
            }
        }
    }

    function mint(uint256[] memory _tokenId, uint256 amount) external nonReentrant {
        require(totalSupply() + amount <= MAX_MINT && totalSupply() + amount <= MAX_SUPPLY, "GODS: Supply would be exceeded");
        require(block.timestamp >= sale_start_time, "GODS: Mint has not started");
        require(block.timestamp <= sale_end_time, "GODS: Mint has finished");
        require(sale_active, "GODS: Sale is paused");
        uint256 mintAbility;
        for (uint256 i; i < _tokenId.length;) {
            require(IERC721(INFINIGODS).ownerOf(_tokenId[i]) == _msgSender(), "GODS: Caller not owner of token");
            if (IInfiniGods(INFINIGODS).getTokenRarity(_tokenId[i]) == 0) {
                if (!hasMinted[_tokenId[i]]) {
                    mintAbility += 1;
                }
            }
            unchecked {
                ++i;
            }
        }
        require(mintAbility >= amount, "GODS: Not enough mint ability");
        uint256 count = amount;
        while (count > 0) {
            for (uint256 y; y < _tokenId.length;) {
                if (!hasMinted[_tokenId[y]]) {
                    count -= 1;
                    hasMinted[_tokenId[y]] = true;
                }
                unchecked {
                    ++y;
                }
            }
        }
        for (uint256 z; z < amount; z ++) {
            _safeMint(_msgSender(), totalSupply() + 1);
        }
    }

    function returnToTreasury(uint256 gasLimit) external onlyOwner nonReentrant {
        require(block.timestamp >= sale_end_time, "GODS: Sale has not finished");
        require(treasury != address(0), "GODS: To address(0)");
        while (totalSupply() <= MAX_SUPPLY && gasleft() > gasLimit) {
            _safeMint(treasury, totalSupply() + 1);
        }
    }

    function changeSaleStatus(bool value) external onlyOwner {
        sale_active = value;
    }

    function changeEndTime(uint256 new_end_time) external onlyOwner {
        sale_end_time = new_end_time;
    }

    function reveal(bool value) external onlyOwner {
        revealed = value;
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        _requireMinted(tokenId);
        if (revealed) {
            return bytes(baseURI_).length > 0 ? string(abi.encodePacked(baseURI_, tokenId.toString(), baseExtension_)) : "";
        } else {
            return notRevealedURI;
        }
    }

    function getConfig() external view returns (uint256[2] memory) {
        return [sale_start_time, sale_end_time];
    }

    function getAvailable(uint256[] memory _tokenIds) external view returns (uint256[] memory) {
        uint256[] memory result = new uint256[](_tokenIds.length);
        for (uint i = 0; i < _tokenIds.length;) {
            if (IInfiniGods(INFINIGODS).getTokenRarity(_tokenIds[i]) == 0 && !hasMinted[_tokenIds[i]]) {
                result[i] = 1;
            }
            unchecked {
                ++i;
            }
        }
        return result;
    }

    function getUserTokens(address user) public view returns (uint256[] memory) {
        uint256 balance = IERC721(INFINIGODS).balanceOf(user);
        uint256[] memory result = new uint256[](balance);

        for (uint i = 0; i < balance;) {
            result[i] = IERC721Enumerable(INFINIGODS).tokenOfOwnerByIndex(user, i);
            unchecked {
                ++i;
            }
        }
        return result;
    }

    /// @dev EIP4907

    uint256 public godsFee;
    uint256 private constant denominator = 1000;
    bool public canRent;

    address public constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;

    mapping (address => bool) public allowedTokens;

    struct Rent {
        address user;
        uint64 expires;
    }

    mapping (uint256 => Rent) public rent;

    struct RentBids {
        uint256 tokenId;
        uint256 price;
        address user;
        uint256 expiry;
        address payToken;
        uint64 duration;
    }

    mapping (uint256 => RentBids) public rentBids;
    uint256 public rentBidsCounter;

    struct RentableItems {
        uint256 price;
        address lender;
        uint64 expiry;
        address payToken;
        uint64 duration;
    }

    mapping (uint256 => RentableItems) public rentableItems;

    event BidPlaced(uint256 indexed bidId, uint256 tokenId, uint64 expiry, uint64 duration, uint256 price, address token);
    event BidDeleted(uint256 bidId);
    event NFTListedForRent(uint256 tokenId, uint64 expiry, uint64 duration, uint256 price, address token);
    event NFTDeletedFromRent(uint256 tokenId);

    modifier rentability() {
        require(canRent, "GODS: Rent is currently disabled");
        _;
    }

    function setUser(uint256 tokenId, address user, uint64 expires) public override rentability {
        require(_msgSender() == ownerOf(tokenId), "GODS: Not owner");
        _setUser(tokenId, user, expires);
    }

    function _setUser(uint256 tokenId, address _user, uint64 _expires) internal {
        _requireMinted(tokenId);
        require(rent[tokenId].user == address(0) || rent[tokenId].expires < block.timestamp, "GODS: Currently Rented");
        rent[tokenId] = Rent({
            user: _user,
            expires: _expires
        });
        emit UpdateUser(tokenId, _user, _expires);
    }

    function userOf(uint256 tokenId) external view returns (address) {
        _requireMinted(tokenId);
        if (rent[tokenId].expires >= block.timestamp) {
            return rent[tokenId].user;
        } else {
            return ownerOf(tokenId);
        }
    }

    function userExpires(uint256 tokenId) external view returns(uint256) {
        _requireMinted(tokenId);
        return rent[tokenId].expires;
    }

    function putForRent(uint256 _tokenId, uint64 _expiry, uint64 _duration, uint256 _price, address _token) external rentability {
        _requireMinted(_tokenId);
        require(allowedTokens[_token], "GODS: Unrecognised token");
        require(_msgSender() == ownerOf(_tokenId), "GODS: Not Authorised");
        require(rent[_tokenId].user == address(0) || rent[_tokenId].expires < block.timestamp, "GODS: Currently Rented");
        rentableItems[_tokenId] = RentableItems({
            price: _price,
            lender: _msgSender(),
            expiry: _expiry,
            payToken: _token,
            duration: _duration
        });
        emit NFTListedForRent(_tokenId, _expiry, _duration, _price, _token);
    }

    function deleteFromRent(uint256 _tokenId) external {
        _requireMinted(_tokenId);
        require(_msgSender() == ownerOf(_tokenId), "GODS: Not Authorised");
        rentableItems[_tokenId].expiry = 0;
        emit NFTDeletedFromRent(_tokenId);
    }

    function acceptRent(uint256 _tokenId) external rentability nonReentrant {
        _requireMinted(_tokenId);
        require(_msgSender() != ownerOf(_tokenId), "GODS: Cannot rent own token");
        require(ownerOf(_tokenId) == rentableItems[_tokenId].lender, "GODS: Lender cannot rent");
        require(rentableItems[_tokenId].expiry >= block.timestamp, "GODS: Offer expired");
        rentableItems[_tokenId].expiry = 0;
        uint256 cost = rentableItems[_tokenId].price;
        if (godsFee > 0) {
            uint256 toOwner = cost * (denominator - godsFee) / denominator;
            uint256 toTreasury = cost * (godsFee) / denominator;
            IERC20(rentableItems[_tokenId].payToken).safeTransferFrom(_msgSender(), ownerOf(_tokenId), toOwner);
            if (toTreasury > 0) {
                IERC20(rentableItems[_tokenId].payToken).safeTransferFrom(_msgSender(), treasury, toTreasury);
            }
        } else {
            IERC20(rentableItems[_tokenId].payToken).safeTransferFrom(_msgSender(), ownerOf(_tokenId), cost);
        }
        _setUser(_tokenId, _msgSender(), uint64(block.timestamp + rentableItems[_tokenId].duration));
    }

    function placeBid(uint256 _tokenId, uint64 _expiry, uint64 _duration, uint256 _price, address _token) external rentability {
        _requireMinted(_tokenId);
        require(allowedTokens[_token], "GODS: Unrecognised token");
        require(_expiry >= block.timestamp, "GODS: Invalid expiry");
        rentBidsCounter ++;
        rentBids[rentBidsCounter] = RentBids({
            tokenId: _tokenId,
            price: _price,
            user: _msgSender(),
            expiry: _expiry,
            payToken: _token,
            duration: _duration
        });
        emit BidPlaced(rentBidsCounter, _tokenId, _expiry, _duration, _price, _token);
    }

    function deleteBid(uint256 bidId) external {
        require(_msgSender() == rentBids[bidId].user, "GODS: Not authorised");
        require(block.timestamp >= rentBids[bidId].expiry, "GODS: Bid expired");
        rentBids[bidId].expiry = 0;
        emit BidDeleted(bidId);
    }

    function acceptBid(uint256 bidId) external rentability nonReentrant {
        RentBids memory bid = rentBids[bidId];
        require(ownerOf(bid.tokenId) == _msgSender(), "GODS: Caller is not the owner");
        require(rent[bid.tokenId].user == address(0) || rent[bid.tokenId].expires < block.timestamp, "GODS: Currently Rented");
        require(bid.expiry >= block.timestamp, "GODS: Bid expired");
        rentBids[bidId].expiry = 0;
        uint256 cost = bid.price;
        if (godsFee > 0) {
            uint256 toOwner = cost * (denominator - godsFee) / denominator;
            uint256 toTreasury = cost * (godsFee) / denominator;
            IERC20(bid.payToken).safeTransferFrom(bid.user, ownerOf(bid.tokenId), toOwner);
            if (toTreasury > 0) {
                IERC20(bid.payToken).safeTransferFrom(bid.user, treasury, toTreasury);
            }
        } else {
            IERC20(bid.payToken).safeTransferFrom(bid.user, ownerOf(bid.tokenId), cost);
        }
        setUser(bid.tokenId, bid.user, uint64(block.timestamp) + bid.duration);
    } 
    
    /// @dev onlyOwner

    function modifyAllowedTokens(address[] calldata tokenList, bool value) external onlyOwner {
        for (uint256 i; i < tokenList.length;) {
            allowedTokens[tokenList[i]] = value;
            unchecked {
                ++i;
            }
        }
        assert(allowedTokens[WETH] == true);
    }

    function changeTreasuryAddress(address _newTreasury) external onlyOwner {
        treasury = _newTreasury;
    }

    function changeRentFee(uint256 _newFee) external onlyOwner {
        require(_newFee < denominator, "GODS: Fee too high");
        godsFee = _newFee;
    }

    function setRentStatus(bool status) external onlyOwner {
        canRent = status;
    }

    function setBaseURI(string memory _base) external onlyOwner {
        baseURI_ = _base;
    }

    function setBaseExtension(string memory _ext) external onlyOwner {
        baseExtension_ = _ext;
    }

    function setNotRevealedURI(string memory _newURI) external onlyOwner {
        notRevealedURI = _newURI;
    }

    function withdrawFunds() external onlyOwner {
        payable(owner()).sendValue(address(this).balance);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Enumerable) returns (bool) {
        return
            interfaceId == type(IERC4907).interfaceId ||
            super.supportsInterface(interfaceId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"address","name":"_ig","type":"address"}],"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":false,"internalType":"uint256","name":"bidId","type":"uint256"}],"name":"BidDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"bidId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"expiry","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"duration","type":"uint64"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"BidPlaced","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"NFTDeletedFromRent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"expiry","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"duration","type":"uint64"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"NFTListedForRent","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint64","name":"expires","type":"uint64"}],"name":"UpdateUser","type":"event"},{"inputs":[],"name":"INFINIGODS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"bidId","type":"uint256"}],"name":"acceptBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"acceptRent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gasLimit","type":"uint256"}],"name":"airdropSloth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gasLimit","type":"uint256"}],"name":"airdropStandard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"canRent","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"new_end_time","type":"uint256"}],"name":"changeEndTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"changeRentFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"changeSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newTreasury","type":"address"}],"name":"changeTreasuryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bidId","type":"uint256"}],"name":"deleteBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"deleteFromRent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"getAvailable","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getConfig","outputs":[{"internalType":"uint256[2]","name":"","type":"uint256[2]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"godsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"hasMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isSloth","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenId","type":"uint256[]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokenList","type":"address[]"},{"internalType":"bool","name":"value","type":"bool"}],"name":"modifyAllowedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint64","name":"_expiry","type":"uint64"},{"internalType":"uint64","name":"_duration","type":"uint64"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"placeBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint64","name":"_expiry","type":"uint64"},{"internalType":"uint64","name":"_duration","type":"uint64"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"putForRent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rent","outputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint64","name":"expires","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rentBids","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"address","name":"payToken","type":"address"},{"internalType":"uint64","name":"duration","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rentBidsCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rentableItems","outputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"lender","type":"address"},{"internalType":"uint64","name":"expiry","type":"uint64"},{"internalType":"address","name":"payToken","type":"address"},{"internalType":"uint64","name":"duration","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gasLimit","type":"uint256"}],"name":"returnToTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sale_active","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"_ext","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_base","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setRentStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint64","name":"expires","type":"uint64"}],"name":"setUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"userExpires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"userOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a060405263639218106011556012805460ff191660011790553480156200002657600080fd5b5060405162004b8338038062004b83833981016040819052620000499162000207565b8282600062000059838262000323565b50600162000068828262000323565b505050620000856200007f620000ec60201b60201c565b620000f0565b6001600b8190556001600160a01b0390911660805273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2600052601a6020527f146de4131afcb204954dd72d0d4833e886cd7bb9ae4d89ce45e979d90af2c9d6805460ff1916909117905550620003ef9050565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200016a57600080fd5b81516001600160401b038082111562000187576200018762000142565b604051601f8301601f19908116603f01168101908282118183101715620001b257620001b262000142565b81604052838152602092508683858801011115620001cf57600080fd5b600091505b83821015620001f35785820183015181830184015290820190620001d4565b600093810190920192909252949350505050565b6000806000606084860312156200021d57600080fd5b83516001600160401b03808211156200023557600080fd5b620002438783880162000158565b945060208601519150808211156200025a57600080fd5b50620002698682870162000158565b604086015190935090506001600160a01b03811681146200028957600080fd5b809150509250925092565b600181811c90821680620002a957607f821691505b602082108103620002ca57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200031e57600081815260208120601f850160051c81016020861015620002f95750805b601f850160051c820191505b818110156200031a5782815560010162000305565b5050505b505050565b81516001600160401b038111156200033f576200033f62000142565b620003578162000350845462000294565b84620002d0565b602080601f8311600181146200038f5760008415620003765750858301515b600019600386901b1c1916600185901b1785556200031a565b600085815260208120601f198616915b82811015620003c0578886015182559484019460019091019084016200039f565b5085821015620003df5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805161472b620004586000396000818161058c01528181610a1801528181610ac101528181610b5901528181610fc5015281816110c301528181611320015281816113c90152818161146101528181611db901528181611e9d0152612591015261472b6000f3fe608060405234801561001057600080fd5b50600436106103a35760003560e01c8063736a1fdd116101e9578063c2f1f14a1161010f578063e0df7216116100ad578063e8f202981161007c578063e8f2029814610986578063e985e9c51461098f578063f2c4ce1e146109cb578063f2fde38b146109de57600080fd5b8063e0df72161461092a578063e5b9559514610937578063e744092e1461095a578063e7a7fa4c1461097d57600080fd5b8063d8c3bb5b116100e9578063d8c3bb5b146108ce578063da3ef23f146108f1578063e030565e14610904578063e05a20e71461091757600080fd5b8063c2f1f14a14610893578063c3f909d4146108a6578063c87b56dd146108bb57600080fd5b806395d89b4111610187578063aa19a7c511610156578063aa19a7c51461083f578063ad5c464814610852578063b88d4fde1461086d578063bb05d5051461088057600080fd5b806395d89b41146107fe578063a22cb46514610806578063a6f353f014610819578063a70c1dde1461082c57600080fd5b80638da5cb5b116101c35780638da5cb5b146107b45780638fc88c48146107c557806392d80ead146107d8578063940cd05b146107eb57600080fd5b8063736a1fdd146107325780637456be7d1461073f5780638bebfca9146107a157600080fd5b80632db8fadd116102ce5780634f6ccce71161026c5780635be310cc1161023b5780635be310cc146106f15780636352211e1461070457806370a0823114610717578063715018a61461072a57600080fd5b80634f6ccce71461069e57806351830227146106b1578063519dc8d2146106be57806355f804b3146106de57600080fd5b806342842e0e116102a857806342842e0e146105d457806343175240146105e7578063442e351b146105fa578063451588381461068b57600080fd5b80632db8fadd146105875780632f745c59146105ae5780633052b75e146105c157600080fd5b80630c2e2489116103465780632279bc06116103155780632279bc061461054657806323b872dd1461055957806324600fc31461056c5780632b1fd58a1461057457600080fd5b80630c2e2489146104795780630d189fcc1461048c57806318160ddd1461049f5780631f52a0d1146104a757600080fd5b80630745933b116103825780630745933b146103fa578063081812fc14610428578063095ea7b3146104535780630bd062461461046657600080fd5b8062b8b48a146103a857806301ffc9a7146103bd57806306fdde03146103e5575b600080fd5b6103bb6103b6366004613bfe565b6109f1565b005b6103d06103cb366004613c2d565b610c31565b60405190151581526020015b60405180910390f35b6103ed610c5c565b6040516103dc9190613ca1565b61041a610408366004613bfe565b600d6020526000908152604090205481565b6040519081526020016103dc565b61043b610436366004613bfe565b610cee565b6040516001600160a01b0390911681526020016103dc565b6103bb610461366004613cc9565b610d15565b6103bb610474366004613daf565b610e2f565b6103bb610487366004613bfe565b6112f9565b6103bb61049a366004613e01565b611501565b60085461041a565b6105016104b5366004613bfe565b601c6020526000908152604090208054600182015460028301546003840154600490940154929391926001600160a01b039182169291811690600160a01b90046001600160401b031686565b6040805196875260208701959095526001600160a01b039384169486019490945260608501919091521660808301526001600160401b031660a082015260c0016103dc565b6103bb610554366004613e9d565b6115c4565b6103bb610567366004613ef8565b611807565b6103bb611838565b6103bb610582366004613bfe565b611867565b61043b7f000000000000000000000000000000000000000000000000000000000000000081565b61041a6105bc366004613cc9565b611b27565b6103bb6105cf366004613bfe565b611bbd565b6103bb6105e2366004613ef8565b611bca565b6103bb6105f5366004613bfe565b611be5565b610650610608366004613bfe565b601e6020526000908152604090208054600182015460029092015490916001600160a01b03808216926001600160401b03600160a01b93849004811693928216929091041685565b604080519586526001600160a01b0394851660208701526001600160401b03938416908601529216606084015216608082015260a0016103dc565b6103bb610699366004613bfe565b611cae565b61041a6106ac366004613bfe565b611d01565b6014546103d09060ff1681565b6106d16106cc366004613f39565b611d94565b6040516103dc9190613f56565b6103bb6106ec366004613ff1565b611f35565b6103bb6106ff366004613e9d565b611f49565b61043b610712366004613bfe565b61214d565b61041a610725366004613f39565b6121ad565b6103bb612233565b6019546103d09060ff1681565b61077a61074d366004613bfe565b601b602052600090815260409020546001600160a01b03811690600160a01b90046001600160401b031682565b604080516001600160a01b0390931683526001600160401b039091166020830152016103dc565b6103bb6107af366004613bfe565b612245565b600a546001600160a01b031661043b565b61041a6107d3366004613bfe565b612349565b6103bb6107e6366004613bfe565b612377565b6103bb6107f9366004614039565b61246d565b6103ed612488565b6103bb610814366004614056565b612497565b6103bb610827366004613f39565b6124a2565b6103bb61083a366004614039565b6124cc565b6103bb61084d366004614039565b6124e7565b61043b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6103bb61087b36600461408f565b612502565b6106d161088e36600461410e565b61253a565b61043b6108a1366004613bfe565b6126ad565b6108ae612708565b6040516103dc9190614142565b6103ed6108c9366004613bfe565b61272d565b6103d06108dc366004613bfe565b600c6020526000908152604090205460ff1681565b6103bb6108ff366004613ff1565b612834565b6103bb610912366004614173565b612848565b6103bb610925366004613bfe565b6128d0565b6012546103d09060ff1681565b6103d0610945366004613bfe565b600e6020526000908152604090205460ff1681565b6103d0610968366004613f39565b601a6020526000908152604090205460ff1681565b61041a601d5481565b61041a60185481565b6103d061099d3660046141b1565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6103bb6109d9366004613ff1565b612b97565b6103bb6109ec366004613f39565b612bab565b6109f9612c21565b610a01612c7b565b600080600f546001610a1391906141f5565b90505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a989190614208565b8111158015610aa65750825a115b15610c225760405163555ec78b60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063555ec78b90602401602060405180830381865afa158015610b10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b349190614221565b60ff16600103610c1a57600f8190556040516331a9108f60e11b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636352211e90602401602060405180830381865afa158015610ba8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bcc9190614244565b9150610beb82610bdb60085490565b610be69060016141f5565b612cd4565b6001600c6000610bfa60085490565b81526020810191909152604001600020805460ff19169115159190911790555b600101610a16565b5050610c2e6001600b55565b50565b60006001600160e01b03198216632b424ad760e21b1480610c565750610c5682612cee565b92915050565b606060008054610c6b90614261565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9790614261565b8015610ce45780601f10610cb957610100808354040283529160200191610ce4565b820191906000526020600020905b815481529060010190602001808311610cc757829003601f168201915b5050505050905090565b6000610cf982612d13565b506000908152600460205260409020546001600160a01b031690565b6000610d208261214d565b9050806001600160a01b0316836001600160a01b031603610d925760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610dae5750610dae813361099d565b610e205760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610d89565b610e2a8383612d72565b505050565b610e37612c7b565b61108481610e4460085490565b610e4e91906141f5565b11158015610e71575061118881610e6460085490565b610e6e91906141f5565b11155b610ebd5760405162461bcd60e51b815260206004820152601e60248201527f474f44533a20537570706c7920776f756c6420626520657863656564656400006044820152606401610d89565b636388dd90421015610f115760405162461bcd60e51b815260206004820152601a60248201527f474f44533a204d696e7420686173206e6f7420737461727465640000000000006044820152606401610d89565b601154421115610f635760405162461bcd60e51b815260206004820152601760248201527f474f44533a204d696e74206861732066696e69736865640000000000000000006044820152606401610d89565b60125460ff16610fac5760405162461bcd60e51b815260206004820152601460248201527311d3d114ce8814d85b19481a5cc81c185d5cd95960621b6044820152606401610d89565b6000805b83518110156111c157336001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636352211e8684815181106110045761100461429b565b60200260200101516040518263ffffffff1660e01b815260040161102a91815260200190565b602060405180830381865afa158015611047573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106b9190614244565b6001600160a01b0316146110c15760405162461bcd60e51b815260206004820152601f60248201527f474f44533a2043616c6c6572206e6f74206f776e6572206f6620746f6b656e006044820152606401610d89565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663555ec78b8583815181106111025761110261429b565b60200260200101516040518263ffffffff1660e01b815260040161112891815260200190565b602060405180830381865afa158015611145573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111699190614221565b60ff166000036111b957600e60008583815181106111895761118961429b565b60209081029190910181015182528101919091526040016000205460ff166111b9576111b66001836141f5565b91505b600101610fb0565b50818110156112125760405162461bcd60e51b815260206004820152601d60248201527f474f44533a204e6f7420656e6f756768206d696e74206162696c6974790000006044820152606401610d89565b815b80156112bf5760005b84518110156112b957600e600086838151811061123c5761123c61429b565b60209081029190910181015182528101919091526040016000205460ff166112b1576112696001836142b1565b91506001600e60008784815181106112835761128361429b565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055505b60010161121d565b50611214565b60005b838110156112e8576112d633600854610bdb565b806112e0816142c4565b9150506112c2565b5050506112f56001600b55565b5050565b611301612c21565b611309612c7b565b600080601054600161131b91906141f5565b90505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561137c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a09190614208565b81111580156113ae5750825a115b15610c225760405163555ec78b60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063555ec78b90602401602060405180830381865afa158015611418573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143c9190614221565b60ff166001036114f95760108190556040516331a9108f60e11b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636352211e90602401602060405180830381865afa1580156114b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d49190614244565b915060005b60048110156114f7576114ef83610bdb60085490565b6001016114d9565b505b60010161131e565b611509612c21565b60005b828110156115705781601a600086868581811061152b5761152b61429b565b90506020020160208101906115409190613f39565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905560010161150c565b5073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2600052601a6020527f146de4131afcb204954dd72d0d4833e886cd7bb9ae4d89ce45e979d90af2c9d65460ff161515600114610e2a57610e2a6142dd565b60195460ff166115e65760405162461bcd60e51b8152600401610d89906142f3565b6115ef85612d13565b6001600160a01b0381166000908152601a602052604090205460ff166116525760405162461bcd60e51b815260206004820152601860248201527723a7a2299d102ab73932b1b7b3b734b9b2b2103a37b5b2b760411b6044820152606401610d89565b61165b8561214d565b6001600160a01b0316336001600160a01b0316146116b25760405162461bcd60e51b815260206004820152601460248201527311d3d114ce88139bdd08105d5d1a1bdc9a5cd95960621b6044820152606401610d89565b6000858152601b60205260409020546001600160a01b031615806116f457506000858152601b602052604090205442600160a01b9091046001600160401b0316105b6117105760405162461bcd60e51b8152600401610d8990614328565b6040518060a001604052808381526020016117283390565b6001600160a01b0390811682526001600160401b0387811660208085019190915285831660408086019190915288831660609586015260008b8152601e83528190208651815591860151600183018054888401519287166001600160e01b031991821617600160a01b93871684021790915595870151600290930180546080909801519390951696909516959095179116909202919091179055517f42ace40e3037b2aee9817523cd2d9f78d8d970ff4f312efcd0ce62bb8155c8ef906117f89087908790879087908790614358565b60405180910390a15050505050565b6118113382612de0565b61182d5760405162461bcd60e51b8152600401610d8990614390565b610e2a838383612e5f565b611840612c21565b61186547611856600a546001600160a01b031690565b6001600160a01b031690613015565b565b60195460ff166118895760405162461bcd60e51b8152600401610d89906142f3565b611891612c7b565b6000818152601c6020908152604091829020825160c0810184528154815260018201549281019290925260028101546001600160a01b039081169383019390935260038101546060830152600401549182166080820152600160a01b9091046001600160401b031660a0820152336001600160a01b0316611915826000015161214d565b6001600160a01b03161461196b5760405162461bcd60e51b815260206004820152601d60248201527f474f44533a2043616c6c6572206973206e6f7420746865206f776e65720000006044820152606401610d89565b80516000908152601b60205260409020546001600160a01b031615806119b1575080516000908152601b602052604090205442600160a01b9091046001600160401b0316105b6119cd5760405162461bcd60e51b8152600401610d8990614328565b4281606001511015611a155760405162461bcd60e51b815260206004820152601160248201527011d3d114ce88109a5908195e1c1a5c9959607a1b6044820152606401610d89565b6000828152601c6020908152604082206003019190915581015160185415611adf5760006103e86018546103e8611a4c91906142b1565b611a5690846143dd565b611a60919061440a565b905060006103e860185484611a7591906143dd565b611a7f919061440a565b9050611aac8460400151611a96866000015161214d565b60808701516001600160a01b031691908561312e565b8015611ad85760408401516017546080860151611ad8926001600160a01b03918216929091168461312e565b5050611b0a565b611b0a8260400151611af4846000015161214d565b60808501516001600160a01b031691908461312e565b610c22826000015183604001518460a0015142610912919061441e565b6000611b32836121ad565b8210611b945760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610d89565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b611bc5612c21565b601155565b610e2a83838360405180602001604052806000815250612502565b611bee81612d13565b611bf78161214d565b6001600160a01b0316336001600160a01b031614611c4e5760405162461bcd60e51b815260206004820152601460248201527311d3d114ce88139bdd08105d5d1a1bdc9a5cd95960621b6044820152606401610d89565b6000818152601e602052604090819020600101805467ffffffffffffffff60a01b19169055517fba0cfc80212aa6a8565e0a9ad22bc7d9b199899af209dedb6cef0df681077ea490611ca39083815260200190565b60405180910390a150565b611cb6612c21565b6103e88110611cfc5760405162461bcd60e51b815260206004820152601260248201527108e9e88a674408ccaca40e8dede40d0d2ced60731b6044820152606401610d89565b601855565b6000611d0c60085490565b8210611d6f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610d89565b60088281548110611d8257611d8261429b565b90600052602060002001549050919050565b6040516370a0823160e01b81526001600160a01b0382811660048301526060916000917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611e00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e249190614208565b90506000816001600160401b03811115611e4057611e40613cf5565b604051908082528060200260200182016040528015611e69578160200160208202803683370190505b50905060005b82811015611f2d57604051632f745c5960e01b81526001600160a01b038681166004830152602482018390527f00000000000000000000000000000000000000000000000000000000000000001690632f745c5990604401602060405180830381865afa158015611ee4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f089190614208565b828281518110611f1a57611f1a61429b565b6020908102919091010152600101611e6f565b509392505050565b611f3d612c21565b60156112f5828261448c565b60195460ff16611f6b5760405162461bcd60e51b8152600401610d89906142f3565b611f7485612d13565b6001600160a01b0381166000908152601a602052604090205460ff16611fd75760405162461bcd60e51b815260206004820152601860248201527723a7a2299d102ab73932b1b7b3b734b9b2b2103a37b5b2b760411b6044820152606401610d89565b42846001600160401b031610156120275760405162461bcd60e51b8152602060048201526014602482015273474f44533a20496e76616c69642065787069727960601b6044820152606401610d89565b601d8054906000612037836142c4565b91905055506040518060c0016040528086815260200183815260200161205a3390565b6001600160a01b0390811682526001600160401b03878116602080850191909152858316604080860191909152888316606095860152601d80546000908152601c845282902087518155928701516001840155868201516002840180546001600160a01b03191691871691909117905594860151600383015560808601516004909201805460a090970151929094166001600160e01b031990961695909517600160a01b91909216021790555490517f77052b2367afdecb08333686669392683def2caf5e5d8a8d56a22dd073262aec9061213e9088908890889088908890614358565b60405180910390a25050505050565b6000818152600260205260408120546001600160a01b031680610c565760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610d89565b60006001600160a01b0382166122175760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610d89565b506001600160a01b031660009081526003602052604090205490565b61223b612c21565b6118656000613188565b6000818152601c60205260409020600201546001600160a01b0316336001600160a01b0316146122ae5760405162461bcd60e51b815260206004820152601460248201527311d3d114ce88139bdd08185d5d1a1bdc9a5cd95960621b6044820152606401610d89565b6000818152601c60205260409020600301544210156123035760405162461bcd60e51b815260206004820152601160248201527011d3d114ce88109a5908195e1c1a5c9959607a1b6044820152606401610d89565b6000818152601c602052604080822060030191909155517f69ab749e4aaa54cb895bf6b476d031e7eb383e9f296e97f0329f74b066e3298190611ca39083815260200190565b600061235482612d13565b506000908152601b6020526040902054600160a01b90046001600160401b031690565b61237f612c21565b612387612c7b565b6011544210156123d95760405162461bcd60e51b815260206004820152601b60248201527f474f44533a2053616c6520686173206e6f742066696e697368656400000000006044820152606401610d89565b6017546001600160a01b03166124275760405162461bcd60e51b8152602060048201526013602482015272474f44533a20546f206164647265737328302960681b6044820152606401610d89565b61118861243360085490565b111580156124405750805a115b156124635760175461245e906001600160a01b0316610bdb60085490565b612427565b610c2e6001600b55565b612475612c21565b6014805460ff1916911515919091179055565b606060018054610c6b90614261565b6112f53383836131da565b6124aa612c21565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6124d4612c21565b6012805460ff1916911515919091179055565b6124ef612c21565b6019805460ff1916911515919091179055565b61250c3383612de0565b6125285760405162461bcd60e51b8152600401610d8990614390565b612534848484846132a9565b50505050565b6060600082516001600160401b0381111561255757612557613cf5565b604051908082528060200260200182016040528015612580578160200160208202803683370190505b50905060005b83518110156126a6577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663555ec78b8583815181106125d0576125d061429b565b60200260200101516040518263ffffffff1660e01b81526004016125f691815260200190565b602060405180830381865afa158015612613573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126379190614221565b60ff161580156126785750600e60008583815181106126585761265861429b565b60209081029190910181015182528101919091526040016000205460ff16155b1561269e5760018282815181106126915761269161429b565b6020026020010181815250505b600101612586565b5092915050565b60006126b882612d13565b6000828152601b602052604090205442600160a01b9091046001600160401b0316106126fa57506000908152601b60205260409020546001600160a01b031690565b610c568261214d565b919050565b612710613be0565b5060408051808201909152636388dd908152601154602082015290565b606061273882612d13565b60145460ff16156127a25760006015805461275290614261565b90501161276e5760405180602001604052806000815250610c56565b6015612779836132dc565b601660405160200161278d939291906145be565b60405160208183030381529060405292915050565b601380546127af90614261565b80601f01602080910402602001604051908101604052809291908181526020018280546127db90614261565b80156128285780601f106127fd57610100808354040283529160200191612828565b820191906000526020600020905b81548152906001019060200180831161280b57829003601f168201915b50505050509050919050565b61283c612c21565b60166112f5828261448c565b60195460ff1661286a5760405162461bcd60e51b8152600401610d89906142f3565b6128738361214d565b6001600160a01b0316336001600160a01b0316146128c55760405162461bcd60e51b815260206004820152600f60248201526e23a7a2299d102737ba1037bbb732b960891b6044820152606401610d89565b610e2a8383836133dc565b60195460ff166128f25760405162461bcd60e51b8152600401610d89906142f3565b6128fa612c7b565b61290381612d13565b61290c8161214d565b6001600160a01b031633036129635760405162461bcd60e51b815260206004820152601b60248201527f474f44533a2043616e6e6f742072656e74206f776e20746f6b656e00000000006044820152606401610d89565b6000818152601e60205260409020600101546001600160a01b03166129878261214d565b6001600160a01b0316146129dd5760405162461bcd60e51b815260206004820152601860248201527f474f44533a204c656e6465722063616e6e6f742072656e7400000000000000006044820152606401610d89565b6000818152601e602052604090206001015442600160a01b9091046001600160401b03161015612a455760405162461bcd60e51b815260206004820152601360248201527211d3d114ce8813d999995c88195e1c1a5c9959606a1b6044820152606401610d89565b6000818152601e6020526040902060018101805467ffffffffffffffff60a01b191690555460185415612b265760006103e86018546103e8612a8791906142b1565b612a9190846143dd565b612a9b919061440a565b905060006103e860185484612ab091906143dd565b612aba919061440a565b9050612aec33612ac98661214d565b6000878152601e60205260409020600201546001600160a01b031691908561312e565b8015612b1f57612b1f336017546000878152601e60205260409020600201546001600160a01b039081169291168461312e565b5050612b56565b612b5633612b338461214d565b6000858152601e60205260409020600201546001600160a01b031691908461312e565b612b8c82336000858152601e6020526040902060020154612b8790600160a01b90046001600160401b0316426141f5565b6133dc565b50610c2e6001600b55565b612b9f612c21565b60136112f5828261448c565b612bb3612c21565b6001600160a01b038116612c185760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d89565b610c2e81613188565b600a546001600160a01b031633146118655760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d89565b6002600b5403612ccd5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610d89565b6002600b55565b6112f58282604051806020016040528060008152506134d1565b60006001600160e01b0319821663780e9d6360e01b1480610c565750610c5682613504565b6000818152600260205260409020546001600160a01b0316610c2e5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610d89565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612da78261214d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080612dec8361214d565b9050806001600160a01b0316846001600160a01b03161480612e3357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80612e575750836001600160a01b0316612e4c84610cee565b6001600160a01b0316145b949350505050565b826001600160a01b0316612e728261214d565b6001600160a01b031614612ed65760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610d89565b6001600160a01b038216612f385760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610d89565b612f43838383613554565b600081815260046020908152604080832080546001600160a01b03191690556001600160a01b038616835260039091528120805460019290612f869084906142b1565b90915550506001600160a01b0382166000908152600360205260408120805460019290612fb49084906141f5565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b804710156130655760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610d89565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146130b2576040519150601f19603f3d011682016040523d82523d6000602084013e6130b7565b606091505b5050905080610e2a5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610d89565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261253490859061360c565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03160361323b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610d89565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191015b60405180910390a3505050565b6132b4848484612e5f565b6132c0848484846136de565b6125345760405162461bcd60e51b8152600401610d89906145e6565b6060816000036133035750506040805180820190915260018152600360fc1b602082015290565b8160005b811561332d5780613317816142c4565b91506133269050600a8361440a565b9150613307565b6000816001600160401b0381111561334757613347613cf5565b6040519080825280601f01601f191660200182016040528015613371576020820181803683370190505b5090505b8415612e57576133866001836142b1565b9150613393600a86614638565b61339e9060306141f5565b60f81b8183815181106133b3576133b361429b565b60200101906001600160f81b031916908160001a9053506133d5600a8661440a565b9450613375565b6133e583612d13565b6000838152601b60205260409020546001600160a01b0316158061342757506000838152601b602052604090205442600160a01b9091046001600160401b0316105b6134435760405162461bcd60e51b8152600401610d8990614328565b6040805180820182526001600160a01b038481168083526001600160401b03858116602080860182815260008b8152601b835288902096518754915196166001600160e01b031990911617600160a01b959093169490940291909117909355925191825285917f4e06b4e7000e659094299b3533b47b6aa8ad048e95e872d23d1f4ee55af89cfe910161329c565b6134db83836137df565b6134e860008484846136de565b610e2a5760405162461bcd60e51b8152600401610d89906145e6565b60006001600160e01b031982166380ac58cd60e01b148061353557506001600160e01b03198216635b5e139f60e01b145b80610c5657506301ffc9a760e01b6001600160e01b0319831614610c56565b6001600160a01b0383166135af576135aa81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6135d2565b816001600160a01b0316836001600160a01b0316146135d2576135d2838261392d565b6001600160a01b0382166135e957610e2a816139ca565b826001600160a01b0316826001600160a01b031614610e2a57610e2a8282613a79565b6000613661826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613abd9092919063ffffffff16565b805190915015610e2a578080602001905181019061367f919061464c565b610e2a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610d89565b60006001600160a01b0384163b156137d457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613722903390899088908890600401614669565b6020604051808303816000875af192505050801561375d575060408051601f3d908101601f1916820190925261375a918101906146a6565b60015b6137ba573d80801561378b576040519150601f19603f3d011682016040523d82523d6000602084013e613790565b606091505b5080516000036137b25760405162461bcd60e51b8152600401610d89906145e6565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612e57565b506001949350505050565b6001600160a01b0382166138355760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610d89565b6000818152600260205260409020546001600160a01b03161561389a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610d89565b6138a660008383613554565b6001600160a01b03821660009081526003602052604081208054600192906138cf9084906141f5565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161393a846121ad565b61394491906142b1565b600083815260076020526040902054909150808214613997576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906139dc906001906142b1565b60008381526009602052604081205460088054939450909284908110613a0457613a0461429b565b906000526020600020015490508060088381548110613a2557613a2561429b565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480613a5d57613a5d6146c3565b6001900381819060005260206000200160009055905550505050565b6000613a84836121ad565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6060612e57848460008585600080866001600160a01b03168587604051613ae491906146d9565b60006040518083038185875af1925050503d8060008114613b21576040519150601f19603f3d011682016040523d82523d6000602084013e613b26565b606091505b5091509150613b3787838387613b42565b979650505050505050565b60608315613bb1578251600003613baa576001600160a01b0385163b613baa5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d89565b5081612e57565b612e578383815115613bc65781518083602001fd5b8060405162461bcd60e51b8152600401610d899190613ca1565b60405180604001604052806002906020820280368337509192915050565b600060208284031215613c1057600080fd5b5035919050565b6001600160e01b031981168114610c2e57600080fd5b600060208284031215613c3f57600080fd5b8135613c4a81613c17565b9392505050565b60005b83811015613c6c578181015183820152602001613c54565b50506000910152565b60008151808452613c8d816020860160208601613c51565b601f01601f19169290920160200192915050565b602081526000613c4a6020830184613c75565b6001600160a01b0381168114610c2e57600080fd5b60008060408385031215613cdc57600080fd5b8235613ce781613cb4565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613d3357613d33613cf5565b604052919050565b600082601f830112613d4c57600080fd5b813560206001600160401b03821115613d6757613d67613cf5565b8160051b613d76828201613d0b565b9283528481018201928281019087851115613d9057600080fd5b83870192505b84831015613b3757823582529183019190830190613d96565b60008060408385031215613dc257600080fd5b82356001600160401b03811115613dd857600080fd5b613de485828601613d3b565b95602094909401359450505050565b8015158114610c2e57600080fd5b600080600060408486031215613e1657600080fd5b83356001600160401b0380821115613e2d57600080fd5b818601915086601f830112613e4157600080fd5b813581811115613e5057600080fd5b8760208260051b8501011115613e6557600080fd5b60209283019550935050840135613e7b81613df3565b809150509250925092565b80356001600160401b038116811461270357600080fd5b600080600080600060a08688031215613eb557600080fd5b85359450613ec560208701613e86565b9350613ed360408701613e86565b9250606086013591506080860135613eea81613cb4565b809150509295509295909350565b600080600060608486031215613f0d57600080fd5b8335613f1881613cb4565b92506020840135613f2881613cb4565b929592945050506040919091013590565b600060208284031215613f4b57600080fd5b8135613c4a81613cb4565b6020808252825182820181905260009190848201906040850190845b81811015613f8e57835183529284019291840191600101613f72565b50909695505050505050565b60006001600160401b03831115613fb357613fb3613cf5565b613fc6601f8401601f1916602001613d0b565b9050828152838383011115613fda57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561400357600080fd5b81356001600160401b0381111561401957600080fd5b8201601f8101841361402a57600080fd5b612e5784823560208401613f9a565b60006020828403121561404b57600080fd5b8135613c4a81613df3565b6000806040838503121561406957600080fd5b823561407481613cb4565b9150602083013561408481613df3565b809150509250929050565b600080600080608085870312156140a557600080fd5b84356140b081613cb4565b935060208501356140c081613cb4565b92506040850135915060608501356001600160401b038111156140e257600080fd5b8501601f810187136140f357600080fd5b61410287823560208401613f9a565b91505092959194509250565b60006020828403121561412057600080fd5b81356001600160401b0381111561413657600080fd5b612e5784828501613d3b565b60408101818360005b600281101561416a57815183526020928301929091019060010161414b565b50505092915050565b60008060006060848603121561418857600080fd5b83359250602084013561419a81613cb4565b91506141a860408501613e86565b90509250925092565b600080604083850312156141c457600080fd5b82356141cf81613cb4565b9150602083013561408481613cb4565b634e487b7160e01b600052601160045260246000fd5b80820180821115610c5657610c566141df565b60006020828403121561421a57600080fd5b5051919050565b60006020828403121561423357600080fd5b815160ff81168114613c4a57600080fd5b60006020828403121561425657600080fd5b8151613c4a81613cb4565b600181811c9082168061427557607f821691505b60208210810361429557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b81810381811115610c5657610c566141df565b6000600182016142d6576142d66141df565b5060010190565b634e487b7160e01b600052600160045260246000fd5b6020808252818101527f474f44533a2052656e742069732063757272656e746c792064697361626c6564604082015260600190565b60208082526016908201527511d3d114ce8810dd5c9c995b9d1b1e4814995b9d195960521b604082015260600190565b9485526001600160401b03938416602086015291909216604084015260608301919091526001600160a01b0316608082015260a00190565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b8082028115828204841417610c5657610c566141df565b634e487b7160e01b600052601260045260246000fd5b600082614419576144196143f4565b500490565b6001600160401b038181168382160190808211156126a6576126a66141df565b601f821115610e2a57600081815260208120601f850160051c810160208610156144655750805b601f850160051c820191505b8181101561448457828155600101614471565b505050505050565b81516001600160401b038111156144a5576144a5613cf5565b6144b9816144b38454614261565b8461443e565b602080601f8311600181146144ee57600084156144d65750858301515b600019600386901b1c1916600185901b178555614484565b600085815260208120601f198616915b8281101561451d578886015182559484019460019091019084016144fe565b508582101561453b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000815461455881614261565b600182811680156145705760018114614585576145b4565b60ff19841687528215158302870194506145b4565b8560005260208060002060005b858110156145ab5781548a820152908401908201614592565b50505082870194505b5050505092915050565b60006145ca828661454b565b84516145da818360208901613c51565b613b378183018661454b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082614647576146476143f4565b500690565b60006020828403121561465e57600080fd5b8151613c4a81613df3565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061469c90830184613c75565b9695505050505050565b6000602082840312156146b857600080fd5b8151613c4a81613c17565b634e487b7160e01b600052603160045260246000fd5b600082516146eb818460208701613c51565b919091019291505056fea2646970667358221220f8efd34d4bba041004d74b2d8c7d099b14338346bb061465ce04a7402b69b0e464736f6c63430008110033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000007b9e0e62e3798ffb33326421a7d203ffd60b711c0000000000000000000000000000000000000000000000000000000000000016496e66696e69476f64733a20456c64657220476f6473000000000000000000000000000000000000000000000000000000000000000000000000000000000004474f445300000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103a35760003560e01c8063736a1fdd116101e9578063c2f1f14a1161010f578063e0df7216116100ad578063e8f202981161007c578063e8f2029814610986578063e985e9c51461098f578063f2c4ce1e146109cb578063f2fde38b146109de57600080fd5b8063e0df72161461092a578063e5b9559514610937578063e744092e1461095a578063e7a7fa4c1461097d57600080fd5b8063d8c3bb5b116100e9578063d8c3bb5b146108ce578063da3ef23f146108f1578063e030565e14610904578063e05a20e71461091757600080fd5b8063c2f1f14a14610893578063c3f909d4146108a6578063c87b56dd146108bb57600080fd5b806395d89b4111610187578063aa19a7c511610156578063aa19a7c51461083f578063ad5c464814610852578063b88d4fde1461086d578063bb05d5051461088057600080fd5b806395d89b41146107fe578063a22cb46514610806578063a6f353f014610819578063a70c1dde1461082c57600080fd5b80638da5cb5b116101c35780638da5cb5b146107b45780638fc88c48146107c557806392d80ead146107d8578063940cd05b146107eb57600080fd5b8063736a1fdd146107325780637456be7d1461073f5780638bebfca9146107a157600080fd5b80632db8fadd116102ce5780634f6ccce71161026c5780635be310cc1161023b5780635be310cc146106f15780636352211e1461070457806370a0823114610717578063715018a61461072a57600080fd5b80634f6ccce71461069e57806351830227146106b1578063519dc8d2146106be57806355f804b3146106de57600080fd5b806342842e0e116102a857806342842e0e146105d457806343175240146105e7578063442e351b146105fa578063451588381461068b57600080fd5b80632db8fadd146105875780632f745c59146105ae5780633052b75e146105c157600080fd5b80630c2e2489116103465780632279bc06116103155780632279bc061461054657806323b872dd1461055957806324600fc31461056c5780632b1fd58a1461057457600080fd5b80630c2e2489146104795780630d189fcc1461048c57806318160ddd1461049f5780631f52a0d1146104a757600080fd5b80630745933b116103825780630745933b146103fa578063081812fc14610428578063095ea7b3146104535780630bd062461461046657600080fd5b8062b8b48a146103a857806301ffc9a7146103bd57806306fdde03146103e5575b600080fd5b6103bb6103b6366004613bfe565b6109f1565b005b6103d06103cb366004613c2d565b610c31565b60405190151581526020015b60405180910390f35b6103ed610c5c565b6040516103dc9190613ca1565b61041a610408366004613bfe565b600d6020526000908152604090205481565b6040519081526020016103dc565b61043b610436366004613bfe565b610cee565b6040516001600160a01b0390911681526020016103dc565b6103bb610461366004613cc9565b610d15565b6103bb610474366004613daf565b610e2f565b6103bb610487366004613bfe565b6112f9565b6103bb61049a366004613e01565b611501565b60085461041a565b6105016104b5366004613bfe565b601c6020526000908152604090208054600182015460028301546003840154600490940154929391926001600160a01b039182169291811690600160a01b90046001600160401b031686565b6040805196875260208701959095526001600160a01b039384169486019490945260608501919091521660808301526001600160401b031660a082015260c0016103dc565b6103bb610554366004613e9d565b6115c4565b6103bb610567366004613ef8565b611807565b6103bb611838565b6103bb610582366004613bfe565b611867565b61043b7f0000000000000000000000007b9e0e62e3798ffb33326421a7d203ffd60b711c81565b61041a6105bc366004613cc9565b611b27565b6103bb6105cf366004613bfe565b611bbd565b6103bb6105e2366004613ef8565b611bca565b6103bb6105f5366004613bfe565b611be5565b610650610608366004613bfe565b601e6020526000908152604090208054600182015460029092015490916001600160a01b03808216926001600160401b03600160a01b93849004811693928216929091041685565b604080519586526001600160a01b0394851660208701526001600160401b03938416908601529216606084015216608082015260a0016103dc565b6103bb610699366004613bfe565b611cae565b61041a6106ac366004613bfe565b611d01565b6014546103d09060ff1681565b6106d16106cc366004613f39565b611d94565b6040516103dc9190613f56565b6103bb6106ec366004613ff1565b611f35565b6103bb6106ff366004613e9d565b611f49565b61043b610712366004613bfe565b61214d565b61041a610725366004613f39565b6121ad565b6103bb612233565b6019546103d09060ff1681565b61077a61074d366004613bfe565b601b602052600090815260409020546001600160a01b03811690600160a01b90046001600160401b031682565b604080516001600160a01b0390931683526001600160401b039091166020830152016103dc565b6103bb6107af366004613bfe565b612245565b600a546001600160a01b031661043b565b61041a6107d3366004613bfe565b612349565b6103bb6107e6366004613bfe565b612377565b6103bb6107f9366004614039565b61246d565b6103ed612488565b6103bb610814366004614056565b612497565b6103bb610827366004613f39565b6124a2565b6103bb61083a366004614039565b6124cc565b6103bb61084d366004614039565b6124e7565b61043b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6103bb61087b36600461408f565b612502565b6106d161088e36600461410e565b61253a565b61043b6108a1366004613bfe565b6126ad565b6108ae612708565b6040516103dc9190614142565b6103ed6108c9366004613bfe565b61272d565b6103d06108dc366004613bfe565b600c6020526000908152604090205460ff1681565b6103bb6108ff366004613ff1565b612834565b6103bb610912366004614173565b612848565b6103bb610925366004613bfe565b6128d0565b6012546103d09060ff1681565b6103d0610945366004613bfe565b600e6020526000908152604090205460ff1681565b6103d0610968366004613f39565b601a6020526000908152604090205460ff1681565b61041a601d5481565b61041a60185481565b6103d061099d3660046141b1565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6103bb6109d9366004613ff1565b612b97565b6103bb6109ec366004613f39565b612bab565b6109f9612c21565b610a01612c7b565b600080600f546001610a1391906141f5565b90505b7f0000000000000000000000007b9e0e62e3798ffb33326421a7d203ffd60b711c6001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a989190614208565b8111158015610aa65750825a115b15610c225760405163555ec78b60e01b8152600481018290527f0000000000000000000000007b9e0e62e3798ffb33326421a7d203ffd60b711c6001600160a01b03169063555ec78b90602401602060405180830381865afa158015610b10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b349190614221565b60ff16600103610c1a57600f8190556040516331a9108f60e11b8152600481018290527f0000000000000000000000007b9e0e62e3798ffb33326421a7d203ffd60b711c6001600160a01b031690636352211e90602401602060405180830381865afa158015610ba8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bcc9190614244565b9150610beb82610bdb60085490565b610be69060016141f5565b612cd4565b6001600c6000610bfa60085490565b81526020810191909152604001600020805460ff19169115159190911790555b600101610a16565b5050610c2e6001600b55565b50565b60006001600160e01b03198216632b424ad760e21b1480610c565750610c5682612cee565b92915050565b606060008054610c6b90614261565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9790614261565b8015610ce45780601f10610cb957610100808354040283529160200191610ce4565b820191906000526020600020905b815481529060010190602001808311610cc757829003601f168201915b5050505050905090565b6000610cf982612d13565b506000908152600460205260409020546001600160a01b031690565b6000610d208261214d565b9050806001600160a01b0316836001600160a01b031603610d925760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610dae5750610dae813361099d565b610e205760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610d89565b610e2a8383612d72565b505050565b610e37612c7b565b61108481610e4460085490565b610e4e91906141f5565b11158015610e71575061118881610e6460085490565b610e6e91906141f5565b11155b610ebd5760405162461bcd60e51b815260206004820152601e60248201527f474f44533a20537570706c7920776f756c6420626520657863656564656400006044820152606401610d89565b636388dd90421015610f115760405162461bcd60e51b815260206004820152601a60248201527f474f44533a204d696e7420686173206e6f7420737461727465640000000000006044820152606401610d89565b601154421115610f635760405162461bcd60e51b815260206004820152601760248201527f474f44533a204d696e74206861732066696e69736865640000000000000000006044820152606401610d89565b60125460ff16610fac5760405162461bcd60e51b815260206004820152601460248201527311d3d114ce8814d85b19481a5cc81c185d5cd95960621b6044820152606401610d89565b6000805b83518110156111c157336001600160a01b03167f0000000000000000000000007b9e0e62e3798ffb33326421a7d203ffd60b711c6001600160a01b0316636352211e8684815181106110045761100461429b565b60200260200101516040518263ffffffff1660e01b815260040161102a91815260200190565b602060405180830381865afa158015611047573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106b9190614244565b6001600160a01b0316146110c15760405162461bcd60e51b815260206004820152601f60248201527f474f44533a2043616c6c6572206e6f74206f776e6572206f6620746f6b656e006044820152606401610d89565b7f0000000000000000000000007b9e0e62e3798ffb33326421a7d203ffd60b711c6001600160a01b031663555ec78b8583815181106111025761110261429b565b60200260200101516040518263ffffffff1660e01b815260040161112891815260200190565b602060405180830381865afa158015611145573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111699190614221565b60ff166000036111b957600e60008583815181106111895761118961429b565b60209081029190910181015182528101919091526040016000205460ff166111b9576111b66001836141f5565b91505b600101610fb0565b50818110156112125760405162461bcd60e51b815260206004820152601d60248201527f474f44533a204e6f7420656e6f756768206d696e74206162696c6974790000006044820152606401610d89565b815b80156112bf5760005b84518110156112b957600e600086838151811061123c5761123c61429b565b60209081029190910181015182528101919091526040016000205460ff166112b1576112696001836142b1565b91506001600e60008784815181106112835761128361429b565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055505b60010161121d565b50611214565b60005b838110156112e8576112d633600854610bdb565b806112e0816142c4565b9150506112c2565b5050506112f56001600b55565b5050565b611301612c21565b611309612c7b565b600080601054600161131b91906141f5565b90505b7f0000000000000000000000007b9e0e62e3798ffb33326421a7d203ffd60b711c6001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561137c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a09190614208565b81111580156113ae5750825a115b15610c225760405163555ec78b60e01b8152600481018290527f0000000000000000000000007b9e0e62e3798ffb33326421a7d203ffd60b711c6001600160a01b03169063555ec78b90602401602060405180830381865afa158015611418573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143c9190614221565b60ff166001036114f95760108190556040516331a9108f60e11b8152600481018290527f0000000000000000000000007b9e0e62e3798ffb33326421a7d203ffd60b711c6001600160a01b031690636352211e90602401602060405180830381865afa1580156114b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d49190614244565b915060005b60048110156114f7576114ef83610bdb60085490565b6001016114d9565b505b60010161131e565b611509612c21565b60005b828110156115705781601a600086868581811061152b5761152b61429b565b90506020020160208101906115409190613f39565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905560010161150c565b5073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2600052601a6020527f146de4131afcb204954dd72d0d4833e886cd7bb9ae4d89ce45e979d90af2c9d65460ff161515600114610e2a57610e2a6142dd565b60195460ff166115e65760405162461bcd60e51b8152600401610d89906142f3565b6115ef85612d13565b6001600160a01b0381166000908152601a602052604090205460ff166116525760405162461bcd60e51b815260206004820152601860248201527723a7a2299d102ab73932b1b7b3b734b9b2b2103a37b5b2b760411b6044820152606401610d89565b61165b8561214d565b6001600160a01b0316336001600160a01b0316146116b25760405162461bcd60e51b815260206004820152601460248201527311d3d114ce88139bdd08105d5d1a1bdc9a5cd95960621b6044820152606401610d89565b6000858152601b60205260409020546001600160a01b031615806116f457506000858152601b602052604090205442600160a01b9091046001600160401b0316105b6117105760405162461bcd60e51b8152600401610d8990614328565b6040518060a001604052808381526020016117283390565b6001600160a01b0390811682526001600160401b0387811660208085019190915285831660408086019190915288831660609586015260008b8152601e83528190208651815591860151600183018054888401519287166001600160e01b031991821617600160a01b93871684021790915595870151600290930180546080909801519390951696909516959095179116909202919091179055517f42ace40e3037b2aee9817523cd2d9f78d8d970ff4f312efcd0ce62bb8155c8ef906117f89087908790879087908790614358565b60405180910390a15050505050565b6118113382612de0565b61182d5760405162461bcd60e51b8152600401610d8990614390565b610e2a838383612e5f565b611840612c21565b61186547611856600a546001600160a01b031690565b6001600160a01b031690613015565b565b60195460ff166118895760405162461bcd60e51b8152600401610d89906142f3565b611891612c7b565b6000818152601c6020908152604091829020825160c0810184528154815260018201549281019290925260028101546001600160a01b039081169383019390935260038101546060830152600401549182166080820152600160a01b9091046001600160401b031660a0820152336001600160a01b0316611915826000015161214d565b6001600160a01b03161461196b5760405162461bcd60e51b815260206004820152601d60248201527f474f44533a2043616c6c6572206973206e6f7420746865206f776e65720000006044820152606401610d89565b80516000908152601b60205260409020546001600160a01b031615806119b1575080516000908152601b602052604090205442600160a01b9091046001600160401b0316105b6119cd5760405162461bcd60e51b8152600401610d8990614328565b4281606001511015611a155760405162461bcd60e51b815260206004820152601160248201527011d3d114ce88109a5908195e1c1a5c9959607a1b6044820152606401610d89565b6000828152601c6020908152604082206003019190915581015160185415611adf5760006103e86018546103e8611a4c91906142b1565b611a5690846143dd565b611a60919061440a565b905060006103e860185484611a7591906143dd565b611a7f919061440a565b9050611aac8460400151611a96866000015161214d565b60808701516001600160a01b031691908561312e565b8015611ad85760408401516017546080860151611ad8926001600160a01b03918216929091168461312e565b5050611b0a565b611b0a8260400151611af4846000015161214d565b60808501516001600160a01b031691908461312e565b610c22826000015183604001518460a0015142610912919061441e565b6000611b32836121ad565b8210611b945760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610d89565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b611bc5612c21565b601155565b610e2a83838360405180602001604052806000815250612502565b611bee81612d13565b611bf78161214d565b6001600160a01b0316336001600160a01b031614611c4e5760405162461bcd60e51b815260206004820152601460248201527311d3d114ce88139bdd08105d5d1a1bdc9a5cd95960621b6044820152606401610d89565b6000818152601e602052604090819020600101805467ffffffffffffffff60a01b19169055517fba0cfc80212aa6a8565e0a9ad22bc7d9b199899af209dedb6cef0df681077ea490611ca39083815260200190565b60405180910390a150565b611cb6612c21565b6103e88110611cfc5760405162461bcd60e51b815260206004820152601260248201527108e9e88a674408ccaca40e8dede40d0d2ced60731b6044820152606401610d89565b601855565b6000611d0c60085490565b8210611d6f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610d89565b60088281548110611d8257611d8261429b565b90600052602060002001549050919050565b6040516370a0823160e01b81526001600160a01b0382811660048301526060916000917f0000000000000000000000007b9e0e62e3798ffb33326421a7d203ffd60b711c16906370a0823190602401602060405180830381865afa158015611e00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e249190614208565b90506000816001600160401b03811115611e4057611e40613cf5565b604051908082528060200260200182016040528015611e69578160200160208202803683370190505b50905060005b82811015611f2d57604051632f745c5960e01b81526001600160a01b038681166004830152602482018390527f0000000000000000000000007b9e0e62e3798ffb33326421a7d203ffd60b711c1690632f745c5990604401602060405180830381865afa158015611ee4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f089190614208565b828281518110611f1a57611f1a61429b565b6020908102919091010152600101611e6f565b509392505050565b611f3d612c21565b60156112f5828261448c565b60195460ff16611f6b5760405162461bcd60e51b8152600401610d89906142f3565b611f7485612d13565b6001600160a01b0381166000908152601a602052604090205460ff16611fd75760405162461bcd60e51b815260206004820152601860248201527723a7a2299d102ab73932b1b7b3b734b9b2b2103a37b5b2b760411b6044820152606401610d89565b42846001600160401b031610156120275760405162461bcd60e51b8152602060048201526014602482015273474f44533a20496e76616c69642065787069727960601b6044820152606401610d89565b601d8054906000612037836142c4565b91905055506040518060c0016040528086815260200183815260200161205a3390565b6001600160a01b0390811682526001600160401b03878116602080850191909152858316604080860191909152888316606095860152601d80546000908152601c845282902087518155928701516001840155868201516002840180546001600160a01b03191691871691909117905594860151600383015560808601516004909201805460a090970151929094166001600160e01b031990961695909517600160a01b91909216021790555490517f77052b2367afdecb08333686669392683def2caf5e5d8a8d56a22dd073262aec9061213e9088908890889088908890614358565b60405180910390a25050505050565b6000818152600260205260408120546001600160a01b031680610c565760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610d89565b60006001600160a01b0382166122175760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610d89565b506001600160a01b031660009081526003602052604090205490565b61223b612c21565b6118656000613188565b6000818152601c60205260409020600201546001600160a01b0316336001600160a01b0316146122ae5760405162461bcd60e51b815260206004820152601460248201527311d3d114ce88139bdd08185d5d1a1bdc9a5cd95960621b6044820152606401610d89565b6000818152601c60205260409020600301544210156123035760405162461bcd60e51b815260206004820152601160248201527011d3d114ce88109a5908195e1c1a5c9959607a1b6044820152606401610d89565b6000818152601c602052604080822060030191909155517f69ab749e4aaa54cb895bf6b476d031e7eb383e9f296e97f0329f74b066e3298190611ca39083815260200190565b600061235482612d13565b506000908152601b6020526040902054600160a01b90046001600160401b031690565b61237f612c21565b612387612c7b565b6011544210156123d95760405162461bcd60e51b815260206004820152601b60248201527f474f44533a2053616c6520686173206e6f742066696e697368656400000000006044820152606401610d89565b6017546001600160a01b03166124275760405162461bcd60e51b8152602060048201526013602482015272474f44533a20546f206164647265737328302960681b6044820152606401610d89565b61118861243360085490565b111580156124405750805a115b156124635760175461245e906001600160a01b0316610bdb60085490565b612427565b610c2e6001600b55565b612475612c21565b6014805460ff1916911515919091179055565b606060018054610c6b90614261565b6112f53383836131da565b6124aa612c21565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6124d4612c21565b6012805460ff1916911515919091179055565b6124ef612c21565b6019805460ff1916911515919091179055565b61250c3383612de0565b6125285760405162461bcd60e51b8152600401610d8990614390565b612534848484846132a9565b50505050565b6060600082516001600160401b0381111561255757612557613cf5565b604051908082528060200260200182016040528015612580578160200160208202803683370190505b50905060005b83518110156126a6577f0000000000000000000000007b9e0e62e3798ffb33326421a7d203ffd60b711c6001600160a01b031663555ec78b8583815181106125d0576125d061429b565b60200260200101516040518263ffffffff1660e01b81526004016125f691815260200190565b602060405180830381865afa158015612613573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126379190614221565b60ff161580156126785750600e60008583815181106126585761265861429b565b60209081029190910181015182528101919091526040016000205460ff16155b1561269e5760018282815181106126915761269161429b565b6020026020010181815250505b600101612586565b5092915050565b60006126b882612d13565b6000828152601b602052604090205442600160a01b9091046001600160401b0316106126fa57506000908152601b60205260409020546001600160a01b031690565b610c568261214d565b919050565b612710613be0565b5060408051808201909152636388dd908152601154602082015290565b606061273882612d13565b60145460ff16156127a25760006015805461275290614261565b90501161276e5760405180602001604052806000815250610c56565b6015612779836132dc565b601660405160200161278d939291906145be565b60405160208183030381529060405292915050565b601380546127af90614261565b80601f01602080910402602001604051908101604052809291908181526020018280546127db90614261565b80156128285780601f106127fd57610100808354040283529160200191612828565b820191906000526020600020905b81548152906001019060200180831161280b57829003601f168201915b50505050509050919050565b61283c612c21565b60166112f5828261448c565b60195460ff1661286a5760405162461bcd60e51b8152600401610d89906142f3565b6128738361214d565b6001600160a01b0316336001600160a01b0316146128c55760405162461bcd60e51b815260206004820152600f60248201526e23a7a2299d102737ba1037bbb732b960891b6044820152606401610d89565b610e2a8383836133dc565b60195460ff166128f25760405162461bcd60e51b8152600401610d89906142f3565b6128fa612c7b565b61290381612d13565b61290c8161214d565b6001600160a01b031633036129635760405162461bcd60e51b815260206004820152601b60248201527f474f44533a2043616e6e6f742072656e74206f776e20746f6b656e00000000006044820152606401610d89565b6000818152601e60205260409020600101546001600160a01b03166129878261214d565b6001600160a01b0316146129dd5760405162461bcd60e51b815260206004820152601860248201527f474f44533a204c656e6465722063616e6e6f742072656e7400000000000000006044820152606401610d89565b6000818152601e602052604090206001015442600160a01b9091046001600160401b03161015612a455760405162461bcd60e51b815260206004820152601360248201527211d3d114ce8813d999995c88195e1c1a5c9959606a1b6044820152606401610d89565b6000818152601e6020526040902060018101805467ffffffffffffffff60a01b191690555460185415612b265760006103e86018546103e8612a8791906142b1565b612a9190846143dd565b612a9b919061440a565b905060006103e860185484612ab091906143dd565b612aba919061440a565b9050612aec33612ac98661214d565b6000878152601e60205260409020600201546001600160a01b031691908561312e565b8015612b1f57612b1f336017546000878152601e60205260409020600201546001600160a01b039081169291168461312e565b5050612b56565b612b5633612b338461214d565b6000858152601e60205260409020600201546001600160a01b031691908461312e565b612b8c82336000858152601e6020526040902060020154612b8790600160a01b90046001600160401b0316426141f5565b6133dc565b50610c2e6001600b55565b612b9f612c21565b60136112f5828261448c565b612bb3612c21565b6001600160a01b038116612c185760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d89565b610c2e81613188565b600a546001600160a01b031633146118655760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d89565b6002600b5403612ccd5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610d89565b6002600b55565b6112f58282604051806020016040528060008152506134d1565b60006001600160e01b0319821663780e9d6360e01b1480610c565750610c5682613504565b6000818152600260205260409020546001600160a01b0316610c2e5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610d89565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612da78261214d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080612dec8361214d565b9050806001600160a01b0316846001600160a01b03161480612e3357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80612e575750836001600160a01b0316612e4c84610cee565b6001600160a01b0316145b949350505050565b826001600160a01b0316612e728261214d565b6001600160a01b031614612ed65760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610d89565b6001600160a01b038216612f385760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610d89565b612f43838383613554565b600081815260046020908152604080832080546001600160a01b03191690556001600160a01b038616835260039091528120805460019290612f869084906142b1565b90915550506001600160a01b0382166000908152600360205260408120805460019290612fb49084906141f5565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b804710156130655760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610d89565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146130b2576040519150601f19603f3d011682016040523d82523d6000602084013e6130b7565b606091505b5050905080610e2a5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610d89565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261253490859061360c565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03160361323b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610d89565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191015b60405180910390a3505050565b6132b4848484612e5f565b6132c0848484846136de565b6125345760405162461bcd60e51b8152600401610d89906145e6565b6060816000036133035750506040805180820190915260018152600360fc1b602082015290565b8160005b811561332d5780613317816142c4565b91506133269050600a8361440a565b9150613307565b6000816001600160401b0381111561334757613347613cf5565b6040519080825280601f01601f191660200182016040528015613371576020820181803683370190505b5090505b8415612e57576133866001836142b1565b9150613393600a86614638565b61339e9060306141f5565b60f81b8183815181106133b3576133b361429b565b60200101906001600160f81b031916908160001a9053506133d5600a8661440a565b9450613375565b6133e583612d13565b6000838152601b60205260409020546001600160a01b0316158061342757506000838152601b602052604090205442600160a01b9091046001600160401b0316105b6134435760405162461bcd60e51b8152600401610d8990614328565b6040805180820182526001600160a01b038481168083526001600160401b03858116602080860182815260008b8152601b835288902096518754915196166001600160e01b031990911617600160a01b959093169490940291909117909355925191825285917f4e06b4e7000e659094299b3533b47b6aa8ad048e95e872d23d1f4ee55af89cfe910161329c565b6134db83836137df565b6134e860008484846136de565b610e2a5760405162461bcd60e51b8152600401610d89906145e6565b60006001600160e01b031982166380ac58cd60e01b148061353557506001600160e01b03198216635b5e139f60e01b145b80610c5657506301ffc9a760e01b6001600160e01b0319831614610c56565b6001600160a01b0383166135af576135aa81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6135d2565b816001600160a01b0316836001600160a01b0316146135d2576135d2838261392d565b6001600160a01b0382166135e957610e2a816139ca565b826001600160a01b0316826001600160a01b031614610e2a57610e2a8282613a79565b6000613661826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613abd9092919063ffffffff16565b805190915015610e2a578080602001905181019061367f919061464c565b610e2a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610d89565b60006001600160a01b0384163b156137d457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613722903390899088908890600401614669565b6020604051808303816000875af192505050801561375d575060408051601f3d908101601f1916820190925261375a918101906146a6565b60015b6137ba573d80801561378b576040519150601f19603f3d011682016040523d82523d6000602084013e613790565b606091505b5080516000036137b25760405162461bcd60e51b8152600401610d89906145e6565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612e57565b506001949350505050565b6001600160a01b0382166138355760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610d89565b6000818152600260205260409020546001600160a01b03161561389a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610d89565b6138a660008383613554565b6001600160a01b03821660009081526003602052604081208054600192906138cf9084906141f5565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161393a846121ad565b61394491906142b1565b600083815260076020526040902054909150808214613997576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906139dc906001906142b1565b60008381526009602052604081205460088054939450909284908110613a0457613a0461429b565b906000526020600020015490508060088381548110613a2557613a2561429b565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480613a5d57613a5d6146c3565b6001900381819060005260206000200160009055905550505050565b6000613a84836121ad565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6060612e57848460008585600080866001600160a01b03168587604051613ae491906146d9565b60006040518083038185875af1925050503d8060008114613b21576040519150601f19603f3d011682016040523d82523d6000602084013e613b26565b606091505b5091509150613b3787838387613b42565b979650505050505050565b60608315613bb1578251600003613baa576001600160a01b0385163b613baa5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d89565b5081612e57565b612e578383815115613bc65781518083602001fd5b8060405162461bcd60e51b8152600401610d899190613ca1565b60405180604001604052806002906020820280368337509192915050565b600060208284031215613c1057600080fd5b5035919050565b6001600160e01b031981168114610c2e57600080fd5b600060208284031215613c3f57600080fd5b8135613c4a81613c17565b9392505050565b60005b83811015613c6c578181015183820152602001613c54565b50506000910152565b60008151808452613c8d816020860160208601613c51565b601f01601f19169290920160200192915050565b602081526000613c4a6020830184613c75565b6001600160a01b0381168114610c2e57600080fd5b60008060408385031215613cdc57600080fd5b8235613ce781613cb4565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613d3357613d33613cf5565b604052919050565b600082601f830112613d4c57600080fd5b813560206001600160401b03821115613d6757613d67613cf5565b8160051b613d76828201613d0b565b9283528481018201928281019087851115613d9057600080fd5b83870192505b84831015613b3757823582529183019190830190613d96565b60008060408385031215613dc257600080fd5b82356001600160401b03811115613dd857600080fd5b613de485828601613d3b565b95602094909401359450505050565b8015158114610c2e57600080fd5b600080600060408486031215613e1657600080fd5b83356001600160401b0380821115613e2d57600080fd5b818601915086601f830112613e4157600080fd5b813581811115613e5057600080fd5b8760208260051b8501011115613e6557600080fd5b60209283019550935050840135613e7b81613df3565b809150509250925092565b80356001600160401b038116811461270357600080fd5b600080600080600060a08688031215613eb557600080fd5b85359450613ec560208701613e86565b9350613ed360408701613e86565b9250606086013591506080860135613eea81613cb4565b809150509295509295909350565b600080600060608486031215613f0d57600080fd5b8335613f1881613cb4565b92506020840135613f2881613cb4565b929592945050506040919091013590565b600060208284031215613f4b57600080fd5b8135613c4a81613cb4565b6020808252825182820181905260009190848201906040850190845b81811015613f8e57835183529284019291840191600101613f72565b50909695505050505050565b60006001600160401b03831115613fb357613fb3613cf5565b613fc6601f8401601f1916602001613d0b565b9050828152838383011115613fda57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561400357600080fd5b81356001600160401b0381111561401957600080fd5b8201601f8101841361402a57600080fd5b612e5784823560208401613f9a565b60006020828403121561404b57600080fd5b8135613c4a81613df3565b6000806040838503121561406957600080fd5b823561407481613cb4565b9150602083013561408481613df3565b809150509250929050565b600080600080608085870312156140a557600080fd5b84356140b081613cb4565b935060208501356140c081613cb4565b92506040850135915060608501356001600160401b038111156140e257600080fd5b8501601f810187136140f357600080fd5b61410287823560208401613f9a565b91505092959194509250565b60006020828403121561412057600080fd5b81356001600160401b0381111561413657600080fd5b612e5784828501613d3b565b60408101818360005b600281101561416a57815183526020928301929091019060010161414b565b50505092915050565b60008060006060848603121561418857600080fd5b83359250602084013561419a81613cb4565b91506141a860408501613e86565b90509250925092565b600080604083850312156141c457600080fd5b82356141cf81613cb4565b9150602083013561408481613cb4565b634e487b7160e01b600052601160045260246000fd5b80820180821115610c5657610c566141df565b60006020828403121561421a57600080fd5b5051919050565b60006020828403121561423357600080fd5b815160ff81168114613c4a57600080fd5b60006020828403121561425657600080fd5b8151613c4a81613cb4565b600181811c9082168061427557607f821691505b60208210810361429557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b81810381811115610c5657610c566141df565b6000600182016142d6576142d66141df565b5060010190565b634e487b7160e01b600052600160045260246000fd5b6020808252818101527f474f44533a2052656e742069732063757272656e746c792064697361626c6564604082015260600190565b60208082526016908201527511d3d114ce8810dd5c9c995b9d1b1e4814995b9d195960521b604082015260600190565b9485526001600160401b03938416602086015291909216604084015260608301919091526001600160a01b0316608082015260a00190565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b8082028115828204841417610c5657610c566141df565b634e487b7160e01b600052601260045260246000fd5b600082614419576144196143f4565b500490565b6001600160401b038181168382160190808211156126a6576126a66141df565b601f821115610e2a57600081815260208120601f850160051c810160208610156144655750805b601f850160051c820191505b8181101561448457828155600101614471565b505050505050565b81516001600160401b038111156144a5576144a5613cf5565b6144b9816144b38454614261565b8461443e565b602080601f8311600181146144ee57600084156144d65750858301515b600019600386901b1c1916600185901b178555614484565b600085815260208120601f198616915b8281101561451d578886015182559484019460019091019084016144fe565b508582101561453b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000815461455881614261565b600182811680156145705760018114614585576145b4565b60ff19841687528215158302870194506145b4565b8560005260208060002060005b858110156145ab5781548a820152908401908201614592565b50505082870194505b5050505092915050565b60006145ca828661454b565b84516145da818360208901613c51565b613b378183018661454b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082614647576146476143f4565b500690565b60006020828403121561465e57600080fd5b8151613c4a81613df3565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061469c90830184613c75565b9695505050505050565b6000602082840312156146b857600080fd5b8151613c4a81613c17565b634e487b7160e01b600052603160045260246000fd5b600082516146eb818460208701613c51565b919091019291505056fea2646970667358221220f8efd34d4bba041004d74b2d8c7d099b14338346bb061465ce04a7402b69b0e464736f6c63430008110033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000007b9e0e62e3798ffb33326421a7d203ffd60b711c0000000000000000000000000000000000000000000000000000000000000016496e66696e69476f64733a20456c64657220476f6473000000000000000000000000000000000000000000000000000000000000000000000000000000000004474f445300000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): InfiniGods: Elder Gods
Arg [1] : symbol_ (string): GODS
Arg [2] : _ig (address): 0x7B9e0e62e3798ffB33326421A7D203ffD60b711C

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000007b9e0e62e3798ffb33326421a7d203ffd60b711c
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000016
Arg [4] : 496e66696e69476f64733a20456c64657220476f647300000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [6] : 474f445300000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

53764:14097:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54933:587;;;;;;:::i;:::-;;:::i;:::-;;67616:242;;;;;;:::i;:::-;;:::i;:::-;;;750:14:1;;743:22;725:41;;713:2;698:18;67616:242:0;;;;;;;;22306:100;;;:::i;:::-;;;;;;;:::i;54004:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1679:25:1;;;1667:2;1652:18;54004:48:0;1533:177:1;23818:171:0;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1879:32:1;;;1861:51;;1849:2;1834:18;23818:171:0;1715:203:1;23336:416:0;;;;;;:::i;:::-;;:::i;56231:1452::-;;;;;;:::i;:::-;;:::i;55528:695::-;;;;;;:::i;:::-;;:::i;66449:317::-;;;;;;:::i;:::-;;:::i;36648:113::-;36736:10;:17;36648:113;;60343:45;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60343:45:0;;;;;;;;-1:-1:-1;;;60343:45:0;;-1:-1:-1;;;;;60343:45:0;;;;;;;5092:25:1;;;5148:2;5133:18;;5126:34;;;;-1:-1:-1;;;;;5234:15:1;;;5214:18;;;5207:43;;;;5281:2;5266:18;;5259:34;;;;5330:15;5324:3;5309:19;;5302:44;-1:-1:-1;;;;;5383:31:1;5187:3;5362:19;;5355:60;5079:3;5064:19;60343:45:0;4807:614:1;62155:736:0;;;;;;:::i;:::-;;:::i;24518:335::-;;;;;;:::i;:::-;;:::i;67496:112::-;;;:::i;65324:1086::-;;;;;;:::i;:::-;;:::i;54269:35::-;;;;;36316:256;;;;;;:::i;:::-;;:::i;58169:111::-;;;;;;:::i;:::-;;:::i;24924:185::-;;;;;;:::i;:::-;;:::i;62899:260::-;;;;;;:::i;:::-;;:::i;60597:55::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60597:55:0;;;;-1:-1:-1;;;;;;;;60597:55:0;;;;;;;;;;;;;;;;;;;;;6852:25:1;;;-1:-1:-1;;;;;6951:15:1;;;6946:2;6931:18;;6924:43;-1:-1:-1;;;;;7040:15:1;;;7020:18;;;7013:43;7092:15;;7087:2;7072:18;;7065:43;7145:15;7139:3;7124:19;;7117:44;6839:3;6824:19;60597:55:0;6597:570:1;66896:158:0;;;;;;:::i;:::-;;:::i;36838:233::-;;;;;;:::i;:::-;;:::i;54632:20::-;;;;;;;;;59329:433;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;67160:95::-;;;;;;:::i;:::-;;:::i;64355:670::-;;;;;;:::i;:::-;;:::i;22017:222::-;;;;;;:::i;:::-;;:::i;21748:207::-;;;;;;:::i;:::-;;:::i;13028:103::-;;;:::i;59873:19::-;;;;;;;;;60114:37;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;60114:37:0;;;-1:-1:-1;;;60114:37:0;;-1:-1:-1;;;;;60114:37:0;;;;;;;-1:-1:-1;;;;;9119:32:1;;;9101:51;;-1:-1:-1;;;;;9188:31:1;;;9183:2;9168:18;;9161:59;9074:18;60114:37:0;8929:297:1;65033:283:0;;;;;;:::i;:::-;;:::i;12380:87::-;12453:6;;-1:-1:-1;;;;;12453:6:0;12380:87;;61997:150;;;;;;:::i;:::-;;:::i;57691:367::-;;;;;;:::i;:::-;;:::i;58288:82::-;;;;;;:::i;:::-;;:::i;22475:104::-;;;:::i;24061:155::-;;;;;;:::i;:::-;;:::i;66774:114::-;;;;;;:::i;:::-;;:::i;58066:95::-;;;;;;:::i;:::-;;:::i;67062:90::-;;;;;;:::i;:::-;;:::i;59901:73::-;;59932:42;59901:73;;25180:322;;;;;;:::i;:::-;;:::i;58853:468::-;;;;;;:::i;:::-;;:::i;61718:271::-;;;;;;:::i;:::-;;:::i;58724:121::-;;;:::i;:::-;;;;;;;:::i;58378:338::-;;;;;;:::i;:::-;;:::i;53953:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;67263:105;;;;;;:::i;:::-;;:::i;61095:214::-;;;;;;:::i;:::-;;:::i;63167:1180::-;;;;;;:::i;:::-;;:::i;54557:30::-;;;;;;;;;54120:42;;;;;;:::i;:::-;;;;;;;;;;;;;;;;59983:46;;;;;;:::i;:::-;;;;;;;;;;;;;;;;60395:30;;;;;;59794:22;;;;;;24287:164;;;;;;:::i;:::-;-1:-1:-1;;;;;24408:25:0;;;24384:4;24408:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24287:164;67376:112;;;;;;:::i;:::-;;:::i;13286:201::-;;;;;;:::i;:::-;;:::i;54933:587::-;12266:13;:11;:13::i;:::-;51729:21:::1;:19;:21::i;:::-;55016:10:::2;55044:9:::0;55056:22:::2;;55081:1;55056:26;;;;:::i;:::-;55044:38;;55039:474;55107:10;-1:-1:-1::0;;;;;55089:41:0::2;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55084:1;:48;;:72;;;;;55148:8;55136:9;:20;55084:72;55039:474;;;55178:41;::::0;-1:-1:-1;;;55178:41:0;;::::2;::::0;::::2;1679:25:1::0;;;55190:10:0::2;-1:-1:-1::0;;;;;55178:38:0::2;::::0;::::2;::::0;1652:18:1;;55178:41:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;;55223:1;55178:46:::0;55174:266:::2;;55245:22;:26:::0;;;55295:30:::2;::::0;-1:-1:-1;;;55295:30:0;;::::2;::::0;::::2;1679:25:1::0;;;55303:10:0::2;-1:-1:-1::0;;;;;55295:27:0::2;::::0;::::2;::::0;1652:18:1;;55295:30:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55290:35;;55344:32;55354:2;55358:13;36736:10:::0;:17;;36648:113;55358:13:::2;:17;::::0;55374:1:::2;55358:17;:::i;:::-;55344:9;:32::i;:::-;55420:4;55395:7;:22;55403:13;36736:10:::0;:17;;36648:113;55403:13:::2;55395:22:::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;55395:22:0;:29;;-1:-1:-1;;55395:29:0::2;::::0;::::2;;::::0;;;::::2;::::0;;55174:266:::2;55483:3;;55039:474;;;;55005:515;51773:20:::1;51167:1:::0;52289:7;:22;52106:213;51773:20:::1;54933:587:::0;:::o;67616:242::-;67719:4;-1:-1:-1;;;;;;67756:41:0;;-1:-1:-1;;;67756:41:0;;:94;;;67814:36;67838:11;67814:23;:36::i;:::-;67736:114;67616:242;-1:-1:-1;;67616:242:0:o;22306:100::-;22360:13;22393:5;22386:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22306:100;:::o;23818:171::-;23894:7;23914:23;23929:7;23914:14;:23::i;:::-;-1:-1:-1;23957:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23957:24:0;;23818:171::o;23336:416::-;23417:13;23433:23;23448:7;23433:14;:23::i;:::-;23417:39;;23481:5;-1:-1:-1;;;;;23475:11:0;:2;-1:-1:-1;;;;;23475:11:0;;23467:57;;;;-1:-1:-1;;;23467:57:0;;13873:2:1;23467:57:0;;;13855:21:1;13912:2;13892:18;;;13885:30;13951:34;13931:18;;;13924:62;-1:-1:-1;;;14002:18:1;;;13995:31;14043:19;;23467:57:0;;;;;;;;;9371:10;-1:-1:-1;;;;;23559:21:0;;;;:62;;-1:-1:-1;23584:37:0;23601:5;9371:10;24287:164;:::i;23584:37::-;23537:173;;;;-1:-1:-1;;;23537:173:0;;14275:2:1;23537:173:0;;;14257:21:1;14314:2;14294:18;;;14287:30;14353:34;14333:18;;;14326:62;14424:31;14404:18;;;14397:59;14473:19;;23537:173:0;14073:425:1;23537:173:0;23723:21;23732:2;23736:7;23723:8;:21::i;:::-;23406:346;23336:416;;:::o;56231:1452::-;51729:21;:19;:21::i;:::-;54256:4:::1;56345:6;56329:13;36736:10:::0;:17;;36648:113;56329:13:::1;:22;;;;:::i;:::-;:34;;:74;;;;;54209:4;56383:6;56367:13;36736:10:::0;:17;;36648:113;56367:13:::1;:22;;;;:::i;:::-;:36;;56329:74;56321:117;;;::::0;-1:-1:-1;;;56321:117:0;;14705:2:1;56321:117:0::1;::::0;::::1;14687:21:1::0;14744:2;14724:18;;;14717:30;14783:32;14763:18;;;14756:60;14833:18;;56321:117:0::1;14503:354:1::0;56321:117:0::1;54449:10;56457:15;:34;;56449:73;;;::::0;-1:-1:-1;;;56449:73:0;;15064:2:1;56449:73:0::1;::::0;::::1;15046:21:1::0;15103:2;15083:18;;;15076:30;15142:28;15122:18;;;15115:56;15188:18;;56449:73:0::1;14862:350:1::0;56449:73:0::1;56560:13;;56541:15;:32;;56533:68;;;::::0;-1:-1:-1;;;56533:68:0;;15419:2:1;56533:68:0::1;::::0;::::1;15401:21:1::0;15458:2;15438:18;;;15431:30;15497:25;15477:18;;;15470:53;15540:18;;56533:68:0::1;15217:347:1::0;56533:68:0::1;56620:11;::::0;::::1;;56612:44;;;::::0;-1:-1:-1;;;56612:44:0;;15771:2:1;56612:44:0::1;::::0;::::1;15753:21:1::0;15810:2;15790:18;;;15783:30;-1:-1:-1;;;15829:18:1;;;15822:50;15889:18;;56612:44:0::1;15569:344:1::0;56612:44:0::1;56667:19;56702:9:::0;56697:425:::1;56717:8;:15;56713:1;:19;56697:425;;;9371:10:::0;-1:-1:-1;;;;;56758:56:0::1;56766:10;-1:-1:-1::0;;;;;56758:27:0::1;;56786:8;56795:1;56786:11;;;;;;;;:::i;:::-;;;;;;;56758:40;;;;;;;;;;;;;1679:25:1::0;;1667:2;1652:18;;1533:177;56758:40:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56758:56:0::1;;56750:100;;;::::0;-1:-1:-1;;;56750:100:0;;16252:2:1;56750:100:0::1;::::0;::::1;16234:21:1::0;16291:2;16271:18;;;16264:30;16330:33;16310:18;;;16303:61;16381:18;;56750:100:0::1;16050:355:1::0;56750:100:0::1;56881:10;-1:-1:-1::0;;;;;56869:38:0::1;;56908:8;56917:1;56908:11;;;;;;;;:::i;:::-;;;;;;;56869:51;;;;;;;;;;;;;1679:25:1::0;;1667:2;1652:18;;1533:177;56869:51:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;56924:1;56869:56:::0;56865:184:::1;;56951:9;:22;56961:8;56970:1;56961:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;56951:22;;;::::1;::::0;;;;;;-1:-1:-1;56951:22:0;;::::1;;56946:88;;56998:16;57013:1;56998:16:::0;::::1;:::i;:::-;;;56946:88;57092:3;;56697:425;;;;57155:6;57140:11;:21;;57132:63;;;::::0;-1:-1:-1;;;57132:63:0;;16612:2:1;57132:63:0::1;::::0;::::1;16594:21:1::0;16651:2;16631:18;;;16624:30;16690:31;16670:18;;;16663:59;16739:18;;57132:63:0::1;16410:353:1::0;57132:63:0::1;57222:6:::0;57239:324:::1;57246:9:::0;;57239:324:::1;;57277:9;57272:280;57292:8;:15;57288:1;:19;57272:280;;;57334:9;:22;57344:8;57353:1;57344:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;57334:22;;;::::1;::::0;;;;;;-1:-1:-1;57334:22:0;;::::1;;57329:134;;57381:10;57390:1;57381:10:::0;::::1;:::i;:::-;;;57439:4;57414:9;:22;57424:8;57433:1;57424:11;;;;;;;;:::i;:::-;;;;;;;57414:22;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;57329:134;57514:3;;57272:280;;;;57239:324;;;57578:9;57573:103;57593:6;57589:1;:10;57573:103;;;57622:42;9371:10:::0;36736;:17;57646:13:::1;36648:113:::0;57622:42:::1;57601:4:::0;::::1;::::0;::::1;:::i;:::-;;;;57573:103;;;;56310:1373;;51773:20:::0;51167:1;52289:7;:22;52106:213;51773:20;56231:1452;;:::o;55528:695::-;12266:13;:11;:13::i;:::-;51729:21:::1;:19;:21::i;:::-;55614:10:::2;55640:9:::0;55652:23:::2;;55678:1;55652:27;;;;:::i;:::-;55640:39;;55635:581;55704:10;-1:-1:-1::0;;;;;55686:41:0::2;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55681:1;:48;;:72;;;;;55745:8;55733:9;:20;55681:72;55635:581;;;55775:41;::::0;-1:-1:-1;;;55775:41:0;;::::2;::::0;::::2;1679:25:1::0;;;55787:10:0::2;-1:-1:-1::0;;;;;55775:38:0::2;::::0;::::2;::::0;1652:18:1;;55775:41:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;;55820:1;55775:46:::0;55771:371:::2;;55842:23;:27:::0;;;55893:30:::2;::::0;-1:-1:-1;;;55893:30:0;;::::2;::::0;::::2;1679:25:1::0;;;55901:10:0::2;-1:-1:-1::0;;;;;55893:27:0::2;::::0;::::2;::::0;1652:18:1;;55893:30:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55888:35;;55947:9;55942:185;55962:1;55958;:5;55942:185;;;55989:32;55999:2;56003:13;36736:10:::0;:17;;36648:113;55989:32:::2;56081:3;;55942:185;;;;55771:371;56185:4;;55635:581;;66449:317:::0;12266:13;:11;:13::i;:::-;66555:9:::1;66550:163;66566:20:::0;;::::1;66550:163;;;66634:5;66604:13;:27;66618:9;;66628:1;66618:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;66604:27:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;66604:27:0;:35;;-1:-1:-1;;66604:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;66683:3:0::1;66550:163;;;-1:-1:-1::0;59932:42:0::1;66730:19;::::0;:13:::1;:19;::::0;;;::::1;;:27;;:19:::0;:27:::1;66723:35;;;;:::i;62155:736::-:0;61023:7;;;;61015:52;;;;-1:-1:-1;;;61015:52:0;;;;;;;:::i;:::-;62291:24:::1;62306:8;62291:14;:24::i;:::-;-1:-1:-1::0;;;;;62334:21:0;::::1;;::::0;;;:13:::1;:21;::::0;;;;;::::1;;62326:58;;;::::0;-1:-1:-1;;;62326:58:0;;17736:2:1;62326:58:0::1;::::0;::::1;17718:21:1::0;17775:2;17755:18;;;17748:30;-1:-1:-1;;;17794:18:1;;;17787:54;17858:18;;62326:58:0::1;17534:348:1::0;62326:58:0::1;62419:17;62427:8;62419:7;:17::i;:::-;-1:-1:-1::0;;;;;62403:33:0::1;9371:10:::0;-1:-1:-1;;;;;62403:33:0::1;;62395:66;;;::::0;-1:-1:-1;;;62395:66:0;;18089:2:1;62395:66:0::1;::::0;::::1;18071:21:1::0;18128:2;18108:18;;;18101:30;-1:-1:-1;;;18147:18:1;;;18140:50;18207:18;;62395:66:0::1;17887:344:1::0;62395:66:0::1;62511:1;62480:14:::0;;;:4:::1;:14;::::0;;;;:19;-1:-1:-1;;;;;62480:19:0::1;:33:::0;;:77:::1;;-1:-1:-1::0;62517:14:0::1;::::0;;;:4:::1;:14;::::0;;;;:22;62542:15:::1;-1:-1:-1::0;;;62517:22:0;;::::1;-1:-1:-1::0;;;;;62517:22:0::1;:40;62480:77;62472:112;;;;-1:-1:-1::0;;;62472:112:0::1;;;;;;;:::i;:::-;62621:184;;;;;;;;62657:6;62621:184;;;;62686:12;9371:10:::0;;9291:98;62686:12:::1;-1:-1:-1::0;;;;;62621:184:0;;::::1;::::0;;-1:-1:-1;;;;;62621:184:0;;::::1;;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;;::::1;::::0;;;;;-1:-1:-1;62595:23:0;;;:13:::1;:23:::0;;;;;:210;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;;;62595:210:0;;;;-1:-1:-1;;;62595:210:0;;::::1;::::0;::::1;;::::0;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;;;;;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;62821:62;::::1;::::0;::::1;::::0;62595:23;;62621:184;;;;62868:6;;62621:184;;62821:62:::1;:::i;:::-;;;;;;;;62155:736:::0;;;;;:::o;24518:335::-;24713:41;9371:10;24746:7;24713:18;:41::i;:::-;24705:99;;;;-1:-1:-1;;;24705:99:0;;;;;;;:::i;:::-;24817:28;24827:4;24833:2;24837:7;24817:9;:28::i;67496:112::-;12266:13;:11;:13::i;:::-;67551:49:::1;67578:21;67559:7;12453:6:::0;;-1:-1:-1;;;;;12453:6:0;;12380:87;67559:7:::1;-1:-1:-1::0;;;;;67551:26:0::1;::::0;::::1;:49::i;:::-;67496:112::o:0;65324:1086::-;61023:7;;;;61015:52;;;;-1:-1:-1;;;61015:52:0;;;;;;;:::i;:::-;51729:21:::1;:19;:21::i;:::-;65403:19:::2;65425:15:::0;;;:8:::2;:15;::::0;;;;;;;;65403:37;;::::2;::::0;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;;;::::2;::::0;;;;::::2;::::0;::::2;::::0;-1:-1:-1;;;;;65403:37:0;;::::2;::::0;;;;;;;::::2;::::0;::::2;::::0;;;;;::::2;;::::0;;;::::2;::::0;;;;-1:-1:-1;;;65403:37:0;;::::2;-1:-1:-1::0;;;;;65403:37:0::2;::::0;;;;9371:10;-1:-1:-1;;;;;65459:36:0::2;:20;65467:3;:11;;;65459:7;:20::i;:::-;-1:-1:-1::0;;;;;65459:36:0::2;;65451:78;;;::::0;-1:-1:-1;;;65451:78:0;;19748:2:1;65451:78:0::2;::::0;::::2;19730:21:1::0;19787:2;19767:18;;;19760:30;19826:31;19806:18;;;19799:59;19875:18;;65451:78:0::2;19546:353:1::0;65451:78:0::2;65553:11:::0;;65582:1:::2;65548:17:::0;;;:4:::2;:17;::::0;;;;:22;-1:-1:-1;;;;;65548:22:0::2;:36:::0;;:83:::2;;-1:-1:-1::0;65593:11:0;;65588:17:::2;::::0;;;:4:::2;:17;::::0;;;;:25;65616:15:::2;-1:-1:-1::0;;;65588:25:0;;::::2;-1:-1:-1::0;;;;;65588:25:0::2;:43;65548:83;65540:118;;;;-1:-1:-1::0;;;65540:118:0::2;;;;;;;:::i;:::-;65691:15;65677:3;:10;;;:29;;65669:59;;;::::0;-1:-1:-1;;;65669:59:0;;20106:2:1;65669:59:0::2;::::0;::::2;20088:21:1::0;20145:2;20125:18;;;20118:30;-1:-1:-1;;;20164:18:1;;;20157:47;20221:18;;65669:59:0::2;19904:341:1::0;65669:59:0::2;65764:1;65739:15:::0;;;:8:::2;:15;::::0;;;;;;:22:::2;;:26:::0;;;;65791:9;::::2;::::0;65815:7:::2;::::0;:11;65811:511:::2;;65843:15;59862:4;65883:7;;59862:4;65869:21;;;;:::i;:::-;65861:30;::::0;:4;:30:::2;:::i;:::-;:44;;;;:::i;:::-;65843:62;;65920:18;59862:4;65949:7;;65941:4;:16;;;;:::i;:::-;:30;;;;:::i;:::-;65920:51;;65986:78;66024:3;:8;;;66034:20;66042:3;:11;;;66034:7;:20::i;:::-;65993:12;::::0;::::2;::::0;-1:-1:-1;;;;;65986:37:0::2;::::0;:78;66056:7;65986:37:::2;:78::i;:::-;66083:14:::0;;66079:124:::2;;66156:8;::::0;::::2;::::0;66166::::2;::::0;66125:12:::2;::::0;::::2;::::0;66118:69:::2;::::0;-1:-1:-1;;;;;66118:37:0;;::::2;::::0;66156:8;;66166::::2;66176:10:::0;66118:37:::2;:69::i;:::-;65828:386;;65811:511;;;66235:75;66273:3;:8;;;66283:20;66291:3;:11;;;66283:7;:20::i;:::-;66242:12;::::0;::::2;::::0;-1:-1:-1;;;;;66235:37:0::2;::::0;:75;66305:4;66235:37:::2;:75::i;:::-;66332:70;66340:3;:11;;;66353:3;:8;;;66389:3;:12;;;66370:15;66363:38;;;;:::i;36316:256::-:0;36413:7;36449:23;36466:5;36449:16;:23::i;:::-;36441:5;:31;36433:87;;;;-1:-1:-1;;;36433:87:0;;21067:2:1;36433:87:0;;;21049:21:1;21106:2;21086:18;;;21079:30;21145:34;21125:18;;;21118:62;-1:-1:-1;;;21196:18:1;;;21189:41;21247:19;;36433:87:0;20865:407:1;36433:87:0;-1:-1:-1;;;;;;36538:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;36316:256::o;58169:111::-;12266:13;:11;:13::i;:::-;58244::::1;:28:::0;58169:111::o;24924:185::-;25062:39;25079:4;25085:2;25089:7;25062:39;;;;;;;;;;;;:16;:39::i;62899:260::-;62961:24;62976:8;62961:14;:24::i;:::-;63020:17;63028:8;63020:7;:17::i;:::-;-1:-1:-1;;;;;63004:33:0;9371:10;-1:-1:-1;;;;;63004:33:0;;62996:66;;;;-1:-1:-1;;;62996:66:0;;18089:2:1;62996:66:0;;;18071:21:1;18128:2;18108:18;;;18101:30;-1:-1:-1;;;18147:18:1;;;18140:50;18207:18;;62996:66:0;17887:344:1;62996:66:0;63106:1;63073:23;;;:13;:23;;;;;;;:30;;:34;;-1:-1:-1;;;;63073:34:0;;;63123:28;;;;;63087:8;1679:25:1;;1667:2;1652:18;;1533:177;63123:28:0;;;;;;;;62899:260;:::o;66896:158::-;12266:13;:11;:13::i;:::-;59862:4:::1;66974:7;:21;66966:52;;;::::0;-1:-1:-1;;;66966:52:0;;21479:2:1;66966:52:0::1;::::0;::::1;21461:21:1::0;21518:2;21498:18;;;21491:30;-1:-1:-1;;;21537:18:1;;;21530:48;21595:18;;66966:52:0::1;21277:342:1::0;66966:52:0::1;67029:7;:17:::0;66896:158::o;36838:233::-;36913:7;36949:30;36736:10;:17;;36648:113;36949:30;36941:5;:38;36933:95;;;;-1:-1:-1;;;36933:95:0;;21826:2:1;36933:95:0;;;21808:21:1;21865:2;21845:18;;;21838:30;21904:34;21884:18;;;21877:62;-1:-1:-1;;;21955:18:1;;;21948:42;22007:19;;36933:95:0;21624:408:1;36933:95:0;37046:10;37057:5;37046:17;;;;;;;;:::i;:::-;;;;;;;;;37039:24;;36838:233;;;:::o;59329:433::-;59434:35;;-1:-1:-1;;;59434:35:0;;-1:-1:-1;;;;;1879:32:1;;;59434:35:0;;;1861:51:1;59387:16:0;;59416:15;;59442:10;59434:29;;;;1834:18:1;;59434:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59416:53;;59480:23;59520:7;-1:-1:-1;;;;;59506:22:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59506:22:0;;59480:48;;59546:6;59541:190;59562:7;59558:1;:11;59541:190;;;59599:58;;-1:-1:-1;;;59599:58:0;;-1:-1:-1;;;;;22229:32:1;;;59599:58:0;;;22211:51:1;22278:18;;;22271:34;;;59617:10:0;59599:49;;;;22184:18:1;;59599:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59587:6;59594:1;59587:9;;;;;;;;:::i;:::-;;;;;;;;;;:70;59701:3;;59541:190;;;-1:-1:-1;59748:6:0;59329:433;-1:-1:-1;;;59329:433:0:o;67160:95::-;12266:13;:11;:13::i;:::-;67231:8:::1;:16;67242:5:::0;67231:8;:16:::1;:::i;64355:670::-:0;61023:7;;;;61015:52;;;;-1:-1:-1;;;61015:52:0;;;;;;;:::i;:::-;64489:24:::1;64504:8;64489:14;:24::i;:::-;-1:-1:-1::0;;;;;64532:21:0;::::1;;::::0;;;:13:::1;:21;::::0;;;;;::::1;;64524:58;;;::::0;-1:-1:-1;;;64524:58:0;;17736:2:1;64524:58:0::1;::::0;::::1;17718:21:1::0;17775:2;17755:18;;;17748:30;-1:-1:-1;;;17794:18:1;;;17787:54;17858:18;;64524:58:0::1;17534:348:1::0;64524:58:0::1;64612:15;64601:7;-1:-1:-1::0;;;;;64601:26:0::1;;;64593:59;;;::::0;-1:-1:-1;;;64593:59:0;;24722:2:1;64593:59:0::1;::::0;::::1;24704:21:1::0;24761:2;24741:18;;;24734:30;-1:-1:-1;;;24780:18:1;;;24773:50;24840:18;;64593:59:0::1;24520:344:1::0;64593:59:0::1;64663:15;:18:::0;;;:15:::1;:18;::::0;::::1;:::i;:::-;;;;;;64720:209;;;;;;;;64753:8;64720:209;;;;64783:6;64720:209;;;;64810:12;9371:10:::0;;9291:98;64810:12:::1;-1:-1:-1::0;;;;;64720:209:0;;::::1;::::0;;-1:-1:-1;;;;;64720:209:0;;::::1;;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;;::::1;::::0;;;;;64701:15:::1;::::0;;-1:-1:-1;64692:25:0;;;:8:::1;:25:::0;;;;;:237;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;;64692:237:0::1;::::0;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;;;;64692:237:0;;;;;;;-1:-1:-1;;;64692:237:0;;;::::1;;;::::0;;64955:15;64945:72;;::::1;::::0;::::1;::::0;64972:8;;64720:209;;;;65002:6;;64720:209;;64945:72:::1;:::i;:::-;;;;;;;;64355:670:::0;;;;;:::o;22017:222::-;22089:7;22125:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22125:16:0;;22152:56;;;;-1:-1:-1;;;22152:56:0;;25071:2:1;22152:56:0;;;25053:21:1;25110:2;25090:18;;;25083:30;-1:-1:-1;;;25129:18:1;;;25122:54;25193:18;;22152:56:0;24869:348:1;21748:207:0;21820:7;-1:-1:-1;;;;;21848:19:0;;21840:73;;;;-1:-1:-1;;;21840:73:0;;25424:2:1;21840:73:0;;;25406:21:1;25463:2;25443:18;;;25436:30;25502:34;25482:18;;;25475:62;-1:-1:-1;;;25553:18:1;;;25546:39;25602:19;;21840:73:0;25222:405:1;21840:73:0;-1:-1:-1;;;;;;21931:16:0;;;;;:9;:16;;;;;;;21748:207::o;13028:103::-;12266:13;:11;:13::i;:::-;13093:30:::1;13120:1;13093:18;:30::i;65033:283::-:0;65111:15;;;;:8;:15;;;;;:20;;;-1:-1:-1;;;;;65111:20:0;9371:10;-1:-1:-1;;;;;65095:36:0;;65087:69;;;;-1:-1:-1;;;65087:69:0;;25834:2:1;65087:69:0;;;25816:21:1;25873:2;25853:18;;;25846:30;-1:-1:-1;;;25892:18:1;;;25885:50;25952:18;;65087:69:0;25632:344:1;65087:69:0;65194:15;;;;:8;:15;;;;;:22;;;65175:15;:41;;65167:71;;;;-1:-1:-1;;;65167:71:0;;20106:2:1;65167:71:0;;;20088:21:1;20145:2;20125:18;;;20118:30;-1:-1:-1;;;20164:18:1;;;20157:47;20221:18;;65167:71:0;19904:341:1;65167:71:0;65274:1;65249:15;;;:8;:15;;;;;;:22;;:26;;;;65291:17;;;;;65258:5;1679:25:1;;1667:2;1652:18;;1533:177;61997:150:0;62057:7;62077:23;62092:7;62077:14;:23::i;:::-;-1:-1:-1;62118:13:0;;;;:4;:13;;;;;:21;-1:-1:-1;;;62118:21:0;;-1:-1:-1;;;;;62118:21:0;;61997:150::o;57691:367::-;12266:13;:11;:13::i;:::-;51729:21:::1;:19;:21::i;:::-;57805:13:::2;;57786:15;:32;;57778:72;;;::::0;-1:-1:-1;;;57778:72:0;;26183:2:1;57778:72:0::2;::::0;::::2;26165:21:1::0;26222:2;26202:18;;;26195:30;26261:29;26241:18;;;26234:57;26308:18;;57778:72:0::2;25981:351:1::0;57778:72:0::2;57869:8;::::0;-1:-1:-1;;;;;57869:8:0::2;57861:54;;;::::0;-1:-1:-1;;;57861:54:0;;26539:2:1;57861:54:0::2;::::0;::::2;26521:21:1::0;26578:2;26558:18;;;26551:30;-1:-1:-1;;;26597:18:1;;;26590:49;26656:18;;57861:54:0::2;26337:343:1::0;57861:54:0::2;54209:4;57933:13;36736:10:::0;:17;;36648:113;57933:13:::2;:27;;:51;;;;;57976:8;57964:9;:20;57933:51;57926:125;;;58011:8;::::0;58001:38:::2;::::0;-1:-1:-1;;;;;58011:8:0::2;58021:13;36736:10:::0;:17;;36648:113;58001:38:::2;57926:125;;;51773:20:::1;51167:1:::0;52289:7;:22;52106:213;58288:82;12266:13;:11;:13::i;:::-;58346:8:::1;:16:::0;;-1:-1:-1;;58346:16:0::1;::::0;::::1;;::::0;;;::::1;::::0;;58288:82::o;22475:104::-;22531:13;22564:7;22557:14;;;;;:::i;24061:155::-;24156:52;9371:10;24189:8;24199;24156:18;:52::i;66774:114::-;12266:13;:11;:13::i;:::-;66857:8:::1;:23:::0;;-1:-1:-1;;;;;;66857:23:0::1;-1:-1:-1::0;;;;;66857:23:0;;;::::1;::::0;;;::::1;::::0;;66774:114::o;58066:95::-;12266:13;:11;:13::i;:::-;58134:11:::1;:19:::0;;-1:-1:-1;;58134:19:0::1;::::0;::::1;;::::0;;;::::1;::::0;;58066:95::o;67062:90::-;12266:13;:11;:13::i;:::-;67128:7:::1;:16:::0;;-1:-1:-1;;67128:16:0::1;::::0;::::1;;::::0;;;::::1;::::0;;67062:90::o;25180:322::-;25354:41;9371:10;25387:7;25354:18;:41::i;:::-;25346:99;;;;-1:-1:-1;;;25346:99:0;;;;;;;:::i;:::-;25456:38;25470:4;25476:2;25480:7;25489:4;25456:13;:38::i;:::-;25180:322;;;;:::o;58853:468::-;58926:16;58955:23;58995:9;:16;-1:-1:-1;;;;;58981:31:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58981:31:0;;58955:57;;59028:6;59023:267;59044:9;:16;59040:1;:20;59023:267;;;59094:10;-1:-1:-1;;;;;59082:38:0;;59121:9;59131:1;59121:12;;;;;;;;:::i;:::-;;;;;;;59082:52;;;;;;;;;;;;;1679:25:1;;1667:2;1652:18;;1533:177;59082:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;;:85;;;;;59144:9;:23;59154:9;59164:1;59154:12;;;;;;;;:::i;:::-;;;;;;;;;;;;59144:23;;;;;;;;;;-1:-1:-1;59144:23:0;;;;59143:24;59082:85;59078:139;;;59200:1;59188:6;59195:1;59188:9;;;;;;;;:::i;:::-;;;;;;:13;;;;;59078:139;59260:3;;59023:267;;;-1:-1:-1;59307:6:0;58853:468;-1:-1:-1;;58853:468:0:o;61718:271::-;61774:7;61794:23;61809:7;61794:14;:23::i;:::-;61832:13;;;;:4;:13;;;;;:21;61857:15;-1:-1:-1;;;61832:21:0;;;-1:-1:-1;;;;;61832:21:0;:40;61828:154;;-1:-1:-1;61896:13:0;;;;:4;:13;;;;;:18;-1:-1:-1;;;;;61896:18:0;;61718:271::o;61828:154::-;61954:16;61962:7;61954;:16::i;61828:154::-;61718:271;;;:::o;58724:121::-;58768:17;;:::i;:::-;-1:-1:-1;58798:39:0;;;;;;;;;54449:10;58798:39;;58823:13;;58798:39;;;;;58724:121::o;58378:338::-;58443:13;58469:23;58484:7;58469:14;:23::i;:::-;58507:8;;;;58503:206;;;58564:1;58545:8;58539:22;;;;;:::i;:::-;;;:26;:104;;;;;;;;;;;;;;;;;58592:8;58602:18;:7;:16;:18::i;:::-;58622:14;58575:62;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58532:111;58378:338;-1:-1:-1;;58378:338:0:o;58503:206::-;58683:14;58676:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58378:338;;;:::o;67263:105::-;12266:13;:11;:13::i;:::-;67339:14:::1;:21;67356:4:::0;67339:14;:21:::1;:::i;61095:214::-:0;61023:7;;;;61015:52;;;;-1:-1:-1;;;61015:52:0;;;;;;;:::i;:::-;61222:16:::1;61230:7;61222;:16::i;:::-;-1:-1:-1::0;;;;;61206:32:0::1;9371:10:::0;-1:-1:-1;;;;;61206:32:0::1;;61198:60;;;::::0;-1:-1:-1;;;61198:60:0;;28088:2:1;61198:60:0::1;::::0;::::1;28070:21:1::0;28127:2;28107:18;;;28100:30;-1:-1:-1;;;28146:18:1;;;28139:45;28201:18;;61198:60:0::1;27886:339:1::0;61198:60:0::1;61269:32;61278:7;61287:4;61293:7;61269:8;:32::i;63167:1180::-:0;61023:7;;;;61015:52;;;;-1:-1:-1;;;61015:52:0;;;;;;;:::i;:::-;51729:21:::1;:19;:21::i;:::-;63250:24:::2;63265:8;63250:14;:24::i;:::-;63309:17;63317:8;63309:7;:17::i;:::-;-1:-1:-1::0;;;;;63293:33:0::2;9371:10:::0;63293:33;63285:73:::2;;;::::0;-1:-1:-1;;;63285:73:0;;28432:2:1;63285:73:0::2;::::0;::::2;28414:21:1::0;28471:2;28451:18;;;28444:30;28510:29;28490:18;;;28483:57;28557:18;;63285:73:0::2;28230:351:1::0;63285:73:0::2;63398:23;::::0;;;:13:::2;:23;::::0;;;;:30:::2;;::::0;-1:-1:-1;;;;;63398:30:0::2;63377:17;63412:8:::0;63377:7:::2;:17::i;:::-;-1:-1:-1::0;;;;;63377:51:0::2;;63369:88;;;::::0;-1:-1:-1;;;63369:88:0;;28788:2:1;63369:88:0::2;::::0;::::2;28770:21:1::0;28827:2;28807:18;;;28800:30;28866:26;28846:18;;;28839:54;28910:18;;63369:88:0::2;28586:348:1::0;63369:88:0::2;63476:23;::::0;;;:13:::2;:23;::::0;;;;:30:::2;;::::0;63510:15:::2;-1:-1:-1::0;;;63476:30:0;;::::2;-1:-1:-1::0;;;;;63476:30:0::2;:49;;63468:81;;;::::0;-1:-1:-1;;;63468:81:0;;29141:2:1;63468:81:0::2;::::0;::::2;29123:21:1::0;29180:2;29160:18;;;29153:30;-1:-1:-1;;;29199:18:1;;;29192:49;29258:18;;63468:81:0::2;28939:343:1::0;63468:81:0::2;63593:1;63560:23:::0;;;:13:::2;:23;::::0;;;;:30:::2;::::0;::::2;:34:::0;;-1:-1:-1;;;;63560:34:0::2;::::0;;63620:29;63664:7:::2;::::0;:11;63660:577:::2;;63692:15;59862:4;63732:7;;59862:4;63718:21;;;;:::i;:::-;63710:30;::::0;:4;:30:::2;:::i;:::-;:44;;;;:::i;:::-;63692:62;;63769:18;59862:4;63798:7;;63790:4;:16;;;;:::i;:::-;:30;;;;:::i;:::-;63769:51:::0;-1:-1:-1;63835:99:0::2;9371:10:::0;63907:17:::2;63915:8;63907:7;:17::i;:::-;63842:23;::::0;;;:13:::2;:23;::::0;;;;:32:::2;;::::0;-1:-1:-1;;;;;63842:32:0::2;::::0;63835:99;63926:7;63835:57:::2;:99::i;:::-;63953:14:::0;;63949:148:::2;;63988:93;9371:10:::0;64060:8:::2;::::0;::::2;63995:23:::0;;;:13:::2;:23;::::0;;;;:32:::2;;::::0;-1:-1:-1;;;;;63995:32:0;;::::2;::::0;63988:93;64060:8:::2;64070:10:::0;63988:57:::2;:93::i;:::-;63677:431;;63660:577;;;64129:96;9371:10:::0;64201:17:::2;64209:8;64201:7;:17::i;:::-;64136:23;::::0;;;:13:::2;:23;::::0;;;;:32:::2;;::::0;-1:-1:-1;;;;;64136:32:0::2;::::0;64129:96;64220:4;64129:57:::2;:96::i;:::-;64247:92;64256:8:::0;9371:10;64305:23:::2;::::0;;;:13:::2;:23;::::0;;;;:32:::2;;::::0;64287:50:::2;::::0;-1:-1:-1;;;64305:32:0;::::2;-1:-1:-1::0;;;;;64305:32:0::2;64287:15;:50;:::i;:::-;64247:8;:92::i;:::-;63239:1108;51773:20:::1;51167:1:::0;52289:7;:22;52106:213;67376:112;12266:13;:11;:13::i;:::-;67456:14:::1;:24;67473:7:::0;67456:14;:24:::1;:::i;13286:201::-:0;12266:13;:11;:13::i;:::-;-1:-1:-1;;;;;13375:22:0;::::1;13367:73;;;::::0;-1:-1:-1;;;13367:73:0;;29489:2:1;13367:73:0::1;::::0;::::1;29471:21:1::0;29528:2;29508:18;;;29501:30;29567:34;29547:18;;;29540:62;-1:-1:-1;;;29618:18:1;;;29611:36;29664:19;;13367:73:0::1;29287:402:1::0;13367:73:0::1;13451:28;13470:8;13451:18;:28::i;12545:132::-:0;12453:6;;-1:-1:-1;;;;;12453:6:0;9371:10;12609:23;12601:68;;;;-1:-1:-1;;;12601:68:0;;29896:2:1;12601:68:0;;;29878:21:1;;;29915:18;;;29908:30;29974:34;29954:18;;;29947:62;30026:18;;12601:68:0;29694:356:1;51809:289:0;51211:1;51939:7;;:19;51931:63;;;;-1:-1:-1;;;51931:63:0;;30257:2:1;51931:63:0;;;30239:21:1;30296:2;30276:18;;;30269:30;30335:33;30315:18;;;30308:61;30386:18;;51931:63:0;30055:355:1;51931:63:0;51211:1;52072:7;:18;51809:289::o;27909:110::-;27985:26;27995:2;27999:7;27985:26;;;;;;;;;;;;:9;:26::i;36008:224::-;36110:4;-1:-1:-1;;;;;;36134:50:0;;-1:-1:-1;;;36134:50:0;;:90;;;36188:36;36212:11;36188:23;:36::i;31905:135::-;27074:4;27098:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27098:16:0;31979:53;;;;-1:-1:-1;;;31979:53:0;;25071:2:1;31979:53:0;;;25053:21:1;25110:2;25090:18;;;25083:30;-1:-1:-1;;;25129:18:1;;;25122:54;25193:18;;31979:53:0;24869:348:1;31184:174:0;31259:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31259:29:0;-1:-1:-1;;;;;31259:29:0;;;;;;;;:24;;31313:23;31259:24;31313:14;:23::i;:::-;-1:-1:-1;;;;;31304:46:0;;;;;;;;;;;31184:174;;:::o;27303:264::-;27396:4;27413:13;27429:23;27444:7;27429:14;:23::i;:::-;27413:39;;27482:5;-1:-1:-1;;;;;27471:16:0;:7;-1:-1:-1;;;;;27471:16:0;;:52;;;-1:-1:-1;;;;;;24408:25:0;;;24384:4;24408:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27491:32;27471:87;;;;27551:7;-1:-1:-1;;;;;27527:31:0;:20;27539:7;27527:11;:20::i;:::-;-1:-1:-1;;;;;27527:31:0;;27471:87;27463:96;27303:264;-1:-1:-1;;;;27303:264:0:o;30438:627::-;30597:4;-1:-1:-1;;;;;30570:31:0;:23;30585:7;30570:14;:23::i;:::-;-1:-1:-1;;;;;30570:31:0;;30562:81;;;;-1:-1:-1;;;30562:81:0;;30617:2:1;30562:81:0;;;30599:21:1;30656:2;30636:18;;;30629:30;30695:34;30675:18;;;30668:62;-1:-1:-1;;;30746:18:1;;;30739:35;30791:19;;30562:81:0;30415:401:1;30562:81:0;-1:-1:-1;;;;;30662:16:0;;30654:65;;;;-1:-1:-1;;;30654:65:0;;31023:2:1;30654:65:0;;;31005:21:1;31062:2;31042:18;;;31035:30;31101:34;31081:18;;;31074:62;-1:-1:-1;;;31152:18:1;;;31145:34;31196:19;;30654:65:0;30821:400:1;30654:65:0;30732:39;30753:4;30759:2;30763:7;30732:20;:39::i;:::-;30843:24;;;;:15;:24;;;;;;;;30836:31;;-1:-1:-1;;;;;;30836:31:0;;;-1:-1:-1;;;;;30880:15:0;;;;:9;:15;;;;;:20;;30836:31;;30843:24;30880:20;;30836:31;;30880:20;:::i;:::-;;;;-1:-1:-1;;;;;;;30911:13:0;;;;;;:9;:13;;;;;:18;;30928:1;;30911:13;:18;;30928:1;;30911:18;:::i;:::-;;;;-1:-1:-1;;30940:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30940:21:0;-1:-1:-1;;;;;30940:21:0;;;;;;;;;30979:27;;30940:16;;30979:27;;;;;;;23406:346;23336:416;;:::o;2324:317::-;2439:6;2414:21;:31;;2406:73;;;;-1:-1:-1;;;2406:73:0;;31428:2:1;2406:73:0;;;31410:21:1;31467:2;31447:18;;;31440:30;31506:31;31486:18;;;31479:59;31555:18;;2406:73:0;31226:353:1;2406:73:0;2493:12;2511:9;-1:-1:-1;;;;;2511:14:0;2533:6;2511:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2492:52;;;2563:7;2555:78;;;;-1:-1:-1;;;2555:78:0;;31996:2:1;2555:78:0;;;31978:21:1;32035:2;32015:18;;;32008:30;32074:34;32054:18;;;32047:62;32145:28;32125:18;;;32118:56;32191:19;;2555:78:0;31794:422:1;46756:248:0;46927:68;;;-1:-1:-1;;;;;32479:15:1;;;46927:68:0;;;32461:34:1;32531:15;;32511:18;;;32504:43;32563:18;;;;32556:34;;;46927:68:0;;;;;;;;;;32396:18:1;;;;46927:68:0;;;;;;;;-1:-1:-1;;;;;46927:68:0;-1:-1:-1;;;46927:68:0;;;46900:96;;46920:5;;46900:19;:96::i;13647:191::-;13740:6;;;-1:-1:-1;;;;;13757:17:0;;;-1:-1:-1;;;;;;13757:17:0;;;;;;;13790:40;;13740:6;;;13757:17;13740:6;;13790:40;;13721:16;;13790:40;13710:128;13647:191;:::o;31501:315::-;31656:8;-1:-1:-1;;;;;31647:17:0;:5;-1:-1:-1;;;;;31647:17:0;;31639:55;;;;-1:-1:-1;;;31639:55:0;;32803:2:1;31639:55:0;;;32785:21:1;32842:2;32822:18;;;32815:30;32881:27;32861:18;;;32854:55;32926:18;;31639:55:0;32601:349:1;31639:55:0;-1:-1:-1;;;;;31705:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;31705:46:0;;;;;;;;;;31767:41;;725::1;;;31767::0;;698:18:1;31767:41:0;;;;;;;;31501:315;;;:::o;26383:313::-;26539:28;26549:4;26555:2;26559:7;26539:9;:28::i;:::-;26586:47;26609:4;26615:2;26619:7;26628:4;26586:22;:47::i;:::-;26578:110;;;;-1:-1:-1;;;26578:110:0;;;;;;;:::i;9743:723::-;9799:13;10020:5;10029:1;10020:10;10016:53;;-1:-1:-1;;10047:10:0;;;;;;;;;;;;-1:-1:-1;;;10047:10:0;;;;;9743:723::o;10016:53::-;10094:5;10079:12;10135:78;10142:9;;10135:78;;10168:8;;;;:::i;:::-;;-1:-1:-1;10191:10:0;;-1:-1:-1;10199:2:0;10191:10;;:::i;:::-;;;10135:78;;;10223:19;10255:6;-1:-1:-1;;;;;10245:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10245:17:0;;10223:39;;10273:154;10280:10;;10273:154;;10307:11;10317:1;10307:11;;:::i;:::-;;-1:-1:-1;10376:10:0;10384:2;10376:5;:10;:::i;:::-;10363:24;;:2;:24;:::i;:::-;10350:39;;10333:6;10340;10333:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;10333:56:0;;;;;;;;-1:-1:-1;10404:11:0;10413:2;10404:11;;:::i;:::-;;;10273:154;;61317:393;61404:23;61419:7;61404:14;:23::i;:::-;61476:1;61446:13;;;:4;:13;;;;;:18;-1:-1:-1;;;;;61446:18:0;:32;;:75;;-1:-1:-1;61482:13:0;;;;:4;:13;;;;;:21;61506:15;-1:-1:-1;;;61482:21:0;;;-1:-1:-1;;;;;61482:21:0;:39;61446:75;61438:110;;;;-1:-1:-1;;;61438:110:0;;;;;;;:::i;:::-;61575:75;;;;;;;;-1:-1:-1;;;;;61575:75:0;;;;;;-1:-1:-1;;;;;61575:75:0;;;;;;;;;;-1:-1:-1;61559:13:0;;;:4;:13;;;;;:91;;;;;;;;-1:-1:-1;;;;;;61559:91:0;;;;-1:-1:-1;;;61559:91:0;;;;;;;;;;;;;;;61666:36;;33635:50:1;;;61559:13:0;;61666:36;;33608:18:1;61666:36:0;33491:200:1;28246:319:0;28375:18;28381:2;28385:7;28375:5;:18::i;:::-;28426:53;28457:1;28461:2;28465:7;28474:4;28426:22;:53::i;:::-;28404:153;;;;-1:-1:-1;;;28404:153:0;;;;;;;:::i;21379:305::-;21481:4;-1:-1:-1;;;;;;21518:40:0;;-1:-1:-1;;;21518:40:0;;:105;;-1:-1:-1;;;;;;;21575:48:0;;-1:-1:-1;;;21575:48:0;21518:105;:158;;;-1:-1:-1;;;;;;;;;;14522:40:0;;;21640:36;14413:157;37684:589;-1:-1:-1;;;;;37890:18:0;;37886:187;;37925:40;37957:7;39100:10;:17;;39073:24;;;;:15;:24;;;;;:44;;;39128:24;;;;;;;;;;;;38996:164;37925:40;37886:187;;;37995:2;-1:-1:-1;;;;;37987:10:0;:4;-1:-1:-1;;;;;37987:10:0;;37983:90;;38014:47;38047:4;38053:7;38014:32;:47::i;:::-;-1:-1:-1;;;;;38087:16:0;;38083:183;;38120:45;38157:7;38120:36;:45::i;38083:183::-;38193:4;-1:-1:-1;;;;;38187:10:0;:2;-1:-1:-1;;;;;38187:10:0;;38183:83;;38214:40;38242:2;38246:7;38214:27;:40::i;49604:716::-;50028:23;50054:69;50082:4;50054:69;;;;;;;;;;;;;;;;;50062:5;-1:-1:-1;;;;;50054:27:0;;;:69;;;;;:::i;:::-;50138:17;;50028:95;;-1:-1:-1;50138:21:0;50134:179;;50235:10;50224:30;;;;;;;;;;;;:::i;:::-;50216:85;;;;-1:-1:-1;;;50216:85:0;;34148:2:1;50216:85:0;;;34130:21:1;34187:2;34167:18;;;34160:30;34226:34;34206:18;;;34199:62;-1:-1:-1;;;34277:18:1;;;34270:40;34327:19;;50216:85:0;33946:406:1;32604:853:0;32758:4;-1:-1:-1;;;;;32779:13:0;;1358:19;:23;32775:675;;32815:71;;-1:-1:-1;;;32815:71:0;;-1:-1:-1;;;;;32815:36:0;;;;;:71;;9371:10;;32866:4;;32872:7;;32881:4;;32815:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32815:71:0;;;;;;;;-1:-1:-1;;32815:71:0;;;;;;;;;;;;:::i;:::-;;;32811:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33056:6;:13;33073:1;33056:18;33052:328;;33099:60;;-1:-1:-1;;;33099:60:0;;;;;;;:::i;33052:328::-;33330:6;33324:13;33315:6;33311:2;33307:15;33300:38;32811:584;-1:-1:-1;;;;;;32937:51:0;-1:-1:-1;;;32937:51:0;;-1:-1:-1;32930:58:0;;32775:675;-1:-1:-1;33434:4:0;32604:853;;;;;;:::o;28901:439::-;-1:-1:-1;;;;;28981:16:0;;28973:61;;;;-1:-1:-1;;;28973:61:0;;35307:2:1;28973:61:0;;;35289:21:1;;;35326:18;;;35319:30;35385:34;35365:18;;;35358:62;35437:18;;28973:61:0;35105:356:1;28973:61:0;27074:4;27098:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27098:16:0;:30;29045:58;;;;-1:-1:-1;;;29045:58:0;;35668:2:1;29045:58:0;;;35650:21:1;35707:2;35687:18;;;35680:30;35746;35726:18;;;35719:58;35794:18;;29045:58:0;35466:352:1;29045:58:0;29116:45;29145:1;29149:2;29153:7;29116:20;:45::i;:::-;-1:-1:-1;;;;;29174:13:0;;;;;;:9;:13;;;;;:18;;29191:1;;29174:13;:18;;29191:1;;29174:18;:::i;:::-;;;;-1:-1:-1;;29203:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29203:21:0;-1:-1:-1;;;;;29203:21:0;;;;;;;;29242:33;;29203:16;;;29242:33;;29203:16;;29242:33;56231:1452;;:::o;39787:988::-;40053:22;40103:1;40078:22;40095:4;40078:16;:22::i;:::-;:26;;;;:::i;:::-;40115:18;40136:26;;;:17;:26;;;;;;40053:51;;-1:-1:-1;40269:28:0;;;40265:328;;-1:-1:-1;;;;;40336:18:0;;40314:19;40336:18;;;:12;:18;;;;;;;;:34;;;;;;;;;40387:30;;;;;;:44;;;40504:30;;:17;:30;;;;;:43;;;40265:328;-1:-1:-1;40689:26:0;;;;:17;:26;;;;;;;;40682:33;;;-1:-1:-1;;;;;40733:18:0;;;;;:12;:18;;;;;:34;;;;;;;40726:41;39787:988::o;41070:1079::-;41348:10;:17;41323:22;;41348:21;;41368:1;;41348:21;:::i;:::-;41380:18;41401:24;;;:15;:24;;;;;;41774:10;:26;;41323:46;;-1:-1:-1;41401:24:0;;41323:46;;41774:26;;;;;;:::i;:::-;;;;;;;;;41752:48;;41838:11;41813:10;41824;41813:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;41918:28;;;:15;:28;;;;;;;:41;;;42090:24;;;;;42083:31;42125:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;41141:1008;;;41070:1079;:::o;38574:221::-;38659:14;38676:20;38693:2;38676:16;:20::i;:::-;-1:-1:-1;;;;;38707:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;38752:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;38574:221:0:o;3820:229::-;3957:12;3989:52;4011:6;4019:4;4025:1;4028:12;3957;5228;5242:23;5269:6;-1:-1:-1;;;;;5269:11:0;5288:5;5295:4;5269:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5227:73;;;;5318:69;5345:6;5353:7;5362:10;5374:12;5318:26;:69::i;:::-;5311:76;4940:455;-1:-1:-1;;;;;;;4940:455:0:o;7513:644::-;7698:12;7727:7;7723:427;;;7755:10;:17;7776:1;7755:22;7751:290;;-1:-1:-1;;;;;1358:19:0;;;7965:60;;;;-1:-1:-1;;;7965:60:0;;36856:2:1;7965:60:0;;;36838:21:1;36895:2;36875:18;;;36868:30;36934:31;36914:18;;;36907:59;36983:18;;7965:60:0;36654:353:1;7965:60:0;-1:-1:-1;8062:10:0;8055:17;;7723:427;8105:33;8113:10;8125:12;8860:17;;:21;8856:388;;9092:10;9086:17;9149:15;9136:10;9132:2;9128:19;9121:44;8856:388;9219:12;9212:20;;-1:-1:-1;;;9212:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;199:131::-;-1:-1:-1;;;;;;273:32:1;;263:43;;253:71;;320:1;317;310:12;335:245;393:6;446:2;434:9;425:7;421:23;417:32;414:52;;;462:1;459;452:12;414:52;501:9;488:23;520:30;544:5;520:30;:::i;:::-;569:5;335:245;-1:-1:-1;;;335:245:1:o;777:250::-;862:1;872:113;886:6;883:1;880:13;872:113;;;962:11;;;956:18;943:11;;;936:39;908:2;901:10;872:113;;;-1:-1:-1;;1019:1:1;1001:16;;994:27;777:250::o;1032:271::-;1074:3;1112:5;1106:12;1139:6;1134:3;1127:19;1155:76;1224:6;1217:4;1212:3;1208:14;1201:4;1194:5;1190:16;1155:76;:::i;:::-;1285:2;1264:15;-1:-1:-1;;1260:29:1;1251:39;;;;1292:4;1247:50;;1032:271;-1:-1:-1;;1032:271:1:o;1308:220::-;1457:2;1446:9;1439:21;1420:4;1477:45;1518:2;1507:9;1503:18;1495:6;1477:45;:::i;1923:131::-;-1:-1:-1;;;;;1998:31:1;;1988:42;;1978:70;;2044:1;2041;2034:12;2059:315;2127:6;2135;2188:2;2176:9;2167:7;2163:23;2159:32;2156:52;;;2204:1;2201;2194:12;2156:52;2243:9;2230:23;2262:31;2287:5;2262:31;:::i;:::-;2312:5;2364:2;2349:18;;;;2336:32;;-1:-1:-1;;;2059:315:1:o;2379:127::-;2440:10;2435:3;2431:20;2428:1;2421:31;2471:4;2468:1;2461:15;2495:4;2492:1;2485:15;2511:275;2582:2;2576:9;2647:2;2628:13;;-1:-1:-1;;2624:27:1;2612:40;;-1:-1:-1;;;;;2667:34:1;;2703:22;;;2664:62;2661:88;;;2729:18;;:::i;:::-;2765:2;2758:22;2511:275;;-1:-1:-1;2511:275:1:o;2791:712::-;2845:5;2898:3;2891:4;2883:6;2879:17;2875:27;2865:55;;2916:1;2913;2906:12;2865:55;2952:6;2939:20;2978:4;-1:-1:-1;;;;;2997:2:1;2994:26;2991:52;;;3023:18;;:::i;:::-;3069:2;3066:1;3062:10;3092:28;3116:2;3112;3108:11;3092:28;:::i;:::-;3154:15;;;3224;;;3220:24;;;3185:12;;;;3256:15;;;3253:35;;;3284:1;3281;3274:12;3253:35;3320:2;3312:6;3308:15;3297:26;;3332:142;3348:6;3343:3;3340:15;3332:142;;;3414:17;;3402:30;;3365:12;;;;3452;;;;3332:142;;3508:416;3601:6;3609;3662:2;3650:9;3641:7;3637:23;3633:32;3630:52;;;3678:1;3675;3668:12;3630:52;3718:9;3705:23;-1:-1:-1;;;;;3743:6:1;3740:30;3737:50;;;3783:1;3780;3773:12;3737:50;3806:61;3859:7;3850:6;3839:9;3835:22;3806:61;:::i;:::-;3796:71;3914:2;3899:18;;;;3886:32;;-1:-1:-1;;;;3508:416:1:o;3929:118::-;4015:5;4008:13;4001:21;3994:5;3991:32;3981:60;;4037:1;4034;4027:12;4052:750;4144:6;4152;4160;4213:2;4201:9;4192:7;4188:23;4184:32;4181:52;;;4229:1;4226;4219:12;4181:52;4269:9;4256:23;-1:-1:-1;;;;;4339:2:1;4331:6;4328:14;4325:34;;;4355:1;4352;4345:12;4325:34;4393:6;4382:9;4378:22;4368:32;;4438:7;4431:4;4427:2;4423:13;4419:27;4409:55;;4460:1;4457;4450:12;4409:55;4500:2;4487:16;4526:2;4518:6;4515:14;4512:34;;;4542:1;4539;4532:12;4512:34;4597:7;4590:4;4580:6;4577:1;4573:14;4569:2;4565:23;4561:34;4558:47;4555:67;;;4618:1;4615;4608:12;4555:67;4649:4;4641:13;;;;-1:-1:-1;4673:6:1;-1:-1:-1;;4714:20:1;;4701:34;4744:28;4701:34;4744:28;:::i;:::-;4791:5;4781:15;;;4052:750;;;;;:::o;5426:171::-;5493:20;;-1:-1:-1;;;;;5542:30:1;;5532:41;;5522:69;;5587:1;5584;5577:12;5602:529;5695:6;5703;5711;5719;5727;5780:3;5768:9;5759:7;5755:23;5751:33;5748:53;;;5797:1;5794;5787:12;5748:53;5833:9;5820:23;5810:33;;5862:37;5895:2;5884:9;5880:18;5862:37;:::i;:::-;5852:47;;5918:37;5951:2;5940:9;5936:18;5918:37;:::i;:::-;5908:47;;6002:2;5991:9;5987:18;5974:32;5964:42;;6056:3;6045:9;6041:19;6028:33;6070:31;6095:5;6070:31;:::i;:::-;6120:5;6110:15;;;5602:529;;;;;;;;:::o;6136:456::-;6213:6;6221;6229;6282:2;6270:9;6261:7;6257:23;6253:32;6250:52;;;6298:1;6295;6288:12;6250:52;6337:9;6324:23;6356:31;6381:5;6356:31;:::i;:::-;6406:5;-1:-1:-1;6463:2:1;6448:18;;6435:32;6476:33;6435:32;6476:33;:::i;:::-;6136:456;;6528:7;;-1:-1:-1;;;6582:2:1;6567:18;;;;6554:32;;6136:456::o;7172:247::-;7231:6;7284:2;7272:9;7263:7;7259:23;7255:32;7252:52;;;7300:1;7297;7290:12;7252:52;7339:9;7326:23;7358:31;7383:5;7358:31;:::i;7424:632::-;7595:2;7647:21;;;7717:13;;7620:18;;;7739:22;;;7566:4;;7595:2;7818:15;;;;7792:2;7777:18;;;7566:4;7861:169;7875:6;7872:1;7869:13;7861:169;;;7936:13;;7924:26;;8005:15;;;;7970:12;;;;7897:1;7890:9;7861:169;;;-1:-1:-1;8047:3:1;;7424:632;-1:-1:-1;;;;;;7424:632:1:o;8061:407::-;8126:5;-1:-1:-1;;;;;8152:6:1;8149:30;8146:56;;;8182:18;;:::i;:::-;8220:57;8265:2;8244:15;;-1:-1:-1;;8240:29:1;8271:4;8236:40;8220:57;:::i;:::-;8211:66;;8300:6;8293:5;8286:21;8340:3;8331:6;8326:3;8322:16;8319:25;8316:45;;;8357:1;8354;8347:12;8316:45;8406:6;8401:3;8394:4;8387:5;8383:16;8370:43;8460:1;8453:4;8444:6;8437:5;8433:18;8429:29;8422:40;8061:407;;;;;:::o;8473:451::-;8542:6;8595:2;8583:9;8574:7;8570:23;8566:32;8563:52;;;8611:1;8608;8601:12;8563:52;8651:9;8638:23;-1:-1:-1;;;;;8676:6:1;8673:30;8670:50;;;8716:1;8713;8706:12;8670:50;8739:22;;8792:4;8784:13;;8780:27;-1:-1:-1;8770:55:1;;8821:1;8818;8811:12;8770:55;8844:74;8910:7;8905:2;8892:16;8887:2;8883;8879:11;8844:74;:::i;9231:241::-;9287:6;9340:2;9328:9;9319:7;9315:23;9311:32;9308:52;;;9356:1;9353;9346:12;9308:52;9395:9;9382:23;9414:28;9436:5;9414:28;:::i;9477:382::-;9542:6;9550;9603:2;9591:9;9582:7;9578:23;9574:32;9571:52;;;9619:1;9616;9609:12;9571:52;9658:9;9645:23;9677:31;9702:5;9677:31;:::i;:::-;9727:5;-1:-1:-1;9784:2:1;9769:18;;9756:32;9797:30;9756:32;9797:30;:::i;:::-;9846:7;9836:17;;;9477:382;;;;;:::o;9864:795::-;9959:6;9967;9975;9983;10036:3;10024:9;10015:7;10011:23;10007:33;10004:53;;;10053:1;10050;10043:12;10004:53;10092:9;10079:23;10111:31;10136:5;10111:31;:::i;:::-;10161:5;-1:-1:-1;10218:2:1;10203:18;;10190:32;10231:33;10190:32;10231:33;:::i;:::-;10283:7;-1:-1:-1;10337:2:1;10322:18;;10309:32;;-1:-1:-1;10392:2:1;10377:18;;10364:32;-1:-1:-1;;;;;10408:30:1;;10405:50;;;10451:1;10448;10441:12;10405:50;10474:22;;10527:4;10519:13;;10515:27;-1:-1:-1;10505:55:1;;10556:1;10553;10546:12;10505:55;10579:74;10645:7;10640:2;10627:16;10622:2;10618;10614:11;10579:74;:::i;:::-;10569:84;;;9864:795;;;;;;;:::o;10664:348::-;10748:6;10801:2;10789:9;10780:7;10776:23;10772:32;10769:52;;;10817:1;10814;10807:12;10769:52;10857:9;10844:23;-1:-1:-1;;;;;10882:6:1;10879:30;10876:50;;;10922:1;10919;10912:12;10876:50;10945:61;10998:7;10989:6;10978:9;10974:22;10945:61;:::i;11017:494::-;11197:2;11182:18;;11186:9;11277:6;11155:4;11311:194;11325:4;11322:1;11319:11;11311:194;;;11384:13;;11372:26;;11421:4;11445:12;;;;11480:15;;;;11345:1;11338:9;11311:194;;;11315:3;;;11017:494;;;;:::o;11516:387::-;11592:6;11600;11608;11661:2;11649:9;11640:7;11636:23;11632:32;11629:52;;;11677:1;11674;11667:12;11629:52;11713:9;11700:23;11690:33;;11773:2;11762:9;11758:18;11745:32;11786:31;11811:5;11786:31;:::i;:::-;11836:5;-1:-1:-1;11860:37:1;11893:2;11878:18;;11860:37;:::i;:::-;11850:47;;11516:387;;;;;:::o;11908:388::-;11976:6;11984;12037:2;12025:9;12016:7;12012:23;12008:32;12005:52;;;12053:1;12050;12043:12;12005:52;12092:9;12079:23;12111:31;12136:5;12111:31;:::i;:::-;12161:5;-1:-1:-1;12218:2:1;12203:18;;12190:32;12231:33;12190:32;12231:33;:::i;12301:127::-;12362:10;12357:3;12353:20;12350:1;12343:31;12393:4;12390:1;12383:15;12417:4;12414:1;12407:15;12433:125;12498:9;;;12519:10;;;12516:36;;;12532:18;;:::i;12563:184::-;12633:6;12686:2;12674:9;12665:7;12661:23;12657:32;12654:52;;;12702:1;12699;12692:12;12654:52;-1:-1:-1;12725:16:1;;12563:184;-1:-1:-1;12563:184:1:o;12752:273::-;12820:6;12873:2;12861:9;12852:7;12848:23;12844:32;12841:52;;;12889:1;12886;12879:12;12841:52;12921:9;12915:16;12971:4;12964:5;12960:16;12953:5;12950:27;12940:55;;12991:1;12988;12981:12;13030:251;13100:6;13153:2;13141:9;13132:7;13128:23;13124:32;13121:52;;;13169:1;13166;13159:12;13121:52;13201:9;13195:16;13220:31;13245:5;13220:31;:::i;13286:380::-;13365:1;13361:12;;;;13408;;;13429:61;;13483:4;13475:6;13471:17;13461:27;;13429:61;13536:2;13528:6;13525:14;13505:18;13502:38;13499:161;;13582:10;13577:3;13573:20;13570:1;13563:31;13617:4;13614:1;13607:15;13645:4;13642:1;13635:15;13499:161;;13286:380;;;:::o;15918:127::-;15979:10;15974:3;15970:20;15967:1;15960:31;16010:4;16007:1;16000:15;16034:4;16031:1;16024:15;16768:128;16835:9;;;16856:11;;;16853:37;;;16870:18;;:::i;16901:135::-;16940:3;16961:17;;;16958:43;;16981:18;;:::i;:::-;-1:-1:-1;17028:1:1;17017:13;;16901:135::o;17041:127::-;17102:10;17097:3;17093:20;17090:1;17083:31;17133:4;17130:1;17123:15;17157:4;17154:1;17147:15;17173:356;17375:2;17357:21;;;17394:18;;;17387:30;17453:34;17448:2;17433:18;;17426:62;17520:2;17505:18;;17173:356::o;18236:346::-;18438:2;18420:21;;;18477:2;18457:18;;;18450:30;-1:-1:-1;;;18511:2:1;18496:18;;18489:52;18573:2;18558:18;;18236:346::o;18587:540::-;18842:25;;;-1:-1:-1;;;;;18940:15:1;;;18935:2;18920:18;;18913:43;18992:15;;;;18987:2;18972:18;;18965:43;19039:2;19024:18;;19017:34;;;;-1:-1:-1;;;;;19088:32:1;19082:3;19067:19;;19060:61;18829:3;18814:19;;18587:540::o;19132:409::-;19334:2;19316:21;;;19373:2;19353:18;;;19346:30;19412:34;19407:2;19392:18;;19385:62;-1:-1:-1;;;19478:2:1;19463:18;;19456:43;19531:3;19516:19;;19132:409::o;20250:168::-;20323:9;;;20354;;20371:15;;;20365:22;;20351:37;20341:71;;20392:18;;:::i;20423:127::-;20484:10;20479:3;20475:20;20472:1;20465:31;20515:4;20512:1;20505:15;20539:4;20536:1;20529:15;20555:120;20595:1;20621;20611:35;;20626:18;;:::i;:::-;-1:-1:-1;20660:9:1;;20555:120::o;20680:180::-;-1:-1:-1;;;;;20785:10:1;;;20797;;;20781:27;;20820:11;;;20817:37;;;20834:18;;:::i;22442:545::-;22544:2;22539:3;22536:11;22533:448;;;22580:1;22605:5;22601:2;22594:17;22650:4;22646:2;22636:19;22720:2;22708:10;22704:19;22701:1;22697:27;22691:4;22687:38;22756:4;22744:10;22741:20;22738:47;;;-1:-1:-1;22779:4:1;22738:47;22834:2;22829:3;22825:12;22822:1;22818:20;22812:4;22808:31;22798:41;;22889:82;22907:2;22900:5;22897:13;22889:82;;;22952:17;;;22933:1;22922:13;22889:82;;;22893:3;;;22442:545;;;:::o;23163:1352::-;23289:3;23283:10;-1:-1:-1;;;;;23308:6:1;23305:30;23302:56;;;23338:18;;:::i;:::-;23367:97;23457:6;23417:38;23449:4;23443:11;23417:38;:::i;:::-;23411:4;23367:97;:::i;:::-;23519:4;;23583:2;23572:14;;23600:1;23595:663;;;;24302:1;24319:6;24316:89;;;-1:-1:-1;24371:19:1;;;24365:26;24316:89;-1:-1:-1;;23120:1:1;23116:11;;;23112:24;23108:29;23098:40;23144:1;23140:11;;;23095:57;24418:81;;23565:944;;23595:663;22389:1;22382:14;;;22426:4;22413:18;;-1:-1:-1;;23631:20:1;;;23749:236;23763:7;23760:1;23757:14;23749:236;;;23852:19;;;23846:26;23831:42;;23944:27;;;;23912:1;23900:14;;;;23779:19;;23749:236;;;23753:3;24013:6;24004:7;24001:19;23998:201;;;24074:19;;;24068:26;-1:-1:-1;;24157:1:1;24153:14;;;24169:3;24149:24;24145:37;24141:42;24126:58;24111:74;;23998:201;-1:-1:-1;;;;;24245:1:1;24229:14;;;24225:22;24212:36;;-1:-1:-1;23163:1352:1:o;26685:722::-;26735:3;26776:5;26770:12;26805:36;26831:9;26805:36;:::i;:::-;26860:1;26877:18;;;26904:133;;;;27051:1;27046:355;;;;26870:531;;26904:133;-1:-1:-1;;26937:24:1;;26925:37;;27010:14;;27003:22;26991:35;;26982:45;;;-1:-1:-1;26904:133:1;;27046:355;27077:5;27074:1;27067:16;27106:4;27151:2;27148:1;27138:16;27176:1;27190:165;27204:6;27201:1;27198:13;27190:165;;;27282:14;;27269:11;;;27262:35;27325:16;;;;27219:10;;27190:165;;;27194:3;;;27384:6;27379:3;27375:16;27368:23;;26870:531;;;;;26685:722;;;;:::o;27412:469::-;27633:3;27661:38;27695:3;27687:6;27661:38;:::i;:::-;27728:6;27722:13;27744:65;27802:6;27798:2;27791:4;27783:6;27779:17;27744:65;:::i;:::-;27825:50;27867:6;27863:2;27859:15;27851:6;27825:50;:::i;32955:414::-;33157:2;33139:21;;;33196:2;33176:18;;;33169:30;33235:34;33230:2;33215:18;;33208:62;-1:-1:-1;;;33301:2:1;33286:18;;33279:48;33359:3;33344:19;;32955:414::o;33374:112::-;33406:1;33432;33422:35;;33437:18;;:::i;:::-;-1:-1:-1;33471:9:1;;33374:112::o;33696:245::-;33763:6;33816:2;33804:9;33795:7;33791:23;33787:32;33784:52;;;33832:1;33829;33822:12;33784:52;33864:9;33858:16;33883:28;33905:5;33883:28;:::i;34357:489::-;-1:-1:-1;;;;;34626:15:1;;;34608:34;;34678:15;;34673:2;34658:18;;34651:43;34725:2;34710:18;;34703:34;;;34773:3;34768:2;34753:18;;34746:31;;;34551:4;;34794:46;;34820:19;;34812:6;34794:46;:::i;:::-;34786:54;34357:489;-1:-1:-1;;;;;;34357:489:1:o;34851:249::-;34920:6;34973:2;34961:9;34952:7;34948:23;34944:32;34941:52;;;34989:1;34986;34979:12;34941:52;35021:9;35015:16;35040:30;35064:5;35040:30;:::i;35823:127::-;35884:10;35879:3;35875:20;35872:1;35865:31;35915:4;35912:1;35905:15;35939:4;35936:1;35929:15;36362:287;36491:3;36529:6;36523:13;36545:66;36604:6;36599:3;36592:4;36584:6;36580:17;36545:66;:::i;:::-;36627:16;;;;;36362:287;-1:-1:-1;;36362:287:1:o

Swarm Source

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