ETH Price: $3,667.49 (+1.85%)

ERC-20: Chronix Genesis (CRX)
 

Overview

TokenID

45

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

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:
ChronixGenesis

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-30
*/

// 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/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/Context.sol


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

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


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

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/ChronixGenesis.sol



pragma solidity >=0.7.0 <0.9.0;







contract ChronixGenesis is  Context,ERC721Enumerable, Ownable,  ReentrancyGuard  {
  
  using Strings for uint256;
  using ECDSA for bytes32;

  string public baseURI;
  string public notRevealedUri;
  uint256 public cost = 0.042 ether;
  uint256 public maxSupply =4200;
  uint256 public maxMintAmount = 7;
  string public PROVENANCE_HASH;
  uint offset;
  bool paused;
  bool revealed;
  address signerAddress=0x605dfab9628E69053B2a21440B951d1953A47306;
  bool public onlyWhitelisted;
  
  bool saleIsActive;
  
  address public royaltyAddress=0x3751bDD78C8409b4aE5101B9206F3a7B192123ad;
  uint256 public ROYALTY_SIZE = 500;
  uint256 public ROYALTY_DENOMINATOR = 10000;
  mapping(uint256 => address) private _royaltyReceivers;

  mapping(address => uint256) public addressMintedBalance;

event TokensMinted(
      address indexed mintedBy,
      uint256 indexed tokensNumber
    );

  constructor(
    
    string memory _initBaseURI,
    string memory _initNotRevealedUri
    
    
  ) ERC721("Chronix Genesis", "CRX") {
    
     baseURI= _initBaseURI;
    notRevealedUri= _initNotRevealedUri;
    
  }

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

  // public
  function mint(uint256 _mintAmount) public payable nonReentrant {
    require(!paused, "Paused");
    require(saleIsActive && onlyWhitelisted==false);
    
    require(_mintAmount > 0, "need to mint 1 NFT min");
    require(addressMintedBalance[_msgSender()] + _mintAmount <= maxMintAmount, "minting more");
    require(totalSupply() + _mintAmount <= maxSupply, "max NFT limit exceeded");
    require(msg.value >= cost * _mintAmount, "insufficient funds");
    for (uint256 i = 1; i <= _mintAmount; i++) {
        addressMintedBalance[_msgSender()]++;
      _safeMint(_msgSender(), totalSupply() + 1);
    }
    pay(msg.value);
    emit TokensMinted(_msgSender(), _mintAmount);
  }

  function signatureClaim(uint256 _mintAmount, bytes calldata signature) public payable nonReentrant {
    require(onlyWhitelisted && saleIsActive, "Not started");
    require(_mintAmount > 0, "need to mint 1 NFT min");
    
    require(addressMintedBalance[_msgSender()] + _mintAmount <= maxMintAmount, "minting more");
    require(totalSupply() + _mintAmount <= maxSupply, "max NFT limit exceeded");
    require(_validateSignature(signature, _mintAmount, _msgSender()), "Wrong data ");
    require(msg.value >= cost * _mintAmount, "insufficient funds");

    for(uint256 i = 1; i <= _mintAmount; i++) {
      addressMintedBalance[_msgSender()]++;
      _safeMint(_msgSender(), totalSupply() + 1 );
    }
  }

  function reserveNfts() public onlyOwner {
    require(saleIsActive == false && onlyWhitelisted==false);
    
    for (uint i = 1; i < 31; i++) {
            _safeMint(_msgSender(), totalSupply() + 1 );
        }
      onlyWhitelisted=true;
  }
  
  function _validateSignature(bytes calldata signature, uint256 tokensToMint, address caller) internal view returns (bool) {
      bytes32 dataHash = keccak256(abi.encodePacked(tokensToMint,caller));
      bytes32 message = ECDSA.toEthSignedMessageHash(dataHash);

      address receivedAddress = ECDSA.recover(message, signature);
      return (receivedAddress != address(0) && receivedAddress == signerAddress);
    }

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

  function pay(uint amount) internal {
     payable(0x4a40Ef1DA0e73A0df142D06470D7a2cfFC677D2f).transfer(amount/100 *20);
     payable(0x5c3A1fa85CEBCB46D3a0bEdADe0453dd7aeD606A).transfer(amount/100 * 2);
     payable(0x36dfA2B19C71F228ED8Aa46de163Cc9a61408527).transfer(amount/100 * 15);
      payable(0x4E0ebdAfACB39Cf80FB0d99DD084af63DEa01A6A ).transfer(amount/100 * 7);
      payable(0xcad86d42672439cAdC077105Cef1Cb057Dc1EAE8).transfer(amount/100 * 2);
      payable(0x3751bDD78C8409b4aE5101B9206F3a7B192123ad).transfer(amount/100 * 4);
       payable(0x039eA3371Da302cA3ea9192e3801B1E9baD6e207).transfer(amount/100 * 50);
    
      
  }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
      require(_exists(tokenId),"Nonexistent token");

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

      uint256 shiftedTokenId = (tokenId + offset) % maxSupply;
      return string(abi.encodePacked(_baseURI(), shiftedTokenId.toString()));
    }



  //only owner
  function reveal() public onlyOwner {
      revealed = true;
  }
  
 function setOffset() public onlyOwner {
       require(offset == 0);
       
       offset = block.timestamp % 14;

       require(offset != 0);
   }
   



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

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

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

  function returnWhitelist() public view returns(bool) {
    return onlyWhitelisted;
  }
  function returnSale() public view returns(bool) {
    return saleIsActive;
  }

  function setWhitelist(bool _state) public onlyOwner {
    onlyWhitelisted = _state;
  }
  function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount) {
      uint256 amount = _salePrice*ROYALTY_SIZE/ROYALTY_DENOMINATOR;
      address royaltyReceiver = _royaltyReceivers[_tokenId] != address(0) ? _royaltyReceivers[_tokenId] : royaltyAddress;
      return (royaltyReceiver, amount);
    }

    function addRoyaltyReceiverForTokenId(address receiver, uint256 tokenId) public onlyOwner {
      _royaltyReceivers[tokenId] = receiver;
    }

     function setProvenanceHash(string memory provenanceHash) public onlyOwner {
       require(bytes(PROVENANCE_HASH).length == 0, "already set");
       PROVENANCE_HASH = provenanceHash;
     }
  
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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":"mintedBy","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokensNumber","type":"uint256"}],"name":"TokensMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"PROVENANCE_HASH","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"addRoyaltyReceiverForTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveNfts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"returnSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"returnWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setOffset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"signatureClaim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"}]

