ETH Price: $1,716.57 (+1.94%)
Gas: 20 Gwei
 

Overview

Max Total Supply

777 GSYNC

Holders

170

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The 777 Genesis Syncronauts are the Bravest souls in the metaverse https://syncronauts.io/ The syncronauts.io DAO is looking for experienced NFT enthusiasts that want to shape the NFT space. We aim to create solutions for a truly decentralized NFT space for the community by t...

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
GNAUTS

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 777 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-31
*/

/*
β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•—   β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ•—   β–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—  β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ•—   β–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ•—   β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—
β–ˆβ–ˆβ•”β•β•β•β•β•β•šβ–ˆβ–ˆβ•— β–ˆβ–ˆβ•”β•β–ˆβ–ˆβ–ˆβ–ˆβ•—  β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β•β•β•β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ•—  β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘β•šβ•β•β–ˆβ–ˆβ•”β•β•β•β–ˆβ–ˆβ•”β•β•β•β•β•
β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β•šβ–ˆβ–ˆβ–ˆβ–ˆβ•”β• β–ˆβ–ˆβ•”β–ˆβ–ˆβ•— β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘     β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β–ˆβ–ˆβ•— β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—
β•šβ•β•β•β•β–ˆβ–ˆβ•‘  β•šβ–ˆβ–ˆβ•”β•  β–ˆβ–ˆβ•‘β•šβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘     β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘β•šβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘   β•šβ•β•β•β•β–ˆβ–ˆβ•‘
β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘ β•šβ–ˆβ–ˆβ–ˆβ–ˆβ•‘β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘  β–ˆβ–ˆβ•‘β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ•‘ β•šβ–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘  β–ˆβ–ˆβ•‘β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•   β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘
β•šβ•β•β•β•β•β•β•   β•šβ•β•   β•šβ•β•  β•šβ•β•β•β• β•šβ•β•β•β•β•β•β•šβ•β•  β•šβ•β• β•šβ•β•β•β•β•β• β•šβ•β•  β•šβ•β•β•β•β•šβ•β•  β•šβ•β• β•šβ•β•β•β•β•β•    β•šβ•β•   β•šβ•β•β•β•β•β•β•  DAO */
// SPDX-License-Identifier: GPL-3.0

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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
pragma solidity ^0.8.0;
/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

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

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

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

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


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

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

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


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

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



pragma solidity ^0.8.0;

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {


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

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

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

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



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;

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

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

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


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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @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 of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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



pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
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();
    }
}


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

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

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

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


pragma solidity >=0.7.0 <0.9.0;

contract GNAUTS is ERC721Enumerable, Ownable {
  using Strings for uint256;

  string public baseURI;
  string public baseExtension = ".json";
  string public notRevealedUri;
  uint256 public cost = 0.25 ether;
  uint256 public maxSupply = 777;
  uint256 public maxMintAmount = 2;
  uint256 public nftPerAddressLimit = 2;
  bool public paused = true;
  bool public revealed = false;
  bool public onlyWhitelisted = true;
  address[] public whitelistedAddresses;
  mapping(address => uint256) public addressMintedBalance;

  //PROVENANCE

  string public PROVENANCE = "";
  uint256 public startingIndexBlock;
  uint256 public startingIndex;

  // NAMES
  event Named(uint256 indexed index, string name);
  mapping(uint256 => string) private _tokenNames;
  mapping(string => bool) private _namesUsed;

  constructor(
    string memory _name,
    string memory _symbol,
    string memory _initBaseURI,
    string memory _initNotRevealedUri
  ) ERC721(_name, _symbol) {
    setBaseURI(_initBaseURI);
    setNotRevealedURI(_initNotRevealedUri);
  }

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

  // public
  function mint(uint256 _mintAmount) public payable {
    require(!paused, "the contract is paused");
    uint256 supply = totalSupply();
    require(_mintAmount > 0, "need to mint at least 1 NFT");
    require(_mintAmount <= maxMintAmount, "max mint amount per session exceeded");
    require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded");

    if (msg.sender != owner()) {
        if(onlyWhitelisted == true) {
            require(isWhitelisted(msg.sender), "user is not whitelisted");
            uint256 ownerMintedCount = addressMintedBalance[msg.sender];
            require(ownerMintedCount + _mintAmount <= nftPerAddressLimit, "max NFT per address exceeded");
        }
        require(msg.value >= cost * _mintAmount, "insufficient funds");
    }

    for (uint256 i = 1; i <= _mintAmount; i++) {
      addressMintedBalance[msg.sender]++;
      _safeMint(msg.sender, supply + i);
    }


    // If we haven't set the starting index and this is either 1) the last saleable token or 2) the contract is not revealed for the first time
    if (startingIndexBlock == 0 && (totalSupply() == maxSupply)) {
            startingIndexBlock = block.number;
    }
  }

  function isWhitelisted(address _user) public view returns (bool) {
    for (uint i = 0; i < whitelistedAddresses.length; i++) {
      if (whitelistedAddresses[i] == _user) {
          return true;
      }
    }
    return false;
  }

  function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory tokenIds = new uint256[](ownerTokenCount);
    for (uint256 i; i < ownerTokenCount; i++) {
      tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
    }
    return tokenIds;
  }

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

    if(revealed == false) {
        return notRevealedUri;
    }

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

    /**
     * Set the starting index for the collection
     */
    function setStartingIndex() public {
        require(startingIndex == 0, "Starting index is already set");
        require(startingIndexBlock != 0, "Starting index block must be set");

        startingIndex = uint(blockhash(startingIndexBlock)) % maxSupply;
        // Just a sanity case in the worst case if this function is called late (EVM only stores last 256 block hashes)
        if (block.number - startingIndexBlock > 255) {
            startingIndex = uint(blockhash(block.number - 1)) % maxSupply;
        }
        // Prevent default sequence
        if (startingIndex == 0) {
            startingIndex = startingIndex + 1;
        }
    }

    /**
     * Set the starting index block for the collection, essentially unblocking
     * setting starting index
     */
    function emergencySetStartingIndexBlock() public onlyOwner {
        require(startingIndex == 0, "Starting index is already set");

        startingIndexBlock = block.number;
    }

/*
    -------------------------------------
    NAMING
    -------------------------------------
    */
    function setName(uint256 tokenId, string memory name) public {
        require(revealed, "Collection hasnt been revealed yet!");
        address owner = ownerOf(tokenId);
        require(msg.sender == owner, "Address is not the owner of NFT!");
        require(validateName(name) == true, "Name is not valid!");
        require(isNameUsed(name) == false, "This name is already being used.");
        if (bytes(_tokenNames[tokenId]).length > 0) {
            _namesUsed[toLower(_tokenNames[tokenId])] = false;
        }
        _namesUsed[toLower(name)] = true;
        _tokenNames[tokenId] = name;
        emit Named(tokenId, name);
    }

    function tokenNameByIndex(uint256 index)
        public
        view
        returns (string memory)
    {
        return _tokenNames[index];
    }

    function isNameUsed(string memory nameString) public view returns (bool) {
        return _namesUsed[toLower(nameString)];
    }

    function validateName(string memory str) public pure returns (bool) {
        bytes memory b = bytes(str);
        if (b.length < 3) return false;
        if (b.length > 32) return false;
        if (b[0] == 0x20) return false;
        if (b[b.length - 1] == 0x20) return false;
        bytes1 lastChar = b[0];
        for (uint256 i; i < b.length; i++) {
            bytes1 char = b[i];
            if (char == 0x20 && lastChar == 0x20) return false;
            if (
                !(char >= 0x41 && char <= 0x5A) &&
                !(char >= 0x61 && char <= 0x7A) &&
                !(char == 0x20)
            ) return false;
            lastChar = char;
        }
        return true;
    }

    function toLower(string memory str) public pure returns (string memory) {
        bytes memory bStr = bytes(str);
        bytes memory bLower = new bytes(bStr.length);
        for (uint256 i = 0; i < bStr.length; i++) {
            if ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90)) {
                bLower[i] = bytes1(uint8(bStr[i]) + 32);
            } else {
                bLower[i] = bStr[i];
            }
        }
        return string(bLower);
    }


    /*
    -------------------------------------
    ONLY OWNER
    -------------------------------------
    */
  function reveal() public onlyOwner {
      revealed = true;
  }

      /*
    * Set provenance once it's calculated
    */
  function setProvenanceHash(string memory provenanceHash) public onlyOwner {
    PROVENANCE = provenanceHash;
  }

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

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

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

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

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

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

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

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

  function whitelistUsers(address[] calldata _users) public onlyOwner {
    delete whitelistedAddresses;
    whitelistedAddresses = _users;
  }

  function withdraw() public payable onlyOwner {
    // This will pay devs % of the initial sale.
    // =============================================================================
    uint256 addressOneAmt = address(this).balance * 15 / 100;
    uint256 addressTwoAmt = address(this).balance * 5 / 100;

    // =============================================================================
    (bool hs, ) = payable(0x14AB4457bfA3AA1057fdee9687c60A108e6F5aC1).call{value: addressOneAmt}("");
    require(hs);
    // =============================================================================

    (bool fs, ) = payable(0x30909DA8B6ae3afA42fEf31AaCd0c6b5F12E898C).call{value: addressTwoAmt}("");
    require(fs);

    // This will payout the SYNCRONAUT DAO GNOSIS SAFE the remainder of the contract balance.
    // =============================================================================
    (bool os, ) = payable(0x375b2E5ffc8bC5db38e8F2B3CdECF8341F58bf2B).call{value: address(this).balance}("");
    require(os);
    // =============================================================================
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"Named","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencySetStartingIndexBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nameString","type":"string"}],"name":"isNameUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"name","type":"string"}],"name":"setName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startingIndexBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"toLower","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenNameByIndex","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"string","name":"str","type":"string"}],"name":"validateName","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

Contract Creation Code

