ETH Price: $3,338.28 (-0.32%)
 

Overview

Max Total Supply

303 NGC

Holders

48

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 NGC
0x86ec789493deae15dfef1e6e305c46c7583acd8f
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:
NGC

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-29
*/

// 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: erc721a/contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;









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

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

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

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
    }

    // Compiler will pack the following 
    // _currentIndex and _burnCounter into a single 256bit word.
    
    // The tokenId of the next token to be minted.
    uint128 internal _currentIndex;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex times
        unchecked {
            return _currentIndex - _burnCounter;    
        }
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (!ownership.burned) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }
        revert TokenIndexOutOfBounds();
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds();
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        // Execution should never reach this point.
        revert();
    }

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

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

    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
                updatedIndex++;
            }

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

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

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

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

    /**
     * @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 {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

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

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

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

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

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

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

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

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

// File: contracts/NGC.sol


pragma solidity ^0.8.2;





contract NGC is ERC721A, Ownable, ReentrancyGuard  {

    using ECDSA for bytes32;

    // Claim Signer address for wallet lists
    address private _claimSignerAddress;

    // VIP Mint Signer address for wallet lists
    address private _presaleSignerAddress;

    // Claim Active
    bool public isClaimActive;

    // Presale Active
    bool public isPreSaleActive;

    // Sale Active
    bool public isSaleActive;

    // Price
    uint256 public price;

    // Max Amount
    uint256 public immutable maxAmount;

    // Base URI
    string private baseURI;

    // Tracks redeem for sale
    mapping(address => uint256) private claimRedeemedCount;

    // Tracks redeem for vip sale
    mapping(address => uint256) private presaleRedeemedCount;

    // Tracks redeem for sale
    mapping(address => uint256) private saleRedeemedCount;

    // Max per wallet for sale
    uint256 private immutable saleMaxPerWallet;

    constructor(
        uint256 price_,
        uint256 maxAmount_
    )
        ERC721A("Nullom Genesis Collection", "NGC")
    {
        price = price_;
        maxAmount = maxAmount_;
        saleMaxPerWallet = 3;
        isClaimActive = false;
        isPreSaleActive = false;
        isSaleActive = false;
    }

    // Claim free NGC tokens for DTP Hodlers
    function claim(uint256 quantityAllowed, bytes calldata signature, bytes calldata quantityAllowedSignature, uint256 quantity) external {
        require(isClaimActive, "Claim Not Active");
        require(_claimSignerAddress == keccak256(
            abi.encodePacked(
                "\x19Ethereum Signed Message:\n32",
                bytes32(uint256(uint160(msg.sender)))
            )
        ).recover(signature), "Wallet Address not on claim list.");

        require(_claimSignerAddress == keccak256(
            abi.encodePacked(
                "\x19Ethereum Signed Message:\n32",
                quantityAllowed
            )
        ).recover(quantityAllowedSignature), "Incorrect Claim limit for Wallet.");

        require(
            quantityAllowed >= claimRedeemedCount[_msgSender()] + quantity,
            "Exceeded Max Claim"
        );

        claimRedeemedCount[_msgSender()] = claimRedeemedCount[_msgSender()] + quantity;

        _mintToken(_msgSender(), quantity);
    }

    // Presale wildlist mint
    function presale(uint256 quantityAllowed, bytes calldata signature, bytes calldata quantityAllowedSignature, uint256 quantity) external payable {
        require(isPreSaleActive, "Presale Not Active");
        require(msg.value == price * quantity, "Incorrect Value");
        require(_presaleSignerAddress == keccak256(
            abi.encodePacked(
                "\x19Ethereum Signed Message:\n32",
                bytes32(uint256(uint160(msg.sender)))
            )
        ).recover(signature), "Wallet address not on Wildlist.");

        require(_presaleSignerAddress == keccak256(
            abi.encodePacked(
                "\x19Ethereum Signed Message:\n32",
                quantityAllowed
            )
        ).recover(quantityAllowedSignature), "Incorrect Wildlist limit for Wallet.");

        require(
            quantityAllowed >= presaleRedeemedCount[_msgSender()] + quantity,
            "Exceeded Max Claim"
        );

        presaleRedeemedCount[_msgSender()] = presaleRedeemedCount[_msgSender()] + quantity;

        _mintToken(_msgSender(), quantity);
    }


    // Regular mint
    function mint(uint256 quantity) external payable {
        require(isSaleActive, "Sale Not Active");
        require(msg.value == price * quantity, "Incorrect Value");
        require(
            saleMaxPerWallet >= saleRedeemedCount[_msgSender()] + quantity,
            "Max Minted"
        );

        saleRedeemedCount[_msgSender()] = saleRedeemedCount[_msgSender()] + quantity;

        _mintToken(_msgSender(), quantity);
    }

    // Fiat mint using winter
    function winterMint(address recipient, uint256 quantity) external payable {
        require(isSaleActive, "Sale Not Active");
        require(msg.value == price * quantity, "Incorrect Value");

        _mintToken(recipient, quantity);
    }

    function isEligiblePresale(
        uint256 quantityAllowed,
        bytes calldata signature,
        bytes calldata quantityAllowedSignature,
        address address_
    ) external view returns (bool)
    {
        return
         _presaleSignerAddress == keccak256(
            abi.encodePacked(
                "\x19Ethereum Signed Message:\n32",
                bytes32(uint256(uint160(address_)))
            )
        ).recover(signature) 
        
        &&

        _presaleSignerAddress == keccak256(
            abi.encodePacked(
                "\x19Ethereum Signed Message:\n32",
                quantityAllowed
            )
        ).recover(quantityAllowedSignature);
    }

    function isEligibleClaim(
        uint256 quantityAllowed,
        bytes calldata signature,
        bytes calldata quantityAllowedSignature,
        address address_
    ) external view returns (bool) {
        return
        _claimSignerAddress == keccak256(
            abi.encodePacked(
                "\x19Ethereum Signed Message:\n32",
                bytes32(uint256(uint160(address_)))
            )
        ).recover(signature) 
        
        &&

        _claimSignerAddress == keccak256(
            abi.encodePacked(
                "\x19Ethereum Signed Message:\n32",
                quantityAllowed
            )
        ).recover(quantityAllowedSignature);
    }

    function getClaimedByAddress(address address_) external view returns (uint256) {
        return claimRedeemedCount[address_];
    }

    function getBoughtPresaleByAddress(address address_) external view returns (uint256) {
        return presaleRedeemedCount[address_];
    }

    function setBaseURI(string memory baseURI_) external onlyOwner {
        baseURI = baseURI_;
    }

    function setPrice(uint256 price_) external onlyOwner {
        price = price_;
    }

    function setClaimSignerAddress(address signerAddress) external onlyOwner {
        _claimSignerAddress = signerAddress;
    }

    function setPresaleSignerAddress(address signerAddress) external onlyOwner {
        _presaleSignerAddress = signerAddress;
    }

    function toggleClaimActive() external onlyOwner {
        isClaimActive = !isClaimActive;
    }

    function toggleVIPSaleActive() external onlyOwner {
        isPreSaleActive = !isPreSaleActive;
    }

    function toggleSaleActive() external onlyOwner {
        isSaleActive = !isSaleActive;
    }

    function ownerMint(address to, uint256 quantity) external onlyOwner {
        require(to != address(0), "Cannot Send To Zero Address");
        _mintToken(to, quantity);
    }

    function _mintToken(address to, uint256 quantity) internal {
        require(quantity + totalSupply() <= maxAmount, "Exceeded Max");

        _safeMint(to, quantity);
    }

    function withdraw() external onlyOwner nonReentrant {
        (bool success,) = msg.sender.call{value : address(this).balance}("");
        require(success, "Transfer failed.");
    }   

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

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"},{"internalType":"uint256","name":"maxAmount_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantityAllowed","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"quantityAllowedSignature","type":"bytes"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"getBoughtPresaleByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"getClaimedByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"isClaimActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantityAllowed","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"quantityAllowedSignature","type":"bytes"},{"internalType":"address","name":"address_","type":"address"}],"name":"isEligibleClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantityAllowed","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"quantityAllowedSignature","type":"bytes"},{"internalType":"address","name":"address_","type":"address"}],"name":"isEligiblePresale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPreSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantityAllowed","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"quantityAllowedSignature","type":"bytes"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"presale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signerAddress","type":"address"}],"name":"setClaimSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signerAddress","type":"address"}],"name":"setPresaleSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleClaimActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleVIPSaleActive","outputs":[],"stateMutability":"nonpayable","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":"recipient","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"winterMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040523480156200001157600080fd5b5060405162005f5838038062005f58833981810160405281019062000037919062000305565b6040518060400160405280601981526020017f4e756c6c6f6d2047656e6573697320436f6c6c656374696f6e000000000000008152506040518060400160405280600381526020017f4e474300000000000000000000000000000000000000000000000000000000008152508160019080519060200190620000bb9291906200023e565b508060029080519060200190620000d49291906200023e565b505050620000f7620000eb6200017060201b60201c565b6200017860201b60201c565b600160088190555081600b819055508060808181525050600360a081815250506000600a60146101000a81548160ff0219169083151502179055506000600a60156101000a81548160ff0219169083151502179055506000600a60166101000a81548160ff0219169083151502179055505050620003da565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200024c9062000356565b90600052602060002090601f016020900481019282620002705760008555620002bc565b82601f106200028b57805160ff1916838001178555620002bc565b82800160010185558215620002bc579182015b82811115620002bb5782518255916020019190600101906200029e565b5b509050620002cb9190620002cf565b5090565b5b80821115620002ea576000816000905550600101620002d0565b5090565b600081519050620002ff81620003c0565b92915050565b600080604083850312156200031f576200031e620003bb565b5b60006200032f85828601620002ee565b92505060206200034285828601620002ee565b9150509250929050565b6000819050919050565b600060028204905060018216806200036f57607f821691505b602082108114156200038657620003856200038c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b620003cb816200034c565b8114620003d757600080fd5b50565b60805160a051615b516200040760003960006125280152600081816120ef01526133d40152615b516000f3fe6080604052600436106102465760003560e01c80635f48f39311610139578063a035b1fe116100b6578063b99bace81161007a578063b99bace81461085e578063c87b56dd14610875578063e985e9c5146108b2578063eefa321d146108ef578063f2fde38b1461090b578063f47749fc1461093457610246565b8063a035b1fe1461079c578063a0712d68146107c7578063a22cb465146107e3578063b4cbdd8b1461080c578063b88d4fde1461083557610246565b80637fc27803116100fd5780637fc27803146106c75780638da5cb5b146106f257806391b7f5ed1461071d57806395d89b41146107465780639d044ed31461077157610246565b80635f48f393146105ce5780636352211e146105f957806370a0823114610636578063715018a61461067357806378f3826c1461068a57610246565b80633fc59ec9116101c75780634f6ccce71161018b5780634f6ccce7146104fd578063543ad32e1461053a57806355f804b314610563578063564566a81461058c5780635efde642146105b757610246565b80633fc59ec9146104155780634239fec71461043157806342842e0e1461046e578063484b973c146104975780634c49a9f8146104c057610246565b8063213c2d331161020e578063213c2d331461034457806323b872dd146103815780632f745c59146103aa5780633100a535146103e75780633ccfd60b146103fe57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f057806318160ddd14610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190614745565b61095d565b60405161027f9190614e6d565b60405180910390f35b34801561029457600080fd5b5061029d610aa7565b6040516102aa9190614ecd565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d591906147e8565b610b39565b6040516102e79190614e06565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190614705565b610bb5565b005b34801561032557600080fd5b5061032e610cc0565b60405161033b919061516f565b60405180910390f35b34801561035057600080fd5b5061036b60048036038101906103669190614582565b610d15565b604051610378919061516f565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a391906145ef565b610d5e565b005b3480156103b657600080fd5b506103d160048036038101906103cc9190614705565b610d6e565b6040516103de919061516f565b60405180910390f35b3480156103f357600080fd5b506103fc610f75565b005b34801561040a57600080fd5b5061041361101d565b005b61042f600480360381019061042a91906148bc565b61119e565b005b34801561043d57600080fd5b5061045860048036038101906104539190614815565b6115b6565b6040516104659190614e6d565b60405180910390f35b34801561047a57600080fd5b50610495600480360381019061049091906145ef565b61177f565b005b3480156104a357600080fd5b506104be60048036038101906104b99190614705565b61179f565b005b3480156104cc57600080fd5b506104e760048036038101906104e29190614815565b611899565b6040516104f49190614e6d565b60405180910390f35b34801561050957600080fd5b50610524600480360381019061051f91906147e8565b611a62565b604051610531919061516f565b60405180910390f35b34801561054657600080fd5b50610561600480360381019061055c91906148bc565b611bd3565b005b34801561056f57600080fd5b5061058a6004803603810190610585919061479f565b611f9c565b005b34801561059857600080fd5b506105a1612032565b6040516105ae9190614e6d565b60405180910390f35b3480156105c357600080fd5b506105cc612045565b005b3480156105da57600080fd5b506105e36120ed565b6040516105f0919061516f565b60405180910390f35b34801561060557600080fd5b50610620600480360381019061061b91906147e8565b612111565b60405161062d9190614e06565b60405180910390f35b34801561064257600080fd5b5061065d60048036038101906106589190614582565b612127565b60405161066a919061516f565b60405180910390f35b34801561067f57600080fd5b506106886121f7565b005b34801561069657600080fd5b506106b160048036038101906106ac9190614582565b61227f565b6040516106be919061516f565b60405180910390f35b3480156106d357600080fd5b506106dc6122c8565b6040516106e99190614e6d565b60405180910390f35b3480156106fe57600080fd5b506107076122db565b6040516107149190614e06565b60405180910390f35b34801561072957600080fd5b50610744600480360381019061073f91906147e8565b612305565b005b34801561075257600080fd5b5061075b61238b565b6040516107689190614ecd565b60405180910390f35b34801561077d57600080fd5b5061078661241d565b6040516107939190614e6d565b60405180910390f35b3480156107a857600080fd5b506107b1612430565b6040516107be919061516f565b60405180910390f35b6107e160048036038101906107dc91906147e8565b612436565b005b3480156107ef57600080fd5b5061080a600480360381019061080591906146c5565b612638565b005b34801561081857600080fd5b50610833600480360381019061082e9190614582565b6127b0565b005b34801561084157600080fd5b5061085c60048036038101906108579190614642565b612870565b005b34801561086a57600080fd5b506108736128c3565b005b34801561088157600080fd5b5061089c600480360381019061089791906147e8565b61296b565b6040516108a99190614ecd565b60405180910390f35b3480156108be57600080fd5b506108d960048036038101906108d491906145af565b612a0a565b6040516108e69190614e6d565b60405180910390f35b61090960048036038101906109049190614705565b612a9e565b005b34801561091757600080fd5b50610932600480360381019061092d9190614582565b612b4a565b005b34801561094057600080fd5b5061095b60048036038101906109569190614582565b612c42565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a2857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a9057507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aa05750610a9f82612d02565b5b9050919050565b606060018054610ab690615441565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae290615441565b8015610b2f5780601f10610b0457610100808354040283529160200191610b2f565b820191906000526020600020905b815481529060010190602001808311610b1257829003601f168201915b5050505050905090565b6000610b4482612d6c565b610b7a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bc082612111565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c28576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c47612dd4565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c795750610c7781610c72612dd4565b612a0a565b155b15610cb0576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cbb838383612ddc565b505050565b60008060109054906101000a90046fffffffffffffffffffffffffffffffff1660008054906101000a90046fffffffffffffffffffffffffffffffff16036fffffffffffffffffffffffffffffffff16905090565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d69838383612e8e565b505050565b6000610d7983612127565b8210610db1576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060005b83811015610f69576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115610ec85750610f5c565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610f0857806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f5a5786841415610f51578195505050505050610f6f565b83806001019450505b505b8080600101915050610deb565b50600080fd5b92915050565b610f7d612dd4565b73ffffffffffffffffffffffffffffffffffffffff16610f9b6122db565b73ffffffffffffffffffffffffffffffffffffffff1614610ff1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe89061508f565b60405180910390fd5b600a60169054906101000a900460ff1615600a60166101000a81548160ff021916908315150217905550565b611025612dd4565b73ffffffffffffffffffffffffffffffffffffffff166110436122db565b73ffffffffffffffffffffffffffffffffffffffff1614611099576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110909061508f565b60405180910390fd5b600260085414156110df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d69061514f565b60405180910390fd5b600260088190555060003373ffffffffffffffffffffffffffffffffffffffff164760405161110d90614df1565b60006040518083038185875af1925050503d806000811461114a576040519150601f19603f3d011682016040523d82523d6000602084013e61114f565b606091505b5050905080611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a906150ef565b60405180910390fd5b506001600881905550565b600a60159054906101000a900460ff166111ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e49061502f565b60405180910390fd5b80600b546111fb91906152e6565b341461123c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123390614f0f565b60405180910390fd5b6112d285858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050503373ffffffffffffffffffffffffffffffffffffffff1660001b6040516020016112ae9190614da5565b604051602081830303815290604052805190602001206133ab90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135890614faf565b60405180910390fd5b6113de83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050876040516020016113ba9190614dcb565b604051602081830303815290604052805190602001206133ab90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461146d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611464906150cf565b60405180910390fd5b80600e600061147a612dd4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114bf919061525f565b861015611501576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f890614fef565b60405180910390fd5b80600e600061150e612dd4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611553919061525f565b600e600061155f612dd4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506115ae6115a8612dd4565b826133d2565b505050505050565b600061164e86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508373ffffffffffffffffffffffffffffffffffffffff1660001b60405160200161162a9190614da5565b604051602081830303815290604052805190602001206133ab90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148015611773575061172284848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050886040516020016116fe9190614dcb565b604051602081830303815290604052805190602001206133ab90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b90509695505050505050565b61179a83838360405180602001604052806000815250612870565b505050565b6117a7612dd4565b73ffffffffffffffffffffffffffffffffffffffff166117c56122db565b73ffffffffffffffffffffffffffffffffffffffff161461181b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118129061508f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561188b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118829061512f565b60405180910390fd5b61189582826133d2565b5050565b600061193186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508373ffffffffffffffffffffffffffffffffffffffff1660001b60405160200161190d9190614da5565b604051602081830303815290604052805190602001206133ab90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148015611a565750611a0584848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050886040516020016119e19190614dcb565b604051602081830303815290604052805190602001206133ab90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b90509695505050505050565b60008060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000805b82811015611b9b576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611b8d5785831415611b845781945050505050611bce565b82806001019350505b508080600101915050611a9a565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600a60149054906101000a900460ff16611c22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c199061504f565b60405180910390fd5b611cb885858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050503373ffffffffffffffffffffffffffffffffffffffff1660001b604051602001611c949190614da5565b604051602081830303815290604052805190602001206133ab90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3e906150af565b60405180910390fd5b611dc483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505087604051602001611da09190614dcb565b604051602081830303815290604052805190602001206133ab90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4a9061510f565b60405180910390fd5b80600d6000611e60612dd4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ea5919061525f565b861015611ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ede90614fef565b60405180910390fd5b80600d6000611ef4612dd4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f39919061525f565b600d6000611f45612dd4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611f94611f8e612dd4565b826133d2565b505050505050565b611fa4612dd4565b73ffffffffffffffffffffffffffffffffffffffff16611fc26122db565b73ffffffffffffffffffffffffffffffffffffffff1614612018576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200f9061508f565b60405180910390fd5b80600c908051906020019061202e9291906142fd565b5050565b600a60169054906101000a900460ff1681565b61204d612dd4565b73ffffffffffffffffffffffffffffffffffffffff1661206b6122db565b73ffffffffffffffffffffffffffffffffffffffff16146120c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b89061508f565b60405180910390fd5b600a60159054906101000a900460ff1615600a60156101000a81548160ff021916908315150217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b600061211c82613455565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561218f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6121ff612dd4565b73ffffffffffffffffffffffffffffffffffffffff1661221d6122db565b73ffffffffffffffffffffffffffffffffffffffff1614612273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226a9061508f565b60405180910390fd5b61227d60006136fd565b565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600a60149054906101000a900460ff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61230d612dd4565b73ffffffffffffffffffffffffffffffffffffffff1661232b6122db565b73ffffffffffffffffffffffffffffffffffffffff1614612381576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123789061508f565b60405180910390fd5b80600b8190555050565b60606002805461239a90615441565b80601f01602080910402602001604051908101604052809291908181526020018280546123c690615441565b80156124135780601f106123e857610100808354040283529160200191612413565b820191906000526020600020905b8154815290600101906020018083116123f657829003601f168201915b5050505050905090565b600a60159054906101000a900460ff1681565b600b5481565b600a60169054906101000a900460ff16612485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247c90614f6f565b60405180910390fd5b80600b5461249391906152e6565b34146124d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124cb90614f0f565b60405180910390fd5b80600f60006124e1612dd4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612526919061525f565b7f00000000000000000000000000000000000000000000000000000000000000001015612588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257f9061500f565b60405180910390fd5b80600f6000612595612dd4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125da919061525f565b600f60006125e6612dd4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061263561262f612dd4565b826133d2565b50565b612640612dd4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126a5576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600660006126b2612dd4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661275f612dd4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127a49190614e6d565b60405180910390a35050565b6127b8612dd4565b73ffffffffffffffffffffffffffffffffffffffff166127d66122db565b73ffffffffffffffffffffffffffffffffffffffff161461282c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128239061508f565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61287b848484612e8e565b612887848484846137c3565b6128bd576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6128cb612dd4565b73ffffffffffffffffffffffffffffffffffffffff166128e96122db565b73ffffffffffffffffffffffffffffffffffffffff161461293f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129369061508f565b60405180910390fd5b600a60149054906101000a900460ff1615600a60146101000a81548160ff021916908315150217905550565b606061297682612d6c565b6129ac576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006129b6613951565b90506000815114156129d75760405180602001604052806000815250612a02565b806129e1846139e3565b6040516020016129f2929190614d81565b6040516020818303038152906040525b915050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a60169054906101000a900460ff16612aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae490614f6f565b60405180910390fd5b80600b54612afb91906152e6565b3414612b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3390614f0f565b60405180910390fd5b612b4682826133d2565b5050565b612b52612dd4565b73ffffffffffffffffffffffffffffffffffffffff16612b706122db565b73ffffffffffffffffffffffffffffffffffffffff1614612bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bbd9061508f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2d90614f4f565b60405180910390fd5b612c3f816136fd565b50565b612c4a612dd4565b73ffffffffffffffffffffffffffffffffffffffff16612c686122db565b73ffffffffffffffffffffffffffffffffffffffff1614612cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb59061508f565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682108015612dcd575060036000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612e9982613455565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612ec0612dd4565b73ffffffffffffffffffffffffffffffffffffffff161480612ef35750612ef28260000151612eed612dd4565b612a0a565b5b80612f385750612f01612dd4565b73ffffffffffffffffffffffffffffffffffffffff16612f2084610b39565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612f71576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612fda576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613041576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61304e8585856001613b44565b61305e6000848460000151612ddc565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561333b5760008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681101561333a5782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46133a48585856001613b4a565b5050505050565b60008060006133ba8585613b50565b915091506133c781613bd3565b819250505092915050565b7f00000000000000000000000000000000000000000000000000000000000000006133fb610cc0565b82613406919061525f565b1115613447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343e90614f8f565b60405180910390fd5b6134518282613da8565b5050565b61345d614383565b600082905060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168110156136c6576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516136c457600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146135a85780925050506136f8565b5b6001156136c357818060019003925050600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146136be5780925050506136f8565b6135a9565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006137e48473ffffffffffffffffffffffffffffffffffffffff16613dc6565b15613944578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261380d612dd4565b8786866040518563ffffffff1660e01b815260040161382f9493929190614e21565b602060405180830381600087803b15801561384957600080fd5b505af192505050801561387a57506040513d601f19601f820116820180604052508101906138779190614772565b60015b6138f4573d80600081146138aa576040519150601f19603f3d011682016040523d82523d6000602084013e6138af565b606091505b506000815114156138ec576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613949565b600190505b949350505050565b6060600c805461396090615441565b80601f016020809104026020016040519081016040528092919081815260200182805461398c90615441565b80156139d95780601f106139ae576101008083540402835291602001916139d9565b820191906000526020600020905b8154815290600101906020018083116139bc57829003601f168201915b5050505050905090565b60606000821415613a2b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613b3f565b600082905060005b60008214613a5d578080613a46906154a4565b915050600a82613a5691906152b5565b9150613a33565b60008167ffffffffffffffff811115613a7957613a7861561d565b5b6040519080825280601f01601f191660200182016040528015613aab5781602001600182028036833780820191505090505b5090505b60008514613b3857600182613ac49190615340565b9150600a85613ad39190615501565b6030613adf919061525f565b60f81b818381518110613af557613af46155ee565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613b3191906152b5565b9450613aaf565b8093505050505b919050565b50505050565b50505050565b600080604183511415613b925760008060006020860151925060408601519150606086015160001a9050613b8687828585613de9565b94509450505050613bcc565b604083511415613bc3576000806020850151915060408501519050613bb8868383613ef6565b935093505050613bcc565b60006002915091505b9250929050565b60006004811115613be757613be6615590565b5b816004811115613bfa57613bf9615590565b5b1415613c0557613da5565b60016004811115613c1957613c18615590565b5b816004811115613c2c57613c2b615590565b5b1415613c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c6490614eef565b60405180910390fd5b60026004811115613c8157613c80615590565b5b816004811115613c9457613c93615590565b5b1415613cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ccc90614f2f565b60405180910390fd5b60036004811115613ce957613ce8615590565b5b816004811115613cfc57613cfb615590565b5b1415613d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d3490614fcf565b60405180910390fd5b600480811115613d5057613d4f615590565b5b816004811115613d6357613d62615590565b5b1415613da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d9b9061506f565b60405180910390fd5b5b50565b613dc2828260405180602001604052806000815250613f55565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613e24576000600391509150613eed565b601b8560ff1614158015613e3c5750601c8560ff1614155b15613e4e576000600491509150613eed565b600060018787878760405160008152602001604052604051613e739493929190614e88565b6020604051602081039080840390855afa158015613e95573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613ee457600060019250925050613eed565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c613f39919061525f565b9050613f4787828885613de9565b935093505050935093915050565b613f628383836001613f67565b505050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415614002576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561403d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61404a6000868387613b44565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156142af57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015614263575061426160008884886137c3565b155b1561429a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818060010192505080806001019150506141e8565b50806000806101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550506142f66000868387613b4a565b5050505050565b82805461430990615441565b90600052602060002090601f01602090048101928261432b5760008555614372565b82601f1061434457805160ff1916838001178555614372565b82800160010185558215614372579182015b82811115614371578251825591602001919060010190614356565b5b50905061437f91906143c6565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156143df5760008160009055506001016143c7565b5090565b60006143f66143f1846151af565b61518a565b9050828152602081018484840111156144125761441161565b565b5b61441d8482856153ff565b509392505050565b6000614438614433846151e0565b61518a565b9050828152602081018484840111156144545761445361565b565b5b61445f8482856153ff565b509392505050565b60008135905061447681615abf565b92915050565b60008135905061448b81615ad6565b92915050565b6000813590506144a081615aed565b92915050565b6000815190506144b581615aed565b92915050565b60008083601f8401126144d1576144d0615651565b5b8235905067ffffffffffffffff8111156144ee576144ed61564c565b5b60208301915083600182028301111561450a57614509615656565b5b9250929050565b600082601f83011261452657614525615651565b5b81356145368482602086016143e3565b91505092915050565b600082601f83011261455457614553615651565b5b8135614564848260208601614425565b91505092915050565b60008135905061457c81615b04565b92915050565b60006020828403121561459857614597615665565b5b60006145a684828501614467565b91505092915050565b600080604083850312156145c6576145c5615665565b5b60006145d485828601614467565b92505060206145e585828601614467565b9150509250929050565b60008060006060848603121561460857614607615665565b5b600061461686828701614467565b935050602061462786828701614467565b92505060406146388682870161456d565b9150509250925092565b6000806000806080858703121561465c5761465b615665565b5b600061466a87828801614467565b945050602061467b87828801614467565b935050604061468c8782880161456d565b925050606085013567ffffffffffffffff8111156146ad576146ac615660565b5b6146b987828801614511565b91505092959194509250565b600080604083850312156146dc576146db615665565b5b60006146ea85828601614467565b92505060206146fb8582860161447c565b9150509250929050565b6000806040838503121561471c5761471b615665565b5b600061472a85828601614467565b925050602061473b8582860161456d565b9150509250929050565b60006020828403121561475b5761475a615665565b5b600061476984828501614491565b91505092915050565b60006020828403121561478857614787615665565b5b6000614796848285016144a6565b91505092915050565b6000602082840312156147b5576147b4615665565b5b600082013567ffffffffffffffff8111156147d3576147d2615660565b5b6147df8482850161453f565b91505092915050565b6000602082840312156147fe576147fd615665565b5b600061480c8482850161456d565b91505092915050565b6000806000806000806080878903121561483257614831615665565b5b600061484089828a0161456d565b965050602087013567ffffffffffffffff81111561486157614860615660565b5b61486d89828a016144bb565b9550955050604087013567ffffffffffffffff8111156148905761488f615660565b5b61489c89828a016144bb565b935093505060606148af89828a01614467565b9150509295509295509295565b600080600080600080608087890312156148d9576148d8615665565b5b60006148e789828a0161456d565b965050602087013567ffffffffffffffff81111561490857614907615660565b5b61491489828a016144bb565b9550955050604087013567ffffffffffffffff81111561493757614936615660565b5b61494389828a016144bb565b9350935050606061495689828a0161456d565b9150509295509295509295565b61496c81615374565b82525050565b61497b81615386565b82525050565b61498a81615392565b82525050565b6149a161499c82615392565b6154ed565b82525050565b60006149b282615211565b6149bc8185615227565b93506149cc81856020860161540e565b6149d58161566a565b840191505092915050565b60006149eb8261521c565b6149f58185615243565b9350614a0581856020860161540e565b614a0e8161566a565b840191505092915050565b6000614a248261521c565b614a2e8185615254565b9350614a3e81856020860161540e565b80840191505092915050565b6000614a57601883615243565b9150614a628261567b565b602082019050919050565b6000614a7a600f83615243565b9150614a85826156a4565b602082019050919050565b6000614a9d601f83615243565b9150614aa8826156cd565b602082019050919050565b6000614ac0601c83615254565b9150614acb826156f6565b601c82019050919050565b6000614ae3602683615243565b9150614aee8261571f565b604082019050919050565b6000614b06600f83615243565b9150614b118261576e565b602082019050919050565b6000614b29600c83615243565b9150614b3482615797565b602082019050919050565b6000614b4c601f83615243565b9150614b57826157c0565b602082019050919050565b6000614b6f602283615243565b9150614b7a826157e9565b604082019050919050565b6000614b92601283615243565b9150614b9d82615838565b602082019050919050565b6000614bb5600a83615243565b9150614bc082615861565b602082019050919050565b6000614bd8601283615243565b9150614be38261588a565b602082019050919050565b6000614bfb601083615243565b9150614c06826158b3565b602082019050919050565b6000614c1e602283615243565b9150614c29826158dc565b604082019050919050565b6000614c41602083615243565b9150614c4c8261592b565b602082019050919050565b6000614c64602183615243565b9150614c6f82615954565b604082019050919050565b6000614c87602483615243565b9150614c92826159a3565b604082019050919050565b6000614caa600083615238565b9150614cb5826159f2565b600082019050919050565b6000614ccd601083615243565b9150614cd8826159f5565b602082019050919050565b6000614cf0602183615243565b9150614cfb82615a1e565b604082019050919050565b6000614d13601b83615243565b9150614d1e82615a6d565b602082019050919050565b6000614d36601f83615243565b9150614d4182615a96565b602082019050919050565b614d55816153e8565b82525050565b614d6c614d67826153e8565b6154f7565b82525050565b614d7b816153f2565b82525050565b6000614d8d8285614a19565b9150614d998284614a19565b91508190509392505050565b6000614db082614ab3565b9150614dbc8284614990565b60208201915081905092915050565b6000614dd682614ab3565b9150614de28284614d5b565b60208201915081905092915050565b6000614dfc82614c9d565b9150819050919050565b6000602082019050614e1b6000830184614963565b92915050565b6000608082019050614e366000830187614963565b614e436020830186614963565b614e506040830185614d4c565b8181036060830152614e6281846149a7565b905095945050505050565b6000602082019050614e826000830184614972565b92915050565b6000608082019050614e9d6000830187614981565b614eaa6020830186614d72565b614eb76040830185614981565b614ec46060830184614981565b95945050505050565b60006020820190508181036000830152614ee781846149e0565b905092915050565b60006020820190508181036000830152614f0881614a4a565b9050919050565b60006020820190508181036000830152614f2881614a6d565b9050919050565b60006020820190508181036000830152614f4881614a90565b9050919050565b60006020820190508181036000830152614f6881614ad6565b9050919050565b60006020820190508181036000830152614f8881614af9565b9050919050565b60006020820190508181036000830152614fa881614b1c565b9050919050565b60006020820190508181036000830152614fc881614b3f565b9050919050565b60006020820190508181036000830152614fe881614b62565b9050919050565b6000602082019050818103600083015261500881614b85565b9050919050565b6000602082019050818103600083015261502881614ba8565b9050919050565b6000602082019050818103600083015261504881614bcb565b9050919050565b6000602082019050818103600083015261506881614bee565b9050919050565b6000602082019050818103600083015261508881614c11565b9050919050565b600060208201905081810360008301526150a881614c34565b9050919050565b600060208201905081810360008301526150c881614c57565b9050919050565b600060208201905081810360008301526150e881614c7a565b9050919050565b6000602082019050818103600083015261510881614cc0565b9050919050565b6000602082019050818103600083015261512881614ce3565b9050919050565b6000602082019050818103600083015261514881614d06565b9050919050565b6000602082019050818103600083015261516881614d29565b9050919050565b60006020820190506151846000830184614d4c565b92915050565b60006151946151a5565b90506151a08282615473565b919050565b6000604051905090565b600067ffffffffffffffff8211156151ca576151c961561d565b5b6151d38261566a565b9050602081019050919050565b600067ffffffffffffffff8211156151fb576151fa61561d565b5b6152048261566a565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061526a826153e8565b9150615275836153e8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156152aa576152a9615532565b5b828201905092915050565b60006152c0826153e8565b91506152cb836153e8565b9250826152db576152da615561565b5b828204905092915050565b60006152f1826153e8565b91506152fc836153e8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561533557615334615532565b5b828202905092915050565b600061534b826153e8565b9150615356836153e8565b92508282101561536957615368615532565b5b828203905092915050565b600061537f826153c8565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561542c578082015181840152602081019050615411565b8381111561543b576000848401525b50505050565b6000600282049050600182168061545957607f821691505b6020821081141561546d5761546c6155bf565b5b50919050565b61547c8261566a565b810181811067ffffffffffffffff8211171561549b5761549a61561d565b5b80604052505050565b60006154af826153e8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156154e2576154e1615532565b5b600182019050919050565b6000819050919050565b6000819050919050565b600061550c826153e8565b9150615517836153e8565b92508261552757615526615561565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f496e636f72726563742056616c75650000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f53616c65204e6f74204163746976650000000000000000000000000000000000600082015250565b7f4578636565646564204d61780000000000000000000000000000000000000000600082015250565b7f57616c6c65742061646472657373206e6f74206f6e2057696c646c6973742e00600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565646564204d617820436c61696d0000000000000000000000000000600082015250565b7f4d6178204d696e74656400000000000000000000000000000000000000000000600082015250565b7f50726573616c65204e6f74204163746976650000000000000000000000000000600082015250565b7f436c61696d204e6f742041637469766500000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f57616c6c65742041646472657373206e6f74206f6e20636c61696d206c69737460008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e636f72726563742057696c646c697374206c696d697420666f722057616c60008201527f6c65742e00000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f496e636f727265637420436c61696d206c696d697420666f722057616c6c657460008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f742053656e6420546f205a65726f20416464726573730000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b615ac881615374565b8114615ad357600080fd5b50565b615adf81615386565b8114615aea57600080fd5b50565b615af68161539c565b8114615b0157600080fd5b50565b615b0d816153e8565b8114615b1857600080fd5b5056fea2646970667358221220b3f490c5807bcd0f953f6d96d02ccd4e62e1ac4add6c4f67dcc275eece97090e64736f6c6343000807003300000000000000000000000000000000000000000000000005d423c655aa0000000000000000000000000000000000000000000000000000000000000000029a

Deployed Bytecode

0x6080604052600436106102465760003560e01c80635f48f39311610139578063a035b1fe116100b6578063b99bace81161007a578063b99bace81461085e578063c87b56dd14610875578063e985e9c5146108b2578063eefa321d146108ef578063f2fde38b1461090b578063f47749fc1461093457610246565b8063a035b1fe1461079c578063a0712d68146107c7578063a22cb465146107e3578063b4cbdd8b1461080c578063b88d4fde1461083557610246565b80637fc27803116100fd5780637fc27803146106c75780638da5cb5b146106f257806391b7f5ed1461071d57806395d89b41146107465780639d044ed31461077157610246565b80635f48f393146105ce5780636352211e146105f957806370a0823114610636578063715018a61461067357806378f3826c1461068a57610246565b80633fc59ec9116101c75780634f6ccce71161018b5780634f6ccce7146104fd578063543ad32e1461053a57806355f804b314610563578063564566a81461058c5780635efde642146105b757610246565b80633fc59ec9146104155780634239fec71461043157806342842e0e1461046e578063484b973c146104975780634c49a9f8146104c057610246565b8063213c2d331161020e578063213c2d331461034457806323b872dd146103815780632f745c59146103aa5780633100a535146103e75780633ccfd60b146103fe57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f057806318160ddd14610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190614745565b61095d565b60405161027f9190614e6d565b60405180910390f35b34801561029457600080fd5b5061029d610aa7565b6040516102aa9190614ecd565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d591906147e8565b610b39565b6040516102e79190614e06565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190614705565b610bb5565b005b34801561032557600080fd5b5061032e610cc0565b60405161033b919061516f565b60405180910390f35b34801561035057600080fd5b5061036b60048036038101906103669190614582565b610d15565b604051610378919061516f565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a391906145ef565b610d5e565b005b3480156103b657600080fd5b506103d160048036038101906103cc9190614705565b610d6e565b6040516103de919061516f565b60405180910390f35b3480156103f357600080fd5b506103fc610f75565b005b34801561040a57600080fd5b5061041361101d565b005b61042f600480360381019061042a91906148bc565b61119e565b005b34801561043d57600080fd5b5061045860048036038101906104539190614815565b6115b6565b6040516104659190614e6d565b60405180910390f35b34801561047a57600080fd5b50610495600480360381019061049091906145ef565b61177f565b005b3480156104a357600080fd5b506104be60048036038101906104b99190614705565b61179f565b005b3480156104cc57600080fd5b506104e760048036038101906104e29190614815565b611899565b6040516104f49190614e6d565b60405180910390f35b34801561050957600080fd5b50610524600480360381019061051f91906147e8565b611a62565b604051610531919061516f565b60405180910390f35b34801561054657600080fd5b50610561600480360381019061055c91906148bc565b611bd3565b005b34801561056f57600080fd5b5061058a6004803603810190610585919061479f565b611f9c565b005b34801561059857600080fd5b506105a1612032565b6040516105ae9190614e6d565b60405180910390f35b3480156105c357600080fd5b506105cc612045565b005b3480156105da57600080fd5b506105e36120ed565b6040516105f0919061516f565b60405180910390f35b34801561060557600080fd5b50610620600480360381019061061b91906147e8565b612111565b60405161062d9190614e06565b60405180910390f35b34801561064257600080fd5b5061065d60048036038101906106589190614582565b612127565b60405161066a919061516f565b60405180910390f35b34801561067f57600080fd5b506106886121f7565b005b34801561069657600080fd5b506106b160048036038101906106ac9190614582565b61227f565b6040516106be919061516f565b60405180910390f35b3480156106d357600080fd5b506106dc6122c8565b6040516106e99190614e6d565b60405180910390f35b3480156106fe57600080fd5b506107076122db565b6040516107149190614e06565b60405180910390f35b34801561072957600080fd5b50610744600480360381019061073f91906147e8565b612305565b005b34801561075257600080fd5b5061075b61238b565b6040516107689190614ecd565b60405180910390f35b34801561077d57600080fd5b5061078661241d565b6040516107939190614e6d565b60405180910390f35b3480156107a857600080fd5b506107b1612430565b6040516107be919061516f565b60405180910390f35b6107e160048036038101906107dc91906147e8565b612436565b005b3480156107ef57600080fd5b5061080a600480360381019061080591906146c5565b612638565b005b34801561081857600080fd5b50610833600480360381019061082e9190614582565b6127b0565b005b34801561084157600080fd5b5061085c60048036038101906108579190614642565b612870565b005b34801561086a57600080fd5b506108736128c3565b005b34801561088157600080fd5b5061089c600480360381019061089791906147e8565b61296b565b6040516108a99190614ecd565b60405180910390f35b3480156108be57600080fd5b506108d960048036038101906108d491906145af565b612a0a565b6040516108e69190614e6d565b60405180910390f35b61090960048036038101906109049190614705565b612a9e565b005b34801561091757600080fd5b50610932600480360381019061092d9190614582565b612b4a565b005b34801561094057600080fd5b5061095b60048036038101906109569190614582565b612c42565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a2857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a9057507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aa05750610a9f82612d02565b5b9050919050565b606060018054610ab690615441565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae290615441565b8015610b2f5780601f10610b0457610100808354040283529160200191610b2f565b820191906000526020600020905b815481529060010190602001808311610b1257829003601f168201915b5050505050905090565b6000610b4482612d6c565b610b7a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bc082612111565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c28576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c47612dd4565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c795750610c7781610c72612dd4565b612a0a565b155b15610cb0576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cbb838383612ddc565b505050565b60008060109054906101000a90046fffffffffffffffffffffffffffffffff1660008054906101000a90046fffffffffffffffffffffffffffffffff16036fffffffffffffffffffffffffffffffff16905090565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d69838383612e8e565b505050565b6000610d7983612127565b8210610db1576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060005b83811015610f69576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115610ec85750610f5c565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610f0857806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f5a5786841415610f51578195505050505050610f6f565b83806001019450505b505b8080600101915050610deb565b50600080fd5b92915050565b610f7d612dd4565b73ffffffffffffffffffffffffffffffffffffffff16610f9b6122db565b73ffffffffffffffffffffffffffffffffffffffff1614610ff1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe89061508f565b60405180910390fd5b600a60169054906101000a900460ff1615600a60166101000a81548160ff021916908315150217905550565b611025612dd4565b73ffffffffffffffffffffffffffffffffffffffff166110436122db565b73ffffffffffffffffffffffffffffffffffffffff1614611099576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110909061508f565b60405180910390fd5b600260085414156110df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d69061514f565b60405180910390fd5b600260088190555060003373ffffffffffffffffffffffffffffffffffffffff164760405161110d90614df1565b60006040518083038185875af1925050503d806000811461114a576040519150601f19603f3d011682016040523d82523d6000602084013e61114f565b606091505b5050905080611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a906150ef565b60405180910390fd5b506001600881905550565b600a60159054906101000a900460ff166111ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e49061502f565b60405180910390fd5b80600b546111fb91906152e6565b341461123c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123390614f0f565b60405180910390fd5b6112d285858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050503373ffffffffffffffffffffffffffffffffffffffff1660001b6040516020016112ae9190614da5565b604051602081830303815290604052805190602001206133ab90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135890614faf565b60405180910390fd5b6113de83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050876040516020016113ba9190614dcb565b604051602081830303815290604052805190602001206133ab90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461146d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611464906150cf565b60405180910390fd5b80600e600061147a612dd4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114bf919061525f565b861015611501576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f890614fef565b60405180910390fd5b80600e600061150e612dd4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611553919061525f565b600e600061155f612dd4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506115ae6115a8612dd4565b826133d2565b505050505050565b600061164e86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508373ffffffffffffffffffffffffffffffffffffffff1660001b60405160200161162a9190614da5565b604051602081830303815290604052805190602001206133ab90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148015611773575061172284848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050886040516020016116fe9190614dcb565b604051602081830303815290604052805190602001206133ab90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b90509695505050505050565b61179a83838360405180602001604052806000815250612870565b505050565b6117a7612dd4565b73ffffffffffffffffffffffffffffffffffffffff166117c56122db565b73ffffffffffffffffffffffffffffffffffffffff161461181b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118129061508f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561188b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118829061512f565b60405180910390fd5b61189582826133d2565b5050565b600061193186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508373ffffffffffffffffffffffffffffffffffffffff1660001b60405160200161190d9190614da5565b604051602081830303815290604052805190602001206133ab90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148015611a565750611a0584848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050886040516020016119e19190614dcb565b604051602081830303815290604052805190602001206133ab90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b90509695505050505050565b60008060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000805b82811015611b9b576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611b8d5785831415611b845781945050505050611bce565b82806001019350505b508080600101915050611a9a565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600a60149054906101000a900460ff16611c22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c199061504f565b60405180910390fd5b611cb885858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050503373ffffffffffffffffffffffffffffffffffffffff1660001b604051602001611c949190614da5565b604051602081830303815290604052805190602001206133ab90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3e906150af565b60405180910390fd5b611dc483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505087604051602001611da09190614dcb565b604051602081830303815290604052805190602001206133ab90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4a9061510f565b60405180910390fd5b80600d6000611e60612dd4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ea5919061525f565b861015611ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ede90614fef565b60405180910390fd5b80600d6000611ef4612dd4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f39919061525f565b600d6000611f45612dd4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611f94611f8e612dd4565b826133d2565b505050505050565b611fa4612dd4565b73ffffffffffffffffffffffffffffffffffffffff16611fc26122db565b73ffffffffffffffffffffffffffffffffffffffff1614612018576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200f9061508f565b60405180910390fd5b80600c908051906020019061202e9291906142fd565b5050565b600a60169054906101000a900460ff1681565b61204d612dd4565b73ffffffffffffffffffffffffffffffffffffffff1661206b6122db565b73ffffffffffffffffffffffffffffffffffffffff16146120c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b89061508f565b60405180910390fd5b600a60159054906101000a900460ff1615600a60156101000a81548160ff021916908315150217905550565b7f000000000000000000000000000000000000000000000000000000000000029a81565b600061211c82613455565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561218f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6121ff612dd4565b73ffffffffffffffffffffffffffffffffffffffff1661221d6122db565b73ffffffffffffffffffffffffffffffffffffffff1614612273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226a9061508f565b60405180910390fd5b61227d60006136fd565b565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600a60149054906101000a900460ff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61230d612dd4565b73ffffffffffffffffffffffffffffffffffffffff1661232b6122db565b73ffffffffffffffffffffffffffffffffffffffff1614612381576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123789061508f565b60405180910390fd5b80600b8190555050565b60606002805461239a90615441565b80601f01602080910402602001604051908101604052809291908181526020018280546123c690615441565b80156124135780601f106123e857610100808354040283529160200191612413565b820191906000526020600020905b8154815290600101906020018083116123f657829003601f168201915b5050505050905090565b600a60159054906101000a900460ff1681565b600b5481565b600a60169054906101000a900460ff16612485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247c90614f6f565b60405180910390fd5b80600b5461249391906152e6565b34146124d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124cb90614f0f565b60405180910390fd5b80600f60006124e1612dd4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612526919061525f565b7f00000000000000000000000000000000000000000000000000000000000000031015612588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257f9061500f565b60405180910390fd5b80600f6000612595612dd4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125da919061525f565b600f60006125e6612dd4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061263561262f612dd4565b826133d2565b50565b612640612dd4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126a5576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600660006126b2612dd4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661275f612dd4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127a49190614e6d565b60405180910390a35050565b6127b8612dd4565b73ffffffffffffffffffffffffffffffffffffffff166127d66122db565b73ffffffffffffffffffffffffffffffffffffffff161461282c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128239061508f565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61287b848484612e8e565b612887848484846137c3565b6128bd576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6128cb612dd4565b73ffffffffffffffffffffffffffffffffffffffff166128e96122db565b73ffffffffffffffffffffffffffffffffffffffff161461293f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129369061508f565b60405180910390fd5b600a60149054906101000a900460ff1615600a60146101000a81548160ff021916908315150217905550565b606061297682612d6c565b6129ac576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006129b6613951565b90506000815114156129d75760405180602001604052806000815250612a02565b806129e1846139e3565b6040516020016129f2929190614d81565b6040516020818303038152906040525b915050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a60169054906101000a900460ff16612aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae490614f6f565b60405180910390fd5b80600b54612afb91906152e6565b3414612b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3390614f0f565b60405180910390fd5b612b4682826133d2565b5050565b612b52612dd4565b73ffffffffffffffffffffffffffffffffffffffff16612b706122db565b73ffffffffffffffffffffffffffffffffffffffff1614612bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bbd9061508f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2d90614f4f565b60405180910390fd5b612c3f816136fd565b50565b612c4a612dd4565b73ffffffffffffffffffffffffffffffffffffffff16612c686122db565b73ffffffffffffffffffffffffffffffffffffffff1614612cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb59061508f565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682108015612dcd575060036000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612e9982613455565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612ec0612dd4565b73ffffffffffffffffffffffffffffffffffffffff161480612ef35750612ef28260000151612eed612dd4565b612a0a565b5b80612f385750612f01612dd4565b73ffffffffffffffffffffffffffffffffffffffff16612f2084610b39565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612f71576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612fda576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613041576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61304e8585856001613b44565b61305e6000848460000151612ddc565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561333b5760008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681101561333a5782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46133a48585856001613b4a565b5050505050565b60008060006133ba8585613b50565b915091506133c781613bd3565b819250505092915050565b7f000000000000000000000000000000000000000000000000000000000000029a6133fb610cc0565b82613406919061525f565b1115613447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343e90614f8f565b60405180910390fd5b6134518282613da8565b5050565b61345d614383565b600082905060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168110156136c6576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516136c457600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146135a85780925050506136f8565b5b6001156136c357818060019003925050600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146136be5780925050506136f8565b6135a9565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006137e48473ffffffffffffffffffffffffffffffffffffffff16613dc6565b15613944578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261380d612dd4565b8786866040518563ffffffff1660e01b815260040161382f9493929190614e21565b602060405180830381600087803b15801561384957600080fd5b505af192505050801561387a57506040513d601f19601f820116820180604052508101906138779190614772565b60015b6138f4573d80600081146138aa576040519150601f19603f3d011682016040523d82523d6000602084013e6138af565b606091505b506000815114156138ec576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613949565b600190505b949350505050565b6060600c805461396090615441565b80601f016020809104026020016040519081016040528092919081815260200182805461398c90615441565b80156139d95780601f106139ae576101008083540402835291602001916139d9565b820191906000526020600020905b8154815290600101906020018083116139bc57829003601f168201915b5050505050905090565b60606000821415613a2b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613b3f565b600082905060005b60008214613a5d578080613a46906154a4565b915050600a82613a5691906152b5565b9150613a33565b60008167ffffffffffffffff811115613a7957613a7861561d565b5b6040519080825280601f01601f191660200182016040528015613aab5781602001600182028036833780820191505090505b5090505b60008514613b3857600182613ac49190615340565b9150600a85613ad39190615501565b6030613adf919061525f565b60f81b818381518110613af557613af46155ee565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613b3191906152b5565b9450613aaf565b8093505050505b919050565b50505050565b50505050565b600080604183511415613b925760008060006020860151925060408601519150606086015160001a9050613b8687828585613de9565b94509450505050613bcc565b604083511415613bc3576000806020850151915060408501519050613bb8868383613ef6565b935093505050613bcc565b60006002915091505b9250929050565b60006004811115613be757613be6615590565b5b816004811115613bfa57613bf9615590565b5b1415613c0557613da5565b60016004811115613c1957613c18615590565b5b816004811115613c2c57613c2b615590565b5b1415613c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c6490614eef565b60405180910390fd5b60026004811115613c8157613c80615590565b5b816004811115613c9457613c93615590565b5b1415613cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ccc90614f2f565b60405180910390fd5b60036004811115613ce957613ce8615590565b5b816004811115613cfc57613cfb615590565b5b1415613d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d3490614fcf565b60405180910390fd5b600480811115613d5057613d4f615590565b5b816004811115613d6357613d62615590565b5b1415613da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d9b9061506f565b60405180910390fd5b5b50565b613dc2828260405180602001604052806000815250613f55565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613e24576000600391509150613eed565b601b8560ff1614158015613e3c5750601c8560ff1614155b15613e4e576000600491509150613eed565b600060018787878760405160008152602001604052604051613e739493929190614e88565b6020604051602081039080840390855afa158015613e95573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613ee457600060019250925050613eed565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c613f39919061525f565b9050613f4787828885613de9565b935093505050935093915050565b613f628383836001613f67565b505050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415614002576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561403d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61404a6000868387613b44565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156142af57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015614263575061426160008884886137c3565b155b1561429a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818060010192505080806001019150506141e8565b50806000806101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550506142f66000868387613b4a565b5050505050565b82805461430990615441565b90600052602060002090601f01602090048101928261432b5760008555614372565b82601f1061434457805160ff1916838001178555614372565b82800160010185558215614372579182015b82811115614371578251825591602001919060010190614356565b5b50905061437f91906143c6565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156143df5760008160009055506001016143c7565b5090565b60006143f66143f1846151af565b61518a565b9050828152602081018484840111156144125761441161565b565b5b61441d8482856153ff565b509392505050565b6000614438614433846151e0565b61518a565b9050828152602081018484840111156144545761445361565b565b5b61445f8482856153ff565b509392505050565b60008135905061447681615abf565b92915050565b60008135905061448b81615ad6565b92915050565b6000813590506144a081615aed565b92915050565b6000815190506144b581615aed565b92915050565b60008083601f8401126144d1576144d0615651565b5b8235905067ffffffffffffffff8111156144ee576144ed61564c565b5b60208301915083600182028301111561450a57614509615656565b5b9250929050565b600082601f83011261452657614525615651565b5b81356145368482602086016143e3565b91505092915050565b600082601f83011261455457614553615651565b5b8135614564848260208601614425565b91505092915050565b60008135905061457c81615b04565b92915050565b60006020828403121561459857614597615665565b5b60006145a684828501614467565b91505092915050565b600080604083850312156145c6576145c5615665565b5b60006145d485828601614467565b92505060206145e585828601614467565b9150509250929050565b60008060006060848603121561460857614607615665565b5b600061461686828701614467565b935050602061462786828701614467565b92505060406146388682870161456d565b9150509250925092565b6000806000806080858703121561465c5761465b615665565b5b600061466a87828801614467565b945050602061467b87828801614467565b935050604061468c8782880161456d565b925050606085013567ffffffffffffffff8111156146ad576146ac615660565b5b6146b987828801614511565b91505092959194509250565b600080604083850312156146dc576146db615665565b5b60006146ea85828601614467565b92505060206146fb8582860161447c565b9150509250929050565b6000806040838503121561471c5761471b615665565b5b600061472a85828601614467565b925050602061473b8582860161456d565b9150509250929050565b60006020828403121561475b5761475a615665565b5b600061476984828501614491565b91505092915050565b60006020828403121561478857614787615665565b5b6000614796848285016144a6565b91505092915050565b6000602082840312156147b5576147b4615665565b5b600082013567ffffffffffffffff8111156147d3576147d2615660565b5b6147df8482850161453f565b91505092915050565b6000602082840312156147fe576147fd615665565b5b600061480c8482850161456d565b91505092915050565b6000806000806000806080878903121561483257614831615665565b5b600061484089828a0161456d565b965050602087013567ffffffffffffffff81111561486157614860615660565b5b61486d89828a016144bb565b9550955050604087013567ffffffffffffffff8111156148905761488f615660565b5b61489c89828a016144bb565b935093505060606148af89828a01614467565b9150509295509295509295565b600080600080600080608087890312156148d9576148d8615665565b5b60006148e789828a0161456d565b965050602087013567ffffffffffffffff81111561490857614907615660565b5b61491489828a016144bb565b9550955050604087013567ffffffffffffffff81111561493757614936615660565b5b61494389828a016144bb565b9350935050606061495689828a0161456d565b9150509295509295509295565b61496c81615374565b82525050565b61497b81615386565b82525050565b61498a81615392565b82525050565b6149a161499c82615392565b6154ed565b82525050565b60006149b282615211565b6149bc8185615227565b93506149cc81856020860161540e565b6149d58161566a565b840191505092915050565b60006149eb8261521c565b6149f58185615243565b9350614a0581856020860161540e565b614a0e8161566a565b840191505092915050565b6000614a248261521c565b614a2e8185615254565b9350614a3e81856020860161540e565b80840191505092915050565b6000614a57601883615243565b9150614a628261567b565b602082019050919050565b6000614a7a600f83615243565b9150614a85826156a4565b602082019050919050565b6000614a9d601f83615243565b9150614aa8826156cd565b602082019050919050565b6000614ac0601c83615254565b9150614acb826156f6565b601c82019050919050565b6000614ae3602683615243565b9150614aee8261571f565b604082019050919050565b6000614b06600f83615243565b9150614b118261576e565b602082019050919050565b6000614b29600c83615243565b9150614b3482615797565b602082019050919050565b6000614b4c601f83615243565b9150614b57826157c0565b602082019050919050565b6000614b6f602283615243565b9150614b7a826157e9565b604082019050919050565b6000614b92601283615243565b9150614b9d82615838565b602082019050919050565b6000614bb5600a83615243565b9150614bc082615861565b602082019050919050565b6000614bd8601283615243565b9150614be38261588a565b602082019050919050565b6000614bfb601083615243565b9150614c06826158b3565b602082019050919050565b6000614c1e602283615243565b9150614c29826158dc565b604082019050919050565b6000614c41602083615243565b9150614c4c8261592b565b602082019050919050565b6000614c64602183615243565b9150614c6f82615954565b604082019050919050565b6000614c87602483615243565b9150614c92826159a3565b604082019050919050565b6000614caa600083615238565b9150614cb5826159f2565b600082019050919050565b6000614ccd601083615243565b9150614cd8826159f5565b602082019050919050565b6000614cf0602183615243565b9150614cfb82615a1e565b604082019050919050565b6000614d13601b83615243565b9150614d1e82615a6d565b602082019050919050565b6000614d36601f83615243565b9150614d4182615a96565b602082019050919050565b614d55816153e8565b82525050565b614d6c614d67826153e8565b6154f7565b82525050565b614d7b816153f2565b82525050565b6000614d8d8285614a19565b9150614d998284614a19565b91508190509392505050565b6000614db082614ab3565b9150614dbc8284614990565b60208201915081905092915050565b6000614dd682614ab3565b9150614de28284614d5b565b60208201915081905092915050565b6000614dfc82614c9d565b9150819050919050565b6000602082019050614e1b6000830184614963565b92915050565b6000608082019050614e366000830187614963565b614e436020830186614963565b614e506040830185614d4c565b8181036060830152614e6281846149a7565b905095945050505050565b6000602082019050614e826000830184614972565b92915050565b6000608082019050614e9d6000830187614981565b614eaa6020830186614d72565b614eb76040830185614981565b614ec46060830184614981565b95945050505050565b60006020820190508181036000830152614ee781846149e0565b905092915050565b60006020820190508181036000830152614f0881614a4a565b9050919050565b60006020820190508181036000830152614f2881614a6d565b9050919050565b60006020820190508181036000830152614f4881614a90565b9050919050565b60006020820190508181036000830152614f6881614ad6565b9050919050565b60006020820190508181036000830152614f8881614af9565b9050919050565b60006020820190508181036000830152614fa881614b1c565b9050919050565b60006020820190508181036000830152614fc881614b3f565b9050919050565b60006020820190508181036000830152614fe881614b62565b9050919050565b6000602082019050818103600083015261500881614b85565b9050919050565b6000602082019050818103600083015261502881614ba8565b9050919050565b6000602082019050818103600083015261504881614bcb565b9050919050565b6000602082019050818103600083015261506881614bee565b9050919050565b6000602082019050818103600083015261508881614c11565b9050919050565b600060208201905081810360008301526150a881614c34565b9050919050565b600060208201905081810360008301526150c881614c57565b9050919050565b600060208201905081810360008301526150e881614c7a565b9050919050565b6000602082019050818103600083015261510881614cc0565b9050919050565b6000602082019050818103600083015261512881614ce3565b9050919050565b6000602082019050818103600083015261514881614d06565b9050919050565b6000602082019050818103600083015261516881614d29565b9050919050565b60006020820190506151846000830184614d4c565b92915050565b60006151946151a5565b90506151a08282615473565b919050565b6000604051905090565b600067ffffffffffffffff8211156151ca576151c961561d565b5b6151d38261566a565b9050602081019050919050565b600067ffffffffffffffff8211156151fb576151fa61561d565b5b6152048261566a565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061526a826153e8565b9150615275836153e8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156152aa576152a9615532565b5b828201905092915050565b60006152c0826153e8565b91506152cb836153e8565b9250826152db576152da615561565b5b828204905092915050565b60006152f1826153e8565b91506152fc836153e8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561533557615334615532565b5b828202905092915050565b600061534b826153e8565b9150615356836153e8565b92508282101561536957615368615532565b5b828203905092915050565b600061537f826153c8565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561542c578082015181840152602081019050615411565b8381111561543b576000848401525b50505050565b6000600282049050600182168061545957607f821691505b6020821081141561546d5761546c6155bf565b5b50919050565b61547c8261566a565b810181811067ffffffffffffffff8211171561549b5761549a61561d565b5b80604052505050565b60006154af826153e8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156154e2576154e1615532565b5b600182019050919050565b6000819050919050565b6000819050919050565b600061550c826153e8565b9150615517836153e8565b92508261552757615526615561565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f496e636f72726563742056616c75650000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f53616c65204e6f74204163746976650000000000000000000000000000000000600082015250565b7f4578636565646564204d61780000000000000000000000000000000000000000600082015250565b7f57616c6c65742061646472657373206e6f74206f6e2057696c646c6973742e00600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565646564204d617820436c61696d0000000000000000000000000000600082015250565b7f4d6178204d696e74656400000000000000000000000000000000000000000000600082015250565b7f50726573616c65204e6f74204163746976650000000000000000000000000000600082015250565b7f436c61696d204e6f742041637469766500000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f57616c6c65742041646472657373206e6f74206f6e20636c61696d206c69737460008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e636f72726563742057696c646c697374206c696d697420666f722057616c60008201527f6c65742e00000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f496e636f727265637420436c61696d206c696d697420666f722057616c6c657460008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f742053656e6420546f205a65726f20416464726573730000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b615ac881615374565b8114615ad357600080fd5b50565b615adf81615386565b8114615aea57600080fd5b50565b615af68161539c565b8114615b0157600080fd5b50565b615b0d816153e8565b8114615b1857600080fd5b5056fea2646970667358221220b3f490c5807bcd0f953f6d96d02ccd4e62e1ac4add6c4f67dcc275eece97090e64736f6c63430008070033

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

00000000000000000000000000000000000000000000000005d423c655aa0000000000000000000000000000000000000000000000000000000000000000029a

-----Decoded View---------------
Arg [0] : price_ (uint256): 420000000000000000
Arg [1] : maxAmount_ (uint256): 666

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000005d423c655aa0000
Arg [1] : 000000000000000000000000000000000000000000000000000000000000029a


Deployed Bytecode Sourcemap

58631:7471:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42102:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44712:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46215:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45778:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39339:280;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64487:141;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47072:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40925:1105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65328:94;;;;;;;;;;;;;:::i;:::-;;65800:186;;;;;;;;;;;;;:::i;:::-;;61034:1112;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62914:714;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47313:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65430:178;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63636:702;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39912:713;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59977:1019;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64636:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59042:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65217:103;;;;;;;;;;;;;:::i;:::-;;59137:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44521:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42538:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17023:103;;;;;;;;;;;;;:::i;:::-;;64346:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58929:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16372:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64744:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44881:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58986:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59089:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62177:445;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46491:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64838:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47569:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65112:97;;;;;;;;;;;;;:::i;:::-;;45056:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46841:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62661:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17281:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64973:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42102:372;42204:4;42256:25;42241:40;;;:11;:40;;;;:105;;;;42313:33;42298:48;;;:11;:48;;;;42241:105;:172;;;;42378:35;42363:50;;;:11;:50;;;;42241:172;:225;;;;42430:36;42454:11;42430:23;:36::i;:::-;42241:225;42221:245;;42102:372;;;:::o;44712:100::-;44766:13;44799:5;44792:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44712:100;:::o;46215:204::-;46283:7;46308:16;46316:7;46308;:16::i;:::-;46303:64;;46333:34;;;;;;;;;;;;;;46303:64;46387:15;:24;46403:7;46387:24;;;;;;;;;;;;;;;;;;;;;46380:31;;46215:204;;;:::o;45778:371::-;45851:13;45867:24;45883:7;45867:15;:24::i;:::-;45851:40;;45912:5;45906:11;;:2;:11;;;45902:48;;;45926:24;;;;;;;;;;;;;;45902:48;45983:5;45967:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;45993:37;46010:5;46017:12;:10;:12::i;:::-;45993:16;:37::i;:::-;45992:38;45967:63;45963:138;;;46054:35;;;;;;;;;;;;;;45963:138;46113:28;46122:2;46126:7;46135:5;46113:8;:28::i;:::-;45840:309;45778:371;;:::o;39339:280::-;39392:7;39584:12;;;;;;;;;;;39568:13;;;;;;;;;;:28;39561:35;;;;39339:280;:::o;64487:141::-;64563:7;64590:20;:30;64611:8;64590:30;;;;;;;;;;;;;;;;64583:37;;64487:141;;;:::o;47072:170::-;47206:28;47216:4;47222:2;47226:7;47206:9;:28::i;:::-;47072:170;;;:::o;40925:1105::-;41014:7;41047:16;41057:5;41047:9;:16::i;:::-;41038:5;:25;41034:61;;41072:23;;;;;;;;;;;;;;41034:61;41106:22;41131:13;;;;;;;;;;;41106:38;;;;41155:19;41185:25;41386:9;41381:557;41401:14;41397:1;:18;41381:557;;;41441:31;41475:11;:14;41487:1;41475:14;;;;;;;;;;;41441:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41512:9;:16;;;41508:73;;;41553:8;;;41508:73;41629:1;41603:28;;:9;:14;;;:28;;;41599:111;;41676:9;:14;;;41656:34;;41599:111;41753:5;41732:26;;:17;:26;;;41728:195;;;41802:5;41787:11;:20;41783:85;;;41843:1;41836:8;;;;;;;;;41783:85;41890:13;;;;;;;41728:195;41422:516;41381:557;41417:3;;;;;;;41381:557;;;;42014:8;;;40925:1105;;;;;:::o;65328:94::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65402:12:::1;;;;;;;;;;;65401:13;65386:12;;:28;;;;;;;;;;;;;;;;;;65328:94::o:0;65800:186::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1:::1;2410:7;;:19;;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;65864:12:::2;65881:10;:15;;65905:21;65881:50;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65863:68;;;65950:7;65942:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;65852:134;1768:1:::1;2722:7;:22;;;;65800:186::o:0;61034:1112::-;61197:15;;;;;;;;;;;61189:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;61275:8;61267:5;;:16;;;;:::i;:::-;61254:9;:29;61246:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;61347:194;61531:9;;61347:194;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61483:10;61467:28;;61459:37;;61371:140;;;;;;;;:::i;:::-;;;;;;;;;;;;;61347:175;;;;;;:183;;:194;;;;:::i;:::-;61322:219;;:21;;;;;;;;;;;:219;;;61314:263;;;;;;;;;;;;:::i;:::-;;;;;;;;;61623:187;61785:24;;61623:187;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61735:15;61647:118;;;;;;;;:::i;:::-;;;;;;;;;;;;;61623:153;;;;;;:161;;:187;;;;:::i;:::-;61598:212;;:21;;;;;;;;;;;:212;;;61590:261;;;;;;;;;;;;:::i;:::-;;;;;;;;;61942:8;61905:20;:34;61926:12;:10;:12::i;:::-;61905:34;;;;;;;;;;;;;;;;:45;;;;:::i;:::-;61886:15;:64;;61864:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;62083:8;62046:20;:34;62067:12;:10;:12::i;:::-;62046:34;;;;;;;;;;;;;;;;:45;;;;:::i;:::-;62009:20;:34;62030:12;:10;:12::i;:::-;62009:34;;;;;;;;;;;;;;;:82;;;;62104:34;62115:12;:10;:12::i;:::-;62129:8;62104:10;:34::i;:::-;61034:1112;;;;;;:::o;62914:714::-;63117:4;63181:192;63363:9;;63181:192;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63317:8;63301:26;;63293:35;;63205:138;;;;;;;;:::i;:::-;;;;;;;;;;;;;63181:173;;;;;;:181;;:192;;;;:::i;:::-;63156:217;;:21;;;;;;;;;;;:217;;;:464;;;;;63433:187;63595:24;;63433:187;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63545:15;63457:118;;;;;;;;:::i;:::-;;;;;;;;;;;;;63433:153;;;;;;:161;;:187;;;;:::i;:::-;63408:212;;:21;;;;;;;;;;;:212;;;63156:464;63139:481;;62914:714;;;;;;;;:::o;47313:185::-;47451:39;47468:4;47474:2;47478:7;47451:39;;;;;;;;;;;;:16;:39::i;:::-;47313:185;;;:::o;65430:178::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65531:1:::1;65517:16;;:2;:16;;;;65509:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;65576:24;65587:2;65591:8;65576:10;:24::i;:::-;65430:178:::0;;:::o;63636:702::-;63837:4;63893:192;64075:9;;63893:192;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64029:8;64013:26;;64005:35;;63917:138;;;;;;;;:::i;:::-;;;;;;;;;;;;;63893:173;;;;;;:181;;:192;;;;:::i;:::-;63870:215;;:19;;;;;;;;;;;:215;;;:460;;;;;64143:187;64305:24;;64143:187;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64255:15;64167:118;;;;;;;;:::i;:::-;;;;;;;;;;;;;64143:153;;;;;;:161;;:187;;;;:::i;:::-;64120:210;;:19;;;;;;;;;;;:210;;;63870:460;63854:476;;63636:702;;;;;;;;:::o;39912:713::-;39979:7;39999:22;40024:13;;;;;;;;;;39999:38;;;;40048:19;40243:9;40238:328;40258:14;40254:1;:18;40238:328;;;40298:31;40332:11;:14;40344:1;40332:14;;;;;;;;;;;40298:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40370:9;:16;;;40365:186;;40430:5;40415:11;:20;40411:85;;;40471:1;40464:8;;;;;;;;40411:85;40518:13;;;;;;;40365:186;40279:287;40274:3;;;;;;;40238:328;;;;40594:23;;;;;;;;;;;;;;39912:713;;;;:::o;59977:1019::-;60130:13;;;;;;;;;;;60122:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;60206:194;60390:9;;60206:194;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60342:10;60326:28;;60318:37;;60230:140;;;;;;;;:::i;:::-;;;;;;;;;;;;;60206:175;;;;;;:183;;:194;;;;:::i;:::-;60183:217;;:19;;;;;;;;;;;:217;;;60175:263;;;;;;;;;;;;:::i;:::-;;;;;;;;;60482:187;60644:24;;60482:187;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60594:15;60506:118;;;;;;;;:::i;:::-;;;;;;;;;;;;;60482:153;;;;;;:161;;:187;;;;:::i;:::-;60459:210;;:19;;;;;;;;;;;:210;;;60451:256;;;;;;;;;;;;:::i;:::-;;;;;;;;;60796:8;60761:18;:32;60780:12;:10;:12::i;:::-;60761:32;;;;;;;;;;;;;;;;:43;;;;:::i;:::-;60742:15;:62;;60720:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;60933:8;60898:18;:32;60917:12;:10;:12::i;:::-;60898:32;;;;;;;;;;;;;;;;:43;;;;:::i;:::-;60863:18;:32;60882:12;:10;:12::i;:::-;60863:32;;;;;;;;;;;;;;;:78;;;;60954:34;60965:12;:10;:12::i;:::-;60979:8;60954:10;:34::i;:::-;59977:1019;;;;;;:::o;64636:100::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64720:8:::1;64710:7;:18;;;;;;;;;;;;:::i;:::-;;64636:100:::0;:::o;59042:24::-;;;;;;;;;;;;;:::o;65217:103::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65297:15:::1;;;;;;;;;;;65296:16;65278:15;;:34;;;;;;;;;;;;;;;;;;65217:103::o:0;59137:34::-;;;:::o;44521:124::-;44585:7;44612:20;44624:7;44612:11;:20::i;:::-;:25;;;44605:32;;44521:124;;;:::o;42538:206::-;42602:7;42643:1;42626:19;;:5;:19;;;42622:60;;;42654:28;;;;;;;;;;;;;;42622:60;42708:12;:19;42721:5;42708:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;42700:36;;42693:43;;42538:206;;;:::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;64346:133::-;64416:7;64443:18;:28;64462:8;64443:28;;;;;;;;;;;;;;;;64436:35;;64346:133;;;:::o;58929:25::-;;;;;;;;;;;;;:::o;16372:87::-;16418:7;16445:6;;;;;;;;;;;16438:13;;16372:87;:::o;64744:86::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64816:6:::1;64808:5;:14;;;;64744:86:::0;:::o;44881:104::-;44937:13;44970:7;44963:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44881:104;:::o;58986:27::-;;;;;;;;;;;;;:::o;59089:20::-;;;;:::o;62177:445::-;62245:12;;;;;;;;;;;62237:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;62317:8;62309:5;;:16;;;;:::i;:::-;62296:9;:29;62288:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;62432:8;62398:17;:31;62416:12;:10;:12::i;:::-;62398:31;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;62378:16;:62;;62356:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;62559:8;62525:17;:31;62543:12;:10;:12::i;:::-;62525:31;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;62491:17;:31;62509:12;:10;:12::i;:::-;62491:31;;;;;;;;;;;;;;;:76;;;;62580:34;62591:12;:10;:12::i;:::-;62605:8;62580:10;:34::i;:::-;62177:445;:::o;46491:279::-;46594:12;:10;:12::i;:::-;46582:24;;:8;:24;;;46578:54;;;46615:17;;;;;;;;;;;;;;46578:54;46690:8;46645:18;:32;46664:12;:10;:12::i;:::-;46645:32;;;;;;;;;;;;;;;:42;46678:8;46645:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;46743:8;46714:48;;46729:12;:10;:12::i;:::-;46714:48;;;46753:8;46714:48;;;;;;:::i;:::-;;;;;;;;46491:279;;:::o;64838:127::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64944:13:::1;64922:19;;:35;;;;;;;;;;;;;;;;;;64838:127:::0;:::o;47569:342::-;47736:28;47746:4;47752:2;47756:7;47736:9;:28::i;:::-;47780:48;47803:4;47809:2;47813:7;47822:5;47780:22;:48::i;:::-;47775:129;;47852:40;;;;;;;;;;;;;;47775:129;47569:342;;;;:::o;65112:97::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65188:13:::1;;;;;;;;;;;65187:14;65171:13;;:30;;;;;;;;;;;;;;;;;;65112:97::o:0;45056:318::-;45129:13;45160:16;45168:7;45160;:16::i;:::-;45155:59;;45185:29;;;;;;;;;;;;;;45155:59;45227:21;45251:10;:8;:10::i;:::-;45227:34;;45304:1;45285:7;45279:21;:26;;:87;;;;;;;;;;;;;;;;;45332:7;45341:18;:7;:16;:18::i;:::-;45315:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45279:87;45272:94;;;45056:318;;;:::o;46841:164::-;46938:4;46962:18;:25;46981:5;46962:25;;;;;;;;;;;;;;;:35;46988:8;46962:35;;;;;;;;;;;;;;;;;;;;;;;;;46955:42;;46841:164;;;;:::o;62661:245::-;62754:12;;;;;;;;;;;62746:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;62826:8;62818:5;;:16;;;;:::i;:::-;62805:9;:29;62797:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;62867:31;62878:9;62889:8;62867:10;:31::i;:::-;62661:245;;:::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;64973:131::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65083:13:::1;65059:21;;:37;;;;;;;;;;;;;;;;;;64973:131:::0;:::o;29156:157::-;29241:4;29280:25;29265:40;;;:11;:40;;;;29258:47;;29156:157;;;:::o;48166:144::-;48223:4;48257:13;;;;;;;;;;;48247:23;;:7;:23;:55;;;;;48275:11;:20;48287:7;48275:20;;;;;;;;;;;:27;;;;;;;;;;;;48274:28;48247:55;48240:62;;48166:144;;;:::o;15096:98::-;15149:7;15176:10;15169:17;;15096:98;:::o;55382:196::-;55524:2;55497:15;:24;55513:7;55497:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;55562:7;55558:2;55542:28;;55551:5;55542:28;;;;;;;;;;;;55382:196;;;:::o;50883:2112::-;50998:35;51036:20;51048:7;51036:11;:20::i;:::-;50998:58;;51069:22;51111:13;:18;;;51095:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;51146:50;51163:13;:18;;;51183:12;:10;:12::i;:::-;51146:16;:50::i;:::-;51095:101;:154;;;;51237:12;:10;:12::i;:::-;51213:36;;:20;51225:7;51213:11;:20::i;:::-;:36;;;51095:154;51069:181;;51268:17;51263:66;;51294:35;;;;;;;;;;;;;;51263:66;51366:4;51344:26;;:13;:18;;;:26;;;51340:67;;51379:28;;;;;;;;;;;;;;51340:67;51436:1;51422:16;;:2;:16;;;51418:52;;;51447:23;;;;;;;;;;;;;;51418:52;51483:43;51505:4;51511:2;51515:7;51524:1;51483:21;:43::i;:::-;51591:49;51608:1;51612:7;51621:13;:18;;;51591:8;:49::i;:::-;51966:1;51936:12;:18;51949:4;51936:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52010:1;51982:12;:16;51995:2;51982:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52056:2;52028:11;:20;52040:7;52028:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;52118:15;52073:11;:20;52085:7;52073:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;52386:19;52418:1;52408:7;:11;52386:33;;52479:1;52438:43;;:11;:24;52450:11;52438:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;52434:445;;;52663:13;;;;;;;;;;52649:27;;:11;:27;52645:219;;;52733:13;:18;;;52701:11;:24;52713:11;52701:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;52816:13;:28;;;52774:11;:24;52786:11;52774:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;52645:219;52434:445;51911:979;52926:7;52922:2;52907:27;;52916:4;52907:27;;;;;;;;;;;;52945:42;52966:4;52972:2;52976:7;52985:1;52945:20;:42::i;:::-;50987:2008;;50883:2112;;;:::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;65616:176::-;65722:9;65705:13;:11;:13::i;:::-;65694:8;:24;;;;:::i;:::-;:37;;65686:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;65761:23;65771:2;65775:8;65761:9;:23::i;:::-;65616:176;;:::o;43376:1083::-;43437:21;;:::i;:::-;43471:12;43486:7;43471:22;;43542:13;;;;;;;;;;43535:20;;:4;:20;43531:861;;;43576:31;43610:11;:17;43622:4;43610:17;;;;;;;;;;;43576:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43651:9;:16;;;43646:731;;43722:1;43696:28;;:9;:14;;;:28;;;43692:101;;43760:9;43753:16;;;;;;43692:101;44097:261;44104:4;44097:261;;;44137:6;;;;;;;;44182:11;:17;44194:4;44182:17;;;;;;;;;;;44170:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44256:1;44230:28;;:9;:14;;;:28;;;44226:109;;44298:9;44291:16;;;;;;44226:109;44097:261;;;43646:731;43557:835;43531:861;44420:31;;;;;;;;;;;;;;43376:1083;;;;:::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;56143:790::-;56298:4;56319:15;:2;:13;;;:15::i;:::-;56315:611;;;56371:2;56355:36;;;56392:12;:10;:12::i;:::-;56406:4;56412:7;56421:5;56355:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;56351:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56618:1;56601:6;:13;:18;56597:259;;;56651:40;;;;;;;;;;;;;;56597:259;56806:6;56800:13;56791:6;56787:2;56783:15;56776:38;56351:520;56488:45;;;56478:55;;;:6;:55;;;;56471:62;;;;;56315:611;56910:4;56903:11;;56143:790;;;;;;;:::o;65997:100::-;66049:13;66082:7;66075:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65997:100;:::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;57581:159::-;;;;;:::o;58399:158::-;;;;;:::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;48318:104::-;48387:27;48397:2;48401:8;48387:27;;;;;;;;;;;;:9;:27::i;:::-;48318:104;;:::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;48785:163::-;48908:32;48914:2;48918:8;48928:5;48935:4;48908:5;:32::i;:::-;48785:163;;;:::o;49207:1422::-;49346:20;49369:13;;;;;;;;;;;49346:36;;;;49411:1;49397:16;;:2;:16;;;49393:48;;;49422:19;;;;;;;;;;;;;;49393:48;49468:1;49456:8;:13;49452:44;;;49478:18;;;;;;;;;;;;;;49452:44;49509:61;49539:1;49543:2;49547:12;49561:8;49509:21;:61::i;:::-;49883:8;49848:12;:16;49861:2;49848:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49947:8;49907:12;:16;49920:2;49907:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50006:2;49973:11;:25;49985:12;49973:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;50073:15;50023:11;:25;50035:12;50023:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;50106:20;50129:12;50106:35;;50163:9;50158:328;50178:8;50174:1;:12;50158:328;;;50242:12;50238:2;50217:38;;50234:1;50217:38;;;;;;;;;;;;50278:4;:68;;;;;50287:59;50318:1;50322:2;50326:12;50340:5;50287:22;:59::i;:::-;50286:60;50278:68;50274:164;;;50378:40;;;;;;;;;;;;;;50274:164;50456:14;;;;;;;50188:3;;;;;;;50158:328;;;;50526:12;50502:13;;:37;;;;;;;;;;;;;;;;;;49823:728;50561:60;50590:1;50594:2;50598:12;50612:8;50561:20;:60::i;:::-;49335:1294;49207:1422;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423: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:327::-;6249:6;6298:2;6286:9;6277:7;6273:23;6269:32;6266:119;;;6304:79;;:::i;:::-;6266:119;6424:1;6449:52;6493:7;6484:6;6473:9;6469:22;6449:52;:::i;:::-;6439:62;;6395:116;6191:327;;;;:::o;6524:349::-;6593:6;6642:2;6630:9;6621:7;6617:23;6613:32;6610:119;;;6648:79;;:::i;:::-;6610:119;6768:1;6793:63;6848:7;6839:6;6828:9;6824:22;6793:63;:::i;:::-;6783:73;;6739:127;6524:349;;;;:::o;6879:509::-;6948:6;6997:2;6985:9;6976:7;6972:23;6968:32;6965:119;;;7003:79;;:::i;:::-;6965:119;7151:1;7140:9;7136:17;7123:31;7181:18;7173:6;7170:30;7167:117;;;7203:79;;:::i;:::-;7167:117;7308:63;7363:7;7354:6;7343:9;7339:22;7308:63;:::i;:::-;7298:73;;7094:287;6879:509;;;;:::o;7394:329::-;7453:6;7502:2;7490:9;7481:7;7477:23;7473:32;7470:119;;;7508:79;;:::i;:::-;7470:119;7628:1;7653:53;7698:7;7689:6;7678:9;7674:22;7653:53;:::i;:::-;7643:63;;7599:117;7394:329;;;;:::o;7729:1161::-;7837:6;7845;7853;7861;7869;7877;7926:3;7914:9;7905:7;7901:23;7897:33;7894:120;;;7933:79;;:::i;:::-;7894:120;8053:1;8078:53;8123:7;8114:6;8103:9;8099:22;8078:53;:::i;:::-;8068:63;;8024:117;8208:2;8197:9;8193:18;8180:32;8239:18;8231:6;8228:30;8225:117;;;8261:79;;:::i;:::-;8225:117;8374:64;8430:7;8421:6;8410:9;8406:22;8374:64;:::i;:::-;8356:82;;;;8151:297;8515:2;8504:9;8500:18;8487:32;8546:18;8538:6;8535:30;8532:117;;;8568:79;;:::i;:::-;8532:117;8681:64;8737:7;8728:6;8717:9;8713:22;8681:64;:::i;:::-;8663:82;;;;8458:297;8794:2;8820:53;8865:7;8856:6;8845:9;8841:22;8820:53;:::i;:::-;8810:63;;8765:118;7729:1161;;;;;;;;:::o;8896:::-;9004:6;9012;9020;9028;9036;9044;9093:3;9081:9;9072:7;9068:23;9064:33;9061:120;;;9100:79;;:::i;:::-;9061:120;9220:1;9245:53;9290:7;9281:6;9270:9;9266:22;9245:53;:::i;:::-;9235:63;;9191:117;9375:2;9364:9;9360:18;9347:32;9406:18;9398:6;9395:30;9392:117;;;9428:79;;:::i;:::-;9392:117;9541:64;9597:7;9588:6;9577:9;9573:22;9541:64;:::i;:::-;9523:82;;;;9318:297;9682:2;9671:9;9667:18;9654:32;9713:18;9705:6;9702:30;9699:117;;;9735:79;;:::i;:::-;9699:117;9848:64;9904:7;9895:6;9884:9;9880:22;9848:64;:::i;:::-;9830:82;;;;9625:297;9961:2;9987:53;10032:7;10023:6;10012:9;10008:22;9987:53;:::i;:::-;9977:63;;9932:118;8896:1161;;;;;;;;:::o;10063:118::-;10150:24;10168:5;10150:24;:::i;:::-;10145:3;10138:37;10063:118;;:::o;10187:109::-;10268:21;10283:5;10268:21;:::i;:::-;10263:3;10256:34;10187:109;;:::o;10302:118::-;10389:24;10407:5;10389:24;:::i;:::-;10384:3;10377:37;10302:118;;:::o;10426:157::-;10531:45;10551:24;10569:5;10551:24;:::i;:::-;10531:45;:::i;:::-;10526:3;10519:58;10426:157;;:::o;10589:360::-;10675:3;10703:38;10735:5;10703:38;:::i;:::-;10757:70;10820:6;10815:3;10757:70;:::i;:::-;10750:77;;10836:52;10881:6;10876:3;10869:4;10862:5;10858:16;10836:52;:::i;:::-;10913:29;10935:6;10913:29;:::i;:::-;10908:3;10904:39;10897:46;;10679:270;10589:360;;;;:::o;10955:364::-;11043:3;11071:39;11104:5;11071:39;:::i;:::-;11126:71;11190:6;11185:3;11126:71;:::i;:::-;11119:78;;11206:52;11251:6;11246:3;11239:4;11232:5;11228:16;11206:52;:::i;:::-;11283:29;11305:6;11283:29;:::i;:::-;11278:3;11274:39;11267:46;;11047:272;10955:364;;;;:::o;11325:377::-;11431:3;11459:39;11492:5;11459:39;:::i;:::-;11514:89;11596:6;11591:3;11514:89;:::i;:::-;11507:96;;11612:52;11657:6;11652:3;11645:4;11638:5;11634:16;11612:52;:::i;:::-;11689:6;11684:3;11680:16;11673:23;;11435:267;11325:377;;;;:::o;11708:366::-;11850:3;11871:67;11935:2;11930:3;11871:67;:::i;:::-;11864:74;;11947:93;12036:3;11947:93;:::i;:::-;12065:2;12060:3;12056:12;12049:19;;11708:366;;;:::o;12080:::-;12222:3;12243:67;12307:2;12302:3;12243:67;:::i;:::-;12236:74;;12319:93;12408:3;12319:93;:::i;:::-;12437:2;12432:3;12428:12;12421:19;;12080:366;;;:::o;12452:::-;12594:3;12615:67;12679:2;12674:3;12615:67;:::i;:::-;12608:74;;12691:93;12780:3;12691:93;:::i;:::-;12809:2;12804:3;12800:12;12793:19;;12452:366;;;:::o;12824:402::-;12984:3;13005:85;13087:2;13082:3;13005:85;:::i;:::-;12998:92;;13099:93;13188:3;13099:93;:::i;:::-;13217:2;13212:3;13208:12;13201:19;;12824:402;;;:::o;13232:366::-;13374:3;13395:67;13459:2;13454:3;13395:67;:::i;:::-;13388:74;;13471:93;13560:3;13471:93;:::i;:::-;13589:2;13584:3;13580:12;13573:19;;13232:366;;;:::o;13604:::-;13746:3;13767:67;13831:2;13826:3;13767:67;:::i;:::-;13760:74;;13843:93;13932:3;13843:93;:::i;:::-;13961:2;13956:3;13952:12;13945:19;;13604:366;;;:::o;13976:::-;14118:3;14139:67;14203:2;14198:3;14139:67;:::i;:::-;14132:74;;14215:93;14304:3;14215:93;:::i;:::-;14333:2;14328:3;14324:12;14317:19;;13976:366;;;:::o;14348:::-;14490:3;14511:67;14575:2;14570:3;14511:67;:::i;:::-;14504:74;;14587:93;14676:3;14587:93;:::i;:::-;14705:2;14700:3;14696:12;14689:19;;14348:366;;;:::o;14720:::-;14862:3;14883:67;14947:2;14942:3;14883:67;:::i;:::-;14876:74;;14959:93;15048:3;14959:93;:::i;:::-;15077:2;15072:3;15068:12;15061:19;;14720:366;;;:::o;15092:::-;15234:3;15255:67;15319:2;15314:3;15255:67;:::i;:::-;15248:74;;15331:93;15420:3;15331:93;:::i;:::-;15449:2;15444:3;15440:12;15433:19;;15092:366;;;:::o;15464:::-;15606:3;15627:67;15691:2;15686:3;15627:67;:::i;:::-;15620:74;;15703:93;15792:3;15703:93;:::i;:::-;15821:2;15816:3;15812:12;15805:19;;15464:366;;;:::o;15836:::-;15978:3;15999:67;16063:2;16058:3;15999:67;:::i;:::-;15992:74;;16075:93;16164:3;16075:93;:::i;:::-;16193:2;16188:3;16184:12;16177:19;;15836:366;;;:::o;16208:::-;16350:3;16371:67;16435:2;16430:3;16371:67;:::i;:::-;16364:74;;16447:93;16536:3;16447:93;:::i;:::-;16565:2;16560:3;16556:12;16549:19;;16208:366;;;:::o;16580:::-;16722:3;16743:67;16807:2;16802:3;16743:67;:::i;:::-;16736:74;;16819:93;16908:3;16819:93;:::i;:::-;16937:2;16932:3;16928:12;16921:19;;16580:366;;;:::o;16952:::-;17094:3;17115:67;17179:2;17174:3;17115:67;:::i;:::-;17108:74;;17191:93;17280:3;17191:93;:::i;:::-;17309:2;17304:3;17300:12;17293:19;;16952:366;;;:::o;17324:::-;17466:3;17487:67;17551:2;17546:3;17487:67;:::i;:::-;17480:74;;17563:93;17652:3;17563:93;:::i;:::-;17681:2;17676:3;17672:12;17665:19;;17324:366;;;:::o;17696:::-;17838:3;17859:67;17923:2;17918:3;17859:67;:::i;:::-;17852:74;;17935:93;18024:3;17935:93;:::i;:::-;18053:2;18048:3;18044:12;18037:19;;17696:366;;;:::o;18068:398::-;18227:3;18248:83;18329:1;18324:3;18248:83;:::i;:::-;18241:90;;18340:93;18429:3;18340:93;:::i;:::-;18458:1;18453:3;18449:11;18442:18;;18068:398;;;:::o;18472:366::-;18614:3;18635:67;18699:2;18694:3;18635:67;:::i;:::-;18628:74;;18711:93;18800:3;18711:93;:::i;:::-;18829:2;18824:3;18820:12;18813:19;;18472:366;;;:::o;18844:::-;18986:3;19007:67;19071:2;19066:3;19007:67;:::i;:::-;19000:74;;19083:93;19172:3;19083:93;:::i;:::-;19201:2;19196:3;19192:12;19185:19;;18844:366;;;:::o;19216:::-;19358:3;19379:67;19443:2;19438:3;19379:67;:::i;:::-;19372:74;;19455:93;19544:3;19455:93;:::i;:::-;19573:2;19568:3;19564:12;19557:19;;19216:366;;;:::o;19588:::-;19730:3;19751:67;19815:2;19810:3;19751:67;:::i;:::-;19744:74;;19827:93;19916:3;19827:93;:::i;:::-;19945:2;19940:3;19936:12;19929:19;;19588:366;;;:::o;19960:118::-;20047:24;20065:5;20047:24;:::i;:::-;20042:3;20035:37;19960:118;;:::o;20084:157::-;20189:45;20209:24;20227:5;20209:24;:::i;:::-;20189:45;:::i;:::-;20184:3;20177:58;20084:157;;:::o;20247:112::-;20330:22;20346:5;20330:22;:::i;:::-;20325:3;20318:35;20247:112;;:::o;20365:435::-;20545:3;20567:95;20658:3;20649:6;20567:95;:::i;:::-;20560:102;;20679:95;20770:3;20761:6;20679:95;:::i;:::-;20672:102;;20791:3;20784:10;;20365:435;;;;;:::o;20806:522::-;21019:3;21041:148;21185:3;21041:148;:::i;:::-;21034:155;;21199:75;21270:3;21261:6;21199:75;:::i;:::-;21299:2;21294:3;21290:12;21283:19;;21319:3;21312:10;;20806:522;;;;:::o;21334:::-;21547:3;21569:148;21713:3;21569:148;:::i;:::-;21562:155;;21727:75;21798:3;21789:6;21727:75;:::i;:::-;21827:2;21822:3;21818:12;21811:19;;21847:3;21840:10;;21334:522;;;;:::o;21862:379::-;22046:3;22068:147;22211:3;22068:147;:::i;:::-;22061:154;;22232:3;22225:10;;21862:379;;;:::o;22247:222::-;22340:4;22378:2;22367:9;22363:18;22355:26;;22391:71;22459:1;22448:9;22444:17;22435:6;22391:71;:::i;:::-;22247:222;;;;:::o;22475:640::-;22670:4;22708:3;22697:9;22693:19;22685:27;;22722:71;22790:1;22779:9;22775:17;22766:6;22722:71;:::i;:::-;22803:72;22871:2;22860:9;22856:18;22847:6;22803:72;:::i;:::-;22885;22953:2;22942:9;22938:18;22929:6;22885:72;:::i;:::-;23004:9;22998:4;22994:20;22989:2;22978:9;22974:18;22967:48;23032:76;23103:4;23094:6;23032:76;:::i;:::-;23024:84;;22475:640;;;;;;;:::o;23121:210::-;23208:4;23246:2;23235:9;23231:18;23223:26;;23259:65;23321:1;23310:9;23306:17;23297:6;23259:65;:::i;:::-;23121:210;;;;:::o;23337:545::-;23510:4;23548:3;23537:9;23533:19;23525:27;;23562:71;23630:1;23619:9;23615:17;23606:6;23562:71;:::i;:::-;23643:68;23707:2;23696:9;23692:18;23683:6;23643:68;:::i;:::-;23721:72;23789:2;23778:9;23774:18;23765:6;23721:72;:::i;:::-;23803;23871:2;23860:9;23856:18;23847:6;23803:72;:::i;:::-;23337:545;;;;;;;:::o;23888:313::-;24001:4;24039:2;24028:9;24024:18;24016:26;;24088:9;24082:4;24078:20;24074:1;24063:9;24059:17;24052:47;24116:78;24189:4;24180:6;24116:78;:::i;:::-;24108:86;;23888:313;;;;:::o;24207:419::-;24373:4;24411:2;24400:9;24396:18;24388:26;;24460:9;24454:4;24450:20;24446:1;24435:9;24431:17;24424:47;24488:131;24614:4;24488:131;:::i;:::-;24480:139;;24207:419;;;:::o;24632:::-;24798:4;24836:2;24825:9;24821:18;24813:26;;24885:9;24879:4;24875:20;24871:1;24860:9;24856:17;24849:47;24913:131;25039:4;24913:131;:::i;:::-;24905:139;;24632:419;;;:::o;25057:::-;25223:4;25261:2;25250:9;25246:18;25238:26;;25310:9;25304:4;25300:20;25296:1;25285:9;25281:17;25274:47;25338:131;25464:4;25338:131;:::i;:::-;25330:139;;25057:419;;;:::o;25482:::-;25648:4;25686:2;25675:9;25671:18;25663:26;;25735:9;25729:4;25725:20;25721:1;25710:9;25706:17;25699:47;25763:131;25889:4;25763:131;:::i;:::-;25755:139;;25482:419;;;:::o;25907:::-;26073:4;26111:2;26100:9;26096:18;26088:26;;26160:9;26154:4;26150:20;26146:1;26135:9;26131:17;26124:47;26188:131;26314:4;26188:131;:::i;:::-;26180:139;;25907:419;;;:::o;26332:::-;26498:4;26536:2;26525:9;26521:18;26513:26;;26585:9;26579:4;26575:20;26571:1;26560:9;26556:17;26549:47;26613:131;26739:4;26613:131;:::i;:::-;26605:139;;26332:419;;;:::o;26757:::-;26923:4;26961:2;26950:9;26946:18;26938:26;;27010:9;27004:4;27000:20;26996:1;26985:9;26981:17;26974:47;27038:131;27164:4;27038:131;:::i;:::-;27030:139;;26757:419;;;:::o;27182:::-;27348:4;27386:2;27375:9;27371:18;27363:26;;27435:9;27429:4;27425:20;27421:1;27410:9;27406:17;27399:47;27463:131;27589:4;27463:131;:::i;:::-;27455:139;;27182:419;;;:::o;27607:::-;27773:4;27811:2;27800:9;27796:18;27788:26;;27860:9;27854:4;27850:20;27846:1;27835:9;27831:17;27824:47;27888:131;28014:4;27888:131;:::i;:::-;27880:139;;27607:419;;;:::o;28032:::-;28198:4;28236:2;28225:9;28221:18;28213:26;;28285:9;28279:4;28275:20;28271:1;28260:9;28256:17;28249:47;28313:131;28439:4;28313:131;:::i;:::-;28305:139;;28032:419;;;:::o;28457:::-;28623:4;28661:2;28650:9;28646:18;28638:26;;28710:9;28704:4;28700:20;28696:1;28685:9;28681:17;28674:47;28738:131;28864:4;28738:131;:::i;:::-;28730:139;;28457:419;;;:::o;28882:::-;29048:4;29086:2;29075:9;29071:18;29063:26;;29135:9;29129:4;29125:20;29121:1;29110:9;29106:17;29099:47;29163:131;29289:4;29163:131;:::i;:::-;29155:139;;28882:419;;;:::o;29307:::-;29473:4;29511:2;29500:9;29496:18;29488:26;;29560:9;29554:4;29550:20;29546:1;29535:9;29531:17;29524:47;29588:131;29714:4;29588:131;:::i;:::-;29580:139;;29307:419;;;:::o;29732:::-;29898:4;29936:2;29925:9;29921:18;29913:26;;29985:9;29979:4;29975:20;29971:1;29960:9;29956:17;29949:47;30013:131;30139:4;30013:131;:::i;:::-;30005:139;;29732:419;;;:::o;30157:::-;30323:4;30361:2;30350:9;30346:18;30338:26;;30410:9;30404:4;30400:20;30396:1;30385:9;30381:17;30374:47;30438:131;30564:4;30438:131;:::i;:::-;30430:139;;30157:419;;;:::o;30582:::-;30748:4;30786:2;30775:9;30771:18;30763:26;;30835:9;30829:4;30825:20;30821:1;30810:9;30806:17;30799:47;30863:131;30989:4;30863:131;:::i;:::-;30855:139;;30582:419;;;:::o;31007:::-;31173:4;31211:2;31200:9;31196:18;31188:26;;31260:9;31254:4;31250:20;31246:1;31235:9;31231:17;31224:47;31288:131;31414:4;31288:131;:::i;:::-;31280:139;;31007:419;;;:::o;31432:::-;31598:4;31636:2;31625:9;31621:18;31613:26;;31685:9;31679:4;31675:20;31671:1;31660:9;31656:17;31649:47;31713:131;31839:4;31713:131;:::i;:::-;31705:139;;31432:419;;;:::o;31857:::-;32023:4;32061:2;32050:9;32046:18;32038:26;;32110:9;32104:4;32100:20;32096:1;32085:9;32081:17;32074:47;32138:131;32264:4;32138:131;:::i;:::-;32130:139;;31857:419;;;:::o;32282:::-;32448:4;32486:2;32475:9;32471:18;32463:26;;32535:9;32529:4;32525:20;32521:1;32510:9;32506:17;32499:47;32563:131;32689:4;32563:131;:::i;:::-;32555:139;;32282:419;;;:::o;32707:222::-;32800:4;32838:2;32827:9;32823:18;32815:26;;32851:71;32919:1;32908:9;32904:17;32895:6;32851:71;:::i;:::-;32707:222;;;;:::o;32935:129::-;32969:6;32996:20;;:::i;:::-;32986:30;;33025:33;33053:4;33045:6;33025:33;:::i;:::-;32935:129;;;:::o;33070:75::-;33103:6;33136:2;33130:9;33120:19;;33070:75;:::o;33151:307::-;33212:4;33302:18;33294:6;33291:30;33288:56;;;33324:18;;:::i;:::-;33288:56;33362:29;33384:6;33362:29;:::i;:::-;33354:37;;33446:4;33440;33436:15;33428:23;;33151:307;;;:::o;33464:308::-;33526:4;33616:18;33608:6;33605:30;33602:56;;;33638:18;;:::i;:::-;33602:56;33676:29;33698:6;33676:29;:::i;:::-;33668:37;;33760:4;33754;33750:15;33742:23;;33464:308;;;:::o;33778:98::-;33829:6;33863:5;33857:12;33847:22;;33778:98;;;:::o;33882:99::-;33934:6;33968:5;33962:12;33952:22;;33882:99;;;:::o;33987:168::-;34070:11;34104:6;34099:3;34092:19;34144:4;34139:3;34135:14;34120:29;;33987:168;;;;:::o;34161:147::-;34262:11;34299:3;34284:18;;34161:147;;;;:::o;34314:169::-;34398:11;34432:6;34427:3;34420:19;34472:4;34467:3;34463:14;34448:29;;34314:169;;;;:::o;34489:148::-;34591:11;34628:3;34613:18;;34489:148;;;;:::o;34643:305::-;34683:3;34702:20;34720:1;34702:20;:::i;:::-;34697:25;;34736:20;34754:1;34736:20;:::i;:::-;34731:25;;34890:1;34822:66;34818:74;34815:1;34812:81;34809:107;;;34896:18;;:::i;:::-;34809:107;34940:1;34937;34933:9;34926:16;;34643:305;;;;:::o;34954:185::-;34994:1;35011:20;35029:1;35011:20;:::i;:::-;35006:25;;35045:20;35063:1;35045:20;:::i;:::-;35040:25;;35084:1;35074:35;;35089:18;;:::i;:::-;35074:35;35131:1;35128;35124:9;35119:14;;34954:185;;;;:::o;35145:348::-;35185:7;35208:20;35226:1;35208:20;:::i;:::-;35203:25;;35242:20;35260:1;35242:20;:::i;:::-;35237:25;;35430:1;35362:66;35358:74;35355:1;35352:81;35347:1;35340:9;35333:17;35329:105;35326:131;;;35437:18;;:::i;:::-;35326:131;35485:1;35482;35478:9;35467:20;;35145:348;;;;:::o;35499:191::-;35539:4;35559:20;35577:1;35559:20;:::i;:::-;35554:25;;35593:20;35611:1;35593:20;:::i;:::-;35588:25;;35632:1;35629;35626:8;35623:34;;;35637:18;;:::i;:::-;35623:34;35682:1;35679;35675:9;35667:17;;35499:191;;;;:::o;35696:96::-;35733:7;35762:24;35780:5;35762:24;:::i;:::-;35751:35;;35696:96;;;:::o;35798:90::-;35832:7;35875:5;35868:13;35861:21;35850:32;;35798:90;;;:::o;35894:77::-;35931:7;35960:5;35949:16;;35894:77;;;:::o;35977:149::-;36013:7;36053:66;36046:5;36042:78;36031:89;;35977:149;;;:::o;36132:126::-;36169:7;36209:42;36202:5;36198:54;36187:65;;36132:126;;;:::o;36264:77::-;36301:7;36330:5;36319:16;;36264:77;;;:::o;36347:86::-;36382:7;36422:4;36415:5;36411:16;36400:27;;36347:86;;;:::o;36439:154::-;36523:6;36518:3;36513;36500:30;36585:1;36576:6;36571:3;36567:16;36560:27;36439:154;;;:::o;36599:307::-;36667:1;36677:113;36691:6;36688:1;36685:13;36677:113;;;36776:1;36771:3;36767:11;36761:18;36757:1;36752:3;36748:11;36741:39;36713:2;36710:1;36706:10;36701:15;;36677:113;;;36808:6;36805:1;36802:13;36799:101;;;36888:1;36879:6;36874:3;36870:16;36863:27;36799:101;36648:258;36599:307;;;:::o;36912:320::-;36956:6;36993:1;36987:4;36983:12;36973:22;;37040:1;37034:4;37030:12;37061:18;37051:81;;37117:4;37109:6;37105:17;37095:27;;37051:81;37179:2;37171:6;37168:14;37148:18;37145:38;37142:84;;;37198:18;;:::i;:::-;37142:84;36963:269;36912:320;;;:::o;37238:281::-;37321:27;37343:4;37321:27;:::i;:::-;37313:6;37309:40;37451:6;37439:10;37436:22;37415:18;37403:10;37400:34;37397:62;37394:88;;;37462:18;;:::i;:::-;37394:88;37502:10;37498:2;37491:22;37281:238;37238:281;;:::o;37525:233::-;37564:3;37587:24;37605:5;37587:24;:::i;:::-;37578:33;;37633:66;37626:5;37623:77;37620:103;;;37703:18;;:::i;:::-;37620:103;37750:1;37743:5;37739:13;37732:20;;37525:233;;;:::o;37764:79::-;37803:7;37832:5;37821:16;;37764:79;;;:::o;37849:::-;37888:7;37917:5;37906:16;;37849:79;;;:::o;37934:176::-;37966:1;37983:20;38001:1;37983:20;:::i;:::-;37978:25;;38017:20;38035:1;38017:20;:::i;:::-;38012:25;;38056:1;38046:35;;38061:18;;:::i;:::-;38046:35;38102:1;38099;38095:9;38090:14;;37934:176;;;;:::o;38116:180::-;38164:77;38161:1;38154:88;38261:4;38258:1;38251:15;38285:4;38282:1;38275:15;38302:180;38350:77;38347:1;38340:88;38447:4;38444:1;38437:15;38471:4;38468:1;38461:15;38488:180;38536:77;38533:1;38526:88;38633:4;38630:1;38623:15;38657:4;38654:1;38647:15;38674:180;38722:77;38719:1;38712:88;38819:4;38816:1;38809:15;38843:4;38840:1;38833:15;38860:180;38908:77;38905:1;38898:88;39005:4;39002:1;38995:15;39029:4;39026:1;39019:15;39046:180;39094:77;39091:1;39084:88;39191:4;39188:1;39181:15;39215:4;39212:1;39205:15;39232:117;39341:1;39338;39331:12;39355:117;39464:1;39461;39454:12;39478:117;39587:1;39584;39577:12;39601:117;39710:1;39707;39700:12;39724:117;39833:1;39830;39823:12;39847:117;39956:1;39953;39946:12;39970:102;40011:6;40062:2;40058:7;40053:2;40046:5;40042:14;40038:28;40028:38;;39970:102;;;:::o;40078:174::-;40218:26;40214:1;40206:6;40202:14;40195:50;40078:174;:::o;40258:165::-;40398:17;40394:1;40386:6;40382:14;40375:41;40258:165;:::o;40429:181::-;40569:33;40565:1;40557:6;40553:14;40546:57;40429:181;:::o;40616:214::-;40756:66;40752:1;40744:6;40740:14;40733:90;40616:214;:::o;40836:225::-;40976:34;40972:1;40964:6;40960:14;40953:58;41045:8;41040:2;41032:6;41028:15;41021:33;40836:225;:::o;41067:165::-;41207:17;41203:1;41195:6;41191:14;41184:41;41067:165;:::o;41238:162::-;41378:14;41374:1;41366:6;41362:14;41355:38;41238:162;:::o;41406:181::-;41546:33;41542:1;41534:6;41530:14;41523:57;41406:181;:::o;41593:221::-;41733:34;41729:1;41721:6;41717:14;41710:58;41802:4;41797:2;41789:6;41785:15;41778:29;41593:221;:::o;41820:168::-;41960:20;41956:1;41948:6;41944:14;41937:44;41820:168;:::o;41994:160::-;42134:12;42130:1;42122:6;42118:14;42111:36;41994:160;:::o;42160:168::-;42300:20;42296:1;42288:6;42284:14;42277:44;42160:168;:::o;42334:166::-;42474:18;42470:1;42462:6;42458:14;42451:42;42334:166;:::o;42506:221::-;42646:34;42642:1;42634:6;42630:14;42623:58;42715:4;42710:2;42702:6;42698:15;42691:29;42506:221;:::o;42733:182::-;42873:34;42869:1;42861:6;42857:14;42850:58;42733:182;:::o;42921:220::-;43061:34;43057:1;43049:6;43045:14;43038:58;43130:3;43125:2;43117:6;43113:15;43106:28;42921:220;:::o;43147:223::-;43287:34;43283:1;43275:6;43271:14;43264:58;43356:6;43351:2;43343:6;43339:15;43332:31;43147:223;:::o;43376:114::-;;:::o;43496:166::-;43636:18;43632:1;43624:6;43620:14;43613:42;43496:166;:::o;43668:220::-;43808:34;43804:1;43796:6;43792:14;43785:58;43877:3;43872:2;43864:6;43860:15;43853:28;43668:220;:::o;43894:177::-;44034:29;44030:1;44022:6;44018:14;44011:53;43894:177;:::o;44077:181::-;44217:33;44213:1;44205:6;44201:14;44194:57;44077:181;:::o;44264:122::-;44337:24;44355:5;44337:24;:::i;:::-;44330:5;44327:35;44317:63;;44376:1;44373;44366:12;44317:63;44264:122;:::o;44392:116::-;44462:21;44477:5;44462:21;:::i;:::-;44455:5;44452:32;44442:60;;44498:1;44495;44488:12;44442:60;44392:116;:::o;44514:120::-;44586:23;44603:5;44586:23;:::i;:::-;44579:5;44576:34;44566:62;;44624:1;44621;44614:12;44566:62;44514:120;:::o;44640:122::-;44713:24;44731:5;44713:24;:::i;:::-;44706:5;44703:35;44693:63;;44752:1;44749;44742:12;44693:63;44640:122;:::o

Swarm Source

ipfs://b3f490c5807bcd0f953f6d96d02ccd4e62e1ac4add6c4f67dcc275eece97090e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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