6080604052669536c708910000600e55611068600f55600760105573605dfab9628e69053b2a21440b951d1953a47306601360026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550733751bdd78c8409b4ae5101b9206f3a7b192123ad601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506101f4601555612710601655348015620000dd57600080fd5b506040516200661a3803806200661a833981810160405281019062000103919062000401565b6040518060400160405280600f81526020017f4368726f6e69782047656e6573697300000000000000000000000000000000008152506040518060400160405280600381526020017f4352580000000000000000000000000000000000000000000000000000000000815250816000908051906020019062000187929190620002d3565b508060019080519060200190620001a0929190620002d3565b505050620001c3620001b76200020560201b60201c565b6200020d60201b60201c565b6001600b8190555081600c9080519060200190620001e3929190620002d3565b5080600d9080519060200190620001fc929190620002d3565b5050506200060a565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002e1906200051b565b90600052602060002090601f01602090048101928262000305576000855562000351565b82601f106200032057805160ff191683800117855562000351565b8280016001018555821562000351579182015b828111156200035057825182559160200191906001019062000333565b5b50905062000360919062000364565b5090565b5b808211156200037f57600081600090555060010162000365565b5090565b60006200039a6200039484620004af565b62000486565b905082815260208101848484011115620003b957620003b8620005ea565b5b620003c6848285620004e5565b509392505050565b600082601f830112620003e657620003e5620005e5565b5b8151620003f884826020860162000383565b91505092915050565b600080604083850312156200041b576200041a620005f4565b5b600083015167ffffffffffffffff8111156200043c576200043b620005ef565b5b6200044a85828601620003ce565b925050602083015167ffffffffffffffff8111156200046e576200046d620005ef565b5b6200047c85828601620003ce565b9150509250929050565b600062000492620004a5565b9050620004a0828262000551565b919050565b6000604051905090565b600067ffffffffffffffff821115620004cd57620004cc620005b6565b5b620004d882620005f9565b9050602081019050919050565b60005b8381101562000505578082015181840152602081019050620004e8565b8381111562000515576000848401525b50505050565b600060028204905060018216806200053457607f821691505b602082108114156200054b576200054a62000587565b5b50919050565b6200055c82620005f9565b810181811067ffffffffffffffff821117156200057e576200057d620005b6565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b616000806200061a6000396000f3fe60806040526004361061027d5760003560e01c8063640a38df1161014f578063ad2f852a116100c1578063df173dba1161007a578063df173dba1461096d578063e985e9c514610998578063f2c4ce1e146109d5578063f2fde38b146109fe578063f958a65714610a27578063ff1b655614610a505761027d565b8063ad2f852a1461085f578063b88d4fde1461088a578063c4e37095146108b3578063c87b56dd146108dc578063cd6a3ea514610919578063d5abeb01146109425761027d565b80638da5cb5b116101135780638da5cb5b1461078257806395d89b41146107ad5780639c70b512146107d8578063a0712d6814610803578063a22cb4651461081f578063a475b5dd146108485761027d565b8063640a38df146106ad5780636546f85a146106d85780636c0360eb1461070357806370a082311461072e578063715018a61461076b5761027d565b806318cae269116101f357806342842e0e116101ac57806342842e0e14610588578063438b6300146105b15780634c2c0855146105ee5780634f6ccce71461060a57806355f804b3146106475780636352211e146106705761027d565b806318cae26914610465578063239c70ae146104a257806323b872dd146104cd5780632a55205a146104f65780632af11474146105345780632f745c591461054b5761027d565b8063095ea7b311610245578063095ea7b31461037b578063099becfb146103a45780630a5a6b75146103cf57806310969523146103e657806313faede61461040f57806318160ddd1461043a5761027d565b806301ffc9a71461028257806302329a29146102bf57806306fdde03146102e8578063081812fc14610313578063081c8c4414610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190614568565b610a7b565b6040516102b69190614e18565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e1919061453b565b610af5565b005b3480156102f457600080fd5b506102fd610b8e565b60405161030a9190614e78565b60405180910390f35b34801561031f57600080fd5b5061033a6004803603810190610335919061460b565b610c20565b6040516103479190614d66565b60405180910390f35b34801561035c57600080fd5b50610365610ca5565b6040516103729190614e78565b60405180910390f35b34801561038757600080fd5b506103a2600480360381019061039d91906144fb565b610d33565b005b3480156103b057600080fd5b506103b9610e4b565b6040516103c6919061527a565b60405180910390f35b3480156103db57600080fd5b506103e4610e51565b005b3480156103f257600080fd5b5061040d600480360381019061040891906145c2565b610f01565b005b34801561041b57600080fd5b50610424610fe8565b604051610431919061527a565b60405180910390f35b34801561044657600080fd5b5061044f610fee565b60405161045c919061527a565b60405180910390f35b34801561047157600080fd5b5061048c60048036038101906104879190614378565b610ffb565b604051610499919061527a565b60405180910390f35b3480156104ae57600080fd5b506104b7611013565b6040516104c4919061527a565b60405180910390f35b3480156104d957600080fd5b506104f460048036038101906104ef91906143e5565b611019565b005b34801561050257600080fd5b5061051d60048036038101906105189190614698565b611079565b60405161052b929190614dcd565b60405180910390f35b34801561054057600080fd5b50610549611172565b005b34801561055757600080fd5b50610572600480360381019061056d91906144fb565b611292565b60405161057f919061527a565b60405180910390f35b34801561059457600080fd5b506105af60048036038101906105aa91906143e5565b611337565b005b3480156105bd57600080fd5b506105d860048036038101906105d39190614378565b611357565b6040516105e59190614df6565b60405180910390f35b61060860048036038101906106039190614638565b611405565b005b34801561061657600080fd5b50610631600480360381019061062c919061460b565b61173b565b60405161063e919061527a565b60405180910390f35b34801561065357600080fd5b5061066e600480360381019061066991906145c2565b6117ac565b005b34801561067c57600080fd5b506106976004803603810190610692919061460b565b611842565b6040516106a49190614d66565b60405180910390f35b3480156106b957600080fd5b506106c26118f4565b6040516106cf9190614e18565b60405180910390f35b3480156106e457600080fd5b506106ed61190b565b6040516106fa9190614e18565b60405180910390f35b34801561070f57600080fd5b50610718611922565b6040516107259190614e78565b60405180910390f35b34801561073a57600080fd5b5061075560048036038101906107509190614378565b6119b0565b604051610762919061527a565b60405180910390f35b34801561077757600080fd5b50610780611a68565b005b34801561078e57600080fd5b50610797611af0565b6040516107a49190614d66565b60405180910390f35b3480156107b957600080fd5b506107c2611b1a565b6040516107cf9190614e78565b60405180910390f35b3480156107e457600080fd5b506107ed611bac565b6040516107fa9190614e18565b60405180910390f35b61081d6004803603810190610818919061460b565b611bbf565b005b34801561082b57600080fd5b50610846600480360381019061084191906144bb565b611f16565b005b34801561085457600080fd5b5061085d611f2c565b005b34801561086b57600080fd5b50610874611fc5565b6040516108819190614d66565b60405180910390f35b34801561089657600080fd5b506108b160048036038101906108ac9190614438565b611feb565b005b3480156108bf57600080fd5b506108da60048036038101906108d5919061453b565b61204d565b005b3480156108e857600080fd5b5061090360048036038101906108fe919061460b565b6120e6565b6040516109109190614e78565b60405180910390f35b34801561092557600080fd5b50610940600480360381019061093b91906144fb565b612237565b005b34801561094e57600080fd5b50610957612309565b604051610964919061527a565b60405180910390f35b34801561097957600080fd5b5061098261230f565b60405161098f919061527a565b60405180910390f35b3480156109a457600080fd5b506109bf60048036038101906109ba91906143a5565b612315565b6040516109cc9190614e18565b60405180910390f35b3480156109e157600080fd5b506109fc60048036038101906109f791906145c2565b6123a9565b005b348015610a0a57600080fd5b50610a256004803603810190610a209190614378565b61243f565b005b348015610a3357600080fd5b50610a4e6004803603810190610a49919061453b565b612537565b005b348015610a5c57600080fd5b50610a656125d0565b604051610a729190614e78565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aee5750610aed8261265e565b5b9050919050565b610afd612740565b73ffffffffffffffffffffffffffffffffffffffff16610b1b611af0565b73ffffffffffffffffffffffffffffffffffffffff1614610b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b689061519a565b60405180910390fd5b80601360006101000a81548160ff02191690831515021790555050565b606060008054610b9d9061557a565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc99061557a565b8015610c165780601f10610beb57610100808354040283529160200191610c16565b820191906000526020600020905b815481529060010190602001808311610bf957829003601f168201915b5050505050905090565b6000610c2b82612748565b610c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c619061517a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600d8054610cb29061557a565b80601f0160208091040260200160405190810160405280929190818152602001828054610cde9061557a565b8015610d2b5780601f10610d0057610100808354040283529160200191610d2b565b820191906000526020600020905b815481529060010190602001808311610d0e57829003601f168201915b505050505081565b6000610d3e82611842565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da6906151ba565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610dce612740565b73ffffffffffffffffffffffffffffffffffffffff161480610dfd5750610dfc81610df7612740565b612315565b5b610e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e339061509a565b60405180910390fd5b610e4683836127b4565b505050565b60155481565b610e59612740565b73ffffffffffffffffffffffffffffffffffffffff16610e77611af0565b73ffffffffffffffffffffffffffffffffffffffff1614610ecd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec49061519a565b60405180910390fd5b600060125414610edc57600080fd5b600e42610ee9919061565e565b60128190555060006012541415610eff57600080fd5b565b610f09612740565b73ffffffffffffffffffffffffffffffffffffffff16610f27611af0565b73ffffffffffffffffffffffffffffffffffffffff1614610f7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f749061519a565b60405180910390fd5b600060118054610f8c9061557a565b905014610fce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc59061525a565b60405180910390fd5b8060119080519060200190610fe4929190614136565b5050565b600e5481565b6000600880549050905090565b60186020528060005260406000206000915090505481565b60105481565b61102a611024612740565b8261286d565b611069576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611060906151fa565b60405180910390fd5b61107483838361294b565b505050565b60008060006016546015548561108f919061541f565b61109991906153ee565b905060008073ffffffffffffffffffffffffffffffffffffffff166017600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561112c57601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611161565b6017600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b905080829350935050509250929050565b61117a612740565b73ffffffffffffffffffffffffffffffffffffffff16611198611af0565b73ffffffffffffffffffffffffffffffffffffffff16146111ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e59061519a565b60405180910390fd5b60001515601360179054906101000a900460ff161515148015611224575060001515601360169054906101000a900460ff161515145b61122d57600080fd5b6000600190505b601f81101561127457611261611248612740565b6001611252610fee565b61125c9190615398565b612bb2565b808061126c906155dd565b915050611234565b506001601360166101000a81548160ff021916908315150217905550565b600061129d836119b0565b82106112de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d590614f1a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61135283838360405180602001604052806000815250611feb565b505050565b60606000611364836119b0565b905060008167ffffffffffffffff811115611382576113816157a9565b5b6040519080825280602002602001820160405280156113b05781602001602082028036833780820191505090505b50905060005b828110156113fa576113c88582611292565b8282815181106113db576113da61577a565b5b60200260200101818152505080806113f2906155dd565b9150506113b6565b508092505050919050565b6002600b54141561144b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114429061523a565b60405180910390fd5b6002600b81905550601360169054906101000a900460ff16801561147b5750601360179054906101000a900460ff165b6114ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b190614f3a565b60405180910390fd5b600083116114fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f490614eba565b60405180910390fd5b601054836018600061150d612740565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115529190615398565b1115611593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158a9061507a565b60405180910390fd5b600f548361159f610fee565b6115a99190615398565b11156115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e19061511a565b60405180910390fd5b6115fd8282856115f8612740565b612bd0565b61163c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116339061501a565b60405180910390fd5b82600e5461164a919061541f565b34101561168c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611683906151da565b60405180910390fd5b6000600190505b83811161172d57601860006116a6612740565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906116f1906155dd565b919050555061171a611701612740565b600161170b610fee565b6117159190615398565b612bb2565b8080611725906155dd565b915050611693565b506001600b81905550505050565b6000611745610fee565b8210611786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177d9061521a565b60405180910390fd5b6008828154811061179a5761179961577a565b5b90600052602060002001549050919050565b6117b4612740565b73ffffffffffffffffffffffffffffffffffffffff166117d2611af0565b73ffffffffffffffffffffffffffffffffffffffff1614611828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181f9061519a565b60405180910390fd5b80600c908051906020019061183e929190614136565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e2906150fa565b60405180910390fd5b80915050919050565b6000601360169054906101000a900460ff16905090565b6000601360179054906101000a900460ff16905090565b600c805461192f9061557a565b80601f016020809104026020016040519081016040528092919081815260200182805461195b9061557a565b80156119a85780601f1061197d576101008083540402835291602001916119a8565b820191906000526020600020905b81548152906001019060200180831161198b57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a18906150da565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611a70612740565b73ffffffffffffffffffffffffffffffffffffffff16611a8e611af0565b73ffffffffffffffffffffffffffffffffffffffff1614611ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adb9061519a565b60405180910390fd5b611aee6000612cf4565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611b299061557a565b80601f0160208091040260200160405190810160405280929190818152602001828054611b559061557a565b8015611ba25780601f10611b7757610100808354040283529160200191611ba2565b820191906000526020600020905b815481529060010190602001808311611b8557829003601f168201915b5050505050905090565b601360169054906101000a900460ff1681565b6002600b541415611c05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfc9061523a565b60405180910390fd5b6002600b81905550601360009054906101000a900460ff1615611c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5490614eda565b60405180910390fd5b601360179054906101000a900460ff168015611c8c575060001515601360169054906101000a900460ff161515145b611c9557600080fd5b60008111611cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccf90614eba565b60405180910390fd5b6010548160186000611ce8612740565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d2d9190615398565b1115611d6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d659061507a565b60405180910390fd5b600f5481611d7a610fee565b611d849190615398565b1115611dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbc9061511a565b60405180910390fd5b80600e54611dd3919061541f565b341015611e15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0c906151da565b60405180910390fd5b6000600190505b818111611eb65760186000611e2f612740565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611e7a906155dd565b9190505550611ea3611e8a612740565b6001611e94610fee565b611e9e9190615398565b612bb2565b8080611eae906155dd565b915050611e1c565b50611ec034612dba565b80611ec9612740565b73ffffffffffffffffffffffffffffffffffffffff167f3f2c9d57c068687834f0de942a9babb9e5acab57d516d3480a3c16ee165a427360405160405180910390a36001600b8190555050565b611f28611f21612740565b83836130e2565b5050565b611f34612740565b73ffffffffffffffffffffffffffffffffffffffff16611f52611af0565b73ffffffffffffffffffffffffffffffffffffffff1614611fa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9f9061519a565b60405180910390fd5b6001601360016101000a81548160ff021916908315150217905550565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611ffc611ff6612740565b8361286d565b61203b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612032906151fa565b60405180910390fd5b6120478484848461324f565b50505050565b612055612740565b73ffffffffffffffffffffffffffffffffffffffff16612073611af0565b73ffffffffffffffffffffffffffffffffffffffff16146120c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c09061519a565b60405180910390fd5b80601360176101000a81548160ff02191690831515021790555050565b60606120f182612748565b612130576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612127906150ba565b60405180910390fd5b60001515601360019054906101000a900460ff16151514156121de57600d80546121599061557a565b80601f01602080910402602001604051908101604052809291908181526020018280546121859061557a565b80156121d25780601f106121a7576101008083540402835291602001916121d2565b820191906000526020600020905b8154815290600101906020018083116121b557829003601f168201915b50505050509050612232565b6000600f54601254846121f19190615398565b6121fb919061565e565b90506122056132ab565b61220e8261333d565b60405160200161221f929190614cf0565b6040516020818303038152906040529150505b919050565b61223f612740565b73ffffffffffffffffffffffffffffffffffffffff1661225d611af0565b73ffffffffffffffffffffffffffffffffffffffff16146122b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122aa9061519a565b60405180910390fd5b816017600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600f5481565b60165481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123b1612740565b73ffffffffffffffffffffffffffffffffffffffff166123cf611af0565b73ffffffffffffffffffffffffffffffffffffffff1614612425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241c9061519a565b60405180910390fd5b80600d908051906020019061243b929190614136565b5050565b612447612740565b73ffffffffffffffffffffffffffffffffffffffff16612465611af0565b73ffffffffffffffffffffffffffffffffffffffff16146124bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b29061519a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561252b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252290614f7a565b60405180910390fd5b61253481612cf4565b50565b61253f612740565b73ffffffffffffffffffffffffffffffffffffffff1661255d611af0565b73ffffffffffffffffffffffffffffffffffffffff16146125b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125aa9061519a565b60405180910390fd5b80601360166101000a81548160ff02191690831515021790555050565b601180546125dd9061557a565b80601f01602080910402602001604051908101604052809291908181526020018280546126099061557a565b80156126565780601f1061262b57610100808354040283529160200191612656565b820191906000526020600020905b81548152906001019060200180831161263957829003601f168201915b505050505081565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061272957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061273957506127388261349e565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661282783611842565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061287882612748565b6128b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ae9061505a565b60405180910390fd5b60006128c283611842565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061293157508373ffffffffffffffffffffffffffffffffffffffff1661291984610c20565b73ffffffffffffffffffffffffffffffffffffffff16145b8061294257506129418185612315565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661296b82611842565b73ffffffffffffffffffffffffffffffffffffffff16146129c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b890614f9a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2890614fda565b60405180910390fd5b612a3c838383613508565b612a476000826127b4565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a979190615479565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612aee9190615398565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bad83838361361c565b505050565b612bcc828260405180602001604052806000815250613621565b5050565b6000808383604051602001612be6929190614d3a565b6040516020818303038152906040528051906020012090506000612c098261367c565b90506000612c5b8289898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506136ac565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015612ce75750601360029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b9350505050949350505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b734a40ef1da0e73a0df142d06470d7a2cffc677d2f73ffffffffffffffffffffffffffffffffffffffff166108fc6014606484612df791906153ee565b612e01919061541f565b9081150290604051600060405180830381858888f19350505050158015612e2c573d6000803e3d6000fd5b50735c3a1fa85cebcb46d3a0bedade0453dd7aed606a73ffffffffffffffffffffffffffffffffffffffff166108fc6002606484612e6a91906153ee565b612e74919061541f565b9081150290604051600060405180830381858888f19350505050158015612e9f573d6000803e3d6000fd5b507336dfa2b19c71f228ed8aa46de163cc9a6140852773ffffffffffffffffffffffffffffffffffffffff166108fc600f606484612edd91906153ee565b612ee7919061541f565b9081150290604051600060405180830381858888f19350505050158015612f12573d6000803e3d6000fd5b50734e0ebdafacb39cf80fb0d99dd084af63dea01a6a73ffffffffffffffffffffffffffffffffffffffff166108fc6007606484612f5091906153ee565b612f5a919061541f565b9081150290604051600060405180830381858888f19350505050158015612f85573d6000803e3d6000fd5b5073cad86d42672439cadc077105cef1cb057dc1eae873ffffffffffffffffffffffffffffffffffffffff166108fc6002606484612fc391906153ee565b612fcd919061541f565b9081150290604051600060405180830381858888f19350505050158015612ff8573d6000803e3d6000fd5b50733751bdd78c8409b4ae5101b9206f3a7b192123ad73ffffffffffffffffffffffffffffffffffffffff166108fc600460648461303691906153ee565b613040919061541f565b9081150290604051600060405180830381858888f1935050505015801561306b573d6000803e3d6000fd5b5073039ea3371da302ca3ea9192e3801b1e9bad6e20773ffffffffffffffffffffffffffffffffffffffff166108fc60326064846130a991906153ee565b6130b3919061541f565b9081150290604051600060405180830381858888f193505050501580156130de573d6000803e3d6000fd5b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613151576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314890614ffa565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516132429190614e18565b60405180910390a3505050565b61325a84848461294b565b613266848484846136d3565b6132a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329c90614f5a565b60405180910390fd5b50505050565b6060600c80546132ba9061557a565b80601f01602080910402602001604051908101604052809291908181526020018280546132e69061557a565b80156133335780601f1061330857610100808354040283529160200191613333565b820191906000526020600020905b81548152906001019060200180831161331657829003601f168201915b5050505050905090565b60606000821415613385576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613499565b600082905060005b600082146133b75780806133a0906155dd565b915050600a826133b091906153ee565b915061338d565b60008167ffffffffffffffff8111156133d3576133d26157a9565b5b6040519080825280601f01601f1916602001820160405280156134055781602001600182028036833780820191505090505b5090505b600085146134925760018261341e9190615479565b9150600a8561342d919061565e565b60306134399190615398565b60f81b81838151811061344f5761344e61577a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561348b91906153ee565b9450613409565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61351383838361386a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613556576135518161386f565b613595565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146135945761359383826138b8565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135d8576135d381613a25565b613617565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613616576136158282613af6565b5b5b505050565b505050565b61362b8383613b75565b61363860008484846136d3565b613677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161366e90614f5a565b60405180910390fd5b505050565b60008160405160200161368f9190614d14565b604051602081830303815290604052805190602001209050919050565b60008060006136bb8585613d4f565b915091506136c881613dd2565b819250505092915050565b60006136f48473ffffffffffffffffffffffffffffffffffffffff16613fa7565b1561385d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261371d612740565b8786866040518563ffffffff1660e01b815260040161373f9493929190614d81565b602060405180830381600087803b15801561375957600080fd5b505af192505050801561378a57506040513d601f19601f820116820180604052508101906137879190614595565b60015b61380d573d80600081146137ba576040519150601f19603f3d011682016040523d82523d6000602084013e6137bf565b606091505b50600081511415613805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137fc90614f5a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613862565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016138c5846119b0565b6138cf9190615479565b90506000600760008481526020019081526020016000205490508181146139b4576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613a399190615479565b9050600060096000848152602001908152602001600020549050600060088381548110613a6957613a6861577a565b5b906000526020600020015490508060088381548110613a8b57613a8a61577a565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613ada57613ad961574b565b5b6001900381819060005260206000200160009055905550505050565b6000613b01836119b0565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bdc9061515a565b60405180910390fd5b613bee81612748565b15613c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c2590614fba565b60405180910390fd5b613c3a60008383613508565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c8a9190615398565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613d4b6000838361361c565b5050565b600080604183511415613d915760008060006020860151925060408601519150606086015160001a9050613d8587828585613fca565b94509450505050613dcb565b604083511415613dc2576000806020850151915060408501519050613db78683836140d7565b935093505050613dcb565b60006002915091505b9250929050565b60006004811115613de657613de56156ed565b5b816004811115613df957613df86156ed565b5b1415613e0457613fa4565b60016004811115613e1857613e176156ed565b5b816004811115613e2b57613e2a6156ed565b5b1415613e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e6390614e9a565b60405180910390fd5b60026004811115613e8057613e7f6156ed565b5b816004811115613e9357613e926156ed565b5b1415613ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ecb90614efa565b60405180910390fd5b60036004811115613ee857613ee76156ed565b5b816004811115613efb57613efa6156ed565b5b1415613f3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f339061503a565b60405180910390fd5b600480811115613f4f57613f4e6156ed565b5b816004811115613f6257613f616156ed565b5b1415613fa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f9a9061513a565b60405180910390fd5b5b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156140055760006003915091506140ce565b601b8560ff161415801561401d5750601c8560ff1614155b1561402f5760006004915091506140ce565b6000600187878787604051600081526020016040526040516140549493929190614e33565b6020604051602081039080840390855afa158015614076573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156140c5576000600192509250506140ce565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c61411a9190615398565b905061412887828885613fca565b935093505050935093915050565b8280546141429061557a565b90600052602060002090601f01602090048101928261416457600085556141ab565b82601f1061417d57805160ff19168380011785556141ab565b828001600101855582156141ab579182015b828111156141aa57825182559160200191906001019061418f565b5b5090506141b891906141bc565b5090565b5b808211156141d55760008160009055506001016141bd565b5090565b60006141ec6141e7846152ba565b615295565b905082815260208101848484011115614208576142076157e7565b5b614213848285615538565b509392505050565b600061422e614229846152eb565b615295565b90508281526020810184848401111561424a576142496157e7565b5b614255848285615538565b509392505050565b60008135905061426c81615f6e565b92915050565b60008135905061428181615f85565b92915050565b60008135905061429681615f9c565b92915050565b6000815190506142ab81615f9c565b92915050565b60008083601f8401126142c7576142c66157dd565b5b8235905067ffffffffffffffff8111156142e4576142e36157d8565b5b602083019150836001820283011115614300576142ff6157e2565b5b9250929050565b600082601f83011261431c5761431b6157dd565b5b813561432c8482602086016141d9565b91505092915050565b600082601f83011261434a576143496157dd565b5b813561435a84826020860161421b565b91505092915050565b60008135905061437281615fb3565b92915050565b60006020828403121561438e5761438d6157f1565b5b600061439c8482850161425d565b91505092915050565b600080604083850312156143bc576143bb6157f1565b5b60006143ca8582860161425d565b92505060206143db8582860161425d565b9150509250929050565b6000806000606084860312156143fe576143fd6157f1565b5b600061440c8682870161425d565b935050602061441d8682870161425d565b925050604061442e86828701614363565b9150509250925092565b60008060008060808587031215614452576144516157f1565b5b60006144608782880161425d565b94505060206144718782880161425d565b935050604061448287828801614363565b925050606085013567ffffffffffffffff8111156144a3576144a26157ec565b5b6144af87828801614307565b91505092959194509250565b600080604083850312156144d2576144d16157f1565b5b60006144e08582860161425d565b92505060206144f185828601614272565b9150509250929050565b60008060408385031215614512576145116157f1565b5b60006145208582860161425d565b925050602061453185828601614363565b9150509250929050565b600060208284031215614551576145506157f1565b5b600061455f84828501614272565b91505092915050565b60006020828403121561457e5761457d6157f1565b5b600061458c84828501614287565b91505092915050565b6000602082840312156145ab576145aa6157f1565b5b60006145b98482850161429c565b91505092915050565b6000602082840312156145d8576145d76157f1565b5b600082013567ffffffffffffffff8111156145f6576145f56157ec565b5b61460284828501614335565b91505092915050565b600060208284031215614621576146206157f1565b5b600061462f84828501614363565b91505092915050565b600080600060408486031215614651576146506157f1565b5b600061465f86828701614363565b935050602084013567ffffffffffffffff8111156146805761467f6157ec565b5b61468c868287016142b1565b92509250509250925092565b600080604083850312156146af576146ae6157f1565b5b60006146bd85828601614363565b92505060206146ce85828601614363565b9150509250929050565b60006146e48383614cac565b60208301905092915050565b6146f9816154ad565b82525050565b61471061470b826154ad565b615626565b82525050565b60006147218261532c565b61472b818561535a565b93506147368361531c565b8060005b8381101561476757815161474e88826146d8565b97506147598361534d565b92505060018101905061473a565b5085935050505092915050565b61477d816154bf565b82525050565b61478c816154cb565b82525050565b6147a361479e826154cb565b615638565b82525050565b60006147b482615337565b6147be818561536b565b93506147ce818560208601615547565b6147d7816157f6565b840191505092915050565b60006147ed82615342565b6147f7818561537c565b9350614807818560208601615547565b614810816157f6565b840191505092915050565b600061482682615342565b614830818561538d565b9350614840818560208601615547565b80840191505092915050565b600061485960188361537c565b915061486482615814565b602082019050919050565b600061487c60168361537c565b91506148878261583d565b602082019050919050565b600061489f60068361537c565b91506148aa82615866565b602082019050919050565b60006148c2601f8361537c565b91506148cd8261588f565b602082019050919050565b60006148e5601c8361538d565b91506148f0826158b8565b601c82019050919050565b6000614908602b8361537c565b9150614913826158e1565b604082019050919050565b600061492b600b8361537c565b915061493682615930565b602082019050919050565b600061494e60328361537c565b915061495982615959565b604082019050919050565b600061497160268361537c565b915061497c826159a8565b604082019050919050565b600061499460258361537c565b915061499f826159f7565b604082019050919050565b60006149b7601c8361537c565b91506149c282615a46565b602082019050919050565b60006149da60248361537c565b91506149e582615a6f565b604082019050919050565b60006149fd60198361537c565b9150614a0882615abe565b602082019050919050565b6000614a20600b8361537c565b9150614a2b82615ae7565b602082019050919050565b6000614a4360228361537c565b9150614a4e82615b10565b604082019050919050565b6000614a66602c8361537c565b9150614a7182615b5f565b604082019050919050565b6000614a89600c8361537c565b9150614a9482615bae565b602082019050919050565b6000614aac60388361537c565b9150614ab782615bd7565b604082019050919050565b6000614acf60118361537c565b9150614ada82615c26565b602082019050919050565b6000614af2602a8361537c565b9150614afd82615c4f565b604082019050919050565b6000614b1560298361537c565b9150614b2082615c9e565b604082019050919050565b6000614b3860168361537c565b9150614b4382615ced565b602082019050919050565b6000614b5b60228361537c565b9150614b6682615d16565b604082019050919050565b6000614b7e60208361537c565b9150614b8982615d65565b602082019050919050565b6000614ba1602c8361537c565b9150614bac82615d8e565b604082019050919050565b6000614bc460208361537c565b9150614bcf82615ddd565b602082019050919050565b6000614be760218361537c565b9150614bf282615e06565b604082019050919050565b6000614c0a60128361537c565b9150614c1582615e55565b602082019050919050565b6000614c2d60318361537c565b9150614c3882615e7e565b604082019050919050565b6000614c50602c8361537c565b9150614c5b82615ecd565b604082019050919050565b6000614c73601f8361537c565b9150614c7e82615f1c565b602082019050919050565b6000614c96600b8361537c565b9150614ca182615f45565b602082019050919050565b614cb581615521565b82525050565b614cc481615521565b82525050565b614cdb614cd682615521565b615654565b82525050565b614cea8161552b565b82525050565b6000614cfc828561481b565b9150614d08828461481b565b91508190509392505050565b6000614d1f826148d8565b9150614d2b8284614792565b60208201915081905092915050565b6000614d468285614cca565b602082019150614d5682846146ff565b6014820191508190509392505050565b6000602082019050614d7b60008301846146f0565b92915050565b6000608082019050614d9660008301876146f0565b614da360208301866146f0565b614db06040830185614cbb565b8181036060830152614dc281846147a9565b905095945050505050565b6000604082019050614de260008301856146f0565b614def6020830184614cbb565b9392505050565b60006020820190508181036000830152614e108184614716565b905092915050565b6000602082019050614e2d6000830184614774565b92915050565b6000608082019050614e486000830187614783565b614e556020830186614ce1565b614e626040830185614783565b614e6f6060830184614783565b95945050505050565b60006020820190508181036000830152614e9281846147e2565b905092915050565b60006020820190508181036000830152614eb38161484c565b9050919050565b60006020820190508181036000830152614ed38161486f565b9050919050565b60006020820190508181036000830152614ef381614892565b9050919050565b60006020820190508181036000830152614f13816148b5565b9050919050565b60006020820190508181036000830152614f33816148fb565b9050919050565b60006020820190508181036000830152614f538161491e565b9050919050565b60006020820190508181036000830152614f7381614941565b9050919050565b60006020820190508181036000830152614f9381614964565b9050919050565b60006020820190508181036000830152614fb381614987565b9050919050565b60006020820190508181036000830152614fd3816149aa565b9050919050565b60006020820190508181036000830152614ff3816149cd565b9050919050565b60006020820190508181036000830152615013816149f0565b9050919050565b6000602082019050818103600083015261503381614a13565b9050919050565b6000602082019050818103600083015261505381614a36565b9050919050565b6000602082019050818103600083015261507381614a59565b9050919050565b6000602082019050818103600083015261509381614a7c565b9050919050565b600060208201905081810360008301526150b381614a9f565b9050919050565b600060208201905081810360008301526150d381614ac2565b9050919050565b600060208201905081810360008301526150f381614ae5565b9050919050565b6000602082019050818103600083015261511381614b08565b9050919050565b6000602082019050818103600083015261513381614b2b565b9050919050565b6000602082019050818103600083015261515381614b4e565b9050919050565b6000602082019050818103600083015261517381614b71565b9050919050565b6000602082019050818103600083015261519381614b94565b9050919050565b600060208201905081810360008301526151b381614bb7565b9050919050565b600060208201905081810360008301526151d381614bda565b9050919050565b600060208201905081810360008301526151f381614bfd565b9050919050565b6000602082019050818103600083015261521381614c20565b9050919050565b6000602082019050818103600083015261523381614c43565b9050919050565b6000602082019050818103600083015261525381614c66565b9050919050565b6000602082019050818103600083015261527381614c89565b9050919050565b600060208201905061528f6000830184614cbb565b92915050565b600061529f6152b0565b90506152ab82826155ac565b919050565b6000604051905090565b600067ffffffffffffffff8211156152d5576152d46157a9565b5b6152de826157f6565b9050602081019050919050565b600067ffffffffffffffff821115615306576153056157a9565b5b61530f826157f6565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006153a382615521565b91506153ae83615521565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156153e3576153e261568f565b5b828201905092915050565b60006153f982615521565b915061540483615521565b925082615414576154136156be565b5b828204905092915050565b600061542a82615521565b915061543583615521565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561546e5761546d61568f565b5b828202905092915050565b600061548482615521565b915061548f83615521565b9250828210156154a2576154a161568f565b5b828203905092915050565b60006154b882615501565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561556557808201518184015260208101905061554a565b83811115615574576000848401525b50505050565b6000600282049050600182168061559257607f821691505b602082108114156155a6576155a561571c565b5b50919050565b6155b5826157f6565b810181811067ffffffffffffffff821117156155d4576155d36157a9565b5b80604052505050565b60006155e882615521565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561561b5761561a61568f565b5b600182019050919050565b600061563182615642565b9050919050565b6000819050919050565b600061564d82615807565b9050919050565b6000819050919050565b600061566982615521565b915061567483615521565b925082615684576156836156be565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f6e65656420746f206d696e742031204e4654206d696e00000000000000000000600082015250565b7f5061757365640000000000000000000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4e6f742073746172746564000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f57726f6e67206461746120000000000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f6d696e74696e67206d6f72650000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f616c726561647920736574000000000000000000000000000000000000000000600082015250565b615f77816154ad565b8114615f8257600080fd5b50565b615f8e816154bf565b8114615f9957600080fd5b50565b615fa5816154d5565b8114615fb057600080fd5b50565b615fbc81615521565b8114615fc757600080fd5b5056fea2646970667358221220f1c275e0a20c34c7293f0d3341d5a60cb285442f1874822f808c91708df84b9564736f6c634300080700330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000046970667300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c68747470733a2f2f697066732e696f2f697066732f516d64336148556466433138416a51386f65486a48784a4b6b4570563264475a594e67344161647638784c6673443f66696c656e616d653d636f6d696e67736f6f6e2e6a736f6e00000000