60c06040526005608081905264173539b7b760d91b60a09081526200002891600c91906200022c565b506703782dace9d90000600e55610309600f55600260108190556011556012805462ffffff19166201000117905560408051602081019182905260009081905262000076916015916200022c565b503480156200008457600080fd5b5060405162003dfe38038062003dfe833981016040819052620000a79162000389565b835184908490620000c09060009060208501906200022c565b508051620000d69060019060208401906200022c565b505050620000f3620000ed6200011360201b60201c565b62000117565b620000fe8262000169565b6200010981620001d1565b5050505062000495565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a546001600160a01b03163314620001b85760405162461bcd60e51b8152602060048201819052602482015260008051602062003dde83398151915260448201526064015b60405180910390fd5b8051620001cd90600b9060208401906200022c565b5050565b600a546001600160a01b031633146200021c5760405162461bcd60e51b8152602060048201819052602482015260008051602062003dde8339815191526044820152606401620001af565b8051620001cd90600d9060208401905b8280546200023a9062000442565b90600052602060002090601f0160209004810192826200025e5760008555620002a9565b82601f106200027957805160ff1916838001178555620002a9565b82800160010185558215620002a9579182015b82811115620002a95782518255916020019190600101906200028c565b50620002b7929150620002bb565b5090565b5b80821115620002b75760008155600101620002bc565b600082601f830112620002e457600080fd5b81516001600160401b03808211156200030157620003016200047f565b604051601f8301601f19908116603f011681019082821181831017156200032c576200032c6200047f565b816040528381526020925086838588010111156200034957600080fd5b600091505b838210156200036d57858201830151818301840152908201906200034e565b838211156200037f5760008385830101525b9695505050505050565b60008060008060808587031215620003a057600080fd5b84516001600160401b0380821115620003b857600080fd5b620003c688838901620002d2565b95506020870151915080821115620003dd57600080fd5b620003eb88838901620002d2565b945060408701519150808211156200040257600080fd5b6200041088838901620002d2565b935060608701519150808211156200042757600080fd5b506200043687828801620002d2565b91505092959194509250565b600181811c908216806200045757607f821691505b602082108114156200047957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61393980620004a56000396000f3fe60806040526004361061036b5760003560e01c8063715018a6116101c6578063c6682862116100f7578063e985e9c511610095578063edec5f271161006f578063edec5f271461099a578063f2c4ce1e146109ba578063f2fde38b146109da578063fe55932a146109fa57600080fd5b8063e985e9c51461091c578063e986655014610965578063ec75d6221461097a57600080fd5b8063d0eb26b0116100d1578063d0eb26b0146108b0578063d5abeb01146108d0578063da3ef23f146108e6578063e36d64981461090657600080fd5b8063c668286214610865578063c87b56dd1461087a578063cb774d471461089a57600080fd5b80639ffdb65a11610164578063a475b5dd1161013e578063a475b5dd146107fa578063b88d4fde1461080f578063ba4e5c491461082f578063ba7d2c761461084f57600080fd5b80639ffdb65a146107a7578063a0712d68146107c7578063a22cb465146107da57600080fd5b80638da5cb5b116101a05780638da5cb5b146107345780639416b4231461075257806395d89b41146107725780639c70b5121461078757600080fd5b8063715018a6146106ea5780637d17fcbe146106ff5780637f00c7a61461071457600080fd5b80633c952764116102a057806355f804b31161023e5780636373a6b1116102185780636373a6b1146106805780636c0360eb146106955780636d522418146106aa57806370a08231146106ca57600080fd5b806355f804b3146106265780635c975abb146106465780636352211e1461066057600080fd5b8063438b63001161027a578063438b63001461059a57806344a0d68a146105c75780634f6ccce7146105e7578063518302271461060757600080fd5b80633c952764146105525780633ccfd60b1461057257806342842e0e1461057a57600080fd5b806313faede61161030d578063239c70ae116102e7578063239c70ae146104dc57806323b872dd146104f25780632f745c59146105125780633af32abf1461053257600080fd5b806313faede61461047657806318160ddd1461049a57806318cae269146104af57600080fd5b8063081812fc11610349578063081812fc146103e9578063081c8c4414610421578063095ea7b314610436578063109695231461045657600080fd5b806301ffc9a71461037057806302329a29146103a557806306fdde03146103c7575b600080fd5b34801561037c57600080fd5b5061039061038b3660046134d4565b610a1a565b60405190151581526020015b60405180910390f35b3480156103b157600080fd5b506103c56103c03660046134b9565b610a45565b005b3480156103d357600080fd5b506103dc610aa5565b60405161039c919061372f565b3480156103f557600080fd5b50610409610404366004613543565b610b37565b6040516001600160a01b03909116815260200161039c565b34801561042d57600080fd5b506103dc610bcc565b34801561044257600080fd5b506103c561045136600461341a565b610c5a565b34801561046257600080fd5b506103c561047136600461350e565b610d70565b34801561048257600080fd5b5061048c600e5481565b60405190815260200161039c565b3480156104a657600080fd5b5060085461048c565b3480156104bb57600080fd5b5061048c6104ca3660046132ea565b60146020526000908152604090205481565b3480156104e857600080fd5b5061048c60105481565b3480156104fe57600080fd5b506103c561050d366004613338565b610dcf565b34801561051e57600080fd5b5061048c61052d36600461341a565b610e4a565b34801561053e57600080fd5b5061039061054d3660046132ea565b610ef2565b34801561055e57600080fd5b506103c561056d3660046134b9565b610f5c565b6103c5610fc0565b34801561058657600080fd5b506103c5610595366004613338565b611181565b3480156105a657600080fd5b506105ba6105b53660046132ea565b61119c565b60405161039c91906136eb565b3480156105d357600080fd5b506103c56105e2366004613543565b61123e565b3480156105f357600080fd5b5061048c610602366004613543565b61128b565b34801561061357600080fd5b5060125461039090610100900460ff1681565b34801561063257600080fd5b506103c561064136600461350e565b61132f565b34801561065257600080fd5b506012546103909060ff1681565b34801561066c57600080fd5b5061040961067b366004613543565b61138a565b34801561068c57600080fd5b506103dc611415565b3480156106a157600080fd5b506103dc611422565b3480156106b657600080fd5b506103dc6106c5366004613543565b61142f565b3480156106d657600080fd5b5061048c6106e53660046132ea565b6114d1565b3480156106f657600080fd5b506103c561156b565b34801561070b57600080fd5b506103c56115bf565b34801561072057600080fd5b506103c561072f366004613543565b61165d565b34801561074057600080fd5b50600a546001600160a01b0316610409565b34801561075e57600080fd5b506103dc61076d36600461350e565b6116aa565b34801561077e57600080fd5b506103dc611805565b34801561079357600080fd5b506012546103909062010000900460ff1681565b3480156107b357600080fd5b506103906107c236600461350e565b611814565b6103c56107d5366004613543565b6119ee565b3480156107e657600080fd5b506103c56107f53660046133f0565b611d0f565b34801561080657600080fd5b506103c5611dd4565b34801561081b57600080fd5b506103c561082a366004613374565b611e2d565b34801561083b57600080fd5b5061040961084a366004613543565b611eaf565b34801561085b57600080fd5b5061048c60115481565b34801561087157600080fd5b506103dc611ed9565b34801561088657600080fd5b506103dc610895366004613543565b611ee6565b3480156108a657600080fd5b5061048c60175481565b3480156108bc57600080fd5b506103c56108cb366004613543565b611fee565b3480156108dc57600080fd5b5061048c600f5481565b3480156108f257600080fd5b506103c561090136600461350e565b61203b565b34801561091257600080fd5b5061048c60165481565b34801561092857600080fd5b50610390610937366004613305565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561097157600080fd5b506103c5612096565b34801561098657600080fd5b5061039061099536600461350e565b612196565b3480156109a657600080fd5b506103c56109b5366004613444565b6121c9565b3480156109c657600080fd5b506103c56109d536600461350e565b612229565b3480156109e657600080fd5b506103c56109f53660046132ea565b612284565b348015610a0657600080fd5b506103c5610a1536600461355c565b612354565b60006001600160e01b0319821663780e9d6360e01b1480610a3f5750610a3f82612652565b92915050565b600a546001600160a01b03163314610a925760405162461bcd60e51b815260206004820181905260248201526000805160206138e483398151915260448201526064015b60405180910390fd5b6012805460ff1916911515919091179055565b606060008054610ab4906137f5565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae0906137f5565b8015610b2d5780601f10610b0257610100808354040283529160200191610b2d565b820191906000526020600020905b815481529060010190602001808311610b1057829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610bb05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a89565b506000908152600460205260409020546001600160a01b031690565b600d8054610bd9906137f5565b80601f0160208091040260200160405190810160405280929190818152602001828054610c05906137f5565b8015610c525780601f10610c2757610100808354040283529160200191610c52565b820191906000526020600020905b815481529060010190602001808311610c3557829003601f168201915b505050505081565b6000610c658261138a565b9050806001600160a01b0316836001600160a01b03161415610cd35760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a89565b336001600160a01b0382161480610cef5750610cef8133610937565b610d615760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a89565b610d6b83836126a2565b505050565b600a546001600160a01b03163314610db85760405162461bcd60e51b815260206004820181905260248201526000805160206138e48339815191526044820152606401610a89565b8051610dcb90601590602084019061311e565b5050565b610dd93382612710565b610e3f5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b6064820152608401610a89565b610d6b838383612807565b6000610e55836114d1565b8210610ec95760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610a89565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000805b601354811015610f5357826001600160a01b031660138281548110610f1d57610f1d6138a1565b6000918252602090912001546001600160a01b03161415610f415750600192915050565b80610f4b81613830565b915050610ef6565b50600092915050565b600a546001600160a01b03163314610fa45760405162461bcd60e51b815260206004820181905260248201526000805160206138e48339815191526044820152606401610a89565b60128054911515620100000262ff000019909216919091179055565b600a546001600160a01b031633146110085760405162461bcd60e51b815260206004820181905260248201526000805160206138e48339815191526044820152606401610a89565b6000606461101747600f613793565b611021919061377f565b905060006064611032476005613793565b61103c919061377f565b6040519091506000907314ab4457bfa3aa1057fdee9687c60a108e6f5ac19084908381818185875af1925050503d8060008114611095576040519150601f19603f3d011682016040523d82523d6000602084013e61109a565b606091505b50509050806110a857600080fd5b6040516000907330909da8b6ae3afa42fef31aacd0c6b5f12e898c9084908381818185875af1925050503d80600081146110fe576040519150601f19603f3d011682016040523d82523d6000602084013e611103565b606091505b505090508061111157600080fd5b60405160009073375b2e5ffc8bc5db38e8f2b3cdecf8341f58bf2b9047908381818185875af1925050503d8060008114611167576040519150601f19603f3d011682016040523d82523d6000602084013e61116c565b606091505b505090508061117a57600080fd5b5050505050565b610d6b83838360405180602001604052806000815250611e2d565b606060006111a9836114d1565b905060008167ffffffffffffffff8111156111c6576111c66138b7565b6040519080825280602002602001820160405280156111ef578160200160208202803683370190505b50905060005b82811015611236576112078582610e4a565b828281518110611219576112196138a1565b60209081029190910101528061122e81613830565b9150506111f5565b509392505050565b600a546001600160a01b031633146112865760405162461bcd60e51b815260206004820181905260248201526000805160206138e48339815191526044820152606401610a89565b600e55565b600061129660085490565b821061130a5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610a89565b6008828154811061131d5761131d6138a1565b90600052602060002001549050919050565b600a546001600160a01b031633146113775760405162461bcd60e51b815260206004820181905260248201526000805160206138e48339815191526044820152606401610a89565b8051610dcb90600b90602084019061311e565b6000818152600260205260408120546001600160a01b031680610a3f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610a89565b60158054610bd9906137f5565b600b8054610bd9906137f5565b600081815260186020526040902080546060919061144c906137f5565b80601f0160208091040260200160405190810160405280929190818152602001828054611478906137f5565b80156114c55780601f1061149a576101008083540402835291602001916114c5565b820191906000526020600020905b8154815290600101906020018083116114a857829003601f168201915b50505050509050919050565b60006001600160a01b03821661154f5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610a89565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146115b35760405162461bcd60e51b815260206004820181905260248201526000805160206138e48339815191526044820152606401610a89565b6115bd60006129c6565b565b600a546001600160a01b031633146116075760405162461bcd60e51b815260206004820181905260248201526000805160206138e48339815191526044820152606401610a89565b601754156116575760405162461bcd60e51b815260206004820152601d60248201527f5374617274696e6720696e64657820697320616c7265616479207365740000006044820152606401610a89565b43601655565b600a546001600160a01b031633146116a55760405162461bcd60e51b815260206004820181905260248201526000805160206138e48339815191526044820152606401610a89565b601055565b606060008290506000815167ffffffffffffffff8111156116cd576116cd6138b7565b6040519080825280601f01601f1916602001820160405280156116f7576020820181803683370190505b50905060005b825181101561123657604183828151811061171a5761171a6138a1565b016020015160f81c1080159061174a5750605a83828151811061173f5761173f6138a1565b016020015160f81c11155b156117ac57828181518110611761576117616138a1565b602001015160f81c60f81b60f81c602061177b919061375a565b60f81b828281518110611790576117906138a1565b60200101906001600160f81b031916908160001a9053506117f3565b8281815181106117be576117be6138a1565b602001015160f81c60f81b8282815181106117db576117db6138a1565b60200101906001600160f81b031916908160001a9053505b806117fd81613830565b9150506116fd565b606060018054610ab4906137f5565b60008082905060038151101561182d5750600092915050565b6020815111156118405750600092915050565b80600081518110611853576118536138a1565b6020910101516001600160f81b031916600160fd1b14156118775750600092915050565b806001825161188691906137b2565b81518110611896576118966138a1565b6020910101516001600160f81b031916600160fd1b14156118ba5750600092915050565b6000816000815181106118cf576118cf6138a1565b01602001516001600160f81b031916905060005b82518110156119e3576000838281518110611900576119006138a1565b01602001516001600160f81b0319169050600160fd1b811480156119315750600160fd1b6001600160f81b03198416145b156119425750600095945050505050565b604160f81b6001600160f81b031982161080159061196e5750602d60f91b6001600160f81b0319821611155b1580156119a45750606160f81b6001600160f81b03198216108015906119a25750603d60f91b6001600160f81b0319821611155b155b80156119be5750600160fd1b6001600160f81b0319821614155b156119cf5750600095945050505050565b9150806119db81613830565b9150506118e3565b506001949350505050565b60125460ff1615611a415760405162461bcd60e51b815260206004820152601660248201527f74686520636f6e747261637420697320706175736564000000000000000000006044820152606401610a89565b6000611a4c60085490565b905060008211611a9e5760405162461bcd60e51b815260206004820152601b60248201527f6e65656420746f206d696e74206174206c656173742031204e465400000000006044820152606401610a89565b601054821115611afc5760405162461bcd60e51b8152602060048201526024808201527f6d6178206d696e7420616d6f756e74207065722073657373696f6e20657863656044820152631959195960e21b6064820152608401610a89565b600f54611b098383613742565b1115611b575760405162461bcd60e51b815260206004820152601660248201527f6d6178204e4654206c696d6974206578636565646564000000000000000000006044820152606401610a89565b600a546001600160a01b03163314611c9e5760125462010000900460ff16151560011415611c4157611b8833610ef2565b611bd45760405162461bcd60e51b815260206004820152601760248201527f75736572206973206e6f742077686974656c69737465640000000000000000006044820152606401610a89565b33600090815260146020526040902054601154611bf18483613742565b1115611c3f5760405162461bcd60e51b815260206004820152601c60248201527f6d6178204e4654207065722061646472657373206578636565646564000000006044820152606401610a89565b505b81600e54611c4f9190613793565b341015611c9e5760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742066756e647300000000000000000000000000006044820152606401610a89565b60015b828111611cee57336000908152601460205260408120805491611cc383613830565b90915550611cdc905033611cd78385613742565b612a18565b80611ce681613830565b915050611ca1565b50601654158015611d025750600f54600854145b15610dcb57436016555050565b6001600160a01b038216331415611d685760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a89565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b03163314611e1c5760405162461bcd60e51b815260206004820181905260248201526000805160206138e48339815191526044820152606401610a89565b6012805461ff001916610100179055565b611e373383612710565b611e9d5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b6064820152608401610a89565b611ea984848484612a32565b50505050565b60138181548110611ebf57600080fd5b6000918252602090912001546001600160a01b0316905081565b600c8054610bd9906137f5565b6000818152600260205260409020546060906001600160a01b0316611f735760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610a89565b601254610100900460ff16611f8f57600d805461144c906137f5565b6000611f99612ab0565b90506000815111611fb95760405180602001604052806000815250611fe7565b80611fc384612abf565b600c604051602001611fd7939291906135eb565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146120365760405162461bcd60e51b815260206004820181905260248201526000805160206138e48339815191526044820152606401610a89565b601155565b600a546001600160a01b031633146120835760405162461bcd60e51b815260206004820181905260248201526000805160206138e48339815191526044820152606401610a89565b8051610dcb90600c90602084019061311e565b601754156120e65760405162461bcd60e51b815260206004820152601d60248201527f5374617274696e6720696e64657820697320616c7265616479207365740000006044820152606401610a89565b6016546121355760405162461bcd60e51b815260206004820181905260248201527f5374617274696e6720696e64657820626c6f636b206d757374206265207365746044820152606401610a89565b600f5460165461214691904061384b565b60175560165460ff9061215990436137b2565b111561217c57600f5461216d6001436137b2565b61217891904061384b565b6017555b6017546115bd57601754612191906001613742565b601755565b600060196121a3836116aa565b6040516121b091906135cf565b9081526040519081900360200190205460ff1692915050565b600a546001600160a01b031633146122115760405162461bcd60e51b815260206004820181905260248201526000805160206138e48339815191526044820152606401610a89565b61221d601360006131a2565b610d6b601383836131c0565b600a546001600160a01b031633146122715760405162461bcd60e51b815260206004820181905260248201526000805160206138e48339815191526044820152606401610a89565b8051610dcb90600d90602084019061311e565b600a546001600160a01b031633146122cc5760405162461bcd60e51b815260206004820181905260248201526000805160206138e48339815191526044820152606401610a89565b6001600160a01b0381166123485760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a89565b612351816129c6565b50565b601254610100900460ff166123b75760405162461bcd60e51b815260206004820152602360248201527f436f6c6c656374696f6e206861736e74206265656e2072657665616c6564207960448201526265742160e81b6064820152608401610a89565b60006123c28361138a565b9050336001600160a01b0382161461241c5760405162461bcd60e51b815260206004820181905260248201527f41646472657373206973206e6f7420746865206f776e6572206f66204e4654216044820152606401610a89565b61242582611814565b15156001146124765760405162461bcd60e51b815260206004820152601260248201527f4e616d65206973206e6f742076616c69642100000000000000000000000000006044820152606401610a89565b61247f82612196565b156124cc5760405162461bcd60e51b815260206004820181905260248201527f54686973206e616d6520697320616c7265616479206265696e6720757365642e6044820152606401610a89565b600083815260186020526040812080546124e5906137f5565b905011156125be57600083815260186020526040812080546019916125909161250d906137f5565b80601f0160208091040260200160405190810160405280929190818152602001828054612539906137f5565b80156125865780601f1061255b57610100808354040283529160200191612586565b820191906000526020600020905b81548152906001019060200180831161256957829003601f168201915b50505050506116aa565b60405161259d91906135cf565b908152604051908190036020019020805491151560ff199092169190911790555b600160196125cb846116aa565b6040516125d891906135cf565b9081526040805160209281900383019020805460ff1916931515939093179092556000858152601882529190912083516126149285019061311e565b50827f9726e950b835e1f7f4fe747cca4223de678452a4f67c102d50408e22e94e948583604051612645919061372f565b60405180910390a2505050565b60006001600160e01b031982166380ac58cd60e01b148061268357506001600160e01b03198216635b5e139f60e01b145b80610a3f57506301ffc9a760e01b6001600160e01b0319831614610a3f565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906126d78261138a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166127895760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a89565b60006127948361138a565b9050806001600160a01b0316846001600160a01b031614806127cf5750836001600160a01b03166127c484610b37565b6001600160a01b0316145b806127ff57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661281a8261138a565b6001600160a01b0316146128965760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610a89565b6001600160a01b0382166128f85760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a89565b612903838383612bbd565b61290e6000826126a2565b6001600160a01b03831660009081526003602052604081208054600192906129379084906137b2565b90915550506001600160a01b0382166000908152600360205260408120805460019290612965908490613742565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610dcb828260405180602001604052806000815250612c75565b612a3d848484612807565b612a4984848484612cf3565b611ea95760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610a89565b6060600b8054610ab4906137f5565b606081612ae35750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612b0d5780612af781613830565b9150612b069050600a8361377f565b9150612ae7565b60008167ffffffffffffffff811115612b2857612b286138b7565b6040519080825280601f01601f191660200182016040528015612b52576020820181803683370190505b5090505b84156127ff57612b676001836137b2565b9150612b74600a8661384b565b612b7f906030613742565b60f81b818381518110612b9457612b946138a1565b60200101906001600160f81b031916908160001a905350612bb6600a8661377f565b9450612b56565b6001600160a01b038316612c1857612c1381600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612c3b565b816001600160a01b0316836001600160a01b031614612c3b57612c3b8382612e40565b6001600160a01b038216612c5257610d6b81612edd565b826001600160a01b0316826001600160a01b031614610d6b57610d6b8282612f8c565b612c7f8383612fd0565b612c8c6000848484612cf3565b610d6b5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610a89565b60006001600160a01b0384163b156119e357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612d379033908990889088906004016136af565b602060405180830381600087803b158015612d5157600080fd5b505af1925050508015612d81575060408051601f3d908101601f19168201909252612d7e918101906134f1565b60015b612e26573d808015612daf576040519150601f19603f3d011682016040523d82523d6000602084013e612db4565b606091505b508051612e1e5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610a89565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506127ff565b60006001612e4d846114d1565b612e5791906137b2565b600083815260076020526040902054909150808214612eaa576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612eef906001906137b2565b60008381526009602052604081205460088054939450909284908110612f1757612f176138a1565b906000526020600020015490508060088381548110612f3857612f386138a1565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612f7057612f7061388b565b6001900381819060005260206000200160009055905550505050565b6000612f97836114d1565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166130265760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a89565b6000818152600260205260409020546001600160a01b03161561308b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a89565b61309760008383612bbd565b6001600160a01b03821660009081526003602052604081208054600192906130c0908490613742565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461312a906137f5565b90600052602060002090601f01602090048101928261314c5760008555613192565b82601f1061316557805160ff1916838001178555613192565b82800160010185558215613192579182015b82811115613192578251825591602001919060010190613177565b5061319e929150613213565b5090565b50805460008255906000526020600020908101906123519190613213565b828054828255906000526020600020908101928215613192579160200282015b828111156131925781546001600160a01b0319166001600160a01b038435161782556020909201916001909101906131e0565b5b8082111561319e5760008155600101613214565b600067ffffffffffffffff80841115613243576132436138b7565b604051601f8501601f19908116603f0116810190828211818310171561326b5761326b6138b7565b8160405280935085815286868601111561328457600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b03811681146132b557600080fd5b919050565b803580151581146132b557600080fd5b600082601f8301126132db57600080fd5b611fe783833560208501613228565b6000602082840312156132fc57600080fd5b611fe78261329e565b6000806040838503121561331857600080fd5b6133218361329e565b915061332f6020840161329e565b90509250929050565b60008060006060848603121561334d57600080fd5b6133568461329e565b92506133646020850161329e565b9150604084013590509250925092565b6000806000806080858703121561338a57600080fd5b6133938561329e565b93506133a16020860161329e565b925060408501359150606085013567ffffffffffffffff8111156133c457600080fd5b8501601f810187136133d557600080fd5b6133e487823560208401613228565b91505092959194509250565b6000806040838503121561340357600080fd5b61340c8361329e565b915061332f602084016132ba565b6000806040838503121561342d57600080fd5b6134368361329e565b946020939093013593505050565b6000806020838503121561345757600080fd5b823567ffffffffffffffff8082111561346f57600080fd5b818501915085601f83011261348357600080fd5b81358181111561349257600080fd5b8660208260051b85010111156134a757600080fd5b60209290920196919550909350505050565b6000602082840312156134cb57600080fd5b611fe7826132ba565b6000602082840312156134e657600080fd5b8135611fe7816138cd565b60006020828403121561350357600080fd5b8151611fe7816138cd565b60006020828403121561352057600080fd5b813567ffffffffffffffff81111561353757600080fd5b6127ff848285016132ca565b60006020828403121561355557600080fd5b5035919050565b6000806040838503121561356f57600080fd5b82359150602083013567ffffffffffffffff81111561358d57600080fd5b613599858286016132ca565b9150509250929050565b600081518084526135bb8160208601602086016137c9565b601f01601f19169290920160200192915050565b600082516135e18184602087016137c9565b9190910192915050565b6000845160206135fe8285838a016137c9565b8551918401916136118184848a016137c9565b8554920191600090600181811c908083168061362e57607f831692505b85831081141561364c57634e487b7160e01b85526022600452602485fd5b80801561366057600181146136715761369e565b60ff1985168852838801955061369e565b60008b81526020902060005b858110156136965781548a82015290840190880161367d565b505083880195505b50939b9a5050505050505050505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526136e160808301846135a3565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561372357835183529284019291840191600101613707565b50909695505050505050565b602081526000611fe760208301846135a3565b600082198211156137555761375561385f565b500190565b600060ff821660ff84168060ff038211156137775761377761385f565b019392505050565b60008261378e5761378e613875565b500490565b60008160001904831182151516156137ad576137ad61385f565b500290565b6000828210156137c4576137c461385f565b500390565b60005b838110156137e45781810151838201526020016137cc565b83811115611ea95750506000910152565b600181811c9082168061380957607f821691505b6020821081141561382a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156138445761384461385f565b5060010190565b60008261385a5761385a613875565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461235157600080fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122027f6a885d7e746f0db53a39dded0677e74e3fbbb938ac84a12ef507068b257bd64736f6c634300080700334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000001347454e455349532053594e43524f4e415554530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054753594e430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d546f42486f7035464133665648587a5941553171684a454c5535623437456f446b72415975546b553941366b2f000000000000000000000000000000000000000000000000000000000000000000000000000000000045697066733a2f2f516d546f42486f7035464133665648587a5941553171684a454c5535623437456f446b72415975546b553941366b2f756e72657665616c65642e6a736f6e000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061036b5760003560e01c8063715018a6116101c6578063c6682862116100f7578063e985e9c511610095578063edec5f271161006f578063edec5f271461099a578063f2c4ce1e146109ba578063f2fde38b146109da578063fe55932a146109fa57600080fd5b8063e985e9c51461091c578063e986655014610965578063ec75d6221461097a57600080fd5b8063d0eb26b0116100d1578063d0eb26b0146108b0578063d5abeb01146108d0578063da3ef23f146108e6578063e36d64981461090657600080fd5b8063c668286214610865578063c87b56dd1461087a578063cb774d471461089a57600080fd5b80639ffdb65a11610164578063a475b5dd1161013e578063a475b5dd146107fa578063b88d4fde1461080f578063ba4e5c491461082f578063ba7d2c761461084f57600080fd5b80639ffdb65a146107a7578063a0712d68146107c7578063a22cb465146107da57600080fd5b80638da5cb5b116101a05780638da5cb5b146107345780639416b4231461075257806395d89b41146107725780639c70b5121461078757600080fd5b8063715018a6146106ea5780637d17fcbe146106ff5780637f00c7a61461071457600080fd5b80633c952764116102a057806355f804b31161023e5780636373a6b1116102185780636373a6b1146106805780636c0360eb146106955780636d522418146106aa57806370a08231146106ca57600080fd5b806355f804b3146106265780635c975abb146106465780636352211e1461066057600080fd5b8063438b63001161027a578063438b63001461059a57806344a0d68a146105c75780634f6ccce7146105e7578063518302271461060757600080fd5b80633c952764146105525780633ccfd60b1461057257806342842e0e1461057a57600080fd5b806313faede61161030d578063239c70ae116102e7578063239c70ae146104dc57806323b872dd146104f25780632f745c59146105125780633af32abf1461053257600080fd5b806313faede61461047657806318160ddd1461049a57806318cae269146104af57600080fd5b8063081812fc11610349578063081812fc146103e9578063081c8c4414610421578063095ea7b314610436578063109695231461045657600080fd5b806301ffc9a71461037057806302329a29146103a557806306fdde03146103c7575b600080fd5b34801561037c57600080fd5b5061039061038b3660046134d4565b610a1a565b60405190151581526020015b60405180910390f35b3480156103b157600080fd5b506103c56103c03660046134b9565b610a45565b005b3480156103d357600080fd5b506103dc610aa5565b60405161039c919061372f565b3480156103f557600080fd5b50610409610404366004613543565b610b37565b6040516001600160a01b03909116815260200161039c565b34801561042d57600080fd5b506103dc610bcc565b34801561044257600080fd5b506103c561045136600461341a565b610c5a565b34801561046257600080fd5b506103c561047136600461350e565b610d70565b34801561048257600080fd5b5061048c600e5481565b60405190815260200161039c565b3480156104a657600080fd5b5060085461048c565b3480156104bb57600080fd5b5061048c6104ca3660046132ea565b60146020526000908152604090205481565b3480156104e857600080fd5b5061048c60105481565b3480156104fe57600080fd5b506103c561050d366004613338565b610dcf565b34801561051e57600080fd5b5061048c61052d36600461341a565b610e4a565b34801561053e57600080fd5b5061039061054d3660046132ea565b610ef2565b34801561055e57600080fd5b506103c561056d3660046134b9565b610f5c565b6103c5610fc0565b34801561058657600080fd5b506103c5610595366004613338565b611181565b3480156105a657600080fd5b506105ba6105b53660046132ea565b61119c565b60405161039c91906136eb565b3480156105d357600080fd5b506103c56105e2366004613543565b61123e565b3480156105f357600080fd5b5061048c610602366004613543565b61128b565b34801561061357600080fd5b5060125461039090610100900460ff1681565b34801561063257600080fd5b506103c561064136600461350e565b61132f565b34801561065257600080fd5b506012546103909060ff1681565b34801561066c57600080fd5b5061040961067b366004613543565b61138a565b34801561068c57600080fd5b506103dc611415565b3480156106a157600080fd5b506103dc611422565b3480156106b657600080fd5b506103dc6106c5366004613543565b61142f565b3480156106d657600080fd5b5061048c6106e53660046132ea565b6114d1565b3480156106f657600080fd5b506103c561156b565b34801561070b57600080fd5b506103c56115bf565b34801561072057600080fd5b506103c561072f366004613543565b61165d565b34801561074057600080fd5b50600a546001600160a01b0316610409565b34801561075e57600080fd5b506103dc61076d36600461350e565b6116aa565b34801561077e57600080fd5b506103dc611805565b34801561079357600080fd5b506012546103909062010000900460ff1681565b3480156107b357600080fd5b506103906107c236600461350e565b611814565b6103c56107d5366004613543565b6119ee565b3480156107e657600080fd5b506103c56107f53660046133f0565b611d0f565b34801561080657600080fd5b506103c5611dd4565b34801561081b57600080fd5b506103c561082a366004613374565b611e2d565b34801561083b57600080fd5b5061040961084a366004613543565b611eaf565b34801561085b57600080fd5b5061048c60115481565b34801561087157600080fd5b506103dc611ed9565b34801561088657600080fd5b506103dc610895366004613543565b611ee6565b3480156108a657600080fd5b5061048c60175481565b3480156108bc57600080fd5b506103c56108cb366004613543565b611fee565b3480156108dc57600080fd5b5061048c600f5481565b3480156108f257600080fd5b506103c561090136600461350e565b61203b565b34801561091257600080fd5b5061048c60165481565b34801561092857600080fd5b50610390610937366004613305565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561097157600080fd5b506103c5612096565b34801561098657600080fd5b5061039061099536600461350e565b612196565b3480156109a657600080fd5b506103c56109b5366004613444565b6121c9565b3480156109c657600080fd5b506103c56109d536600461350e565b612229565b3480156109e657600080fd5b506103c56109f53660046132ea565b612284565b348015610a0657600080fd5b506103c5610a1536600461355c565b612354565b60006001600160e01b0319821663780e9d6360e01b1480610a3f5750610a3f82612652565b92915050565b600a546001600160a01b03163314610a925760405162461bcd60e51b815260206004820181905260248201526000805160206138e483398151915260448201526064015b60405180910390fd5b6012805460ff1916911515919091179055565b606060008054610ab4906137f5565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae0906137f5565b8015610b2d5780601f10610b0257610100808354040283529160200191610b2d565b820191906000526020600020905b815481529060010190602001808311610b1057829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610bb05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a89565b506000908152600460205260409020546001600160a01b031690565b600d8054610bd9906137f5565b80601f0160208091040260200160405190810160405280929190818152602001828054610c05906137f5565b8015610c525780601f10610c2757610100808354040283529160200191610c52565b820191906000526020600020905b815481529060010190602001808311610c3557829003601f168201915b505050505081565b6000610c658261138a565b9050806001600160a01b0316836001600160a01b03161415610cd35760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a89565b336001600160a01b0382161480610cef5750610cef8133610937565b610d615760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a89565b610d6b83836126a2565b505050565b600a546001600160a01b03163314610db85760405162461bcd60e51b815260206004820181905260248201526000805160206138e48339815191526044820152606401610a89565b8051610dcb90601590602084019061311e565b5050565b610dd93382612710565b610e3f5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b6064820152608401610a89565b610d6b838383612807565b6000610e55836114d1565b8210610ec95760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610a89565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000805b601354811015610f5357826001600160a01b031660138281548110610f1d57610f1d6138a1565b6000918252602090912001546001600160a01b03161415610f415750600192915050565b80610f4b81613830565b915050610ef6565b50600092915050565b600a546001600160a01b03163314610fa45760405162461bcd60e51b815260206004820181905260248201526000805160206138e48339815191526044820152606401610a89565b60128054911515620100000262ff000019909216919091179055565b600a546001600160a01b031633146110085760405162461bcd60e51b815260206004820181905260248201526000805160206138e48339815191526044820152606401610a89565b6000606461101747600f613793565b611021919061377f565b905060006064611032476005613793565b61103c919061377f565b6040519091506000907314ab4457bfa3aa1057fdee9687c60a108e6f5ac19084908381818185875af1925050503d8060008114611095576040519150601f19603f3d011682016040523d82523d6000602084013e61109a565b606091505b50509050806110a857600080fd5b6040516000907330909da8b6ae3afa42fef31aacd0c6b5f12e898c9084908381818185875af1925050503d80600081146110fe576040519150601f19603f3d011682016040523d82523d6000602084013e611103565b606091505b505090508061111157600080fd5b60405160009073375b2e5ffc8bc5db38e8f2b3cdecf8341f58bf2b9047908381818185875af1925050503d8060008114611167576040519150601f19603f3d011682016040523d82523d6000602084013e61116c565b606091505b505090508061117a57600080fd5b5050505050565b610d6b83838360405180602001604052806000815250611e2d565b606060006111a9836114d1565b905060008167ffffffffffffffff8111156111c6576111c66138b7565b6040519080825280602002602001820160405280156111ef578160200160208202803683370190505b50905060005b82811015611236576112078582610e4a565b828281518110611219576112196138a1565b60209081029190910101528061122e81613830565b9150506111f5565b509392505050565b600a546001600160a01b031633146112865760405162461bcd60e51b815260206004820181905260248201526000805160206138e48339815191526044820152606401610a89565b600e55565b600061129660085490565b821061130a5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610a89565b6008828154811061131d5761131d6138a1565b90600052602060002001549050919050565b600a546001600160a01b031633146113775760405162461bcd60e51b815260206004820181905260248201526000805160206138e48339815191526044820152606401610a89565b8051610dcb90600b90602084019061311e565b6000818152600260205260408120546001600160a01b031680610a3f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610a89565b60158054610bd9906137f5565b600b8054610bd9906137f5565b600081815260186020526040902080546060919061144c906137f5565b80601f0160208091040260200160405190810160405280929190818152602001828054611478906137f5565b80156114c55780601f1061149a576101008083540402835291602001916114c5565b820191906000526020600020905b8154815290600101906020018083116114a857829003601f168201915b50505050509050919050565b60006001600160a01b03821661154f5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610a89565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146115b35760405162461bcd60e51b815260206004820181905260248201526000805160206138e48339815191526044820152606401610a89565b6115bd60006129c6565b565b600a546001600160a01b031633146116075760405162461bcd60e51b815260206004820181905260248201526000805160206138e48339815191526044820152606401610a89565b601754156116575760405162461bcd60e51b815260206004820152601d60248201527f5374617274696e6720696e64657820697320616c7265616479207365740000006044820152606401610a89565b43601655565b600a546001600160a01b031633146116a55760405162461bcd60e51b815260206004820181905260248201526000805160206138e48339815191526044820152606401610a89565b601055565b606060008290506000815167ffffffffffffffff8111156116cd576116cd6138b7565b6040519080825280601f01601f1916602001820160405280156116f7576020820181803683370190505b50905060005b825181101561123657604183828151811061171a5761171a6138a1565b016020015160f81c1080159061174a5750605a83828151811061173f5761173f6138a1565b016020015160f81c11155b156117ac57828181518110611761576117616138a1565b602001015160f81c60f81b60f81c602061177b919061375a565b60f81b828281518110611790576117906138a1565b60200101906001600160f81b031916908160001a9053506117f3565b8281815181106117be576117be6138a1565b602001015160f81c60f81b8282815181106117db576117db6138a1565b60200101906001600160f81b031916908160001a9053505b806117fd81613830565b9150506116fd565b606060018054610ab4906137f5565b60008082905060038151101561182d5750600092915050565b6020815111156118405750600092915050565b80600081518110611853576118536138a1565b6020910101516001600160f81b031916600160fd1b14156118775750600092915050565b806001825161188691906137b2565b81518110611896576118966138a1565b6020910101516001600160f81b031916600160fd1b14156118ba5750600092915050565b6000816000815181106118cf576118cf6138a1565b01602001516001600160f81b031916905060005b82518110156119e3576000838281518110611900576119006138a1565b01602001516001600160f81b0319169050600160fd1b811480156119315750600160fd1b6001600160f81b03198416145b156119425750600095945050505050565b604160f81b6001600160f81b031982161080159061196e5750602d60f91b6001600160f81b0319821611155b1580156119a45750606160f81b6001600160f81b03198216108015906119a25750603d60f91b6001600160f81b0319821611155b155b80156119be5750600160fd1b6001600160f81b0319821614155b156119cf5750600095945050505050565b9150806119db81613830565b9150506118e3565b506001949350505050565b60125460ff1615611a415760405162461bcd60e51b815260206004820152601660248201527f74686520636f6e747261637420697320706175736564000000000000000000006044820152606401610a89565b6000611a4c60085490565b905060008211611a9e5760405162461bcd60e51b815260206004820152601b60248201527f6e65656420746f206d696e74206174206c656173742031204e465400000000006044820152606401610a89565b601054821115611afc5760405162461bcd60e51b8152602060048201526024808201527f6d6178206d696e7420616d6f756e74207065722073657373696f6e20657863656044820152631959195960e21b6064820152608401610a89565b600f54611b098383613742565b1115611b575760405162461bcd60e51b815260206004820152601660248201527f6d6178204e4654206c696d6974206578636565646564000000000000000000006044820152606401610a89565b600a546001600160a01b03163314611c9e5760125462010000900460ff16151560011415611c4157611b8833610ef2565b611bd45760405162461bcd60e51b815260206004820152601760248201527f75736572206973206e6f742077686974656c69737465640000000000000000006044820152606401610a89565b33600090815260146020526040902054601154611bf18483613742565b1115611c3f5760405162461bcd60e51b815260206004820152601c60248201527f6d6178204e4654207065722061646472657373206578636565646564000000006044820152606401610a89565b505b81600e54611c4f9190613793565b341015611c9e5760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742066756e647300000000000000000000000000006044820152606401610a89565b60015b828111611cee57336000908152601460205260408120805491611cc383613830565b90915550611cdc905033611cd78385613742565b612a18565b80611ce681613830565b915050611ca1565b50601654158015611d025750600f54600854145b15610dcb57436016555050565b6001600160a01b038216331415611d685760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a89565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b03163314611e1c5760405162461bcd60e51b815260206004820181905260248201526000805160206138e48339815191526044820152606401610a89565b6012805461ff001916610100179055565b611e373383612710565b611e9d5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b6064820152608401610a89565b611ea984848484612a32565b50505050565b60138181548110611ebf57600080fd5b6000918252602090912001546001600160a01b0316905081565b600c8054610bd9906137f5565b6000818152600260205260409020546060906001600160a01b0316611f735760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610a89565b601254610100900460ff16611f8f57600d805461144c906137f5565b6000611f99612ab0565b90506000815111611fb95760405180602001604052806000815250611fe7565b80611fc384612abf565b600c604051602001611fd7939291906135eb565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146120365760405162461bcd60e51b815260206004820181905260248201526000805160206138e48339815191526044820152606401610a89565b601155565b600a546001600160a01b031633146120835760405162461bcd60e51b815260206004820181905260248201526000805160206138e48339815191526044820152606401610a89565b8051610dcb90600c90602084019061311e565b601754156120e65760405162461bcd60e51b815260206004820152601d60248201527f5374617274696e6720696e64657820697320616c7265616479207365740000006044820152606401610a89565b6016546121355760405162461bcd60e51b815260206004820181905260248201527f5374617274696e6720696e64657820626c6f636b206d757374206265207365746044820152606401610a89565b600f5460165461214691904061384b565b60175560165460ff9061215990436137b2565b111561217c57600f5461216d6001436137b2565b61217891904061384b565b6017555b6017546115bd57601754612191906001613742565b601755565b600060196121a3836116aa565b6040516121b091906135cf565b9081526040519081900360200190205460ff1692915050565b600a546001600160a01b031633146122115760405162461bcd60e51b815260206004820181905260248201526000805160206138e48339815191526044820152606401610a89565b61221d601360006131a2565b610d6b601383836131c0565b600a546001600160a01b031633146122715760405162461bcd60e51b815260206004820181905260248201526000805160206138e48339815191526044820152606401610a89565b8051610dcb90600d90602084019061311e565b600a546001600160a01b031633146122cc5760405162461bcd60e51b815260206004820181905260248201526000805160206138e48339815191526044820152606401610a89565b6001600160a01b0381166123485760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a89565b612351816129c6565b50565b601254610100900460ff166123b75760405162461bcd60e51b815260206004820152602360248201527f436f6c6c656374696f6e206861736e74206265656e2072657665616c6564207960448201526265742160e81b6064820152608401610a89565b60006123c28361138a565b9050336001600160a01b0382161461241c5760405162461bcd60e51b815260206004820181905260248201527f41646472657373206973206e6f7420746865206f776e6572206f66204e4654216044820152606401610a89565b61242582611814565b15156001146124765760405162461bcd60e51b815260206004820152601260248201527f4e616d65206973206e6f742076616c69642100000000000000000000000000006044820152606401610a89565b61247f82612196565b156124cc5760405162461bcd60e51b815260206004820181905260248201527f54686973206e616d6520697320616c7265616479206265696e6720757365642e6044820152606401610a89565b600083815260186020526040812080546124e5906137f5565b905011156125be57600083815260186020526040812080546019916125909161250d906137f5565b80601f0160208091040260200160405190810160405280929190818152602001828054612539906137f5565b80156125865780601f1061255b57610100808354040283529160200191612586565b820191906000526020600020905b81548152906001019060200180831161256957829003601f168201915b50505050506116aa565b60405161259d91906135cf565b908152604051908190036020019020805491151560ff199092169190911790555b600160196125cb846116aa565b6040516125d891906135cf565b9081526040805160209281900383019020805460ff1916931515939093179092556000858152601882529190912083516126149285019061311e565b50827f9726e950b835e1f7f4fe747cca4223de678452a4f67c102d50408e22e94e948583604051612645919061372f565b60405180910390a2505050565b60006001600160e01b031982166380ac58cd60e01b148061268357506001600160e01b03198216635b5e139f60e01b145b80610a3f57506301ffc9a760e01b6001600160e01b0319831614610a3f565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906126d78261138a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166127895760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a89565b60006127948361138a565b9050806001600160a01b0316846001600160a01b031614806127cf5750836001600160a01b03166127c484610b37565b6001600160a01b0316145b806127ff57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661281a8261138a565b6001600160a01b0316146128965760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610a89565b6001600160a01b0382166128f85760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a89565b612903838383612bbd565b61290e6000826126a2565b6001600160a01b03831660009081526003602052604081208054600192906129379084906137b2565b90915550506001600160a01b0382166000908152600360205260408120805460019290612965908490613742565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610dcb828260405180602001604052806000815250612c75565b612a3d848484612807565b612a4984848484612cf3565b611ea95760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610a89565b6060600b8054610ab4906137f5565b606081612ae35750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612b0d5780612af781613830565b9150612b069050600a8361377f565b9150612ae7565b60008167ffffffffffffffff811115612b2857612b286138b7565b6040519080825280601f01601f191660200182016040528015612b52576020820181803683370190505b5090505b84156127ff57612b676001836137b2565b9150612b74600a8661384b565b612b7f906030613742565b60f81b818381518110612b9457612b946138a1565b60200101906001600160f81b031916908160001a905350612bb6600a8661377f565b9450612b56565b6001600160a01b038316612c1857612c1381600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612c3b565b816001600160a01b0316836001600160a01b031614612c3b57612c3b8382612e40565b6001600160a01b038216612c5257610d6b81612edd565b826001600160a01b0316826001600160a01b031614610d6b57610d6b8282612f8c565b612c7f8383612fd0565b612c8c6000848484612cf3565b610d6b5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610a89565b60006001600160a01b0384163b156119e357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612d379033908990889088906004016136af565b602060405180830381600087803b158015612d5157600080fd5b505af1925050508015612d81575060408051601f3d908101601f19168201909252612d7e918101906134f1565b60015b612e26573d808015612daf576040519150601f19603f3d011682016040523d82523d6000602084013e612db4565b606091505b508051612e1e5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610a89565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506127ff565b60006001612e4d846114d1565b612e5791906137b2565b600083815260076020526040902054909150808214612eaa576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612eef906001906137b2565b60008381526009602052604081205460088054939450909284908110612f1757612f176138a1565b906000526020600020015490508060088381548110612f3857612f386138a1565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612f7057612f7061388b565b6001900381819060005260206000200160009055905550505050565b6000612f97836114d1565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166130265760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a89565b6000818152600260205260409020546001600160a01b03161561308b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a89565b61309760008383612bbd565b6001600160a01b03821660009081526003602052604081208054600192906130c0908490613742565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461312a906137f5565b90600052602060002090601f01602090048101928261314c5760008555613192565b82601f1061316557805160ff1916838001178555613192565b82800160010185558215613192579182015b82811115613192578251825591602001919060010190613177565b5061319e929150613213565b5090565b50805460008255906000526020600020908101906123519190613213565b828054828255906000526020600020908101928215613192579160200282015b828111156131925781546001600160a01b0319166001600160a01b038435161782556020909201916001909101906131e0565b5b8082111561319e5760008155600101613214565b600067ffffffffffffffff80841115613243576132436138b7565b604051601f8501601f19908116603f0116810190828211818310171561326b5761326b6138b7565b8160405280935085815286868601111561328457600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b03811681146132b557600080fd5b919050565b803580151581146132b557600080fd5b600082601f8301126132db57600080fd5b611fe783833560208501613228565b6000602082840312156132fc57600080fd5b611fe78261329e565b6000806040838503121561331857600080fd5b6133218361329e565b915061332f6020840161329e565b90509250929050565b60008060006060848603121561334d57600080fd5b6133568461329e565b92506133646020850161329e565b9150604084013590509250925092565b6000806000806080858703121561338a57600080fd5b6133938561329e565b93506133a16020860161329e565b925060408501359150606085013567ffffffffffffffff8111156133c457600080fd5b8501601f810187136133d557600080fd5b6133e487823560208401613228565b91505092959194509250565b6000806040838503121561340357600080fd5b61340c8361329e565b915061332f602084016132ba565b6000806040838503121561342d57600080fd5b6134368361329e565b946020939093013593505050565b6000806020838503121561345757600080fd5b823567ffffffffffffffff8082111561346f57600080fd5b818501915085601f83011261348357600080fd5b81358181111561349257600080fd5b8660208260051b85010111156134a757600080fd5b60209290920196919550909350505050565b6000602082840312156134cb57600080fd5b611fe7826132ba565b6000602082840312156134e657600080fd5b8135611fe7816138cd565b60006020828403121561350357600080fd5b8151611fe7816138cd565b60006020828403121561352057600080fd5b813567ffffffffffffffff81111561353757600080fd5b6127ff848285016132ca565b60006020828403121561355557600080fd5b5035919050565b6000806040838503121561356f57600080fd5b82359150602083013567ffffffffffffffff81111561358d57600080fd5b613599858286016132ca565b9150509250929050565b600081518084526135bb8160208601602086016137c9565b601f01601f19169290920160200192915050565b600082516135e18184602087016137c9565b9190910192915050565b6000845160206135fe8285838a016137c9565b8551918401916136118184848a016137c9565b8554920191600090600181811c908083168061362e57607f831692505b85831081141561364c57634e487b7160e01b85526022600452602485fd5b80801561366057600181146136715761369e565b60ff1985168852838801955061369e565b60008b81526020902060005b858110156136965781548a82015290840190880161367d565b505083880195505b50939b9a5050505050505050505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526136e160808301846135a3565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561372357835183529284019291840191600101613707565b50909695505050505050565b602081526000611fe760208301846135a3565b600082198211156137555761375561385f565b500190565b600060ff821660ff84168060ff038211156137775761377761385f565b019392505050565b60008261378e5761378e613875565b500490565b60008160001904831182151516156137ad576137ad61385f565b500290565b6000828210156137c4576137c461385f565b500390565b60005b838110156137e45781810151838201526020016137cc565b83811115611ea95750506000910152565b600181811c9082168061380957607f821691505b6020821081141561382a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156138445761384461385f565b5060010190565b60008261385a5761385a613875565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461235157600080fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122027f6a885d7e746f0db53a39dded0677e74e3fbbb938ac84a12ef507068b257bd64736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000001347454e455349532053594e43524f4e415554530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054753594e430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d546f42486f7035464133665648587a5941553171684a454c5535623437456f446b72415975546b553941366b2f000000000000000000000000000000000000000000000000000000000000000000000000000000000045697066733a2f2f516d546f42486f7035464133665648587a5941553171684a454c5535623437456f446b72415975546b553941366b2f756e72657665616c65642e6a736f6e000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): GENESIS SYNCRONAUTS
Arg [1] : _symbol (string): GSYNC
Arg [2] : _initBaseURI (string): ipfs://QmToBHop5FA3fVHXzYAU1qhJELU5b47EoDkrAYuTkU9A6k/
Arg [3] : _initNotRevealedUri (string): ipfs://QmToBHop5FA3fVHXzYAU1qhJELU5b47EoDkrAYuTkU9A6k/unrevealed.json

