ETH Price: $2,431.98 (-2.34%)

Token

Nameless Jovians: Shards (NJS)
 

Overview

Max Total Supply

463 NJS

Holders

124

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
alpayda.eth
Balance
3 NJS
0xb8d7A9C4729a138Ac6fAc64E18109F2b1d48d56b
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
NamelessJoviansShards

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: jovians.sol


pragma solidity >=0.8.0;






/*
.------..------..------.
|4.--. ||0.--. ||9.--. |
| :/\: || :/\: || :/\: |
| :\/: || :\/: || :\/: |
| '--'4|| '--'0|| '--'9|
`------'`------'`------'                                                     
 */
contract NamelessJoviansShards is ERC721Enumerable, Ownable {
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdCounterRedShard;
    Counters.Counter private _tokenIdCounterBlackShard;
    Counters.Counter private _tokenIdCounterGoldShard;

    bool public onlyWhitelisted = false;
    bool public openMint = false;

    mapping (address => uint256) whitelist;
    mapping (address => uint256) addressList;


    struct ShardInfo {
        uint256 price;
        uint256 maxSupply;
        uint256 startingTokenId;
    }

    enum Color {
        Red,
        Black,
        Gold
    }

    mapping (Color => ShardInfo) shards;

    string private _contractURI;
    string public baseURI = "";

    uint256 public maxMintPerTx = 3;
    uint256 public maxMintPerWL = 3;
    uint256 public maxMintPerAddress = 6;

    bytes32 public whitelistMerkleRoot;

    constructor() ERC721("Nameless Jovians: Shards", "NJS") {
        shards[Color.Gold] = ShardInfo(0.2 ether, 808, 1);
        shards[Color.Black] = ShardInfo(0.1 ether, 808, 809);
        shards[Color.Red] = ShardInfo(.08 ether, 5793, 1617);
    }

    //-----Setters-----
    function setMaxMintPerWL(uint256 _maxMint) external onlyOwner {
        maxMintPerWL = _maxMint;
    }

    function setMaxMintPerTx(uint256 _maxMint) external onlyOwner {
        maxMintPerTx = _maxMint;
    }

    function setMaxMintPerAddress(uint256 _maxMint) external onlyOwner {
        maxMintPerAddress = _maxMint;
    }

    //Set Base URI
    function setBaseURI(string memory _newBaseURI) external onlyOwner {
        baseURI = _newBaseURI;
    }

    function setWhitelistMerkleRoot(bytes32 _merkleRoot) external onlyOwner {
        whitelistMerkleRoot = _merkleRoot;
    }

    function getInfo(Color color) private view returns (ShardInfo memory) {
        return shards[color];
    }

    function setPrice(Color color, uint256 _newPrice) external onlyOwner {
        shards[color].price = _newPrice;
    }

    function setSupply(Color color, uint256 _newSupply) external onlyOwner {
        require(_newSupply < shards[color].maxSupply, "supply cannot be greater");
        shards[color].maxSupply = _newSupply;       
    }

    //------Control-----
    function flipWhitelistedState() public onlyOwner {
        onlyWhitelisted = !onlyWhitelisted;
    }

    function flipMintState() public onlyOwner {
        openMint = !openMint;
    }

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

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: Nonexistent token");
	    string memory currentBaseURI = _baseURI();
	    return bytes(currentBaseURI).length > 0	? string(abi.encodePacked(currentBaseURI, Strings.toString(tokenId))) : "";
    }

    modifier onlyEOA() {
        require(msg.sender == tx.origin, "no contracts!!!!!");
        _;
    }

    modifier mintCompliance(Color color, uint256 quantity) {
        require(openMint, "public sale is not open");
        require(quantity <= maxMintPerTx, "too many");
        require(addressList[msg.sender] + quantity <= maxMintPerAddress, "too many");
        ShardInfo memory shard = shards[color];
        require(totalSupplyByColor(color) + quantity <= shard.maxSupply, "too many");
        require(msg.value >= shard.price * quantity, "not enough ether sent");
        _;       
    }

    modifier mintComplianceWithWL(Color color, uint256 quantity) {
        require(onlyWhitelisted, "whitelist mint is not open");
        require(whitelist[msg.sender] + quantity <= maxMintPerWL, "too many");
        ShardInfo memory shard = shards[color];
        require(totalSupplyByColor(color) + quantity <= shard.maxSupply, "too many");
        require(msg.value >= shard.price * quantity, "not enough ether sent");
        _;       
    }

    modifier isValidMerkleProof(bytes32[] calldata merkleProof, bytes32 root) {
        require(
            MerkleProof.verify(
                merkleProof,
                root,
                keccak256(abi.encodePacked(msg.sender))
            ),
            "Address does not exist in nameless"
        );
        _;
    }
    
    //---------Mint functions--------
    function mintRedShard(uint256 quantity) external payable {
        _mint(Color.Red, quantity);
    }

    function mintRedShardWhitelist(bytes32[] calldata merkleProof, uint256 quantity) external payable {
        _mintWithWL(Color.Red, quantity, merkleProof);
    }

    function mintRedShardForAddress(uint256 quantity, address receiver) external onlyOwner {
        _mintForAddress(Color.Red, quantity, receiver);
    }

    function mintBlackShard(uint256 quantity) external payable {
        _mint(Color.Black, quantity);
    }

    function mintBlackShardWhitelist(bytes32[] calldata merkleProof, uint256 quantity) external payable {
        _mintWithWL(Color.Black, quantity, merkleProof);
    }
    
    function mintBlackShardForAddress(uint256 quantity, address receiver) external onlyOwner {
        _mintForAddress(Color.Black, quantity, receiver);
    }

    function mintGoldShard(uint256 quantity) external payable {
        _mint(Color.Gold, quantity);
    }
    
    function mintGoldShardWhitelist(bytes32[] calldata merkleProof, uint256 quantity) external payable {
        _mintWithWL(Color.Gold, quantity, merkleProof);
    }
    
    function mintGoldShardForAddress(uint256 quantity, address receiver) external onlyOwner {
        _mintForAddress(Color.Gold, quantity, receiver);
    }

    function _mint(Color color, uint256 quantity) internal onlyEOA mintCompliance(color, quantity) {
        addressList[msg.sender] += quantity;
        _safeMintLoop(color, quantity, msg.sender);
    }

    function _mintWithWL(
        Color color,
        uint256 quantity,
        bytes32[] calldata merkleProof
    )
        internal
        onlyEOA
        isValidMerkleProof(merkleProof, whitelistMerkleRoot)
        mintComplianceWithWL(color, quantity)
    {
        whitelist[msg.sender] += quantity;
        _safeMintLoop(color, quantity, msg.sender);
    }
   
    function _mintForAddress(Color color, uint256 quantity, address receiver) internal onlyOwner {
        ShardInfo memory shard = shards[color];
        require(totalSupplyByColor(color) + quantity <= shard.maxSupply, "too many");
        _safeMintLoop(color, quantity, receiver);        
    }

    function _safeMintLoop(Color color, uint256 quantity, address to) internal {
        for (uint256 i = 0; i < quantity; i++) {           
            uint256 tokenId = totalSupplyByColor(color) + getInfo(color).startingTokenId;
            increaseSupplyByColor(color);
            _safeMint(to, tokenId); 
        }
    }

    function getCounter(Color color) private view returns (Counters.Counter storage) {
        if (color == Color.Gold) {
            return _tokenIdCounterGoldShard;
        }
        if (color == Color.Black) {
            return _tokenIdCounterBlackShard;
        }
        if (color == Color.Red) {
            return _tokenIdCounterRedShard;
        }
        
        revert("invalid color");        
    }

    function totalSupplyByColor(Color color) public view returns (uint) {
        return getCounter(color).current();
    }

    function increaseSupplyByColor(Color color) internal {
        getCounter(color).increment();
    }

    function maxSupplyByColor(Color color) public view returns (uint) {
        return getInfo(color).maxSupply;
    }

    function priceByColor(Color color) external view returns (uint) {
        return getInfo(color).price;
    }

    function ownerWithdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    function emergencyWithdrawAll() external onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipWhitelistedState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum NamelessJoviansShards.Color","name":"color","type":"uint8"}],"name":"maxSupplyByColor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintBlackShard","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"mintBlackShardForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintBlackShardWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintGoldShard","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"mintGoldShardForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintGoldShardWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintRedShard","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"mintRedShardForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintRedShardWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","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":"openMint","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":[],"name":"ownerWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum NamelessJoviansShards.Color","name":"color","type":"uint8"}],"name":"priceByColor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMint","type":"uint256"}],"name":"setMaxMintPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMint","type":"uint256"}],"name":"setMaxMintPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMint","type":"uint256"}],"name":"setMaxMintPerWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum NamelessJoviansShards.Color","name":"color","type":"uint8"},{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum NamelessJoviansShards.Color","name":"color","type":"uint8"},{"internalType":"uint256","name":"_newSupply","type":"uint256"}],"name":"setSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum NamelessJoviansShards.Color","name":"color","type":"uint8"}],"name":"totalSupplyByColor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"}]

600e805461ffff1916905560a06040819052600060808190526200002691601391620002f9565b506003601455600360155560066016553480156200004357600080fd5b50604080518082018252601881527f4e616d656c657373204a6f7669616e733a2053686172647300000000000000006020808301918252835180850190945260038452624e4a5360e81b908401528151919291620000a491600091620002f9565b508051620000ba906001906020840190620002f9565b505050620000d7620000d1620002a360201b60201c565b620002a7565b60408051606080820183526702c68af0bb14000082526103286020808401828152600185870181815260026000908152601180865297517f08037d7b151cc412d25674a4e66b334d9ae9d2e5517a7feaae5cdb828bf1c6285592517f08037d7b151cc412d25674a4e66b334d9ae9d2e5517a7feaae5cdb828bf1c62955517f08037d7b151cc412d25674a4e66b334d9ae9d2e5517a7feaae5cdb828bf1c62a558651808601885267016345785d8a00008152808401948552610329818901908152918352868452517f17bc176d2408558f6e4111feebc3cab4e16b63e967be91cde721f4c8a488b5525592517f17bc176d2408558f6e4111feebc3cab4e16b63e967be91cde721f4c8a488b5535591517f17bc176d2408558f6e4111feebc3cab4e16b63e967be91cde721f4c8a488b554558451928301855267011c37937e08000083526116a183820190815261065195840195865291805292909252517f4ad3b33220dddc71b994a52d72c06b10862965f7d926534c05c00fb7e819e7b755517f4ad3b33220dddc71b994a52d72c06b10862965f7d926534c05c00fb7e819e7b855517f4ad3b33220dddc71b994a52d72c06b10862965f7d926534c05c00fb7e819e7b955620003dc565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000307906200039f565b90600052602060002090601f0160209004810192826200032b576000855562000376565b82601f106200034657805160ff191683800117855562000376565b8280016001018555821562000376579182015b828111156200037657825182559160200191906001019062000359565b506200038492915062000388565b5090565b5b8082111562000384576000815560010162000389565b600181811c90821680620003b457607f821691505b60208210811415620003d657634e487b7160e01b600052602260045260246000fd5b50919050565b612e6a80620003ec6000396000f3fe6080604052600436106102ae5760003560e01c806370a0823111610175578063b669db3d116100dc578063cfd8808611610095578063e985e9c51161006f578063e985e9c5146107b7578063f2e86faa14610800578063f2fde38b14610820578063feafe0431461084057600080fd5b8063cfd8808614610779578063dd1917191461078c578063de7fcb1d146107a157600080fd5b8063b669db3d146106ba578063b88d4fde146106da578063bce6d672146106fa578063bd32fb6614610719578063c87b56dd14610739578063ccbc03a61461075957600080fd5b806395d89b411161012e57806395d89b41146106225780639c70b51214610637578063a22cb46514610651578063aa98e0c614610671578063ac23a67714610687578063b15fbd35146106a757600080fd5b806370a0823114610594578063715018a6146105b457806386eba08c146105c95780638c29eb24146105dc5780638da5cb5b146105f157806394403b8a1461060f57600080fd5b806342842e0e1161021957806359c74f29116101d257806359c74f29146104f7578063616cdb1e1461050c5780636352211e1461052c5780636a00670b1461054c5780636c0360eb1461056c5780636c426a311461058157600080fd5b806342842e0e1461044c5780634311de8f1461046c5780634f6ccce714610481578063557ed499146104a157806355f804b3146104c1578063572849c4146104e157600080fd5b80631e14d44b1161026b5780631e14d44b146103965780631ec553ce146103b657806323b872dd146103d65780632c4889e4146103f65780632f745c591461040c57806337c321c31461042c57600080fd5b806301ffc9a7146102b357806306fdde03146102e857806307a3f82d1461030a578063081812fc1461031f578063095ea7b31461035757806318160ddd14610377575b600080fd5b3480156102bf57600080fd5b506102d36102ce366004612a20565b610860565b60405190151581526020015b60405180910390f35b3480156102f457600080fd5b506102fd61088b565b6040516102df9190612b95565b61031d61031836600461298c565b61091d565b005b34801561032b57600080fd5b5061033f61033a366004612a07565b61092f565b6040516001600160a01b0390911681526020016102df565b34801561036357600080fd5b5061031d610372366004612962565b6109c9565b34801561038357600080fd5b506008545b6040519081526020016102df565b3480156103a257600080fd5b5061031d6103b1366004612a07565b610ada565b3480156103c257600080fd5b5061031d6103d1366004612ada565b610b09565b3480156103e257600080fd5b5061031d6103f136600461286e565b610b43565b34801561040257600080fd5b5061038860155481565b34801561041857600080fd5b50610388610427366004612962565b610b74565b34801561043857600080fd5b50610388610447366004612a5a565b610c0a565b34801561045857600080fd5b5061031d61046736600461286e565b610c1c565b34801561047857600080fd5b5061031d610c37565b34801561048d57600080fd5b5061038861049c366004612a07565b610c90565b3480156104ad57600080fd5b5061031d6104bc366004612ada565b610d23565b3480156104cd57600080fd5b5061031d6104dc366004612a91565b610d59565b3480156104ed57600080fd5b5061038860165481565b34801561050357600080fd5b5061031d610d96565b34801561051857600080fd5b5061031d610527366004612a07565b610ddd565b34801561053857600080fd5b5061033f610547366004612a07565b610e0c565b34801561055857600080fd5b5061031d610567366004612a75565b610e83565b34801561057857600080fd5b506102fd610eea565b61031d61058f366004612a07565b610f78565b3480156105a057600080fd5b506103886105af366004612820565b610f86565b3480156105c057600080fd5b5061031d61100d565b61031d6105d7366004612a07565b611043565b3480156105e857600080fd5b5061031d61104e565b3480156105fd57600080fd5b50600a546001600160a01b031661033f565b61031d61061d36600461298c565b61108c565b34801561062e57600080fd5b506102fd611099565b34801561064357600080fd5b50600e546102d39060ff1681565b34801561065d57600080fd5b5061031d61066c366004612926565b6110a8565b34801561067d57600080fd5b5061038860175481565b34801561069357600080fd5b506103886106a2366004612a5a565b6110b3565b61031d6106b5366004612a07565b6110c5565b3480156106c657600080fd5b5061031d6106d5366004612ada565b6110d0565b3480156106e657600080fd5b5061031d6106f53660046128aa565b611106565b34801561070657600080fd5b50600e546102d390610100900460ff1681565b34801561072557600080fd5b5061031d610734366004612a07565b61113e565b34801561074557600080fd5b506102fd610754366004612a07565b61116d565b34801561076557600080fd5b5061031d610774366004612a75565b61123a565b61031d61078736600461298c565b61132b565b34801561079857600080fd5b5061031d611338565b3480156107ad57600080fd5b5061038860145481565b3480156107c357600080fd5b506102d36107d236600461283b565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561080c57600080fd5b5061038861081b366004612a5a565b611386565b34801561082c57600080fd5b5061031d61083b366004612820565b61139b565b34801561084c57600080fd5b5061031d61085b366004612a07565b611433565b60006001600160e01b0319821663780e9d6360e01b1480610885575061088582611462565b92915050565b60606000805461089a90612d30565b80601f01602080910402602001604051908101604052809291908181526020018280546108c690612d30565b80156109135780601f106108e857610100808354040283529160200191610913565b820191906000526020600020905b8154815290600101906020018083116108f657829003601f168201915b5050505050905090565b61092a60018285856114b2565b505050565b6000818152600260205260408120546001600160a01b03166109ad5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006109d482610e0c565b9050806001600160a01b0316836001600160a01b03161415610a425760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109a4565b336001600160a01b0382161480610a5e5750610a5e81336107d2565b610ad05760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109a4565b61092a838361177e565b600a546001600160a01b03163314610b045760405162461bcd60e51b81526004016109a490612bfa565b601655565b600a546001600160a01b03163314610b335760405162461bcd60e51b81526004016109a490612bfa565b610b3f600283836117ec565b5050565b610b4d33826118ba565b610b695760405162461bcd60e51b81526004016109a490612c51565b61092a8383836119b1565b6000610b7f83610f86565b8210610be15760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016109a4565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000610c1582611b58565b5192915050565b61092a83838360405180602001604052806000815250611106565b600a546001600160a01b03163314610c615760405162461bcd60e51b81526004016109a490612bfa565b6040514790339082156108fc029083906000818181858888f19350505050158015610b3f573d6000803e3d6000fd5b6000610c9b60085490565b8210610cfe5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109a4565b60088281548110610d1157610d11612df2565b90600052602060002001549050919050565b600a546001600160a01b03163314610d4d5760405162461bcd60e51b81526004016109a490612bfa565b610b3f600083836117ec565b600a546001600160a01b03163314610d835760405162461bcd60e51b81526004016109a490612bfa565b8051610b3f9060139060208401906126e6565b600a546001600160a01b03163314610dc05760405162461bcd60e51b81526004016109a490612bfa565b600e805461ff001981166101009182900460ff1615909102179055565b600a546001600160a01b03163314610e075760405162461bcd60e51b81526004016109a490612bfa565b601455565b6000818152600260205260408120546001600160a01b0316806108855760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109a4565b600a546001600160a01b03163314610ead5760405162461bcd60e51b81526004016109a490612bfa565b8060116000846002811115610ec457610ec4612dc6565b6002811115610ed557610ed5612dc6565b81526020810191909152604001600020555050565b60138054610ef790612d30565b80601f0160208091040260200160405190810160405280929190818152602001828054610f2390612d30565b8015610f705780601f10610f4557610100808354040283529160200191610f70565b820191906000526020600020905b815481529060010190602001808311610f5357829003601f168201915b505050505081565b610f83600082611be1565b50565b60006001600160a01b038216610ff15760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109a4565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146110375760405162461bcd60e51b81526004016109a490612bfa565b6110416000611e01565b565b610f83600182611be1565b600a546001600160a01b031633146110785760405162461bcd60e51b81526004016109a490612bfa565b600e805460ff19811660ff90911615179055565b61092a60008285856114b2565b60606001805461089a90612d30565b610b3f338383611e53565b60006108856110c183611f22565b5490565b610f83600282611be1565b600a546001600160a01b031633146110fa5760405162461bcd60e51b81526004016109a490612bfa565b610b3f600183836117ec565b61111033836118ba565b61112c5760405162461bcd60e51b81526004016109a490612c51565b61113884848484611fc2565b50505050565b600a546001600160a01b031633146111685760405162461bcd60e51b81526004016109a490612bfa565b601755565b6000818152600260205260409020546060906001600160a01b03166111de5760405162461bcd60e51b815260206004820152602160248201527f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b656044820152603760f91b60648201526084016109a4565b60006111e8611ff5565b905060008151116112085760405180602001604052806000815250611233565b8061121284612004565b604051602001611223929190612b29565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146112645760405162461bcd60e51b81526004016109a490612bfa565b6011600083600281111561127a5761127a612dc6565b600281111561128b5761128b612dc6565b81526020019081526020016000206001015481106112eb5760405162461bcd60e51b815260206004820152601860248201527f737570706c792063616e6e6f742062652067726561746572000000000000000060448201526064016109a4565b806011600084600281111561130257611302612dc6565b600281111561131357611313612dc6565b81526020810191909152604001600020600101555050565b61092a60028285856114b2565b600a546001600160a01b031633146113625760405162461bcd60e51b81526004016109a490612bfa565b60405133904780156108fc02916000818181858888f1935050505061104157600080fd5b600061139182611b58565b6020015192915050565b600a546001600160a01b031633146113c55760405162461bcd60e51b81526004016109a490612bfa565b6001600160a01b03811661142a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109a4565b610f8381611e01565b600a546001600160a01b0316331461145d5760405162461bcd60e51b81526004016109a490612bfa565b601555565b60006001600160e01b031982166380ac58cd60e01b148061149357506001600160e01b03198216635b5e139f60e01b145b8061088557506301ffc9a760e01b6001600160e01b0319831614610885565b3332146114f55760405162461bcd60e51b81526020600482015260116024820152706e6f20636f6e747261637473212121212160781b60448201526064016109a4565b818160175461156c838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040516bffffffffffffffffffffffff193360601b166020820152859250603401905060405160208183030381529060405280519060200120612102565b6115c35760405162461bcd60e51b815260206004820152602260248201527f4164647265737320646f6573206e6f7420657869737420696e206e616d656c65604482015261737360f01b60648201526084016109a4565b600e548790879060ff166116195760405162461bcd60e51b815260206004820152601a60248201527f77686974656c697374206d696e74206973206e6f74206f70656e00000000000060448201526064016109a4565b601554336000908152600f6020526040902054611637908390612ca2565b11156116555760405162461bcd60e51b81526004016109a490612c2f565b60006011600084600281111561166d5761166d612dc6565b600281111561167e5761167e612dc6565b8152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201548152505090508060200151826116c6856110b3565b6116d09190612ca2565b11156116ee5760405162461bcd60e51b81526004016109a490612c2f565b80516116fb908390612cce565b3410156117425760405162461bcd60e51b81526020600482015260156024820152741b9bdd08195b9bdd59da08195d1a195c881cd95b9d605a1b60448201526064016109a4565b336000908152600f6020526040812080548b9290611761908490612ca2565b9091555061177290508a8a33612118565b50505050505050505050565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906117b382610e0c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600a546001600160a01b031633146118165760405162461bcd60e51b81526004016109a490612bfa565b60006011600085600281111561182e5761182e612dc6565b600281111561183f5761183f612dc6565b815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820154815250509050806020015183611887866110b3565b6118919190612ca2565b11156118af5760405162461bcd60e51b81526004016109a490612c2f565b611138848484612118565b6000818152600260205260408120546001600160a01b03166119335760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109a4565b600061193e83610e0c565b9050806001600160a01b0316846001600160a01b031614806119795750836001600160a01b031661196e8461092f565b6001600160a01b0316145b806119a957506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166119c482610e0c565b6001600160a01b031614611a285760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016109a4565b6001600160a01b038216611a8a5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109a4565b611a9583838361216d565b611aa060008261177e565b6001600160a01b0383166000908152600360205260408120805460019290611ac9908490612ced565b90915550506001600160a01b0382166000908152600360205260408120805460019290611af7908490612ca2565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611b7c60405180606001604052806000815260200160008152602001600081525090565b60116000836002811115611b9257611b92612dc6565b6002811115611ba357611ba3612dc6565b815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820154815250509050919050565b333214611c245760405162461bcd60e51b81526020600482015260116024820152706e6f20636f6e747261637473212121212160781b60448201526064016109a4565b600e5482908290610100900460ff16611c7f5760405162461bcd60e51b815260206004820152601760248201527f7075626c69632073616c65206973206e6f74206f70656e00000000000000000060448201526064016109a4565b601454811115611ca15760405162461bcd60e51b81526004016109a490612c2f565b60165433600090815260106020526040902054611cbf908390612ca2565b1115611cdd5760405162461bcd60e51b81526004016109a490612c2f565b600060116000846002811115611cf557611cf5612dc6565b6002811115611d0657611d06612dc6565b815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820154815250509050806020015182611d4e856110b3565b611d589190612ca2565b1115611d765760405162461bcd60e51b81526004016109a490612c2f565b8051611d83908390612cce565b341015611dca5760405162461bcd60e51b81526020600482015260156024820152741b9bdd08195b9bdd59da08195d1a195c881cd95b9d605a1b60448201526064016109a4565b3360009081526010602052604081208054869290611de9908490612ca2565b90915550611dfa9050858533612118565b5050505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611eb55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109a4565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60006002826002811115611f3857611f38612dc6565b1415611f465750600d919050565b6001826002811115611f5a57611f5a612dc6565b1415611f685750600c919050565b6000826002811115611f7c57611f7c612dc6565b1415611f8a5750600b919050565b60405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b21031b7b637b960991b60448201526064016109a4565b611fcd8484846119b1565b611fd984848484612225565b6111385760405162461bcd60e51b81526004016109a490612ba8565b60606013805461089a90612d30565b6060816120285750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612052578061203c81612d6b565b915061204b9050600a83612cba565b915061202c565b60008167ffffffffffffffff81111561206d5761206d612e08565b6040519080825280601f01601f191660200182016040528015612097576020820181803683370190505b5090505b84156119a9576120ac600183612ced565b91506120b9600a86612d86565b6120c4906030612ca2565b60f81b8183815181106120d9576120d9612df2565b60200101906001600160f81b031916908160001a9053506120fb600a86612cba565b945061209b565b60008261210f8584612332565b14949350505050565b60005b8281101561113857600061212e85611b58565b6040015161213b866110b3565b6121459190612ca2565b9050612150856123a6565b61215a83826123bb565b508061216581612d6b565b91505061211b565b6001600160a01b0383166121c8576121c381600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6121eb565b816001600160a01b0316836001600160a01b0316146121eb576121eb83826123d5565b6001600160a01b0382166122025761092a81612472565b826001600160a01b0316826001600160a01b03161461092a5761092a8282612521565b60006001600160a01b0384163b1561232757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612269903390899088908890600401612b58565b602060405180830381600087803b15801561228357600080fd5b505af19250505080156122b3575060408051601f3d908101601f191682019092526122b091810190612a3d565b60015b61230d573d8080156122e1576040519150601f19603f3d011682016040523d82523d6000602084013e6122e6565b606091505b5080516123055760405162461bcd60e51b81526004016109a490612ba8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506119a9565b506001949350505050565b600081815b845181101561239e57600085828151811061235457612354612df2565b6020026020010151905080831161237a576000838152602082905260409020925061238b565b600081815260208490526040902092505b508061239681612d6b565b915050612337565b509392505050565b610f836123b282611f22565b80546001019055565b610b3f828260405180602001604052806000815250612565565b600060016123e284610f86565b6123ec9190612ced565b60008381526007602052604090205490915080821461243f576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061248490600190612ced565b600083815260096020526040812054600880549394509092849081106124ac576124ac612df2565b9060005260206000200154905080600883815481106124cd576124cd612df2565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061250557612505612ddc565b6001900381819060005260206000200160009055905550505050565b600061252c83610f86565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b61256f8383612598565b61257c6000848484612225565b61092a5760405162461bcd60e51b81526004016109a490612ba8565b6001600160a01b0382166125ee5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109a4565b6000818152600260205260409020546001600160a01b0316156126535760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109a4565b61265f6000838361216d565b6001600160a01b0382166000908152600360205260408120805460019290612688908490612ca2565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546126f290612d30565b90600052602060002090601f016020900481019282612714576000855561275a565b82601f1061272d57805160ff191683800117855561275a565b8280016001018555821561275a579182015b8281111561275a57825182559160200191906001019061273f565b5061276692915061276a565b5090565b5b80821115612766576000815560010161276b565b600067ffffffffffffffff8084111561279a5761279a612e08565b604051601f8501601f19908116603f011681019082821181831017156127c2576127c2612e08565b816040528093508581528686860111156127db57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461280c57600080fd5b919050565b80356003811061280c57600080fd5b60006020828403121561283257600080fd5b611233826127f5565b6000806040838503121561284e57600080fd5b612857836127f5565b9150612865602084016127f5565b90509250929050565b60008060006060848603121561288357600080fd5b61288c846127f5565b925061289a602085016127f5565b9150604084013590509250925092565b600080600080608085870312156128c057600080fd5b6128c9856127f5565b93506128d7602086016127f5565b925060408501359150606085013567ffffffffffffffff8111156128fa57600080fd5b8501601f8101871361290b57600080fd5b61291a8782356020840161277f565b91505092959194509250565b6000806040838503121561293957600080fd5b612942836127f5565b91506020830135801515811461295757600080fd5b809150509250929050565b6000806040838503121561297557600080fd5b61297e836127f5565b946020939093013593505050565b6000806000604084860312156129a157600080fd5b833567ffffffffffffffff808211156129b957600080fd5b818601915086601f8301126129cd57600080fd5b8135818111156129dc57600080fd5b8760208260051b85010111156129f157600080fd5b6020928301989097509590910135949350505050565b600060208284031215612a1957600080fd5b5035919050565b600060208284031215612a3257600080fd5b813561123381612e1e565b600060208284031215612a4f57600080fd5b815161123381612e1e565b600060208284031215612a6c57600080fd5b61123382612811565b60008060408385031215612a8857600080fd5b61297e83612811565b600060208284031215612aa357600080fd5b813567ffffffffffffffff811115612aba57600080fd5b8201601f81018413612acb57600080fd5b6119a98482356020840161277f565b60008060408385031215612aed57600080fd5b82359150612865602084016127f5565b60008151808452612b15816020860160208601612d04565b601f01601f19169290920160200192915050565b60008351612b3b818460208801612d04565b835190830190612b4f818360208801612d04565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b8b90830184612afd565b9695505050505050565b6020815260006112336020830184612afd565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825260089082015267746f6f206d616e7960c01b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612cb557612cb5612d9a565b500190565b600082612cc957612cc9612db0565b500490565b6000816000190483118215151615612ce857612ce8612d9a565b500290565b600082821015612cff57612cff612d9a565b500390565b60005b83811015612d1f578181015183820152602001612d07565b838111156111385750506000910152565b600181811c90821680612d4457607f821691505b60208210811415612d6557634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612d7f57612d7f612d9a565b5060010190565b600082612d9557612d95612db0565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610f8357600080fdfea26469706673582212204b46c98a332b37d73d86a37504cf4b5f72c8a0e5bc531089208447d2b638172164736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102ae5760003560e01c806370a0823111610175578063b669db3d116100dc578063cfd8808611610095578063e985e9c51161006f578063e985e9c5146107b7578063f2e86faa14610800578063f2fde38b14610820578063feafe0431461084057600080fd5b8063cfd8808614610779578063dd1917191461078c578063de7fcb1d146107a157600080fd5b8063b669db3d146106ba578063b88d4fde146106da578063bce6d672146106fa578063bd32fb6614610719578063c87b56dd14610739578063ccbc03a61461075957600080fd5b806395d89b411161012e57806395d89b41146106225780639c70b51214610637578063a22cb46514610651578063aa98e0c614610671578063ac23a67714610687578063b15fbd35146106a757600080fd5b806370a0823114610594578063715018a6146105b457806386eba08c146105c95780638c29eb24146105dc5780638da5cb5b146105f157806394403b8a1461060f57600080fd5b806342842e0e1161021957806359c74f29116101d257806359c74f29146104f7578063616cdb1e1461050c5780636352211e1461052c5780636a00670b1461054c5780636c0360eb1461056c5780636c426a311461058157600080fd5b806342842e0e1461044c5780634311de8f1461046c5780634f6ccce714610481578063557ed499146104a157806355f804b3146104c1578063572849c4146104e157600080fd5b80631e14d44b1161026b5780631e14d44b146103965780631ec553ce146103b657806323b872dd146103d65780632c4889e4146103f65780632f745c591461040c57806337c321c31461042c57600080fd5b806301ffc9a7146102b357806306fdde03146102e857806307a3f82d1461030a578063081812fc1461031f578063095ea7b31461035757806318160ddd14610377575b600080fd5b3480156102bf57600080fd5b506102d36102ce366004612a20565b610860565b60405190151581526020015b60405180910390f35b3480156102f457600080fd5b506102fd61088b565b6040516102df9190612b95565b61031d61031836600461298c565b61091d565b005b34801561032b57600080fd5b5061033f61033a366004612a07565b61092f565b6040516001600160a01b0390911681526020016102df565b34801561036357600080fd5b5061031d610372366004612962565b6109c9565b34801561038357600080fd5b506008545b6040519081526020016102df565b3480156103a257600080fd5b5061031d6103b1366004612a07565b610ada565b3480156103c257600080fd5b5061031d6103d1366004612ada565b610b09565b3480156103e257600080fd5b5061031d6103f136600461286e565b610b43565b34801561040257600080fd5b5061038860155481565b34801561041857600080fd5b50610388610427366004612962565b610b74565b34801561043857600080fd5b50610388610447366004612a5a565b610c0a565b34801561045857600080fd5b5061031d61046736600461286e565b610c1c565b34801561047857600080fd5b5061031d610c37565b34801561048d57600080fd5b5061038861049c366004612a07565b610c90565b3480156104ad57600080fd5b5061031d6104bc366004612ada565b610d23565b3480156104cd57600080fd5b5061031d6104dc366004612a91565b610d59565b3480156104ed57600080fd5b5061038860165481565b34801561050357600080fd5b5061031d610d96565b34801561051857600080fd5b5061031d610527366004612a07565b610ddd565b34801561053857600080fd5b5061033f610547366004612a07565b610e0c565b34801561055857600080fd5b5061031d610567366004612a75565b610e83565b34801561057857600080fd5b506102fd610eea565b61031d61058f366004612a07565b610f78565b3480156105a057600080fd5b506103886105af366004612820565b610f86565b3480156105c057600080fd5b5061031d61100d565b61031d6105d7366004612a07565b611043565b3480156105e857600080fd5b5061031d61104e565b3480156105fd57600080fd5b50600a546001600160a01b031661033f565b61031d61061d36600461298c565b61108c565b34801561062e57600080fd5b506102fd611099565b34801561064357600080fd5b50600e546102d39060ff1681565b34801561065d57600080fd5b5061031d61066c366004612926565b6110a8565b34801561067d57600080fd5b5061038860175481565b34801561069357600080fd5b506103886106a2366004612a5a565b6110b3565b61031d6106b5366004612a07565b6110c5565b3480156106c657600080fd5b5061031d6106d5366004612ada565b6110d0565b3480156106e657600080fd5b5061031d6106f53660046128aa565b611106565b34801561070657600080fd5b50600e546102d390610100900460ff1681565b34801561072557600080fd5b5061031d610734366004612a07565b61113e565b34801561074557600080fd5b506102fd610754366004612a07565b61116d565b34801561076557600080fd5b5061031d610774366004612a75565b61123a565b61031d61078736600461298c565b61132b565b34801561079857600080fd5b5061031d611338565b3480156107ad57600080fd5b5061038860145481565b3480156107c357600080fd5b506102d36107d236600461283b565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561080c57600080fd5b5061038861081b366004612a5a565b611386565b34801561082c57600080fd5b5061031d61083b366004612820565b61139b565b34801561084c57600080fd5b5061031d61085b366004612a07565b611433565b60006001600160e01b0319821663780e9d6360e01b1480610885575061088582611462565b92915050565b60606000805461089a90612d30565b80601f01602080910402602001604051908101604052809291908181526020018280546108c690612d30565b80156109135780601f106108e857610100808354040283529160200191610913565b820191906000526020600020905b8154815290600101906020018083116108f657829003601f168201915b5050505050905090565b61092a60018285856114b2565b505050565b6000818152600260205260408120546001600160a01b03166109ad5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006109d482610e0c565b9050806001600160a01b0316836001600160a01b03161415610a425760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109a4565b336001600160a01b0382161480610a5e5750610a5e81336107d2565b610ad05760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109a4565b61092a838361177e565b600a546001600160a01b03163314610b045760405162461bcd60e51b81526004016109a490612bfa565b601655565b600a546001600160a01b03163314610b335760405162461bcd60e51b81526004016109a490612bfa565b610b3f600283836117ec565b5050565b610b4d33826118ba565b610b695760405162461bcd60e51b81526004016109a490612c51565b61092a8383836119b1565b6000610b7f83610f86565b8210610be15760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016109a4565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000610c1582611b58565b5192915050565b61092a83838360405180602001604052806000815250611106565b600a546001600160a01b03163314610c615760405162461bcd60e51b81526004016109a490612bfa565b6040514790339082156108fc029083906000818181858888f19350505050158015610b3f573d6000803e3d6000fd5b6000610c9b60085490565b8210610cfe5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109a4565b60088281548110610d1157610d11612df2565b90600052602060002001549050919050565b600a546001600160a01b03163314610d4d5760405162461bcd60e51b81526004016109a490612bfa565b610b3f600083836117ec565b600a546001600160a01b03163314610d835760405162461bcd60e51b81526004016109a490612bfa565b8051610b3f9060139060208401906126e6565b600a546001600160a01b03163314610dc05760405162461bcd60e51b81526004016109a490612bfa565b600e805461ff001981166101009182900460ff1615909102179055565b600a546001600160a01b03163314610e075760405162461bcd60e51b81526004016109a490612bfa565b601455565b6000818152600260205260408120546001600160a01b0316806108855760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109a4565b600a546001600160a01b03163314610ead5760405162461bcd60e51b81526004016109a490612bfa565b8060116000846002811115610ec457610ec4612dc6565b6002811115610ed557610ed5612dc6565b81526020810191909152604001600020555050565b60138054610ef790612d30565b80601f0160208091040260200160405190810160405280929190818152602001828054610f2390612d30565b8015610f705780601f10610f4557610100808354040283529160200191610f70565b820191906000526020600020905b815481529060010190602001808311610f5357829003601f168201915b505050505081565b610f83600082611be1565b50565b60006001600160a01b038216610ff15760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109a4565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146110375760405162461bcd60e51b81526004016109a490612bfa565b6110416000611e01565b565b610f83600182611be1565b600a546001600160a01b031633146110785760405162461bcd60e51b81526004016109a490612bfa565b600e805460ff19811660ff90911615179055565b61092a60008285856114b2565b60606001805461089a90612d30565b610b3f338383611e53565b60006108856110c183611f22565b5490565b610f83600282611be1565b600a546001600160a01b031633146110fa5760405162461bcd60e51b81526004016109a490612bfa565b610b3f600183836117ec565b61111033836118ba565b61112c5760405162461bcd60e51b81526004016109a490612c51565b61113884848484611fc2565b50505050565b600a546001600160a01b031633146111685760405162461bcd60e51b81526004016109a490612bfa565b601755565b6000818152600260205260409020546060906001600160a01b03166111de5760405162461bcd60e51b815260206004820152602160248201527f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b656044820152603760f91b60648201526084016109a4565b60006111e8611ff5565b905060008151116112085760405180602001604052806000815250611233565b8061121284612004565b604051602001611223929190612b29565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146112645760405162461bcd60e51b81526004016109a490612bfa565b6011600083600281111561127a5761127a612dc6565b600281111561128b5761128b612dc6565b81526020019081526020016000206001015481106112eb5760405162461bcd60e51b815260206004820152601860248201527f737570706c792063616e6e6f742062652067726561746572000000000000000060448201526064016109a4565b806011600084600281111561130257611302612dc6565b600281111561131357611313612dc6565b81526020810191909152604001600020600101555050565b61092a60028285856114b2565b600a546001600160a01b031633146113625760405162461bcd60e51b81526004016109a490612bfa565b60405133904780156108fc02916000818181858888f1935050505061104157600080fd5b600061139182611b58565b6020015192915050565b600a546001600160a01b031633146113c55760405162461bcd60e51b81526004016109a490612bfa565b6001600160a01b03811661142a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109a4565b610f8381611e01565b600a546001600160a01b0316331461145d5760405162461bcd60e51b81526004016109a490612bfa565b601555565b60006001600160e01b031982166380ac58cd60e01b148061149357506001600160e01b03198216635b5e139f60e01b145b8061088557506301ffc9a760e01b6001600160e01b0319831614610885565b3332146114f55760405162461bcd60e51b81526020600482015260116024820152706e6f20636f6e747261637473212121212160781b60448201526064016109a4565b818160175461156c838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040516bffffffffffffffffffffffff193360601b166020820152859250603401905060405160208183030381529060405280519060200120612102565b6115c35760405162461bcd60e51b815260206004820152602260248201527f4164647265737320646f6573206e6f7420657869737420696e206e616d656c65604482015261737360f01b60648201526084016109a4565b600e548790879060ff166116195760405162461bcd60e51b815260206004820152601a60248201527f77686974656c697374206d696e74206973206e6f74206f70656e00000000000060448201526064016109a4565b601554336000908152600f6020526040902054611637908390612ca2565b11156116555760405162461bcd60e51b81526004016109a490612c2f565b60006011600084600281111561166d5761166d612dc6565b600281111561167e5761167e612dc6565b8152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201548152505090508060200151826116c6856110b3565b6116d09190612ca2565b11156116ee5760405162461bcd60e51b81526004016109a490612c2f565b80516116fb908390612cce565b3410156117425760405162461bcd60e51b81526020600482015260156024820152741b9bdd08195b9bdd59da08195d1a195c881cd95b9d605a1b60448201526064016109a4565b336000908152600f6020526040812080548b9290611761908490612ca2565b9091555061177290508a8a33612118565b50505050505050505050565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906117b382610e0c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600a546001600160a01b031633146118165760405162461bcd60e51b81526004016109a490612bfa565b60006011600085600281111561182e5761182e612dc6565b600281111561183f5761183f612dc6565b815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820154815250509050806020015183611887866110b3565b6118919190612ca2565b11156118af5760405162461bcd60e51b81526004016109a490612c2f565b611138848484612118565b6000818152600260205260408120546001600160a01b03166119335760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109a4565b600061193e83610e0c565b9050806001600160a01b0316846001600160a01b031614806119795750836001600160a01b031661196e8461092f565b6001600160a01b0316145b806119a957506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166119c482610e0c565b6001600160a01b031614611a285760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016109a4565b6001600160a01b038216611a8a5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109a4565b611a9583838361216d565b611aa060008261177e565b6001600160a01b0383166000908152600360205260408120805460019290611ac9908490612ced565b90915550506001600160a01b0382166000908152600360205260408120805460019290611af7908490612ca2565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611b7c60405180606001604052806000815260200160008152602001600081525090565b60116000836002811115611b9257611b92612dc6565b6002811115611ba357611ba3612dc6565b815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820154815250509050919050565b333214611c245760405162461bcd60e51b81526020600482015260116024820152706e6f20636f6e747261637473212121212160781b60448201526064016109a4565b600e5482908290610100900460ff16611c7f5760405162461bcd60e51b815260206004820152601760248201527f7075626c69632073616c65206973206e6f74206f70656e00000000000000000060448201526064016109a4565b601454811115611ca15760405162461bcd60e51b81526004016109a490612c2f565b60165433600090815260106020526040902054611cbf908390612ca2565b1115611cdd5760405162461bcd60e51b81526004016109a490612c2f565b600060116000846002811115611cf557611cf5612dc6565b6002811115611d0657611d06612dc6565b815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820154815250509050806020015182611d4e856110b3565b611d589190612ca2565b1115611d765760405162461bcd60e51b81526004016109a490612c2f565b8051611d83908390612cce565b341015611dca5760405162461bcd60e51b81526020600482015260156024820152741b9bdd08195b9bdd59da08195d1a195c881cd95b9d605a1b60448201526064016109a4565b3360009081526010602052604081208054869290611de9908490612ca2565b90915550611dfa9050858533612118565b5050505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611eb55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109a4565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60006002826002811115611f3857611f38612dc6565b1415611f465750600d919050565b6001826002811115611f5a57611f5a612dc6565b1415611f685750600c919050565b6000826002811115611f7c57611f7c612dc6565b1415611f8a5750600b919050565b60405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b21031b7b637b960991b60448201526064016109a4565b611fcd8484846119b1565b611fd984848484612225565b6111385760405162461bcd60e51b81526004016109a490612ba8565b60606013805461089a90612d30565b6060816120285750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612052578061203c81612d6b565b915061204b9050600a83612cba565b915061202c565b60008167ffffffffffffffff81111561206d5761206d612e08565b6040519080825280601f01601f191660200182016040528015612097576020820181803683370190505b5090505b84156119a9576120ac600183612ced565b91506120b9600a86612d86565b6120c4906030612ca2565b60f81b8183815181106120d9576120d9612df2565b60200101906001600160f81b031916908160001a9053506120fb600a86612cba565b945061209b565b60008261210f8584612332565b14949350505050565b60005b8281101561113857600061212e85611b58565b6040015161213b866110b3565b6121459190612ca2565b9050612150856123a6565b61215a83826123bb565b508061216581612d6b565b91505061211b565b6001600160a01b0383166121c8576121c381600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6121eb565b816001600160a01b0316836001600160a01b0316146121eb576121eb83826123d5565b6001600160a01b0382166122025761092a81612472565b826001600160a01b0316826001600160a01b03161461092a5761092a8282612521565b60006001600160a01b0384163b1561232757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612269903390899088908890600401612b58565b602060405180830381600087803b15801561228357600080fd5b505af19250505080156122b3575060408051601f3d908101601f191682019092526122b091810190612a3d565b60015b61230d573d8080156122e1576040519150601f19603f3d011682016040523d82523d6000602084013e6122e6565b606091505b5080516123055760405162461bcd60e51b81526004016109a490612ba8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506119a9565b506001949350505050565b600081815b845181101561239e57600085828151811061235457612354612df2565b6020026020010151905080831161237a576000838152602082905260409020925061238b565b600081815260208490526040902092505b508061239681612d6b565b915050612337565b509392505050565b610f836123b282611f22565b80546001019055565b610b3f828260405180602001604052806000815250612565565b600060016123e284610f86565b6123ec9190612ced565b60008381526007602052604090205490915080821461243f576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061248490600190612ced565b600083815260096020526040812054600880549394509092849081106124ac576124ac612df2565b9060005260206000200154905080600883815481106124cd576124cd612df2565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061250557612505612ddc565b6001900381819060005260206000200160009055905550505050565b600061252c83610f86565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b61256f8383612598565b61257c6000848484612225565b61092a5760405162461bcd60e51b81526004016109a490612ba8565b6001600160a01b0382166125ee5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109a4565b6000818152600260205260409020546001600160a01b0316156126535760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109a4565b61265f6000838361216d565b6001600160a01b0382166000908152600360205260408120805460019290612688908490612ca2565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546126f290612d30565b90600052602060002090601f016020900481019282612714576000855561275a565b82601f1061272d57805160ff191683800117855561275a565b8280016001018555821561275a579182015b8281111561275a57825182559160200191906001019061273f565b5061276692915061276a565b5090565b5b80821115612766576000815560010161276b565b600067ffffffffffffffff8084111561279a5761279a612e08565b604051601f8501601f19908116603f011681019082821181831017156127c2576127c2612e08565b816040528093508581528686860111156127db57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461280c57600080fd5b919050565b80356003811061280c57600080fd5b60006020828403121561283257600080fd5b611233826127f5565b6000806040838503121561284e57600080fd5b612857836127f5565b9150612865602084016127f5565b90509250929050565b60008060006060848603121561288357600080fd5b61288c846127f5565b925061289a602085016127f5565b9150604084013590509250925092565b600080600080608085870312156128c057600080fd5b6128c9856127f5565b93506128d7602086016127f5565b925060408501359150606085013567ffffffffffffffff8111156128fa57600080fd5b8501601f8101871361290b57600080fd5b61291a8782356020840161277f565b91505092959194509250565b6000806040838503121561293957600080fd5b612942836127f5565b91506020830135801515811461295757600080fd5b809150509250929050565b6000806040838503121561297557600080fd5b61297e836127f5565b946020939093013593505050565b6000806000604084860312156129a157600080fd5b833567ffffffffffffffff808211156129b957600080fd5b818601915086601f8301126129cd57600080fd5b8135818111156129dc57600080fd5b8760208260051b85010111156129f157600080fd5b6020928301989097509590910135949350505050565b600060208284031215612a1957600080fd5b5035919050565b600060208284031215612a3257600080fd5b813561123381612e1e565b600060208284031215612a4f57600080fd5b815161123381612e1e565b600060208284031215612a6c57600080fd5b61123382612811565b60008060408385031215612a8857600080fd5b61297e83612811565b600060208284031215612aa357600080fd5b813567ffffffffffffffff811115612aba57600080fd5b8201601f81018413612acb57600080fd5b6119a98482356020840161277f565b60008060408385031215612aed57600080fd5b82359150612865602084016127f5565b60008151808452612b15816020860160208601612d04565b601f01601f19169290920160200192915050565b60008351612b3b818460208801612d04565b835190830190612b4f818360208801612d04565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b8b90830184612afd565b9695505050505050565b6020815260006112336020830184612afd565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825260089082015267746f6f206d616e7960c01b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612cb557612cb5612d9a565b500190565b600082612cc957612cc9612db0565b500490565b6000816000190483118215151615612ce857612ce8612d9a565b500290565b600082821015612cff57612cff612d9a565b500390565b60005b83811015612d1f578181015183820152602001612d07565b838111156111385750506000910152565b600181811c90821680612d4457607f821691505b60208210811415612d6557634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612d7f57612d7f612d9a565b5060010190565b600082612d9557612d95612db0565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610f8357600080fdfea26469706673582212204b46c98a332b37d73d86a37504cf4b5f72c8a0e5bc531089208447d2b638172164736f6c63430008070033

Deployed Bytecode Sourcemap

49598:8196:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40638:224;;;;;;;;;;-1:-1:-1;40638:224:0;;;;;:::i;:::-;;:::i;:::-;;;7645:14:1;;7638:22;7620:41;;7608:2;7593:18;40638:224:0;;;;;;;;27458:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;54576:166::-;;;;;;:::i;:::-;;:::i;:::-;;29017:221;;;;;;;;;;-1:-1:-1;29017:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6943:32:1;;;6925:51;;6913:2;6898:18;29017:221:0;6779:203:1;28540:411:0;;;;;;;;;;-1:-1:-1;28540:411:0;;;;;:::i;:::-;;:::i;41278:113::-;;;;;;;;;;-1:-1:-1;41366:10:0;:17;41278:113;;;7818:25:1;;;7806:2;7791:18;41278:113:0;7672:177:1;51028:114:0;;;;;;;;;;-1:-1:-1;51028:114:0;;;;;:::i;:::-;;:::i;55210:154::-;;;;;;;;;;-1:-1:-1;55210:154:0;;;;;:::i;:::-;;:::i;29767:339::-;;;;;;;;;;-1:-1:-1;29767:339:0;;;;;:::i;:::-;;:::i;50395:31::-;;;;;;;;;;;;;;;;40946:256;;;;;;;;;;-1:-1:-1;40946:256:0;;;;;:::i;:::-;;:::i;57394:110::-;;;;;;;;;;-1:-1:-1;57394:110:0;;;;;:::i;:::-;;:::i;30177:185::-;;;;;;;;;;-1:-1:-1;30177:185:0;;;;;:::i;:::-;;:::i;57512:145::-;;;;;;;;;;;;;:::i;41468:233::-;;;;;;;;;;-1:-1:-1;41468:233:0;;;;;:::i;:::-;;:::i;54302:152::-;;;;;;;;;;-1:-1:-1;54302:152:0;;;;;:::i;:::-;;:::i;51170:106::-;;;;;;;;;;-1:-1:-1;51170:106:0;;;;;:::i;:::-;;:::i;50433:36::-;;;;;;;;;;;;;;;;52021:81;;;;;;;;;;;;;:::i;50916:104::-;;;;;;;;;;-1:-1:-1;50916:104:0;;;;;:::i;:::-;;:::i;27152:239::-;;;;;;;;;;-1:-1:-1;27152:239:0;;;;;:::i;:::-;;:::i;51533:119::-;;;;;;;;;;-1:-1:-1;51533:119:0;;;;;:::i;:::-;;:::i;50322:26::-;;;;;;;;;;;;;:::i;54022:102::-;;;;;;:::i;:::-;;:::i;26882:208::-;;;;;;;;;;-1:-1:-1;26882:208:0;;;;;:::i;:::-;;:::i;48499:103::-;;;;;;;;;;;;;:::i;54462:106::-;;;;;;:::i;:::-;;:::i;51911:102::-;;;;;;;;;;;;;:::i;47848:87::-;;;;;;;;;;-1:-1:-1;47921:6:0;;-1:-1:-1;;;;;47921:6:0;47848:87;;54132:162;;;;;;:::i;:::-;;:::i;27627:104::-;;;;;;;;;;;;;:::i;49879:35::-;;;;;;;;;;-1:-1:-1;49879:35:0;;;;;;;;29310:155;;;;;;;;;;-1:-1:-1;29310:155:0;;;;;:::i;:::-;;:::i;50478:34::-;;;;;;;;;;;;;;;;57032:121;;;;;;;;;;-1:-1:-1;57032:121:0;;;;;:::i;:::-;;:::i;54918:104::-;;;;;;:::i;:::-;;:::i;54754:156::-;;;;;;;;;;-1:-1:-1;54754:156:0;;;;;:::i;:::-;;:::i;30433:328::-;;;;;;;;;;-1:-1:-1;30433:328:0;;;;;:::i;:::-;;:::i;49921:28::-;;;;;;;;;;-1:-1:-1;49921:28:0;;;;;;;;;;;51284:124;;;;;;;;;;-1:-1:-1;51284:124:0;;;;;:::i;:::-;;:::i;52218:340::-;;;;;;;;;;-1:-1:-1;52218:340:0;;;;;:::i;:::-;;:::i;51660:217::-;;;;;;;;;;-1:-1:-1;51660:217:0;;;;;:::i;:::-;;:::i;55034:164::-;;;;;;:::i;:::-;;:::i;57665:126::-;;;;;;;;;;;;;:::i;50357:31::-;;;;;;;;;;;;;;;;29536:164;;;;;;;;;;-1:-1:-1;29536:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;29657:25:0;;;29633:4;29657:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;29536:164;57270:116;;;;;;;;;;-1:-1:-1;57270:116:0;;;;;:::i;:::-;;:::i;48757:201::-;;;;;;;;;;-1:-1:-1;48757:201:0;;;;;:::i;:::-;;:::i;50804:104::-;;;;;;;;;;-1:-1:-1;50804:104:0;;;;;:::i;:::-;;:::i;40638:224::-;40740:4;-1:-1:-1;;;;;;40764:50:0;;-1:-1:-1;;;40764:50:0;;:90;;;40818:36;40842:11;40818:23;:36::i;:::-;40757:97;40638:224;-1:-1:-1;;40638:224:0:o;27458:100::-;27512:13;27545:5;27538:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27458:100;:::o;54576:166::-;54687:47;54699:11;54712:8;54722:11;;54687;:47::i;:::-;54576:166;;;:::o;29017:221::-;29093:7;32360:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32360:16:0;29113:73;;;;-1:-1:-1;;;29113:73:0;;14560:2:1;29113:73:0;;;14542:21:1;14599:2;14579:18;;;14572:30;14638:34;14618:18;;;14611:62;-1:-1:-1;;;14689:18:1;;;14682:42;14741:19;;29113:73:0;;;;;;;;;-1:-1:-1;29206:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;29206:24:0;;29017:221::o;28540:411::-;28621:13;28637:23;28652:7;28637:14;:23::i;:::-;28621:39;;28685:5;-1:-1:-1;;;;;28679:11:0;:2;-1:-1:-1;;;;;28679:11:0;;;28671:57;;;;-1:-1:-1;;;28671:57:0;;16020:2:1;28671:57:0;;;16002:21:1;16059:2;16039:18;;;16032:30;16098:34;16078:18;;;16071:62;-1:-1:-1;;;16149:18:1;;;16142:31;16190:19;;28671:57:0;15818:397:1;28671:57:0;24972:10;-1:-1:-1;;;;;28763:21:0;;;;:62;;-1:-1:-1;28788:37:0;28805:5;24972:10;29536:164;:::i;28788:37::-;28741:168;;;;-1:-1:-1;;;28741:168:0;;12953:2:1;28741:168:0;;;12935:21:1;12992:2;12972:18;;;12965:30;13031:34;13011:18;;;13004:62;13102:26;13082:18;;;13075:54;13146:19;;28741:168:0;12751:420:1;28741:168:0;28922:21;28931:2;28935:7;28922:8;:21::i;51028:114::-;47921:6;;-1:-1:-1;;;;;47921:6:0;24972:10;48068:23;48060:68;;;;-1:-1:-1;;;48060:68:0;;;;;;;:::i;:::-;51106:17:::1;:28:::0;51028:114::o;55210:154::-;47921:6;;-1:-1:-1;;;;;47921:6:0;24972:10;48068:23;48060:68;;;;-1:-1:-1;;;48060:68:0;;;;;;;:::i;:::-;55309:47:::1;55325:10;55337:8;55347;55309:15;:47::i;:::-;55210:154:::0;;:::o;29767:339::-;29962:41;24972:10;29995:7;29962:18;:41::i;:::-;29954:103;;;;-1:-1:-1;;;29954:103:0;;;;;;;:::i;:::-;30070:28;30080:4;30086:2;30090:7;30070:9;:28::i;40946:256::-;41043:7;41079:23;41096:5;41079:16;:23::i;:::-;41071:5;:31;41063:87;;;;-1:-1:-1;;;41063:87:0;;9035:2:1;41063:87:0;;;9017:21:1;9074:2;9054:18;;;9047:30;9113:34;9093:18;;;9086:62;-1:-1:-1;;;9164:18:1;;;9157:41;9215:19;;41063:87:0;8833:407:1;41063:87:0;-1:-1:-1;;;;;;41168:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;40946:256::o;57394:110::-;57452:4;57476:14;57484:5;57476:7;:14::i;:::-;:20;;57394:110;-1:-1:-1;;57394:110:0:o;30177:185::-;30315:39;30332:4;30338:2;30342:7;30315:39;;;;;;;;;;;;:16;:39::i;57512:145::-;47921:6;;-1:-1:-1;;;;;47921:6:0;24972:10;48068:23;48060:68;;;;-1:-1:-1;;;48060:68:0;;;;;;;:::i;:::-;57612:37:::1;::::0;57580:21:::1;::::0;57620:10:::1;::::0;57612:37;::::1;;;::::0;57580:21;;57565:12:::1;57612:37:::0;57565:12;57612:37;57580:21;57620:10;57612:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;41468:233:::0;41543:7;41579:30;41366:10;:17;;41278:113;41579:30;41571:5;:38;41563:95;;;;-1:-1:-1;;;41563:95:0;;16840:2:1;41563:95:0;;;16822:21:1;16879:2;16859:18;;;16852:30;16918:34;16898:18;;;16891:62;-1:-1:-1;;;16969:18:1;;;16962:42;17021:19;;41563:95:0;16638:408:1;41563:95:0;41676:10;41687:5;41676:17;;;;;;;;:::i;:::-;;;;;;;;;41669:24;;41468:233;;;:::o;54302:152::-;47921:6;;-1:-1:-1;;;;;47921:6:0;24972:10;48068:23;48060:68;;;;-1:-1:-1;;;48060:68:0;;;;;;;:::i;:::-;54400:46:::1;54416:9;54427:8;54437;54400:15;:46::i;51170:106::-:0;47921:6;;-1:-1:-1;;;;;47921:6:0;24972:10;48068:23;48060:68;;;;-1:-1:-1;;;48060:68:0;;;;;;;:::i;:::-;51247:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;52021:81::-:0;47921:6;;-1:-1:-1;;;;;47921:6:0;24972:10;48068:23;48060:68;;;;-1:-1:-1;;;48060:68:0;;;;;;;:::i;:::-;52086:8:::1;::::0;;-1:-1:-1;;52074:20:0;::::1;52086:8;::::0;;;::::1;;;52085:9;52074:20:::0;;::::1;;::::0;;52021:81::o;50916:104::-;47921:6;;-1:-1:-1;;;;;47921:6:0;24972:10;48068:23;48060:68;;;;-1:-1:-1;;;48060:68:0;;;;;;;:::i;:::-;50989:12:::1;:23:::0;50916:104::o;27152:239::-;27224:7;27260:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27260:16:0;27295:19;27287:73;;;;-1:-1:-1;;;27287:73:0;;13789:2:1;27287:73:0;;;13771:21:1;13828:2;13808:18;;;13801:30;13867:34;13847:18;;;13840:62;-1:-1:-1;;;13918:18:1;;;13911:39;13967:19;;27287:73:0;13587:405:1;51533:119:0;47921:6;;-1:-1:-1;;;;;47921:6:0;24972:10;48068:23;48060:68;;;;-1:-1:-1;;;48060:68:0;;;;;;;:::i;:::-;51635:9:::1;51613:6;:13;51620:5;51613:13;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;51613:13:0;:31;-1:-1:-1;;51533:119:0:o;50322:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54022:102::-;54090:26;54096:9;54107:8;54090:5;:26::i;:::-;54022:102;:::o;26882:208::-;26954:7;-1:-1:-1;;;;;26982:19:0;;26974:74;;;;-1:-1:-1;;;26974:74:0;;13378:2:1;26974:74:0;;;13360:21:1;13417:2;13397:18;;;13390:30;13456:34;13436:18;;;13429:62;-1:-1:-1;;;13507:18:1;;;13500:40;13557:19;;26974:74:0;13176:406:1;26974:74:0;-1:-1:-1;;;;;;27066:16:0;;;;;:9;:16;;;;;;;26882:208::o;48499:103::-;47921:6;;-1:-1:-1;;;;;47921:6:0;24972:10;48068:23;48060:68;;;;-1:-1:-1;;;48060:68:0;;;;;;;:::i;:::-;48564:30:::1;48591:1;48564:18;:30::i;:::-;48499:103::o:0;54462:106::-;54532:28;54538:11;54551:8;54532:5;:28::i;51911:102::-;47921:6;;-1:-1:-1;;;;;47921:6:0;24972:10;48068:23;48060:68;;;;-1:-1:-1;;;48060:68:0;;;;;;;:::i;:::-;51990:15:::1;::::0;;-1:-1:-1;;51971:34:0;::::1;51990:15;::::0;;::::1;51989:16;51971:34;::::0;;51911:102::o;54132:162::-;54241:45;54253:9;54264:8;54274:11;;54241;:45::i;27627:104::-;27683:13;27716:7;27709:14;;;;;:::i;29310:155::-;29405:52;24972:10;29438:8;29448;29405:18;:52::i;57032:121::-;57094:4;57118:27;:17;57129:5;57118:10;:17::i;:::-;3353:14;;3261:114;54918:104;54987:27;54993:10;55005:8;54987:5;:27::i;54754:156::-;47921:6;;-1:-1:-1;;;;;47921:6:0;24972:10;48068:23;48060:68;;;;-1:-1:-1;;;48060:68:0;;;;;;;:::i;:::-;54854:48:::1;54870:11;54883:8;54893;54854:15;:48::i;30433:328::-:0;30608:41;24972:10;30641:7;30608:18;:41::i;:::-;30600:103;;;;-1:-1:-1;;;30600:103:0;;;;;;;:::i;:::-;30714:39;30728:4;30734:2;30738:7;30747:5;30714:13;:39::i;:::-;30433:328;;;;:::o;51284:124::-;47921:6;;-1:-1:-1;;;;;47921:6:0;24972:10;48068:23;48060:68;;;;-1:-1:-1;;;48060:68:0;;;;;;;:::i;:::-;51367:19:::1;:33:::0;51284:124::o;52218:340::-;32336:4;32360:16;;;:7;:16;;;;;;52291:13;;-1:-1:-1;;;;;32360:16:0;52317:62;;;;-1:-1:-1;;;52317:62:0;;8280:2:1;52317:62:0;;;8262:21:1;8319:2;8299:18;;;8292:30;8358:34;8338:18;;;8331:62;-1:-1:-1;;;8409:18:1;;;8402:31;8450:19;;52317:62:0;8078:397:1;52317:62:0;52387:28;52418:10;:8;:10::i;:::-;52387:41;;52474:1;52449:14;52443:28;:32;:107;;;;;;;;;;;;;;;;;52502:14;52518:25;52535:7;52518:16;:25::i;:::-;52485:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52443:107;52436:114;52218:340;-1:-1:-1;;;52218:340:0:o;51660:217::-;47921:6;;-1:-1:-1;;;;;47921:6:0;24972:10;48068:23;48060:68;;;;-1:-1:-1;;;48060:68:0;;;;;;;:::i;:::-;51763:6:::1;:13;51770:5;51763:13;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;:23;;;51750:10;:36;51742:73;;;::::0;-1:-1:-1;;;51742:73:0;;8682:2:1;51742:73:0::1;::::0;::::1;8664:21:1::0;8721:2;8701:18;;;8694:30;8760:26;8740:18;;;8733:54;8804:18;;51742:73:0::1;8480:348:1::0;51742:73:0::1;51852:10;51826:6;:13;51833:5;51826:13;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;51826:13:0;:23:::1;;:36:::0;-1:-1:-1;;51660:217:0:o;55034:164::-;55144:46;55156:10;55168:8;55178:11;;55144;:46::i;57665:126::-;47921:6;;-1:-1:-1;;;;;47921:6:0;24972:10;48068:23;48060:68;;;;-1:-1:-1;;;48060:68:0;;;;;;;:::i;:::-;57735:47:::1;::::0;57743:10:::1;::::0;57760:21:::1;57735:47:::0;::::1;;;::::0;::::1;::::0;;;57760:21;57743:10;57735:47;::::1;;;;;;57727:56;;;::::0;::::1;57270:116:::0;57330:4;57354:14;57362:5;57354:7;:14::i;:::-;:24;;;;57270:116;-1:-1:-1;;57270:116:0:o;48757:201::-;47921:6;;-1:-1:-1;;;;;47921:6:0;24972:10;48068:23;48060:68;;;;-1:-1:-1;;;48060:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48846:22:0;::::1;48838:73;;;::::0;-1:-1:-1;;;48838:73:0;;10208:2:1;48838:73:0::1;::::0;::::1;10190:21:1::0;10247:2;10227:18;;;10220:30;10286:34;10266:18;;;10259:62;-1:-1:-1;;;10337:18:1;;;10330:36;10383:19;;48838:73:0::1;10006:402:1::0;48838:73:0::1;48922:28;48941:8;48922:18;:28::i;50804:104::-:0;47921:6;;-1:-1:-1;;;;;47921:6:0;24972:10;48068:23;48060:68;;;;-1:-1:-1;;;48060:68:0;;;;;;;:::i;:::-;50877:12:::1;:23:::0;50804:104::o;26513:305::-;26615:4;-1:-1:-1;;;;;;26652:40:0;;-1:-1:-1;;;26652:40:0;;:105;;-1:-1:-1;;;;;;;26709:48:0;;-1:-1:-1;;;26709:48:0;26652:105;:158;;;-1:-1:-1;;;;;;;;;;17403:40:0;;;26774:36;17294:157;55582:372;52604:10;52618:9;52604:23;52596:53;;;;-1:-1:-1;;;52596:53:0;;17605:2:1;52596:53:0;;;17587:21:1;17644:2;17624:18;;;17617:30;-1:-1:-1;;;17663:18:1;;;17656:47;17720:18;;52596:53:0;17403:341:1;52596:53:0;55763:11:::1;;55776:19;;53745:144;53782:11;;53745:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;53845:28:0::1;::::0;-1:-1:-1;;53862:10:0::1;6219:2:1::0;6215:15;6211:53;53845:28:0::1;::::0;::::1;6199:66:1::0;53812:4:0;;-1:-1:-1;6281:12:1;;;-1:-1:-1;53845:28:0::1;;;;;;;;;;;;53835:39;;;;;;53745:18;:144::i;:::-;53723:228;;;::::0;-1:-1:-1;;;53723:228:0;;11378:2:1;53723:228:0::1;::::0;::::1;11360:21:1::0;11417:2;11397:18;;;11390:30;11456:34;11436:18;;;11429:62;-1:-1:-1;;;11507:18:1;;;11500:32;11549:19;;53723:228:0::1;11176:398:1::0;53723:228:0::1;53261:15:::2;::::0;55827:5;;55834:8;;53261:15:::2;;53253:54;;;::::0;-1:-1:-1;;;53253:54:0;;17951:2:1;53253:54:0::2;::::0;::::2;17933:21:1::0;17990:2;17970:18;;;17963:30;18029:28;18009:18;;;18002:56;18075:18;;53253:54:0::2;17749:350:1::0;53253:54:0::2;53362:12;::::0;53336:10:::2;53326:21;::::0;;;:9:::2;:21;::::0;;;;;:32:::2;::::0;53350:8;;53326:32:::2;:::i;:::-;:48;;53318:69;;;;-1:-1:-1::0;;;53318:69:0::2;;;;;;;:::i;:::-;53398:22;53423:6;:13;53430:5;53423:13;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;53398:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;53495:5;:15;;;53483:8;53455:25;53474:5;53455:18;:25::i;:::-;:36;;;;:::i;:::-;:55;;53447:76;;;;-1:-1:-1::0;;;53447:76:0::2;;;;;;;:::i;:::-;53555:11:::0;;:22:::2;::::0;53569:8;;53555:22:::2;:::i;:::-;53542:9;:35;;53534:69;;;::::0;-1:-1:-1;;;53534:69:0;;15334:2:1;53534:69:0::2;::::0;::::2;15316:21:1::0;15373:2;15353:18;;;15346:30;-1:-1:-1;;;15392:18:1;;;15385:51;15453:18;;53534:69:0::2;15132:345:1::0;53534:69:0::2;55870:10:::3;55860:21;::::0;;;:9:::3;:21;::::0;;;;:33;;55885:8;;55860:21;:33:::3;::::0;55885:8;;55860:33:::3;:::i;:::-;::::0;;;-1:-1:-1;55904:42:0::3;::::0;-1:-1:-1;55918:5:0;55925:8;55935:10:::3;55904:13;:42::i;:::-;53242:388:::2;53962:1;;52660::::1;;;55582:372:::0;;;;:::o;36417:174::-;36492:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;36492:29:0;-1:-1:-1;;;;;36492:29:0;;;;;;;;:24;;36546:23;36492:24;36546:14;:23::i;:::-;-1:-1:-1;;;;;36537:46:0;;;;;;;;;;;36417:174;;:::o;55965:296::-;47921:6;;-1:-1:-1;;;;;47921:6:0;24972:10;48068:23;48060:68;;;;-1:-1:-1;;;48060:68:0;;;;;;;:::i;:::-;56069:22:::1;56094:6;:13;56101:5;56094:13;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;56069:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;56166:5;:15;;;56154:8;56126:25;56145:5;56126:18;:25::i;:::-;:36;;;;:::i;:::-;:55;;56118:76;;;;-1:-1:-1::0;;;56118:76:0::1;;;;;;;:::i;:::-;56205:40;56219:5;56226:8;56236;56205:13;:40::i;32565:348::-:0;32658:4;32360:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32360:16:0;32675:73;;;;-1:-1:-1;;;32675:73:0;;12540:2:1;32675:73:0;;;12522:21:1;12579:2;12559:18;;;12552:30;12618:34;12598:18;;;12591:62;-1:-1:-1;;;12669:18:1;;;12662:42;12721:19;;32675:73:0;12338:408:1;32675:73:0;32759:13;32775:23;32790:7;32775:14;:23::i;:::-;32759:39;;32828:5;-1:-1:-1;;;;;32817:16:0;:7;-1:-1:-1;;;;;32817:16:0;;:51;;;;32861:7;-1:-1:-1;;;;;32837:31:0;:20;32849:7;32837:11;:20::i;:::-;-1:-1:-1;;;;;32837:31:0;;32817:51;:87;;;-1:-1:-1;;;;;;29657:25:0;;;29633:4;29657:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;32872:32;32809:96;32565:348;-1:-1:-1;;;;32565:348:0:o;35674:625::-;35833:4;-1:-1:-1;;;;;35806:31:0;:23;35821:7;35806:14;:23::i;:::-;-1:-1:-1;;;;;35806:31:0;;35798:81;;;;-1:-1:-1;;;35798:81:0;;10615:2:1;35798:81:0;;;10597:21:1;10654:2;10634:18;;;10627:30;10693:34;10673:18;;;10666:62;-1:-1:-1;;;10744:18:1;;;10737:35;10789:19;;35798:81:0;10413:401:1;35798:81:0;-1:-1:-1;;;;;35898:16:0;;35890:65;;;;-1:-1:-1;;;35890:65:0;;11781:2:1;35890:65:0;;;11763:21:1;11820:2;11800:18;;;11793:30;11859:34;11839:18;;;11832:62;-1:-1:-1;;;11910:18:1;;;11903:34;11954:19;;35890:65:0;11579:400:1;35890:65:0;35968:39;35989:4;35995:2;35999:7;35968:20;:39::i;:::-;36072:29;36089:1;36093:7;36072:8;:29::i;:::-;-1:-1:-1;;;;;36114:15:0;;;;;;:9;:15;;;;;:20;;36133:1;;36114:15;:20;;36133:1;;36114:20;:::i;:::-;;;;-1:-1:-1;;;;;;;36145:13:0;;;;;;:9;:13;;;;;:18;;36162:1;;36145:13;:18;;36162:1;;36145:18;:::i;:::-;;;;-1:-1:-1;;36174:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36174:21:0;-1:-1:-1;;;;;36174:21:0;;;;;;;;;36213:27;;36174:16;;36213:27;;;;;;;54576:166;;;:::o;51416:109::-;51468:16;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;51468:16:0;51504:6;:13;51511:5;51504:13;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;51497:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51416:109;;;:::o;55372:202::-;52604:10;52618:9;52604:23;52596:53;;;;-1:-1:-1;;;52596:53:0;;17605:2:1;52596:53:0;;;17587:21:1;17644:2;17624:18;;;17617:30;-1:-1:-1;;;17663:18:1;;;17656:47;17720:18;;52596:53:0;17403:341:1;52596:53:0;52751:8:::1;::::0;55450:5;;55457:8;;52751::::1;::::0;::::1;;;52743:44;;;::::0;-1:-1:-1;;;52743:44:0;;17253:2:1;52743:44:0::1;::::0;::::1;17235:21:1::0;17292:2;17272:18;;;17265:30;17331:25;17311:18;;;17304:53;17374:18;;52743:44:0::1;17051:347:1::0;52743:44:0::1;52818:12;;52806:8;:24;;52798:45;;;;-1:-1:-1::0;;;52798:45:0::1;;;;;;;:::i;:::-;52900:17;::::0;52874:10:::1;52862:23;::::0;;;:11:::1;:23;::::0;;;;;:34:::1;::::0;52888:8;;52862:34:::1;:::i;:::-;:55;;52854:76;;;;-1:-1:-1::0;;;52854:76:0::1;;;;;;;:::i;:::-;52941:22;52966:6;:13;52973:5;52966:13;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;52941:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;53038:5;:15;;;53026:8;52998:25;53017:5;52998:18;:25::i;:::-;:36;;;;:::i;:::-;:55;;52990:76;;;;-1:-1:-1::0;;;52990:76:0::1;;;;;;;:::i;:::-;53098:11:::0;;:22:::1;::::0;53112:8;;53098:22:::1;:::i;:::-;53085:9;:35;;53077:69;;;::::0;-1:-1:-1;;;53077:69:0;;15334:2:1;53077:69:0::1;::::0;::::1;15316:21:1::0;15373:2;15353:18;;;15346:30;-1:-1:-1;;;15392:18:1;;;15385:51;15453:18;;53077:69:0::1;15132:345:1::0;53077:69:0::1;55490:10:::2;55478:23;::::0;;;:11:::2;:23;::::0;;;;:35;;55505:8;;55478:23;:35:::2;::::0;55505:8;;55478:35:::2;:::i;:::-;::::0;;;-1:-1:-1;55524:42:0::2;::::0;-1:-1:-1;55538:5:0;55545:8;55555:10:::2;55524:13;:42::i;:::-;52732:441:::1;52660:1;;55372:202:::0;;:::o;49118:191::-;49211:6;;;-1:-1:-1;;;;;49228:17:0;;;-1:-1:-1;;;;;;49228:17:0;;;;;;;49261:40;;49211:6;;;49228:17;49211:6;;49261:40;;49192:16;;49261:40;49181:128;49118:191;:::o;36733:315::-;36888:8;-1:-1:-1;;;;;36879:17:0;:5;-1:-1:-1;;;;;36879:17:0;;;36871:55;;;;-1:-1:-1;;;36871:55:0;;12186:2:1;36871:55:0;;;12168:21:1;12225:2;12205:18;;;12198:30;12264:27;12244:18;;;12237:55;12309:18;;36871:55:0;11984:349:1;36871:55:0;-1:-1:-1;;;;;36937:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;36937:46:0;;;;;;;;;;36999:41;;7620::1;;;36999::0;;7593:18:1;36999:41:0;;;;;;;36733:315;;;:::o;56604:420::-;56659:24;56709:10;56700:5;:19;;;;;;;;:::i;:::-;;56696:83;;;-1:-1:-1;56743:24:0;;56604:420;-1:-1:-1;56604:420:0:o;56696:83::-;56802:11;56793:5;:20;;;;;;;;:::i;:::-;;56789:85;;;-1:-1:-1;56837:25:0;;56604:420;-1:-1:-1;56604:420:0:o;56789:85::-;56897:9;56888:5;:18;;;;;;;;:::i;:::-;;56884:81;;;-1:-1:-1;56930:23:0;;56604:420;-1:-1:-1;56604:420:0:o;56884:81::-;56985:23;;-1:-1:-1;;;56985:23:0;;9447:2:1;56985:23:0;;;9429:21:1;9486:2;9466:18;;;9459:30;-1:-1:-1;;;9505:18:1;;;9498:43;9558:18;;56985:23:0;9245:337:1;31643:315:0;31800:28;31810:4;31816:2;31820:7;31800:9;:28::i;:::-;31847:48;31870:4;31876:2;31880:7;31889:5;31847:22;:48::i;:::-;31839:111;;;;-1:-1:-1;;;31839:111:0;;;;;;;:::i;52110:100::-;52162:13;52195:7;52188:14;;;;;:::i;4219:723::-;4275:13;4496:10;4492:53;;-1:-1:-1;;4523:10:0;;;;;;;;;;;;-1:-1:-1;;;4523:10:0;;;;;4219:723::o;4492:53::-;4570:5;4555:12;4611:78;4618:9;;4611:78;;4644:8;;;;:::i;:::-;;-1:-1:-1;4667:10:0;;-1:-1:-1;4675:2:0;4667:10;;:::i;:::-;;;4611:78;;;4699:19;4731:6;4721:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4721:17:0;;4699:39;;4749:154;4756:10;;4749:154;;4783:11;4793:1;4783:11;;:::i;:::-;;-1:-1:-1;4852:10:0;4860:2;4852:5;:10;:::i;:::-;4839:24;;:2;:24;:::i;:::-;4826:39;;4809:6;4816;4809:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;4809:56:0;;;;;;;;-1:-1:-1;4880:11:0;4889:2;4880:11;;:::i;:::-;;;4749:154;;923:190;1048:4;1101;1072:25;1085:5;1092:4;1072:12;:25::i;:::-;:33;;923:190;-1:-1:-1;;;;923:190:0:o;56269:327::-;56360:9;56355:234;56379:8;56375:1;:12;56355:234;;;56420:15;56466:14;56474:5;56466:7;:14::i;:::-;:30;;;56438:25;56457:5;56438:18;:25::i;:::-;:58;;;;:::i;:::-;56420:76;;56511:28;56533:5;56511:21;:28::i;:::-;56554:22;56564:2;56568:7;56554:9;:22::i;:::-;-1:-1:-1;56389:3:0;;;;:::i;:::-;;;;56355:234;;42314:589;-1:-1:-1;;;;;42520:18:0;;42516:187;;42555:40;42587:7;43730:10;:17;;43703:24;;;;:15;:24;;;;;:44;;;43758:24;;;;;;;;;;;;43626:164;42555:40;42516:187;;;42625:2;-1:-1:-1;;;;;42617:10:0;:4;-1:-1:-1;;;;;42617:10:0;;42613:90;;42644:47;42677:4;42683:7;42644:32;:47::i;:::-;-1:-1:-1;;;;;42717:16:0;;42713:183;;42750:45;42787:7;42750:36;:45::i;42713:183::-;42823:4;-1:-1:-1;;;;;42817:10:0;:2;-1:-1:-1;;;;;42817:10:0;;42813:83;;42844:40;42872:2;42876:7;42844:27;:40::i;37613:799::-;37768:4;-1:-1:-1;;;;;37789:13:0;;7506:19;:23;37785:620;;37825:72;;-1:-1:-1;;;37825:72:0;;-1:-1:-1;;;;;37825:36:0;;;;;:72;;24972:10;;37876:4;;37882:7;;37891:5;;37825:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37825:72:0;;;;;;;;-1:-1:-1;;37825:72:0;;;;;;;;;;;;:::i;:::-;;;37821:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38067:13:0;;38063:272;;38110:60;;-1:-1:-1;;;38110:60:0;;;;;;;:::i;38063:272::-;38285:6;38279:13;38270:6;38266:2;38262:15;38255:38;37821:529;-1:-1:-1;;;;;;37948:51:0;-1:-1:-1;;;37948:51:0;;-1:-1:-1;37941:58:0;;37785:620;-1:-1:-1;38389:4:0;37613:799;;;;;;:::o;1475:675::-;1558:7;1601:4;1558:7;1616:497;1640:5;:12;1636:1;:16;1616:497;;;1674:20;1697:5;1703:1;1697:8;;;;;;;;:::i;:::-;;;;;;;1674:31;;1740:12;1724;:28;1720:382;;2226:13;2276:15;;;2312:4;2305:15;;;2359:4;2343:21;;1852:57;;1720:382;;;2226:13;2276:15;;;2312:4;2305:15;;;2359:4;2343:21;;2029:57;;1720:382;-1:-1:-1;1654:3:0;;;;:::i;:::-;;;;1616:497;;;-1:-1:-1;2130:12:0;1475:675;-1:-1:-1;;;1475:675:0:o;57161:101::-;57225:29;:17;57236:5;57225:10;:17::i;:::-;3472:19;;3490:1;3472:19;;;3383:127;33255:110;33331:26;33341:2;33345:7;33331:26;;;;;;;;;;;;:9;:26::i;44417:988::-;44683:22;44733:1;44708:22;44725:4;44708:16;:22::i;:::-;:26;;;;:::i;:::-;44745:18;44766:26;;;:17;:26;;;;;;44683:51;;-1:-1:-1;44899:28:0;;;44895:328;;-1:-1:-1;;;;;44966:18:0;;44944:19;44966:18;;;:12;:18;;;;;;;;:34;;;;;;;;;45017:30;;;;;;:44;;;45134:30;;:17;:30;;;;;:43;;;44895:328;-1:-1:-1;45319:26:0;;;;:17;:26;;;;;;;;45312:33;;;-1:-1:-1;;;;;45363:18:0;;;;;:12;:18;;;;;:34;;;;;;;45356:41;44417:988::o;45700:1079::-;45978:10;:17;45953:22;;45978:21;;45998:1;;45978:21;:::i;:::-;46010:18;46031:24;;;:15;:24;;;;;;46404:10;:26;;45953:46;;-1:-1:-1;46031:24:0;;45953:46;;46404:26;;;;;;:::i;:::-;;;;;;;;;46382:48;;46468:11;46443:10;46454;46443:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;46548:28;;;:15;:28;;;;;;;:41;;;46720:24;;;;;46713:31;46755:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;45771:1008;;;45700:1079;:::o;43204:221::-;43289:14;43306:20;43323:2;43306:16;:20::i;:::-;-1:-1:-1;;;;;43337:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;43382:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;43204:221:0:o;33592:321::-;33722:18;33728:2;33732:7;33722:5;:18::i;:::-;33773:54;33804:1;33808:2;33812:7;33821:5;33773:22;:54::i;:::-;33751:154;;;;-1:-1:-1;;;33751:154:0;;;;;;;:::i;34249:439::-;-1:-1:-1;;;;;34329:16:0;;34321:61;;;;-1:-1:-1;;;34321:61:0;;14199:2:1;34321:61:0;;;14181:21:1;;;14218:18;;;14211:30;14277:34;14257:18;;;14250:62;14329:18;;34321:61:0;13997:356:1;34321:61:0;32336:4;32360:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32360:16:0;:30;34393:58;;;;-1:-1:-1;;;34393:58:0;;11021:2:1;34393:58:0;;;11003:21:1;11060:2;11040:18;;;11033:30;11099;11079:18;;;11072:58;11147:18;;34393:58:0;10819:352:1;34393:58:0;34464:45;34493:1;34497:2;34501:7;34464:20;:45::i;:::-;-1:-1:-1;;;;;34522:13:0;;;;;;:9;:13;;;;;:18;;34539:1;;34522:13;:18;;34539:1;;34522:18;:::i;:::-;;;;-1:-1:-1;;34551:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34551:21:0;-1:-1:-1;;;;;34551:21:0;;;;;;;;34590:33;;34551:16;;;34590:33;;34551:16;;34590:33;55210:154;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:146::-;899:20;;948:1;938:12;;928:40;;964:1;961;954:12;979:186;1038:6;1091:2;1079:9;1070:7;1066:23;1062:32;1059:52;;;1107:1;1104;1097:12;1059:52;1130:29;1149:9;1130:29;:::i;1170:260::-;1238:6;1246;1299:2;1287:9;1278:7;1274:23;1270:32;1267:52;;;1315:1;1312;1305:12;1267:52;1338:29;1357:9;1338:29;:::i;:::-;1328:39;;1386:38;1420:2;1409:9;1405:18;1386:38;:::i;:::-;1376:48;;1170:260;;;;;:::o;1435:328::-;1512:6;1520;1528;1581:2;1569:9;1560:7;1556:23;1552:32;1549:52;;;1597:1;1594;1587:12;1549:52;1620:29;1639:9;1620:29;:::i;:::-;1610:39;;1668:38;1702:2;1691:9;1687:18;1668:38;:::i;:::-;1658:48;;1753:2;1742:9;1738:18;1725:32;1715:42;;1435:328;;;;;:::o;1768:666::-;1863:6;1871;1879;1887;1940:3;1928:9;1919:7;1915:23;1911:33;1908:53;;;1957:1;1954;1947:12;1908:53;1980:29;1999:9;1980:29;:::i;:::-;1970:39;;2028:38;2062:2;2051:9;2047:18;2028:38;:::i;:::-;2018:48;;2113:2;2102:9;2098:18;2085:32;2075:42;;2168:2;2157:9;2153:18;2140:32;2195:18;2187:6;2184:30;2181:50;;;2227:1;2224;2217:12;2181:50;2250:22;;2303:4;2295:13;;2291:27;-1:-1:-1;2281:55:1;;2332:1;2329;2322:12;2281:55;2355:73;2420:7;2415:2;2402:16;2397:2;2393;2389:11;2355:73;:::i;:::-;2345:83;;;1768:666;;;;;;;:::o;2439:347::-;2504:6;2512;2565:2;2553:9;2544:7;2540:23;2536:32;2533:52;;;2581:1;2578;2571:12;2533:52;2604:29;2623:9;2604:29;:::i;:::-;2594:39;;2683:2;2672:9;2668:18;2655:32;2730:5;2723:13;2716:21;2709:5;2706:32;2696:60;;2752:1;2749;2742:12;2696:60;2775:5;2765:15;;;2439:347;;;;;:::o;2791:254::-;2859:6;2867;2920:2;2908:9;2899:7;2895:23;2891:32;2888:52;;;2936:1;2933;2926:12;2888:52;2959:29;2978:9;2959:29;:::i;:::-;2949:39;3035:2;3020:18;;;;3007:32;;-1:-1:-1;;;2791:254:1:o;3050:689::-;3145:6;3153;3161;3214:2;3202:9;3193:7;3189:23;3185:32;3182:52;;;3230:1;3227;3220:12;3182:52;3270:9;3257:23;3299:18;3340:2;3332:6;3329:14;3326:34;;;3356:1;3353;3346:12;3326:34;3394:6;3383:9;3379:22;3369:32;;3439:7;3432:4;3428:2;3424:13;3420:27;3410:55;;3461:1;3458;3451:12;3410:55;3501:2;3488:16;3527:2;3519:6;3516:14;3513:34;;;3543:1;3540;3533:12;3513:34;3598:7;3591:4;3581:6;3578:1;3574:14;3570:2;3566:23;3562:34;3559:47;3556:67;;;3619:1;3616;3609:12;3556:67;3650:4;3642:13;;;;3674:6;;-1:-1:-1;3712:20:1;;;;3699:34;;3050:689;-1:-1:-1;;;;3050:689:1:o;3744:180::-;3803:6;3856:2;3844:9;3835:7;3831:23;3827:32;3824:52;;;3872:1;3869;3862:12;3824:52;-1:-1:-1;3895:23:1;;3744:180;-1:-1:-1;3744:180:1:o;3929:245::-;3987:6;4040:2;4028:9;4019:7;4015:23;4011:32;4008:52;;;4056:1;4053;4046:12;4008:52;4095:9;4082:23;4114:30;4138:5;4114:30;:::i;4179:249::-;4248:6;4301:2;4289:9;4280:7;4276:23;4272:32;4269:52;;;4317:1;4314;4307:12;4269:52;4349:9;4343:16;4368:30;4392:5;4368:30;:::i;4433:199::-;4502:6;4555:2;4543:9;4534:7;4530:23;4526:32;4523:52;;;4571:1;4568;4561:12;4523:52;4594:32;4616:9;4594:32;:::i;4637:267::-;4715:6;4723;4776:2;4764:9;4755:7;4751:23;4747:32;4744:52;;;4792:1;4789;4782:12;4744:52;4815:32;4837:9;4815:32;:::i;4909:450::-;4978:6;5031:2;5019:9;5010:7;5006:23;5002:32;4999:52;;;5047:1;5044;5037:12;4999:52;5087:9;5074:23;5120:18;5112:6;5109:30;5106:50;;;5152:1;5149;5142:12;5106:50;5175:22;;5228:4;5220:13;;5216:27;-1:-1:-1;5206:55:1;;5257:1;5254;5247:12;5206:55;5280:73;5345:7;5340:2;5327:16;5322:2;5318;5314:11;5280:73;:::i;5549:254::-;5617:6;5625;5678:2;5666:9;5657:7;5653:23;5649:32;5646:52;;;5694:1;5691;5684:12;5646:52;5730:9;5717:23;5707:33;;5759:38;5793:2;5782:9;5778:18;5759:38;:::i;5808:257::-;5849:3;5887:5;5881:12;5914:6;5909:3;5902:19;5930:63;5986:6;5979:4;5974:3;5970:14;5963:4;5956:5;5952:16;5930:63;:::i;:::-;6047:2;6026:15;-1:-1:-1;;6022:29:1;6013:39;;;;6054:4;6009:50;;5808:257;-1:-1:-1;;5808:257:1:o;6304:470::-;6483:3;6521:6;6515:13;6537:53;6583:6;6578:3;6571:4;6563:6;6559:17;6537:53;:::i;:::-;6653:13;;6612:16;;;;6675:57;6653:13;6612:16;6709:4;6697:17;;6675:57;:::i;:::-;6748:20;;6304:470;-1:-1:-1;;;;6304:470:1:o;6987:488::-;-1:-1:-1;;;;;7256:15:1;;;7238:34;;7308:15;;7303:2;7288:18;;7281:43;7355:2;7340:18;;7333:34;;;7403:3;7398:2;7383:18;;7376:31;;;7181:4;;7424:45;;7449:19;;7441:6;7424:45;:::i;:::-;7416:53;6987:488;-1:-1:-1;;;;;;6987:488:1:o;7854:219::-;8003:2;7992:9;7985:21;7966:4;8023:44;8063:2;8052:9;8048:18;8040:6;8023:44;:::i;9587:414::-;9789:2;9771:21;;;9828:2;9808:18;;;9801:30;9867:34;9862:2;9847:18;;9840:62;-1:-1:-1;;;9933:2:1;9918:18;;9911:48;9991:3;9976:19;;9587:414::o;14771:356::-;14973:2;14955:21;;;14992:18;;;14985:30;15051:34;15046:2;15031:18;;15024:62;15118:2;15103:18;;14771:356::o;15482:331::-;15684:2;15666:21;;;15723:1;15703:18;;;15696:29;-1:-1:-1;;;15756:2:1;15741:18;;15734:38;15804:2;15789:18;;15482:331::o;16220:413::-;16422:2;16404:21;;;16461:2;16441:18;;;16434:30;16500:34;16495:2;16480:18;;16473:62;-1:-1:-1;;;16566:2:1;16551:18;;16544:47;16623:3;16608:19;;16220:413::o;18286:128::-;18326:3;18357:1;18353:6;18350:1;18347:13;18344:39;;;18363:18;;:::i;:::-;-1:-1:-1;18399:9:1;;18286:128::o;18419:120::-;18459:1;18485;18475:35;;18490:18;;:::i;:::-;-1:-1:-1;18524:9:1;;18419:120::o;18544:168::-;18584:7;18650:1;18646;18642:6;18638:14;18635:1;18632:21;18627:1;18620:9;18613:17;18609:45;18606:71;;;18657:18;;:::i;:::-;-1:-1:-1;18697:9:1;;18544:168::o;18717:125::-;18757:4;18785:1;18782;18779:8;18776:34;;;18790:18;;:::i;:::-;-1:-1:-1;18827:9:1;;18717:125::o;18847:258::-;18919:1;18929:113;18943:6;18940:1;18937:13;18929:113;;;19019:11;;;19013:18;19000:11;;;18993:39;18965:2;18958:10;18929:113;;;19060:6;19057:1;19054:13;19051:48;;;-1:-1:-1;;19095:1:1;19077:16;;19070:27;18847:258::o;19110:380::-;19189:1;19185:12;;;;19232;;;19253:61;;19307:4;19299:6;19295:17;19285:27;;19253:61;19360:2;19352:6;19349:14;19329:18;19326:38;19323:161;;;19406:10;19401:3;19397:20;19394:1;19387:31;19441:4;19438:1;19431:15;19469:4;19466:1;19459:15;19323:161;;19110:380;;;:::o;19495:135::-;19534:3;-1:-1:-1;;19555:17:1;;19552:43;;;19575:18;;:::i;:::-;-1:-1:-1;19622:1:1;19611:13;;19495:135::o;19635:112::-;19667:1;19693;19683:35;;19698:18;;:::i;:::-;-1:-1:-1;19732:9:1;;19635:112::o;19752:127::-;19813:10;19808:3;19804:20;19801:1;19794:31;19844:4;19841:1;19834:15;19868:4;19865:1;19858:15;19884:127;19945:10;19940:3;19936:20;19933:1;19926:31;19976:4;19973:1;19966:15;20000:4;19997:1;19990:15;20016:127;20077:10;20072:3;20068:20;20065:1;20058:31;20108:4;20105:1;20098:15;20132:4;20129:1;20122:15;20148:127;20209:10;20204:3;20200:20;20197:1;20190:31;20240:4;20237:1;20230:15;20264:4;20261:1;20254:15;20280:127;20341:10;20336:3;20332:20;20329:1;20322:31;20372:4;20369:1;20362:15;20396:4;20393:1;20386:15;20412:127;20473:10;20468:3;20464:20;20461:1;20454:31;20504:4;20501:1;20494:15;20528:4;20525:1;20518:15;20544:131;-1:-1:-1;;;;;;20618:32:1;;20608:43;;20598:71;;20665:1;20662;20655:12

Swarm Source

ipfs://4b46c98a332b37d73d86a37504cf4b5f72c8a0e5bc531089208447d2b6381721
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.