Deployed Bytecode

0x60806040526004361061027d5760003560e01c8063640a38df1161014f578063ad2f852a116100c1578063df173dba1161007a578063df173dba1461096d578063e985e9c514610998578063f2c4ce1e146109d5578063f2fde38b146109fe578063f958a65714610a27578063ff1b655614610a505761027d565b8063ad2f852a1461085f578063b88d4fde1461088a578063c4e37095146108b3578063c87b56dd146108dc578063cd6a3ea514610919578063d5abeb01146109425761027d565b80638da5cb5b116101135780638da5cb5b1461078257806395d89b41146107ad5780639c70b512146107d8578063a0712d6814610803578063a22cb4651461081f578063a475b5dd146108485761027d565b8063640a38df146106ad5780636546f85a146106d85780636c0360eb1461070357806370a082311461072e578063715018a61461076b5761027d565b806318cae269116101f357806342842e0e116101ac57806342842e0e14610588578063438b6300146105b15780634c2c0855146105ee5780634f6ccce71461060a57806355f804b3146106475780636352211e146106705761027d565b806318cae26914610465578063239c70ae146104a257806323b872dd146104cd5780632a55205a146104f65780632af11474146105345780632f745c591461054b5761027d565b8063095ea7b311610245578063095ea7b31461037b578063099becfb146103a45780630a5a6b75146103cf57806310969523146103e657806313faede61461040f57806318160ddd1461043a5761027d565b806301ffc9a71461028257806302329a29146102bf57806306fdde03146102e8578063081812fc14610313578063081c8c4414610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190614568565b610a7b565b6040516102b69190614e18565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e1919061453b565b610af5565b005b3480156102f457600080fd5b506102fd610b8e565b60405161030a9190614e78565b60405180910390f35b34801561031f57600080fd5b5061033a6004803603810190610335919061460b565b610c20565b6040516103479190614d66565b60405180910390f35b34801561035c57600080fd5b50610365610ca5565b6040516103729190614e78565b60405180910390f35b34801561038757600080fd5b506103a2600480360381019061039d91906144fb565b610d33565b005b3480156103b057600080fd5b506103b9610e4b565b6040516103c6919061527a565b60405180910390f35b3480156103db57600080fd5b506103e4610e51565b005b3480156103f257600080fd5b5061040d600480360381019061040891906145c2565b610f01565b005b34801561041b57600080fd5b50610424610fe8565b604051610431919061527a565b60405180910390f35b34801561044657600080fd5b5061044f610fee565b60405161045c919061527a565b60405180910390f35b34801561047157600080fd5b5061048c60048036038101906104879190614378565b610ffb565b604051610499919061527a565b60405180910390f35b3480156104ae57600080fd5b506104b7611013565b6040516104c4919061527a565b60405180910390f35b3480156104d957600080fd5b506104f460048036038101906104ef91906143e5565b611019565b005b34801561050257600080fd5b5061051d60048036038101906105189190614698565b611079565b60405161052b929190614dcd565b60405180910390f35b34801561054057600080fd5b50610549611172565b005b34801561055757600080fd5b50610572600480360381019061056d91906144fb565b611292565b60405161057f919061527a565b60405180910390f35b34801561059457600080fd5b506105af60048036038101906105aa91906143e5565b611337565b005b3480156105bd57600080fd5b506105d860048036038101906105d39190614378565b611357565b6040516105e59190614df6565b60405180910390f35b61060860048036038101906106039190614638565b611405565b005b34801561061657600080fd5b50610631600480360381019061062c919061460b565b61173b565b60405161063e919061527a565b60405180910390f35b34801561065357600080fd5b5061066e600480360381019061066991906145c2565b6117ac565b005b34801561067c57600080fd5b506106976004803603810190610692919061460b565b611842565b6040516106a49190614d66565b60405180910390f35b3480156106b957600080fd5b506106c26118f4565b6040516106cf9190614e18565b60405180910390f35b3480156106e457600080fd5b506106ed61190b565b6040516106fa9190614e18565b60405180910390f35b34801561070f57600080fd5b50610718611922565b6040516107259190614e78565b60405180910390f35b34801561073a57600080fd5b5061075560048036038101906107509190614378565b6119b0565b604051610762919061527a565b60405180910390f35b34801561077757600080fd5b50610780611a68565b005b34801561078e57600080fd5b50610797611af0565b6040516107a49190614d66565b60405180910390f35b3480156107b957600080fd5b506107c2611b1a565b6040516107cf9190614e78565b60405180910390f35b3480156107e457600080fd5b506107ed611bac565b6040516107fa9190614e18565b60405180910390f35b61081d6004803603810190610818919061460b565b611bbf565b005b34801561082b57600080fd5b50610846600480360381019061084191906144bb565b611f16565b005b34801561085457600080fd5b5061085d611f2c565b005b34801561086b57600080fd5b50610874611fc5565b6040516108819190614d66565b60405180910390f35b34801561089657600080fd5b506108b160048036038101906108ac9190614438565b611feb565b005b3480156108bf57600080fd5b506108da60048036038101906108d5919061453b565b61204d565b005b3480156108e857600080fd5b5061090360048036038101906108fe919061460b565b6120e6565b6040516109109190614e78565b60405180910390f35b34801561092557600080fd5b50610940600480360381019061093b91906144fb565b612237565b005b34801561094e57600080fd5b50610957612309565b604051610964919061527a565b60405180910390f35b34801561097957600080fd5b5061098261230f565b60405161098f919061527a565b60405180910390f35b3480156109a457600080fd5b506109bf60048036038101906109ba91906143a5565b612315565b6040516109cc9190614e18565b60405180910390f35b3480156109e157600080fd5b506109fc60048036038101906109f791906145c2565b6123a9565b005b348015610a0a57600080fd5b50610a256004803603810190610a209190614378565b61243f565b005b348015610a3357600080fd5b50610a4e6004803603810190610a49919061453b565b612537565b005b348015610a5c57600080fd5b50610a656125d0565b604051610a729190614e78565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aee5750610aed8261265e565b5b9050919050565b610afd612740565b73ffffffffffffffffffffffffffffffffffffffff16610b1b611af0565b73ffffffffffffffffffffffffffffffffffffffff1614610b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b689061519a565b60405180910390fd5b80601360006101000a81548160ff02191690831515021790555050565b606060008054610b9d9061557a565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc99061557a565b8015610c165780601f10610beb57610100808354040283529160200191610c16565b820191906000526020600020905b815481529060010190602001808311610bf957829003601f168201915b5050505050905090565b6000610c2b82612748565b610c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c619061517a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600d8054610cb29061557a565b80601f0160208091040260200160405190810160405280929190818152602001828054610cde9061557a565b8015610d2b5780601f10610d0057610100808354040283529160200191610d2b565b820191906000526020600020905b815481529060010190602001808311610d0e57829003601f168201915b505050505081565b6000610d3e82611842565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da6906151ba565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610dce612740565b73ffffffffffffffffffffffffffffffffffffffff161480610dfd5750610dfc81610df7612740565b612315565b5b610e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e339061509a565b60405180910390fd5b610e4683836127b4565b505050565b60155481565b610e59612740565b73ffffffffffffffffffffffffffffffffffffffff16610e77611af0565b73ffffffffffffffffffffffffffffffffffffffff1614610ecd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec49061519a565b60405180910390fd5b600060125414610edc57600080fd5b600e42610ee9919061565e565b60128190555060006012541415610eff57600080fd5b565b610f09612740565b73ffffffffffffffffffffffffffffffffffffffff16610f27611af0565b73ffffffffffffffffffffffffffffffffffffffff1614610f7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f749061519a565b60405180910390fd5b600060118054610f8c9061557a565b905014610fce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc59061525a565b60405180910390fd5b8060119080519060200190610fe4929190614136565b5050565b600e5481565b6000600880549050905090565b60186020528060005260406000206000915090505481565b60105481565b61102a611024612740565b8261286d565b611069576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611060906151fa565b60405180910390fd5b61107483838361294b565b505050565b60008060006016546015548561108f919061541f565b61109991906153ee565b905060008073ffffffffffffffffffffffffffffffffffffffff166017600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561112c57601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611161565b6017600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b905080829350935050509250929050565b61117a612740565b73ffffffffffffffffffffffffffffffffffffffff16611198611af0565b73ffffffffffffffffffffffffffffffffffffffff16146111ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e59061519a565b60405180910390fd5b60001515601360179054906101000a900460ff161515148015611224575060001515601360169054906101000a900460ff161515145b61122d57600080fd5b6000600190505b601f81101561127457611261611248612740565b6001611252610fee565b61125c9190615398565b612bb2565b808061126c906155dd565b915050611234565b506001601360166101000a81548160ff021916908315150217905550565b600061129d836119b0565b82106112de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d590614f1a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61135283838360405180602001604052806000815250611feb565b505050565b60606000611364836119b0565b905060008167ffffffffffffffff811115611382576113816157a9565b5b6040519080825280602002602001820160405280156113b05781602001602082028036833780820191505090505b50905060005b828110156113fa576113c88582611292565b8282815181106113db576113da61577a565b5b60200260200101818152505080806113f2906155dd565b9150506113b6565b508092505050919050565b6002600b54141561144b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114429061523a565b60405180910390fd5b6002600b81905550601360169054906101000a900460ff16801561147b5750601360179054906101000a900460ff165b6114ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b190614f3a565b60405180910390fd5b600083116114fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f490614eba565b60405180910390fd5b601054836018600061150d612740565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115529190615398565b1115611593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158a9061507a565b60405180910390fd5b600f548361159f610fee565b6115a99190615398565b11156115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e19061511a565b60405180910390fd5b6115fd8282856115f8612740565b612bd0565b61163c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116339061501a565b60405180910390fd5b82600e5461164a919061541f565b34101561168c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611683906151da565b60405180910390fd5b6000600190505b83811161172d57601860006116a6612740565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906116f1906155dd565b919050555061171a611701612740565b600161170b610fee565b6117159190615398565b612bb2565b8080611725906155dd565b915050611693565b506001600b81905550505050565b6000611745610fee565b8210611786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177d9061521a565b60405180910390fd5b6008828154811061179a5761179961577a565b5b90600052602060002001549050919050565b6117b4612740565b73ffffffffffffffffffffffffffffffffffffffff166117d2611af0565b73ffffffffffffffffffffffffffffffffffffffff1614611828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181f9061519a565b60405180910390fd5b80600c908051906020019061183e929190614136565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e2906150fa565b60405180910390fd5b80915050919050565b6000601360169054906101000a900460ff16905090565b6000601360179054906101000a900460ff16905090565b600c805461192f9061557a565b80601f016020809104026020016040519081016040528092919081815260200182805461195b9061557a565b80156119a85780601f1061197d576101008083540402835291602001916119a8565b820191906000526020600020905b81548152906001019060200180831161198b57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a18906150da565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611a70612740565b73ffffffffffffffffffffffffffffffffffffffff16611a8e611af0565b73ffffffffffffffffffffffffffffffffffffffff1614611ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adb9061519a565b60405180910390fd5b611aee6000612cf4565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611b299061557a565b80601f0160208091040260200160405190810160405280929190818152602001828054611b559061557a565b8015611ba25780601f10611b7757610100808354040283529160200191611ba2565b820191906000526020600020905b815481529060010190602001808311611b8557829003601f168201915b5050505050905090565b601360169054906101000a900460ff1681565b6002600b541415611c05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfc9061523a565b60405180910390fd5b6002600b81905550601360009054906101000a900460ff1615611c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5490614eda565b60405180910390fd5b601360179054906101000a900460ff168015611c8c575060001515601360169054906101000a900460ff161515145b611c9557600080fd5b60008111611cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccf90614eba565b60405180910390fd5b6010548160186000611ce8612740565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d2d9190615398565b1115611d6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d659061507a565b60405180910390fd5b600f5481611d7a610fee565b611d849190615398565b1115611dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbc9061511a565b60405180910390fd5b80600e54611dd3919061541f565b341015611e15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0c906151da565b60405180910390fd5b6000600190505b818111611eb65760186000611e2f612740565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611e7a906155dd565b9190505550611ea3611e8a612740565b6001611e94610fee565b611e9e9190615398565b612bb2565b8080611eae906155dd565b915050611e1c565b50611ec034612dba565b80611ec9612740565b73ffffffffffffffffffffffffffffffffffffffff167f3f2c9d57c068687834f0de942a9babb9e5acab57d516d3480a3c16ee165a427360405160405180910390a36001600b8190555050565b611f28611f21612740565b83836130e2565b5050565b611f34612740565b73ffffffffffffffffffffffffffffffffffffffff16611f52611af0565b73ffffffffffffffffffffffffffffffffffffffff1614611fa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9f9061519a565b60405180910390fd5b6001601360016101000a81548160ff021916908315150217905550565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611ffc611ff6612740565b8361286d565b61203b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612032906151fa565b60405180910390fd5b6120478484848461324f565b50505050565b612055612740565b73ffffffffffffffffffffffffffffffffffffffff16612073611af0565b73ffffffffffffffffffffffffffffffffffffffff16146120c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c09061519a565b60405180910390fd5b80601360176101000a81548160ff02191690831515021790555050565b60606120f182612748565b612130576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612127906150ba565b60405180910390fd5b60001515601360019054906101000a900460ff16151514156121de57600d80546121599061557a565b80601f01602080910402602001604051908101604052809291908181526020018280546121859061557a565b80156121d25780601f106121a7576101008083540402835291602001916121d2565b820191906000526020600020905b8154815290600101906020018083116121b557829003601f168201915b50505050509050612232565b6000600f54601254846121f19190615398565b6121fb919061565e565b90506122056132ab565b61220e8261333d565b60405160200161221f929190614cf0565b6040516020818303038152906040529150505b919050565b61223f612740565b73ffffffffffffffffffffffffffffffffffffffff1661225d611af0565b73ffffffffffffffffffffffffffffffffffffffff16146122b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122aa9061519a565b60405180910390fd5b816017600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600f5481565b60165481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123b1612740565b73ffffffffffffffffffffffffffffffffffffffff166123cf611af0565b73ffffffffffffffffffffffffffffffffffffffff1614612425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241c9061519a565b60405180910390fd5b80600d908051906020019061243b929190614136565b5050565b612447612740565b73ffffffffffffffffffffffffffffffffffffffff16612465611af0565b73ffffffffffffffffffffffffffffffffffffffff16146124bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b29061519a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561252b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252290614f7a565b60405180910390fd5b61253481612cf4565b50565b61253f612740565b73ffffffffffffffffffffffffffffffffffffffff1661255d611af0565b73ffffffffffffffffffffffffffffffffffffffff16146125b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125aa9061519a565b60405180910390fd5b80601360166101000a81548160ff02191690831515021790555050565b601180546125dd9061557a565b80601f01602080910402602001604051908101604052809291908181526020018280546126099061557a565b80156126565780601f1061262b57610100808354040283529160200191612656565b820191906000526020600020905b81548152906001019060200180831161263957829003601f168201915b505050505081565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061272957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061273957506127388261349e565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661282783611842565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061287882612748565b6128b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ae9061505a565b60405180910390fd5b60006128c283611842565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061293157508373ffffffffffffffffffffffffffffffffffffffff1661291984610c20565b73ffffffffffffffffffffffffffffffffffffffff16145b8061294257506129418185612315565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661296b82611842565b73ffffffffffffffffffffffffffffffffffffffff16146129c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b890614f9a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2890614fda565b60405180910390fd5b612a3c838383613508565b612a476000826127b4565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a979190615479565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612aee9190615398565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bad83838361361c565b505050565b612bcc828260405180602001604052806000815250613621565b5050565b6000808383604051602001612be6929190614d3a565b6040516020818303038152906040528051906020012090506000612c098261367c565b90506000612c5b8289898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506136ac565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015612ce75750601360029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b9350505050949350505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b734a40ef1da0e73a0df142d06470d7a2cffc677d2f73ffffffffffffffffffffffffffffffffffffffff166108fc6014606484612df791906153ee565b612e01919061541f565b9081150290604051600060405180830381858888f19350505050158015612e2c573d6000803e3d6000fd5b50735c3a1fa85cebcb46d3a0bedade0453dd7aed606a73ffffffffffffffffffffffffffffffffffffffff166108fc6002606484612e6a91906153ee565b612e74919061541f565b9081150290604051600060405180830381858888f19350505050158015612e9f573d6000803e3d6000fd5b507336dfa2b19c71f228ed8aa46de163cc9a6140852773ffffffffffffffffffffffffffffffffffffffff166108fc600f606484612edd91906153ee565b612ee7919061541f565b9081150290604051600060405180830381858888f19350505050158015612f12573d6000803e3d6000fd5b50734e0ebdafacb39cf80fb0d99dd084af63dea01a6a73ffffffffffffffffffffffffffffffffffffffff166108fc6007606484612f5091906153ee565b612f5a919061541f565b9081150290604051600060405180830381858888f19350505050158015612f85573d6000803e3d6000fd5b5073cad86d42672439cadc077105cef1cb057dc1eae873ffffffffffffffffffffffffffffffffffffffff166108fc6002606484612fc391906153ee565b612fcd919061541f565b9081150290604051600060405180830381858888f19350505050158015612ff8573d6000803e3d6000fd5b50733751bdd78c8409b4ae5101b9206f3a7b192123ad73ffffffffffffffffffffffffffffffffffffffff166108fc600460648461303691906153ee565b613040919061541f565b9081150290604051600060405180830381858888f1935050505015801561306b573d6000803e3d6000fd5b5073039ea3371da302ca3ea9192e3801b1e9bad6e20773ffffffffffffffffffffffffffffffffffffffff166108fc60326064846130a991906153ee565b6130b3919061541f565b9081150290604051600060405180830381858888f193505050501580156130de573d6000803e3d6000fd5b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613151576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314890614ffa565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516132429190614e18565b60405180910390a3505050565b61325a84848461294b565b613266848484846136d3565b6132a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329c90614f5a565b60405180910390fd5b50505050565b6060600c80546132ba9061557a565b80601f01602080910402602001604051908101604052809291908181526020018280546132e69061557a565b80156133335780601f1061330857610100808354040283529160200191613333565b820191906000526020600020905b81548152906001019060200180831161331657829003601f168201915b5050505050905090565b60606000821415613385576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613499565b600082905060005b600082146133b75780806133a0906155dd565b915050600a826133b091906153ee565b915061338d565b60008167ffffffffffffffff8111156133d3576133d26157a9565b5b6040519080825280601f01601f1916602001820160405280156134055781602001600182028036833780820191505090505b5090505b600085146134925760018261341e9190615479565b9150600a8561342d919061565e565b60306134399190615398565b60f81b81838151811061344f5761344e61577a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561348b91906153ee565b9450613409565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61351383838361386a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613556576135518161386f565b613595565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146135945761359383826138b8565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135d8576135d381613a25565b613617565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613616576136158282613af6565b5b5b505050565b505050565b61362b8383613b75565b61363860008484846136d3565b613677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161366e90614f5a565b60405180910390fd5b505050565b60008160405160200161368f9190614d14565b604051602081830303815290604052805190602001209050919050565b60008060006136bb8585613d4f565b915091506136c881613dd2565b819250505092915050565b60006136f48473ffffffffffffffffffffffffffffffffffffffff16613fa7565b1561385d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261371d612740565b8786866040518563ffffffff1660e01b815260040161373f9493929190614d81565b602060405180830381600087803b15801561375957600080fd5b505af192505050801561378a57506040513d601f19601f820116820180604052508101906137879190614595565b60015b61380d573d80600081146137ba576040519150601f19603f3d011682016040523d82523d6000602084013e6137bf565b606091505b50600081511415613805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137fc90614f5a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613862565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016138c5846119b0565b6138cf9190615479565b90506000600760008481526020019081526020016000205490508181146139b4576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613a399190615479565b9050600060096000848152602001908152602001600020549050600060088381548110613a6957613a6861577a565b5b906000526020600020015490508060088381548110613a8b57613a8a61577a565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613ada57613ad961574b565b5b6001900381819060005260206000200160009055905550505050565b6000613b01836119b0565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bdc9061515a565b60405180910390fd5b613bee81612748565b15613c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c2590614fba565b60405180910390fd5b613c3a60008383613508565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c8a9190615398565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613d4b6000838361361c565b5050565b600080604183511415613d915760008060006020860151925060408601519150606086015160001a9050613d8587828585613fca565b94509450505050613dcb565b604083511415613dc2576000806020850151915060408501519050613db78683836140d7565b935093505050613dcb565b60006002915091505b9250929050565b60006004811115613de657613de56156ed565b5b816004811115613df957613df86156ed565b5b1415613e0457613fa4565b60016004811115613e1857613e176156ed565b5b816004811115613e2b57613e2a6156ed565b5b1415613e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e6390614e9a565b60405180910390fd5b60026004811115613e8057613e7f6156ed565b5b816004811115613e9357613e926156ed565b5b1415613ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ecb90614efa565b60405180910390fd5b60036004811115613ee857613ee76156ed565b5b816004811115613efb57613efa6156ed565b5b1415613f3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f339061503a565b60405180910390fd5b600480811115613f4f57613f4e6156ed565b5b816004811115613f6257613f616156ed565b5b1415613fa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f9a9061513a565b60405180910390fd5b5b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156140055760006003915091506140ce565b601b8560ff161415801561401d5750601c8560ff1614155b1561402f5760006004915091506140ce565b6000600187878787604051600081526020016040526040516140549493929190614e33565b6020604051602081039080840390855afa158015614076573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156140c5576000600192509250506140ce565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c61411a9190615398565b905061412887828885613fca565b935093505050935093915050565b8280546141429061557a565b90600052602060002090601f01602090048101928261416457600085556141ab565b82601f1061417d57805160ff19168380011785556141ab565b828001600101855582156141ab579182015b828111156141aa57825182559160200191906001019061418f565b5b5090506141b891906141bc565b5090565b5b808211156141d55760008160009055506001016141bd565b5090565b60006141ec6141e7846152ba565b615295565b905082815260208101848484011115614208576142076157e7565b5b614213848285615538565b509392505050565b600061422e614229846152eb565b615295565b90508281526020810184848401111561424a576142496157e7565b5b614255848285615538565b509392505050565b60008135905061426c81615f6e565b92915050565b60008135905061428181615f85565b92915050565b60008135905061429681615f9c565b92915050565b6000815190506142ab81615f9c565b92915050565b60008083601f8401126142c7576142c66157dd565b5b8235905067ffffffffffffffff8111156142e4576142e36157d8565b5b602083019150836001820283011115614300576142ff6157e2565b5b9250929050565b600082601f83011261431c5761431b6157dd565b5b813561432c8482602086016141d9565b91505092915050565b600082601f83011261434a576143496157dd565b5b813561435a84826020860161421b565b91505092915050565b60008135905061437281615fb3565b92915050565b60006020828403121561438e5761438d6157f1565b5b600061439c8482850161425d565b91505092915050565b600080604083850312156143bc576143bb6157f1565b5b60006143ca8582860161425d565b92505060206143db8582860161425d565b9150509250929050565b6000806000606084860312156143fe576143fd6157f1565b5b600061440c8682870161425d565b935050602061441d8682870161425d565b925050604061442e86828701614363565b9150509250925092565b60008060008060808587031215614452576144516157f1565b5b60006144608782880161425d565b94505060206144718782880161425d565b935050604061448287828801614363565b925050606085013567ffffffffffffffff8111156144a3576144a26157ec565b5b6144af87828801614307565b91505092959194509250565b600080604083850312156144d2576144d16157f1565b5b60006144e08582860161425d565b92505060206144f185828601614272565b9150509250929050565b60008060408385031215614512576145116157f1565b5b60006145208582860161425d565b925050602061453185828601614363565b9150509250929050565b600060208284031215614551576145506157f1565b5b600061455f84828501614272565b91505092915050565b60006020828403121561457e5761457d6157f1565b5b600061458c84828501614287565b91505092915050565b6000602082840312156145ab576145aa6157f1565b5b60006145b98482850161429c565b91505092915050565b6000602082840312156145d8576145d76157f1565b5b600082013567ffffffffffffffff8111156145f6576145f56157ec565b5b61460284828501614335565b91505092915050565b600060208284031215614621576146206157f1565b5b600061462f84828501614363565b91505092915050565b600080600060408486031215614651576146506157f1565b5b600061465f86828701614363565b935050602084013567ffffffffffffffff8111156146805761467f6157ec565b5b61468c868287016142b1565b92509250509250925092565b600080604083850312156146af576146ae6157f1565b5b60006146bd85828601614363565b92505060206146ce85828601614363565b9150509250929050565b60006146e48383614cac565b60208301905092915050565b6146f9816154ad565b82525050565b61471061470b826154ad565b615626565b82525050565b60006147218261532c565b61472b818561535a565b93506147368361531c565b8060005b8381101561476757815161474e88826146d8565b97506147598361534d565b92505060018101905061473a565b5085935050505092915050565b61477d816154bf565b82525050565b61478c816154cb565b82525050565b6147a361479e826154cb565b615638565b82525050565b60006147b482615337565b6147be818561536b565b93506147ce818560208601615547565b6147d7816157f6565b840191505092915050565b60006147ed82615342565b6147f7818561537c565b9350614807818560208601615547565b614810816157f6565b840191505092915050565b600061482682615342565b614830818561538d565b9350614840818560208601615547565b80840191505092915050565b600061485960188361537c565b915061486482615814565b602082019050919050565b600061487c60168361537c565b91506148878261583d565b602082019050919050565b600061489f60068361537c565b91506148aa82615866565b602082019050919050565b60006148c2601f8361537c565b91506148cd8261588f565b602082019050919050565b60006148e5601c8361538d565b91506148f0826158b8565b601c82019050919050565b6000614908602b8361537c565b9150614913826158e1565b604082019050919050565b600061492b600b8361537c565b915061493682615930565b602082019050919050565b600061494e60328361537c565b915061495982615959565b604082019050919050565b600061497160268361537c565b915061497c826159a8565b604082019050919050565b600061499460258361537c565b915061499f826159f7565b604082019050919050565b60006149b7601c8361537c565b91506149c282615a46565b602082019050919050565b60006149da60248361537c565b91506149e582615a6f565b604082019050919050565b60006149fd60198361537c565b9150614a0882615abe565b602082019050919050565b6000614a20600b8361537c565b9150614a2b82615ae7565b602082019050919050565b6000614a4360228361537c565b9150614a4e82615b10565b604082019050919050565b6000614a66602c8361537c565b9150614a7182615b5f565b604082019050919050565b6000614a89600c8361537c565b9150614a9482615bae565b602082019050919050565b6000614aac60388361537c565b9150614ab782615bd7565b604082019050919050565b6000614acf60118361537c565b9150614ada82615c26565b602082019050919050565b6000614af2602a8361537c565b9150614afd82615c4f565b604082019050919050565b6000614b1560298361537c565b9150614b2082615c9e565b604082019050919050565b6000614b3860168361537c565b9150614b4382615ced565b602082019050919050565b6000614b5b60228361537c565b9150614b6682615d16565b604082019050919050565b6000614b7e60208361537c565b9150614b8982615d65565b602082019050919050565b6000614ba1602c8361537c565b9150614bac82615d8e565b604082019050919050565b6000614bc460208361537c565b9150614bcf82615ddd565b602082019050919050565b6000614be760218361537c565b9150614bf282615e06565b604082019050919050565b6000614c0a60128361537c565b9150614c1582615e55565b602082019050919050565b6000614c2d60318361537c565b9150614c3882615e7e565b604082019050919050565b6000614c50602c8361537c565b9150614c5b82615ecd565b604082019050919050565b6000614c73601f8361537c565b9150614c7e82615f1c565b602082019050919050565b6000614c96600b8361537c565b9150614ca182615f45565b602082019050919050565b614cb581615521565b82525050565b614cc481615521565b82525050565b614cdb614cd682615521565b615654565b82525050565b614cea8161552b565b82525050565b6000614cfc828561481b565b9150614d08828461481b565b91508190509392505050565b6000614d1f826148d8565b9150614d2b8284614792565b60208201915081905092915050565b6000614d468285614cca565b602082019150614d5682846146ff565b6014820191508190509392505050565b6000602082019050614d7b60008301846146f0565b92915050565b6000608082019050614d9660008301876146f0565b614da360208301866146f0565b614db06040830185614cbb565b8181036060830152614dc281846147a9565b905095945050505050565b6000604082019050614de260008301856146f0565b614def6020830184614cbb565b9392505050565b60006020820190508181036000830152614e108184614716565b905092915050565b6000602082019050614e2d6000830184614774565b92915050565b6000608082019050614e486000830187614783565b614e556020830186614ce1565b614e626040830185614783565b614e6f6060830184614783565b95945050505050565b60006020820190508181036000830152614e9281846147e2565b905092915050565b60006020820190508181036000830152614eb38161484c565b9050919050565b60006020820190508181036000830152614ed38161486f565b9050919050565b60006020820190508181036000830152614ef381614892565b9050919050565b60006020820190508181036000830152614f13816148b5565b9050919050565b60006020820190508181036000830152614f33816148fb565b9050919050565b60006020820190508181036000830152614f538161491e565b9050919050565b60006020820190508181036000830152614f7381614941565b9050919050565b60006020820190508181036000830152614f9381614964565b9050919050565b60006020820190508181036000830152614fb381614987565b9050919050565b60006020820190508181036000830152614fd3816149aa565b9050919050565b60006020820190508181036000830152614ff3816149cd565b9050919050565b60006020820190508181036000830152615013816149f0565b9050919050565b6000602082019050818103600083015261503381614a13565b9050919050565b6000602082019050818103600083015261505381614a36565b9050919050565b6000602082019050818103600083015261507381614a59565b9050919050565b6000602082019050818103600083015261509381614a7c565b9050919050565b600060208201905081810360008301526150b381614a9f565b9050919050565b600060208201905081810360008301526150d381614ac2565b9050919050565b600060208201905081810360008301526150f381614ae5565b9050919050565b6000602082019050818103600083015261511381614b08565b9050919050565b6000602082019050818103600083015261513381614b2b565b9050919050565b6000602082019050818103600083015261515381614b4e565b9050919050565b6000602082019050818103600083015261517381614b71565b9050919050565b6000602082019050818103600083015261519381614b94565b9050919050565b600060208201905081810360008301526151b381614bb7565b9050919050565b600060208201905081810360008301526151d381614bda565b9050919050565b600060208201905081810360008301526151f381614bfd565b9050919050565b6000602082019050818103600083015261521381614c20565b9050919050565b6000602082019050818103600083015261523381614c43565b9050919050565b6000602082019050818103600083015261525381614c66565b9050919050565b6000602082019050818103600083015261527381614c89565b9050919050565b600060208201905061528f6000830184614cbb565b92915050565b600061529f6152b0565b90506152ab82826155ac565b919050565b6000604051905090565b600067ffffffffffffffff8211156152d5576152d46157a9565b5b6152de826157f6565b9050602081019050919050565b600067ffffffffffffffff821115615306576153056157a9565b5b61530f826157f6565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006153a382615521565b91506153ae83615521565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156153e3576153e261568f565b5b828201905092915050565b60006153f982615521565b915061540483615521565b925082615414576154136156be565b5b828204905092915050565b600061542a82615521565b915061543583615521565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561546e5761546d61568f565b5b828202905092915050565b600061548482615521565b915061548f83615521565b9250828210156154a2576154a161568f565b5b828203905092915050565b60006154b882615501565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561556557808201518184015260208101905061554a565b83811115615574576000848401525b50505050565b6000600282049050600182168061559257607f821691505b602082108114156155a6576155a561571c565b5b50919050565b6155b5826157f6565b810181811067ffffffffffffffff821117156155d4576155d36157a9565b5b80604052505050565b60006155e882615521565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561561b5761561a61568f565b5b600182019050919050565b600061563182615642565b9050919050565b6000819050919050565b600061564d82615807565b9050919050565b6000819050919050565b600061566982615521565b915061567483615521565b925082615684576156836156be565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f6e65656420746f206d696e742031204e4654206d696e00000000000000000000600082015250565b7f5061757365640000000000000000000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4e6f742073746172746564000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f57726f6e67206461746120000000000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f6d696e74696e67206d6f72650000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f616c726561647920736574000000000000000000000000000000000000000000600082015250565b615f77816154ad565b8114615f8257600080fd5b50565b615f8e816154bf565b8114615f9957600080fd5b50565b615fa5816154d5565b8114615fb057600080fd5b50565b615fbc81615521565b8114615fc757600080fd5b5056fea2646970667358221220f1c275e0a20c34c7293f0d3341d5a60cb285442f1874822f808c91708df84b9564736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000046970667300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c68747470733a2f2f697066732e696f2f697066732f516d64336148556466433138416a51386f65486a48784a4b6b4570563264475a594e67344161647638784c6673443f66696c656e616d653d636f6d696e67736f6f6e2e6a736f6e00000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): ipfs
Arg [1] : _initNotRevealedUri (string): https://ipfs.io/ipfs/Qmd3aHUdfC18AjQ8oeHjHxJKkEpV2dGZYNg4Aadv8xLfsD?filename=comingsoon.json

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [3] : 6970667300000000000000000000000000000000000000000000000000000000
Arg [4] : 000000000000000000000000000000000000000000000000000000000000005c
Arg [5] : 68747470733a2f2f697066732e696f2f697066732f516d643361485564664331
Arg [6] : 38416a51386f65486a48784a4b6b4570563264475a594e67344161647638784c
Arg [7] : 6673443f66696c656e616d653d636f6d696e67736f6f6e2e6a736f6e00000000


