ETH Price: $3,429.20 (+5.33%)
Gas: 8 Gwei

Token

The Iconic Miss Crypto Clinic (Clinic)
 

Overview

Max Total Supply

10,000 Clinic

Holders

2,181

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 Clinic
0x3BF856111223340b1b0D84265c6836776630aB1a
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:
TheClinic

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must 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 Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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



pragma solidity ^0.8.0;









/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721A is
    Context,
    ERC165,
    IERC721,
    IERC721Metadata,
    IERC721Enumerable
{
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 private currentIndex = 1;

    uint256 internal immutable collectionSize;
    uint256 internal immutable maxBatchSize;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) private _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

    /**
     * @dev
     * `maxBatchSize` refers to how much a minter can mint at a time.
     * `collectionSize_` refers to how many tokens are in the collection.
     */
    constructor(
        string memory name_,
        string memory symbol_,
        uint256 maxBatchSize_,
        uint256 collectionSize_
    ) {
        require(
            collectionSize_ > 0,
            "ERC721A: collection must have a nonzero supply"
        );
        require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
        _name = name_;
        _symbol = symbol_;
        maxBatchSize = maxBatchSize_;
        collectionSize = collectionSize_;
    }

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

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        override
        returns (uint256)
    {
        require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx = 0;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
        revert("ERC721A: unable to get token of owner by index");
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    function _numberMinted(address owner) internal view returns (uint256) {
        require(
            owner != address(0),
            "ERC721A: number minted query for the zero address"
        );
        return uint256(_addressData[owner].numberMinted);
    }

    function ownershipOf(uint256 tokenId)
        internal
        view
        returns (TokenOwnership memory)
    {
        require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

        uint256 lowestTokenToCheck;
        if (tokenId >= maxBatchSize) {
            lowestTokenToCheck = tokenId - maxBatchSize + 1;
        }

        for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (ownership.addr != address(0)) {
                return ownership;
            }
        }

        revert("ERC721A: unable to determine the owner of token");
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        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 override {
        address owner = ERC721A.ownerOf(tokenId);
        require(to != owner, "ERC721A: approval to current owner");

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721A: 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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex && tokenId > 0;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, "");
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - there must be `quantity` tokens remaining unminted in the total collection.
     * - `to` cannot be the zero address.
     * - `quantity` cannot be larger than the max batch size.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), "ERC721A: mint to the zero address");
        // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
        require(!_exists(startTokenId), "ERC721A: token already minted");
        require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        AddressData memory addressData = _addressData[to];
        _addressData[to] = AddressData(
            addressData.balance + uint128(quantity),
            addressData.numberMinted + uint128(quantity)
        );
        _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

        uint256 updatedIndex = startTokenId;

        for (uint256 i = 0; i < quantity; i++) {
            emit Transfer(address(0), to, updatedIndex);
            require(
                _checkOnERC721Received(address(0), to, updatedIndex, _data),
                "ERC721A: transfer to non ERC721Receiver implementer"
            );
            updatedIndex++;
        }

        currentIndex = updatedIndex;
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(
            isApprovedOrOwner,
            "ERC721A: transfer caller is not owner nor approved"
        );

        require(
            prevOwnership.addr == from,
            "ERC721A: transfer from incorrect owner"
        );
        require(to != address(0), "ERC721A: transfer to the zero address");

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        _addressData[from].balance -= 1;
        _addressData[to].balance += 1;
        _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId] = TokenOwnership(
                    prevOwnership.addr,
                    prevOwnership.startTimestamp
                );
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

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

    uint256 public nextOwnerToExplicitlySet = 0;

    /**
     * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
     */
    function _setOwnersExplicit(uint256 quantity) internal {
        uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
        require(quantity > 0, "quantity must be nonzero");
        uint256 endIndex = oldNextOwnerToSet + quantity - 1;
        if (endIndex > collectionSize - 1) {
            endIndex = collectionSize - 1;
        }
        // We know if the last one in the group exists, all in the group exist, due to serial ordering.
        require(_exists(endIndex), "not enough minted yet for this cleanup");
        for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
            if (_ownerships[i].addr == address(0)) {
                TokenOwnership memory ownership = ownershipOf(i);
                _ownerships[i] = TokenOwnership(
                    ownership.addr,
                    ownership.startTimestamp
                );
            }
        }
        nextOwnerToExplicitlySet = endIndex + 1;
    }

    /**
     * @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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert(
                        "ERC721A: transfer to non ERC721Receiver implementer"
                    );
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}
// File: @openzeppelin/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: TheClinic.sol



pragma solidity ^0.8.0;





contract TheClinic is Ownable, ERC721A, ReentrancyGuard {
    using ECDSA for bytes32;

    uint256 public constant MAX_SUPPLY = 10000;

    uint256 public walletLimit = 15;
    uint256 public itemPrice = 0.06 ether;
    //0->not started | 1-> presale | 2-> public sale
    uint256 public saleStatus;

    string private _baseTokenURI;

    address public wallet1 = 0xDF9832024eB878241Fc324CC041C848466e27841;

    mapping(address => mapping(uint256 => uint256)) public walletMintedBySale;
    mapping(address => bool) public trustedSigner;

    modifier whenPublicSaleActive() {
        require(saleStatus == 2, "Public sale is not active");
        _;
    }

    modifier whenPreSaleActive() {
        require(saleStatus == 1, "Pre sale is not active");
        _;
    }

    modifier callerIsUser() {
        require(tx.origin == _msgSender(), "The caller is another contract");
        _;
    }

    modifier checkPrice(uint256 _howMany) {
        require(
            itemPrice * _howMany <= msg.value,
            "Ether value sent is not correct"
        );
        _;
    }

    constructor()
        ERC721A("The Iconic Miss Crypto Clinic", "Clinic", 100, MAX_SUPPLY)
    {
        trustedSigner[_msgSender()] = true;
    }

    function setTrustedSigner(address _wallet, bool _status)
        external
        onlyOwner
    {
        trustedSigner[_wallet] = _status;
    }

    function forAirdrop(address[] memory _to, uint256[] memory _count)
        external
        onlyOwner
    {
        uint256 _length = _to.length;
        for (uint256 i = 0; i < _length; i++) {
            giveaway(_to[i], _count[i]);
        }
    }

    function giveaway(address _to, uint256 _howMany) public onlyOwner {
        require(_to != address(0), "Zero address");
        _beforeMint(_howMany);
        _safeMint(_to, _howMany);
    }

    function _beforeMint(uint256 _howMany) private view {
        require(_howMany > 0, "Must mint at least one");
        uint256 supply = totalSupply();
        require(
            supply + _howMany <= MAX_SUPPLY,
            "Minting would exceed max supply"
        );
    }

    function whitelistMint(
        uint256 _howMany,
        uint256 _timestamp,
        bytes memory _signature
    )
        external
        payable
        nonReentrant
        whenPreSaleActive
        callerIsUser
        checkPrice(_howMany)
    {
        _isValid(_msgSender(), _howMany, _timestamp, _signature);
        _beforeMint(_howMany);
        require(
            walletMintedBySale[_msgSender()][1] + _howMany <= walletLimit,
            "Wallet limit exceeds"
        );
        walletMintedBySale[_msgSender()][1] += _howMany;
        _safeMint(_msgSender(), _howMany);
        _withdraw();
    }

    function saleMint(uint256 _howMany)
        external
        payable
        nonReentrant
        whenPublicSaleActive
        callerIsUser
        checkPrice(_howMany)
    {
        _beforeMint(_howMany);
        require(
            walletMintedBySale[_msgSender()][2] + _howMany <= walletLimit,
            "Wallet limit exceeds"
        );
        walletMintedBySale[_msgSender()][2] += _howMany;
        _safeMint(_msgSender(), _howMany);
        _withdraw();
    }

    function _isValid(
        address _wallet,
        uint256 _count,
        uint256 _timestamp,
        bytes memory _signature
    ) internal view {
        address signerOwner = signatureWallet(
            _wallet,
            _count,
            _timestamp,
            _signature
        );
        require(trustedSigner[signerOwner], "Not authorized to mint");
    }

    function signatureWallet(
        address _wallet,
        uint256 _count,
        uint256 _timestamp,
        bytes memory _signature
    ) public view returns (address) {
        bytes32 message = keccak256(
            abi.encode(address(this), _wallet, _count, _timestamp)
        );
        bytes32 ethSignedMessageHash = message.toEthSignedMessageHash();
        return ECDSA.recover(ethSignedMessageHash, _signature);
    }

    function startPublicSale() external onlyOwner {
        require(saleStatus != 2, "Public sale has already begun");
        saleStatus = 2;
    }

    function pausePublicSale() external onlyOwner whenPublicSaleActive {
        saleStatus = 0;
    }

    function startPreSale() external onlyOwner {
        require(saleStatus != 1, "Pre sale has already begun");
        saleStatus = 1;
    }

    function pausePreSale() external onlyOwner whenPreSaleActive {
        saleStatus = 0;
    }

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

    function setBaseURI(string calldata baseURI) external onlyOwner {
        _baseTokenURI = baseURI;
    }

    // list all the tokens ids of a wallet
    function tokensOfOwner(address _owner)
        external
        view
        returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            // Return an empty array
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }

    function updateWallets(address _wallet1) external onlyOwner {
        wallet1 = _wallet1;
    }

    function withdrawMoney() external onlyOwner nonReentrant {
        _withdraw();
    }

    function _withdraw() internal {
        uint256 bal = accountBalance();
        (bool success1, ) = wallet1.call{value: bal}("");
        require(success1, "Transfer failed.");
    }

    receive() external payable {
        _withdraw();
    }

    function accountBalance() public view returns (uint256) {
        return address(this).balance;
    }

    function setPrice(uint256 _newPrice) external onlyOwner {
        itemPrice = _newPrice;
    }

    function modifyWalletLimit(uint256 _walletLimit) external onlyOwner {
        walletLimit = _walletLimit;
    }

    function setOwnersExplicit(uint256 quantity)
        external
        onlyOwner
        nonReentrant
    {
        _setOwnersExplicit(quantity);
    }

    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

    function exists(uint256 _tokenId) external view returns (bool) {
        return _exists(_tokenId);
    }

    function getOwnershipData(uint256 tokenId)
        external
        view
        returns (TokenOwnership memory)
    {
        return ownershipOf(tokenId);
    }
}

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":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accountBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_count","type":"uint256[]"}],"name":"forAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_howMany","type":"uint256"}],"name":"giveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"itemPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_walletLimit","type":"uint256"}],"name":"modifyWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"pausePreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pausePublicSale","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"_howMany","type":"uint256"}],"name":"saleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"saleStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setOwnersExplicit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setTrustedSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"signatureWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPublicSale","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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"trustedSigner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet1","type":"address"}],"name":"updateWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wallet1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"walletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"walletMintedBySale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_howMany","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052600180556000600855600f600a5566d529ae9e860000600b55600e80546001600160a01b03191673df9832024eb878241fc324cc041c848466e278411790553480156200005057600080fd5b506040518060400160405280601d81526020017f5468652049636f6e6963204d6973732043727970746f20436c696e696300000081525060405180604001604052806006815260200165436c696e696360d01b8152506064612710620000c5620000bf620001f260201b60201c565b620001f6565b60008111620001325760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b60008211620001945760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b606482015260840162000129565b8351620001a990600290602087019062000246565b508251620001bf90600390602086019062000246565b5060a091909152608052505060016009819055336000908152601060205260409020805460ff1916909117905562000328565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200025490620002ec565b90600052602060002090601f016020900481019282620002785760008555620002c3565b82601f106200029357805160ff1916838001178555620002c3565b82800160010185558215620002c3579182015b82811115620002c3578251825591602001919060010190620002a6565b50620002d1929150620002d5565b5090565b5b80821115620002d15760008155600101620002d6565b600181811c908216806200030157607f821691505b6020821081036200032257634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a0516136c962000363600039600081816122ee0152818161231801526128600152600081816120f8015261212a01526136c96000f3fe6080604052600436106102975760003560e01c80638462151c1161015a578063bacf9946116100c1578063e985e9c51161007a578063e985e9c5146107de578063e9e211a114610827578063ec596b7214610857578063f23205681461086a578063f2fde38b1461088a578063f9020e33146108aa57600080fd5b8063bacf99461461071a578063c87b56dd1461073a578063cbbb4b571461075a578063d7224ba014610792578063dac6db1c146107a8578063dc33e681146107be57600080fd5b80639a3df25d116101135780639a3df25d14610672578063a22cb46514610692578063a7d8fcbd146106b2578063ac446002146106d2578063b0a1c1c4146106e7578063b88d4fde146106fa57600080fd5b80638462151c146105925780638ca887ca146105bf5780638da5cb5b146105d257806391b7f5ed146105f05780639231ab2a1461061057806395d89b411461065d57600080fd5b80632f745c59116101fe5780634f6ccce7116101b75780634f6ccce7146104e857806355dd574c1461050857806355f804b31461051d5780636352211e1461053d57806370a082311461055d578063715018a61461057d57600080fd5b80632f745c591461044757806332cb6b0c146104675780633c8463a11461047d57806342842e0e146104935780634357da58146104b35780634f558e79146104c857600080fd5b80630c41f497116102505780630c41f4971461038f57806318160ddd146103a45780631a026c96146103c757806323b872dd146103e75780632851a5cf146104075780632d20fb601461042757600080fd5b806301ffc9a7146102ab578063050225ea146102e057806306fdde0314610300578063081812fc14610322578063095ea7b31461035a5780630c1c972a1461037a57600080fd5b366102a6576102a46108c0565b005b600080fd5b3480156102b757600080fd5b506102cb6102c6366004612e6d565b610963565b60405190151581526020015b60405180910390f35b3480156102ec57600080fd5b506102a46102fb366004612ea6565b6109d0565b34801561030c57600080fd5b50610315610a52565b6040516102d79190612f28565b34801561032e57600080fd5b5061034261033d366004612f3b565b610ae4565b6040516001600160a01b0390911681526020016102d7565b34801561036657600080fd5b506102a4610375366004612ea6565b610b6d565b34801561038657600080fd5b506102a4610c84565b34801561039b57600080fd5b506102a4610d07565b3480156103b057600080fd5b506103b9610d86565b6040519081526020016102d7565b3480156103d357600080fd5b50600e54610342906001600160a01b031681565b3480156103f357600080fd5b506102a4610402366004612f54565b610d9b565b34801561041357600080fd5b506102a4610422366004612f90565b610da6565b34801561043357600080fd5b506102a4610442366004612f3b565b610df2565b34801561045357600080fd5b506103b9610462366004612ea6565b610e54565b34801561047357600080fd5b506103b961271081565b34801561048957600080fd5b506103b9600a5481565b34801561049f57600080fd5b506102a46104ae366004612f54565b610fc9565b3480156104bf57600080fd5b506102a4610fe4565b3480156104d457600080fd5b506102cb6104e3366004612f3b565b611059565b3480156104f457600080fd5b506103b9610503366004612f3b565b611064565b34801561051457600080fd5b506102a46110cc565b34801561052957600080fd5b506102a4610538366004612fab565b61114f565b34801561054957600080fd5b50610342610558366004612f3b565b611185565b34801561056957600080fd5b506103b9610578366004612f90565b611197565b34801561058957600080fd5b506102a4611228565b34801561059e57600080fd5b506105b26105ad366004612f90565b61125e565b6040516102d7919061301c565b6102a46105cd366004612f3b565b61131f565b3480156105de57600080fd5b506000546001600160a01b0316610342565b3480156105fc57600080fd5b506102a461060b366004612f3b565b611505565b34801561061c57600080fd5b5061063061062b366004612f3b565b611534565b6040805182516001600160a01b031681526020928301516001600160401b031692810192909252016102d7565b34801561066957600080fd5b50610315611551565b34801561067e57600080fd5b506102a461068d366004612f3b565b611560565b34801561069e57600080fd5b506102a46106ad366004613060565b61158f565b3480156106be57600080fd5b506102a46106cd366004613170565b611653565b3480156106de57600080fd5b506102a46116de565b3480156106f357600080fd5b50476103b9565b34801561070657600080fd5b506102a461071536600461329e565b61173e565b34801561072657600080fd5b506102a4610735366004613060565b611771565b34801561074657600080fd5b50610315610755366004612f3b565b6117c6565b34801561076657600080fd5b506103b9610775366004612ea6565b600f60209081526000928352604080842090915290825290205481565b34801561079e57600080fd5b506103b960085481565b3480156107b457600080fd5b506103b9600b5481565b3480156107ca57600080fd5b506103b96107d9366004612f90565b611891565b3480156107ea57600080fd5b506102cb6107f9366004613305565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561083357600080fd5b506102cb610842366004612f90565b60106020526000908152604090205460ff1681565b6102a4610865366004613338565b61189c565b34801561087657600080fd5b50610342610885366004613387565b611a8d565b34801561089657600080fd5b506102a46108a5366004612f90565b611b2e565b3480156108b657600080fd5b506103b9600c5481565b600e5460405147916000916001600160a01b039091169083908381818185875af1925050503d8060008114610911576040519150601f19603f3d011682016040523d82523d6000602084013e610916565b606091505b505090508061095f5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b60448201526064015b60405180910390fd5b5050565b60006001600160e01b031982166380ac58cd60e01b148061099457506001600160e01b03198216635b5e139f60e01b145b806109af57506001600160e01b0319821663780e9d6360e01b145b806109ca57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b031633146109fa5760405162461bcd60e51b8152600401610956906133cf565b6001600160a01b038216610a3f5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606401610956565b610a4881611bc9565b61095f8282611c79565b606060028054610a6190613404565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8d90613404565b8015610ada5780601f10610aaf57610100808354040283529160200191610ada565b820191906000526020600020905b815481529060010190602001808311610abd57829003601f168201915b5050505050905090565b6000610aef82611c93565b610b515760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610956565b506000908152600660205260409020546001600160a01b031690565b6000610b7882611185565b9050806001600160a01b0316836001600160a01b031603610be65760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610956565b336001600160a01b0382161480610c025750610c0281336107f9565b610c745760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610956565b610c7f838383611ca7565b505050565b6000546001600160a01b03163314610cae5760405162461bcd60e51b8152600401610956906133cf565b600c54600203610d005760405162461bcd60e51b815260206004820152601d60248201527f5075626c69632073616c652068617320616c726561647920626567756e0000006044820152606401610956565b6002600c55565b6000546001600160a01b03163314610d315760405162461bcd60e51b8152600401610956906133cf565b600c54600214610d7f5760405162461bcd60e51b81526020600482015260196024820152785075626c69632073616c65206973206e6f742061637469766560381b6044820152606401610956565b6000600c55565b600060018054610d96919061344e565b905090565b610c7f838383611d03565b6000546001600160a01b03163314610dd05760405162461bcd60e51b8152600401610956906133cf565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610e1c5760405162461bcd60e51b8152600401610956906133cf565b600260095403610e3e5760405162461bcd60e51b815260040161095690613465565b6002600955610e4c81612087565b506001600955565b6000610e5f83611197565b8210610eb85760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610956565b6000610ec2610d86565b905060008060005b83811015610f69576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215610f1c57805192505b876001600160a01b0316836001600160a01b031603610f5657868403610f48575093506109ca92505050565b83610f528161349c565b9450505b5080610f618161349c565b915050610eca565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610956565b610c7f8383836040518060200160405280600081525061173e565b6000546001600160a01b0316331461100e5760405162461bcd60e51b8152600401610956906133cf565b600c54600114610d7f5760405162461bcd60e51b81526020600482015260166024820152755072652073616c65206973206e6f742061637469766560501b6044820152606401610956565b60006109ca82611c93565b600061106e610d86565b82106110c85760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610956565b5090565b6000546001600160a01b031633146110f65760405162461bcd60e51b8152600401610956906133cf565b600c546001036111485760405162461bcd60e51b815260206004820152601a60248201527f5072652073616c652068617320616c726561647920626567756e0000000000006044820152606401610956565b6001600c55565b6000546001600160a01b031633146111795760405162461bcd60e51b8152600401610956906133cf565b610c7f600d8383612dc7565b60006111908261226e565b5192915050565b60006001600160a01b0382166112035760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610956565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b6000546001600160a01b031633146112525760405162461bcd60e51b8152600401610956906133cf565b61125c6000612415565b565b6060600061126b83611197565b90508060000361128f5760408051600080825260208201909252905b509392505050565b6000816001600160401b038111156112a9576112a961309c565b6040519080825280602002602001820160405280156112d2578160200160208202803683370190505b50905060005b82811015611287576112ea8582610e54565b8282815181106112fc576112fc6134b5565b6020908102919091010152806113118161349c565b9150506112d8565b50919050565b6002600954036113415760405162461bcd60e51b815260040161095690613465565b60026009819055600c54146113945760405162461bcd60e51b81526020600482015260196024820152785075626c69632073616c65206973206e6f742061637469766560381b6044820152606401610956565b3233146113e35760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610956565b803481600b546113f391906134cb565b11156114415760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610956565b61144a82611bc9565b600a54336000908152600f60209081526040808320600284529091529020546114749084906134ea565b11156114b95760405162461bcd60e51b815260206004820152601460248201527357616c6c6574206c696d6974206578636565647360601b6044820152606401610956565b336000908152600f6020908152604080832060028452909152812080548492906114e49084906134ea565b909155506114f490503383611c79565b6114fc6108c0565b50506001600955565b6000546001600160a01b0316331461152f5760405162461bcd60e51b8152600401610956906133cf565b600b55565b60408051808201909152600080825260208201526109ca8261226e565b606060038054610a6190613404565b6000546001600160a01b0316331461158a5760405162461bcd60e51b8152600401610956906133cf565b600a55565b336001600160a01b038316036115e75760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610956565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b0316331461167d5760405162461bcd60e51b8152600401610956906133cf565b815160005b818110156116d8576116c684828151811061169f5761169f6134b5565b60200260200101518483815181106116b9576116b96134b5565b60200260200101516109d0565b806116d08161349c565b915050611682565b50505050565b6000546001600160a01b031633146117085760405162461bcd60e51b8152600401610956906133cf565b60026009540361172a5760405162461bcd60e51b815260040161095690613465565b60026009556117376108c0565b6001600955565b611749848484611d03565b61175584848484612465565b6116d85760405162461bcd60e51b815260040161095690613502565b6000546001600160a01b0316331461179b5760405162461bcd60e51b8152600401610956906133cf565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b60606117d182611c93565b6118355760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610956565b600061183f612563565b9050600081511161185f576040518060200160405280600081525061188a565b8061186984612572565b60405160200161187a929190613555565b6040516020818303038152906040525b9392505050565b60006109ca82612672565b6002600954036118be5760405162461bcd60e51b815260040161095690613465565b6002600955600c5460011461190e5760405162461bcd60e51b81526020600482015260166024820152755072652073616c65206973206e6f742061637469766560501b6044820152606401610956565b32331461195d5760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610956565b823481600b5461196d91906134cb565b11156119bb5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610956565b6119c733858585612710565b6119d084611bc9565b600a54336000908152600f60209081526040808320600184529091529020546119fa9086906134ea565b1115611a3f5760405162461bcd60e51b815260206004820152601460248201527357616c6c6574206c696d6974206578636565647360601b6044820152606401610956565b336000908152600f602090815260408083206001845290915281208054869290611a6a9084906134ea565b90915550611a7a90503385611c79565b611a826108c0565b505060016009555050565b60408051306020808301919091526001600160a01b038716828401526060820186905260808083018690528351808403909101815260a0830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000060c084015260dc8084018290528451808503909101815260fc909301909352815191012060009190611b218185612789565b925050505b949350505050565b6000546001600160a01b03163314611b585760405162461bcd60e51b8152600401610956906133cf565b6001600160a01b038116611bbd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610956565b611bc681612415565b50565b60008111611c125760405162461bcd60e51b81526020600482015260166024820152754d757374206d696e74206174206c65617374206f6e6560501b6044820152606401610956565b6000611c1c610d86565b9050612710611c2b83836134ea565b111561095f5760405162461bcd60e51b815260206004820152601f60248201527f4d696e74696e6720776f756c6420657863656564206d617820737570706c79006044820152606401610956565b61095f8282604051806020016040528060008152506127a5565b6000600154821080156109ca575050151590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611d0e8261226e565b80519091506000906001600160a01b0316336001600160a01b03161480611d45575033611d3a84610ae4565b6001600160a01b0316145b80611d5757508151611d5790336107f9565b905080611dc15760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610956565b846001600160a01b031682600001516001600160a01b031614611e355760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610956565b6001600160a01b038416611e995760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610956565b611ea96000848460000151611ca7565b6001600160a01b0385166000908152600560205260408120805460019290611edb9084906001600160801b0316613584565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526005602052604081208054600194509092611f27918591166135ac565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526004909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055611fae8460016134ea565b6000818152600460205260409020549091506001600160a01b031661203d57611fd681611c93565b1561203d5760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600490935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b600854816120d75760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f00000000000000006044820152606401610956565b600060016120e584846134ea565b6120ef919061344e565b905061211c60017f000000000000000000000000000000000000000000000000000000000000000061344e565b8111156121515761214e60017f000000000000000000000000000000000000000000000000000000000000000061344e565b90505b61215a81611c93565b6121b55760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201526506c65616e75760d41b6064820152608401610956565b815b81811161225a576000818152600460205260409020546001600160a01b03166122485760006121e58261226e565b60408051808201825282516001600160a01b0390811682526020938401516001600160401b039081168584019081526000888152600490965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b806122528161349c565b9150506121b7565b506122668160016134ea565b600855505050565b604080518082019091526000808252602082015261228b82611c93565b6122ea5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610956565b60007f0000000000000000000000000000000000000000000000000000000000000000831061234b5761233d7f00000000000000000000000000000000000000000000000000000000000000008461344e565b6123489060016134ea565b90505b825b8181106123b4576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b031691830191909152156123a157949350505050565b50806123ac816135ce565b91505061234d565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610956565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0384163b1561255b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906124a99033908990889088906004016135e5565b6020604051808303816000875af19250505080156124e4575060408051601f3d908101601f191682019092526124e191810190613622565b60015b612541573d808015612512576040519150601f19603f3d011682016040523d82523d6000602084013e612517565b606091505b5080516000036125395760405162461bcd60e51b815260040161095690613502565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b26565b506001611b26565b6060600d8054610a6190613404565b6060816000036125995750506040805180820190915260018152600360fc1b602082015290565b8160005b81156125c357806125ad8161349c565b91506125bc9050600a83613655565b915061259d565b6000816001600160401b038111156125dd576125dd61309c565b6040519080825280601f01601f191660200182016040528015612607576020820181803683370190505b5090505b8415611b265761261c60018361344e565b9150612629600a86613669565b6126349060306134ea565b60f81b818381518110612649576126496134b5565b60200101906001600160f81b031916908160001a90535061266b600a86613655565b945061260b565b60006001600160a01b0382166126e45760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b6064820152608401610956565b506001600160a01b0316600090815260056020526040902054600160801b90046001600160801b031690565b600061271e85858585611a8d565b6001600160a01b03811660009081526010602052604090205490915060ff166127825760405162461bcd60e51b8152602060048201526016602482015275139bdd08185d5d1a1bdc9a5e9959081d1bc81b5a5b9d60521b6044820152606401610956565b5050505050565b60008060006127988585612a7d565b9150915061128781612aeb565b6001546001600160a01b0384166128085760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610956565b61281181611c93565b1561285e5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610956565b7f00000000000000000000000000000000000000000000000000000000000000008311156128d95760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401610956565b6001600160a01b0384166000908152600560209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906129359087906135ac565b6001600160801b0316815260200185836020015161295391906135ac565b6001600160801b039081169091526001600160a01b0380881660008181526005602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526004909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015612a725760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612a366000888488612465565b612a525760405162461bcd60e51b815260040161095690613502565b81612a5c8161349c565b9250508080612a6a9061349c565b9150506129e9565b50600181905561207f565b6000808251604103612ab35760208301516040840151606085015160001a612aa787828585612ca1565b94509450505050612ae4565b8251604003612adc5760208301516040840151612ad1868383612d8e565b935093505050612ae4565b506000905060025b9250929050565b6000816004811115612aff57612aff61367d565b03612b075750565b6001816004811115612b1b57612b1b61367d565b03612b685760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610956565b6002816004811115612b7c57612b7c61367d565b03612bc95760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610956565b6003816004811115612bdd57612bdd61367d565b03612c355760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610956565b6004816004811115612c4957612c4961367d565b03611bc65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610956565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612cd85750600090506003612d85565b8460ff16601b14158015612cf057508460ff16601c14155b15612d015750600090506004612d85565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612d55573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612d7e57600060019250925050612d85565b9150600090505b94509492505050565b6000806001600160ff1b03831681612dab60ff86901c601b6134ea565b9050612db987828885612ca1565b935093505050935093915050565b828054612dd390613404565b90600052602060002090601f016020900481019282612df55760008555612e3b565b82601f10612e0e5782800160ff19823516178555612e3b565b82800160010185558215612e3b579182015b82811115612e3b578235825591602001919060010190612e20565b506110c89291505b808211156110c85760008155600101612e43565b6001600160e01b031981168114611bc657600080fd5b600060208284031215612e7f57600080fd5b813561188a81612e57565b80356001600160a01b0381168114612ea157600080fd5b919050565b60008060408385031215612eb957600080fd5b612ec283612e8a565b946020939093013593505050565b60005b83811015612eeb578181015183820152602001612ed3565b838111156116d85750506000910152565b60008151808452612f14816020860160208601612ed0565b601f01601f19169290920160200192915050565b60208152600061188a6020830184612efc565b600060208284031215612f4d57600080fd5b5035919050565b600080600060608486031215612f6957600080fd5b612f7284612e8a565b9250612f8060208501612e8a565b9150604084013590509250925092565b600060208284031215612fa257600080fd5b61188a82612e8a565b60008060208385031215612fbe57600080fd5b82356001600160401b0380821115612fd557600080fd5b818501915085601f830112612fe957600080fd5b813581811115612ff857600080fd5b86602082850101111561300a57600080fd5b60209290920196919550909350505050565b6020808252825182820181905260009190848201906040850190845b8181101561305457835183529284019291840191600101613038565b50909695505050505050565b6000806040838503121561307357600080fd5b61307c83612e8a565b91506020830135801515811461309157600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156130da576130da61309c565b604052919050565b60006001600160401b038211156130fb576130fb61309c565b5060051b60200190565b600082601f83011261311657600080fd5b8135602061312b613126836130e2565b6130b2565b82815260059290921b8401810191818101908684111561314a57600080fd5b8286015b84811015613165578035835291830191830161314e565b509695505050505050565b6000806040838503121561318357600080fd5b82356001600160401b038082111561319a57600080fd5b818501915085601f8301126131ae57600080fd5b813560206131be613126836130e2565b82815260059290921b840181019181810190898411156131dd57600080fd5b948201945b83861015613202576131f386612e8a565b825294820194908201906131e2565b9650508601359250508082111561321857600080fd5b5061322585828601613105565b9150509250929050565b600082601f83011261324057600080fd5b81356001600160401b038111156132595761325961309c565b61326c601f8201601f19166020016130b2565b81815284602083860101111561328157600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080608085870312156132b457600080fd5b6132bd85612e8a565b93506132cb60208601612e8a565b92506040850135915060608501356001600160401b038111156132ed57600080fd5b6132f98782880161322f565b91505092959194509250565b6000806040838503121561331857600080fd5b61332183612e8a565b915061332f60208401612e8a565b90509250929050565b60008060006060848603121561334d57600080fd5b833592506020840135915060408401356001600160401b0381111561337157600080fd5b61337d8682870161322f565b9150509250925092565b6000806000806080858703121561339d57600080fd5b6133a685612e8a565b9350602085013592506040850135915060608501356001600160401b038111156132ed57600080fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061341857607f821691505b60208210810361131957634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008282101561346057613460613438565b500390565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000600182016134ae576134ae613438565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60008160001904831182151516156134e5576134e5613438565b500290565b600082198211156134fd576134fd613438565b500190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60008351613567818460208801612ed0565b83519083019061357b818360208801612ed0565b01949350505050565b60006001600160801b03838116908316818110156135a4576135a4613438565b039392505050565b60006001600160801b0380831681851680830382111561357b5761357b613438565b6000816135dd576135dd613438565b506000190190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061361890830184612efc565b9695505050505050565b60006020828403121561363457600080fd5b815161188a81612e57565b634e487b7160e01b600052601260045260246000fd5b6000826136645761366461363f565b500490565b6000826136785761367861363f565b500690565b634e487b7160e01b600052602160045260246000fdfea26469706673582212206b2a4415e77601e4b9c1f76a344a87b8022f4b79ffd01e3808c2bba9d62199cc64736f6c634300080d0033

Deployed Bytecode

0x6080604052600436106102975760003560e01c80638462151c1161015a578063bacf9946116100c1578063e985e9c51161007a578063e985e9c5146107de578063e9e211a114610827578063ec596b7214610857578063f23205681461086a578063f2fde38b1461088a578063f9020e33146108aa57600080fd5b8063bacf99461461071a578063c87b56dd1461073a578063cbbb4b571461075a578063d7224ba014610792578063dac6db1c146107a8578063dc33e681146107be57600080fd5b80639a3df25d116101135780639a3df25d14610672578063a22cb46514610692578063a7d8fcbd146106b2578063ac446002146106d2578063b0a1c1c4146106e7578063b88d4fde146106fa57600080fd5b80638462151c146105925780638ca887ca146105bf5780638da5cb5b146105d257806391b7f5ed146105f05780639231ab2a1461061057806395d89b411461065d57600080fd5b80632f745c59116101fe5780634f6ccce7116101b75780634f6ccce7146104e857806355dd574c1461050857806355f804b31461051d5780636352211e1461053d57806370a082311461055d578063715018a61461057d57600080fd5b80632f745c591461044757806332cb6b0c146104675780633c8463a11461047d57806342842e0e146104935780634357da58146104b35780634f558e79146104c857600080fd5b80630c41f497116102505780630c41f4971461038f57806318160ddd146103a45780631a026c96146103c757806323b872dd146103e75780632851a5cf146104075780632d20fb601461042757600080fd5b806301ffc9a7146102ab578063050225ea146102e057806306fdde0314610300578063081812fc14610322578063095ea7b31461035a5780630c1c972a1461037a57600080fd5b366102a6576102a46108c0565b005b600080fd5b3480156102b757600080fd5b506102cb6102c6366004612e6d565b610963565b60405190151581526020015b60405180910390f35b3480156102ec57600080fd5b506102a46102fb366004612ea6565b6109d0565b34801561030c57600080fd5b50610315610a52565b6040516102d79190612f28565b34801561032e57600080fd5b5061034261033d366004612f3b565b610ae4565b6040516001600160a01b0390911681526020016102d7565b34801561036657600080fd5b506102a4610375366004612ea6565b610b6d565b34801561038657600080fd5b506102a4610c84565b34801561039b57600080fd5b506102a4610d07565b3480156103b057600080fd5b506103b9610d86565b6040519081526020016102d7565b3480156103d357600080fd5b50600e54610342906001600160a01b031681565b3480156103f357600080fd5b506102a4610402366004612f54565b610d9b565b34801561041357600080fd5b506102a4610422366004612f90565b610da6565b34801561043357600080fd5b506102a4610442366004612f3b565b610df2565b34801561045357600080fd5b506103b9610462366004612ea6565b610e54565b34801561047357600080fd5b506103b961271081565b34801561048957600080fd5b506103b9600a5481565b34801561049f57600080fd5b506102a46104ae366004612f54565b610fc9565b3480156104bf57600080fd5b506102a4610fe4565b3480156104d457600080fd5b506102cb6104e3366004612f3b565b611059565b3480156104f457600080fd5b506103b9610503366004612f3b565b611064565b34801561051457600080fd5b506102a46110cc565b34801561052957600080fd5b506102a4610538366004612fab565b61114f565b34801561054957600080fd5b50610342610558366004612f3b565b611185565b34801561056957600080fd5b506103b9610578366004612f90565b611197565b34801561058957600080fd5b506102a4611228565b34801561059e57600080fd5b506105b26105ad366004612f90565b61125e565b6040516102d7919061301c565b6102a46105cd366004612f3b565b61131f565b3480156105de57600080fd5b506000546001600160a01b0316610342565b3480156105fc57600080fd5b506102a461060b366004612f3b565b611505565b34801561061c57600080fd5b5061063061062b366004612f3b565b611534565b6040805182516001600160a01b031681526020928301516001600160401b031692810192909252016102d7565b34801561066957600080fd5b50610315611551565b34801561067e57600080fd5b506102a461068d366004612f3b565b611560565b34801561069e57600080fd5b506102a46106ad366004613060565b61158f565b3480156106be57600080fd5b506102a46106cd366004613170565b611653565b3480156106de57600080fd5b506102a46116de565b3480156106f357600080fd5b50476103b9565b34801561070657600080fd5b506102a461071536600461329e565b61173e565b34801561072657600080fd5b506102a4610735366004613060565b611771565b34801561074657600080fd5b50610315610755366004612f3b565b6117c6565b34801561076657600080fd5b506103b9610775366004612ea6565b600f60209081526000928352604080842090915290825290205481565b34801561079e57600080fd5b506103b960085481565b3480156107b457600080fd5b506103b9600b5481565b3480156107ca57600080fd5b506103b96107d9366004612f90565b611891565b3480156107ea57600080fd5b506102cb6107f9366004613305565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561083357600080fd5b506102cb610842366004612f90565b60106020526000908152604090205460ff1681565b6102a4610865366004613338565b61189c565b34801561087657600080fd5b50610342610885366004613387565b611a8d565b34801561089657600080fd5b506102a46108a5366004612f90565b611b2e565b3480156108b657600080fd5b506103b9600c5481565b600e5460405147916000916001600160a01b039091169083908381818185875af1925050503d8060008114610911576040519150601f19603f3d011682016040523d82523d6000602084013e610916565b606091505b505090508061095f5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b60448201526064015b60405180910390fd5b5050565b60006001600160e01b031982166380ac58cd60e01b148061099457506001600160e01b03198216635b5e139f60e01b145b806109af57506001600160e01b0319821663780e9d6360e01b145b806109ca57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b031633146109fa5760405162461bcd60e51b8152600401610956906133cf565b6001600160a01b038216610a3f5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606401610956565b610a4881611bc9565b61095f8282611c79565b606060028054610a6190613404565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8d90613404565b8015610ada5780601f10610aaf57610100808354040283529160200191610ada565b820191906000526020600020905b815481529060010190602001808311610abd57829003601f168201915b5050505050905090565b6000610aef82611c93565b610b515760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610956565b506000908152600660205260409020546001600160a01b031690565b6000610b7882611185565b9050806001600160a01b0316836001600160a01b031603610be65760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610956565b336001600160a01b0382161480610c025750610c0281336107f9565b610c745760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610956565b610c7f838383611ca7565b505050565b6000546001600160a01b03163314610cae5760405162461bcd60e51b8152600401610956906133cf565b600c54600203610d005760405162461bcd60e51b815260206004820152601d60248201527f5075626c69632073616c652068617320616c726561647920626567756e0000006044820152606401610956565b6002600c55565b6000546001600160a01b03163314610d315760405162461bcd60e51b8152600401610956906133cf565b600c54600214610d7f5760405162461bcd60e51b81526020600482015260196024820152785075626c69632073616c65206973206e6f742061637469766560381b6044820152606401610956565b6000600c55565b600060018054610d96919061344e565b905090565b610c7f838383611d03565b6000546001600160a01b03163314610dd05760405162461bcd60e51b8152600401610956906133cf565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610e1c5760405162461bcd60e51b8152600401610956906133cf565b600260095403610e3e5760405162461bcd60e51b815260040161095690613465565b6002600955610e4c81612087565b506001600955565b6000610e5f83611197565b8210610eb85760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610956565b6000610ec2610d86565b905060008060005b83811015610f69576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215610f1c57805192505b876001600160a01b0316836001600160a01b031603610f5657868403610f48575093506109ca92505050565b83610f528161349c565b9450505b5080610f618161349c565b915050610eca565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610956565b610c7f8383836040518060200160405280600081525061173e565b6000546001600160a01b0316331461100e5760405162461bcd60e51b8152600401610956906133cf565b600c54600114610d7f5760405162461bcd60e51b81526020600482015260166024820152755072652073616c65206973206e6f742061637469766560501b6044820152606401610956565b60006109ca82611c93565b600061106e610d86565b82106110c85760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610956565b5090565b6000546001600160a01b031633146110f65760405162461bcd60e51b8152600401610956906133cf565b600c546001036111485760405162461bcd60e51b815260206004820152601a60248201527f5072652073616c652068617320616c726561647920626567756e0000000000006044820152606401610956565b6001600c55565b6000546001600160a01b031633146111795760405162461bcd60e51b8152600401610956906133cf565b610c7f600d8383612dc7565b60006111908261226e565b5192915050565b60006001600160a01b0382166112035760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610956565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b6000546001600160a01b031633146112525760405162461bcd60e51b8152600401610956906133cf565b61125c6000612415565b565b6060600061126b83611197565b90508060000361128f5760408051600080825260208201909252905b509392505050565b6000816001600160401b038111156112a9576112a961309c565b6040519080825280602002602001820160405280156112d2578160200160208202803683370190505b50905060005b82811015611287576112ea8582610e54565b8282815181106112fc576112fc6134b5565b6020908102919091010152806113118161349c565b9150506112d8565b50919050565b6002600954036113415760405162461bcd60e51b815260040161095690613465565b60026009819055600c54146113945760405162461bcd60e51b81526020600482015260196024820152785075626c69632073616c65206973206e6f742061637469766560381b6044820152606401610956565b3233146113e35760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610956565b803481600b546113f391906134cb565b11156114415760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610956565b61144a82611bc9565b600a54336000908152600f60209081526040808320600284529091529020546114749084906134ea565b11156114b95760405162461bcd60e51b815260206004820152601460248201527357616c6c6574206c696d6974206578636565647360601b6044820152606401610956565b336000908152600f6020908152604080832060028452909152812080548492906114e49084906134ea565b909155506114f490503383611c79565b6114fc6108c0565b50506001600955565b6000546001600160a01b0316331461152f5760405162461bcd60e51b8152600401610956906133cf565b600b55565b60408051808201909152600080825260208201526109ca8261226e565b606060038054610a6190613404565b6000546001600160a01b0316331461158a5760405162461bcd60e51b8152600401610956906133cf565b600a55565b336001600160a01b038316036115e75760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610956565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b0316331461167d5760405162461bcd60e51b8152600401610956906133cf565b815160005b818110156116d8576116c684828151811061169f5761169f6134b5565b60200260200101518483815181106116b9576116b96134b5565b60200260200101516109d0565b806116d08161349c565b915050611682565b50505050565b6000546001600160a01b031633146117085760405162461bcd60e51b8152600401610956906133cf565b60026009540361172a5760405162461bcd60e51b815260040161095690613465565b60026009556117376108c0565b6001600955565b611749848484611d03565b61175584848484612465565b6116d85760405162461bcd60e51b815260040161095690613502565b6000546001600160a01b0316331461179b5760405162461bcd60e51b8152600401610956906133cf565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b60606117d182611c93565b6118355760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610956565b600061183f612563565b9050600081511161185f576040518060200160405280600081525061188a565b8061186984612572565b60405160200161187a929190613555565b6040516020818303038152906040525b9392505050565b60006109ca82612672565b6002600954036118be5760405162461bcd60e51b815260040161095690613465565b6002600955600c5460011461190e5760405162461bcd60e51b81526020600482015260166024820152755072652073616c65206973206e6f742061637469766560501b6044820152606401610956565b32331461195d5760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610956565b823481600b5461196d91906134cb565b11156119bb5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610956565b6119c733858585612710565b6119d084611bc9565b600a54336000908152600f60209081526040808320600184529091529020546119fa9086906134ea565b1115611a3f5760405162461bcd60e51b815260206004820152601460248201527357616c6c6574206c696d6974206578636565647360601b6044820152606401610956565b336000908152600f602090815260408083206001845290915281208054869290611a6a9084906134ea565b90915550611a7a90503385611c79565b611a826108c0565b505060016009555050565b60408051306020808301919091526001600160a01b038716828401526060820186905260808083018690528351808403909101815260a0830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000060c084015260dc8084018290528451808503909101815260fc909301909352815191012060009190611b218185612789565b925050505b949350505050565b6000546001600160a01b03163314611b585760405162461bcd60e51b8152600401610956906133cf565b6001600160a01b038116611bbd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610956565b611bc681612415565b50565b60008111611c125760405162461bcd60e51b81526020600482015260166024820152754d757374206d696e74206174206c65617374206f6e6560501b6044820152606401610956565b6000611c1c610d86565b9050612710611c2b83836134ea565b111561095f5760405162461bcd60e51b815260206004820152601f60248201527f4d696e74696e6720776f756c6420657863656564206d617820737570706c79006044820152606401610956565b61095f8282604051806020016040528060008152506127a5565b6000600154821080156109ca575050151590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611d0e8261226e565b80519091506000906001600160a01b0316336001600160a01b03161480611d45575033611d3a84610ae4565b6001600160a01b0316145b80611d5757508151611d5790336107f9565b905080611dc15760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610956565b846001600160a01b031682600001516001600160a01b031614611e355760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610956565b6001600160a01b038416611e995760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610956565b611ea96000848460000151611ca7565b6001600160a01b0385166000908152600560205260408120805460019290611edb9084906001600160801b0316613584565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526005602052604081208054600194509092611f27918591166135ac565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526004909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055611fae8460016134ea565b6000818152600460205260409020549091506001600160a01b031661203d57611fd681611c93565b1561203d5760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600490935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b600854816120d75760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f00000000000000006044820152606401610956565b600060016120e584846134ea565b6120ef919061344e565b905061211c60017f000000000000000000000000000000000000000000000000000000000000271061344e565b8111156121515761214e60017f000000000000000000000000000000000000000000000000000000000000271061344e565b90505b61215a81611c93565b6121b55760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201526506c65616e75760d41b6064820152608401610956565b815b81811161225a576000818152600460205260409020546001600160a01b03166122485760006121e58261226e565b60408051808201825282516001600160a01b0390811682526020938401516001600160401b039081168584019081526000888152600490965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b806122528161349c565b9150506121b7565b506122668160016134ea565b600855505050565b604080518082019091526000808252602082015261228b82611c93565b6122ea5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610956565b60007f0000000000000000000000000000000000000000000000000000000000000064831061234b5761233d7f00000000000000000000000000000000000000000000000000000000000000648461344e565b6123489060016134ea565b90505b825b8181106123b4576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b031691830191909152156123a157949350505050565b50806123ac816135ce565b91505061234d565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610956565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0384163b1561255b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906124a99033908990889088906004016135e5565b6020604051808303816000875af19250505080156124e4575060408051601f3d908101601f191682019092526124e191810190613622565b60015b612541573d808015612512576040519150601f19603f3d011682016040523d82523d6000602084013e612517565b606091505b5080516000036125395760405162461bcd60e51b815260040161095690613502565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b26565b506001611b26565b6060600d8054610a6190613404565b6060816000036125995750506040805180820190915260018152600360fc1b602082015290565b8160005b81156125c357806125ad8161349c565b91506125bc9050600a83613655565b915061259d565b6000816001600160401b038111156125dd576125dd61309c565b6040519080825280601f01601f191660200182016040528015612607576020820181803683370190505b5090505b8415611b265761261c60018361344e565b9150612629600a86613669565b6126349060306134ea565b60f81b818381518110612649576126496134b5565b60200101906001600160f81b031916908160001a90535061266b600a86613655565b945061260b565b60006001600160a01b0382166126e45760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b6064820152608401610956565b506001600160a01b0316600090815260056020526040902054600160801b90046001600160801b031690565b600061271e85858585611a8d565b6001600160a01b03811660009081526010602052604090205490915060ff166127825760405162461bcd60e51b8152602060048201526016602482015275139bdd08185d5d1a1bdc9a5e9959081d1bc81b5a5b9d60521b6044820152606401610956565b5050505050565b60008060006127988585612a7d565b9150915061128781612aeb565b6001546001600160a01b0384166128085760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610956565b61281181611c93565b1561285e5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610956565b7f00000000000000000000000000000000000000000000000000000000000000648311156128d95760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401610956565b6001600160a01b0384166000908152600560209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906129359087906135ac565b6001600160801b0316815260200185836020015161295391906135ac565b6001600160801b039081169091526001600160a01b0380881660008181526005602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526004909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015612a725760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612a366000888488612465565b612a525760405162461bcd60e51b815260040161095690613502565b81612a5c8161349c565b9250508080612a6a9061349c565b9150506129e9565b50600181905561207f565b6000808251604103612ab35760208301516040840151606085015160001a612aa787828585612ca1565b94509450505050612ae4565b8251604003612adc5760208301516040840151612ad1868383612d8e565b935093505050612ae4565b506000905060025b9250929050565b6000816004811115612aff57612aff61367d565b03612b075750565b6001816004811115612b1b57612b1b61367d565b03612b685760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610956565b6002816004811115612b7c57612b7c61367d565b03612bc95760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610956565b6003816004811115612bdd57612bdd61367d565b03612c355760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610956565b6004816004811115612c4957612c4961367d565b03611bc65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610956565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612cd85750600090506003612d85565b8460ff16601b14158015612cf057508460ff16601c14155b15612d015750600090506004612d85565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612d55573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612d7e57600060019250925050612d85565b9150600090505b94509492505050565b6000806001600160ff1b03831681612dab60ff86901c601b6134ea565b9050612db987828885612ca1565b935093505050935093915050565b828054612dd390613404565b90600052602060002090601f016020900481019282612df55760008555612e3b565b82601f10612e0e5782800160ff19823516178555612e3b565b82800160010185558215612e3b579182015b82811115612e3b578235825591602001919060010190612e20565b506110c89291505b808211156110c85760008155600101612e43565b6001600160e01b031981168114611bc657600080fd5b600060208284031215612e7f57600080fd5b813561188a81612e57565b80356001600160a01b0381168114612ea157600080fd5b919050565b60008060408385031215612eb957600080fd5b612ec283612e8a565b946020939093013593505050565b60005b83811015612eeb578181015183820152602001612ed3565b838111156116d85750506000910152565b60008151808452612f14816020860160208601612ed0565b601f01601f19169290920160200192915050565b60208152600061188a6020830184612efc565b600060208284031215612f4d57600080fd5b5035919050565b600080600060608486031215612f6957600080fd5b612f7284612e8a565b9250612f8060208501612e8a565b9150604084013590509250925092565b600060208284031215612fa257600080fd5b61188a82612e8a565b60008060208385031215612fbe57600080fd5b82356001600160401b0380821115612fd557600080fd5b818501915085601f830112612fe957600080fd5b813581811115612ff857600080fd5b86602082850101111561300a57600080fd5b60209290920196919550909350505050565b6020808252825182820181905260009190848201906040850190845b8181101561305457835183529284019291840191600101613038565b50909695505050505050565b6000806040838503121561307357600080fd5b61307c83612e8a565b91506020830135801515811461309157600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156130da576130da61309c565b604052919050565b60006001600160401b038211156130fb576130fb61309c565b5060051b60200190565b600082601f83011261311657600080fd5b8135602061312b613126836130e2565b6130b2565b82815260059290921b8401810191818101908684111561314a57600080fd5b8286015b84811015613165578035835291830191830161314e565b509695505050505050565b6000806040838503121561318357600080fd5b82356001600160401b038082111561319a57600080fd5b818501915085601f8301126131ae57600080fd5b813560206131be613126836130e2565b82815260059290921b840181019181810190898411156131dd57600080fd5b948201945b83861015613202576131f386612e8a565b825294820194908201906131e2565b9650508601359250508082111561321857600080fd5b5061322585828601613105565b9150509250929050565b600082601f83011261324057600080fd5b81356001600160401b038111156132595761325961309c565b61326c601f8201601f19166020016130b2565b81815284602083860101111561328157600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080608085870312156132b457600080fd5b6132bd85612e8a565b93506132cb60208601612e8a565b92506040850135915060608501356001600160401b038111156132ed57600080fd5b6132f98782880161322f565b91505092959194509250565b6000806040838503121561331857600080fd5b61332183612e8a565b915061332f60208401612e8a565b90509250929050565b60008060006060848603121561334d57600080fd5b833592506020840135915060408401356001600160401b0381111561337157600080fd5b61337d8682870161322f565b9150509250925092565b6000806000806080858703121561339d57600080fd5b6133a685612e8a565b9350602085013592506040850135915060608501356001600160401b038111156132ed57600080fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061341857607f821691505b60208210810361131957634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008282101561346057613460613438565b500390565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000600182016134ae576134ae613438565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60008160001904831182151516156134e5576134e5613438565b500290565b600082198211156134fd576134fd613438565b500190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60008351613567818460208801612ed0565b83519083019061357b818360208801612ed0565b01949350505050565b60006001600160801b03838116908316818110156135a4576135a4613438565b039392505050565b60006001600160801b0380831681851680830382111561357b5761357b613438565b6000816135dd576135dd613438565b506000190190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061361890830184612efc565b9695505050505050565b60006020828403121561363457600080fd5b815161188a81612e57565b634e487b7160e01b600052601260045260246000fd5b6000826136645761366461363f565b500490565b6000826136785761367861363f565b500690565b634e487b7160e01b600052602160045260246000fdfea26469706673582212206b2a4415e77601e4b9c1f76a344a87b8022f4b79ffd01e3808c2bba9d62199cc64736f6c634300080d0033

Deployed Bytecode Sourcemap

54220:6916:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60204:11;:9;:11::i;:::-;54220:6916;;;;;37687:422;;;;;;;;;;-1:-1:-1;37687:422:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;37687:422:0;;;;;;;;55928:194;;;;;;;;;;-1:-1:-1;55928:194:0;;;;;:::i;:::-;;:::i;39648:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;41343:292::-;;;;;;;;;;-1:-1:-1;41343:292:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2129:32:1;;;2111:51;;2099:2;2084:18;41343:292:0;1965:203:1;40864:413:0;;;;;;;;;;-1:-1:-1;40864:413:0;;;;;:::i;:::-;;:::i;58398:147::-;;;;;;;;;;;;;:::i;58553:100::-;;;;;;;;;;;;;:::i;36039:104::-;;;;;;;;;;;;;:::i;:::-;;;2319:25:1;;;2307:2;2292:18;36039:104:0;2173:177:1;54573:67:0;;;;;;;;;;-1:-1:-1;54573:67:0;;;;-1:-1:-1;;;;;54573:67:0;;;42370:162;;;;;;;;;;-1:-1:-1;42370:162:0;;;;;:::i;:::-;;:::i;59772:97::-;;;;;;;;;;-1:-1:-1;59772:97:0;;;;;:::i;:::-;;:::i;60567:156::-;;;;;;;;;;-1:-1:-1;60567:156:0;;;;;:::i;:::-;;:::i;36751:864::-;;;;;;;;;;-1:-1:-1;36751:864:0;;;;;:::i;:::-;;:::i;54315:42::-;;;;;;;;;;;;54352:5;54315:42;;54366:31;;;;;;;;;;;;;;;;42603:177;;;;;;;;;;-1:-1:-1;42603:177:0;;;;;:::i;:::-;;:::i;58810:94::-;;;;;;;;;;;;;:::i;60852:106::-;;;;;;;;;;-1:-1:-1;60852:106:0;;;;;:::i;:::-;;:::i;36220:228::-;;;;;;;;;;-1:-1:-1;36220:228:0;;;;;:::i;:::-;;:::i;58661:141::-;;;;;;;;;;;;;:::i;59034:106::-;;;;;;;;;;-1:-1:-1;59034:106:0;;;;;:::i;:::-;;:::i;39457:124::-;;;;;;;;;;-1:-1:-1;39457:124:0;;;;;:::i;:::-;;:::i;38173:258::-;;;;;;;;;;-1:-1:-1;38173:258:0;;;;;:::i;:::-;;:::i;53338:103::-;;;;;;;;;;;;;:::i;59192:572::-;;;;;;;;;;-1:-1:-1;59192:572:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57062:486::-;;;;;;:::i;:::-;;:::i;52687:87::-;;;;;;;;;;-1:-1:-1;52733:7:0;52760:6;-1:-1:-1;;;;;52760:6:0;52687:87;;60342:96;;;;;;;;;;-1:-1:-1;60342:96:0;;;;;:::i;:::-;;:::i;60966:167::-;;;;;;;;;;-1:-1:-1;60966:167:0;;;;;:::i;:::-;;:::i;:::-;;;;4345:13:1;;-1:-1:-1;;;;;4341:39:1;4323:58;;4441:4;4429:17;;;4423:24;-1:-1:-1;;;;;4419:49:1;4397:20;;;4390:79;;;;4296:18;60966:167:0;4113:362:1;39817:104:0;;;;;;;;;;;;;:::i;60446:113::-;;;;;;;;;;-1:-1:-1;60446:113:0;;;;;:::i;:::-;;:::i;41707:311::-;;;;;;;;;;-1:-1:-1;41707:311:0;;;;;:::i;:::-;;:::i;55662:258::-;;;;;;;;;;-1:-1:-1;55662:258:0;;;;;:::i;:::-;;:::i;59877:87::-;;;;;;;;;;;;;:::i;60231:103::-;;;;;;;;;;-1:-1:-1;60305:21:0;60231:103;;42851:355;;;;;;;;;;-1:-1:-1;42851:355:0;;;;;:::i;:::-;;:::i;55504:150::-;;;;;;;;;;-1:-1:-1;55504:150:0;;;;;:::i;:::-;;:::i;39992:468::-;;;;;;;;;;-1:-1:-1;39992:468:0;;;;;:::i;:::-;;:::i;54649:73::-;;;;;;;;;;-1:-1:-1;54649:73:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;47747:43;;;;;;;;;;;;;;;;54404:37;;;;;;;;;;;;;;;;60731:113;;;;;;;;;;-1:-1:-1;60731:113:0;;;;;:::i;:::-;;:::i;42089:214::-;;;;;;;;;;-1:-1:-1;42089:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;42260:25:0;;;42231:4;42260:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;42089:214;54729:45;;;;;;;;;;-1:-1:-1;54729:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;56420:634;;;;;;:::i;:::-;;:::i;57949:441::-;;;;;;;;;;-1:-1:-1;57949:441:0;;;;;:::i;:::-;;:::i;53596:201::-;;;;;;;;;;-1:-1:-1;53596:201:0;;;;;:::i;:::-;;:::i;54502:25::-;;;;;;;;;;;;;;;;59972:186;60074:7;;:28;;60305:21;;60013:11;;-1:-1:-1;;;;;60074:7:0;;;;60305:21;;60013:11;60074:28;60013:11;60074:28;60305:21;60074:7;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60054:48;;;60121:8;60113:37;;;;-1:-1:-1;;;60113:37:0;;10001:2:1;60113:37:0;;;9983:21:1;10040:2;10020:18;;;10013:30;-1:-1:-1;;;10059:18:1;;;10052:46;10115:18;;60113:37:0;;;;;;;;;60002:156;;59972:186::o;37687:422::-;37834:4;-1:-1:-1;;;;;;37876:40:0;;-1:-1:-1;;;37876:40:0;;:105;;-1:-1:-1;;;;;;;37933:48:0;;-1:-1:-1;;;37933:48:0;37876:105;:172;;;-1:-1:-1;;;;;;;37998:50:0;;-1:-1:-1;;;37998:50:0;37876:172;:225;;;-1:-1:-1;;;;;;;;;;11448:40:0;;;38065:36;37856:245;37687:422;-1:-1:-1;;37687:422:0:o;55928:194::-;52733:7;52760:6;-1:-1:-1;;;;;52760:6:0;33449:10;52907:23;52899:68;;;;-1:-1:-1;;;52899:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56013:17:0;::::1;56005:42;;;::::0;-1:-1:-1;;;56005:42:0;;10707:2:1;56005:42:0::1;::::0;::::1;10689:21:1::0;10746:2;10726:18;;;10719:30;-1:-1:-1;;;10765:18:1;;;10758:42;10817:18;;56005:42:0::1;10505:336:1::0;56005:42:0::1;56058:21;56070:8;56058:11;:21::i;:::-;56090:24;56100:3;56105:8;56090:9;:24::i;39648:100::-:0;39702:13;39735:5;39728:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39648:100;:::o;41343:292::-;41447:7;41494:16;41502:7;41494;:16::i;:::-;41472:111;;;;-1:-1:-1;;;41472:111:0;;11433:2:1;41472:111:0;;;11415:21:1;11472:2;11452:18;;;11445:30;11511:34;11491:18;;;11484:62;-1:-1:-1;;;11562:18:1;;;11555:43;11615:19;;41472:111:0;11231:409:1;41472:111:0;-1:-1:-1;41603:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;41603:24:0;;41343:292::o;40864:413::-;40937:13;40953:24;40969:7;40953:15;:24::i;:::-;40937:40;;41002:5;-1:-1:-1;;;;;40996:11:0;:2;-1:-1:-1;;;;;40996:11:0;;40988:58;;;;-1:-1:-1;;;40988:58:0;;11847:2:1;40988:58:0;;;11829:21:1;11886:2;11866:18;;;11859:30;11925:34;11905:18;;;11898:62;-1:-1:-1;;;11976:18:1;;;11969:32;12018:19;;40988:58:0;11645:398:1;40988:58:0;33449:10;-1:-1:-1;;;;;41081:21:0;;;;:62;;-1:-1:-1;41106:37:0;41123:5;33449:10;42089:214;:::i;41106:37::-;41059:169;;;;-1:-1:-1;;;41059:169:0;;12250:2:1;41059:169:0;;;12232:21:1;12289:2;12269:18;;;12262:30;12328:34;12308:18;;;12301:62;12399:27;12379:18;;;12372:55;12444:19;;41059:169:0;12048:421:1;41059:169:0;41241:28;41250:2;41254:7;41263:5;41241:8;:28::i;:::-;40926:351;40864:413;;:::o;58398:147::-;52733:7;52760:6;-1:-1:-1;;;;;52760:6:0;33449:10;52907:23;52899:68;;;;-1:-1:-1;;;52899:68:0;;;;;;;:::i;:::-;58463:10:::1;;58477:1;58463:15:::0;58455:57:::1;;;::::0;-1:-1:-1;;;58455:57:0;;12676:2:1;58455:57:0::1;::::0;::::1;12658:21:1::0;12715:2;12695:18;;;12688:30;12754:31;12734:18;;;12727:59;12803:18;;58455:57:0::1;12474:353:1::0;58455:57:0::1;58536:1;58523:10;:14:::0;58398:147::o;58553:100::-;52733:7;52760:6;-1:-1:-1;;;;;52760:6:0;33449:10;52907:23;52899:68;;;;-1:-1:-1;;;52899:68:0;;;;;;;:::i;:::-;54834:10:::1;;54848:1;54834:15;54826:53;;;::::0;-1:-1:-1;;;54826:53:0;;13034:2:1;54826:53:0::1;::::0;::::1;13016:21:1::0;13073:2;13053:18;;;13046:30;-1:-1:-1;;;13092:18:1;;;13085:55;13157:18;;54826:53:0::1;12832:349:1::0;54826:53:0::1;58644:1:::2;58631:10;:14:::0;58553:100::o;36039:104::-;36092:7;36134:1;36119:12;;:16;;;;:::i;:::-;36112:23;;36039:104;:::o;42370:162::-;42496:28;42506:4;42512:2;42516:7;42496:9;:28::i;59772:97::-;52733:7;52760:6;-1:-1:-1;;;;;52760:6:0;33449:10;52907:23;52899:68;;;;-1:-1:-1;;;52899:68:0;;;;;;;:::i;:::-;59843:7:::1;:18:::0;;-1:-1:-1;;;;;;59843:18:0::1;-1:-1:-1::0;;;;;59843:18:0;;;::::1;::::0;;;::::1;::::0;;59772:97::o;60567:156::-;52733:7;52760:6;-1:-1:-1;;;;;52760:6:0;33449:10;52907:23;52899:68;;;;-1:-1:-1;;;52899:68:0;;;;;;;:::i;:::-;31743:1:::1;32341:7;;:19:::0;32333:63:::1;;;;-1:-1:-1::0;;;32333:63:0::1;;;;;;;:::i;:::-;31743:1;32474:7;:18:::0;60687:28:::2;60706:8:::0;60687:18:::2;:28::i;:::-;-1:-1:-1::0;31699:1:0::1;32653:7;:22:::0;60567:156::o;36751:864::-;36876:7;36917:16;36927:5;36917:9;:16::i;:::-;36909:5;:24;36901:71;;;;-1:-1:-1;;;36901:71:0;;14010:2:1;36901:71:0;;;13992:21:1;14049:2;14029:18;;;14022:30;14088:34;14068:18;;;14061:62;-1:-1:-1;;;14139:18:1;;;14132:32;14181:19;;36901:71:0;13808:398:1;36901:71:0;36983:22;37008:13;:11;:13::i;:::-;36983:38;;37032:19;37066:25;37120:9;37115:426;37139:14;37135:1;:18;37115:426;;;37175:31;37209:14;;;:11;:14;;;;;;;;;37175:48;;;;;;;;;-1:-1:-1;;;;;37175:48:0;;;;;-1:-1:-1;;;37175:48:0;;;-1:-1:-1;;;;;37175:48:0;;;;;;;;37242:28;37238:103;;37311:14;;;-1:-1:-1;37238:103:0;37380:5;-1:-1:-1;;;;;37359:26:0;:17;-1:-1:-1;;;;;37359:26:0;;37355:175;;37425:5;37410:11;:20;37406:77;;-1:-1:-1;37462:1:0;-1:-1:-1;37455:8:0;;-1:-1:-1;;;37455:8:0;37406:77;37501:13;;;;:::i;:::-;;;;37355:175;-1:-1:-1;37155:3:0;;;;:::i;:::-;;;;37115:426;;;-1:-1:-1;37551:56:0;;-1:-1:-1;;;37551:56:0;;14553:2:1;37551:56:0;;;14535:21:1;14592:2;14572:18;;;14565:30;14631:34;14611:18;;;14604:62;-1:-1:-1;;;14682:18:1;;;14675:44;14736:19;;37551:56:0;14351:410:1;42603:177:0;42733:39;42750:4;42756:2;42760:7;42733:39;;;;;;;;;;;;:16;:39::i;58810:94::-;52733:7;52760:6;-1:-1:-1;;;;;52760:6:0;33449:10;52907:23;52899:68;;;;-1:-1:-1;;;52899:68:0;;;;;;;:::i;:::-;54955:10:::1;;54969:1;54955:15;54947:50;;;::::0;-1:-1:-1;;;54947:50:0;;14968:2:1;54947:50:0::1;::::0;::::1;14950:21:1::0;15007:2;14987:18;;;14980:30;-1:-1:-1;;;15026:18:1;;;15019:52;15088:18;;54947:50:0::1;14766:346:1::0;60852:106:0;60909:4;60933:17;60941:8;60933:7;:17::i;36220:228::-;36323:7;36364:13;:11;:13::i;:::-;36356:5;:21;36348:69;;;;-1:-1:-1;;;36348:69:0;;15319:2:1;36348:69:0;;;15301:21:1;15358:2;15338:18;;;15331:30;15397:34;15377:18;;;15370:62;-1:-1:-1;;;15448:18:1;;;15441:33;15491:19;;36348:69:0;15117:399:1;36348:69:0;-1:-1:-1;36435:5:0;36220:228::o;58661:141::-;52733:7;52760:6;-1:-1:-1;;;;;52760:6:0;33449:10;52907:23;52899:68;;;;-1:-1:-1;;;52899:68:0;;;;;;;:::i;:::-;58723:10:::1;;58737:1;58723:15:::0;58715:54:::1;;;::::0;-1:-1:-1;;;58715:54:0;;15723:2:1;58715:54:0::1;::::0;::::1;15705:21:1::0;15762:2;15742:18;;;15735:30;15801:28;15781:18;;;15774:56;15847:18;;58715:54:0::1;15521:350:1::0;58715:54:0::1;58793:1;58780:10;:14:::0;58661:141::o;59034:106::-;52733:7;52760:6;-1:-1:-1;;;;;52760:6:0;33449:10;52907:23;52899:68;;;;-1:-1:-1;;;52899:68:0;;;;;;;:::i;:::-;59109:23:::1;:13;59125:7:::0;;59109:23:::1;:::i;39457:124::-:0;39521:7;39548:20;39560:7;39548:11;:20::i;:::-;:25;;39457:124;-1:-1:-1;;39457:124:0:o;38173:258::-;38237:7;-1:-1:-1;;;;;38279:19:0;;38257:112;;;;-1:-1:-1;;;38257:112:0;;16078:2:1;38257:112:0;;;16060:21:1;16117:2;16097:18;;;16090:30;16156:34;16136:18;;;16129:62;-1:-1:-1;;;16207:18:1;;;16200:41;16258:19;;38257:112:0;15876:407:1;38257:112:0;-1:-1:-1;;;;;;38395:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;38395:27:0;;38173:258::o;53338:103::-;52733:7;52760:6;-1:-1:-1;;;;;52760:6:0;33449:10;52907:23;52899:68;;;;-1:-1:-1;;;52899:68:0;;;;;;;:::i;:::-;53403:30:::1;53430:1;53403:18;:30::i;:::-;53338:103::o:0;59192:572::-;59281:16;59315:18;59336:17;59346:6;59336:9;:17::i;:::-;59315:38;;59368:10;59382:1;59368:15;59364:393;;59445:16;;;59459:1;59445:16;;;;;;;;;;;-1:-1:-1;59438:23:0;59192:572;-1:-1:-1;;;59192:572:0:o;59364:393::-;59494:23;59534:10;-1:-1:-1;;;;;59520:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59520:25:0;;59494:51;;59560:13;59588:130;59612:10;59604:5;:18;59588:130;;;59668:34;59688:6;59696:5;59668:19;:34::i;:::-;59652:6;59659:5;59652:13;;;;;;;;:::i;:::-;;;;;;;;;;:50;59624:7;;;;:::i;:::-;;;;59588:130;;59364:393;59304:460;59192:572;;;:::o;57062:486::-;31743:1;32341:7;;:19;32333:63;;;;-1:-1:-1;;;32333:63:0;;;;;;;:::i;:::-;31743:1;32474:7;:18;;;54834:10:::1;::::0;:15:::1;54826:53;;;::::0;-1:-1:-1;;;54826:53:0;;13034:2:1;54826:53:0::1;::::0;::::1;13016:21:1::0;13073:2;13053:18;;;13046:30;-1:-1:-1;;;13092:18:1;;;13085:55;13157:18;;54826:53:0::1;12832:349:1::0;54826:53:0::1;55068:9:::2;33449:10:::0;55068:25:::2;55060:68;;;::::0;-1:-1:-1;;;55060:68:0;;16622:2:1;55060:68:0::2;::::0;::::2;16604:21:1::0;16661:2;16641:18;;;16634:30;16700:32;16680:18;;;16673:60;16750:18;;55060:68:0::2;16420:354:1::0;55060:68:0::2;57227:8:::3;55251:9;55239:8;55227:9;;:20;;;;:::i;:::-;:33;;55205:114;;;::::0;-1:-1:-1;;;55205:114:0;;17154:2:1;55205:114:0::3;::::0;::::3;17136:21:1::0;17193:2;17173:18;;;17166:30;17232:33;17212:18;;;17205:61;17283:18;;55205:114:0::3;16952:355:1::0;55205:114:0::3;57253:21:::4;57265:8;57253:11;:21::i;:::-;57357:11;::::0;33449:10;57307:32:::4;::::0;;;:18:::4;:32;::::0;;;;;;;57340:1:::4;57307:35:::0;;;;;;;;:46:::4;::::0;57345:8;;57307:46:::4;:::i;:::-;:61;;57285:131;;;::::0;-1:-1:-1;;;57285:131:0;;17647:2:1;57285:131:0::4;::::0;::::4;17629:21:1::0;17686:2;17666:18;;;17659:30;-1:-1:-1;;;17705:18:1;;;17698:50;17765:18;;57285:131:0::4;17445:344:1::0;57285:131:0::4;33449:10:::0;57427:32:::4;::::0;;;:18:::4;:32;::::0;;;;;;;57460:1:::4;57427:35:::0;;;;;;;:47;;57466:8;;57427:32;:47:::4;::::0;57466:8;;57427:47:::4;:::i;:::-;::::0;;;-1:-1:-1;57485:33:0::4;::::0;-1:-1:-1;33449:10:0;57509:8:::4;57485:9;:33::i;:::-;57529:11;:9;:11::i;:::-;-1:-1:-1::0;;31699:1:0;32653:7;:22;57062:486::o;60342:96::-;52733:7;52760:6;-1:-1:-1;;;;;52760:6:0;33449:10;52907:23;52899:68;;;;-1:-1:-1;;;52899:68:0;;;;;;;:::i;:::-;60409:9:::1;:21:::0;60342:96::o;60966:167::-;-1:-1:-1;;;;;;;;;;;;;;;;;61105:20:0;61117:7;61105:11;:20::i;39817:104::-;39873:13;39906:7;39899:14;;;;;:::i;60446:113::-;52733:7;52760:6;-1:-1:-1;;;;;52760:6:0;33449:10;52907:23;52899:68;;;;-1:-1:-1;;;52899:68:0;;;;;;;:::i;:::-;60525:11:::1;:26:::0;60446:113::o;41707:311::-;33449:10;-1:-1:-1;;;;;41825:24:0;;;41817:63;;;;-1:-1:-1;;;41817:63:0;;17996:2:1;41817:63:0;;;17978:21:1;18035:2;18015:18;;;18008:30;18074:28;18054:18;;;18047:56;18120:18;;41817:63:0;17794:350:1;41817:63:0;33449:10;41893:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;41893:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;41893:53:0;;;;;;;;;;41962:48;;540:41:1;;;41893:42:0;;33449:10;41962:48;;513:18:1;41962:48:0;;;;;;;41707:311;;:::o;55662:258::-;52733:7;52760:6;-1:-1:-1;;;;;52760:6:0;33449:10;52907:23;52899:68;;;;-1:-1:-1;;;52899:68:0;;;;;;;:::i;:::-;55800:10;;55782:15:::1;55821:92;55845:7;55841:1;:11;55821:92;;;55874:27;55883:3;55887:1;55883:6;;;;;;;;:::i;:::-;;;;;;;55891;55898:1;55891:9;;;;;;;;:::i;:::-;;;;;;;55874:8;:27::i;:::-;55854:3:::0;::::1;::::0;::::1;:::i;:::-;;;;55821:92;;;;55771:149;55662:258:::0;;:::o;59877:87::-;52733:7;52760:6;-1:-1:-1;;;;;52760:6:0;33449:10;52907:23;52899:68;;;;-1:-1:-1;;;52899:68:0;;;;;;;:::i;:::-;31743:1:::1;32341:7;;:19:::0;32333:63:::1;;;;-1:-1:-1::0;;;32333:63:0::1;;;;;;;:::i;:::-;31743:1;32474:7;:18:::0;59945:11:::2;:9;:11::i;:::-;31699:1:::1;32653:7;:22:::0;59877:87::o;42851:355::-;43010:28;43020:4;43026:2;43030:7;43010:9;:28::i;:::-;43071:48;43094:4;43100:2;43104:7;43113:5;43071:22;:48::i;:::-;43049:149;;;;-1:-1:-1;;;43049:149:0;;;;;;;:::i;55504:150::-;52733:7;52760:6;-1:-1:-1;;;;;52760:6:0;33449:10;52907:23;52899:68;;;;-1:-1:-1;;;52899:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;55614:22:0;;;::::1;;::::0;;;:13:::1;:22;::::0;;;;:32;;-1:-1:-1;;55614:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55504:150::o;39992:468::-;40110:13;40163:16;40171:7;40163;:16::i;:::-;40141:113;;;;-1:-1:-1;;;40141:113:0;;18771:2:1;40141:113:0;;;18753:21:1;18810:2;18790:18;;;18783:30;18849:34;18829:18;;;18822:62;-1:-1:-1;;;18900:18:1;;;18893:45;18955:19;;40141:113:0;18569:411:1;40141:113:0;40267:21;40291:10;:8;:10::i;:::-;40267:34;;40356:1;40338:7;40332:21;:25;:120;;;;;;;;;;;;;;;;;40401:7;40410:18;:7;:16;:18::i;:::-;40384:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40332:120;40312:140;39992:468;-1:-1:-1;;;39992:468:0:o;60731:113::-;60789:7;60816:20;60830:5;60816:13;:20::i;56420:634::-;31743:1;32341:7;;:19;32333:63;;;;-1:-1:-1;;;32333:63:0;;;;;;;:::i;:::-;31743:1;32474:7;:18;54955:10:::1;::::0;54969:1:::1;54955:15;54947:50;;;::::0;-1:-1:-1;;;54947:50:0;;14968:2:1;54947:50:0::1;::::0;::::1;14950:21:1::0;15007:2;14987:18;;;14980:30;-1:-1:-1;;;15026:18:1;;;15019:52;15088:18;;54947:50:0::1;14766:346:1::0;54947:50:0::1;55068:9:::2;33449:10:::0;55068:25:::2;55060:68;;;::::0;-1:-1:-1;;;55060:68:0;;16622:2:1;55060:68:0::2;::::0;::::2;16604:21:1::0;16661:2;16641:18;;;16634:30;16700:32;16680:18;;;16673:60;16750:18;;55060:68:0::2;16420:354:1::0;55060:68:0::2;56666:8:::3;55251:9;55239:8;55227:9;;:20;;;;:::i;:::-;:33;;55205:114;;;::::0;-1:-1:-1;;;55205:114:0;;17154:2:1;55205:114:0::3;::::0;::::3;17136:21:1::0;17193:2;17173:18;;;17166:30;17232:33;17212:18;;;17205:61;17283:18;;55205:114:0::3;16952:355:1::0;55205:114:0::3;56692:56:::4;33449:10:::0;56715:8:::4;56725:10;56737;56692:8;:56::i;:::-;56759:21;56771:8;56759:11;:21::i;:::-;56863:11;::::0;33449:10;56813:32:::4;::::0;;;:18:::4;:32;::::0;;;;;;;56846:1:::4;56813:35:::0;;;;;;;;:46:::4;::::0;56851:8;;56813:46:::4;:::i;:::-;:61;;56791:131;;;::::0;-1:-1:-1;;;56791:131:0;;17647:2:1;56791:131:0::4;::::0;::::4;17629:21:1::0;17686:2;17666:18;;;17659:30;-1:-1:-1;;;17705:18:1;;;17698:50;17765:18;;56791:131:0::4;17445:344:1::0;56791:131:0::4;33449:10:::0;56933:32:::4;::::0;;;:18:::4;:32;::::0;;;;;;;56966:1:::4;56933:35:::0;;;;;;;:47;;56972:8;;56933:32;:47:::4;::::0;56972:8;;56933:47:::4;:::i;:::-;::::0;;;-1:-1:-1;56991:33:0::4;::::0;-1:-1:-1;33449:10:0;57015:8:::4;56991:9;:33::i;:::-;57035:11;:9;:11::i;:::-;-1:-1:-1::0;;31699:1:0;32653:7;:22;-1:-1:-1;;56420:634:0:o;57949:441::-;58178:54;;;58197:4;58178:54;;;;19729:34:1;;;;-1:-1:-1;;;;;19799:15:1;;19779:18;;;19772:43;19831:18;;;19824:34;;;19874:18;;;;19867:34;;;58178:54:0;;;;;;;;;;19663:19:1;;;58178:54:0;;58154:89;;;;;;26632:66:1;28818:58:0;;;26620:79:1;26715:12;;;;26708:28;;;28818:58:0;;;;;;;;;;26752:12:1;;;;28818:58:0;;;28808:69;;;;;-1:-1:-1;;58154:89:0;58335:47;58349:20;58371:10;58335:13;:47::i;:::-;58328:54;;;;57949:441;;;;;;;:::o;53596:201::-;52733:7;52760:6;-1:-1:-1;;;;;52760:6:0;33449:10;52907:23;52899:68;;;;-1:-1:-1;;;52899:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53685:22:0;::::1;53677:73;;;::::0;-1:-1:-1;;;53677:73:0;;20114:2:1;53677:73:0::1;::::0;::::1;20096:21:1::0;20153:2;20133:18;;;20126:30;20192:34;20172:18;;;20165:62;-1:-1:-1;;;20243:18:1;;;20236:36;20289:19;;53677:73:0::1;19912:402:1::0;53677:73:0::1;53761:28;53780:8;53761:18;:28::i;:::-;53596:201:::0;:::o;56130:282::-;56212:1;56201:8;:12;56193:47;;;;-1:-1:-1;;;56193:47:0;;20521:2:1;56193:47:0;;;20503:21:1;20560:2;20540:18;;;20533:30;-1:-1:-1;;;20579:18:1;;;20572:52;20641:18;;56193:47:0;20319:346:1;56193:47:0;56251:14;56268:13;:11;:13::i;:::-;56251:30;-1:-1:-1;54352:5:0;56314:17;56323:8;56251:30;56314:17;:::i;:::-;:31;;56292:112;;;;-1:-1:-1;;;56292:112:0;;20872:2:1;56292:112:0;;;20854:21:1;20911:2;20891:18;;;20884:30;20950:33;20930:18;;;20923:61;21001:18;;56292:112:0;20670:355:1;43595:104:0;43664:27;43674:2;43678:8;43664:27;;;;;;;;;;;;:9;:27::i;43461:126::-;43518:4;43552:12;;43542:7;:22;:37;;;;-1:-1:-1;;43568:11:0;;;43461:126::o;47543:196::-;47658:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;47658:29:0;-1:-1:-1;;;;;47658:29:0;;;;;;;;;47703:28;;47658:24;;47703:28;;;;;;;47543:196;;;:::o;45716:1709::-;45831:35;45869:20;45881:7;45869:11;:20::i;:::-;45944:18;;45831:58;;-1:-1:-1;45902:22:0;;-1:-1:-1;;;;;45928:34:0;33449:10;-1:-1:-1;;;;;45928:34:0;;:87;;;-1:-1:-1;33449:10:0;45979:20;45991:7;45979:11;:20::i;:::-;-1:-1:-1;;;;;45979:36:0;;45928:87;:154;;;-1:-1:-1;46049:18:0;;46032:50;;33449:10;42089:214;:::i;46032:50::-;45902:181;;46118:17;46096:117;;;;-1:-1:-1;;;46096:117:0;;21232:2:1;46096:117:0;;;21214:21:1;21271:2;21251:18;;;21244:30;21310:34;21290:18;;;21283:62;-1:-1:-1;;;21361:18:1;;;21354:48;21419:19;;46096:117:0;21030:414:1;46096:117:0;46270:4;-1:-1:-1;;;;;46248:26:0;:13;:18;;;-1:-1:-1;;;;;46248:26:0;;46226:114;;;;-1:-1:-1;;;46226:114:0;;21651:2:1;46226:114:0;;;21633:21:1;21690:2;21670:18;;;21663:30;21729:34;21709:18;;;21702:62;-1:-1:-1;;;21780:18:1;;;21773:36;21826:19;;46226:114:0;21449:402:1;46226:114:0;-1:-1:-1;;;;;46359:16:0;;46351:66;;;;-1:-1:-1;;;46351:66:0;;22058:2:1;46351:66:0;;;22040:21:1;22097:2;22077:18;;;22070:30;22136:34;22116:18;;;22109:62;-1:-1:-1;;;22187:18:1;;;22180:35;22232:19;;46351:66:0;21856:401:1;46351:66:0;46538:49;46555:1;46559:7;46568:13;:18;;;46538:8;:49::i;:::-;-1:-1:-1;;;;;46600:18:0;;;;;;:12;:18;;;;;:31;;46630:1;;46600:18;:31;;46630:1;;-1:-1:-1;;;;;46600:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;46600:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;46642:16:0;;-1:-1:-1;46642:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;46642:16:0;;:29;;-1:-1:-1;;46642:29:0;;:::i;:::-;;;-1:-1:-1;;;;;46642:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46705:43:0;;;;;;;;-1:-1:-1;;;;;46705:43:0;;;;;-1:-1:-1;;;;;46731:15:0;46705:43;;;;;;;;;-1:-1:-1;46682:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;46682:66:0;-1:-1:-1;;;;;;46682:66:0;;;;;;;;;;;47010:11;46694:7;-1:-1:-1;47010:11:0;:::i;:::-;47077:1;47036:24;;;:11;:24;;;;;:29;46988:33;;-1:-1:-1;;;;;;47036:29:0;47032:288;;47100:20;47108:11;47100:7;:20::i;:::-;47096:213;;;47168:125;;;;;;;;47205:18;;-1:-1:-1;;;;;47168:125:0;;;;;;47246:28;;;;-1:-1:-1;;;;;47168:125:0;;;;;;;;;-1:-1:-1;47141:24:0;;;:11;:24;;;;;;;:152;;;;;;;;;-1:-1:-1;;;47141:152:0;-1:-1:-1;;;;;;47141:152:0;;;;;;;;;;;;47096:213;47356:7;47352:2;-1:-1:-1;;;;;47337:27:0;47346:4;-1:-1:-1;;;;;47337:27:0;;;;;;;;;;;47375:42;45820:1605;;;45716:1709;;;:::o;47903:950::-;47997:24;;48040:12;48032:49;;;;-1:-1:-1;;;48032:49:0;;22973:2:1;48032:49:0;;;22955:21:1;23012:2;22992:18;;;22985:30;23051:26;23031:18;;;23024:54;23095:18;;48032:49:0;22771:348:1;48032:49:0;48092:16;48142:1;48111:28;48131:8;48111:17;:28;:::i;:::-;:32;;;;:::i;:::-;48092:51;-1:-1:-1;48169:18:0;48186:1;48169:14;:18;:::i;:::-;48158:8;:29;48154:91;;;48215:18;48232:1;48215:14;:18;:::i;:::-;48204:29;;48154:91;48368:17;48376:8;48368:7;:17::i;:::-;48360:68;;;;-1:-1:-1;;;48360:68:0;;23326:2:1;48360:68:0;;;23308:21:1;23365:2;23345:18;;;23338:30;23404:34;23384:18;;;23377:62;-1:-1:-1;;;23455:18:1;;;23448:36;23501:19;;48360:68:0;23124:402:1;48360:68:0;48456:17;48439:357;48480:8;48475:1;:13;48439:357;;48545:1;48514:14;;;:11;:14;;;;;:19;-1:-1:-1;;;;;48514:19:0;48510:275;;48568:31;48602:14;48614:1;48602:11;:14::i;:::-;48652:117;;;;;;;;48689:14;;-1:-1:-1;;;;;48652:117:0;;;;;;48726:24;;;;-1:-1:-1;;;;;48652:117:0;;;;;;;;;-1:-1:-1;48635:14:0;;;:11;:14;;;;;;;:134;;;;;;;;;-1:-1:-1;;;48635:134:0;-1:-1:-1;;;;;;48635:134:0;;;;;;;;;;;;-1:-1:-1;48510:275:0;48490:3;;;;:::i;:::-;;;;48439:357;;;-1:-1:-1;48833:12:0;:8;48844:1;48833:12;:::i;:::-;48806:24;:39;-1:-1:-1;;;47903:950:0:o;38713:682::-;-1:-1:-1;;;;;;;;;;;;;;;;;38848:16:0;38856:7;38848;:16::i;:::-;38840:71;;;;-1:-1:-1;;;38840:71:0;;23733:2:1;38840:71:0;;;23715:21:1;23772:2;23752:18;;;23745:30;23811:34;23791:18;;;23784:62;-1:-1:-1;;;23862:18:1;;;23855:40;23912:19;;38840:71:0;23531:406:1;38840:71:0;38924:26;38976:12;38965:7;:23;38961:103;;39026:22;39036:12;39026:7;:22;:::i;:::-;:26;;39051:1;39026:26;:::i;:::-;39005:47;;38961:103;39096:7;39076:242;39113:18;39105:4;:26;39076:242;;39156:31;39190:17;;;:11;:17;;;;;;;;;39156:51;;;;;;;;;-1:-1:-1;;;;;39156:51:0;;;;;-1:-1:-1;;;39156:51:0;;;-1:-1:-1;;;;;39156:51:0;;;;;;;;39226:28;39222:85;;39282:9;38713:682;-1:-1:-1;;;;38713:682:0:o;39222:85::-;-1:-1:-1;39133:6:0;;;;:::i;:::-;;;;39076:242;;;-1:-1:-1;39330:57:0;;-1:-1:-1;;;39330:57:0;;24285:2:1;39330:57:0;;;24267:21:1;24324:2;24304:18;;;24297:30;24363:34;24343:18;;;24336:62;-1:-1:-1;;;24414:18:1;;;24407:45;24469:19;;39330:57:0;24083:411:1;53957:191:0;54031:16;54050:6;;-1:-1:-1;;;;;54067:17:0;;;-1:-1:-1;;;;;;54067:17:0;;;;;;54100:40;;54050:6;;;;;;;54100:40;;54031:16;54100:40;54020:128;53957:191;:::o;49418:985::-;49573:4;-1:-1:-1;;;;;49594:13:0;;1528:19;:23;49590:806;;49647:175;;-1:-1:-1;;;49647:175:0;;-1:-1:-1;;;;;49647:36:0;;;;;:175;;33449:10;;49741:4;;49768:7;;49798:5;;49647:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49647:175:0;;;;;;;;-1:-1:-1;;49647:175:0;;;;;;;;;;;;:::i;:::-;;;49626:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50009:6;:13;50026:1;50009:18;50005:321;;50052:109;;-1:-1:-1;;;50052:109:0;;;;;;;:::i;50005:321::-;50276:6;50270:13;50261:6;50257:2;50253:15;50246:38;49626:715;-1:-1:-1;;;;;;49886:55:0;-1:-1:-1;;;49886:55:0;;-1:-1:-1;49879:62:0;;49590:806;-1:-1:-1;50380:4:0;50373:11;;58912:114;58972:13;59005;58998:20;;;;;:::i;18638:723::-;18694:13;18915:5;18924:1;18915:10;18911:53;;-1:-1:-1;;18942:10:0;;;;;;;;;;;;-1:-1:-1;;;18942:10:0;;;;;18638:723::o;18911:53::-;18989:5;18974:12;19030:78;19037:9;;19030:78;;19063:8;;;;:::i;:::-;;-1:-1:-1;19086:10:0;;-1:-1:-1;19094:2:0;19086:10;;:::i;:::-;;;19030:78;;;19118:19;19150:6;-1:-1:-1;;;;;19140:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19140:17:0;;19118:39;;19168:154;19175:10;;19168:154;;19202:11;19212:1;19202:11;;:::i;:::-;;-1:-1:-1;19271:10:0;19279:2;19271:5;:10;:::i;:::-;19258:24;;:2;:24;:::i;:::-;19245:39;;19228:6;19235;19228:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;19228:56:0;;;;;;;;-1:-1:-1;19299:11:0;19308:2;19299:11;;:::i;:::-;;;19168:154;;38439:266;38500:7;-1:-1:-1;;;;;38542:19:0;;38520:118;;;;-1:-1:-1;;;38520:118:0;;25823:2:1;38520:118:0;;;25805:21:1;25862:2;25842:18;;;25835:30;25901:34;25881:18;;;25874:62;-1:-1:-1;;;25952:18:1;;;25945:47;26009:19;;38520:118:0;25621:413:1;38520:118:0;-1:-1:-1;;;;;;38664:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;38664:32:0;;-1:-1:-1;;;;;38664:32:0;;38439:266::o;57556:385::-;57720:19;57742:119;57772:7;57794:6;57815:10;57840;57742:15;:119::i;:::-;-1:-1:-1;;;;;57880:26:0;;;;;;:13;:26;;;;;;57720:141;;-1:-1:-1;57880:26:0;;57872:61;;;;-1:-1:-1;;;57872:61:0;;26241:2:1;57872:61:0;;;26223:21:1;26280:2;26260:18;;;26253:30;-1:-1:-1;;;26299:18:1;;;26292:52;26361:18;;57872:61:0;26039:346:1;57872:61:0;57709:232;57556:385;;;;:::o;24814:231::-;24892:7;24913:17;24932:18;24954:27;24965:4;24971:9;24954:10;:27::i;:::-;24912:69;;;;24992:18;25004:5;24992:11;:18::i;44062:1400::-;44208:12;;-1:-1:-1;;;;;44239:16:0;;44231:62;;;;-1:-1:-1;;;44231:62:0;;26977:2:1;44231:62:0;;;26959:21:1;27016:2;26996:18;;;26989:30;27055:34;27035:18;;;27028:62;-1:-1:-1;;;27106:18:1;;;27099:31;27147:19;;44231:62:0;26775:397:1;44231:62:0;44438:21;44446:12;44438:7;:21::i;:::-;44437:22;44429:64;;;;-1:-1:-1;;;44429:64:0;;27379:2:1;44429:64:0;;;27361:21:1;27418:2;27398:18;;;27391:30;27457:31;27437:18;;;27430:59;27506:18;;44429:64:0;27177:353:1;44429:64:0;44524:12;44512:8;:24;;44504:71;;;;-1:-1:-1;;;44504:71:0;;27737:2:1;44504:71:0;;;27719:21:1;27776:2;27756:18;;;27749:30;27815:34;27795:18;;;27788:62;-1:-1:-1;;;27866:18:1;;;27859:32;27908:19;;44504:71:0;27535:398:1;44504:71:0;-1:-1:-1;;;;;44695:16:0;;44662:30;44695:16;;;:12;:16;;;;;;;;;44662:49;;;;;;;;;-1:-1:-1;;;;;44662:49:0;;;;;-1:-1:-1;;;44662:49:0;;;;;;;;;;;44741:135;;;;;;;;44767:19;;44662:49;;44741:135;;;44767:39;;44797:8;;44767:39;:::i;:::-;-1:-1:-1;;;;;44741:135:0;;;;;44856:8;44821:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;44741:135:0;;;;;;-1:-1:-1;;;;;44722:16:0;;;;;;;:12;:16;;;;;;;;:154;;;;;;;;-1:-1:-1;;;44722:154:0;;;;;;;;;;;;44915:43;;;;;;;;;;-1:-1:-1;;;;;44941:15:0;44915:43;;;;;;;;44887:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;44887:71:0;-1:-1:-1;;;;;;44887:71:0;;;;;;;;;;;;;;;;;;44899:12;;45019:325;45043:8;45039:1;:12;45019:325;;;45078:38;;45103:12;;-1:-1:-1;;;;;45078:38:0;;;45095:1;;45078:38;;45095:1;;45078:38;45157:59;45188:1;45192:2;45196:12;45210:5;45157:22;:59::i;:::-;45131:172;;;;-1:-1:-1;;;45131:172:0;;;;;;;:::i;:::-;45318:14;;;;:::i;:::-;;;;45053:3;;;;;:::i;:::-;;;;45019:325;;;-1:-1:-1;45356:12:0;:27;;;45394:60;55662:258;22704:1308;22785:7;22794:12;23019:9;:16;23039:2;23019:22;23015:990;;23315:4;23300:20;;23294:27;23365:4;23350:20;;23344:27;23423:4;23408:20;;23402:27;23058:9;23394:36;23466:25;23477:4;23394:36;23294:27;23344;23466:10;:25::i;:::-;23459:32;;;;;;;;;23015:990;23513:9;:16;23533:2;23513:22;23509:496;;23788:4;23773:20;;23767:27;23839:4;23824:20;;23818:27;23881:23;23892:4;23767:27;23818;23881:10;:23::i;:::-;23874:30;;;;;;;;23509:496;-1:-1:-1;23953:1:0;;-1:-1:-1;23957:35:0;23509:496;22704:1308;;;;;:::o;20975:643::-;21053:20;21044:5;:29;;;;;;;;:::i;:::-;;21040:571;;20975:643;:::o;21040:571::-;21151:29;21142:5;:38;;;;;;;;:::i;:::-;;21138:473;;21197:34;;-1:-1:-1;;;21197:34:0;;28272:2:1;21197:34:0;;;28254:21:1;28311:2;28291:18;;;28284:30;28350:26;28330:18;;;28323:54;28394:18;;21197:34:0;28070:348:1;21138:473:0;21262:35;21253:5;:44;;;;;;;;:::i;:::-;;21249:362;;21314:41;;-1:-1:-1;;;21314:41:0;;28625:2:1;21314:41:0;;;28607:21:1;28664:2;28644:18;;;28637:30;28703:33;28683:18;;;28676:61;28754:18;;21314:41:0;28423:355:1;21249:362:0;21386:30;21377:5;:39;;;;;;;;:::i;:::-;;21373:238;;21433:44;;-1:-1:-1;;;21433:44:0;;28985:2:1;21433:44:0;;;28967:21:1;29024:2;29004:18;;;28997:30;29063:34;29043:18;;;29036:62;-1:-1:-1;;;29114:18:1;;;29107:32;29156:19;;21433:44:0;28783:398:1;21373:238:0;21508:30;21499:5;:39;;;;;;;;:::i;:::-;;21495:116;;21555:44;;-1:-1:-1;;;21555:44:0;;29388:2:1;21555:44:0;;;29370:21:1;29427:2;29407:18;;;29400:30;29466:34;29446:18;;;29439:62;-1:-1:-1;;;29517:18:1;;;29510:32;29559:19;;21555:44:0;29186:398:1;26266:1632:0;26397:7;;27331:66;27318:79;;27314:163;;;-1:-1:-1;27430:1:0;;-1:-1:-1;27434:30:0;27414:51;;27314:163;27491:1;:7;;27496:2;27491:7;;:18;;;;;27502:1;:7;;27507:2;27502:7;;27491:18;27487:102;;;-1:-1:-1;27542:1:0;;-1:-1:-1;27546:30:0;27526:51;;27487:102;27703:24;;;27686:14;27703:24;;;;;;;;;29816:25:1;;;29889:4;29877:17;;29857:18;;;29850:45;;;;29911:18;;;29904:34;;;29954:18;;;29947:34;;;27703:24:0;;29788:19:1;;27703:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27703:24:0;;-1:-1:-1;;27703:24:0;;;-1:-1:-1;;;;;;;27742:20:0;;27738:103;;27795:1;27799:29;27779:50;;;;;;;27738:103;27861:6;-1:-1:-1;27869:20:0;;-1:-1:-1;26266:1632:0;;;;;;;;:::o;25308:344::-;25422:7;;-1:-1:-1;;;;;25468:80:0;;25422:7;25575:25;25591:3;25576:18;;;25598:2;25575:25;:::i;:::-;25559:42;;25619:25;25630:4;25636:1;25639;25642;25619:10;:25::i;:::-;25612:32;;;;;;25308:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:173::-;660:20;;-1:-1:-1;;;;;709:31:1;;699:42;;689:70;;755:1;752;745:12;689:70;592:173;;;:::o;770:254::-;838:6;846;899:2;887:9;878:7;874:23;870:32;867:52;;;915:1;912;905:12;867:52;938:29;957:9;938:29;:::i;:::-;928:39;1014:2;999:18;;;;986:32;;-1:-1:-1;;;770:254:1:o;1029:258::-;1101:1;1111:113;1125:6;1122:1;1119:13;1111:113;;;1201:11;;;1195:18;1182:11;;;1175:39;1147:2;1140:10;1111:113;;;1242:6;1239:1;1236:13;1233:48;;;-1:-1:-1;;1277:1:1;1259:16;;1252:27;1029:258::o;1292:::-;1334:3;1372:5;1366:12;1399:6;1394:3;1387:19;1415:63;1471:6;1464:4;1459:3;1455:14;1448:4;1441:5;1437:16;1415:63;:::i;:::-;1532:2;1511:15;-1:-1:-1;;1507:29:1;1498:39;;;;1539:4;1494:50;;1292:258;-1:-1:-1;;1292:258:1:o;1555:220::-;1704:2;1693:9;1686:21;1667:4;1724:45;1765:2;1754:9;1750:18;1742:6;1724:45;:::i;1780:180::-;1839:6;1892:2;1880:9;1871:7;1867:23;1863:32;1860:52;;;1908:1;1905;1898:12;1860:52;-1:-1:-1;1931:23:1;;1780:180;-1:-1:-1;1780:180:1:o;2355:328::-;2432:6;2440;2448;2501:2;2489:9;2480:7;2476:23;2472:32;2469:52;;;2517:1;2514;2507:12;2469:52;2540:29;2559:9;2540:29;:::i;:::-;2530:39;;2588:38;2622:2;2611:9;2607:18;2588:38;:::i;:::-;2578:48;;2673:2;2662:9;2658:18;2645:32;2635:42;;2355:328;;;;;:::o;2688:186::-;2747:6;2800:2;2788:9;2779:7;2775:23;2771:32;2768:52;;;2816:1;2813;2806:12;2768:52;2839:29;2858:9;2839:29;:::i;2879:592::-;2950:6;2958;3011:2;2999:9;2990:7;2986:23;2982:32;2979:52;;;3027:1;3024;3017:12;2979:52;3067:9;3054:23;-1:-1:-1;;;;;3137:2:1;3129:6;3126:14;3123:34;;;3153:1;3150;3143:12;3123:34;3191:6;3180:9;3176:22;3166:32;;3236:7;3229:4;3225:2;3221:13;3217:27;3207:55;;3258:1;3255;3248:12;3207:55;3298:2;3285:16;3324:2;3316:6;3313:14;3310:34;;;3340:1;3337;3330:12;3310:34;3385:7;3380:2;3371:6;3367:2;3363:15;3359:24;3356:37;3353:57;;;3406:1;3403;3396:12;3353:57;3437:2;3429:11;;;;;3459:6;;-1:-1:-1;2879:592:1;;-1:-1:-1;;;;2879:592:1:o;3476:632::-;3647:2;3699:21;;;3769:13;;3672:18;;;3791:22;;;3618:4;;3647:2;3870:15;;;;3844:2;3829:18;;;3618:4;3913:169;3927:6;3924:1;3921:13;3913:169;;;3988:13;;3976:26;;4057:15;;;;4022:12;;;;3949:1;3942:9;3913:169;;;-1:-1:-1;4099:3:1;;3476:632;-1:-1:-1;;;;;;3476:632:1:o;4480:347::-;4545:6;4553;4606:2;4594:9;4585:7;4581:23;4577:32;4574:52;;;4622:1;4619;4612:12;4574:52;4645:29;4664:9;4645:29;:::i;:::-;4635:39;;4724:2;4713:9;4709:18;4696:32;4771:5;4764:13;4757:21;4750:5;4747:32;4737:60;;4793:1;4790;4783:12;4737:60;4816:5;4806:15;;;4480:347;;;;;:::o;4832:127::-;4893:10;4888:3;4884:20;4881:1;4874:31;4924:4;4921:1;4914:15;4948:4;4945:1;4938:15;4964:275;5035:2;5029:9;5100:2;5081:13;;-1:-1:-1;;5077:27:1;5065:40;;-1:-1:-1;;;;;5120:34:1;;5156:22;;;5117:62;5114:88;;;5182:18;;:::i;:::-;5218:2;5211:22;4964:275;;-1:-1:-1;4964:275:1:o;5244:183::-;5304:4;-1:-1:-1;;;;;5329:6:1;5326:30;5323:56;;;5359:18;;:::i;:::-;-1:-1:-1;5404:1:1;5400:14;5416:4;5396:25;;5244:183::o;5432:662::-;5486:5;5539:3;5532:4;5524:6;5520:17;5516:27;5506:55;;5557:1;5554;5547:12;5506:55;5593:6;5580:20;5619:4;5643:60;5659:43;5699:2;5659:43;:::i;:::-;5643:60;:::i;:::-;5737:15;;;5823:1;5819:10;;;;5807:23;;5803:32;;;5768:12;;;;5847:15;;;5844:35;;;5875:1;5872;5865:12;5844:35;5911:2;5903:6;5899:15;5923:142;5939:6;5934:3;5931:15;5923:142;;;6005:17;;5993:30;;6043:12;;;;5956;;5923:142;;;-1:-1:-1;6083:5:1;5432:662;-1:-1:-1;;;;;;5432:662:1:o;6099:1146::-;6217:6;6225;6278:2;6266:9;6257:7;6253:23;6249:32;6246:52;;;6294:1;6291;6284:12;6246:52;6334:9;6321:23;-1:-1:-1;;;;;6404:2:1;6396:6;6393:14;6390:34;;;6420:1;6417;6410:12;6390:34;6458:6;6447:9;6443:22;6433:32;;6503:7;6496:4;6492:2;6488:13;6484:27;6474:55;;6525:1;6522;6515:12;6474:55;6561:2;6548:16;6583:4;6607:60;6623:43;6663:2;6623:43;:::i;6607:60::-;6701:15;;;6783:1;6779:10;;;;6771:19;;6767:28;;;6732:12;;;;6807:19;;;6804:39;;;6839:1;6836;6829:12;6804:39;6863:11;;;;6883:148;6899:6;6894:3;6891:15;6883:148;;;6965:23;6984:3;6965:23;:::i;:::-;6953:36;;6916:12;;;;7009;;;;6883:148;;;7050:5;-1:-1:-1;;7093:18:1;;7080:32;;-1:-1:-1;;7124:16:1;;;7121:36;;;7153:1;7150;7143:12;7121:36;;7176:63;7231:7;7220:8;7209:9;7205:24;7176:63;:::i;:::-;7166:73;;;6099:1146;;;;;:::o;7250:530::-;7292:5;7345:3;7338:4;7330:6;7326:17;7322:27;7312:55;;7363:1;7360;7353:12;7312:55;7399:6;7386:20;-1:-1:-1;;;;;7421:2:1;7418:26;7415:52;;;7447:18;;:::i;:::-;7491:55;7534:2;7515:13;;-1:-1:-1;;7511:27:1;7540:4;7507:38;7491:55;:::i;:::-;7571:2;7562:7;7555:19;7617:3;7610:4;7605:2;7597:6;7593:15;7589:26;7586:35;7583:55;;;7634:1;7631;7624:12;7583:55;7699:2;7692:4;7684:6;7680:17;7673:4;7664:7;7660:18;7647:55;7747:1;7722:16;;;7740:4;7718:27;7711:38;;;;7726:7;7250:530;-1:-1:-1;;;7250:530:1:o;7785:537::-;7880:6;7888;7896;7904;7957:3;7945:9;7936:7;7932:23;7928:33;7925:53;;;7974:1;7971;7964:12;7925:53;7997:29;8016:9;7997:29;:::i;:::-;7987:39;;8045:38;8079:2;8068:9;8064:18;8045:38;:::i;:::-;8035:48;;8130:2;8119:9;8115:18;8102:32;8092:42;;8185:2;8174:9;8170:18;8157:32;-1:-1:-1;;;;;8204:6:1;8201:30;8198:50;;;8244:1;8241;8234:12;8198:50;8267:49;8308:7;8299:6;8288:9;8284:22;8267:49;:::i;:::-;8257:59;;;7785:537;;;;;;;:::o;8327:260::-;8395:6;8403;8456:2;8444:9;8435:7;8431:23;8427:32;8424:52;;;8472:1;8469;8462:12;8424:52;8495:29;8514:9;8495:29;:::i;:::-;8485:39;;8543:38;8577:2;8566:9;8562:18;8543:38;:::i;:::-;8533:48;;8327:260;;;;;:::o;8592:456::-;8678:6;8686;8694;8747:2;8735:9;8726:7;8722:23;8718:32;8715:52;;;8763:1;8760;8753:12;8715:52;8799:9;8786:23;8776:33;;8856:2;8845:9;8841:18;8828:32;8818:42;;8911:2;8900:9;8896:18;8883:32;-1:-1:-1;;;;;8930:6:1;8927:30;8924:50;;;8970:1;8967;8960:12;8924:50;8993:49;9034:7;9025:6;9014:9;9010:22;8993:49;:::i;:::-;8983:59;;;8592:456;;;;;:::o;9053:531::-;9148:6;9156;9164;9172;9225:3;9213:9;9204:7;9200:23;9196:33;9193:53;;;9242:1;9239;9232:12;9193:53;9265:29;9284:9;9265:29;:::i;:::-;9255:39;;9341:2;9330:9;9326:18;9313:32;9303:42;;9392:2;9381:9;9377:18;9364:32;9354:42;;9447:2;9436:9;9432:18;9419:32;-1:-1:-1;;;;;9466:6:1;9463:30;9460:50;;;9506:1;9503;9496:12;10144:356;10346:2;10328:21;;;10365:18;;;10358:30;10424:34;10419:2;10404:18;;10397:62;10491:2;10476:18;;10144:356::o;10846:380::-;10925:1;10921:12;;;;10968;;;10989:61;;11043:4;11035:6;11031:17;11021:27;;10989:61;11096:2;11088:6;11085:14;11065:18;11062:38;11059:161;;11142:10;11137:3;11133:20;11130:1;11123:31;11177:4;11174:1;11167:15;11205:4;11202:1;11195:15;13186:127;13247:10;13242:3;13238:20;13235:1;13228:31;13278:4;13275:1;13268:15;13302:4;13299:1;13292:15;13318:125;13358:4;13386:1;13383;13380:8;13377:34;;;13391:18;;:::i;:::-;-1:-1:-1;13428:9:1;;13318:125::o;13448:355::-;13650:2;13632:21;;;13689:2;13669:18;;;13662:30;13728:33;13723:2;13708:18;;13701:61;13794:2;13779:18;;13448:355::o;14211:135::-;14250:3;14271:17;;;14268:43;;14291:18;;:::i;:::-;-1:-1:-1;14338:1:1;14327:13;;14211:135::o;16288:127::-;16349:10;16344:3;16340:20;16337:1;16330:31;16380:4;16377:1;16370:15;16404:4;16401:1;16394:15;16779:168;16819:7;16885:1;16881;16877:6;16873:14;16870:1;16867:21;16862:1;16855:9;16848:17;16844:45;16841:71;;;16892:18;;:::i;:::-;-1:-1:-1;16932:9:1;;16779:168::o;17312:128::-;17352:3;17383:1;17379:6;17376:1;17373:13;17370:39;;;17389:18;;:::i;:::-;-1:-1:-1;17425:9:1;;17312:128::o;18149:415::-;18351:2;18333:21;;;18390:2;18370:18;;;18363:30;18429:34;18424:2;18409:18;;18402:62;-1:-1:-1;;;18495:2:1;18480:18;;18473:49;18554:3;18539:19;;18149:415::o;18985:470::-;19164:3;19202:6;19196:13;19218:53;19264:6;19259:3;19252:4;19244:6;19240:17;19218:53;:::i;:::-;19334:13;;19293:16;;;;19356:57;19334:13;19293:16;19390:4;19378:17;;19356:57;:::i;:::-;19429:20;;18985:470;-1:-1:-1;;;;18985:470:1:o;22262:246::-;22302:4;-1:-1:-1;;;;;22415:10:1;;;;22385;;22437:12;;;22434:38;;;22452:18;;:::i;:::-;22489:13;;22262:246;-1:-1:-1;;;22262:246:1:o;22513:253::-;22553:3;-1:-1:-1;;;;;22642:2:1;22639:1;22635:10;22672:2;22669:1;22665:10;22703:3;22699:2;22695:12;22690:3;22687:21;22684:47;;;22711:18;;:::i;23942:136::-;23981:3;24009:5;23999:39;;24018:18;;:::i;:::-;-1:-1:-1;;;24054:18:1;;23942:136::o;24499:489::-;-1:-1:-1;;;;;24768:15:1;;;24750:34;;24820:15;;24815:2;24800:18;;24793:43;24867:2;24852:18;;24845:34;;;24915:3;24910:2;24895:18;;24888:31;;;24693:4;;24936:46;;24962:19;;24954:6;24936:46;:::i;:::-;24928:54;24499:489;-1:-1:-1;;;;;;24499:489:1:o;24993:249::-;25062:6;25115:2;25103:9;25094:7;25090:23;25086:32;25083:52;;;25131:1;25128;25121:12;25083:52;25163:9;25157:16;25182:30;25206:5;25182:30;:::i;25247:127::-;25308:10;25303:3;25299:20;25296:1;25289:31;25339:4;25336:1;25329:15;25363:4;25360:1;25353:15;25379:120;25419:1;25445;25435:35;;25450:18;;:::i;:::-;-1:-1:-1;25484:9:1;;25379:120::o;25504:112::-;25536:1;25562;25552:35;;25567:18;;:::i;:::-;-1:-1:-1;25601:9:1;;25504:112::o;27938:127::-;27999:10;27994:3;27990:20;27987:1;27980:31;28030:4;28027:1;28020:15;28054:4;28051:1;28044:15

Swarm Source

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