-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000013
Arg [5] : 47454e455349532053594e43524f4e4155545300000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 4753594e43000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [9] : 697066733a2f2f516d546f42486f7035464133665648587a5941553171684a45
Arg [10] : 4c5535623437456f446b72415975546b553941366b2f00000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000045
Arg [12] : 697066733a2f2f516d546f42486f7035464133665648587a5941553171684a45
Arg [13] : 4c5535623437456f446b72415975546b553941366b2f756e72657665616c6564
Arg [14] : 2e6a736f6e000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

44464:9368:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36009:224;;;;;;;;;;-1:-1:-1;36009:224:0;;;;;:::i;:::-;;:::i;:::-;;;9270:14:1;;9263:22;9245:41;;9233:2;9218:18;36009:224:0;;;;;;;;52371:73;;;;;;;;;;-1:-1:-1;52371:73:0;;;;;:::i;:::-;;:::i;:::-;;23901:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25460:221::-;;;;;;;;;;-1:-1:-1;25460:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7885:55:1;;;7867:74;;7855:2;7840:18;25460:221:0;7721:226:1;44614:28:0;;;;;;;;;;;;;:::i;24983:411::-;;;;;;;;;;-1:-1:-1;24983:411:0;;;;;:::i;:::-;;:::i;51575:114::-;;;;;;;;;;-1:-1:-1;51575:114:0;;;;;:::i;:::-;;:::i;44647:32::-;;;;;;;;;;;;;;;;;;;21585:25:1;;;21573:2;21558:18;44647:32:0;21439:177:1;36649:113:0;;;;;;;;;;-1:-1:-1;36737:10:0;:17;36649:113;;44942:55;;;;;;;;;;-1:-1:-1;44942:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;44719:32;;;;;;;;;;;;;;;;26350:339;;;;;;;;;;-1:-1:-1;26350:339:0;;;;;:::i;:::-;;:::i;36317:256::-;;;;;;;;;;-1:-1:-1;36317:256:0;;;;;:::i;:::-;;:::i;46893:239::-;;;;;;;;;;-1:-1:-1;46893:239:0;;;;;:::i;:::-;;:::i;52450:95::-;;;;;;;;;;-1:-1:-1;52450:95:0;;;;;:::i;:::-;;:::i;52701:1128::-;;;:::i;26760:185::-;;;;;;;;;;-1:-1:-1;26760:185:0;;;;;:::i;:::-;;:::i;47138:348::-;;;;;;;;;;-1:-1:-1;47138:348:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;51805:80::-;;;;;;;;;;-1:-1:-1;51805:80:0;;;;;:::i;:::-;;:::i;36839:233::-;;;;;;;;;;-1:-1:-1;36839:233:0;;;;;:::i;:::-;;:::i;44828:28::-;;;;;;;;;;-1:-1:-1;44828:28:0;;;;;;;;;;;52013:98;;;;;;;;;;-1:-1:-1;52013:98:0;;;;;:::i;:::-;;:::i;44798:25::-;;;;;;;;;;-1:-1:-1;44798:25:0;;;;;;;;23595:239;;;;;;;;;;-1:-1:-1;23595:239:0;;;;;:::i;:::-;;:::i;45022:29::-;;;;;;;;;;;;;:::i;44546:21::-;;;;;;;;;;;;;:::i;49822:153::-;;;;;;;;;;-1:-1:-1;49822:153:0;;;;;:::i;:::-;;:::i;23325:208::-;;;;;;;;;;-1:-1:-1;23325:208:0;;;;;:::i;:::-;;:::i;43798:94::-;;;;;;;;;;;;;:::i;48862:184::-;;;;;;;;;;;;;:::i;51891:116::-;;;;;;;;;;-1:-1:-1;51891:116:0;;;;;:::i;:::-;;:::i;43147:87::-;;;;;;;;;;-1:-1:-1;43220:6:0;;-1:-1:-1;;;;;43220:6:0;43147:87;;50843:474;;;;;;;;;;-1:-1:-1;50843:474:0;;;;;:::i;:::-;;:::i;24070:104::-;;;;;;;;;;;;;:::i;44861:34::-;;;;;;;;;;-1:-1:-1;44861:34:0;;;;;;;;;;;50121:714;;;;;;;;;;-1:-1:-1;50121:714:0;;;;;:::i;:::-;;:::i;45684:1203::-;;;;;;:::i;:::-;;:::i;25753:295::-;;;;;;;;;;-1:-1:-1;25753:295:0;;;;;:::i;:::-;;:::i;51443:65::-;;;;;;;;;;;;;:::i;27016:328::-;;;;;;;;;;-1:-1:-1;27016:328:0;;;;;:::i;:::-;;:::i;44900:37::-;;;;;;;;;;-1:-1:-1;44900:37:0;;;;;:::i;:::-;;:::i;44756:::-;;;;;;;;;;;;;;;;44572;;;;;;;;;;;;;:::i;47492:493::-;;;;;;;;;;-1:-1:-1;47492:493:0;;;;;:::i;:::-;;:::i;45094:28::-;;;;;;;;;;;;;;;;51695:104;;;;;;;;;;-1:-1:-1;51695:104:0;;;;;:::i;:::-;;:::i;44684:30::-;;;;;;;;;;;;;;;;52117:122;;;;;;;;;;-1:-1:-1;52117:122:0;;;;;:::i;:::-;;:::i;45056:33::-;;;;;;;;;;;;;;;;26119:164;;;;;;;;;;-1:-1:-1;26119:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;26240:25:0;;;26216:4;26240:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26119:164;48061:664;;;;;;;;;;;;;:::i;49983:130::-;;;;;;;;;;-1:-1:-1;49983:130:0;;;;;:::i;:::-;;:::i;52551:144::-;;;;;;;;;;-1:-1:-1;52551:144:0;;;;;:::i;:::-;;:::i;52245:120::-;;;;;;;;;;-1:-1:-1;52245:120:0;;;;;:::i;:::-;;:::i;44047:192::-;;;;;;;;;;-1:-1:-1;44047:192:0;;;;;:::i;:::-;;:::i;49164:650::-;;;;;;;;;;-1:-1:-1;49164:650:0;;;;;:::i;:::-;;:::i;36009:224::-;36111:4;-1:-1:-1;;;;;;36135:50:0;;-1:-1:-1;;;36135:50:0;;:90;;;36189:36;36213:11;36189:23;:36::i;:::-;36128:97;36009:224;-1:-1:-1;;36009:224:0:o;52371:73::-;43220:6;;-1:-1:-1;;;;;43220:6:0;21510:10;43367:23;43359:68;;;;-1:-1:-1;;;43359:68:0;;16732:2:1;43359:68:0;;;16714:21:1;;;16751:18;;;16744:30;-1:-1:-1;;;;;;;;;;;16790:18:1;;;16783:62;16862:18;;43359:68:0;;;;;;;;;52423:6:::1;:15:::0;;-1:-1:-1;;52423:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;52371:73::o;23901:100::-;23955:13;23988:5;23981:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23901:100;:::o;25460:221::-;25536:7;28943:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28943:16:0;25556:73;;;;-1:-1:-1;;;25556:73:0;;16319:2:1;25556:73:0;;;16301:21:1;16358:2;16338:18;;;16331:30;16397:34;16377:18;;;16370:62;-1:-1:-1;;;16448:18:1;;;16441:42;16500:19;;25556:73:0;16117:408:1;25556:73:0;-1:-1:-1;25649:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25649:24:0;;25460:221::o;44614:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24983:411::-;25064:13;25080:23;25095:7;25080:14;:23::i;:::-;25064:39;;25128:5;-1:-1:-1;;;;;25122:11:0;:2;-1:-1:-1;;;;;25122:11:0;;;25114:57;;;;-1:-1:-1;;;25114:57:0;;18270:2:1;25114:57:0;;;18252:21:1;18309:2;18289:18;;;18282:30;18348:34;18328:18;;;18321:62;-1:-1:-1;;;18399:18:1;;;18392:31;18440:19;;25114:57:0;18068:397:1;25114:57:0;21510:10;-1:-1:-1;;;;;25206:21:0;;;;:62;;-1:-1:-1;25231:37:0;25248:5;21510:10;26119:164;:::i;25231:37::-;25184:168;;;;-1:-1:-1;;;25184:168:0;;13956:2:1;25184:168:0;;;13938:21:1;13995:2;13975:18;;;13968:30;14034:34;14014:18;;;14007:62;14105:26;14085:18;;;14078:54;14149:19;;25184:168:0;13754:420:1;25184:168:0;25365:21;25374:2;25378:7;25365:8;:21::i;:::-;25053:341;24983:411;;:::o;51575:114::-;43220:6;;-1:-1:-1;;;;;43220:6:0;21510:10;43367:23;43359:68;;;;-1:-1:-1;;;43359:68:0;;16732:2:1;43359:68:0;;;16714:21:1;;;16751:18;;;16744:30;-1:-1:-1;;;;;;;;;;;16790:18:1;;;16783:62;16862:18;;43359:68:0;16530:356:1;43359:68:0;51656:27;;::::1;::::0;:10:::1;::::0;:27:::1;::::0;::::1;::::0;::::1;:::i;:::-;;51575:114:::0;:::o;26350:339::-;26545:41;21510:10;26578:7;26545:18;:41::i;:::-;26537:103;;;;-1:-1:-1;;;26537:103:0;;19741:2:1;26537:103:0;;;19723:21:1;19780:2;19760:18;;;19753:30;19819:34;19799:18;;;19792:62;-1:-1:-1;;;19870:18:1;;;19863:47;19927:19;;26537:103:0;19539:413:1;26537:103:0;26653:28;26663:4;26669:2;26673:7;26653:9;:28::i;36317:256::-;36414:7;36450:23;36467:5;36450:16;:23::i;:::-;36442:5;:31;36434:87;;;;-1:-1:-1;;;36434:87:0;;9723:2:1;36434:87:0;;;9705:21:1;9762:2;9742:18;;;9735:30;9801:34;9781:18;;;9774:62;9872:13;9852:18;;;9845:41;9903:19;;36434:87:0;9521:407:1;36434:87:0;-1:-1:-1;;;;;;36539:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;36317:256::o;46893:239::-;46952:4;;46965:143;46986:20;:27;46982:31;;46965:143;;;47060:5;-1:-1:-1;;;;;47033:32:0;:20;47054:1;47033:23;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;47033:23:0;:32;47029:72;;;-1:-1:-1;47087:4:0;;46893:239;-1:-1:-1;;46893:239:0:o;47029:72::-;47015:3;;;;:::i;:::-;;;;46965:143;;;-1:-1:-1;47121:5:0;;46893:239;-1:-1:-1;;46893:239:0:o;52450:95::-;43220:6;;-1:-1:-1;;;;;43220:6:0;21510:10;43367:23;43359:68;;;;-1:-1:-1;;;43359:68:0;;16732:2:1;43359:68:0;;;16714:21:1;;;16751:18;;;16744:30;-1:-1:-1;;;;;;;;;;;16790:18:1;;;16783:62;16862:18;;43359:68:0;16530:356:1;43359:68:0;52515:15:::1;:24:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;52515:24:0;;::::1;::::0;;;::::1;::::0;;52450:95::o;52701:1128::-;43220:6;;-1:-1:-1;;;;;43220:6:0;21510:10;43367:23;43359:68;;;;-1:-1:-1;;;43359:68:0;;16732:2:1;43359:68:0;;;16714:21:1;;;16751:18;;;16744:30;-1:-1:-1;;;;;;;;;;;16790:18:1;;;16783:62;16862:18;;43359:68:0;16530:356:1;43359:68:0;52889:21:::1;52942:3;52913:26;:21;52937:2;52913:26;:::i;:::-;:32;;;;:::i;:::-;52889:56:::0;-1:-1:-1;52952:21:0::1;53004:3;52976:25;:21;53000:1;52976:25;:::i;:::-;:31;;;;:::i;:::-;53116:82;::::0;52952:55;;-1:-1:-1;53103:7:0::1;::::0;53124:42:::1;::::0;53180:13;;53103:7;53116:82;53103:7;53116:82;53180:13;53124:42;53116:82:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53102:96;;;53213:2;53205:11;;;::::0;::::1;;53325:82;::::0;53312:7:::1;::::0;53333:42:::1;::::0;53389:13;;53312:7;53325:82;53312:7;53325:82;53389:13;53333:42;53325:82:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53311:96;;;53422:2;53414:11;;;::::0;::::1;;53629:90;::::0;53616:7:::1;::::0;53637:42:::1;::::0;53693:21:::1;::::0;53616:7;53629:90;53616:7;53629:90;53693:21;53637:42;53629:90:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53615:104;;;53734:2;53726:11;;;::::0;::::1;;52746:1083;;;;;52701:1128::o:0;26760:185::-;26898:39;26915:4;26921:2;26925:7;26898:39;;;;;;;;;;;;:16;:39::i;47138:348::-;47213:16;47241:23;47267:17;47277:6;47267:9;:17::i;:::-;47241:43;;47291:25;47333:15;47319:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47319:30:0;;47291:58;;47361:9;47356:103;47376:15;47372:1;:19;47356:103;;;47421:30;47441:6;47449:1;47421:19;:30::i;:::-;47407:8;47416:1;47407:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;47393:3;;;;:::i;:::-;;;;47356:103;;;-1:-1:-1;47472:8:0;47138:348;-1:-1:-1;;;47138:348:0:o;51805:80::-;43220:6;;-1:-1:-1;;;;;43220:6:0;21510:10;43367:23;43359:68;;;;-1:-1:-1;;;43359:68:0;;16732:2:1;43359:68:0;;;16714:21:1;;;16751:18;;;16744:30;-1:-1:-1;;;;;;;;;;;16790:18:1;;;16783:62;16862:18;;43359:68:0;16530:356:1;43359:68:0;51864:4:::1;:15:::0;51805:80::o;36839:233::-;36914:7;36950:30;36737:10;:17;;36649:113;36950:30;36942:5;:38;36934:95;;;;-1:-1:-1;;;36934:95:0;;20159:2:1;36934:95:0;;;20141:21:1;20198:2;20178:18;;;20171:30;20237:34;20217:18;;;20210:62;20308:14;20288:18;;;20281:42;20340:19;;36934:95:0;19957:408:1;36934:95:0;37047:10;37058:5;37047:17;;;;;;;;:::i;:::-;;;;;;;;;37040:24;;36839:233;;;:::o;52013:98::-;43220:6;;-1:-1:-1;;;;;43220:6:0;21510:10;43367:23;43359:68;;;;-1:-1:-1;;;43359:68:0;;16732:2:1;43359:68:0;;;16714:21:1;;;16751:18;;;16744:30;-1:-1:-1;;;;;;;;;;;16790:18:1;;;16783:62;16862:18;;43359:68:0;16530:356:1;43359:68:0;52084:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;23595:239::-:0;23667:7;23703:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23703:16:0;23738:19;23730:73;;;;-1:-1:-1;;;23730:73:0;;14792:2:1;23730:73:0;;;14774:21:1;14831:2;14811:18;;;14804:30;14870:34;14850:18;;;14843:62;14941:11;14921:18;;;14914:39;14970:19;;23730:73:0;14590:405:1;45022:29:0;;;;;;;:::i;44546:21::-;;;;;;;:::i;49822:153::-;49949:18;;;;:11;:18;;;;;49942:25;;49911:13;;49949:18;49942:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49822:153;;;:::o;23325:208::-;23397:7;-1:-1:-1;;;;;23425:19:0;;23417:74;;;;-1:-1:-1;;;23417:74:0;;14381:2:1;23417:74:0;;;14363:21:1;14420:2;14400:18;;;14393:30;14459:34;14439:18;;;14432:62;14530:12;14510:18;;;14503:40;14560:19;;23417:74:0;14179:406:1;23417:74:0;-1:-1:-1;;;;;;23509:16:0;;;;;:9;:16;;;;;;;23325:208::o;43798:94::-;43220:6;;-1:-1:-1;;;;;43220:6:0;21510:10;43367:23;43359:68;;;;-1:-1:-1;;;43359:68:0;;16732:2:1;43359:68:0;;;16714:21:1;;;16751:18;;;16744:30;-1:-1:-1;;;;;;;;;;;16790:18:1;;;16783:62;16862:18;;43359:68:0;16530:356:1;43359:68:0;43863:21:::1;43881:1;43863:9;:21::i;:::-;43798:94::o:0;48862:184::-;43220:6;;-1:-1:-1;;;;;43220:6:0;21510:10;43367:23;43359:68;;;;-1:-1:-1;;;43359:68:0;;16732:2:1;43359:68:0;;;16714:21:1;;;16751:18;;;16744:30;-1:-1:-1;;;;;;;;;;;16790:18:1;;;16783:62;16862:18;;43359:68:0;16530:356:1;43359:68:0;48940:13:::1;::::0;:18;48932:60:::1;;;::::0;-1:-1:-1;;;48932:60:0;;13598:2:1;48932:60:0::1;::::0;::::1;13580:21:1::0;13637:2;13617:18;;;13610:30;13676:31;13656:18;;;13649:59;13725:18;;48932:60:0::1;13396:353:1::0;48932:60:0::1;49026:12;49005:18;:33:::0;48862:184::o;51891:116::-;43220:6;;-1:-1:-1;;;;;43220:6:0;21510:10;43367:23;43359:68;;;;-1:-1:-1;;;43359:68:0;;16732:2:1;43359:68:0;;;16714:21:1;;;16751:18;;;16744:30;-1:-1:-1;;;;;;;;;;;16790:18:1;;;16783:62;16862:18;;43359:68:0;16530:356:1;43359:68:0;51968:13:::1;:33:::0;51891:116::o;50843:474::-;50900:13;50926:17;50952:3;50926:30;;50967:19;50999:4;:11;50989:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50989:22:0;;50967:44;;51027:9;51022:256;51046:4;:11;51042:1;:15;51022:256;;;51102:2;51090:4;51095:1;51090:7;;;;;;;;:::i;:::-;;;;;;;51084:20;;;;51083:48;;;51128:2;51116:4;51121:1;51116:7;;;;;;;;:::i;:::-;;;;;;;51110:20;;51083:48;51079:188;;;51177:4;51182:1;51177:7;;;;;;;;:::i;:::-;;;;;;;;;51171:14;;51188:2;51171:19;;;;:::i;:::-;51164:27;;51152:6;51159:1;51152:9;;;;;;;;:::i;:::-;;;;:39;-1:-1:-1;;;;;51152:39:0;;;;;;;;;51079:188;;;51244:4;51249:1;51244:7;;;;;;;;:::i;:::-;;;;;;;;;51232:6;51239:1;51232:9;;;;;;;;:::i;:::-;;;;:19;-1:-1:-1;;;;;51232:19:0;;;;;;;;;51079:188;51059:3;;;;:::i;:::-;;;;51022:256;;24070:104;24126:13;24159:7;24152:14;;;;;:::i;50121:714::-;50183:4;50200:14;50223:3;50200:27;;50253:1;50242;:8;:12;50238:30;;;-1:-1:-1;50263:5:0;;50121:714;-1:-1:-1;;50121:714:0:o;50238:30::-;50294:2;50283:1;:8;:13;50279:31;;;-1:-1:-1;50305:5:0;;50121:714;-1:-1:-1;;50121:714:0:o;50279:31::-;50325:1;50327;50325:4;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;;50325:4:0;-1:-1:-1;;;50325:12:0;50321:30;;;-1:-1:-1;50346:5:0;;50121:714;-1:-1:-1;;50121:714:0:o;50321:30::-;50366:1;50379;50368;:8;:12;;;;:::i;:::-;50366:15;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;;50366:15:0;-1:-1:-1;;;50366:23:0;50362:41;;;-1:-1:-1;50398:5:0;;50121:714;-1:-1:-1;;50121:714:0:o;50362:41::-;50414:15;50432:1;50434;50432:4;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;50432:4:0;;-1:-1:-1;50452:9:0;50447:359;50467:1;:8;50463:1;:12;50447:359;;;50497:11;50511:1;50513;50511:4;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;50511:4:0;;-1:-1:-1;;;;50534:12:0;;:32;;;;-1:-1:-1;;;;;;;;;;50550:16:0;;;50534:32;50530:50;;;-1:-1:-1;50575:5:0;;50121:714;-1:-1:-1;;;;;50121:714:0:o;50530:50::-;-1:-1:-1;;;;;;;;;50619:12:0;;;;;;:28;;-1:-1:-1;;;;;;;;;;50635:12:0;;;;50619:28;50617:31;:83;;;;-1:-1:-1;;;;;;;;;;50671:12:0;;;;;;:28;;-1:-1:-1;;;;;;;;;;50687:12:0;;;;50671:28;50669:31;50617:83;:119;;;;-1:-1:-1;;;;;;;;;;50723:12:0;;;50721:15;50617:119;50595:169;;;-1:-1:-1;50759:5:0;;50121:714;-1:-1:-1;;;;;50121:714:0:o;50595:169::-;50790:4;-1:-1:-1;50477:3:0;;;;:::i;:::-;;;;50447:359;;;-1:-1:-1;50823:4:0;;50121:714;-1:-1:-1;;;;50121:714:0:o;45684:1203::-;45750:6;;;;45749:7;45741:42;;;;-1:-1:-1;;;45741:42:0;;17093:2:1;45741:42:0;;;17075:21:1;17132:2;17112:18;;;17105:30;17171:24;17151:18;;;17144:52;17213:18;;45741:42:0;16891:346:1;45741:42:0;45790:14;45807:13;36737:10;:17;;36649:113;45807:13;45790:30;;45849:1;45835:11;:15;45827:55;;;;-1:-1:-1;;;45827:55:0;;21285:2:1;45827:55:0;;;21267:21:1;21324:2;21304:18;;;21297:30;21363:29;21343:18;;;21336:57;21410:18;;45827:55:0;21083:351:1;45827:55:0;45912:13;;45897:11;:28;;45889:77;;;;-1:-1:-1;;;45889:77:0;;15553:2:1;45889:77:0;;;15535:21:1;15592:2;15572:18;;;15565:30;15631:34;15611:18;;;15604:62;-1:-1:-1;;;15682:18:1;;;15675:34;15726:19;;45889:77:0;15351:400:1;45889:77:0;46005:9;;45981:20;45990:11;45981:6;:20;:::i;:::-;:33;;45973:68;;;;-1:-1:-1;;;45973:68:0;;15202:2:1;45973:68:0;;;15184:21:1;15241:2;15221:18;;;15214:30;15280:24;15260:18;;;15253:52;15322:18;;45973:68:0;15000:346:1;45973:68:0;43220:6;;-1:-1:-1;;;;;43220:6:0;46054:10;:21;46050:416;;46091:15;;;;;;;:23;;46110:4;46091:23;46088:298;;;46139:25;46153:10;46139:13;:25::i;:::-;46131:61;;;;-1:-1:-1;;;46131:61:0;;20572:2:1;46131:61:0;;;20554:21:1;20611:2;20591:18;;;20584:30;20650:25;20630:18;;;20623:53;20693:18;;46131:61:0;20370:347:1;46131:61:0;46255:10;46207:24;46234:32;;;:20;:32;;;;;;46323:18;;46289:30;46308:11;46234:32;46289:30;:::i;:::-;:52;;46281:93;;;;-1:-1:-1;;;46281:93:0;;11318:2:1;46281:93:0;;;11300:21:1;11357:2;11337:18;;;11330:30;11396;11376:18;;;11369:58;11444:18;;46281:93:0;11116:352:1;46281:93:0;46116:270;46088:298;46424:11;46417:4;;:18;;;;:::i;:::-;46404:9;:31;;46396:62;;;;-1:-1:-1;;;46396:62:0;;19394:2:1;46396:62:0;;;19376:21:1;19433:2;19413:18;;;19406:30;19472:20;19452:18;;;19445:48;19510:18;;46396:62:0;19192:342:1;46396:62:0;46491:1;46474:136;46499:11;46494:1;:16;46474:136;;46547:10;46526:32;;;;:20;:32;;;;;:34;;;;;;:::i;:::-;;;;-1:-1:-1;46569:33:0;;-1:-1:-1;46579:10:0;46591;46600:1;46591:6;:10;:::i;:::-;46569:9;:33::i;:::-;46512:3;;;;:::i;:::-;;;;46474:136;;;-1:-1:-1;46769:18:0;;:23;:55;;;;-1:-1:-1;46814:9:0;;36737:10;:17;46797:26;46769:55;46765:117;;;46862:12;46841:18;:33;45734:1153;45684:1203;:::o;25753:295::-;-1:-1:-1;;;;;25856:24:0;;21510:10;25856:24;;25848:62;;;;-1:-1:-1;;;25848:62:0;;12427:2:1;25848:62:0;;;12409:21:1;12466:2;12446:18;;;12439:30;12505:27;12485:18;;;12478:55;12550:18;;25848:62:0;12225:349:1;25848:62:0;21510:10;25923:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;25923:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;25923:53:0;;;;;;;;;;25992:48;;9245:41:1;;;25923:42:0;;21510:10;25992:48;;9218:18:1;25992:48:0;;;;;;;25753:295;;:::o;51443:65::-;43220:6;;-1:-1:-1;;;;;43220:6:0;21510:10;43367:23;43359:68;;;;-1:-1:-1;;;43359:68:0;;16732:2:1;43359:68:0;;;16714:21:1;;;16751:18;;;16744:30;-1:-1:-1;;;;;;;;;;;16790:18:1;;;16783:62;16862:18;;43359:68:0;16530:356:1;43359:68:0;51487:8:::1;:15:::0;;-1:-1:-1;;51487:15:0::1;;;::::0;;51443:65::o;27016:328::-;27191:41;21510:10;27224:7;27191:18;:41::i;:::-;27183:103;;;;-1:-1:-1;;;27183:103:0;;19741:2:1;27183:103:0;;;19723:21:1;19780:2;19760:18;;;19753:30;19819:34;19799:18;;;19792:62;-1:-1:-1;;;19870:18:1;;;19863:47;19927:19;;27183:103:0;19539:413:1;27183:103:0;27297:39;27311:4;27317:2;27321:7;27330:5;27297:13;:39::i;:::-;27016:328;;;;:::o;44900:37::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44900:37:0;;-1:-1:-1;44900:37:0;:::o;44572:::-;;;;;;;:::i;47492:493::-;28919:4;28943:16;;;:7;:16;;;;;;47590:13;;-1:-1:-1;;;;;28943:16:0;47615:97;;;;-1:-1:-1;;;47615:97:0;;17854:2:1;47615:97:0;;;17836:21:1;17893:2;17873:18;;;17866:30;17932:34;17912:18;;;17905:62;18003:17;17983:18;;;17976:45;18038:19;;47615:97:0;17652:411:1;47615:97:0;47724:8;;;;;;;47721:62;;47761:14;47754:21;;;;;:::i;47721:62::-;47791:28;47822:10;:8;:10::i;:::-;47791:41;;47877:1;47852:14;47846:28;:32;:133;;;;;;;;;;;;;;;;;47914:14;47930:18;:7;:16;:18::i;:::-;47950:13;47897:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47846:133;47839:140;47492:493;-1:-1:-1;;;47492:493:0:o;51695:104::-;43220:6;;-1:-1:-1;;;;;43220:6:0;21510:10;43367:23;43359:68;;;;-1:-1:-1;;;43359:68:0;;16732:2:1;43359:68:0;;;16714:21:1;;;16751:18;;;16744:30;-1:-1:-1;;;;;;;;;;;16790:18:1;;;16783:62;16862:18;;43359:68:0;16530:356:1;43359:68:0;51766:18:::1;:27:::0;51695:104::o;52117:122::-;43220:6;;-1:-1:-1;;;;;43220:6:0;21510:10;43367:23;43359:68;;;;-1:-1:-1;;;43359:68:0;;16732:2:1;43359:68:0;;;16714:21:1;;;16751:18;;;16744:30;-1:-1:-1;;;;;;;;;;;16790:18:1;;;16783:62;16862:18;;43359:68:0;16530:356:1;43359:68:0;52200:33;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;48061:664::-:0;48115:13;;:18;48107:60;;;;-1:-1:-1;;;48107:60:0;;13598:2:1;48107:60:0;;;13580:21:1;13637:2;13617:18;;;13610:30;13676:31;13656:18;;;13649:59;13725:18;;48107:60:0;13396:353:1;48107:60:0;48186:18;;48178:68;;;;-1:-1:-1;;;48178:68:0;;19033:2:1;48178:68:0;;;19015:21:1;;;19052:18;;;19045:30;19111:34;19091:18;;;19084:62;19163:18;;48178:68:0;18831:356:1;48178:68:0;48313:9;;48290:18;;48275:47;;48313:9;48280:29;48275:47;:::i;:::-;48259:13;:63;48473:18;;48494:3;;48458:33;;:12;:33;:::i;:::-;:39;48454:133;;;48566:9;;48545:16;48560:1;48545:12;:16;:::i;:::-;48530:45;;;48535:27;48530:45;:::i;:::-;48514:13;:61;48454:133;48638:13;;48634:84;;48689:13;;:17;;48705:1;48689:17;:::i;:::-;48673:13;:33;48061:664::o;49983:130::-;50050:4;50074:10;50085:19;50093:10;50085:7;:19::i;:::-;50074:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;49983:130;-1:-1:-1;;49983:130:0:o;52551:144::-;43220:6;;-1:-1:-1;;;;;43220:6:0;21510:10;43367:23;43359:68;;;;-1:-1:-1;;;43359:68:0;;16732:2:1;43359:68:0;;;16714:21:1;;;16751:18;;;16744:30;-1:-1:-1;;;;;;;;;;;16790:18:1;;;16783:62;16862:18;;43359:68:0;16530:356:1;43359:68:0;52626:27:::1;52633:20;;52626:27;:::i;:::-;52660:29;:20;52683:6:::0;;52660:29:::1;:::i;52245:120::-:0;43220:6;;-1:-1:-1;;;;;43220:6:0;21510:10;43367:23;43359:68;;;;-1:-1:-1;;;43359:68:0;;16732:2:1;43359:68:0;;;16714:21:1;;;16751:18;;;16744:30;-1:-1:-1;;;;;;;;;;;16790:18:1;;;16783:62;16862:18;;43359:68:0;16530:356:1;43359:68:0;52327:32;;::::1;::::0;:14:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;44047:192::-:0;43220:6;;-1:-1:-1;;;;;43220:6:0;21510:10;43367:23;43359:68;;;;-1:-1:-1;;;43359:68:0;;16732:2:1;43359:68:0;;;16714:21:1;;;16751:18;;;16744:30;-1:-1:-1;;;;;;;;;;;16790:18:1;;;16783:62;16862:18;;43359:68:0;16530:356:1;43359:68:0;-1:-1:-1;;;;;44136:22:0;::::1;44128:73;;;::::0;-1:-1:-1;;;44128:73:0;;10554:2:1;44128:73:0::1;::::0;::::1;10536:21:1::0;10593:2;10573:18;;;10566:30;10632:34;10612:18;;;10605:62;10703:8;10683:18;;;10676:36;10729:19;;44128:73:0::1;10352:402:1::0;44128:73:0::1;44212:19;44222:8;44212:9;:19::i;:::-;44047:192:::0;:::o;49164:650::-;49244:8;;;;;;;49236:56;;;;-1:-1:-1;;;49236:56:0;;12781:2:1;49236:56:0;;;12763:21:1;12820:2;12800:18;;;12793:30;12859:34;12839:18;;;12832:62;-1:-1:-1;;;12910:18:1;;;12903:33;12953:19;;49236:56:0;12579:399:1;49236:56:0;49303:13;49319:16;49327:7;49319;:16::i;:::-;49303:32;-1:-1:-1;49354:10:0;-1:-1:-1;;;;;49354:19:0;;;49346:64;;;;-1:-1:-1;;;49346:64:0;;18672:2:1;49346:64:0;;;18654:21:1;;;18691:18;;;18684:30;18750:34;18730:18;;;18723:62;18802:18;;49346:64:0;18470:356:1;49346:64:0;49429:18;49442:4;49429:12;:18::i;:::-;:26;;49451:4;49429:26;49421:57;;;;-1:-1:-1;;;49421:57:0;;11675:2:1;49421:57:0;;;11657:21:1;11714:2;11694:18;;;11687:30;11753:20;11733:18;;;11726:48;11791:18;;49421:57:0;11473:342:1;49421:57:0;49497:16;49508:4;49497:10;:16::i;:::-;:25;49489:70;;;;-1:-1:-1;;;49489:70:0;;20924:2:1;49489:70:0;;;20906:21:1;;;20943:18;;;20936:30;21002:34;20982:18;;;20975:62;21054:18;;49489:70:0;20722:356:1;49489:70:0;49611:1;49580:20;;;:11;:20;;;;;49574:34;;;;;:::i;:::-;;;:38;49570:120;;;49673:5;49648:20;;;:11;:20;;;;;49640:29;;49629:10;;49640:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:29::i;:::-;49629:41;;;;;;:::i;:::-;;;;;;;;;;;;;;:49;;;;;-1:-1:-1;;49629:49:0;;;;;;;;;49570:120;49728:4;49700:10;49711:13;49719:4;49711:7;:13::i;:::-;49700:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:32;;-1:-1:-1;;49700:32:0;;;;;;;;;;;-1:-1:-1;49743:20:0;;;:11;:20;;;;;;:27;;;;;;;;:::i;:::-;;49792:7;49786:20;49801:4;49786:20;;;;;;:::i;:::-;;;;;;;;49225:589;49164:650;;:::o;22956:305::-;23058:4;-1:-1:-1;;;;;;23095:40:0;;-1:-1:-1;;;23095:40:0;;:105;;-1:-1:-1;;;;;;;23152:48:0;;-1:-1:-1;;;23152:48:0;23095:105;:158;;;-1:-1:-1;;;;;;;;;;9083:40:0;;;23217:36;8974:157;32836:174;32911:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32911:29:0;-1:-1:-1;;;;;32911:29:0;;;;;;;;:24;;32965:23;32911:24;32965:14;:23::i;:::-;-1:-1:-1;;;;;32956:46:0;;;;;;;;;;;32836:174;;:::o;29148:348::-;29241:4;28943:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28943:16:0;29258:73;;;;-1:-1:-1;;;29258:73:0;;13185:2:1;29258:73:0;;;13167:21:1;13224:2;13204:18;;;13197:30;13263:34;13243:18;;;13236:62;-1:-1:-1;;;13314:18:1;;;13307:42;13366:19;;29258:73:0;12983:408:1;29258:73:0;29342:13;29358:23;29373:7;29358:14;:23::i;:::-;29342:39;;29411:5;-1:-1:-1;;;;;29400:16:0;:7;-1:-1:-1;;;;;29400:16:0;;:51;;;;29444:7;-1:-1:-1;;;;;29420:31:0;:20;29432:7;29420:11;:20::i;:::-;-1:-1:-1;;;;;29420:31:0;;29400:51;:87;;;-1:-1:-1;;;;;;26240:25:0;;;26216:4;26240:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;29455:32;29392:96;29148:348;-1:-1:-1;;;;29148:348:0:o;32140:578::-;32299:4;-1:-1:-1;;;;;32272:31:0;:23;32287:7;32272:14;:23::i;:::-;-1:-1:-1;;;;;32272:31:0;;32264:85;;;;-1:-1:-1;;;32264:85:0;;17444:2:1;32264:85:0;;;17426:21:1;17483:2;17463:18;;;17456:30;17522:34;17502:18;;;17495:62;17593:11;17573:18;;;17566:39;17622:19;;32264:85:0;17242:405:1;32264:85:0;-1:-1:-1;;;;;32368:16:0;;32360:65;;;;-1:-1:-1;;;32360:65:0;;12022:2:1;32360:65:0;;;12004:21:1;12061:2;12041:18;;;12034:30;12100:34;12080:18;;;12073:62;-1:-1:-1;;;12151:18:1;;;12144:34;12195:19;;32360:65:0;11820:400:1;32360:65:0;32438:39;32459:4;32465:2;32469:7;32438:20;:39::i;:::-;32542:29;32559:1;32563:7;32542:8;:29::i;:::-;-1:-1:-1;;;;;32584:15:0;;;;;;:9;:15;;;;;:20;;32603:1;;32584:15;:20;;32603:1;;32584:20;:::i;:::-;;;;-1:-1:-1;;;;;;;32615:13:0;;;;;;:9;:13;;;;;:18;;32632:1;;32615:13;:18;;32632:1;;32615:18;:::i;:::-;;;;-1:-1:-1;;32644:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32644:21:0;-1:-1:-1;;;;;32644:21:0;;;;;;;;;32683:27;;32644:16;;32683:27;;;;;;;32140:578;;;:::o;44247:173::-;44322:6;;;-1:-1:-1;;;;;44339:17:0;;;-1:-1:-1;;;;;;44339:17:0;;;;;;;44372:40;;44322:6;;;44339:17;44322:6;;44372:40;;44303:16;;44372:40;44292:128;44247:173;:::o;29838:110::-;29914:26;29924:2;29928:7;29914:26;;;;;;;;;;;;:9;:26::i;28226:315::-;28383:28;28393:4;28399:2;28403:7;28383:9;:28::i;:::-;28430:48;28453:4;28459:2;28463:7;28472:5;28430:22;:48::i;:::-;28422:111;;;;-1:-1:-1;;;28422:111:0;;10135:2:1;28422:111:0;;;10117:21:1;10174:2;10154:18;;;10147:30;10213:34;10193:18;;;10186:62;-1:-1:-1;;;10264:18:1;;;10257:48;10322:19;;28422:111:0;9933:414:1;45563:102:0;45623:13;45652:7;45645:14;;;;;:::i;9449:536::-;9505:13;9539:10;9535:53;;-1:-1:-1;;9566:10:0;;;;;;;;;;;;-1:-1:-1;;;9566:10:0;;;;;9449:536::o;9535:53::-;9613:5;9598:12;9654:78;9661:9;;9654:78;;9687:8;;;;:::i;:::-;;-1:-1:-1;9710:10:0;;-1:-1:-1;9718:2:0;9710:10;;:::i;:::-;;;9654:78;;;9742:19;9774:6;9764:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9764:17:0;;9742:39;;9792:154;9799:10;;9792:154;;9826:11;9836:1;9826:11;;:::i;:::-;;-1:-1:-1;9895:10:0;9903:2;9895:5;:10;:::i;:::-;9882:24;;:2;:24;:::i;:::-;9869:39;;9852:6;9859;9852:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;9852:56:0;;;;;;;;-1:-1:-1;9923:11:0;9932:2;9923:11;;:::i;:::-;;;9792:154;;37685:589;-1:-1:-1;;;;;37891:18:0;;37887:187;;37926:40;37958:7;39101:10;:17;;39074:24;;;;:15;:24;;;;;:44;;;39129:24;;;;;;;;;;;;38997:164;37926:40;37887:187;;;37996:2;-1:-1:-1;;;;;37988:10:0;:4;-1:-1:-1;;;;;37988:10:0;;37984:90;;38015:47;38048:4;38054:7;38015:32;:47::i;:::-;-1:-1:-1;;;;;38088:16:0;;38084:183;;38121:45;38158:7;38121:36;:45::i;38084:183::-;38194:4;-1:-1:-1;;;;;38188:10:0;:2;-1:-1:-1;;;;;38188:10:0;;38184:83;;38215:40;38243:2;38247:7;38215:27;:40::i;30175:321::-;30305:18;30311:2;30315:7;30305:5;:18::i;:::-;30356:54;30387:1;30391:2;30395:7;30404:5;30356:22;:54::i;:::-;30334:154;;;;-1:-1:-1;;;30334:154:0;;10135:2:1;30334:154:0;;;10117:21:1;10174:2;10154:18;;;10147:30;10213:34;10193:18;;;10186:62;-1:-1:-1;;;10264:18:1;;;10257:48;10322:19;;30334:154:0;9933:414:1;33575:799:0;33730:4;-1:-1:-1;;;;;33751:13:0;;12110:20;12158:8;33747:620;;33787:72;;-1:-1:-1;;;33787:72:0;;-1:-1:-1;;;;;33787:36:0;;;;;:72;;21510:10;;33838:4;;33844:7;;33853:5;;33787:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33787:72:0;;;;;;;;-1:-1:-1;;33787:72:0;;;;;;;;;;;;:::i;:::-;;;33783:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34029:13:0;;34025:272;;34072:60;;-1:-1:-1;;;34072:60:0;;10135:2:1;34072:60:0;;;10117:21:1;10174:2;10154:18;;;10147:30;10213:34;10193:18;;;10186:62;-1:-1:-1;;;10264:18:1;;;10257:48;10322:19;;34072:60:0;9933:414:1;34025:272:0;34247:6;34241:13;34232:6;34228:2;34224:15;34217:38;33783:529;-1:-1:-1;;;;;;33910:51:0;-1:-1:-1;;;33910:51:0;;-1:-1:-1;33903:58:0;;39788:988;40054:22;40104:1;40079:22;40096:4;40079:16;:22::i;:::-;:26;;;;:::i;:::-;40116:18;40137:26;;;:17;:26;;;;;;40054:51;;-1:-1:-1;40270:28:0;;;40266:328;;-1:-1:-1;;;;;40337:18:0;;40315:19;40337:18;;;:12;:18;;;;;;;;:34;;;;;;;;;40388:30;;;;;;:44;;;40505:30;;:17;:30;;;;;:43;;;40266:328;-1:-1:-1;40690:26:0;;;;:17;:26;;;;;;;;40683:33;;;-1:-1:-1;;;;;40734:18:0;;;;;:12;:18;;;;;:34;;;;;;;40727:41;39788:988::o;41071:1079::-;41349:10;:17;41324:22;;41349:21;;41369:1;;41349:21;:::i;:::-;41381:18;41402:24;;;:15;:24;;;;;;41775:10;:26;;41324:46;;-1:-1:-1;41402:24:0;;41324:46;;41775:26;;;;;;:::i;:::-;;;;;;;;;41753:48;;41839:11;41814:10;41825;41814:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;41919:28;;;:15;:28;;;;;;;:41;;;42091:24;;;;;42084:31;42126:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;41142:1008;;;41071:1079;:::o;38575:221::-;38660:14;38677:20;38694:2;38677:16;:20::i;:::-;-1:-1:-1;;;;;38708:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;38753:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;38575:221:0:o;30832:382::-;-1:-1:-1;;;;;30912:16:0;;30904:61;;;;-1:-1:-1;;;30904:61:0;;15958:2:1;30904:61:0;;;15940:21:1;;;15977:18;;;15970:30;16036:34;16016:18;;;16009:62;16088:18;;30904:61:0;15756:356:1;30904:61:0;28919:4;28943:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28943:16:0;:30;30976:58;;;;-1:-1:-1;;;30976:58:0;;10961:2:1;30976:58:0;;;10943:21:1;11000:2;10980:18;;;10973:30;11039;11019:18;;;11012:58;11087:18;;30976:58:0;10759:352:1;30976:58:0;31047:45;31076:1;31080:2;31084:7;31047:20;:45::i;:::-;-1:-1:-1;;;;;31105:13:0;;;;;;:9;:13;;;;;:18;;31122:1;;31105:13;:18;;31122:1;;31105:18;:::i;:::-;;;;-1:-1:-1;;31134:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31134:21:0;-1:-1:-1;;;;;31134:21:0;;;;;;;;31173:33;;31134:16;;;31173:33;;31134:16;;31173:33;30832:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:196::-;718:20;;-1:-1:-1;;;;;767:54:1;;757:65;;747:93;;836:1;833;826:12;747:93;650:196;;;:::o;851:160::-;916:20;;972:13;;965:21;955:32;;945:60;;1001:1;998;991:12;1016:221;1059:5;1112:3;1105:4;1097:6;1093:17;1089:27;1079:55;;1130:1;1127;1120:12;1079:55;1152:79;1227:3;1218:6;1205:20;1198:4;1190:6;1186:17;1152:79;:::i;1242:186::-;1301:6;1354:2;1342:9;1333:7;1329:23;1325:32;1322:52;;;1370:1;1367;1360:12;1322:52;1393:29;1412:9;1393:29;:::i;1433:260::-;1501:6;1509;1562:2;1550:9;1541:7;1537:23;1533:32;1530:52;;;1578:1;1575;1568:12;1530:52;1601:29;1620:9;1601:29;:::i;:::-;1591:39;;1649:38;1683:2;1672:9;1668:18;1649:38;:::i;:::-;1639:48;;1433:260;;;;;:::o;1698:328::-;1775:6;1783;1791;1844:2;1832:9;1823:7;1819:23;1815:32;1812:52;;;1860:1;1857;1850:12;1812:52;1883:29;1902:9;1883:29;:::i;:::-;1873:39;;1931:38;1965:2;1954:9;1950:18;1931:38;:::i;:::-;1921:48;;2016:2;2005:9;2001:18;1988:32;1978:42;;1698:328;;;;;:::o;2031:666::-;2126:6;2134;2142;2150;2203:3;2191:9;2182:7;2178:23;2174:33;2171:53;;;2220:1;2217;2210:12;2171:53;2243:29;2262:9;2243:29;:::i;:::-;2233:39;;2291:38;2325:2;2314:9;2310:18;2291:38;:::i;:::-;2281:48;;2376:2;2365:9;2361:18;2348:32;2338:42;;2431:2;2420:9;2416:18;2403:32;2458:18;2450:6;2447:30;2444:50;;;2490:1;2487;2480:12;2444:50;2513:22;;2566:4;2558:13;;2554:27;-1:-1:-1;2544:55:1;;2595:1;2592;2585:12;2544:55;2618:73;2683:7;2678:2;2665:16;2660:2;2656;2652:11;2618:73;:::i;:::-;2608:83;;;2031:666;;;;;;;:::o;2702:254::-;2767:6;2775;2828:2;2816:9;2807:7;2803:23;2799:32;2796:52;;;2844:1;2841;2834:12;2796:52;2867:29;2886:9;2867:29;:::i;:::-;2857:39;;2915:35;2946:2;2935:9;2931:18;2915:35;:::i;2961:254::-;3029:6;3037;3090:2;3078:9;3069:7;3065:23;3061:32;3058:52;;;3106:1;3103;3096:12;3058:52;3129:29;3148:9;3129:29;:::i;:::-;3119:39;3205:2;3190:18;;;;3177:32;;-1:-1:-1;;;2961:254:1:o;3220:615::-;3306:6;3314;3367:2;3355:9;3346:7;3342:23;3338:32;3335:52;;;3383:1;3380;3373:12;3335:52;3423:9;3410:23;3452:18;3493:2;3485:6;3482:14;3479:34;;;3509:1;3506;3499:12;3479:34;3547:6;3536:9;3532:22;3522:32;;3592:7;3585:4;3581:2;3577:13;3573:27;3563:55;;3614:1;3611;3604:12;3563:55;3654:2;3641:16;3680:2;3672:6;3669:14;3666:34;;;3696:1;3693;3686:12;3666:34;3749:7;3744:2;3734:6;3731:1;3727:14;3723:2;3719:23;3715:32;3712:45;3709:65;;;3770:1;3767;3760:12;3709:65;3801:2;3793:11;;;;;3823:6;;-1:-1:-1;3220:615:1;;-1:-1:-1;;;;3220:615:1:o;3840:180::-;3896:6;3949:2;3937:9;3928:7;3924:23;3920:32;3917:52;;;3965:1;3962;3955:12;3917:52;3988:26;4004:9;3988:26;:::i;4025:245::-;4083:6;4136:2;4124:9;4115:7;4111:23;4107:32;4104:52;;;4152:1;4149;4142:12;4104:52;4191:9;4178:23;4210:30;4234:5;4210:30;:::i;4275:249::-;4344:6;4397:2;4385:9;4376:7;4372:23;4368:32;4365:52;;;4413:1;4410;4403:12;4365:52;4445:9;4439:16;4464:30;4488:5;4464:30;:::i;4529:322::-;4598:6;4651:2;4639:9;4630:7;4626:23;4622:32;4619:52;;;4667:1;4664;4657:12;4619:52;4707:9;4694:23;4740:18;4732:6;4729:30;4726:50;;;4772:1;4769;4762:12;4726:50;4795;4837:7;4828:6;4817:9;4813:22;4795:50;:::i;4856:180::-;4915:6;4968:2;4956:9;4947:7;4943:23;4939:32;4936:52;;;4984:1;4981;4974:12;4936:52;-1:-1:-1;5007:23:1;;4856:180;-1:-1:-1;4856:180:1:o;5041:390::-;5119:6;5127;5180:2;5168:9;5159:7;5155:23;5151:32;5148:52;;;5196:1;5193;5186:12;5148:52;5232:9;5219:23;5209:33;;5293:2;5282:9;5278:18;5265:32;5320:18;5312:6;5309:30;5306:50;;;5352:1;5349;5342:12;5306:50;5375;5417:7;5408:6;5397:9;5393:22;5375:50;:::i;:::-;5365:60;;;5041:390;;;;;:::o;5436:257::-;5477:3;5515:5;5509:12;5542:6;5537:3;5530:19;5558:63;5614:6;5607:4;5602:3;5598:14;5591:4;5584:5;5580:16;5558:63;:::i;:::-;5675:2;5654:15;-1:-1:-1;;5650:29:1;5641:39;;;;5682:4;5637:50;;5436:257;-1:-1:-1;;5436:257:1:o;5698:276::-;5829:3;5867:6;5861:13;5883:53;5929:6;5924:3;5917:4;5909:6;5905:17;5883:53;:::i;:::-;5952:16;;;;;5698:276;-1:-1:-1;;5698:276:1:o;5979:1527::-;6203:3;6241:6;6235:13;6267:4;6280:51;6324:6;6319:3;6314:2;6306:6;6302:15;6280:51;:::i;:::-;6394:13;;6353:16;;;;6416:55;6394:13;6353:16;6438:15;;;6416:55;:::i;:::-;6560:13;;6493:20;;;6533:1;;6620;6642:18;;;;6695;;;;6722:93;;6800:4;6790:8;6786:19;6774:31;;6722:93;6863:2;6853:8;6850:16;6830:18;6827:40;6824:167;;;-1:-1:-1;;;6890:33:1;;6946:4;6943:1;6936:15;6976:4;6897:3;6964:17;6824:167;7007:18;7034:110;;;;7158:1;7153:328;;;;7000:481;;7034:110;-1:-1:-1;;7069:24:1;;7055:39;;7114:20;;;;-1:-1:-1;7034:110:1;;7153:328;21694:1;21687:14;;;21731:4;21718:18;;7248:1;7262:169;7276:8;7273:1;7270:15;7262:169;;;7358:14;;7343:13;;;7336:37;7401:16;;;;7293:10;;7262:169;;;7266:3;;7462:8;7455:5;7451:20;7444:27;;7000:481;-1:-1:-1;7497:3:1;;5979:1527;-1:-1:-1;;;;;;;;;;;5979:1527:1:o;7952:511::-;8146:4;-1:-1:-1;;;;;8256:2:1;8248:6;8244:15;8233:9;8226:34;8308:2;8300:6;8296:15;8291:2;8280:9;8276:18;8269:43;;8348:6;8343:2;8332:9;8328:18;8321:34;8391:3;8386:2;8375:9;8371:18;8364:31;8412:45;8452:3;8441:9;8437:19;8429:6;8412:45;:::i;:::-;8404:53;7952:511;-1:-1:-1;;;;;;7952:511:1:o;8468:632::-;8639:2;8691:21;;;8761:13;;8664:18;;;8783:22;;;8610:4;;8639:2;8862:15;;;;8836:2;8821:18;;;8610:4;8905:169;8919:6;8916:1;8913:13;8905:169;;;8980:13;;8968:26;;9049:15;;;;9014:12;;;;8941:1;8934:9;8905:169;;;-1:-1:-1;9091:3:1;;8468:632;-1:-1:-1;;;;;;8468:632:1:o;9297:219::-;9446:2;9435:9;9428:21;9409:4;9466:44;9506:2;9495:9;9491:18;9483:6;9466:44;:::i;21747:128::-;21787:3;21818:1;21814:6;21811:1;21808:13;21805:39;;;21824:18;;:::i;:::-;-1:-1:-1;21860:9:1;;21747:128::o;21880:204::-;21918:3;21954:4;21951:1;21947:12;21986:4;21983:1;21979:12;22021:3;22015:4;22011:14;22006:3;22003:23;22000:49;;;22029:18;;:::i;:::-;22065:13;;21880:204;-1:-1:-1;;;21880:204:1:o;22089:120::-;22129:1;22155;22145:35;;22160:18;;:::i;:::-;-1:-1:-1;22194:9:1;;22089:120::o;22214:168::-;22254:7;22320:1;22316;22312:6;22308:14;22305:1;22302:21;22297:1;22290:9;22283:17;22279:45;22276:71;;;22327:18;;:::i;:::-;-1:-1:-1;22367:9:1;;22214:168::o;22387:125::-;22427:4;22455:1;22452;22449:8;22446:34;;;22460:18;;:::i;:::-;-1:-1:-1;22497:9:1;;22387:125::o;22517:258::-;22589:1;22599:113;22613:6;22610:1;22607:13;22599:113;;;22689:11;;;22683:18;22670:11;;;22663:39;22635:2;22628:10;22599:113;;;22730:6;22727:1;22724:13;22721:48;;;-1:-1:-1;;22765:1:1;22747:16;;22740:27;22517:258::o;22780:380::-;22859:1;22855:12;;;;22902;;;22923:61;;22977:4;22969:6;22965:17;22955:27;;22923:61;23030:2;23022:6;23019:14;22999:18;22996:38;22993:161;;;23076:10;23071:3;23067:20;23064:1;23057:31;23111:4;23108:1;23101:15;23139:4;23136:1;23129:15;22993:161;;22780:380;;;:::o;23165:135::-;23204:3;-1:-1:-1;;23225:17:1;;23222:43;;;23245:18;;:::i;:::-;-1:-1:-1;23292:1:1;23281:13;;23165:135::o;23305:112::-;23337:1;23363;23353:35;;23368:18;;:::i;:::-;-1:-1:-1;23402:9:1;;23305:112::o;23422:127::-;23483:10;23478:3;23474:20;23471:1;23464:31;23514:4;23511:1;23504:15;23538:4;23535:1;23528:15;23554:127;23615:10;23610:3;23606:20;23603:1;23596:31;23646:4;23643:1;23636:15;23670:4;23667:1;23660:15;23686:127;23747:10;23742:3;23738:20;23735:1;23728:31;23778:4;23775:1;23768:15;23802:4;23799:1;23792:15;23818:127;23879:10;23874:3;23870:20;23867:1;23860:31;23910:4;23907:1;23900:15;23934:4;23931:1;23924:15;23950:127;24011:10;24006:3;24002:20;23999:1;23992:31;24042:4;24039:1;24032:15;24066:4;24063:1;24056:15;24082:131;-1:-1:-1;;;;;;24156:32:1;;24146:43;;24136:71;;24203:1;24200;24193:12

Swarm Source

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