ETH Price: $3,160.24 (+2.21%)

Token

AlphaSciPass (AlphaSciPass)
 

Overview

Max Total Supply

148 AlphaSciPass

Holders

129

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 AlphaSciPass
0xb1b2b6508e7f55dccf60762e35bd96f5c7325c09
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:
AlphaNft

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

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

// 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/utils/Address.sol


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


// Creator: Chiru Labs

pragma solidity ^0.8.4;








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // 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) internal _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;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        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);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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 _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

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

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _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);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = 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;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @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);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        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 TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * 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`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    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.
     * And also called after one token has been burned.
     *
     * 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` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `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: alp.sol

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;





contract AlphaNft is Ownable, ERC721A, ReentrancyGuard {
  uint256 public immutable maxQty = 1024;
  uint256 public _tokensReserved;
  uint256 public _mintPrice;
  uint256 public immutable maxMintPerAddr = 1;
  string private _baseTokenURI;

  //sale stages:
  //stage 0: init(no minting, only reserve)
  //stage 1: whitelist mint+ public mint
  //stage 2: whitelist mint + team mint + public mint
  //stage 3: only reserve
  uint8 public _stage = 0;
  uint256 public immutable maxQtyStage1 = 200;
  uint256 public immutable maxQtyStage2 = 800;
  uint256 public _tokensMintedStage1 = 0;
  uint256 public _tokensMintedStage2 = 0;
  bool public _isPublicMintOpen = false;
  address private _signAdd=0x47Cb18BF441d8e17D3167CcC7aE004eA81657B2F;

  constructor(string memory baseURI) ERC721A("AlphaSciPass", "AlphaSciPass") {
    _baseTokenURI = baseURI;
  }

  function nextStage(uint256 nextStageMintPrice) external onlyOwner {
    require(_stage <= 3, "Stage cannot be more than 3");
    _stage++;
    _mintPrice = nextStageMintPrice;
    _isPublicMintOpen = false;
  }

  function setMintPrice(uint256 mintPrice) external onlyOwner {
    _mintPrice = mintPrice;
  }

  function setIsPublicMintOpen(bool isPublicMintOpen) external onlyOwner {
    _isPublicMintOpen = isPublicMintOpen;
  }

  function reserve(address recipient, uint256 quantity) external onlyOwner {
    require(quantity > 0, "Quantity too low");
    uint256 totalsupply = totalSupply();
    require(totalsupply + quantity <= maxQty, "Exceed sales max limit");

    _safeMint(recipient, quantity);
    _tokensReserved += quantity;
  }

  function whitelistMint(uint256 quantity, bytes memory signature)
    external
    payable
    nonReentrant
  {
    require(_stage == 1 || _stage == 2, "invalid stage");
    require(isStageMaxQtyExceed(quantity), "Exceed stage sales max limit");

    require(verify(signature, _msgSender()), "Verify failed");

    require(tx.origin == msg.sender, "Contracts not allowed");
    uint256 totalsupply = totalSupply();
    require(totalsupply + quantity <= maxQty, "Exceed sales max limit");
    require(
      numberMinted(msg.sender) + quantity <= maxMintPerAddr,
      "cannot mint this many"
    );

    uint256 cost;
    unchecked {
      cost = quantity * _mintPrice;
    }
    require(msg.value == cost, "wrong payment");

    _safeMint(msg.sender, quantity);
    increaseTokensMinted(quantity);
  }

  function mint(uint256 quantity) external payable nonReentrant {
    require(_stage == 1 || _stage == 2, "invalid stage");
    require(isStageMaxQtyExceed(quantity), "Exceed stage sales max limit");

    require(_isPublicMintOpen, "public sales not opening");

    require(tx.origin == msg.sender, "Contracts not allowed");
    uint256 totalsupply = totalSupply();
    require(totalsupply + quantity <= maxQty, "Exceed sales max limit");
    require(
      numberMinted(msg.sender) + quantity <= maxMintPerAddr,
      "cannot mint this many"
    );

    uint256 cost;
    unchecked {
      cost = quantity * _mintPrice;
    }
    require(msg.value == cost, "wrong payment");

    _safeMint(msg.sender, quantity);
    increaseTokensMinted(quantity);
  }

  function verify(bytes memory signature, address target)
    internal
    view
    returns (bool)
  {
    bytes32 messageHash = keccak256(
      abi.encodePacked("\x19Ethereum Signed Message:\n32", abi.encode(target))
    );

    return _signAdd == ECDSA.recover(messageHash, signature);
  }

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

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

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

  function isStageMaxQtyExceed(uint256 quantity) internal view returns (bool) {
    if (_stage == 1) {
      return _tokensMintedStage1 + quantity <= maxQtyStage1;
    }
    if (_stage == 2) {
      return _tokensMintedStage2 + quantity <= maxQtyStage2;
    }
    return false;
  }

  function increaseTokensMinted(uint256 quantity) internal {
    if (_stage == 1) {
      _tokensMintedStage1 += quantity;
    }
    if (_stage == 2) {
      _tokensMintedStage2 += quantity;
    }
  }

  function withdraw() external nonReentrant onlyOwner {
    uint256 balance = address(this).balance;
    (bool success1, ) = payable(_msgSender()).call{ value: balance }("");
    require(success1, "Transfer failed.");
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":"_isPublicMintOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_stage","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokensMintedStage1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokensMintedStage2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokensReserved","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":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerAddr","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxQtyStage1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxQtyStage2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nextStageMintPrice","type":"uint256"}],"name":"nextStage","outputs":[],"stateMutability":"nonpayable","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isPublicMintOpen","type":"bool"}],"name":"setIsPublicMintOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintPrice","type":"uint256"}],"name":"setMintPrice","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

610100604052610400608090815250600160a0908152506000600d60006101000a81548160ff021916908360ff16021790555060c860c09081525061032060e0908152506000600e556000600f556000601060006101000a81548160ff0219169083151502179055507347cb18bf441d8e17d3167ccc7ae004ea81657b2f601060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000ca57600080fd5b5060405162005165380380620051658339818101604052810190620000f09190620003ed565b6040518060400160405280600c81526020017f416c7068615363695061737300000000000000000000000000000000000000008152506040518060400160405280600c81526020017f416c7068615363695061737300000000000000000000000000000000000000008152506200017c62000170620001ee60201b60201c565b620001f660201b60201c565b816003908051906020019062000194929190620002bf565b508060049080519060200190620001ad929190620002bf565b50620001be620002ba60201b60201c565b6001819055505050600160098190555080600c9080519060200190620001e6929190620002bf565b5050620005c2565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b828054620002cd90620004d3565b90600052602060002090601f016020900481019282620002f157600085556200033d565b82601f106200030c57805160ff19168380011785556200033d565b828001600101855582156200033d579182015b828111156200033c5782518255916020019190600101906200031f565b5b5090506200034c919062000350565b5090565b5b808211156200036b57600081600090555060010162000351565b5090565b600062000386620003808462000467565b6200043e565b905082815260208101848484011115620003a557620003a4620005a2565b5b620003b28482856200049d565b509392505050565b600082601f830112620003d257620003d16200059d565b5b8151620003e48482602086016200036f565b91505092915050565b600060208284031215620004065762000405620005ac565b5b600082015167ffffffffffffffff811115620004275762000426620005a7565b5b6200043584828501620003ba565b91505092915050565b60006200044a6200045d565b905062000458828262000509565b919050565b6000604051905090565b600067ffffffffffffffff8211156200048557620004846200056e565b5b6200049082620005b1565b9050602081019050919050565b60005b83811015620004bd578082015181840152602081019050620004a0565b83811115620004cd576000848401525b50505050565b60006002820490506001821680620004ec57607f821691505b602082108114156200050357620005026200053f565b5b50919050565b6200051482620005b1565b810181811067ffffffffffffffff821117156200053657620005356200056e565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60805160a05160c05160e051614b386200062d60003960008181611bd801526128af0152600081816110a4015261285c01526000818161139a015281816116bb015261199001526000818161132c0152818161164d015281816119b40152611b420152614b386000f3fe60806040526004361061020f5760003560e01c80638da5cb5b11610118578063c87b56dd116100a0578063e4469dee1161006f578063e4469dee1461075f578063e985e9c514610788578063f2fde38b146107c5578063f3e20c3b146107ee578063f4a0a528146108195761020f565b8063c87b56dd14610691578063cc47a40b146106ce578063d6b0129c146106f7578063dc33e681146107225761020f565b8063a0712d68116100e7578063a0712d68146105cd578063a22cb465146105e9578063b88d4fde14610612578063c1dffe321461063b578063c7a95480146106665761020f565b80638da5cb5b146105305780639193cfec1461055b57806395d89b41146105865780639e852f75146105b15761020f565b806340a86a121161019b57806355f804b31161016a57806355f804b31461044d5780636352211e1461047657806370a08231146104b3578063715018a6146104f0578063894edcd4146105075761020f565b806340a86a12146103a357806342842e0e146103ce57806345915899146103f757806351b304b1146104225761020f565b8063095ea7b3116101e2578063095ea7b3146102e457806316396b631461030d57806318160ddd1461033857806323b872dd146103635780633ccfd60b1461038c5761020f565b806301ffc9a7146102145780630387da421461025157806306fdde031461027c578063081812fc146102a7575b600080fd5b34801561022057600080fd5b5061023b600480360381019061023691906139e5565b610842565b6040516102489190613fb2565b60405180910390f35b34801561025d57600080fd5b50610266610924565b6040516102739190614274565b60405180910390f35b34801561028857600080fd5b5061029161092a565b60405161029e9190614012565b60405180910390f35b3480156102b357600080fd5b506102ce60048036038101906102c99190613a8c565b6109bc565b6040516102db9190613f4b565b60405180910390f35b3480156102f057600080fd5b5061030b60048036038101906103069190613978565b610a38565b005b34801561031957600080fd5b50610322610b43565b60405161032f919061428f565b60405180910390f35b34801561034457600080fd5b5061034d610b56565b60405161035a9190614274565b60405180910390f35b34801561036f57600080fd5b5061038a60048036038101906103859190613862565b610b6d565b005b34801561039857600080fd5b506103a1610b7d565b005b3480156103af57600080fd5b506103b8610d0b565b6040516103c59190614274565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f09190613862565b610d11565b005b34801561040357600080fd5b5061040c610d31565b6040516104199190613fb2565b60405180910390f35b34801561042e57600080fd5b50610437610d44565b6040516104449190614274565b60405180910390f35b34801561045957600080fd5b50610474600480360381019061046f9190613a3f565b610d4a565b005b34801561048257600080fd5b5061049d60048036038101906104989190613a8c565b610ddc565b6040516104aa9190613f4b565b60405180910390f35b3480156104bf57600080fd5b506104da60048036038101906104d591906137f5565b610df2565b6040516104e79190614274565b60405180910390f35b3480156104fc57600080fd5b50610505610ec2565b005b34801561051357600080fd5b5061052e60048036038101906105299190613a8c565b610f4a565b005b34801561053c57600080fd5b50610545611079565b6040516105529190613f4b565b60405180910390f35b34801561056757600080fd5b506105706110a2565b60405161057d9190614274565b60405180910390f35b34801561059257600080fd5b5061059b6110c6565b6040516105a89190614012565b60405180910390f35b6105cb60048036038101906105c69190613ab9565b611158565b005b6105e760048036038101906105e29190613a8c565b61147a565b005b3480156105f557600080fd5b50610610600480360381019061060b9190613938565b61179a565b005b34801561061e57600080fd5b50610639600480360381019061063491906138b5565b611912565b005b34801561064757600080fd5b5061065061198e565b60405161065d9190614274565b60405180910390f35b34801561067257600080fd5b5061067b6119b2565b6040516106889190614274565b60405180910390f35b34801561069d57600080fd5b506106b860048036038101906106b39190613a8c565b6119d6565b6040516106c59190614012565b60405180910390f35b3480156106da57600080fd5b506106f560048036038101906106f09190613978565b611a75565b005b34801561070357600080fd5b5061070c611bd6565b6040516107199190614274565b60405180910390f35b34801561072e57600080fd5b50610749600480360381019061074491906137f5565b611bfa565b6040516107569190614274565b60405180910390f35b34801561076b57600080fd5b50610786600480360381019061078191906139b8565b611c0c565b005b34801561079457600080fd5b506107af60048036038101906107aa9190613822565b611ca5565b6040516107bc9190613fb2565b60405180910390f35b3480156107d157600080fd5b506107ec60048036038101906107e791906137f5565b611d39565b005b3480156107fa57600080fd5b50610803611e31565b6040516108109190614274565b60405180910390f35b34801561082557600080fd5b50610840600480360381019061083b9190613a8c565b611e37565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061091d575061091c82611ebd565b5b9050919050565b600b5481565b606060038054610939906144d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610965906144d6565b80156109b25780601f10610987576101008083540402835291602001916109b2565b820191906000526020600020905b81548152906001019060200180831161099557829003601f168201915b5050505050905090565b60006109c782611f27565b6109fd576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a4382610ddc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aab576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610aca611f75565b73ffffffffffffffffffffffffffffffffffffffff1614158015610afc5750610afa81610af5611f75565b611ca5565b155b15610b33576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b3e838383611f7d565b505050565b600d60009054906101000a900460ff1681565b6000610b6061202f565b6002546001540303905090565b610b78838383612034565b505050565b60026009541415610bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bba90614254565b60405180910390fd5b6002600981905550610bd3611f75565b73ffffffffffffffffffffffffffffffffffffffff16610bf1611079565b73ffffffffffffffffffffffffffffffffffffffff1614610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e90614194565b60405180910390fd5b60004790506000610c56611f75565b73ffffffffffffffffffffffffffffffffffffffff1682604051610c7990613f36565b60006040518083038185875af1925050503d8060008114610cb6576040519150601f19603f3d011682016040523d82523d6000602084013e610cbb565b606091505b5050905080610cff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf6906141f4565b60405180910390fd5b50506001600981905550565b600a5481565b610d2c83838360405180602001604052806000815250611912565b505050565b601060009054906101000a900460ff1681565b600e5481565b610d52611f75565b73ffffffffffffffffffffffffffffffffffffffff16610d70611079565b73ffffffffffffffffffffffffffffffffffffffff1614610dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbd90614194565b60405180910390fd5b8181600c9190610dd79291906135e0565b505050565b6000610de7826124ea565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e5a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610eca611f75565b73ffffffffffffffffffffffffffffffffffffffff16610ee8611079565b73ffffffffffffffffffffffffffffffffffffffff1614610f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3590614194565b60405180910390fd5b610f486000612779565b565b610f52611f75565b73ffffffffffffffffffffffffffffffffffffffff16610f70611079565b73ffffffffffffffffffffffffffffffffffffffff1614610fc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbd90614194565b60405180910390fd5b6003600d60009054906101000a900460ff1660ff16111561101c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611013906140d4565b60405180910390fd5b600d600081819054906101000a900460ff168092919061103b90614582565b91906101000a81548160ff021916908360ff1602179055505080600b819055506000601060006101000a81548160ff02191690831515021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060600480546110d5906144d6565b80601f0160208091040260200160405190810160405280929190818152602001828054611101906144d6565b801561114e5780601f106111235761010080835404028352916020019161114e565b820191906000526020600020905b81548152906001019060200180831161113157829003601f168201915b5050505050905090565b6002600954141561119e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119590614254565b60405180910390fd5b60026009819055506001600d60009054906101000a900460ff1660ff1614806111d957506002600d60009054906101000a900460ff1660ff16145b611218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120f90614114565b60405180910390fd5b6112218261283d565b611260576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611257906140f4565b60405180910390fd5b6112718161126c611f75565b6128ef565b6112b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a790614234565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461131e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611315906141b4565b60405180910390fd5b6000611328610b56565b90507f00000000000000000000000000000000000000000000000000000000000000008382611357919061434e565b1115611398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138f90614154565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000836113c333611bfa565b6113cd919061434e565b111561140e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611405906141d4565b60405180910390fd5b6000600b5484029050803414611459576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145090614094565b60405180910390fd5b611463338561299d565b61146c846129bb565b505060016009819055505050565b600260095414156114c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b790614254565b60405180910390fd5b60026009819055506001600d60009054906101000a900460ff1660ff1614806114fb57506002600d60009054906101000a900460ff1660ff16145b61153a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153190614114565b60405180910390fd5b6115438161283d565b611582576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611579906140f4565b60405180910390fd5b601060009054906101000a900460ff166115d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c890614214565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461163f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611636906141b4565b60405180910390fd5b6000611649610b56565b90507f00000000000000000000000000000000000000000000000000000000000000008282611678919061434e565b11156116b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b090614154565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000826116e433611bfa565b6116ee919061434e565b111561172f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611726906141d4565b60405180910390fd5b6000600b548302905080341461177a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177190614094565b60405180910390fd5b611784338461299d565b61178d836129bb565b5050600160098190555050565b6117a2611f75565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611807576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611814611f75565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118c1611f75565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119069190613fb2565b60405180910390a35050565b61191d848484612034565b61193c8373ffffffffffffffffffffffffffffffffffffffff16612a28565b8015611951575061194f84848484612a4b565b155b15611988576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606119e182611f27565b611a17576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611a21612bab565b9050600081511415611a425760405180602001604052806000815250611a6d565b80611a4c84612c3d565b604051602001611a5d929190613ef0565b6040516020818303038152906040525b915050919050565b611a7d611f75565b73ffffffffffffffffffffffffffffffffffffffff16611a9b611079565b73ffffffffffffffffffffffffffffffffffffffff1614611af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae890614194565b60405180910390fd5b60008111611b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2b90614174565b60405180910390fd5b6000611b3e610b56565b90507f00000000000000000000000000000000000000000000000000000000000000008282611b6d919061434e565b1115611bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba590614154565b60405180910390fd5b611bb8838361299d565b81600a6000828254611bca919061434e565b92505081905550505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611c0582612d9e565b9050919050565b611c14611f75565b73ffffffffffffffffffffffffffffffffffffffff16611c32611079565b73ffffffffffffffffffffffffffffffffffffffff1614611c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7f90614194565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d41611f75565b73ffffffffffffffffffffffffffffffffffffffff16611d5f611079565b73ffffffffffffffffffffffffffffffffffffffff1614611db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dac90614194565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614074565b60405180910390fd5b611e2e81612779565b50565b600f5481565b611e3f611f75565b73ffffffffffffffffffffffffffffffffffffffff16611e5d611079565b73ffffffffffffffffffffffffffffffffffffffff1614611eb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eaa90614194565b60405180910390fd5b80600b8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611f3261202f565b11158015611f41575060015482105b8015611f6e575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061203f826124ea565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146120aa576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166120cb611f75565b73ffffffffffffffffffffffffffffffffffffffff1614806120fa57506120f9856120f4611f75565b611ca5565b5b8061213f5750612108611f75565b73ffffffffffffffffffffffffffffffffffffffff16612127846109bc565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612178576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156121df576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121ec8585856001612e08565b6121f860008487611f7d565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561247857600154821461247757878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124e38585856001612e0e565b5050505050565b6124f2613666565b60008290508061250061202f565b1115801561250f575060015481105b15612742576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161274057600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612624578092505050612774565b5b60011561273f57818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461273a578092505050612774565b612625565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001600d60009054906101000a900460ff1660ff161415612892577f000000000000000000000000000000000000000000000000000000000000000082600e54612889919061434e565b111590506128ea565b6002600d60009054906101000a900460ff1660ff1614156128e5577f000000000000000000000000000000000000000000000000000000000000000082600f546128dc919061434e565b111590506128ea565b600090505b919050565b600080826040516020016129039190613f4b565b6040516020818303038152906040526040516020016129229190613f14565b6040516020818303038152906040528051906020012090506129448185612e14565b73ffffffffffffffffffffffffffffffffffffffff16601060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161491505092915050565b6129b7828260405180602001604052806000815250612e3b565b5050565b6001600d60009054906101000a900460ff1660ff1614156129f05780600e60008282546129e8919061434e565b925050819055505b6002600d60009054906101000a900460ff1660ff161415612a255780600f6000828254612a1d919061434e565b925050819055505b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a71611f75565b8786866040518563ffffffff1660e01b8152600401612a939493929190613f66565b602060405180830381600087803b158015612aad57600080fd5b505af1925050508015612ade57506040513d601f19601f82011682018060405250810190612adb9190613a12565b60015b612b58573d8060008114612b0e576040519150601f19603f3d011682016040523d82523d6000602084013e612b13565b606091505b50600081511415612b50576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c8054612bba906144d6565b80601f0160208091040260200160405190810160405280929190818152602001828054612be6906144d6565b8015612c335780601f10612c0857610100808354040283529160200191612c33565b820191906000526020600020905b815481529060010190602001808311612c1657829003601f168201915b5050505050905090565b60606000821415612c85576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d99565b600082905060005b60008214612cb7578080612ca090614539565b915050600a82612cb091906143a4565b9150612c8d565b60008167ffffffffffffffff811115612cd357612cd26146c8565b5b6040519080825280601f01601f191660200182016040528015612d055781602001600182028036833780820191505090505b5090505b60008514612d9257600182612d1e91906143d5565b9150600a85612d2d91906145ac565b6030612d39919061434e565b60f81b818381518110612d4f57612d4e614699565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d8b91906143a4565b9450612d09565b8093505050505b919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b50505050565b50505050565b6000806000612e238585612e4d565b91509150612e3081612ed0565b819250505092915050565b612e4883838360016130a5565b505050565b600080604183511415612e8f5760008060006020860151925060408601519150606086015160001a9050612e8387828585613474565b94509450505050612ec9565b604083511415612ec0576000806020850151915060408501519050612eb5868383613581565b935093505050612ec9565b60006002915091505b9250929050565b60006004811115612ee457612ee361463b565b5b816004811115612ef757612ef661463b565b5b1415612f02576130a2565b60016004811115612f1657612f1561463b565b5b816004811115612f2957612f2861463b565b5b1415612f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6190614034565b60405180910390fd5b60026004811115612f7e57612f7d61463b565b5b816004811115612f9157612f9061463b565b5b1415612fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc990614054565b60405180910390fd5b60036004811115612fe657612fe561463b565b5b816004811115612ff957612ff861463b565b5b141561303a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613031906140b4565b60405180910390fd5b60048081111561304d5761304c61463b565b5b8160048111156130605761305f61463b565b5b14156130a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309890614134565b60405180910390fd5b5b50565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613113576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561314e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61315b6000868387612e08565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561332557506133248773ffffffffffffffffffffffffffffffffffffffff16612a28565b5b156133eb575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461339a6000888480600101955088612a4b565b6133d0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561332b5782600154146133e657600080fd5b613457565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156133ec575b81600181905550505061346d6000868387612e0e565b5050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156134af576000600391509150613578565b601b8560ff16141580156134c75750601c8560ff1614155b156134d9576000600491509150613578565b6000600187878787604051600081526020016040526040516134fe9493929190613fcd565b6020604051602081039080840390855afa158015613520573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561356f57600060019250925050613578565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6135c4919061434e565b90506135d287828885613474565b935093505050935093915050565b8280546135ec906144d6565b90600052602060002090601f01602090048101928261360e5760008555613655565b82601f1061362757803560ff1916838001178555613655565b82800160010185558215613655579182015b82811115613654578235825591602001919060010190613639565b5b50905061366291906136a9565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156136c25760008160009055506001016136aa565b5090565b60006136d96136d4846142cf565b6142aa565b9050828152602081018484840111156136f5576136f4614706565b5b613700848285614494565b509392505050565b60008135905061371781614aa6565b92915050565b60008135905061372c81614abd565b92915050565b60008135905061374181614ad4565b92915050565b60008151905061375681614ad4565b92915050565b600082601f830112613771576137706146fc565b5b81356137818482602086016136c6565b91505092915050565b60008083601f8401126137a05761379f6146fc565b5b8235905067ffffffffffffffff8111156137bd576137bc6146f7565b5b6020830191508360018202830111156137d9576137d8614701565b5b9250929050565b6000813590506137ef81614aeb565b92915050565b60006020828403121561380b5761380a614710565b5b600061381984828501613708565b91505092915050565b6000806040838503121561383957613838614710565b5b600061384785828601613708565b925050602061385885828601613708565b9150509250929050565b60008060006060848603121561387b5761387a614710565b5b600061388986828701613708565b935050602061389a86828701613708565b92505060406138ab868287016137e0565b9150509250925092565b600080600080608085870312156138cf576138ce614710565b5b60006138dd87828801613708565b94505060206138ee87828801613708565b93505060406138ff878288016137e0565b925050606085013567ffffffffffffffff8111156139205761391f61470b565b5b61392c8782880161375c565b91505092959194509250565b6000806040838503121561394f5761394e614710565b5b600061395d85828601613708565b925050602061396e8582860161371d565b9150509250929050565b6000806040838503121561398f5761398e614710565b5b600061399d85828601613708565b92505060206139ae858286016137e0565b9150509250929050565b6000602082840312156139ce576139cd614710565b5b60006139dc8482850161371d565b91505092915050565b6000602082840312156139fb576139fa614710565b5b6000613a0984828501613732565b91505092915050565b600060208284031215613a2857613a27614710565b5b6000613a3684828501613747565b91505092915050565b60008060208385031215613a5657613a55614710565b5b600083013567ffffffffffffffff811115613a7457613a7361470b565b5b613a808582860161378a565b92509250509250929050565b600060208284031215613aa257613aa1614710565b5b6000613ab0848285016137e0565b91505092915050565b60008060408385031215613ad057613acf614710565b5b6000613ade858286016137e0565b925050602083013567ffffffffffffffff811115613aff57613afe61470b565b5b613b0b8582860161375c565b9150509250929050565b613b1e81614409565b82525050565b613b2d8161441b565b82525050565b613b3c81614427565b82525050565b6000613b4d82614300565b613b578185614316565b9350613b678185602086016144a3565b613b7081614715565b840191505092915050565b6000613b8682614300565b613b908185614327565b9350613ba08185602086016144a3565b80840191505092915050565b6000613bb78261430b565b613bc18185614332565b9350613bd18185602086016144a3565b613bda81614715565b840191505092915050565b6000613bf08261430b565b613bfa8185614343565b9350613c0a8185602086016144a3565b80840191505092915050565b6000613c23601883614332565b9150613c2e82614726565b602082019050919050565b6000613c46601f83614332565b9150613c518261474f565b602082019050919050565b6000613c69601c83614343565b9150613c7482614778565b601c82019050919050565b6000613c8c602683614332565b9150613c97826147a1565b604082019050919050565b6000613caf600d83614332565b9150613cba826147f0565b602082019050919050565b6000613cd2602283614332565b9150613cdd82614819565b604082019050919050565b6000613cf5601b83614332565b9150613d0082614868565b602082019050919050565b6000613d18601c83614332565b9150613d2382614891565b602082019050919050565b6000613d3b600d83614332565b9150613d46826148ba565b602082019050919050565b6000613d5e602283614332565b9150613d69826148e3565b604082019050919050565b6000613d81601683614332565b9150613d8c82614932565b602082019050919050565b6000613da4601083614332565b9150613daf8261495b565b602082019050919050565b6000613dc7602083614332565b9150613dd282614984565b602082019050919050565b6000613dea601583614332565b9150613df5826149ad565b602082019050919050565b6000613e0d601583614332565b9150613e18826149d6565b602082019050919050565b6000613e30600083614327565b9150613e3b826149ff565b600082019050919050565b6000613e53601083614332565b9150613e5e82614a02565b602082019050919050565b6000613e76601883614332565b9150613e8182614a2b565b602082019050919050565b6000613e99600d83614332565b9150613ea482614a54565b602082019050919050565b6000613ebc601f83614332565b9150613ec782614a7d565b602082019050919050565b613edb8161447d565b82525050565b613eea81614487565b82525050565b6000613efc8285613be5565b9150613f088284613be5565b91508190509392505050565b6000613f1f82613c5c565b9150613f2b8284613b7b565b915081905092915050565b6000613f4182613e23565b9150819050919050565b6000602082019050613f606000830184613b15565b92915050565b6000608082019050613f7b6000830187613b15565b613f886020830186613b15565b613f956040830185613ed2565b8181036060830152613fa78184613b42565b905095945050505050565b6000602082019050613fc76000830184613b24565b92915050565b6000608082019050613fe26000830187613b33565b613fef6020830186613ee1565b613ffc6040830185613b33565b6140096060830184613b33565b95945050505050565b6000602082019050818103600083015261402c8184613bac565b905092915050565b6000602082019050818103600083015261404d81613c16565b9050919050565b6000602082019050818103600083015261406d81613c39565b9050919050565b6000602082019050818103600083015261408d81613c7f565b9050919050565b600060208201905081810360008301526140ad81613ca2565b9050919050565b600060208201905081810360008301526140cd81613cc5565b9050919050565b600060208201905081810360008301526140ed81613ce8565b9050919050565b6000602082019050818103600083015261410d81613d0b565b9050919050565b6000602082019050818103600083015261412d81613d2e565b9050919050565b6000602082019050818103600083015261414d81613d51565b9050919050565b6000602082019050818103600083015261416d81613d74565b9050919050565b6000602082019050818103600083015261418d81613d97565b9050919050565b600060208201905081810360008301526141ad81613dba565b9050919050565b600060208201905081810360008301526141cd81613ddd565b9050919050565b600060208201905081810360008301526141ed81613e00565b9050919050565b6000602082019050818103600083015261420d81613e46565b9050919050565b6000602082019050818103600083015261422d81613e69565b9050919050565b6000602082019050818103600083015261424d81613e8c565b9050919050565b6000602082019050818103600083015261426d81613eaf565b9050919050565b60006020820190506142896000830184613ed2565b92915050565b60006020820190506142a46000830184613ee1565b92915050565b60006142b46142c5565b90506142c08282614508565b919050565b6000604051905090565b600067ffffffffffffffff8211156142ea576142e96146c8565b5b6142f382614715565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006143598261447d565b91506143648361447d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614399576143986145dd565b5b828201905092915050565b60006143af8261447d565b91506143ba8361447d565b9250826143ca576143c961460c565b5b828204905092915050565b60006143e08261447d565b91506143eb8361447d565b9250828210156143fe576143fd6145dd565b5b828203905092915050565b60006144148261445d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156144c15780820151818401526020810190506144a6565b838111156144d0576000848401525b50505050565b600060028204905060018216806144ee57607f821691505b602082108114156145025761450161466a565b5b50919050565b61451182614715565b810181811067ffffffffffffffff821117156145305761452f6146c8565b5b80604052505050565b60006145448261447d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614577576145766145dd565b5b600182019050919050565b600061458d82614487565b915060ff8214156145a1576145a06145dd565b5b600182019050919050565b60006145b78261447d565b91506145c28361447d565b9250826145d2576145d161460c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f77726f6e67207061796d656e7400000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f53746167652063616e6e6f74206265206d6f7265207468616e20330000000000600082015250565b7f4578636565642073746167652073616c6573206d6178206c696d697400000000600082015250565b7f696e76616c696420737461676500000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565642073616c6573206d6178206c696d697400000000000000000000600082015250565b7f5175616e7469747920746f6f206c6f7700000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f436f6e747261637473206e6f7420616c6c6f7765640000000000000000000000600082015250565b7f63616e6e6f74206d696e742074686973206d616e790000000000000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f7075626c69632073616c6573206e6f74206f70656e696e670000000000000000600082015250565b7f566572696679206661696c656400000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b614aaf81614409565b8114614aba57600080fd5b50565b614ac68161441b565b8114614ad157600080fd5b50565b614add81614431565b8114614ae857600080fd5b50565b614af48161447d565b8114614aff57600080fd5b5056fea26469706673582212205dcec933fa8d1e721e69db825bfeda0197e4c68c3635441edf64a91e128e1e6564736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d56776359567961506a64427262374355545271584166717a39764761523571776d65667a776a76645056476d2f00000000000000000000

Deployed Bytecode

0x60806040526004361061020f5760003560e01c80638da5cb5b11610118578063c87b56dd116100a0578063e4469dee1161006f578063e4469dee1461075f578063e985e9c514610788578063f2fde38b146107c5578063f3e20c3b146107ee578063f4a0a528146108195761020f565b8063c87b56dd14610691578063cc47a40b146106ce578063d6b0129c146106f7578063dc33e681146107225761020f565b8063a0712d68116100e7578063a0712d68146105cd578063a22cb465146105e9578063b88d4fde14610612578063c1dffe321461063b578063c7a95480146106665761020f565b80638da5cb5b146105305780639193cfec1461055b57806395d89b41146105865780639e852f75146105b15761020f565b806340a86a121161019b57806355f804b31161016a57806355f804b31461044d5780636352211e1461047657806370a08231146104b3578063715018a6146104f0578063894edcd4146105075761020f565b806340a86a12146103a357806342842e0e146103ce57806345915899146103f757806351b304b1146104225761020f565b8063095ea7b3116101e2578063095ea7b3146102e457806316396b631461030d57806318160ddd1461033857806323b872dd146103635780633ccfd60b1461038c5761020f565b806301ffc9a7146102145780630387da421461025157806306fdde031461027c578063081812fc146102a7575b600080fd5b34801561022057600080fd5b5061023b600480360381019061023691906139e5565b610842565b6040516102489190613fb2565b60405180910390f35b34801561025d57600080fd5b50610266610924565b6040516102739190614274565b60405180910390f35b34801561028857600080fd5b5061029161092a565b60405161029e9190614012565b60405180910390f35b3480156102b357600080fd5b506102ce60048036038101906102c99190613a8c565b6109bc565b6040516102db9190613f4b565b60405180910390f35b3480156102f057600080fd5b5061030b60048036038101906103069190613978565b610a38565b005b34801561031957600080fd5b50610322610b43565b60405161032f919061428f565b60405180910390f35b34801561034457600080fd5b5061034d610b56565b60405161035a9190614274565b60405180910390f35b34801561036f57600080fd5b5061038a60048036038101906103859190613862565b610b6d565b005b34801561039857600080fd5b506103a1610b7d565b005b3480156103af57600080fd5b506103b8610d0b565b6040516103c59190614274565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f09190613862565b610d11565b005b34801561040357600080fd5b5061040c610d31565b6040516104199190613fb2565b60405180910390f35b34801561042e57600080fd5b50610437610d44565b6040516104449190614274565b60405180910390f35b34801561045957600080fd5b50610474600480360381019061046f9190613a3f565b610d4a565b005b34801561048257600080fd5b5061049d60048036038101906104989190613a8c565b610ddc565b6040516104aa9190613f4b565b60405180910390f35b3480156104bf57600080fd5b506104da60048036038101906104d591906137f5565b610df2565b6040516104e79190614274565b60405180910390f35b3480156104fc57600080fd5b50610505610ec2565b005b34801561051357600080fd5b5061052e60048036038101906105299190613a8c565b610f4a565b005b34801561053c57600080fd5b50610545611079565b6040516105529190613f4b565b60405180910390f35b34801561056757600080fd5b506105706110a2565b60405161057d9190614274565b60405180910390f35b34801561059257600080fd5b5061059b6110c6565b6040516105a89190614012565b60405180910390f35b6105cb60048036038101906105c69190613ab9565b611158565b005b6105e760048036038101906105e29190613a8c565b61147a565b005b3480156105f557600080fd5b50610610600480360381019061060b9190613938565b61179a565b005b34801561061e57600080fd5b50610639600480360381019061063491906138b5565b611912565b005b34801561064757600080fd5b5061065061198e565b60405161065d9190614274565b60405180910390f35b34801561067257600080fd5b5061067b6119b2565b6040516106889190614274565b60405180910390f35b34801561069d57600080fd5b506106b860048036038101906106b39190613a8c565b6119d6565b6040516106c59190614012565b60405180910390f35b3480156106da57600080fd5b506106f560048036038101906106f09190613978565b611a75565b005b34801561070357600080fd5b5061070c611bd6565b6040516107199190614274565b60405180910390f35b34801561072e57600080fd5b50610749600480360381019061074491906137f5565b611bfa565b6040516107569190614274565b60405180910390f35b34801561076b57600080fd5b50610786600480360381019061078191906139b8565b611c0c565b005b34801561079457600080fd5b506107af60048036038101906107aa9190613822565b611ca5565b6040516107bc9190613fb2565b60405180910390f35b3480156107d157600080fd5b506107ec60048036038101906107e791906137f5565b611d39565b005b3480156107fa57600080fd5b50610803611e31565b6040516108109190614274565b60405180910390f35b34801561082557600080fd5b50610840600480360381019061083b9190613a8c565b611e37565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061091d575061091c82611ebd565b5b9050919050565b600b5481565b606060038054610939906144d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610965906144d6565b80156109b25780601f10610987576101008083540402835291602001916109b2565b820191906000526020600020905b81548152906001019060200180831161099557829003601f168201915b5050505050905090565b60006109c782611f27565b6109fd576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a4382610ddc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aab576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610aca611f75565b73ffffffffffffffffffffffffffffffffffffffff1614158015610afc5750610afa81610af5611f75565b611ca5565b155b15610b33576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b3e838383611f7d565b505050565b600d60009054906101000a900460ff1681565b6000610b6061202f565b6002546001540303905090565b610b78838383612034565b505050565b60026009541415610bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bba90614254565b60405180910390fd5b6002600981905550610bd3611f75565b73ffffffffffffffffffffffffffffffffffffffff16610bf1611079565b73ffffffffffffffffffffffffffffffffffffffff1614610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e90614194565b60405180910390fd5b60004790506000610c56611f75565b73ffffffffffffffffffffffffffffffffffffffff1682604051610c7990613f36565b60006040518083038185875af1925050503d8060008114610cb6576040519150601f19603f3d011682016040523d82523d6000602084013e610cbb565b606091505b5050905080610cff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf6906141f4565b60405180910390fd5b50506001600981905550565b600a5481565b610d2c83838360405180602001604052806000815250611912565b505050565b601060009054906101000a900460ff1681565b600e5481565b610d52611f75565b73ffffffffffffffffffffffffffffffffffffffff16610d70611079565b73ffffffffffffffffffffffffffffffffffffffff1614610dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbd90614194565b60405180910390fd5b8181600c9190610dd79291906135e0565b505050565b6000610de7826124ea565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e5a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610eca611f75565b73ffffffffffffffffffffffffffffffffffffffff16610ee8611079565b73ffffffffffffffffffffffffffffffffffffffff1614610f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3590614194565b60405180910390fd5b610f486000612779565b565b610f52611f75565b73ffffffffffffffffffffffffffffffffffffffff16610f70611079565b73ffffffffffffffffffffffffffffffffffffffff1614610fc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbd90614194565b60405180910390fd5b6003600d60009054906101000a900460ff1660ff16111561101c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611013906140d4565b60405180910390fd5b600d600081819054906101000a900460ff168092919061103b90614582565b91906101000a81548160ff021916908360ff1602179055505080600b819055506000601060006101000a81548160ff02191690831515021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f00000000000000000000000000000000000000000000000000000000000000c881565b6060600480546110d5906144d6565b80601f0160208091040260200160405190810160405280929190818152602001828054611101906144d6565b801561114e5780601f106111235761010080835404028352916020019161114e565b820191906000526020600020905b81548152906001019060200180831161113157829003601f168201915b5050505050905090565b6002600954141561119e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119590614254565b60405180910390fd5b60026009819055506001600d60009054906101000a900460ff1660ff1614806111d957506002600d60009054906101000a900460ff1660ff16145b611218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120f90614114565b60405180910390fd5b6112218261283d565b611260576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611257906140f4565b60405180910390fd5b6112718161126c611f75565b6128ef565b6112b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a790614234565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461131e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611315906141b4565b60405180910390fd5b6000611328610b56565b90507f00000000000000000000000000000000000000000000000000000000000004008382611357919061434e565b1115611398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138f90614154565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000001836113c333611bfa565b6113cd919061434e565b111561140e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611405906141d4565b60405180910390fd5b6000600b5484029050803414611459576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145090614094565b60405180910390fd5b611463338561299d565b61146c846129bb565b505060016009819055505050565b600260095414156114c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b790614254565b60405180910390fd5b60026009819055506001600d60009054906101000a900460ff1660ff1614806114fb57506002600d60009054906101000a900460ff1660ff16145b61153a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153190614114565b60405180910390fd5b6115438161283d565b611582576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611579906140f4565b60405180910390fd5b601060009054906101000a900460ff166115d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c890614214565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461163f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611636906141b4565b60405180910390fd5b6000611649610b56565b90507f00000000000000000000000000000000000000000000000000000000000004008282611678919061434e565b11156116b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b090614154565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000001826116e433611bfa565b6116ee919061434e565b111561172f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611726906141d4565b60405180910390fd5b6000600b548302905080341461177a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177190614094565b60405180910390fd5b611784338461299d565b61178d836129bb565b5050600160098190555050565b6117a2611f75565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611807576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611814611f75565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118c1611f75565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119069190613fb2565b60405180910390a35050565b61191d848484612034565b61193c8373ffffffffffffffffffffffffffffffffffffffff16612a28565b8015611951575061194f84848484612a4b565b155b15611988576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b7f000000000000000000000000000000000000000000000000000000000000000181565b7f000000000000000000000000000000000000000000000000000000000000040081565b60606119e182611f27565b611a17576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611a21612bab565b9050600081511415611a425760405180602001604052806000815250611a6d565b80611a4c84612c3d565b604051602001611a5d929190613ef0565b6040516020818303038152906040525b915050919050565b611a7d611f75565b73ffffffffffffffffffffffffffffffffffffffff16611a9b611079565b73ffffffffffffffffffffffffffffffffffffffff1614611af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae890614194565b60405180910390fd5b60008111611b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2b90614174565b60405180910390fd5b6000611b3e610b56565b90507f00000000000000000000000000000000000000000000000000000000000004008282611b6d919061434e565b1115611bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba590614154565b60405180910390fd5b611bb8838361299d565b81600a6000828254611bca919061434e565b92505081905550505050565b7f000000000000000000000000000000000000000000000000000000000000032081565b6000611c0582612d9e565b9050919050565b611c14611f75565b73ffffffffffffffffffffffffffffffffffffffff16611c32611079565b73ffffffffffffffffffffffffffffffffffffffff1614611c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7f90614194565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d41611f75565b73ffffffffffffffffffffffffffffffffffffffff16611d5f611079565b73ffffffffffffffffffffffffffffffffffffffff1614611db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dac90614194565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614074565b60405180910390fd5b611e2e81612779565b50565b600f5481565b611e3f611f75565b73ffffffffffffffffffffffffffffffffffffffff16611e5d611079565b73ffffffffffffffffffffffffffffffffffffffff1614611eb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eaa90614194565b60405180910390fd5b80600b8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611f3261202f565b11158015611f41575060015482105b8015611f6e575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061203f826124ea565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146120aa576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166120cb611f75565b73ffffffffffffffffffffffffffffffffffffffff1614806120fa57506120f9856120f4611f75565b611ca5565b5b8061213f5750612108611f75565b73ffffffffffffffffffffffffffffffffffffffff16612127846109bc565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612178576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156121df576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121ec8585856001612e08565b6121f860008487611f7d565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561247857600154821461247757878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124e38585856001612e0e565b5050505050565b6124f2613666565b60008290508061250061202f565b1115801561250f575060015481105b15612742576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161274057600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612624578092505050612774565b5b60011561273f57818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461273a578092505050612774565b612625565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001600d60009054906101000a900460ff1660ff161415612892577f00000000000000000000000000000000000000000000000000000000000000c882600e54612889919061434e565b111590506128ea565b6002600d60009054906101000a900460ff1660ff1614156128e5577f000000000000000000000000000000000000000000000000000000000000032082600f546128dc919061434e565b111590506128ea565b600090505b919050565b600080826040516020016129039190613f4b565b6040516020818303038152906040526040516020016129229190613f14565b6040516020818303038152906040528051906020012090506129448185612e14565b73ffffffffffffffffffffffffffffffffffffffff16601060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161491505092915050565b6129b7828260405180602001604052806000815250612e3b565b5050565b6001600d60009054906101000a900460ff1660ff1614156129f05780600e60008282546129e8919061434e565b925050819055505b6002600d60009054906101000a900460ff1660ff161415612a255780600f6000828254612a1d919061434e565b925050819055505b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a71611f75565b8786866040518563ffffffff1660e01b8152600401612a939493929190613f66565b602060405180830381600087803b158015612aad57600080fd5b505af1925050508015612ade57506040513d601f19601f82011682018060405250810190612adb9190613a12565b60015b612b58573d8060008114612b0e576040519150601f19603f3d011682016040523d82523d6000602084013e612b13565b606091505b50600081511415612b50576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c8054612bba906144d6565b80601f0160208091040260200160405190810160405280929190818152602001828054612be6906144d6565b8015612c335780601f10612c0857610100808354040283529160200191612c33565b820191906000526020600020905b815481529060010190602001808311612c1657829003601f168201915b5050505050905090565b60606000821415612c85576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d99565b600082905060005b60008214612cb7578080612ca090614539565b915050600a82612cb091906143a4565b9150612c8d565b60008167ffffffffffffffff811115612cd357612cd26146c8565b5b6040519080825280601f01601f191660200182016040528015612d055781602001600182028036833780820191505090505b5090505b60008514612d9257600182612d1e91906143d5565b9150600a85612d2d91906145ac565b6030612d39919061434e565b60f81b818381518110612d4f57612d4e614699565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d8b91906143a4565b9450612d09565b8093505050505b919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b50505050565b50505050565b6000806000612e238585612e4d565b91509150612e3081612ed0565b819250505092915050565b612e4883838360016130a5565b505050565b600080604183511415612e8f5760008060006020860151925060408601519150606086015160001a9050612e8387828585613474565b94509450505050612ec9565b604083511415612ec0576000806020850151915060408501519050612eb5868383613581565b935093505050612ec9565b60006002915091505b9250929050565b60006004811115612ee457612ee361463b565b5b816004811115612ef757612ef661463b565b5b1415612f02576130a2565b60016004811115612f1657612f1561463b565b5b816004811115612f2957612f2861463b565b5b1415612f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6190614034565b60405180910390fd5b60026004811115612f7e57612f7d61463b565b5b816004811115612f9157612f9061463b565b5b1415612fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc990614054565b60405180910390fd5b60036004811115612fe657612fe561463b565b5b816004811115612ff957612ff861463b565b5b141561303a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613031906140b4565b60405180910390fd5b60048081111561304d5761304c61463b565b5b8160048111156130605761305f61463b565b5b14156130a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309890614134565b60405180910390fd5b5b50565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613113576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561314e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61315b6000868387612e08565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561332557506133248773ffffffffffffffffffffffffffffffffffffffff16612a28565b5b156133eb575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461339a6000888480600101955088612a4b565b6133d0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561332b5782600154146133e657600080fd5b613457565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156133ec575b81600181905550505061346d6000868387612e0e565b5050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156134af576000600391509150613578565b601b8560ff16141580156134c75750601c8560ff1614155b156134d9576000600491509150613578565b6000600187878787604051600081526020016040526040516134fe9493929190613fcd565b6020604051602081039080840390855afa158015613520573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561356f57600060019250925050613578565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6135c4919061434e565b90506135d287828885613474565b935093505050935093915050565b8280546135ec906144d6565b90600052602060002090601f01602090048101928261360e5760008555613655565b82601f1061362757803560ff1916838001178555613655565b82800160010185558215613655579182015b82811115613654578235825591602001919060010190613639565b5b50905061366291906136a9565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156136c25760008160009055506001016136aa565b5090565b60006136d96136d4846142cf565b6142aa565b9050828152602081018484840111156136f5576136f4614706565b5b613700848285614494565b509392505050565b60008135905061371781614aa6565b92915050565b60008135905061372c81614abd565b92915050565b60008135905061374181614ad4565b92915050565b60008151905061375681614ad4565b92915050565b600082601f830112613771576137706146fc565b5b81356137818482602086016136c6565b91505092915050565b60008083601f8401126137a05761379f6146fc565b5b8235905067ffffffffffffffff8111156137bd576137bc6146f7565b5b6020830191508360018202830111156137d9576137d8614701565b5b9250929050565b6000813590506137ef81614aeb565b92915050565b60006020828403121561380b5761380a614710565b5b600061381984828501613708565b91505092915050565b6000806040838503121561383957613838614710565b5b600061384785828601613708565b925050602061385885828601613708565b9150509250929050565b60008060006060848603121561387b5761387a614710565b5b600061388986828701613708565b935050602061389a86828701613708565b92505060406138ab868287016137e0565b9150509250925092565b600080600080608085870312156138cf576138ce614710565b5b60006138dd87828801613708565b94505060206138ee87828801613708565b93505060406138ff878288016137e0565b925050606085013567ffffffffffffffff8111156139205761391f61470b565b5b61392c8782880161375c565b91505092959194509250565b6000806040838503121561394f5761394e614710565b5b600061395d85828601613708565b925050602061396e8582860161371d565b9150509250929050565b6000806040838503121561398f5761398e614710565b5b600061399d85828601613708565b92505060206139ae858286016137e0565b9150509250929050565b6000602082840312156139ce576139cd614710565b5b60006139dc8482850161371d565b91505092915050565b6000602082840312156139fb576139fa614710565b5b6000613a0984828501613732565b91505092915050565b600060208284031215613a2857613a27614710565b5b6000613a3684828501613747565b91505092915050565b60008060208385031215613a5657613a55614710565b5b600083013567ffffffffffffffff811115613a7457613a7361470b565b5b613a808582860161378a565b92509250509250929050565b600060208284031215613aa257613aa1614710565b5b6000613ab0848285016137e0565b91505092915050565b60008060408385031215613ad057613acf614710565b5b6000613ade858286016137e0565b925050602083013567ffffffffffffffff811115613aff57613afe61470b565b5b613b0b8582860161375c565b9150509250929050565b613b1e81614409565b82525050565b613b2d8161441b565b82525050565b613b3c81614427565b82525050565b6000613b4d82614300565b613b578185614316565b9350613b678185602086016144a3565b613b7081614715565b840191505092915050565b6000613b8682614300565b613b908185614327565b9350613ba08185602086016144a3565b80840191505092915050565b6000613bb78261430b565b613bc18185614332565b9350613bd18185602086016144a3565b613bda81614715565b840191505092915050565b6000613bf08261430b565b613bfa8185614343565b9350613c0a8185602086016144a3565b80840191505092915050565b6000613c23601883614332565b9150613c2e82614726565b602082019050919050565b6000613c46601f83614332565b9150613c518261474f565b602082019050919050565b6000613c69601c83614343565b9150613c7482614778565b601c82019050919050565b6000613c8c602683614332565b9150613c97826147a1565b604082019050919050565b6000613caf600d83614332565b9150613cba826147f0565b602082019050919050565b6000613cd2602283614332565b9150613cdd82614819565b604082019050919050565b6000613cf5601b83614332565b9150613d0082614868565b602082019050919050565b6000613d18601c83614332565b9150613d2382614891565b602082019050919050565b6000613d3b600d83614332565b9150613d46826148ba565b602082019050919050565b6000613d5e602283614332565b9150613d69826148e3565b604082019050919050565b6000613d81601683614332565b9150613d8c82614932565b602082019050919050565b6000613da4601083614332565b9150613daf8261495b565b602082019050919050565b6000613dc7602083614332565b9150613dd282614984565b602082019050919050565b6000613dea601583614332565b9150613df5826149ad565b602082019050919050565b6000613e0d601583614332565b9150613e18826149d6565b602082019050919050565b6000613e30600083614327565b9150613e3b826149ff565b600082019050919050565b6000613e53601083614332565b9150613e5e82614a02565b602082019050919050565b6000613e76601883614332565b9150613e8182614a2b565b602082019050919050565b6000613e99600d83614332565b9150613ea482614a54565b602082019050919050565b6000613ebc601f83614332565b9150613ec782614a7d565b602082019050919050565b613edb8161447d565b82525050565b613eea81614487565b82525050565b6000613efc8285613be5565b9150613f088284613be5565b91508190509392505050565b6000613f1f82613c5c565b9150613f2b8284613b7b565b915081905092915050565b6000613f4182613e23565b9150819050919050565b6000602082019050613f606000830184613b15565b92915050565b6000608082019050613f7b6000830187613b15565b613f886020830186613b15565b613f956040830185613ed2565b8181036060830152613fa78184613b42565b905095945050505050565b6000602082019050613fc76000830184613b24565b92915050565b6000608082019050613fe26000830187613b33565b613fef6020830186613ee1565b613ffc6040830185613b33565b6140096060830184613b33565b95945050505050565b6000602082019050818103600083015261402c8184613bac565b905092915050565b6000602082019050818103600083015261404d81613c16565b9050919050565b6000602082019050818103600083015261406d81613c39565b9050919050565b6000602082019050818103600083015261408d81613c7f565b9050919050565b600060208201905081810360008301526140ad81613ca2565b9050919050565b600060208201905081810360008301526140cd81613cc5565b9050919050565b600060208201905081810360008301526140ed81613ce8565b9050919050565b6000602082019050818103600083015261410d81613d0b565b9050919050565b6000602082019050818103600083015261412d81613d2e565b9050919050565b6000602082019050818103600083015261414d81613d51565b9050919050565b6000602082019050818103600083015261416d81613d74565b9050919050565b6000602082019050818103600083015261418d81613d97565b9050919050565b600060208201905081810360008301526141ad81613dba565b9050919050565b600060208201905081810360008301526141cd81613ddd565b9050919050565b600060208201905081810360008301526141ed81613e00565b9050919050565b6000602082019050818103600083015261420d81613e46565b9050919050565b6000602082019050818103600083015261422d81613e69565b9050919050565b6000602082019050818103600083015261424d81613e8c565b9050919050565b6000602082019050818103600083015261426d81613eaf565b9050919050565b60006020820190506142896000830184613ed2565b92915050565b60006020820190506142a46000830184613ee1565b92915050565b60006142b46142c5565b90506142c08282614508565b919050565b6000604051905090565b600067ffffffffffffffff8211156142ea576142e96146c8565b5b6142f382614715565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006143598261447d565b91506143648361447d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614399576143986145dd565b5b828201905092915050565b60006143af8261447d565b91506143ba8361447d565b9250826143ca576143c961460c565b5b828204905092915050565b60006143e08261447d565b91506143eb8361447d565b9250828210156143fe576143fd6145dd565b5b828203905092915050565b60006144148261445d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156144c15780820151818401526020810190506144a6565b838111156144d0576000848401525b50505050565b600060028204905060018216806144ee57607f821691505b602082108114156145025761450161466a565b5b50919050565b61451182614715565b810181811067ffffffffffffffff821117156145305761452f6146c8565b5b80604052505050565b60006145448261447d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614577576145766145dd565b5b600182019050919050565b600061458d82614487565b915060ff8214156145a1576145a06145dd565b5b600182019050919050565b60006145b78261447d565b91506145c28361447d565b9250826145d2576145d161460c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f77726f6e67207061796d656e7400000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f53746167652063616e6e6f74206265206d6f7265207468616e20330000000000600082015250565b7f4578636565642073746167652073616c6573206d6178206c696d697400000000600082015250565b7f696e76616c696420737461676500000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565642073616c6573206d6178206c696d697400000000000000000000600082015250565b7f5175616e7469747920746f6f206c6f7700000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f436f6e747261637473206e6f7420616c6c6f7765640000000000000000000000600082015250565b7f63616e6e6f74206d696e742074686973206d616e790000000000000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f7075626c69632073616c6573206e6f74206f70656e696e670000000000000000600082015250565b7f566572696679206661696c656400000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b614aaf81614409565b8114614aba57600080fd5b50565b614ac68161441b565b8114614ad157600080fd5b50565b614add81614431565b8114614ae857600080fd5b50565b614af48161447d565b8114614aff57600080fd5b5056fea26469706673582212205dcec933fa8d1e721e69db825bfeda0197e4c68c3635441edf64a91e128e1e6564736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d56776359567961506a64427262374355545271584166717a39764761523571776d65667a776a76645056476d2f00000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string): ipfs://QmVwcYVyaPjdBrb7CUTRqXAfqz9vGaR5qwmefzwjvdPVGm/

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [2] : 697066733a2f2f516d56776359567961506a6442726237435554527158416671
Arg [3] : 7a39764761523571776d65667a776a76645056476d2f00000000000000000000


Deployed Bytecode Sourcemap

57097:4632:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36735:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57235:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39848:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41351:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40914:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57535:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35984:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42216:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61503:223;;;;;;;;;;;;;:::i;:::-;;57200:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42457:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57745:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57659:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60893:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39656:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37104:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56193:103;;;;;;;;;;;;;:::i;:::-;;57978:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55542:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57563:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40017:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58748:827;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59581:773;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41627:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42713:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57265:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57157:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40192:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58426:316;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57611:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60666:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58300:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41985:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56451:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57702:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58199:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36735:305;36837:4;36889:25;36874:40;;;:11;:40;;;;:105;;;;36946:33;36931:48;;;:11;:48;;;;36874:105;:158;;;;36996:36;37020:11;36996:23;:36::i;:::-;36874:158;36854:178;;36735:305;;;:::o;57235:25::-;;;;:::o;39848:100::-;39902:13;39935:5;39928:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39848:100;:::o;41351:204::-;41419:7;41444:16;41452:7;41444;:16::i;:::-;41439:64;;41469:34;;;;;;;;;;;;;;41439:64;41523:15;:24;41539:7;41523:24;;;;;;;;;;;;;;;;;;;;;41516:31;;41351:204;;;:::o;40914:371::-;40987:13;41003:24;41019:7;41003:15;:24::i;:::-;40987:40;;41048:5;41042:11;;:2;:11;;;41038:48;;;41062:24;;;;;;;;;;;;;;41038:48;41119:5;41103:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;41129:37;41146:5;41153:12;:10;:12::i;:::-;41129:16;:37::i;:::-;41128:38;41103:63;41099:138;;;41190:35;;;;;;;;;;;;;;41099:138;41249:28;41258:2;41262:7;41271:5;41249:8;:28::i;:::-;40976:309;40914:371;;:::o;57535:23::-;;;;;;;;;;;;;:::o;35984:303::-;36028:7;36253:15;:13;:15::i;:::-;36238:12;;36222:13;;:28;:46;36215:53;;35984:303;:::o;42216:170::-;42350:28;42360:4;42366:2;42370:7;42350:9;:28::i;:::-;42216:170;;;:::o;61503:223::-;30625:1;31223:7;;:19;;31215:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;30625:1;31356:7;:18;;;;55773:12:::1;:10;:12::i;:::-;55762:23;;:7;:5;:7::i;:::-;:23;;;55754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61562:15:::2;61580:21;61562:39;;61609:13;61636:12;:10;:12::i;:::-;61628:26;;61663:7;61628:48;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61608:68;;;61691:8;61683:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;61555:171;;30581:1:::0;31535:7;:22;;;;61503:223::o;57200:30::-;;;;:::o;42457:185::-;42595:39;42612:4;42618:2;42622:7;42595:39;;;;;;;;;;;;:16;:39::i;:::-;42457:185;;;:::o;57745:37::-;;;;;;;;;;;;;:::o;57659:38::-;;;;:::o;60893:100::-;55773:12;:10;:12::i;:::-;55762:23;;:7;:5;:7::i;:::-;:23;;;55754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60980:7:::1;;60964:13;:23;;;;;;;:::i;:::-;;60893:100:::0;;:::o;39656:125::-;39720:7;39747:21;39760:7;39747:12;:21::i;:::-;:26;;;39740:33;;39656:125;;;:::o;37104:206::-;37168:7;37209:1;37192:19;;:5;:19;;;37188:60;;;37220:28;;;;;;;;;;;;;;37188:60;37274:12;:19;37287:5;37274:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;37266:36;;37259:43;;37104:206;;;:::o;56193:103::-;55773:12;:10;:12::i;:::-;55762:23;;:7;:5;:7::i;:::-;:23;;;55754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56258:30:::1;56285:1;56258:18;:30::i;:::-;56193:103::o:0;57978:215::-;55773:12;:10;:12::i;:::-;55762:23;;:7;:5;:7::i;:::-;:23;;;55754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58069:1:::1;58059:6;;;;;;;;;;;:11;;;;58051:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;58109:6;;:8;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;58137:18;58124:10;:31;;;;58182:5;58162:17;;:25;;;;;;;;;;;;;;;;;;57978:215:::0;:::o;55542:87::-;55588:7;55615:6;;;;;;;;;;;55608:13;;55542:87;:::o;57563:43::-;;;:::o;40017:104::-;40073:13;40106:7;40099:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40017:104;:::o;58748:827::-;30625:1;31223:7;;:19;;31215:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;30625:1;31356:7;:18;;;;58886:1:::1;58876:6;;;;;;;;;;;:11;;;:26;;;;58901:1;58891:6;;;;;;;;;;;:11;;;58876:26;58868:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;58935:29;58955:8;58935:19;:29::i;:::-;58927:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;59014:31;59021:9;59032:12;:10;:12::i;:::-;59014:6;:31::i;:::-;59006:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;59093:10;59080:23;;:9;:23;;;59072:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;59136:19;59158:13;:11;:13::i;:::-;59136:35;;59212:6;59200:8;59186:11;:22;;;;:::i;:::-;:32;;59178:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;59307:14;59295:8;59268:24;59281:10;59268:12;:24::i;:::-;:35;;;;:::i;:::-;:53;;59252:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;59369:12;59425:10;;59414:8;:21;59407:28;;59470:4;59457:9;:17;59449:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;59501:31;59511:10;59523:8;59501:9;:31::i;:::-;59539:30;59560:8;59539:20;:30::i;:::-;58861:714;;30581:1:::0;31535:7;:22;;;;58748:827;;:::o;59581:773::-;30625:1;31223:7;;:19;;31215:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;30625:1;31356:7;:18;;;;59668:1:::1;59658:6;;;;;;;;;;;:11;;;:26;;;;59683:1;59673:6;;;;;;;;;;;:11;;;59658:26;59650:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;59717:29;59737:8;59717:19;:29::i;:::-;59709:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;59796:17;;;;;;;;;;;59788:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;59872:10;59859:23;;:9;:23;;;59851:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;59915:19;59937:13;:11;:13::i;:::-;59915:35;;59991:6;59979:8;59965:11;:22;;;;:::i;:::-;:32;;59957:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;60086:14;60074:8;60047:24;60060:10;60047:12;:24::i;:::-;:35;;;;:::i;:::-;:53;;60031:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;60148:12;60204:10;;60193:8;:21;60186:28;;60249:4;60236:9;:17;60228:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;60280:31;60290:10;60302:8;60280:9;:31::i;:::-;60318:30;60339:8;60318:20;:30::i;:::-;59643:711;;30581:1:::0;31535:7;:22;;;;59581:773;:::o;41627:287::-;41738:12;:10;:12::i;:::-;41726:24;;:8;:24;;;41722:54;;;41759:17;;;;;;;;;;;;;;41722:54;41834:8;41789:18;:32;41808:12;:10;:12::i;:::-;41789:32;;;;;;;;;;;;;;;:42;41822:8;41789:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;41887:8;41858:48;;41873:12;:10;:12::i;:::-;41858:48;;;41897:8;41858:48;;;;;;:::i;:::-;;;;;;;;41627:287;;:::o;42713:369::-;42880:28;42890:4;42896:2;42900:7;42880:9;:28::i;:::-;42923:15;:2;:13;;;:15::i;:::-;:76;;;;;42943:56;42974:4;42980:2;42984:7;42993:5;42943:30;:56::i;:::-;42942:57;42923:76;42919:156;;;43023:40;;;;;;;;;;;;;;42919:156;42713:369;;;;:::o;57265:43::-;;;:::o;57157:38::-;;;:::o;40192:318::-;40265:13;40296:16;40304:7;40296;:16::i;:::-;40291:59;;40321:29;;;;;;;;;;;;;;40291:59;40363:21;40387:10;:8;:10::i;:::-;40363:34;;40440:1;40421:7;40415:21;:26;;:87;;;;;;;;;;;;;;;;;40468:7;40477:18;:7;:16;:18::i;:::-;40451:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40415:87;40408:94;;;40192:318;;;:::o;58426:316::-;55773:12;:10;:12::i;:::-;55762:23;;:7;:5;:7::i;:::-;:23;;;55754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58525:1:::1;58514:8;:12;58506:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;58554:19;58576:13;:11;:13::i;:::-;58554:35;;58630:6;58618:8;58604:11;:22;;;;:::i;:::-;:32;;58596:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;58672:30;58682:9;58693:8;58672:9;:30::i;:::-;58728:8;58709:15;;:27;;;;;;;:::i;:::-;;;;;;;;58499:243;58426:316:::0;;:::o;57611:43::-;;;:::o;60666:107::-;60724:7;60747:20;60761:5;60747:13;:20::i;:::-;60740:27;;60666:107;;;:::o;58300:120::-;55773:12;:10;:12::i;:::-;55762:23;;:7;:5;:7::i;:::-;:23;;;55754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58398:16:::1;58378:17;;:36;;;;;;;;;;;;;;;;;;58300:120:::0;:::o;41985:164::-;42082:4;42106:18;:25;42125:5;42106:25;;;;;;;;;;;;;;;:35;42132:8;42106:35;;;;;;;;;;;;;;;;;;;;;;;;;42099:42;;41985:164;;;;:::o;56451:201::-;55773:12;:10;:12::i;:::-;55762:23;;:7;:5;:7::i;:::-;:23;;;55754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56560:1:::1;56540:22;;:8;:22;;;;56532:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;56616:28;56635:8;56616:18;:28::i;:::-;56451:201:::0;:::o;57702:38::-;;;;:::o;58199:95::-;55773:12;:10;:12::i;:::-;55762:23;;:7;:5;:7::i;:::-;:23;;;55754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58279:9:::1;58266:10;:22;;;;58199:95:::0;:::o;22974:157::-;23059:4;23098:25;23083:40;;;:11;:40;;;;23076:47;;22974:157;;;:::o;43337:174::-;43394:4;43437:7;43418:15;:13;:15::i;:::-;:26;;:53;;;;;43458:13;;43448:7;:23;43418:53;:85;;;;;43476:11;:20;43488:7;43476:20;;;;;;;;;;;:27;;;;;;;;;;;;43475:28;43418:85;43411:92;;43337:174;;;:::o;32251:98::-;32304:7;32331:10;32324:17;;32251:98;:::o;51494:196::-;51636:2;51609:15;:24;51625:7;51609:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;51674:7;51670:2;51654:28;;51663:5;51654:28;;;;;;;;;;;;51494:196;;;:::o;35758:92::-;35814:7;35758:92;:::o;46437:2130::-;46552:35;46590:21;46603:7;46590:12;:21::i;:::-;46552:59;;46650:4;46628:26;;:13;:18;;;:26;;;46624:67;;46663:28;;;;;;;;;;;;;;46624:67;46704:22;46746:4;46730:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;46767:36;46784:4;46790:12;:10;:12::i;:::-;46767:16;:36::i;:::-;46730:73;:126;;;;46844:12;:10;:12::i;:::-;46820:36;;:20;46832:7;46820:11;:20::i;:::-;:36;;;46730:126;46704:153;;46875:17;46870:66;;46901:35;;;;;;;;;;;;;;46870:66;46965:1;46951:16;;:2;:16;;;46947:52;;;46976:23;;;;;;;;;;;;;;46947:52;47012:43;47034:4;47040:2;47044:7;47053:1;47012:21;:43::i;:::-;47120:35;47137:1;47141:7;47150:4;47120:8;:35::i;:::-;47481:1;47451:12;:18;47464:4;47451:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47525:1;47497:12;:16;47510:2;47497:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47543:31;47577:11;:20;47589:7;47577:20;;;;;;;;;;;47543:54;;47628:2;47612:8;:13;;;:18;;;;;;;;;;;;;;;;;;47678:15;47645:8;:23;;;:49;;;;;;;;;;;;;;;;;;47946:19;47978:1;47968:7;:11;47946:33;;47994:31;48028:11;:24;48040:11;48028:24;;;;;;;;;;;47994:58;;48096:1;48071:27;;:8;:13;;;;;;;;;;;;:27;;;48067:384;;;48281:13;;48266:11;:28;48262:174;;48335:4;48319:8;:13;;;:20;;;;;;;;;;;;;;;;;;48388:13;:28;;;48362:8;:23;;;:54;;;;;;;;;;;;;;;;;;48262:174;48067:384;47426:1036;;;48498:7;48494:2;48479:27;;48488:4;48479:27;;;;;;;;;;;;48517:42;48538:4;48544:2;48548:7;48557:1;48517:20;:42::i;:::-;46541:2026;;46437:2130;;;:::o;38485:1109::-;38547:21;;:::i;:::-;38581:12;38596:7;38581:22;;38664:4;38645:15;:13;:15::i;:::-;:23;;:47;;;;;38679:13;;38672:4;:20;38645:47;38641:886;;;38713:31;38747:11;:17;38759:4;38747:17;;;;;;;;;;;38713:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38788:9;:16;;;38783:729;;38859:1;38833:28;;:9;:14;;;:28;;;38829:101;;38897:9;38890:16;;;;;;38829:101;39232:261;39239:4;39232:261;;;39272:6;;;;;;;;39317:11;:17;39329:4;39317:17;;;;;;;;;;;39305:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39391:1;39365:28;;:9;:14;;;:28;;;39361:109;;39433:9;39426:16;;;;;;39361:109;39232:261;;;38783:729;38694:833;38641:886;39555:31;;;;;;;;;;;;;;38485:1109;;;;:::o;56812:191::-;56886:16;56905:6;;;;;;;;;;;56886:25;;56931:8;56922:6;;:17;;;;;;;;;;;;;;;;;;56986:8;56955:40;;56976:8;56955:40;;;;;;;;;;;;56875:128;56812:191;:::o;60999:287::-;61069:4;61096:1;61086:6;;;;;;;;;;;:11;;;61082:87;;;61149:12;61137:8;61115:19;;:30;;;;:::i;:::-;:46;;61108:53;;;;61082:87;61189:1;61179:6;;;;;;;;;;;:11;;;61175:87;;;61242:12;61230:8;61208:19;;:30;;;;:::i;:::-;:46;;61201:53;;;;61175:87;61275:5;61268:12;;60999:287;;;;:::o;60360:300::-;60454:4;60470:19;60574:6;60563:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;60510:72;;;;;;;;:::i;:::-;;;;;;;;;;;;;60492:97;;;;;;60470:119;;60617:37;60631:11;60644:9;60617:13;:37::i;:::-;60605:49;;:8;;;;;;;;;;;:49;;;60598:56;;;60360:300;;;;:::o;43519:104::-;43588:27;43598:2;43602:8;43588:27;;;;;;;;;;;;:9;:27::i;:::-;43519:104;;:::o;61292:205::-;61370:1;61360:6;;;;;;;;;;;:11;;;61356:65;;;61405:8;61382:19;;:31;;;;;;;:::i;:::-;;;;;;;;61356:65;61441:1;61431:6;;;;;;;;;;;:11;;;61427:65;;;61476:8;61453:19;;:31;;;;;;;:::i;:::-;;;;;;;;61427:65;61292:205;:::o;12891:326::-;12951:4;13208:1;13186:7;:19;;;:23;13179:30;;12891:326;;;:::o;52182:667::-;52345:4;52382:2;52366:36;;;52403:12;:10;:12::i;:::-;52417:4;52423:7;52432:5;52366:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;52362:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52617:1;52600:6;:13;:18;52596:235;;;52646:40;;;;;;;;;;;;;;52596:235;52789:6;52783:13;52774:6;52770:2;52766:15;52759:38;52362:480;52495:45;;;52485:55;;;:6;:55;;;;52478:62;;;52182:667;;;;;;:::o;60779:108::-;60839:13;60868;60861:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60779:108;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;37392:137::-;37453:7;37488:12;:19;37501:5;37488:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;37480:41;;37473:48;;37392:137;;;:::o;53497:159::-;;;;;:::o;54315:158::-;;;;;:::o;6541:231::-;6619:7;6640:17;6659:18;6681:27;6692:4;6698:9;6681:10;:27::i;:::-;6639:69;;;;6719:18;6731:5;6719:11;:18::i;:::-;6755:9;6748:16;;;;6541:231;;;;:::o;43986:163::-;44109:32;44115:2;44119:8;44129:5;44136:4;44109:5;:32::i;:::-;43986:163;;;:::o;4431:1308::-;4512:7;4521:12;4766:2;4746:9;:16;:22;4742:990;;;4785:9;4809;4833:7;5042:4;5031:9;5027:20;5021:27;5016:32;;5092:4;5081:9;5077:20;5071:27;5066:32;;5150:4;5139:9;5135:20;5129:27;5126:1;5121:36;5116:41;;5193:25;5204:4;5210:1;5213;5216;5193:10;:25::i;:::-;5186:32;;;;;;;;;4742:990;5260:2;5240:9;:16;:22;5236:496;;;5279:9;5303:10;5515:4;5504:9;5500:20;5494:27;5489:32;;5566:4;5555:9;5551:20;5545:27;5539:33;;5608:23;5619:4;5625:1;5628:2;5608:10;:23::i;:::-;5601:30;;;;;;;;5236:496;5680:1;5684:35;5664:56;;;;4431:1308;;;;;;:::o;2702:643::-;2780:20;2771:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;2767:571;;;2817:7;;2767:571;2878:29;2869:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;2865:473;;;2924:34;;;;;;;;;;:::i;:::-;;;;;;;;2865:473;2989:35;2980:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;2976:362;;;3041:41;;;;;;;;;;:::i;:::-;;;;;;;;2976:362;3113:30;3104:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;3100:238;;;3160:44;;;;;;;;;;:::i;:::-;;;;;;;;3100:238;3235:30;3226:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;3222:116;;;3282:44;;;;;;;;;;:::i;:::-;;;;;;;;3222:116;2702:643;;:::o;44408:1775::-;44547:20;44570:13;;44547:36;;44612:1;44598:16;;:2;:16;;;44594:48;;;44623:19;;;;;;;;;;;;;;44594:48;44669:1;44657:8;:13;44653:44;;;44679:18;;;;;;;;;;;;;;44653:44;44710:61;44740:1;44744:2;44748:12;44762:8;44710:21;:61::i;:::-;45083:8;45048:12;:16;45061:2;45048:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45147:8;45107:12;:16;45120:2;45107:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45206:2;45173:11;:25;45185:12;45173:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;45273:15;45223:11;:25;45235:12;45223:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;45306:20;45329:12;45306:35;;45356:11;45385:8;45370:12;:23;45356:37;;45414:4;:23;;;;;45422:15;:2;:13;;;:15::i;:::-;45414:23;45410:641;;;45458:314;45514:12;45510:2;45489:38;;45506:1;45489:38;;;;;;;;;;;;45555:69;45594:1;45598:2;45602:14;;;;;;45618:5;45555:30;:69::i;:::-;45550:174;;45660:40;;;;;;;;;;;;;;45550:174;45767:3;45751:12;:19;;45458:314;;45853:12;45836:13;;:29;45832:43;;45867:8;;;45832:43;45410:641;;;45916:120;45972:14;;;;;;45968:2;45947:40;;45964:1;45947:40;;;;;;;;;;;;46031:3;46015:12;:19;;45916:120;;45410:641;46081:12;46065:13;:28;;;;45023:1082;;46115:60;46144:1;46148:2;46152:12;46166:8;46115:20;:60::i;:::-;44536:1647;44408:1775;;;;:::o;7993:1632::-;8124:7;8133:12;9058:66;9053:1;9045:10;;:79;9041:163;;;9157:1;9161:30;9141:51;;;;;;9041:163;9223:2;9218:1;:7;;;;:18;;;;;9234:2;9229:1;:7;;;;9218:18;9214:102;;;9269:1;9273:30;9253:51;;;;;;9214:102;9413:14;9430:24;9440:4;9446:1;9449;9452;9430:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9413:41;;9487:1;9469:20;;:6;:20;;;9465:103;;;9522:1;9526:29;9506:50;;;;;;;9465:103;9588:6;9596:20;9580:37;;;;;7993:1632;;;;;;;;:::o;7035:344::-;7149:7;7158:12;7183:9;7208:66;7200:75;;7195:2;:80;7183:92;;7286:7;7325:2;7318:3;7311:2;7303:11;;:18;;7302:25;;;;:::i;:::-;7286:42;;7346:25;7357:4;7363:1;7366;7369;7346:10;:25::i;:::-;7339:32;;;;;;7035:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1368:553::-;1426:8;1436:6;1486:3;1479:4;1471:6;1467:17;1463:27;1453:122;;1494:79;;:::i;:::-;1453:122;1607:6;1594:20;1584:30;;1637:18;1629:6;1626:30;1623:117;;;1659:79;;:::i;:::-;1623:117;1773:4;1765:6;1761:17;1749:29;;1827:3;1819:4;1811:6;1807:17;1797:8;1793:32;1790:41;1787:128;;;1834:79;;:::i;:::-;1787:128;1368:553;;;;;:::o;1927:139::-;1973:5;2011:6;1998:20;1989:29;;2027:33;2054:5;2027:33;:::i;:::-;1927:139;;;;:::o;2072:329::-;2131:6;2180:2;2168:9;2159:7;2155:23;2151:32;2148:119;;;2186:79;;:::i;:::-;2148:119;2306:1;2331:53;2376:7;2367:6;2356:9;2352:22;2331:53;:::i;:::-;2321:63;;2277:117;2072:329;;;;:::o;2407:474::-;2475:6;2483;2532:2;2520:9;2511:7;2507:23;2503:32;2500:119;;;2538:79;;:::i;:::-;2500:119;2658:1;2683:53;2728:7;2719:6;2708:9;2704:22;2683:53;:::i;:::-;2673:63;;2629:117;2785:2;2811:53;2856:7;2847:6;2836:9;2832:22;2811:53;:::i;:::-;2801:63;;2756:118;2407:474;;;;;:::o;2887:619::-;2964:6;2972;2980;3029:2;3017:9;3008:7;3004:23;3000:32;2997:119;;;3035:79;;:::i;:::-;2997:119;3155:1;3180:53;3225:7;3216:6;3205:9;3201:22;3180:53;:::i;:::-;3170:63;;3126:117;3282:2;3308:53;3353:7;3344:6;3333:9;3329:22;3308:53;:::i;:::-;3298:63;;3253:118;3410:2;3436:53;3481:7;3472:6;3461:9;3457:22;3436:53;:::i;:::-;3426:63;;3381:118;2887:619;;;;;:::o;3512:943::-;3607:6;3615;3623;3631;3680:3;3668:9;3659:7;3655:23;3651:33;3648:120;;;3687:79;;:::i;:::-;3648:120;3807:1;3832:53;3877:7;3868:6;3857:9;3853:22;3832:53;:::i;:::-;3822:63;;3778:117;3934:2;3960:53;4005:7;3996:6;3985:9;3981:22;3960:53;:::i;:::-;3950:63;;3905:118;4062:2;4088:53;4133:7;4124:6;4113:9;4109:22;4088:53;:::i;:::-;4078:63;;4033:118;4218:2;4207:9;4203:18;4190:32;4249:18;4241:6;4238:30;4235:117;;;4271:79;;:::i;:::-;4235:117;4376:62;4430:7;4421:6;4410:9;4406:22;4376:62;:::i;:::-;4366:72;;4161:287;3512:943;;;;;;;:::o;4461:468::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:50;4904:7;4895:6;4884:9;4880:22;4862:50;:::i;:::-;4852:60;;4807:115;4461:468;;;;;:::o;4935:474::-;5003:6;5011;5060:2;5048:9;5039:7;5035:23;5031:32;5028:119;;;5066:79;;:::i;:::-;5028:119;5186:1;5211:53;5256:7;5247:6;5236:9;5232:22;5211:53;:::i;:::-;5201:63;;5157:117;5313:2;5339:53;5384:7;5375:6;5364:9;5360:22;5339:53;:::i;:::-;5329:63;;5284:118;4935:474;;;;;:::o;5415:323::-;5471:6;5520:2;5508:9;5499:7;5495:23;5491:32;5488:119;;;5526:79;;:::i;:::-;5488:119;5646:1;5671:50;5713:7;5704:6;5693:9;5689:22;5671:50;:::i;:::-;5661:60;;5617:114;5415:323;;;;:::o;5744:327::-;5802:6;5851:2;5839:9;5830:7;5826:23;5822:32;5819:119;;;5857:79;;:::i;:::-;5819:119;5977:1;6002:52;6046:7;6037:6;6026:9;6022:22;6002:52;:::i;:::-;5992:62;;5948:116;5744:327;;;;:::o;6077:349::-;6146:6;6195:2;6183:9;6174:7;6170:23;6166:32;6163:119;;;6201:79;;:::i;:::-;6163:119;6321:1;6346:63;6401:7;6392:6;6381:9;6377:22;6346:63;:::i;:::-;6336:73;;6292:127;6077:349;;;;:::o;6432:529::-;6503:6;6511;6560:2;6548:9;6539:7;6535:23;6531:32;6528:119;;;6566:79;;:::i;:::-;6528:119;6714:1;6703:9;6699:17;6686:31;6744:18;6736:6;6733:30;6730:117;;;6766:79;;:::i;:::-;6730:117;6879:65;6936:7;6927:6;6916:9;6912:22;6879:65;:::i;:::-;6861:83;;;;6657:297;6432:529;;;;;:::o;6967:329::-;7026:6;7075:2;7063:9;7054:7;7050:23;7046:32;7043:119;;;7081:79;;:::i;:::-;7043:119;7201:1;7226:53;7271:7;7262:6;7251:9;7247:22;7226:53;:::i;:::-;7216:63;;7172:117;6967:329;;;;:::o;7302:652::-;7379:6;7387;7436:2;7424:9;7415:7;7411:23;7407:32;7404:119;;;7442:79;;:::i;:::-;7404:119;7562:1;7587:53;7632:7;7623:6;7612:9;7608:22;7587:53;:::i;:::-;7577:63;;7533:117;7717:2;7706:9;7702:18;7689:32;7748:18;7740:6;7737:30;7734:117;;;7770:79;;:::i;:::-;7734:117;7875:62;7929:7;7920:6;7909:9;7905:22;7875:62;:::i;:::-;7865:72;;7660:287;7302:652;;;;;:::o;7960:118::-;8047:24;8065:5;8047:24;:::i;:::-;8042:3;8035:37;7960:118;;:::o;8084:109::-;8165:21;8180:5;8165:21;:::i;:::-;8160:3;8153:34;8084:109;;:::o;8199:118::-;8286:24;8304:5;8286:24;:::i;:::-;8281:3;8274:37;8199:118;;:::o;8323:360::-;8409:3;8437:38;8469:5;8437:38;:::i;:::-;8491:70;8554:6;8549:3;8491:70;:::i;:::-;8484:77;;8570:52;8615:6;8610:3;8603:4;8596:5;8592:16;8570:52;:::i;:::-;8647:29;8669:6;8647:29;:::i;:::-;8642:3;8638:39;8631:46;;8413:270;8323:360;;;;:::o;8689:373::-;8793:3;8821:38;8853:5;8821:38;:::i;:::-;8875:88;8956:6;8951:3;8875:88;:::i;:::-;8868:95;;8972:52;9017:6;9012:3;9005:4;8998:5;8994:16;8972:52;:::i;:::-;9049:6;9044:3;9040:16;9033:23;;8797:265;8689:373;;;;:::o;9068:364::-;9156:3;9184:39;9217:5;9184:39;:::i;:::-;9239:71;9303:6;9298:3;9239:71;:::i;:::-;9232:78;;9319:52;9364:6;9359:3;9352:4;9345:5;9341:16;9319:52;:::i;:::-;9396:29;9418:6;9396:29;:::i;:::-;9391:3;9387:39;9380:46;;9160:272;9068:364;;;;:::o;9438:377::-;9544:3;9572:39;9605:5;9572:39;:::i;:::-;9627:89;9709:6;9704:3;9627:89;:::i;:::-;9620:96;;9725:52;9770:6;9765:3;9758:4;9751:5;9747:16;9725:52;:::i;:::-;9802:6;9797:3;9793:16;9786:23;;9548:267;9438:377;;;;:::o;9821:366::-;9963:3;9984:67;10048:2;10043:3;9984:67;:::i;:::-;9977:74;;10060:93;10149:3;10060:93;:::i;:::-;10178:2;10173:3;10169:12;10162:19;;9821:366;;;:::o;10193:::-;10335:3;10356:67;10420:2;10415:3;10356:67;:::i;:::-;10349:74;;10432:93;10521:3;10432:93;:::i;:::-;10550:2;10545:3;10541:12;10534:19;;10193:366;;;:::o;10565:402::-;10725:3;10746:85;10828:2;10823:3;10746:85;:::i;:::-;10739:92;;10840:93;10929:3;10840:93;:::i;:::-;10958:2;10953:3;10949:12;10942:19;;10565:402;;;:::o;10973:366::-;11115:3;11136:67;11200:2;11195:3;11136:67;:::i;:::-;11129:74;;11212:93;11301:3;11212:93;:::i;:::-;11330:2;11325:3;11321:12;11314:19;;10973:366;;;:::o;11345:::-;11487:3;11508:67;11572:2;11567:3;11508:67;:::i;:::-;11501:74;;11584:93;11673:3;11584:93;:::i;:::-;11702:2;11697:3;11693:12;11686:19;;11345:366;;;:::o;11717:::-;11859:3;11880:67;11944:2;11939:3;11880:67;:::i;:::-;11873:74;;11956:93;12045:3;11956:93;:::i;:::-;12074:2;12069:3;12065:12;12058:19;;11717:366;;;:::o;12089:::-;12231:3;12252:67;12316:2;12311:3;12252:67;:::i;:::-;12245:74;;12328:93;12417:3;12328:93;:::i;:::-;12446:2;12441:3;12437:12;12430:19;;12089:366;;;:::o;12461:::-;12603:3;12624:67;12688:2;12683:3;12624:67;:::i;:::-;12617:74;;12700:93;12789:3;12700:93;:::i;:::-;12818:2;12813:3;12809:12;12802:19;;12461:366;;;:::o;12833:::-;12975:3;12996:67;13060:2;13055:3;12996:67;:::i;:::-;12989:74;;13072:93;13161:3;13072:93;:::i;:::-;13190:2;13185:3;13181:12;13174:19;;12833:366;;;:::o;13205:::-;13347:3;13368:67;13432:2;13427:3;13368:67;:::i;:::-;13361:74;;13444:93;13533:3;13444:93;:::i;:::-;13562:2;13557:3;13553:12;13546:19;;13205:366;;;:::o;13577:::-;13719:3;13740:67;13804:2;13799:3;13740:67;:::i;:::-;13733:74;;13816:93;13905:3;13816:93;:::i;:::-;13934:2;13929:3;13925:12;13918:19;;13577:366;;;:::o;13949:::-;14091:3;14112:67;14176:2;14171:3;14112:67;:::i;:::-;14105:74;;14188:93;14277:3;14188:93;:::i;:::-;14306:2;14301:3;14297:12;14290:19;;13949:366;;;:::o;14321:::-;14463:3;14484:67;14548:2;14543:3;14484:67;:::i;:::-;14477:74;;14560:93;14649:3;14560:93;:::i;:::-;14678:2;14673:3;14669:12;14662:19;;14321:366;;;:::o;14693:::-;14835:3;14856:67;14920:2;14915:3;14856:67;:::i;:::-;14849:74;;14932:93;15021:3;14932:93;:::i;:::-;15050:2;15045:3;15041:12;15034:19;;14693:366;;;:::o;15065:::-;15207:3;15228:67;15292:2;15287:3;15228:67;:::i;:::-;15221:74;;15304:93;15393:3;15304:93;:::i;:::-;15422:2;15417:3;15413:12;15406:19;;15065:366;;;:::o;15437:398::-;15596:3;15617:83;15698:1;15693:3;15617:83;:::i;:::-;15610:90;;15709:93;15798:3;15709:93;:::i;:::-;15827:1;15822:3;15818:11;15811:18;;15437:398;;;:::o;15841:366::-;15983:3;16004:67;16068:2;16063:3;16004:67;:::i;:::-;15997:74;;16080:93;16169:3;16080:93;:::i;:::-;16198:2;16193:3;16189:12;16182:19;;15841:366;;;:::o;16213:::-;16355:3;16376:67;16440:2;16435:3;16376:67;:::i;:::-;16369:74;;16452:93;16541:3;16452:93;:::i;:::-;16570:2;16565:3;16561:12;16554:19;;16213:366;;;:::o;16585:::-;16727:3;16748:67;16812:2;16807:3;16748:67;:::i;:::-;16741:74;;16824:93;16913:3;16824:93;:::i;:::-;16942:2;16937:3;16933:12;16926:19;;16585:366;;;:::o;16957:::-;17099:3;17120:67;17184:2;17179:3;17120:67;:::i;:::-;17113:74;;17196:93;17285:3;17196:93;:::i;:::-;17314:2;17309:3;17305:12;17298:19;;16957:366;;;:::o;17329:118::-;17416:24;17434:5;17416:24;:::i;:::-;17411:3;17404:37;17329:118;;:::o;17453:112::-;17536:22;17552:5;17536:22;:::i;:::-;17531:3;17524:35;17453:112;;:::o;17571:435::-;17751:3;17773:95;17864:3;17855:6;17773:95;:::i;:::-;17766:102;;17885:95;17976:3;17967:6;17885:95;:::i;:::-;17878:102;;17997:3;17990:10;;17571:435;;;;;:::o;18012:537::-;18243:3;18265:148;18409:3;18265:148;:::i;:::-;18258:155;;18430:93;18519:3;18510:6;18430:93;:::i;:::-;18423:100;;18540:3;18533:10;;18012:537;;;;:::o;18555:379::-;18739:3;18761:147;18904:3;18761:147;:::i;:::-;18754:154;;18925:3;18918:10;;18555:379;;;:::o;18940:222::-;19033:4;19071:2;19060:9;19056:18;19048:26;;19084:71;19152:1;19141:9;19137:17;19128:6;19084:71;:::i;:::-;18940:222;;;;:::o;19168:640::-;19363:4;19401:3;19390:9;19386:19;19378:27;;19415:71;19483:1;19472:9;19468:17;19459:6;19415:71;:::i;:::-;19496:72;19564:2;19553:9;19549:18;19540:6;19496:72;:::i;:::-;19578;19646:2;19635:9;19631:18;19622:6;19578:72;:::i;:::-;19697:9;19691:4;19687:20;19682:2;19671:9;19667:18;19660:48;19725:76;19796:4;19787:6;19725:76;:::i;:::-;19717:84;;19168:640;;;;;;;:::o;19814:210::-;19901:4;19939:2;19928:9;19924:18;19916:26;;19952:65;20014:1;20003:9;19999:17;19990:6;19952:65;:::i;:::-;19814:210;;;;:::o;20030:545::-;20203:4;20241:3;20230:9;20226:19;20218:27;;20255:71;20323:1;20312:9;20308:17;20299:6;20255:71;:::i;:::-;20336:68;20400:2;20389:9;20385:18;20376:6;20336:68;:::i;:::-;20414:72;20482:2;20471:9;20467:18;20458:6;20414:72;:::i;:::-;20496;20564:2;20553:9;20549:18;20540:6;20496:72;:::i;:::-;20030:545;;;;;;;:::o;20581:313::-;20694:4;20732:2;20721:9;20717:18;20709:26;;20781:9;20775:4;20771:20;20767:1;20756:9;20752:17;20745:47;20809:78;20882:4;20873:6;20809:78;:::i;:::-;20801:86;;20581:313;;;;:::o;20900:419::-;21066:4;21104:2;21093:9;21089:18;21081:26;;21153:9;21147:4;21143:20;21139:1;21128:9;21124:17;21117:47;21181:131;21307:4;21181:131;:::i;:::-;21173:139;;20900:419;;;:::o;21325:::-;21491:4;21529:2;21518:9;21514:18;21506:26;;21578:9;21572:4;21568:20;21564:1;21553:9;21549:17;21542:47;21606:131;21732:4;21606:131;:::i;:::-;21598:139;;21325:419;;;:::o;21750:::-;21916:4;21954:2;21943:9;21939:18;21931:26;;22003:9;21997:4;21993:20;21989:1;21978:9;21974:17;21967:47;22031:131;22157:4;22031:131;:::i;:::-;22023:139;;21750:419;;;:::o;22175:::-;22341:4;22379:2;22368:9;22364:18;22356:26;;22428:9;22422:4;22418:20;22414:1;22403:9;22399:17;22392:47;22456:131;22582:4;22456:131;:::i;:::-;22448:139;;22175:419;;;:::o;22600:::-;22766:4;22804:2;22793:9;22789:18;22781:26;;22853:9;22847:4;22843:20;22839:1;22828:9;22824:17;22817:47;22881:131;23007:4;22881:131;:::i;:::-;22873:139;;22600:419;;;:::o;23025:::-;23191:4;23229:2;23218:9;23214:18;23206:26;;23278:9;23272:4;23268:20;23264:1;23253:9;23249:17;23242:47;23306:131;23432:4;23306:131;:::i;:::-;23298:139;;23025:419;;;:::o;23450:::-;23616:4;23654:2;23643:9;23639:18;23631:26;;23703:9;23697:4;23693:20;23689:1;23678:9;23674:17;23667:47;23731:131;23857:4;23731:131;:::i;:::-;23723:139;;23450:419;;;:::o;23875:::-;24041:4;24079:2;24068:9;24064:18;24056:26;;24128:9;24122:4;24118:20;24114:1;24103:9;24099:17;24092:47;24156:131;24282:4;24156:131;:::i;:::-;24148:139;;23875:419;;;:::o;24300:::-;24466:4;24504:2;24493:9;24489:18;24481:26;;24553:9;24547:4;24543:20;24539:1;24528:9;24524:17;24517:47;24581:131;24707:4;24581:131;:::i;:::-;24573:139;;24300:419;;;:::o;24725:::-;24891:4;24929:2;24918:9;24914:18;24906:26;;24978:9;24972:4;24968:20;24964:1;24953:9;24949:17;24942:47;25006:131;25132:4;25006:131;:::i;:::-;24998:139;;24725:419;;;:::o;25150:::-;25316:4;25354:2;25343:9;25339:18;25331:26;;25403:9;25397:4;25393:20;25389:1;25378:9;25374:17;25367:47;25431:131;25557:4;25431:131;:::i;:::-;25423:139;;25150:419;;;:::o;25575:::-;25741:4;25779:2;25768:9;25764:18;25756:26;;25828:9;25822:4;25818:20;25814:1;25803:9;25799:17;25792:47;25856:131;25982:4;25856:131;:::i;:::-;25848:139;;25575:419;;;:::o;26000:::-;26166:4;26204:2;26193:9;26189:18;26181:26;;26253:9;26247:4;26243:20;26239:1;26228:9;26224:17;26217:47;26281:131;26407:4;26281:131;:::i;:::-;26273:139;;26000:419;;;:::o;26425:::-;26591:4;26629:2;26618:9;26614:18;26606:26;;26678:9;26672:4;26668:20;26664:1;26653:9;26649:17;26642:47;26706:131;26832:4;26706:131;:::i;:::-;26698:139;;26425:419;;;:::o;26850:::-;27016:4;27054:2;27043:9;27039:18;27031:26;;27103:9;27097:4;27093:20;27089:1;27078:9;27074:17;27067:47;27131:131;27257:4;27131:131;:::i;:::-;27123:139;;26850:419;;;:::o;27275:::-;27441:4;27479:2;27468:9;27464:18;27456:26;;27528:9;27522:4;27518:20;27514:1;27503:9;27499:17;27492:47;27556:131;27682:4;27556:131;:::i;:::-;27548:139;;27275:419;;;:::o;27700:::-;27866:4;27904:2;27893:9;27889:18;27881:26;;27953:9;27947:4;27943:20;27939:1;27928:9;27924:17;27917:47;27981:131;28107:4;27981:131;:::i;:::-;27973:139;;27700:419;;;:::o;28125:::-;28291:4;28329:2;28318:9;28314:18;28306:26;;28378:9;28372:4;28368:20;28364:1;28353:9;28349:17;28342:47;28406:131;28532:4;28406:131;:::i;:::-;28398:139;;28125:419;;;:::o;28550:222::-;28643:4;28681:2;28670:9;28666:18;28658:26;;28694:71;28762:1;28751:9;28747:17;28738:6;28694:71;:::i;:::-;28550:222;;;;:::o;28778:214::-;28867:4;28905:2;28894:9;28890:18;28882:26;;28918:67;28982:1;28971:9;28967:17;28958:6;28918:67;:::i;:::-;28778:214;;;;:::o;28998:129::-;29032:6;29059:20;;:::i;:::-;29049:30;;29088:33;29116:4;29108:6;29088:33;:::i;:::-;28998:129;;;:::o;29133:75::-;29166:6;29199:2;29193:9;29183:19;;29133:75;:::o;29214:307::-;29275:4;29365:18;29357:6;29354:30;29351:56;;;29387:18;;:::i;:::-;29351:56;29425:29;29447:6;29425:29;:::i;:::-;29417:37;;29509:4;29503;29499:15;29491:23;;29214:307;;;:::o;29527:98::-;29578:6;29612:5;29606:12;29596:22;;29527:98;;;:::o;29631:99::-;29683:6;29717:5;29711:12;29701:22;;29631:99;;;:::o;29736:168::-;29819:11;29853:6;29848:3;29841:19;29893:4;29888:3;29884:14;29869:29;;29736:168;;;;:::o;29910:147::-;30011:11;30048:3;30033:18;;29910:147;;;;:::o;30063:169::-;30147:11;30181:6;30176:3;30169:19;30221:4;30216:3;30212:14;30197:29;;30063:169;;;;:::o;30238:148::-;30340:11;30377:3;30362:18;;30238:148;;;;:::o;30392:305::-;30432:3;30451:20;30469:1;30451:20;:::i;:::-;30446:25;;30485:20;30503:1;30485:20;:::i;:::-;30480:25;;30639:1;30571:66;30567:74;30564:1;30561:81;30558:107;;;30645:18;;:::i;:::-;30558:107;30689:1;30686;30682:9;30675:16;;30392:305;;;;:::o;30703:185::-;30743:1;30760:20;30778:1;30760:20;:::i;:::-;30755:25;;30794:20;30812:1;30794:20;:::i;:::-;30789:25;;30833:1;30823:35;;30838:18;;:::i;:::-;30823:35;30880:1;30877;30873:9;30868:14;;30703:185;;;;:::o;30894:191::-;30934:4;30954:20;30972:1;30954:20;:::i;:::-;30949:25;;30988:20;31006:1;30988:20;:::i;:::-;30983:25;;31027:1;31024;31021:8;31018:34;;;31032:18;;:::i;:::-;31018:34;31077:1;31074;31070:9;31062:17;;30894:191;;;;:::o;31091:96::-;31128:7;31157:24;31175:5;31157:24;:::i;:::-;31146:35;;31091:96;;;:::o;31193:90::-;31227:7;31270:5;31263:13;31256:21;31245:32;;31193:90;;;:::o;31289:77::-;31326:7;31355:5;31344:16;;31289:77;;;:::o;31372:149::-;31408:7;31448:66;31441:5;31437:78;31426:89;;31372:149;;;:::o;31527:126::-;31564:7;31604:42;31597:5;31593:54;31582:65;;31527:126;;;:::o;31659:77::-;31696:7;31725:5;31714:16;;31659:77;;;:::o;31742:86::-;31777:7;31817:4;31810:5;31806:16;31795:27;;31742:86;;;:::o;31834:154::-;31918:6;31913:3;31908;31895:30;31980:1;31971:6;31966:3;31962:16;31955:27;31834:154;;;:::o;31994:307::-;32062:1;32072:113;32086:6;32083:1;32080:13;32072:113;;;32171:1;32166:3;32162:11;32156:18;32152:1;32147:3;32143:11;32136:39;32108:2;32105:1;32101:10;32096:15;;32072:113;;;32203:6;32200:1;32197:13;32194:101;;;32283:1;32274:6;32269:3;32265:16;32258:27;32194:101;32043:258;31994:307;;;:::o;32307:320::-;32351:6;32388:1;32382:4;32378:12;32368:22;;32435:1;32429:4;32425:12;32456:18;32446:81;;32512:4;32504:6;32500:17;32490:27;;32446:81;32574:2;32566:6;32563:14;32543:18;32540:38;32537:84;;;32593:18;;:::i;:::-;32537:84;32358:269;32307:320;;;:::o;32633:281::-;32716:27;32738:4;32716:27;:::i;:::-;32708:6;32704:40;32846:6;32834:10;32831:22;32810:18;32798:10;32795:34;32792:62;32789:88;;;32857:18;;:::i;:::-;32789:88;32897:10;32893:2;32886:22;32676:238;32633:281;;:::o;32920:233::-;32959:3;32982:24;33000:5;32982:24;:::i;:::-;32973:33;;33028:66;33021:5;33018:77;33015:103;;;33098:18;;:::i;:::-;33015:103;33145:1;33138:5;33134:13;33127:20;;32920:233;;;:::o;33159:167::-;33196:3;33219:22;33235:5;33219:22;:::i;:::-;33210:31;;33263:4;33256:5;33253:15;33250:41;;;33271:18;;:::i;:::-;33250:41;33318:1;33311:5;33307:13;33300:20;;33159:167;;;:::o;33332:176::-;33364:1;33381:20;33399:1;33381:20;:::i;:::-;33376:25;;33415:20;33433:1;33415:20;:::i;:::-;33410:25;;33454:1;33444:35;;33459:18;;:::i;:::-;33444:35;33500:1;33497;33493:9;33488:14;;33332:176;;;;:::o;33514:180::-;33562:77;33559:1;33552:88;33659:4;33656:1;33649:15;33683:4;33680:1;33673:15;33700:180;33748:77;33745:1;33738:88;33845:4;33842:1;33835:15;33869:4;33866:1;33859:15;33886:180;33934:77;33931:1;33924:88;34031:4;34028:1;34021:15;34055:4;34052:1;34045:15;34072:180;34120:77;34117:1;34110:88;34217:4;34214:1;34207:15;34241:4;34238:1;34231:15;34258:180;34306:77;34303:1;34296:88;34403:4;34400:1;34393:15;34427:4;34424:1;34417:15;34444:180;34492:77;34489:1;34482:88;34589:4;34586:1;34579:15;34613:4;34610:1;34603:15;34630:117;34739:1;34736;34729:12;34753:117;34862:1;34859;34852:12;34876:117;34985:1;34982;34975:12;34999:117;35108:1;35105;35098:12;35122:117;35231:1;35228;35221:12;35245:117;35354:1;35351;35344:12;35368:102;35409:6;35460:2;35456:7;35451:2;35444:5;35440:14;35436:28;35426:38;;35368:102;;;:::o;35476:174::-;35616:26;35612:1;35604:6;35600:14;35593:50;35476:174;:::o;35656:181::-;35796:33;35792:1;35784:6;35780:14;35773:57;35656:181;:::o;35843:214::-;35983:66;35979:1;35971:6;35967:14;35960:90;35843:214;:::o;36063:225::-;36203:34;36199:1;36191:6;36187:14;36180:58;36272:8;36267:2;36259:6;36255:15;36248:33;36063:225;:::o;36294:163::-;36434:15;36430:1;36422:6;36418:14;36411:39;36294:163;:::o;36463:221::-;36603:34;36599:1;36591:6;36587:14;36580:58;36672:4;36667:2;36659:6;36655:15;36648:29;36463:221;:::o;36690:177::-;36830:29;36826:1;36818:6;36814:14;36807:53;36690:177;:::o;36873:178::-;37013:30;37009:1;37001:6;36997:14;36990:54;36873:178;:::o;37057:163::-;37197:15;37193:1;37185:6;37181:14;37174:39;37057:163;:::o;37226:221::-;37366:34;37362:1;37354:6;37350:14;37343:58;37435:4;37430:2;37422:6;37418:15;37411:29;37226:221;:::o;37453:172::-;37593:24;37589:1;37581:6;37577:14;37570:48;37453:172;:::o;37631:166::-;37771:18;37767:1;37759:6;37755:14;37748:42;37631:166;:::o;37803:182::-;37943:34;37939:1;37931:6;37927:14;37920:58;37803:182;:::o;37991:171::-;38131:23;38127:1;38119:6;38115:14;38108:47;37991:171;:::o;38168:::-;38308:23;38304:1;38296:6;38292:14;38285:47;38168:171;:::o;38345:114::-;;:::o;38465:166::-;38605:18;38601:1;38593:6;38589:14;38582:42;38465:166;:::o;38637:174::-;38777:26;38773:1;38765:6;38761:14;38754:50;38637:174;:::o;38817:163::-;38957:15;38953:1;38945:6;38941:14;38934:39;38817:163;:::o;38986:181::-;39126:33;39122:1;39114:6;39110:14;39103:57;38986:181;:::o;39173:122::-;39246:24;39264:5;39246:24;:::i;:::-;39239:5;39236:35;39226:63;;39285:1;39282;39275:12;39226:63;39173:122;:::o;39301:116::-;39371:21;39386:5;39371:21;:::i;:::-;39364:5;39361:32;39351:60;;39407:1;39404;39397:12;39351:60;39301:116;:::o;39423:120::-;39495:23;39512:5;39495:23;:::i;:::-;39488:5;39485:34;39475:62;;39533:1;39530;39523:12;39475:62;39423:120;:::o;39549:122::-;39622:24;39640:5;39622:24;:::i;:::-;39615:5;39612:35;39602:63;;39661:1;39658;39651:12;39602:63;39549:122;:::o

Swarm Source

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