Deployed Bytecode Sourcemap

57847:6442:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51607:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63117:73;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38427:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39986:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58023:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39509:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58458:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62714:155;;;;;;;;;;;;;:::i;:::-;;64089:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58056:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52247:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58603:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58129:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40736:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63564:364;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;60563:250;;;;;;;;;;;;;:::i;:::-;;51915:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41146:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61250:330;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59837:720;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52437:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62885:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38121:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63293:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63385:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57997:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37851:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17023:103;;;;;;;;;;;;;:::i;:::-;;16372:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38596:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58319:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59137:694;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40279:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62642:65;;;;;;;;;;;;;:::i;:::-;;58381:72;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41402:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63199:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62245:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63936:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58094:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58496:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40505:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62991:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17281:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63471:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58166:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51607:224;51709:4;51748:35;51733:50;;;:11;:50;;;;:90;;;;51787:36;51811:11;51787:23;:36::i;:::-;51733:90;51726:97;;51607:224;;;:::o;63117:73::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63178:6:::1;63169;;:15;;;;;;;;;;;;;;;;;;63117:73:::0;:::o;38427:100::-;38481:13;38514:5;38507:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38427:100;:::o;39986:221::-;40062:7;40090:16;40098:7;40090;:16::i;:::-;40082:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40175:15;:24;40191:7;40175:24;;;;;;;;;;;;;;;;;;;;;40168:31;;39986:221;;;:::o;58023:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39509:411::-;39590:13;39606:23;39621:7;39606:14;:23::i;:::-;39590:39;;39654:5;39648:11;;:2;:11;;;;39640:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;39748:5;39732:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;39757:37;39774:5;39781:12;:10;:12::i;:::-;39757:16;:37::i;:::-;39732:62;39710:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;39891:21;39900:2;39904:7;39891:8;:21::i;:::-;39579:341;39509:411;;:::o;58458:33::-;;;;:::o;62714:155::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62780:1:::1;62770:6;;:11;62762:20;;;::::0;::::1;;62828:2;62810:15;:20;;;;:::i;:::-;62801:6;:29;;;;62860:1;62850:6;;:11;;62842:20;;;::::0;::::1;;62714:155::o:0;64089:193::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64214:1:::1;64187:15;64181:29;;;;;:::i;:::-;;;:34;64173:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;64259:14;64241:15;:32;;;;;;;;;;;;:::i;:::-;;64089:193:::0;:::o;58056:33::-;;;;:::o;52247:113::-;52308:7;52335:10;:17;;;;52328:24;;52247:113;:::o;58603:55::-;;;;;;;;;;;;;;;;;:::o;58129:32::-;;;;:::o;40736:339::-;40931:41;40950:12;:10;:12::i;:::-;40964:7;40931:18;:41::i;:::-;40923:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;41039:28;41049:4;41055:2;41059:7;41039:9;:28::i;:::-;40736:339;;;:::o;63564:364::-;63646:16;63664:21;63696:14;63737:19;;63724:12;;63713:10;:23;;;;:::i;:::-;:43;;;;:::i;:::-;63696:60;;63765:23;63830:1;63791:41;;:17;:27;63809:8;63791:27;;;;;;;;;;;;;;;;;;;;;:41;;;;:88;;63865:14;;;;;;;;;;;63791:88;;;63835:17;:27;63853:8;63835:27;;;;;;;;;;;;;;;;;;;;;63791:88;63765:114;;63896:15;63913:6;63888:32;;;;;;63564:364;;;;;:::o;60563:250::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60634:5:::1;60618:21;;:12;;;;;;;;;;;:21;;;:47;;;;;60660:5;60643:22;;:15;;;;;;;;;;;:22;;;60618:47;60610:56;;;::::0;::::1;;60684:6;60693:1;60684:10;;60679:100;60700:2;60696:1;:6;60679:100;;;60724:43;60734:12;:10;:12::i;:::-;60764:1;60748:13;:11;:13::i;:::-;:17;;;;:::i;:::-;60724:9;:43::i;:::-;60704:3;;;;;:::i;:::-;;;;60679:100;;;;60803:4;60787:15;;:20;;;;;;;;;;;;;;;;;;60563:250::o:0;51915:256::-;52012:7;52048:23;52065:5;52048:16;:23::i;:::-;52040:5;:31;52032:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;52137:12;:19;52150:5;52137:19;;;;;;;;;;;;;;;:26;52157:5;52137:26;;;;;;;;;;;;52130:33;;51915:256;;;;:::o;41146:185::-;41284:39;41301:4;41307:2;41311:7;41284:39;;;;;;;;;;;;:16;:39::i;:::-;41146:185;;;:::o;61250:330::-;61310:16;61335:23;61361:17;61371:6;61361:9;:17::i;:::-;61335:43;;61385:25;61427:15;61413:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61385:58;;61455:9;61450:103;61470:15;61466:1;:19;61450:103;;;61515:30;61535:6;61543:1;61515:19;:30::i;:::-;61501:8;61510:1;61501:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;61487:3;;;;;:::i;:::-;;;;61450:103;;;;61566:8;61559:15;;;;61250:330;;;:::o;59837:720::-;1812:1;2410:7;;:19;;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;59951:15:::1;;;;;;;;;;;:31;;;;;59970:12;;;;;;;;;;;59951:31;59943:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;60027:1;60013:11;:15;60005:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;60128:13;;60113:11;60076:20;:34;60097:12;:10;:12::i;:::-;60076:34;;;;;;;;;;;;;;;;:48;;;;:::i;:::-;:65;;60068:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;60204:9;;60189:11;60173:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;60165:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;60255:56;60274:9;;60285:11;60298:12;:10;:12::i;:::-;60255:18;:56::i;:::-;60247:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;60362:11;60355:4;;:18;;;;:::i;:::-;60342:9;:31;;60334:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;60409:9;60421:1;60409:13;;60405:147;60429:11;60424:1;:16;60405:147;;60456:20;:34;60477:12;:10;:12::i;:::-;60456:34;;;;;;;;;;;;;;;;:36;;;;;;;;;:::i;:::-;;;;;;60501:43;60511:12;:10;:12::i;:::-;60541:1;60525:13;:11;:13::i;:::-;:17;;;;:::i;:::-;60501:9;:43::i;:::-;60442:3;;;;;:::i;:::-;;;;60405:147;;;;1768:1:::0;2722:7;:22;;;;59837:720;;;:::o;52437:233::-;52512:7;52548:30;:28;:30::i;:::-;52540:5;:38;52532:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;52645:10;52656:5;52645:17;;;;;;;;:::i;:::-;;;;;;;;;;52638:24;;52437:233;;;:::o;62885:100::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62967:11:::1;62957:7;:21;;;;;;;;;;;;:::i;:::-;;62885:100:::0;:::o;38121:239::-;38193:7;38213:13;38229:7;:16;38237:7;38229:16;;;;;;;;;;;;;;;;;;;;;38213:32;;38281:1;38264:19;;:5;:19;;;;38256:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38347:5;38340:12;;;38121:239;;;:::o;63293:88::-;63340:4;63360:15;;;;;;;;;;;63353:22;;63293:88;:::o;63385:80::-;63427:4;63447:12;;;;;;;;;;;63440:19;;63385:80;:::o;57997:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37851:208::-;37923:7;37968:1;37951:19;;:5;:19;;;;37943:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;38035:9;:16;38045:5;38035:16;;;;;;;;;;;;;;;;38028:23;;37851:208;;;:::o;17023:103::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17088:30:::1;17115:1;17088:18;:30::i;:::-;17023:103::o:0;16372:87::-;16418:7;16445:6;;;;;;;;;;;16438:13;;16372:87;:::o;38596:104::-;38652:13;38685:7;38678:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38596:104;:::o;58319:27::-;;;;;;;;;;;;;:::o;59137:694::-;1812:1;2410:7;;:19;;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;59216:6:::1;;;;;;;;;;;59215:7;59207:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;59248:12;;;;;;;;;;;:38;;;;;59281:5;59264:22;;:15;;;;;;;;;;;:22;;;59248:38;59240:47;;;::::0;::::1;;59322:1;59308:11;:15;59300:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;59417:13;;59402:11;59365:20;:34;59386:12;:10;:12::i;:::-;59365:34;;;;;;;;;;;;;;;;:48;;;;:::i;:::-;:65;;59357:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;59493:9;;59478:11;59462:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;59454:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;59564:11;59557:4;;:18;;;;:::i;:::-;59544:9;:31;;59536:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;59610:9;59622:1;59610:13;;59605:149;59630:11;59625:1;:16;59605:149;;59659:20;:34;59680:12;:10;:12::i;:::-;59659:34;;;;;;;;;;;;;;;;:36;;;;;;;;;:::i;:::-;;;;;;59704:42;59714:12;:10;:12::i;:::-;59744:1;59728:13;:11;:13::i;:::-;:17;;;;:::i;:::-;59704:9;:42::i;:::-;59643:3;;;;;:::i;:::-;;;;59605:149;;;;59760:14;59764:9;59760:3;:14::i;:::-;59813:11;59799:12;:10;:12::i;:::-;59786:39;;;;;;;;;;;;1768:1:::0;2722:7;:22;;;;59137:694;:::o;40279:155::-;40374:52;40393:12;:10;:12::i;:::-;40407:8;40417;40374:18;:52::i;:::-;40279:155;;:::o;62642:65::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62697:4:::1;62686:8;;:15;;;;;;;;;;;;;;;;;;62642:65::o:0;58381:72::-;;;;;;;;;;;;;:::o;41402:328::-;41577:41;41596:12;:10;:12::i;:::-;41610:7;41577:18;:41::i;:::-;41569:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;41683:39;41697:4;41703:2;41707:7;41716:5;41683:13;:39::i;:::-;41402:328;;;;:::o;63199:88::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63274:6:::1;63259:12;;:21;;;;;;;;;;;;;;;;;;63199:88:::0;:::o;62245:371::-;62318:13;62350:16;62358:7;62350;:16::i;:::-;62342:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;62413:5;62401:17;;:8;;;;;;;;;;;:17;;;62398:66;;;62440:14;62433:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62398:66;62474:22;62520:9;;62510:6;;62500:7;:16;;;;:::i;:::-;62499:30;;;;:::i;:::-;62474:55;;62569:10;:8;:10::i;:::-;62581:25;:14;:23;:25::i;:::-;62552:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62538:70;;;62245:371;;;;:::o;63936:144::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64064:8:::1;64035:17;:26;64053:7;64035:26;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;63936:144:::0;;:::o;58094:30::-;;;;:::o;58496:42::-;;;;:::o;40505:164::-;40602:4;40626:18;:25;40645:5;40626:25;;;;;;;;;;;;;;;:35;40652:8;40626:35;;;;;;;;;;;;;;;;;;;;;;;;;40619:42;;40505:164;;;;:::o;62991:120::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63090:15:::1;63073:14;:32;;;;;;;;;;;;:::i;:::-;;62991:120:::0;:::o;17281:201::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17390:1:::1;17370:22;;:8;:22;;;;17362:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;17446:28;17465:8;17446:18;:28::i;:::-;17281:201:::0;:::o;63471:89::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63548:6:::1;63530:15;;:24;;;;;;;;;;;;;;;;;;63471:89:::0;:::o;58166:29::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37482:305::-;37584:4;37636:25;37621:40;;;:11;:40;;;;:105;;;;37693:33;37678:48;;;:11;:48;;;;37621:105;:158;;;;37743:36;37767:11;37743:23;:36::i;:::-;37621:158;37601:178;;37482:305;;;:::o;15096:98::-;15149:7;15176:10;15169:17;;15096:98;:::o;43240:127::-;43305:4;43357:1;43329:30;;:7;:16;43337:7;43329:16;;;;;;;;;;;;;;;;;;;;;:30;;;;43322:37;;43240:127;;;:::o;47386:174::-;47488:2;47461:15;:24;47477:7;47461:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;47544:7;47540:2;47506:46;;47515:23;47530:7;47515:14;:23::i;:::-;47506:46;;;;;;;;;;;;47386:174;;:::o;43534:348::-;43627:4;43652:16;43660:7;43652;:16::i;:::-;43644:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43728:13;43744:23;43759:7;43744:14;:23::i;:::-;43728:39;;43797:5;43786:16;;:7;:16;;;:51;;;;43830:7;43806:31;;:20;43818:7;43806:11;:20::i;:::-;:31;;;43786:51;:87;;;;43841:32;43858:5;43865:7;43841:16;:32::i;:::-;43786:87;43778:96;;;43534:348;;;;:::o;46643:625::-;46802:4;46775:31;;:23;46790:7;46775:14;:23::i;:::-;:31;;;46767:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;46881:1;46867:16;;:2;:16;;;;46859:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;46937:39;46958:4;46964:2;46968:7;46937:20;:39::i;:::-;47041:29;47058:1;47062:7;47041:8;:29::i;:::-;47102:1;47083:9;:15;47093:4;47083:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;47131:1;47114:9;:13;47124:2;47114:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;47162:2;47143:7;:16;47151:7;47143:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;47201:7;47197:2;47182:27;;47191:4;47182:27;;;;;;;;;;;;47222:38;47242:4;47248:2;47252:7;47222:19;:38::i;:::-;46643:625;;;:::o;44224:110::-;44300:26;44310:2;44314:7;44300:26;;;;;;;;;;;;:9;:26::i;:::-;44224:110;;:::o;60821:423::-;60936:4;60951:16;60997:12;61010:6;60980:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60970:48;;;;;;60951:67;;61027:15;61045:38;61074:8;61045:28;:38::i;:::-;61027:56;;61094:23;61120:33;61134:7;61143:9;;61120:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:33::i;:::-;61094:59;;61197:1;61170:29;;:15;:29;;;;:65;;;;;61222:13;;;;;;;;;;;61203:32;;:15;:32;;;61170:65;61162:74;;;;;60821:423;;;;;;:::o;17642:191::-;17716:16;17735:6;;;;;;;;;;;17716:25;;17761:8;17752:6;;:17;;;;;;;;;;;;;;;;;;17816:8;17785:40;;17806:8;17785:40;;;;;;;;;;;;17705:128;17642:191;:::o;61586:651::-;61637:42;61629:60;;:76;61702:2;61697:3;61690:6;:10;;;;:::i;:::-;:14;;;;:::i;:::-;61629:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61721:42;61713:60;;:76;61787:1;61781:3;61774:6;:10;;;;:::i;:::-;:14;;;;:::i;:::-;61713:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61805:42;61797:60;;:77;61871:2;61865:3;61858:6;:10;;;;:::i;:::-;:15;;;;:::i;:::-;61797:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61891:42;61883:61;;:77;61958:1;61952:3;61945:6;:10;;;;:::i;:::-;:14;;;;:::i;:::-;61883:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61977:42;61969:60;;:76;62043:1;62037:3;62030:6;:10;;;;:::i;:::-;:14;;;;:::i;:::-;61969:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62062:42;62054:60;;:76;62128:1;62122:3;62115:6;:10;;;;:::i;:::-;:14;;;;:::i;:::-;62054:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62148:42;62140:60;;:77;62214:2;62208:3;62201:6;:10;;;;:::i;:::-;:15;;;;:::i;:::-;62140:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61586:651;:::o;47702:315::-;47857:8;47848:17;;:5;:17;;;;47840:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;47944:8;47906:18;:25;47925:5;47906:25;;;;;;;;;;;;;;;:35;47932:8;47906:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;47990:8;47968:41;;47983:5;47968:41;;;48000:8;47968:41;;;;;;:::i;:::-;;;;;;;;47702:315;;;:::o;42612:::-;42769:28;42779:4;42785:2;42789:7;42769:9;:28::i;:::-;42816:48;42839:4;42845:2;42849:7;42858:5;42816:22;:48::i;:::-;42808:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;42612:315;;;;:::o;59016:102::-;59076:13;59105:7;59098:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59016:102;:::o;3124:723::-;3180:13;3410:1;3401:5;:10;3397:53;;;3428:10;;;;;;;;;;;;;;;;;;;;;3397:53;3460:12;3475:5;3460:20;;3491:14;3516:78;3531:1;3523:4;:9;3516:78;;3549:8;;;;;:::i;:::-;;;;3580:2;3572:10;;;;;:::i;:::-;;;3516:78;;;3604:19;3636:6;3626:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3604:39;;3654:154;3670:1;3661:5;:10;3654:154;;3698:1;3688:11;;;;;:::i;:::-;;;3765:2;3757:5;:10;;;;:::i;:::-;3744:2;:24;;;;:::i;:::-;3731:39;;3714:6;3721;3714:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3794:2;3785:11;;;;;:::i;:::-;;;3654:154;;;3832:6;3818:21;;;;;3124:723;;;;:::o;29156:157::-;29241:4;29280:25;29265:40;;;:11;:40;;;;29258:47;;29156:157;;;:::o;53283:589::-;53427:45;53454:4;53460:2;53464:7;53427:26;:45::i;:::-;53505:1;53489:18;;:4;:18;;;53485:187;;;53524:40;53556:7;53524:31;:40::i;:::-;53485:187;;;53594:2;53586:10;;:4;:10;;;53582:90;;53613:47;53646:4;53652:7;53613:32;:47::i;:::-;53582:90;53485:187;53700:1;53686:16;;:2;:16;;;53682:183;;;53719:45;53756:7;53719:36;:45::i;:::-;53682:183;;;53792:4;53786:10;;:2;:10;;;53782:83;;53813:40;53841:2;53845:7;53813:27;:40::i;:::-;53782:83;53682:183;53283:589;;;:::o;50464:125::-;;;;:::o;44561:321::-;44691:18;44697:2;44701:7;44691:5;:18::i;:::-;44742:54;44773:1;44777:2;44781:7;44790:5;44742:22;:54::i;:::-;44720:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;44561:321;;;:::o;13102:269::-;13171:7;13357:4;13304:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;13294:69;;;;;;13287:76;;13102:269;;;:::o;9300:231::-;9378:7;9399:17;9418:18;9440:27;9451:4;9457:9;9440:10;:27::i;:::-;9398:69;;;;9478:18;9490:5;9478:11;:18::i;:::-;9514:9;9507:16;;;;9300:231;;;;:::o;48582:799::-;48737:4;48758:15;:2;:13;;;:15::i;:::-;48754:620;;;48810:2;48794:36;;;48831:12;:10;:12::i;:::-;48845:4;48851:7;48860:5;48794:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;48790:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49053:1;49036:6;:13;:18;49032:272;;;49079:60;;;;;;;;;;:::i;:::-;;;;;;;;49032:272;49254:6;49248:13;49239:6;49235:2;49231:15;49224:38;48790:529;48927:41;;;48917:51;;;:6;:51;;;;48910:58;;;;;48754:620;49358:4;49351:11;;48582:799;;;;;;;:::o;49953:126::-;;;;:::o;54595:164::-;54699:10;:17;;;;54672:15;:24;54688:7;54672:24;;;;;;;;;;;:44;;;;54727:10;54743:7;54727:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54595:164;:::o;55386:988::-;55652:22;55702:1;55677:22;55694:4;55677:16;:22::i;:::-;:26;;;;:::i;:::-;55652:51;;55714:18;55735:17;:26;55753:7;55735:26;;;;;;;;;;;;55714:47;;55882:14;55868:10;:28;55864:328;;55913:19;55935:12;:18;55948:4;55935:18;;;;;;;;;;;;;;;:34;55954:14;55935:34;;;;;;;;;;;;55913:56;;56019:11;55986:12;:18;55999:4;55986:18;;;;;;;;;;;;;;;:30;56005:10;55986:30;;;;;;;;;;;:44;;;;56136:10;56103:17;:30;56121:11;56103:30;;;;;;;;;;;:43;;;;55898:294;55864:328;56288:17;:26;56306:7;56288:26;;;;;;;;;;;56281:33;;;56332:12;:18;56345:4;56332:18;;;;;;;;;;;;;;;:34;56351:14;56332:34;;;;;;;;;;;56325:41;;;55467:907;;55386:988;;:::o;56669:1079::-;56922:22;56967:1;56947:10;:17;;;;:21;;;;:::i;:::-;56922:46;;56979:18;57000:15;:24;57016:7;57000:24;;;;;;;;;;;;56979:45;;57351:19;57373:10;57384:14;57373:26;;;;;;;;:::i;:::-;;;;;;;;;;57351:48;;57437:11;57412:10;57423;57412:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;57548:10;57517:15;:28;57533:11;57517:28;;;;;;;;;;;:41;;;;57689:15;:24;57705:7;57689:24;;;;;;;;;;;57682:31;;;57724:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;56740:1008;;;56669:1079;:::o;54173:221::-;54258:14;54275:20;54292:2;54275:16;:20::i;:::-;54258:37;;54333:7;54306:12;:16;54319:2;54306:16;;;;;;;;;;;;;;;:24;54323:6;54306:24;;;;;;;;;;;:34;;;;54380:6;54351:17;:26;54369:7;54351:26;;;;;;;;;;;:35;;;;54247:147;54173:221;;:::o;45218:439::-;45312:1;45298:16;;:2;:16;;;;45290:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;45371:16;45379:7;45371;:16::i;:::-;45370:17;45362:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;45433:45;45462:1;45466:2;45470:7;45433:20;:45::i;:::-;45508:1;45491:9;:13;45501:2;45491:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;45539:2;45520:7;:16;45528:7;45520:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;45584:7;45580:2;45559:33;;45576:1;45559:33;;;;;;;;;;;;45605:44;45633:1;45637:2;45641:7;45605:19;:44::i;:::-;45218:439;;:::o;7190:1308::-;7271:7;7280:12;7525:2;7505:9;:16;:22;7501:990;;;7544:9;7568;7592:7;7801:4;7790:9;7786:20;7780:27;7775:32;;7851:4;7840:9;7836:20;7830:27;7825:32;;7909:4;7898:9;7894:20;7888:27;7885:1;7880:36;7875:41;;7952:25;7963:4;7969:1;7972;7975;7952:10;:25::i;:::-;7945:32;;;;;;;;;7501:990;8019:2;7999:9;:16;:22;7995:496;;;8038:9;8062:10;8274:4;8263:9;8259:20;8253:27;8248:32;;8325:4;8314:9;8310:20;8304:27;8298:33;;8367:23;8378:4;8384:1;8387:2;8367:10;:23::i;:::-;8360:30;;;;;;;;7995:496;8439:1;8443:35;8423:56;;;;7190:1308;;;;;;:::o;5461:643::-;5539:20;5530:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;5526:571;;;5576:7;;5526:571;5637:29;5628:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;5624:473;;;5683:34;;;;;;;;;;:::i;:::-;;;;;;;;5624:473;5748:35;5739:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;5735:362;;;5800:41;;;;;;;;;;:::i;:::-;;;;;;;;5735:362;5872:30;5863:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;5859:238;;;5919:44;;;;;;;;;;:::i;:::-;;;;;;;;5859:238;5994:30;5985:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;5981:116;;;6041:44;;;;;;;;;;:::i;:::-;;;;;;;;5981:116;5461:643;;:::o;19073:326::-;19133:4;19390:1;19368:7;:19;;;:23;19361:30;;19073:326;;;:::o;10752:1632::-;10883:7;10892:12;11817:66;11812:1;11804:10;;:79;11800:163;;;11916:1;11920:30;11900:51;;;;;;11800:163;11982:2;11977:1;:7;;;;:18;;;;;11993:2;11988:1;:7;;;;11977:18;11973:102;;;12028:1;12032:30;12012:51;;;;;;11973:102;12172:14;12189:24;12199:4;12205:1;12208;12211;12189:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12172:41;;12246:1;12228:20;;:6;:20;;;12224:103;;;12281:1;12285:29;12265:50;;;;;;;12224:103;12347:6;12355:20;12339:37;;;;;10752:1632;;;;;;;;:::o;9794:344::-;9908:7;9917:12;9942:9;9967:66;9959:75;;9954:2;:80;9942:92;;10045:7;10084:2;10077:3;10070:2;10062:11;;:18;;10061:25;;;;:::i;:::-;10045:42;;10105:25;10116:4;10122:1;10125;10128;10105:10;:25::i;:::-;10098:32;;;;;;9794:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::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:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:552::-;1485:8;1495:6;1545:3;1538:4;1530:6;1526:17;1522:27;1512:122;;1553:79;;:::i;:::-;1512:122;1666:6;1653:20;1643:30;;1696:18;1688:6;1685:30;1682:117;;;1718:79;;:::i;:::-;1682:117;1832:4;1824:6;1820:17;1808:29;;1886:3;1878:4;1870:6;1866:17;1856:8;1852:32;1849:41;1846:128;;;1893:79;;:::i;:::-;1846:128;1428:552;;;;;:::o;1999:338::-;2054:5;2103:3;2096:4;2088:6;2084:17;2080:27;2070:122;;2111:79;;:::i;:::-;2070:122;2228:6;2215:20;2253:78;2327:3;2319:6;2312:4;2304:6;2300:17;2253:78;:::i;:::-;2244:87;;2060:277;1999:338;;;;:::o;2357:340::-;2413:5;2462:3;2455:4;2447:6;2443:17;2439:27;2429:122;;2470:79;;:::i;:::-;2429:122;2587:6;2574:20;2612:79;2687:3;2679:6;2672:4;2664:6;2660:17;2612:79;:::i;:::-;2603:88;;2419:278;2357:340;;;;:::o;2703:139::-;2749:5;2787:6;2774:20;2765:29;;2803:33;2830:5;2803:33;:::i;:::-;2703:139;;;;:::o;2848:329::-;2907:6;2956:2;2944:9;2935:7;2931:23;2927:32;2924:119;;;2962:79;;:::i;:::-;2924:119;3082:1;3107:53;3152:7;3143:6;3132:9;3128:22;3107:53;:::i;:::-;3097:63;;3053:117;2848:329;;;;:::o;3183:474::-;3251:6;3259;3308:2;3296:9;3287:7;3283:23;3279:32;3276:119;;;3314:79;;:::i;:::-;3276:119;3434:1;3459:53;3504:7;3495:6;3484:9;3480:22;3459:53;:::i;:::-;3449:63;;3405:117;3561:2;3587:53;3632:7;3623:6;3612:9;3608:22;3587:53;:::i;:::-;3577:63;;3532:118;3183:474;;;;;:::o;3663:619::-;3740:6;3748;3756;3805:2;3793:9;3784:7;3780:23;3776:32;3773:119;;;3811:79;;:::i;:::-;3773:119;3931:1;3956:53;4001:7;3992:6;3981:9;3977:22;3956:53;:::i;:::-;3946:63;;3902:117;4058:2;4084:53;4129:7;4120:6;4109:9;4105:22;4084:53;:::i;:::-;4074:63;;4029:118;4186:2;4212:53;4257:7;4248:6;4237:9;4233:22;4212:53;:::i;:::-;4202:63;;4157:118;3663:619;;;;;:::o;4288:943::-;4383:6;4391;4399;4407;4456:3;4444:9;4435:7;4431:23;4427:33;4424:120;;;4463:79;;:::i;:::-;4424:120;4583:1;4608:53;4653:7;4644:6;4633:9;4629:22;4608:53;:::i;:::-;4598:63;;4554:117;4710:2;4736:53;4781:7;4772:6;4761:9;4757:22;4736:53;:::i;:::-;4726:63;;4681:118;4838:2;4864:53;4909:7;4900:6;4889:9;4885:22;4864:53;:::i;:::-;4854:63;;4809:118;4994:2;4983:9;4979:18;4966:32;5025:18;5017:6;5014:30;5011:117;;;5047:79;;:::i;:::-;5011:117;5152:62;5206:7;5197:6;5186:9;5182:22;5152:62;:::i;:::-;5142:72;;4937:287;4288:943;;;;;;;:::o;5237:468::-;5302:6;5310;5359:2;5347:9;5338:7;5334:23;5330:32;5327:119;;;5365:79;;:::i;:::-;5327:119;5485:1;5510:53;5555:7;5546:6;5535:9;5531:22;5510:53;:::i;:::-;5500:63;;5456:117;5612:2;5638:50;5680:7;5671:6;5660:9;5656:22;5638:50;:::i;:::-;5628:60;;5583:115;5237:468;;;;;:::o;5711:474::-;5779:6;5787;5836:2;5824:9;5815:7;5811:23;5807:32;5804:119;;;5842:79;;:::i;:::-;5804:119;5962:1;5987:53;6032:7;6023:6;6012:9;6008:22;5987:53;:::i;:::-;5977:63;;5933:117;6089:2;6115:53;6160:7;6151:6;6140:9;6136:22;6115:53;:::i;:::-;6105:63;;6060:118;5711:474;;;;;:::o;6191:323::-;6247:6;6296:2;6284:9;6275:7;6271:23;6267:32;6264:119;;;6302:79;;:::i;:::-;6264:119;6422:1;6447:50;6489:7;6480:6;6469:9;6465:22;6447:50;:::i;:::-;6437:60;;6393:114;6191:323;;;;:::o;6520:327::-;6578:6;6627:2;6615:9;6606:7;6602:23;6598:32;6595:119;;;6633:79;;:::i;:::-;6595:119;6753:1;6778:52;6822:7;6813:6;6802:9;6798:22;6778:52;:::i;:::-;6768:62;;6724:116;6520:327;;;;:::o;6853:349::-;6922:6;6971:2;6959:9;6950:7;6946:23;6942:32;6939:119;;;6977:79;;:::i;:::-;6939:119;7097:1;7122:63;7177:7;7168:6;7157:9;7153:22;7122:63;:::i;:::-;7112:73;;7068:127;6853:349;;;;:::o;7208:509::-;7277:6;7326:2;7314:9;7305:7;7301:23;7297:32;7294:119;;;7332:79;;:::i;:::-;7294:119;7480:1;7469:9;7465:17;7452:31;7510:18;7502:6;7499:30;7496:117;;;7532:79;;:::i;:::-;7496:117;7637:63;7692:7;7683:6;7672:9;7668:22;7637:63;:::i;:::-;7627:73;;7423:287;7208:509;;;;:::o;7723:329::-;7782:6;7831:2;7819:9;7810:7;7806:23;7802:32;7799:119;;;7837:79;;:::i;:::-;7799:119;7957:1;7982:53;8027:7;8018:6;8007:9;8003:22;7982:53;:::i;:::-;7972:63;;7928:117;7723:329;;;;:::o;8058:672::-;8137:6;8145;8153;8202:2;8190:9;8181:7;8177:23;8173:32;8170:119;;;8208:79;;:::i;:::-;8170:119;8328:1;8353:53;8398:7;8389:6;8378:9;8374:22;8353:53;:::i;:::-;8343:63;;8299:117;8483:2;8472:9;8468:18;8455:32;8514:18;8506:6;8503:30;8500:117;;;8536:79;;:::i;:::-;8500:117;8649:64;8705:7;8696:6;8685:9;8681:22;8649:64;:::i;:::-;8631:82;;;;8426:297;8058:672;;;;;:::o;8736:474::-;8804:6;8812;8861:2;8849:9;8840:7;8836:23;8832:32;8829:119;;;8867:79;;:::i;:::-;8829:119;8987:1;9012:53;9057:7;9048:6;9037:9;9033:22;9012:53;:::i;:::-;9002:63;;8958:117;9114:2;9140:53;9185:7;9176:6;9165:9;9161:22;9140:53;:::i;:::-;9130:63;;9085:118;8736:474;;;;;:::o;9216:179::-;9285:10;9306:46;9348:3;9340:6;9306:46;:::i;:::-;9384:4;9379:3;9375:14;9361:28;;9216:179;;;;:::o;9401:118::-;9488:24;9506:5;9488:24;:::i;:::-;9483:3;9476:37;9401:118;;:::o;9525:157::-;9630:45;9650:24;9668:5;9650:24;:::i;:::-;9630:45;:::i;:::-;9625:3;9618:58;9525:157;;:::o;9718:732::-;9837:3;9866:54;9914:5;9866:54;:::i;:::-;9936:86;10015:6;10010:3;9936:86;:::i;:::-;9929:93;;10046:56;10096:5;10046:56;:::i;:::-;10125:7;10156:1;10141:284;10166:6;10163:1;10160:13;10141:284;;;10242:6;10236:13;10269:63;10328:3;10313:13;10269:63;:::i;:::-;10262:70;;10355:60;10408:6;10355:60;:::i;:::-;10345:70;;10201:224;10188:1;10185;10181:9;10176:14;;10141:284;;;10145:14;10441:3;10434:10;;9842:608;;;9718:732;;;;:::o;10456:109::-;10537:21;10552:5;10537:21;:::i;:::-;10532:3;10525:34;10456:109;;:::o;10571:118::-;10658:24;10676:5;10658:24;:::i;:::-;10653:3;10646:37;10571:118;;:::o;10695:157::-;10800:45;10820:24;10838:5;10820:24;:::i;:::-;10800:45;:::i;:::-;10795:3;10788:58;10695:157;;:::o;10858:360::-;10944:3;10972:38;11004:5;10972:38;:::i;:::-;11026:70;11089:6;11084:3;11026:70;:::i;:::-;11019:77;;11105:52;11150:6;11145:3;11138:4;11131:5;11127:16;11105:52;:::i;:::-;11182:29;11204:6;11182:29;:::i;:::-;11177:3;11173:39;11166:46;;10948:270;10858:360;;;;:::o;11224:364::-;11312:3;11340:39;11373:5;11340:39;:::i;:::-;11395:71;11459:6;11454:3;11395:71;:::i;:::-;11388:78;;11475:52;11520:6;11515:3;11508:4;11501:5;11497:16;11475:52;:::i;:::-;11552:29;11574:6;11552:29;:::i;:::-;11547:3;11543:39;11536:46;;11316:272;11224:364;;;;:::o;11594:377::-;11700:3;11728:39;11761:5;11728:39;:::i;:::-;11783:89;11865:6;11860:3;11783:89;:::i;:::-;11776:96;;11881:52;11926:6;11921:3;11914:4;11907:5;11903:16;11881:52;:::i;:::-;11958:6;11953:3;11949:16;11942:23;;11704:267;11594:377;;;;:::o;11977:366::-;12119:3;12140:67;12204:2;12199:3;12140:67;:::i;:::-;12133:74;;12216:93;12305:3;12216:93;:::i;:::-;12334:2;12329:3;12325:12;12318:19;;11977:366;;;:::o;12349:::-;12491:3;12512:67;12576:2;12571:3;12512:67;:::i;:::-;12505:74;;12588:93;12677:3;12588:93;:::i;:::-;12706:2;12701:3;12697:12;12690:19;;12349:366;;;:::o;12721:365::-;12863:3;12884:66;12948:1;12943:3;12884:66;:::i;:::-;12877:73;;12959:93;13048:3;12959:93;:::i;:::-;13077:2;13072:3;13068:12;13061:19;;12721:365;;;:::o;13092:366::-;13234:3;13255:67;13319:2;13314:3;13255:67;:::i;:::-;13248:74;;13331:93;13420:3;13331:93;:::i;:::-;13449:2;13444:3;13440:12;13433:19;;13092:366;;;:::o;13464:402::-;13624:3;13645:85;13727:2;13722:3;13645:85;:::i;:::-;13638:92;;13739:93;13828:3;13739:93;:::i;:::-;13857:2;13852:3;13848:12;13841:19;;13464:402;;;:::o;13872:366::-;14014:3;14035:67;14099:2;14094:3;14035:67;:::i;:::-;14028:74;;14111:93;14200:3;14111:93;:::i;:::-;14229:2;14224:3;14220:12;14213:19;;13872:366;;;:::o;14244:::-;14386:3;14407:67;14471:2;14466:3;14407:67;:::i;:::-;14400:74;;14483:93;14572:3;14483:93;:::i;:::-;14601:2;14596:3;14592:12;14585:19;;14244:366;;;:::o;14616:::-;14758:3;14779:67;14843:2;14838:3;14779:67;:::i;:::-;14772:74;;14855:93;14944:3;14855:93;:::i;:::-;14973:2;14968:3;14964:12;14957:19;;14616:366;;;:::o;14988:::-;15130:3;15151:67;15215:2;15210:3;15151:67;:::i;:::-;15144:74;;15227:93;15316:3;15227:93;:::i;:::-;15345:2;15340:3;15336:12;15329:19;;14988:366;;;:::o;15360:::-;15502:3;15523:67;15587:2;15582:3;15523:67;:::i;:::-;15516:74;;15599:93;15688:3;15599:93;:::i;:::-;15717:2;15712:3;15708:12;15701:19;;15360:366;;;:::o;15732:::-;15874:3;15895:67;15959:2;15954:3;15895:67;:::i;:::-;15888:74;;15971:93;16060:3;15971:93;:::i;:::-;16089:2;16084:3;16080:12;16073:19;;15732:366;;;:::o;16104:::-;16246:3;16267:67;16331:2;16326:3;16267:67;:::i;:::-;16260:74;;16343:93;16432:3;16343:93;:::i;:::-;16461:2;16456:3;16452:12;16445:19;;16104:366;;;:::o;16476:::-;16618:3;16639:67;16703:2;16698:3;16639:67;:::i;:::-;16632:74;;16715:93;16804:3;16715:93;:::i;:::-;16833:2;16828:3;16824:12;16817:19;;16476:366;;;:::o;16848:::-;16990:3;17011:67;17075:2;17070:3;17011:67;:::i;:::-;17004:74;;17087:93;17176:3;17087:93;:::i;:::-;17205:2;17200:3;17196:12;17189:19;;16848:366;;;:::o;17220:::-;17362:3;17383:67;17447:2;17442:3;17383:67;:::i;:::-;17376:74;;17459:93;17548:3;17459:93;:::i;:::-;17577:2;17572:3;17568:12;17561:19;;17220:366;;;:::o;17592:::-;17734:3;17755:67;17819:2;17814:3;17755:67;:::i;:::-;17748:74;;17831:93;17920:3;17831:93;:::i;:::-;17949:2;17944:3;17940:12;17933:19;;17592:366;;;:::o;17964:::-;18106:3;18127:67;18191:2;18186:3;18127:67;:::i;:::-;18120:74;;18203:93;18292:3;18203:93;:::i;:::-;18321:2;18316:3;18312:12;18305:19;;17964:366;;;:::o;18336:::-;18478:3;18499:67;18563:2;18558:3;18499:67;:::i;:::-;18492:74;;18575:93;18664:3;18575:93;:::i;:::-;18693:2;18688:3;18684:12;18677:19;;18336:366;;;:::o;18708:::-;18850:3;18871:67;18935:2;18930:3;18871:67;:::i;:::-;18864:74;;18947:93;19036:3;18947:93;:::i;:::-;19065:2;19060:3;19056:12;19049:19;;18708:366;;;:::o;19080:::-;19222:3;19243:67;19307:2;19302:3;19243:67;:::i;:::-;19236:74;;19319:93;19408:3;19319:93;:::i;:::-;19437:2;19432:3;19428:12;19421:19;;19080:366;;;:::o;19452:::-;19594:3;19615:67;19679:2;19674:3;19615:67;:::i;:::-;19608:74;;19691:93;19780:3;19691:93;:::i;:::-;19809:2;19804:3;19800:12;19793:19;;19452:366;;;:::o;19824:::-;19966:3;19987:67;20051:2;20046:3;19987:67;:::i;:::-;19980:74;;20063:93;20152:3;20063:93;:::i;:::-;20181:2;20176:3;20172:12;20165:19;;19824:366;;;:::o;20196:::-;20338:3;20359:67;20423:2;20418:3;20359:67;:::i;:::-;20352:74;;20435:93;20524:3;20435:93;:::i;:::-;20553:2;20548:3;20544:12;20537:19;;20196:366;;;:::o;20568:::-;20710:3;20731:67;20795:2;20790:3;20731:67;:::i;:::-;20724:74;;20807:93;20896:3;20807:93;:::i;:::-;20925:2;20920:3;20916:12;20909:19;;20568:366;;;:::o;20940:::-;21082:3;21103:67;21167:2;21162:3;21103:67;:::i;:::-;21096:74;;21179:93;21268:3;21179:93;:::i;:::-;21297:2;21292:3;21288:12;21281:19;;20940:366;;;:::o;21312:::-;21454:3;21475:67;21539:2;21534:3;21475:67;:::i;:::-;21468:74;;21551:93;21640:3;21551:93;:::i;:::-;21669:2;21664:3;21660:12;21653:19;;21312:366;;;:::o;21684:::-;21826:3;21847:67;21911:2;21906:3;21847:67;:::i;:::-;21840:74;;21923:93;22012:3;21923:93;:::i;:::-;22041:2;22036:3;22032:12;22025:19;;21684:366;;;:::o;22056:::-;22198:3;22219:67;22283:2;22278:3;22219:67;:::i;:::-;22212:74;;22295:93;22384:3;22295:93;:::i;:::-;22413:2;22408:3;22404:12;22397:19;;22056:366;;;:::o;22428:::-;22570:3;22591:67;22655:2;22650:3;22591:67;:::i;:::-;22584:74;;22667:93;22756:3;22667:93;:::i;:::-;22785:2;22780:3;22776:12;22769:19;;22428:366;;;:::o;22800:::-;22942:3;22963:67;23027:2;23022:3;22963:67;:::i;:::-;22956:74;;23039:93;23128:3;23039:93;:::i;:::-;23157:2;23152:3;23148:12;23141:19;;22800:366;;;:::o;23172:::-;23314:3;23335:67;23399:2;23394:3;23335:67;:::i;:::-;23328:74;;23411:93;23500:3;23411:93;:::i;:::-;23529:2;23524:3;23520:12;23513:19;;23172:366;;;:::o;23544:::-;23686:3;23707:67;23771:2;23766:3;23707:67;:::i;:::-;23700:74;;23783:93;23872:3;23783:93;:::i;:::-;23901:2;23896:3;23892:12;23885:19;;23544:366;;;:::o;23916:108::-;23993:24;24011:5;23993:24;:::i;:::-;23988:3;23981:37;23916:108;;:::o;24030:118::-;24117:24;24135:5;24117:24;:::i;:::-;24112:3;24105:37;24030:118;;:::o;24154:157::-;24259:45;24279:24;24297:5;24279:24;:::i;:::-;24259:45;:::i;:::-;24254:3;24247:58;24154:157;;:::o;24317:112::-;24400:22;24416:5;24400:22;:::i;:::-;24395:3;24388:35;24317:112;;:::o;24435:435::-;24615:3;24637:95;24728:3;24719:6;24637:95;:::i;:::-;24630:102;;24749:95;24840:3;24831:6;24749:95;:::i;:::-;24742:102;;24861:3;24854:10;;24435:435;;;;;:::o;24876:522::-;25089:3;25111:148;25255:3;25111:148;:::i;:::-;25104:155;;25269:75;25340:3;25331:6;25269:75;:::i;:::-;25369:2;25364:3;25360:12;25353:19;;25389:3;25382:10;;24876:522;;;;:::o;25404:397::-;25544:3;25559:75;25630:3;25621:6;25559:75;:::i;:::-;25659:2;25654:3;25650:12;25643:19;;25672:75;25743:3;25734:6;25672:75;:::i;:::-;25772:2;25767:3;25763:12;25756:19;;25792:3;25785:10;;25404:397;;;;;:::o;25807:222::-;25900:4;25938:2;25927:9;25923:18;25915:26;;25951:71;26019:1;26008:9;26004:17;25995:6;25951:71;:::i;:::-;25807:222;;;;:::o;26035:640::-;26230:4;26268:3;26257:9;26253:19;26245:27;;26282:71;26350:1;26339:9;26335:17;26326:6;26282:71;:::i;:::-;26363:72;26431:2;26420:9;26416:18;26407:6;26363:72;:::i;:::-;26445;26513:2;26502:9;26498:18;26489:6;26445:72;:::i;:::-;26564:9;26558:4;26554:20;26549:2;26538:9;26534:18;26527:48;26592:76;26663:4;26654:6;26592:76;:::i;:::-;26584:84;;26035:640;;;;;;;:::o;26681:332::-;26802:4;26840:2;26829:9;26825:18;26817:26;;26853:71;26921:1;26910:9;26906:17;26897:6;26853:71;:::i;:::-;26934:72;27002:2;26991:9;26987:18;26978:6;26934:72;:::i;:::-;26681:332;;;;;:::o;27019:373::-;27162:4;27200:2;27189:9;27185:18;27177:26;;27249:9;27243:4;27239:20;27235:1;27224:9;27220:17;27213:47;27277:108;27380:4;27371:6;27277:108;:::i;:::-;27269:116;;27019:373;;;;:::o;27398:210::-;27485:4;27523:2;27512:9;27508:18;27500:26;;27536:65;27598:1;27587:9;27583:17;27574:6;27536:65;:::i;:::-;27398:210;;;;:::o;27614:545::-;27787:4;27825:3;27814:9;27810:19;27802:27;;27839:71;27907:1;27896:9;27892:17;27883:6;27839:71;:::i;:::-;27920:68;27984:2;27973:9;27969:18;27960:6;27920:68;:::i;:::-;27998:72;28066:2;28055:9;28051:18;28042:6;27998:72;:::i;:::-;28080;28148:2;28137:9;28133:18;28124:6;28080:72;:::i;:::-;27614:545;;;;;;;:::o;28165:313::-;28278:4;28316:2;28305:9;28301:18;28293:26;;28365:9;28359:4;28355:20;28351:1;28340:9;28336:17;28329:47;28393:78;28466:4;28457:6;28393:78;:::i;:::-;28385:86;;28165:313;;;;:::o;28484:419::-;28650:4;28688:2;28677:9;28673:18;28665:26;;28737:9;28731:4;28727:20;28723:1;28712:9;28708:17;28701:47;28765:131;28891:4;28765:131;:::i;:::-;28757:139;;28484:419;;;:::o;28909:::-;29075:4;29113:2;29102:9;29098:18;29090:26;;29162:9;29156:4;29152:20;29148:1;29137:9;29133:17;29126:47;29190:131;29316:4;29190:131;:::i;:::-;29182:139;;28909:419;;;:::o;29334:::-;29500:4;29538:2;29527:9;29523:18;29515:26;;29587:9;29581:4;29577:20;29573:1;29562:9;29558:17;29551:47;29615:131;29741:4;29615:131;:::i;:::-;29607:139;;29334:419;;;:::o;29759:::-;29925:4;29963:2;29952:9;29948:18;29940:26;;30012:9;30006:4;30002:20;29998:1;29987:9;29983:17;29976:47;30040:131;30166:4;30040:131;:::i;:::-;30032:139;;29759:419;;;:::o;30184:::-;30350:4;30388:2;30377:9;30373:18;30365:26;;30437:9;30431:4;30427:20;30423:1;30412:9;30408:17;30401:47;30465:131;30591:4;30465:131;:::i;:::-;30457:139;;30184:419;;;:::o;30609:::-;30775:4;30813:2;30802:9;30798:18;30790:26;;30862:9;30856:4;30852:20;30848:1;30837:9;30833:17;30826:47;30890:131;31016:4;30890:131;:::i;:::-;30882:139;;30609:419;;;:::o;31034:::-;31200:4;31238:2;31227:9;31223:18;31215:26;;31287:9;31281:4;31277:20;31273:1;31262:9;31258:17;31251:47;31315:131;31441:4;31315:131;:::i;:::-;31307:139;;31034:419;;;:::o;31459:::-;31625:4;31663:2;31652:9;31648:18;31640:26;;31712:9;31706:4;31702:20;31698:1;31687:9;31683:17;31676:47;31740:131;31866:4;31740:131;:::i;:::-;31732:139;;31459:419;;;:::o;31884:::-;32050:4;32088:2;32077:9;32073:18;32065:26;;32137:9;32131:4;32127:20;32123:1;32112:9;32108:17;32101:47;32165:131;32291:4;32165:131;:::i;:::-;32157:139;;31884:419;;;:::o;32309:::-;32475:4;32513:2;32502:9;32498:18;32490:26;;32562:9;32556:4;32552:20;32548:1;32537:9;32533:17;32526:47;32590:131;32716:4;32590:131;:::i;:::-;32582:139;;32309:419;;;:::o;32734:::-;32900:4;32938:2;32927:9;32923:18;32915:26;;32987:9;32981:4;32977:20;32973:1;32962:9;32958:17;32951:47;33015:131;33141:4;33015:131;:::i;:::-;33007:139;;32734:419;;;:::o;33159:::-;33325:4;33363:2;33352:9;33348:18;33340:26;;33412:9;33406:4;33402:20;33398:1;33387:9;33383:17;33376:47;33440:131;33566:4;33440:131;:::i;:::-;33432:139;;33159:419;;;:::o;33584:::-;33750:4;33788:2;33777:9;33773:18;33765:26;;33837:9;33831:4;33827:20;33823:1;33812:9;33808:17;33801:47;33865:131;33991:4;33865:131;:::i;:::-;33857:139;;33584:419;;;:::o;34009:::-;34175:4;34213:2;34202:9;34198:18;34190:26;;34262:9;34256:4;34252:20;34248:1;34237:9;34233:17;34226:47;34290:131;34416:4;34290:131;:::i;:::-;34282:139;;34009:419;;;:::o;34434:::-;34600:4;34638:2;34627:9;34623:18;34615:26;;34687:9;34681:4;34677:20;34673:1;34662:9;34658:17;34651:47;34715:131;34841:4;34715:131;:::i;:::-;34707:139;;34434:419;;;:::o;34859:::-;35025:4;35063:2;35052:9;35048:18;35040:26;;35112:9;35106:4;35102:20;35098:1;35087:9;35083:17;35076:47;35140:131;35266:4;35140:131;:::i;:::-;35132:139;;34859:419;;;:::o;35284:::-;35450:4;35488:2;35477:9;35473:18;35465:26;;35537:9;35531:4;35527:20;35523:1;35512:9;35508:17;35501:47;35565:131;35691:4;35565:131;:::i;:::-;35557:139;;35284:419;;;:::o;35709:::-;35875:4;35913:2;35902:9;35898:18;35890:26;;35962:9;35956:4;35952:20;35948:1;35937:9;35933:17;35926:47;35990:131;36116:4;35990:131;:::i;:::-;35982:139;;35709:419;;;:::o;36134:::-;36300:4;36338:2;36327:9;36323:18;36315:26;;36387:9;36381:4;36377:20;36373:1;36362:9;36358:17;36351:47;36415:131;36541:4;36415:131;:::i;:::-;36407:139;;36134:419;;;:::o;36559:::-;36725:4;36763:2;36752:9;36748:18;36740:26;;36812:9;36806:4;36802:20;36798:1;36787:9;36783:17;36776:47;36840:131;36966:4;36840:131;:::i;:::-;36832:139;;36559:419;;;:::o;36984:::-;37150:4;37188:2;37177:9;37173:18;37165:26;;37237:9;37231:4;37227:20;37223:1;37212:9;37208:17;37201:47;37265:131;37391:4;37265:131;:::i;:::-;37257:139;;36984:419;;;:::o;37409:::-;37575:4;37613:2;37602:9;37598:18;37590:26;;37662:9;37656:4;37652:20;37648:1;37637:9;37633:17;37626:47;37690:131;37816:4;37690:131;:::i;:::-;37682:139;;37409:419;;;:::o;37834:::-;38000:4;38038:2;38027:9;38023:18;38015:26;;38087:9;38081:4;38077:20;38073:1;38062:9;38058:17;38051:47;38115:131;38241:4;38115:131;:::i;:::-;38107:139;;37834:419;;;:::o;38259:::-;38425:4;38463:2;38452:9;38448:18;38440:26;;38512:9;38506:4;38502:20;38498:1;38487:9;38483:17;38476:47;38540:131;38666:4;38540:131;:::i;:::-;38532:139;;38259:419;;;:::o;38684:::-;38850:4;38888:2;38877:9;38873:18;38865:26;;38937:9;38931:4;38927:20;38923:1;38912:9;38908:17;38901:47;38965:131;39091:4;38965:131;:::i;:::-;38957:139;;38684:419;;;:::o;39109:::-;39275:4;39313:2;39302:9;39298:18;39290:26;;39362:9;39356:4;39352:20;39348:1;39337:9;39333:17;39326:47;39390:131;39516:4;39390:131;:::i;:::-;39382:139;;39109:419;;;:::o;39534:::-;39700:4;39738:2;39727:9;39723:18;39715:26;;39787:9;39781:4;39777:20;39773:1;39762:9;39758:17;39751:47;39815:131;39941:4;39815:131;:::i;:::-;39807:139;;39534:419;;;:::o;39959:::-;40125:4;40163:2;40152:9;40148:18;40140:26;;40212:9;40206:4;40202:20;40198:1;40187:9;40183:17;40176:47;40240:131;40366:4;40240:131;:::i;:::-;40232:139;;39959:419;;;:::o;40384:::-;40550:4;40588:2;40577:9;40573:18;40565:26;;40637:9;40631:4;40627:20;40623:1;40612:9;40608:17;40601:47;40665:131;40791:4;40665:131;:::i;:::-;40657:139;;40384:419;;;:::o;40809:::-;40975:4;41013:2;41002:9;40998:18;40990:26;;41062:9;41056:4;41052:20;41048:1;41037:9;41033:17;41026:47;41090:131;41216:4;41090:131;:::i;:::-;41082:139;;40809:419;;;:::o;41234:::-;41400:4;41438:2;41427:9;41423:18;41415:26;;41487:9;41481:4;41477:20;41473:1;41462:9;41458:17;41451:47;41515:131;41641:4;41515:131;:::i;:::-;41507:139;;41234:419;;;:::o;41659:222::-;41752:4;41790:2;41779:9;41775:18;41767:26;;41803:71;41871:1;41860:9;41856:17;41847:6;41803:71;:::i;:::-;41659:222;;;;:::o;41887:129::-;41921:6;41948:20;;:::i;:::-;41938:30;;41977:33;42005:4;41997:6;41977:33;:::i;:::-;41887:129;;;:::o;42022:75::-;42055:6;42088:2;42082:9;42072:19;;42022:75;:::o;42103:307::-;42164:4;42254:18;42246:6;42243:30;42240:56;;;42276:18;;:::i;:::-;42240:56;42314:29;42336:6;42314:29;:::i;:::-;42306:37;;42398:4;42392;42388:15;42380:23;;42103:307;;;:::o;42416:308::-;42478:4;42568:18;42560:6;42557:30;42554:56;;;42590:18;;:::i;:::-;42554:56;42628:29;42650:6;42628:29;:::i;:::-;42620:37;;42712:4;42706;42702:15;42694:23;;42416:308;;;:::o;42730:132::-;42797:4;42820:3;42812:11;;42850:4;42845:3;42841:14;42833:22;;42730:132;;;:::o;42868:114::-;42935:6;42969:5;42963:12;42953:22;;42868:114;;;:::o;42988:98::-;43039:6;43073:5;43067:12;43057:22;;42988:98;;;:::o;43092:99::-;43144:6;43178:5;43172:12;43162:22;;43092:99;;;:::o;43197:113::-;43267:4;43299;43294:3;43290:14;43282:22;;43197:113;;;:::o;43316:184::-;43415:11;43449:6;43444:3;43437:19;43489:4;43484:3;43480:14;43465:29;;43316:184;;;;:::o;43506:168::-;43589:11;43623:6;43618:3;43611:19;43663:4;43658:3;43654:14;43639:29;;43506:168;;;;:::o;43680:169::-;43764:11;43798:6;43793:3;43786:19;43838:4;43833:3;43829:14;43814:29;;43680:169;;;;:::o;43855:148::-;43957:11;43994:3;43979:18;;43855:148;;;;:::o;44009:305::-;44049:3;44068:20;44086:1;44068:20;:::i;:::-;44063:25;;44102:20;44120:1;44102:20;:::i;:::-;44097:25;;44256:1;44188:66;44184:74;44181:1;44178:81;44175:107;;;44262:18;;:::i;:::-;44175:107;44306:1;44303;44299:9;44292:16;;44009:305;;;;:::o;44320:185::-;44360:1;44377:20;44395:1;44377:20;:::i;:::-;44372:25;;44411:20;44429:1;44411:20;:::i;:::-;44406:25;;44450:1;44440:35;;44455:18;;:::i;:::-;44440:35;44497:1;44494;44490:9;44485:14;;44320:185;;;;:::o;44511:348::-;44551:7;44574:20;44592:1;44574:20;:::i;:::-;44569:25;;44608:20;44626:1;44608:20;:::i;:::-;44603:25;;44796:1;44728:66;44724:74;44721:1;44718:81;44713:1;44706:9;44699:17;44695:105;44692:131;;;44803:18;;:::i;:::-;44692:131;44851:1;44848;44844:9;44833:20;;44511:348;;;;:::o;44865:191::-;44905:4;44925:20;44943:1;44925:20;:::i;:::-;44920:25;;44959:20;44977:1;44959:20;:::i;:::-;44954:25;;44998:1;44995;44992:8;44989:34;;;45003:18;;:::i;:::-;44989:34;45048:1;45045;45041:9;45033:17;;44865:191;;;;:::o;45062:96::-;45099:7;45128:24;45146:5;45128:24;:::i;:::-;45117:35;;45062:96;;;:::o;45164:90::-;45198:7;45241:5;45234:13;45227:21;45216:32;;45164:90;;;:::o;45260:77::-;45297:7;45326:5;45315:16;;45260:77;;;:::o;45343:149::-;45379:7;45419:66;45412:5;45408:78;45397:89;;45343:149;;;:::o;45498:126::-;45535:7;45575:42;45568:5;45564:54;45553:65;;45498:126;;;:::o;45630:77::-;45667:7;45696:5;45685:16;;45630:77;;;:::o;45713:86::-;45748:7;45788:4;45781:5;45777:16;45766:27;;45713:86;;;:::o;45805:154::-;45889:6;45884:3;45879;45866:30;45951:1;45942:6;45937:3;45933:16;45926:27;45805:154;;;:::o;45965:307::-;46033:1;46043:113;46057:6;46054:1;46051:13;46043:113;;;46142:1;46137:3;46133:11;46127:18;46123:1;46118:3;46114:11;46107:39;46079:2;46076:1;46072:10;46067:15;;46043:113;;;46174:6;46171:1;46168:13;46165:101;;;46254:1;46245:6;46240:3;46236:16;46229:27;46165:101;46014:258;45965:307;;;:::o;46278:320::-;46322:6;46359:1;46353:4;46349:12;46339:22;;46406:1;46400:4;46396:12;46427:18;46417:81;;46483:4;46475:6;46471:17;46461:27;;46417:81;46545:2;46537:6;46534:14;46514:18;46511:38;46508:84;;;46564:18;;:::i;:::-;46508:84;46329:269;46278:320;;;:::o;46604:281::-;46687:27;46709:4;46687:27;:::i;:::-;46679:6;46675:40;46817:6;46805:10;46802:22;46781:18;46769:10;46766:34;46763:62;46760:88;;;46828:18;;:::i;:::-;46760:88;46868:10;46864:2;46857:22;46647:238;46604:281;;:::o;46891:233::-;46930:3;46953:24;46971:5;46953:24;:::i;:::-;46944:33;;46999:66;46992:5;46989:77;46986:103;;;47069:18;;:::i;:::-;46986:103;47116:1;47109:5;47105:13;47098:20;;46891:233;;;:::o;47130:100::-;47169:7;47198:26;47218:5;47198:26;:::i;:::-;47187:37;;47130:100;;;:::o;47236:79::-;47275:7;47304:5;47293:16;;47236:79;;;:::o;47321:94::-;47360:7;47389:20;47403:5;47389:20;:::i;:::-;47378:31;;47321:94;;;:::o;47421:79::-;47460:7;47489:5;47478:16;;47421:79;;;:::o;47506:176::-;47538:1;47555:20;47573:1;47555:20;:::i;:::-;47550:25;;47589:20;47607:1;47589:20;:::i;:::-;47584:25;;47628:1;47618:35;;47633:18;;:::i;:::-;47618:35;47674:1;47671;47667:9;47662:14;;47506:176;;;;:::o;47688:180::-;47736:77;47733:1;47726:88;47833:4;47830:1;47823:15;47857:4;47854:1;47847:15;47874:180;47922:77;47919:1;47912:88;48019:4;48016:1;48009:15;48043:4;48040:1;48033:15;48060:180;48108:77;48105:1;48098:88;48205:4;48202:1;48195:15;48229:4;48226:1;48219:15;48246:180;48294:77;48291:1;48284:88;48391:4;48388:1;48381:15;48415:4;48412:1;48405:15;48432:180;48480:77;48477:1;48470:88;48577:4;48574:1;48567:15;48601:4;48598:1;48591:15;48618:180;48666:77;48663:1;48656:88;48763:4;48760:1;48753:15;48787:4;48784:1;48777:15;48804:180;48852:77;48849:1;48842:88;48949:4;48946:1;48939:15;48973:4;48970:1;48963:15;48990:117;49099:1;49096;49089:12;49113:117;49222:1;49219;49212:12;49236:117;49345:1;49342;49335:12;49359:117;49468:1;49465;49458:12;49482:117;49591:1;49588;49581:12;49605:117;49714:1;49711;49704:12;49728:102;49769:6;49820:2;49816:7;49811:2;49804:5;49800:14;49796:28;49786:38;;49728:102;;;:::o;49836:94::-;49869:8;49917:5;49913:2;49909:14;49888:35;;49836:94;;;:::o;49936:174::-;50076:26;50072:1;50064:6;50060:14;50053:50;49936:174;:::o;50116:172::-;50256:24;50252:1;50244:6;50240:14;50233:48;50116:172;:::o;50294:156::-;50434:8;50430:1;50422:6;50418:14;50411:32;50294:156;:::o;50456:181::-;50596:33;50592:1;50584:6;50580:14;50573:57;50456:181;:::o;50643:214::-;50783:66;50779:1;50771:6;50767:14;50760:90;50643:214;:::o;50863:230::-;51003:34;50999:1;50991:6;50987:14;50980:58;51072:13;51067:2;51059:6;51055:15;51048:38;50863:230;:::o;51099:161::-;51239:13;51235:1;51227:6;51223:14;51216:37;51099:161;:::o;51266:237::-;51406:34;51402:1;51394:6;51390:14;51383:58;51475:20;51470:2;51462:6;51458:15;51451:45;51266:237;:::o;51509:225::-;51649:34;51645:1;51637:6;51633:14;51626:58;51718:8;51713:2;51705:6;51701:15;51694:33;51509:225;:::o;51740:224::-;51880:34;51876:1;51868:6;51864:14;51857:58;51949:7;51944:2;51936:6;51932:15;51925:32;51740:224;:::o;51970:178::-;52110:30;52106:1;52098:6;52094:14;52087:54;51970:178;:::o;52154:223::-;52294:34;52290:1;52282:6;52278:14;52271:58;52363:6;52358:2;52350:6;52346:15;52339:31;52154:223;:::o;52383:175::-;52523:27;52519:1;52511:6;52507:14;52500:51;52383:175;:::o;52564:161::-;52704:13;52700:1;52692:6;52688:14;52681:37;52564:161;:::o;52731:221::-;52871:34;52867:1;52859:6;52855:14;52848:58;52940:4;52935:2;52927:6;52923:15;52916:29;52731:221;:::o;52958:231::-;53098:34;53094:1;53086:6;53082:14;53075:58;53167:14;53162:2;53154:6;53150:15;53143:39;52958:231;:::o;53195:162::-;53335:14;53331:1;53323:6;53319:14;53312:38;53195:162;:::o;53363:243::-;53503:34;53499:1;53491:6;53487:14;53480:58;53572:26;53567:2;53559:6;53555:15;53548:51;53363:243;:::o;53612:167::-;53752:19;53748:1;53740:6;53736:14;53729:43;53612:167;:::o;53785:229::-;53925:34;53921:1;53913:6;53909:14;53902:58;53994:12;53989:2;53981:6;53977:15;53970:37;53785:229;:::o;54020:228::-;54160:34;54156:1;54148:6;54144:14;54137:58;54229:11;54224:2;54216:6;54212:15;54205:36;54020:228;:::o;54254:172::-;54394:24;54390:1;54382:6;54378:14;54371:48;54254:172;:::o;54432:221::-;54572:34;54568:1;54560:6;54556:14;54549:58;54641:4;54636:2;54628:6;54624:15;54617:29;54432:221;:::o;54659:182::-;54799:34;54795:1;54787:6;54783:14;54776:58;54659:182;:::o;54847:231::-;54987:34;54983:1;54975:6;54971:14;54964:58;55056:14;55051:2;55043:6;55039:15;55032:39;54847:231;:::o;55084:182::-;55224:34;55220:1;55212:6;55208:14;55201:58;55084:182;:::o;55272:220::-;55412:34;55408:1;55400:6;55396:14;55389:58;55481:3;55476:2;55468:6;55464:15;55457:28;55272:220;:::o;55498:168::-;55638:20;55634:1;55626:6;55622:14;55615:44;55498:168;:::o;55672:236::-;55812:34;55808:1;55800:6;55796:14;55789:58;55881:19;55876:2;55868:6;55864:15;55857:44;55672:236;:::o;55914:231::-;56054:34;56050:1;56042:6;56038:14;56031:58;56123:14;56118:2;56110:6;56106:15;56099:39;55914:231;:::o;56151:181::-;56291:33;56287:1;56279:6;56275:14;56268:57;56151:181;:::o;56338:161::-;56478:13;56474:1;56466:6;56462:14;56455:37;56338:161;:::o;56505:122::-;56578:24;56596:5;56578:24;:::i;:::-;56571:5;56568:35;56558:63;;56617:1;56614;56607:12;56558:63;56505:122;:::o;56633:116::-;56703:21;56718:5;56703:21;:::i;:::-;56696:5;56693:32;56683:60;;56739:1;56736;56729:12;56683:60;56633:116;:::o;56755:120::-;56827:23;56844:5;56827:23;:::i;:::-;56820:5;56817:34;56807:62;;56865:1;56862;56855:12;56807:62;56755:120;:::o;56881:122::-;56954:24;56972:5;56954:24;:::i;:::-;56947:5;56944:35;56934:63;;56993:1;56990;56983:12;56934:63;56881:122;:::o

Swarm Source

ipfs://f1c275e0a20c34c7293f0d3341d5a60cb285442f1874822f808c91708df84b95
Loading...
Loading
Loading...
Loading
[ 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.