ETH Price: $2,020.70 (-1.42%)

Token

Big Bugs NFT (BBNFT)
 

Overview

Max Total Supply

84 BBNFT

Holders

41

Transfers

-
0

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
BigBugs

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2021-11-23
*/

// File: @openzeppelin/contracts/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;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 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 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/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/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



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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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



pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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



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



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



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



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



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 tokenId);

    /**
     * @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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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



pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/BigBugs.sol



pragma solidity ^0.8.0;





contract BigBugs is ERC721Enumerable, Ownable {
    using Strings for uint256;

    using ECDSA for bytes32;

    string public baseURI;
    string public extension = ".json";
    uint256 public cost = 0.05 ether;
    uint256 public maxSupply = 10000;
    uint public maxMintAmount = 20;
    bool public paused = false;
    bool public preSale = false;
    address public signer;
    address public deployer;
    uint public constant PRESALE_MAX_PER_WALLET = 3;
    mapping(address => uint) private presaleMinted;

    //    mapping(address => bool) public whitelist;

    constructor(string memory _name, string memory _symbol, string memory _initBaseURI) ERC721 (_name, _symbol){
        setBaseURI(_initBaseURI);
        deployer = msg.sender;
    }

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

    function mint(uint _mintAmount) public payable {
        require(!paused, "Minting currently on hold");
        require(!preSale, "Minting is in pre-sale mode");
        mintX(_mintAmount);
    }


    function presaleMint(uint _mintAmount, bytes memory signature) public payable {
        require(preSale, "Pre-sale is not currently running");
        address recover = recoverSignerAddress(msg.sender, signature);
        require((recover == signer || recover == deployer), "Address not whitelisted for presale");
        require(presaleMinted[msg.sender] + _mintAmount <= PRESALE_MAX_PER_WALLET, "Minting would exceed max per wallet for presale");
        mintX(_mintAmount);
    }

    function mintX(uint _mintAmount) private {
        uint256 supply = totalSupply();
        require(_mintAmount > 0, "Amount to mint can not be 0");
        require(_mintAmount <= maxMintAmount, "Maximum mint amount exceeded");
        require(supply + _mintAmount <= maxSupply, "Purchase would exceed max supply of NFT");


        if (msg.sender != owner()) {
            if (preSale) {
                presaleMinted[msg.sender] += _mintAmount;
            }
            require(msg.value >= cost * _mintAmount, "Amount sent less than the cost of minting NFT(s)");
        }

        for (uint256 i = 1; i <= _mintAmount; i++) {
            _safeMint(msg.sender, supply + i);
        }
    }

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

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory){

        require(_exists(tokenId), "ERC721Metadata: tokenURI queried for nonexistent token");
        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString(), extension)) : "";
    }

    //
    function hashTransaction(address minter) private pure returns (bytes32) {
        bytes32 argsHash = keccak256(abi.encodePacked(minter));
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", argsHash));
    }

    function recoverSignerAddress(address minter, bytes memory signature) private pure returns (address) {
        bytes32 hash = hashTransaction(minter);
        return hash.recover(signature);
    }

    function setSigner(address _signer) public onlyOwner() {
        signer = _signer;
    }

    function setCost(uint256 _cost) public onlyOwner() {
        cost = _cost;
    }

    function setMaxMintAmount(uint256 _maxMintAmount) public onlyOwner() {
        maxMintAmount = _maxMintAmount;
    }

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

    function togglePause() public onlyOwner() {
        paused = !paused;
    }

    function togglePreSale() public onlyOwner() {
        preSale = !preSale;
    }

    function configure(uint256 _cost, bool _paused, bool _preSale, uint256 _maxMintAmount, address _signer) public onlyOwner() {
        cost = _cost;
        paused = _paused;
        preSale = _preSale;
        maxMintAmount = _maxMintAmount;
        signer = _signer;
    }

    function withdraw() public payable onlyOwner() {
        //        require(payable(msg.sender).send(address(this).balance));

        (bool success,) = address(msg.sender).call{value : address(this).balance}("");
        require(success, "Unable to withdraw balance");
    }

}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"PRESALE_MAX_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"},{"internalType":"bool","name":"_paused","type":"bool"},{"internalType":"bool","name":"_preSale","type":"bool"},{"internalType":"uint256","name":"_maxMintAmount","type":"uint256"},{"internalType":"address","name":"_signer","type":"address"}],"name":"configure","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deployer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"extension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmount","type":"uint256"}],"name":"setMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePreSale","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":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c90805190602001906200005192919062000325565b5066b1a2bc2ec50000600d55612710600e556014600f556000601060006101000a81548160ff0219169083151502179055506000601060016101000a81548160ff021916908315150217905550348015620000ab57600080fd5b5060405162005da038038062005da08339818101604052810190620000d1919062000453565b82828160009080519060200190620000eb92919062000325565b5080600190805190602001906200010492919062000325565b505050620001276200011b6200018260201b60201c565b6200018a60201b60201c565b62000138816200025060201b60201c565b33601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505062000713565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002606200018260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000286620002fb60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002df576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002d69062000533565b60405180910390fd5b80600b9080519060200190620002f792919062000325565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200033390620005fb565b90600052602060002090601f016020900481019282620003575760008555620003a3565b82601f106200037257805160ff1916838001178555620003a3565b82800160010185558215620003a3579182015b82811115620003a257825182559160200191906001019062000385565b5b509050620003b29190620003b6565b5090565b5b80821115620003d1576000816000905550600101620003b7565b5090565b6000620003ec620003e6846200057e565b62000555565b9050828152602081018484840111156200040b576200040a620006ca565b5b62000418848285620005c5565b509392505050565b600082601f830112620004385762000437620006c5565b5b81516200044a848260208601620003d5565b91505092915050565b6000806000606084860312156200046f576200046e620006d4565b5b600084015167ffffffffffffffff81111562000490576200048f620006cf565b5b6200049e8682870162000420565b935050602084015167ffffffffffffffff811115620004c257620004c1620006cf565b5b620004d08682870162000420565b925050604084015167ffffffffffffffff811115620004f457620004f3620006cf565b5b620005028682870162000420565b9150509250925092565b60006200051b602083620005b4565b91506200052882620006ea565b602082019050919050565b600060208201905081810360008301526200054e816200050c565b9050919050565b60006200056162000574565b90506200056f828262000631565b919050565b6000604051905090565b600067ffffffffffffffff8211156200059c576200059b62000696565b5b620005a782620006d9565b9050602081019050919050565b600082825260208201905092915050565b60005b83811015620005e5578082015181840152602081019050620005c8565b83811115620005f5576000848401525b50505050565b600060028204905060018216806200061457607f821691505b602082108114156200062b576200062a62000667565b5b50919050565b6200063c82620006d9565b810181811067ffffffffffffffff821117156200065e576200065d62000696565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b61567d80620007236000396000f3fe60806040526004361061023b5760003560e01c80635e7ac1381161012e578063a22cb465116100ab578063d5abeb011161006f578063d5abeb0114610831578063d5f394881461085c578063e985e9c514610887578063f2fde38b146108c4578063fd24a854146108ed5761023b565b8063a22cb46514610774578063b88d4fde1461079d578063c4ae3168146107c6578063c87b56dd146107dd578063ca3cb5221461081a5761023b565b8063715018a6116100f2578063715018a6146106c257806384864129146106d95780638da5cb5b1461070257806395d89b411461072d578063a0712d68146107585761023b565b80635e7ac138146105c95780636352211e146105f45780636c0360eb146106315780636c19e7831461065c57806370a08231146106855761023b565b80632d5537b0116101bc57806344a0d68a1161018057806344a0d68a146104e45780634f6ccce71461050d57806355f804b31461054a5780635a7adf7f146105735780635c975abb1461059e5761023b565b80632d5537b01461040c5780632f745c59146104375780633ccfd60b1461047457806342842e0e1461047e578063438b6300146104a75761023b565b806313faede61161020357806313faede61461033757806318160ddd14610362578063238ac9331461038d578063239c70ae146103b857806323b872dd146103e35761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063088a4ed0146102e5578063095ea7b31461030e575b600080fd5b34801561024c57600080fd5b50610267600480360381019061026291906139dc565b610909565b6040516102749190614359565b60405180910390f35b34801561028957600080fd5b50610292610983565b60405161029f91906143b9565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190613a7f565b610a15565b6040516102dc91906142d0565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613a7f565b610a9a565b005b34801561031a57600080fd5b506103356004803603810190610330919061399c565b610b20565b005b34801561034357600080fd5b5061034c610c38565b60405161035991906147db565b60405180910390f35b34801561036e57600080fd5b50610377610c3e565b60405161038491906147db565b60405180910390f35b34801561039957600080fd5b506103a2610c4b565b6040516103af91906142d0565b60405180910390f35b3480156103c457600080fd5b506103cd610c71565b6040516103da91906147db565b60405180910390f35b3480156103ef57600080fd5b5061040a60048036038101906104059190613886565b610c77565b005b34801561041857600080fd5b50610421610cd7565b60405161042e91906143b9565b60405180910390f35b34801561044357600080fd5b5061045e6004803603810190610459919061399c565b610d65565b60405161046b91906147db565b60405180910390f35b61047c610e0a565b005b34801561048a57600080fd5b506104a560048036038101906104a09190613886565b610f35565b005b3480156104b357600080fd5b506104ce60048036038101906104c99190613819565b610f55565b6040516104db9190614337565b60405180910390f35b3480156104f057600080fd5b5061050b60048036038101906105069190613a7f565b611003565b005b34801561051957600080fd5b50610534600480360381019061052f9190613a7f565b611089565b60405161054191906147db565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c9190613a36565b6110fa565b005b34801561057f57600080fd5b50610588611190565b6040516105959190614359565b60405180910390f35b3480156105aa57600080fd5b506105b36111a3565b6040516105c09190614359565b60405180910390f35b3480156105d557600080fd5b506105de6111b6565b6040516105eb91906147db565b60405180910390f35b34801561060057600080fd5b5061061b60048036038101906106169190613a7f565b6111bb565b60405161062891906142d0565b60405180910390f35b34801561063d57600080fd5b5061064661126d565b60405161065391906143b9565b60405180910390f35b34801561066857600080fd5b50610683600480360381019061067e9190613819565b6112fb565b005b34801561069157600080fd5b506106ac60048036038101906106a79190613819565b6113bb565b6040516106b991906147db565b60405180910390f35b3480156106ce57600080fd5b506106d7611473565b005b3480156106e557600080fd5b5061070060048036038101906106fb9190613aac565b6114fb565b005b34801561070e57600080fd5b50610717611601565b60405161072491906142d0565b60405180910390f35b34801561073957600080fd5b5061074261162b565b60405161074f91906143b9565b60405180910390f35b610772600480360381019061076d9190613a7f565b6116bd565b005b34801561078057600080fd5b5061079b6004803603810190610796919061395c565b611769565b005b3480156107a957600080fd5b506107c460048036038101906107bf91906138d9565b6118ea565b005b3480156107d257600080fd5b506107db61194c565b005b3480156107e957600080fd5b5061080460048036038101906107ff9190613a7f565b6119f4565b60405161081191906143b9565b60405180910390f35b34801561082657600080fd5b5061082f611a9f565b005b34801561083d57600080fd5b50610846611b47565b60405161085391906147db565b60405180910390f35b34801561086857600080fd5b50610871611b4d565b60405161087e91906142d0565b60405180910390f35b34801561089357600080fd5b506108ae60048036038101906108a99190613846565b611b73565b6040516108bb9190614359565b60405180910390f35b3480156108d057600080fd5b506108eb60048036038101906108e69190613819565b611c07565b005b61090760048036038101906109029190613b27565b611cff565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061097c575061097b82611ee0565b5b9050919050565b60606000805461099290614afb565b80601f01602080910402602001604051908101604052809291908181526020018280546109be90614afb565b8015610a0b5780601f106109e057610100808354040283529160200191610a0b565b820191906000526020600020905b8154815290600101906020018083116109ee57829003601f168201915b5050505050905090565b6000610a2082611fc2565b610a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a569061467b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610aa261202e565b73ffffffffffffffffffffffffffffffffffffffff16610ac0611601565b73ffffffffffffffffffffffffffffffffffffffff1614610b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0d9061469b565b60405180910390fd5b80600f8190555050565b6000610b2b826111bb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b939061473b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bbb61202e565b73ffffffffffffffffffffffffffffffffffffffff161480610bea5750610be981610be461202e565b611b73565b5b610c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c20906145bb565b60405180910390fd5b610c338383612036565b505050565b600d5481565b6000600880549050905090565b601060029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b610c88610c8261202e565b826120ef565b610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbe9061475b565b60405180910390fd5b610cd28383836121cd565b505050565b600c8054610ce490614afb565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1090614afb565b8015610d5d5780601f10610d3257610100808354040283529160200191610d5d565b820191906000526020600020905b815481529060010190602001808311610d4057829003601f168201915b505050505081565b6000610d70836113bb565b8210610db1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da89061443b565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e1261202e565b73ffffffffffffffffffffffffffffffffffffffff16610e30611601565b73ffffffffffffffffffffffffffffffffffffffff1614610e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7d9061469b565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610eac906142bb565b60006040518083038185875af1925050503d8060008114610ee9576040519150601f19603f3d011682016040523d82523d6000602084013e610eee565b606091505b5050905080610f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f29906146db565b60405180910390fd5b50565b610f50838383604051806020016040528060008152506118ea565b505050565b60606000610f62836113bb565b905060008167ffffffffffffffff811115610f8057610f7f614d20565b5b604051908082528060200260200182016040528015610fae5781602001602082028036833780820191505090505b50905060005b82811015610ff857610fc68582610d65565b828281518110610fd957610fd8614cf1565b5b6020026020010181815250508080610ff090614b5e565b915050610fb4565b508092505050919050565b61100b61202e565b73ffffffffffffffffffffffffffffffffffffffff16611029611601565b73ffffffffffffffffffffffffffffffffffffffff161461107f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110769061469b565b60405180910390fd5b80600d8190555050565b6000611093610c3e565b82106110d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cb9061479b565b60405180910390fd5b600882815481106110e8576110e7614cf1565b5b90600052602060002001549050919050565b61110261202e565b73ffffffffffffffffffffffffffffffffffffffff16611120611601565b73ffffffffffffffffffffffffffffffffffffffff1614611176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116d9061469b565b60405180910390fd5b80600b908051906020019061118c92919061362d565b5050565b601060019054906101000a900460ff1681565b601060009054906101000a900460ff1681565b600381565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125b906145fb565b60405180910390fd5b80915050919050565b600b805461127a90614afb565b80601f01602080910402602001604051908101604052809291908181526020018280546112a690614afb565b80156112f35780601f106112c8576101008083540402835291602001916112f3565b820191906000526020600020905b8154815290600101906020018083116112d657829003601f168201915b505050505081565b61130361202e565b73ffffffffffffffffffffffffffffffffffffffff16611321611601565b73ffffffffffffffffffffffffffffffffffffffff1614611377576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136e9061469b565b60405180910390fd5b80601060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561142c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611423906145db565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61147b61202e565b73ffffffffffffffffffffffffffffffffffffffff16611499611601565b73ffffffffffffffffffffffffffffffffffffffff16146114ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e69061469b565b60405180910390fd5b6114f96000612429565b565b61150361202e565b73ffffffffffffffffffffffffffffffffffffffff16611521611601565b73ffffffffffffffffffffffffffffffffffffffff1614611577576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156e9061469b565b60405180910390fd5b84600d8190555083601060006101000a81548160ff02191690831515021790555082601060016101000a81548160ff02191690831515021790555081600f8190555080601060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461163a90614afb565b80601f016020809104026020016040519081016040528092919081815260200182805461166690614afb565b80156116b35780601f10611688576101008083540402835291602001916116b3565b820191906000526020600020905b81548152906001019060200180831161169657829003601f168201915b5050505050905090565b601060009054906101000a900460ff161561170d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117049061459b565b60405180910390fd5b601060019054906101000a900460ff161561175d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611754906144bb565b60405180910390fd5b611766816124ef565b50565b61177161202e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d69061453b565b60405180910390fd5b80600560006117ec61202e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661189961202e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118de9190614359565b60405180910390a35050565b6118fb6118f561202e565b836120ef565b61193a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119319061475b565b60405180910390fd5b61194684848484612705565b50505050565b61195461202e565b73ffffffffffffffffffffffffffffffffffffffff16611972611601565b73ffffffffffffffffffffffffffffffffffffffff16146119c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bf9061469b565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b60606119ff82611fc2565b611a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a35906147bb565b60405180910390fd5b6000611a48612761565b90506000815111611a685760405180602001604052806000815250611a97565b600b611a73846127f3565b600c604051602001611a8793929190614264565b6040516020818303038152906040525b915050919050565b611aa761202e565b73ffffffffffffffffffffffffffffffffffffffff16611ac5611601565b73ffffffffffffffffffffffffffffffffffffffff1614611b1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b129061469b565b60405180910390fd5b601060019054906101000a900460ff1615601060016101000a81548160ff021916908315150217905550565b600e5481565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c0f61202e565b73ffffffffffffffffffffffffffffffffffffffff16611c2d611601565b73ffffffffffffffffffffffffffffffffffffffff1614611c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7a9061469b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cea9061447b565b60405180910390fd5b611cfc81612429565b50565b601060019054906101000a900460ff16611d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d459061471b565b60405180910390fd5b6000611d5a3383612954565b9050601060029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611e055750601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3b906146bb565b60405180910390fd5b600383601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e919190614919565b1115611ed2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec9906143fb565b60405180910390fd5b611edb836124ef565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611fab57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611fbb5750611fba8261297e565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166120a9836111bb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006120fa82611fc2565b612139576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121309061457b565b60405180910390fd5b6000612144836111bb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806121b357508373ffffffffffffffffffffffffffffffffffffffff1661219b84610a15565b73ffffffffffffffffffffffffffffffffffffffff16145b806121c457506121c38185611b73565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166121ed826111bb565b73ffffffffffffffffffffffffffffffffffffffff1614612243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223a906146fb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122aa9061451b565b60405180910390fd5b6122be8383836129e8565b6122c9600082612036565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461231991906149fa565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123709190614919565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006124f9610c3e565b90506000821161253e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125359061477b565b60405180910390fd5b600f54821115612583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257a9061461b565b60405180910390fd5b600e5482826125929190614919565b11156125d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ca906144fb565b60405180910390fd5b6125db611601565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146126ca57601060019054906101000a900460ff16156126795781601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126719190614919565b925050819055505b81600d5461268791906149a0565b3410156126c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c0906144db565b60405180910390fd5b5b6000600190505b828111612700576126ed3382846126e89190614919565b612afc565b80806126f890614b5e565b9150506126d1565b505050565b6127108484846121cd565b61271c84848484612b1a565b61275b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127529061445b565b60405180910390fd5b50505050565b6060600b805461277090614afb565b80601f016020809104026020016040519081016040528092919081815260200182805461279c90614afb565b80156127e95780601f106127be576101008083540402835291602001916127e9565b820191906000526020600020905b8154815290600101906020018083116127cc57829003601f168201915b5050505050905090565b6060600082141561283b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061294f565b600082905060005b6000821461286d57808061285690614b5e565b915050600a82612866919061496f565b9150612843565b60008167ffffffffffffffff81111561288957612888614d20565b5b6040519080825280601f01601f1916602001820160405280156128bb5781602001600182028036833780820191505090505b5090505b60008514612948576001826128d491906149fa565b9150600a856128e39190614bd5565b60306128ef9190614919565b60f81b81838151811061290557612904614cf1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612941919061496f565b94506128bf565b8093505050505b919050565b60008061296084612cb1565b90506129758382612d0c90919063ffffffff16565b91505092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6129f3838383612d33565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a3657612a3181612d38565b612a75565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a7457612a738382612d81565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ab857612ab381612eee565b612af7565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612af657612af58282612fbf565b5b5b505050565b612b1682826040518060200160405280600081525061303e565b5050565b6000612b3b8473ffffffffffffffffffffffffffffffffffffffff16613099565b15612ca4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b6461202e565b8786866040518563ffffffff1660e01b8152600401612b8694939291906142eb565b602060405180830381600087803b158015612ba057600080fd5b505af1925050508015612bd157506040513d601f19601f82011682018060405250810190612bce9190613a09565b60015b612c54573d8060008114612c01576040519150601f19603f3d011682016040523d82523d6000602084013e612c06565b606091505b50600081511415612c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c439061445b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ca9565b600190505b949350505050565b60008082604051602001612cc59190614249565b60405160208183030381529060405280519060200120905080604051602001612cee9190614295565b60405160208183030381529060405280519060200120915050919050565b6000806000612d1b85856130ac565b91509150612d288161312f565b819250505092915050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d8e846113bb565b612d9891906149fa565b9050600060076000848152602001908152602001600020549050818114612e7d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612f0291906149fa565b9050600060096000848152602001908152602001600020549050600060088381548110612f3257612f31614cf1565b5b906000526020600020015490508060088381548110612f5457612f53614cf1565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612fa357612fa2614cc2565b5b6001900381819060005260206000200160009055905550505050565b6000612fca836113bb565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6130488383613304565b6130556000848484612b1a565b613094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308b9061445b565b60405180910390fd5b505050565b600080823b905060008111915050919050565b6000806041835114156130ee5760008060006020860151925060408601519150606086015160001a90506130e2878285856134d2565b94509450505050613128565b60408351141561311f5760008060208501519150604085015190506131148683836135df565b935093505050613128565b60006002915091505b9250929050565b6000600481111561314357613142614c64565b5b81600481111561315657613155614c64565b5b141561316157613301565b6001600481111561317557613174614c64565b5b81600481111561318857613187614c64565b5b14156131c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c0906143db565b60405180910390fd5b600260048111156131dd576131dc614c64565b5b8160048111156131f0576131ef614c64565b5b1415613231576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132289061441b565b60405180910390fd5b6003600481111561324557613244614c64565b5b81600481111561325857613257614c64565b5b1415613299576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132909061455b565b60405180910390fd5b6004808111156132ac576132ab614c64565b5b8160048111156132bf576132be614c64565b5b1415613300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f79061463b565b60405180910390fd5b5b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161336b9061465b565b60405180910390fd5b61337d81611fc2565b156133bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b49061449b565b60405180910390fd5b6133c9600083836129e8565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134199190614919565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561350d5760006003915091506135d6565b601b8560ff16141580156135255750601c8560ff1614155b156135375760006004915091506135d6565b60006001878787876040516000815260200160405260405161355c9493929190614374565b6020604051602081039080840390855afa15801561357e573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156135cd576000600192509250506135d6565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c01905061361f878288856134d2565b935093505050935093915050565b82805461363990614afb565b90600052602060002090601f01602090048101928261365b57600085556136a2565b82601f1061367457805160ff19168380011785556136a2565b828001600101855582156136a2579182015b828111156136a1578251825591602001919060010190613686565b5b5090506136af91906136b3565b5090565b5b808211156136cc5760008160009055506001016136b4565b5090565b60006136e36136de8461481b565b6147f6565b9050828152602081018484840111156136ff576136fe614d54565b5b61370a848285614ab9565b509392505050565b60006137256137208461484c565b6147f6565b90508281526020810184848401111561374157613740614d54565b5b61374c848285614ab9565b509392505050565b600081359050613763816155eb565b92915050565b60008135905061377881615602565b92915050565b60008135905061378d81615619565b92915050565b6000815190506137a281615619565b92915050565b600082601f8301126137bd576137bc614d4f565b5b81356137cd8482602086016136d0565b91505092915050565b600082601f8301126137eb576137ea614d4f565b5b81356137fb848260208601613712565b91505092915050565b60008135905061381381615630565b92915050565b60006020828403121561382f5761382e614d5e565b5b600061383d84828501613754565b91505092915050565b6000806040838503121561385d5761385c614d5e565b5b600061386b85828601613754565b925050602061387c85828601613754565b9150509250929050565b60008060006060848603121561389f5761389e614d5e565b5b60006138ad86828701613754565b93505060206138be86828701613754565b92505060406138cf86828701613804565b9150509250925092565b600080600080608085870312156138f3576138f2614d5e565b5b600061390187828801613754565b945050602061391287828801613754565b935050604061392387828801613804565b925050606085013567ffffffffffffffff81111561394457613943614d59565b5b613950878288016137a8565b91505092959194509250565b6000806040838503121561397357613972614d5e565b5b600061398185828601613754565b925050602061399285828601613769565b9150509250929050565b600080604083850312156139b3576139b2614d5e565b5b60006139c185828601613754565b92505060206139d285828601613804565b9150509250929050565b6000602082840312156139f2576139f1614d5e565b5b6000613a008482850161377e565b91505092915050565b600060208284031215613a1f57613a1e614d5e565b5b6000613a2d84828501613793565b91505092915050565b600060208284031215613a4c57613a4b614d5e565b5b600082013567ffffffffffffffff811115613a6a57613a69614d59565b5b613a76848285016137d6565b91505092915050565b600060208284031215613a9557613a94614d5e565b5b6000613aa384828501613804565b91505092915050565b600080600080600060a08688031215613ac857613ac7614d5e565b5b6000613ad688828901613804565b9550506020613ae788828901613769565b9450506040613af888828901613769565b9350506060613b0988828901613804565b9250506080613b1a88828901613754565b9150509295509295909350565b60008060408385031215613b3e57613b3d614d5e565b5b6000613b4c85828601613804565b925050602083013567ffffffffffffffff811115613b6d57613b6c614d59565b5b613b79858286016137a8565b9150509250929050565b6000613b8f838361421c565b60208301905092915050565b613ba481614a2e565b82525050565b613bbb613bb682614a2e565b614ba7565b82525050565b6000613bcc826148a2565b613bd681856148d0565b9350613be18361487d565b8060005b83811015613c12578151613bf98882613b83565b9750613c04836148c3565b925050600181019050613be5565b5085935050505092915050565b613c2881614a40565b82525050565b613c3781614a4c565b82525050565b613c4e613c4982614a4c565b614bb9565b82525050565b6000613c5f826148ad565b613c6981856148e1565b9350613c79818560208601614ac8565b613c8281614d63565b840191505092915050565b6000613c98826148b8565b613ca281856148fd565b9350613cb2818560208601614ac8565b613cbb81614d63565b840191505092915050565b6000613cd1826148b8565b613cdb818561490e565b9350613ceb818560208601614ac8565b80840191505092915050565b60008154613d0481614afb565b613d0e818661490e565b94506001821660008114613d295760018114613d3a57613d6d565b60ff19831686528186019350613d6d565b613d438561488d565b60005b83811015613d6557815481890152600182019150602081019050613d46565b838801955050505b50505092915050565b6000613d836018836148fd565b9150613d8e82614d81565b602082019050919050565b6000613da6602f836148fd565b9150613db182614daa565b604082019050919050565b6000613dc9601f836148fd565b9150613dd482614df9565b602082019050919050565b6000613dec601c8361490e565b9150613df782614e22565b601c82019050919050565b6000613e0f602b836148fd565b9150613e1a82614e4b565b604082019050919050565b6000613e326032836148fd565b9150613e3d82614e9a565b604082019050919050565b6000613e556026836148fd565b9150613e6082614ee9565b604082019050919050565b6000613e78601c836148fd565b9150613e8382614f38565b602082019050919050565b6000613e9b601b836148fd565b9150613ea682614f61565b602082019050919050565b6000613ebe6030836148fd565b9150613ec982614f8a565b604082019050919050565b6000613ee16027836148fd565b9150613eec82614fd9565b604082019050919050565b6000613f046024836148fd565b9150613f0f82615028565b604082019050919050565b6000613f276019836148fd565b9150613f3282615077565b602082019050919050565b6000613f4a6022836148fd565b9150613f55826150a0565b604082019050919050565b6000613f6d602c836148fd565b9150613f78826150ef565b604082019050919050565b6000613f906019836148fd565b9150613f9b8261513e565b602082019050919050565b6000613fb36038836148fd565b9150613fbe82615167565b604082019050919050565b6000613fd6602a836148fd565b9150613fe1826151b6565b604082019050919050565b6000613ff96029836148fd565b915061400482615205565b604082019050919050565b600061401c601c836148fd565b915061402782615254565b602082019050919050565b600061403f6022836148fd565b915061404a8261527d565b604082019050919050565b60006140626020836148fd565b915061406d826152cc565b602082019050919050565b6000614085602c836148fd565b9150614090826152f5565b604082019050919050565b60006140a86020836148fd565b91506140b382615344565b602082019050919050565b60006140cb6023836148fd565b91506140d68261536d565b604082019050919050565b60006140ee601a836148fd565b91506140f9826153bc565b602082019050919050565b60006141116029836148fd565b915061411c826153e5565b604082019050919050565b60006141346021836148fd565b915061413f82615434565b604082019050919050565b60006141576021836148fd565b915061416282615483565b604082019050919050565b600061417a6000836148f2565b9150614185826154d2565b600082019050919050565b600061419d6031836148fd565b91506141a8826154d5565b604082019050919050565b60006141c0601b836148fd565b91506141cb82615524565b602082019050919050565b60006141e3602c836148fd565b91506141ee8261554d565b604082019050919050565b60006142066036836148fd565b91506142118261559c565b604082019050919050565b61422581614aa2565b82525050565b61423481614aa2565b82525050565b61424381614aac565b82525050565b60006142558284613baa565b60148201915081905092915050565b60006142708286613cf7565b915061427c8285613cc6565b91506142888284613cf7565b9150819050949350505050565b60006142a082613ddf565b91506142ac8284613c3d565b60208201915081905092915050565b60006142c68261416d565b9150819050919050565b60006020820190506142e56000830184613b9b565b92915050565b60006080820190506143006000830187613b9b565b61430d6020830186613b9b565b61431a604083018561422b565b818103606083015261432c8184613c54565b905095945050505050565b600060208201905081810360008301526143518184613bc1565b905092915050565b600060208201905061436e6000830184613c1f565b92915050565b60006080820190506143896000830187613c2e565b614396602083018661423a565b6143a36040830185613c2e565b6143b06060830184613c2e565b95945050505050565b600060208201905081810360008301526143d38184613c8d565b905092915050565b600060208201905081810360008301526143f481613d76565b9050919050565b6000602082019050818103600083015261441481613d99565b9050919050565b6000602082019050818103600083015261443481613dbc565b9050919050565b6000602082019050818103600083015261445481613e02565b9050919050565b6000602082019050818103600083015261447481613e25565b9050919050565b6000602082019050818103600083015261449481613e48565b9050919050565b600060208201905081810360008301526144b481613e6b565b9050919050565b600060208201905081810360008301526144d481613e8e565b9050919050565b600060208201905081810360008301526144f481613eb1565b9050919050565b6000602082019050818103600083015261451481613ed4565b9050919050565b6000602082019050818103600083015261453481613ef7565b9050919050565b6000602082019050818103600083015261455481613f1a565b9050919050565b6000602082019050818103600083015261457481613f3d565b9050919050565b6000602082019050818103600083015261459481613f60565b9050919050565b600060208201905081810360008301526145b481613f83565b9050919050565b600060208201905081810360008301526145d481613fa6565b9050919050565b600060208201905081810360008301526145f481613fc9565b9050919050565b6000602082019050818103600083015261461481613fec565b9050919050565b600060208201905081810360008301526146348161400f565b9050919050565b6000602082019050818103600083015261465481614032565b9050919050565b6000602082019050818103600083015261467481614055565b9050919050565b6000602082019050818103600083015261469481614078565b9050919050565b600060208201905081810360008301526146b48161409b565b9050919050565b600060208201905081810360008301526146d4816140be565b9050919050565b600060208201905081810360008301526146f4816140e1565b9050919050565b6000602082019050818103600083015261471481614104565b9050919050565b6000602082019050818103600083015261473481614127565b9050919050565b600060208201905081810360008301526147548161414a565b9050919050565b6000602082019050818103600083015261477481614190565b9050919050565b60006020820190508181036000830152614794816141b3565b9050919050565b600060208201905081810360008301526147b4816141d6565b9050919050565b600060208201905081810360008301526147d4816141f9565b9050919050565b60006020820190506147f0600083018461422b565b92915050565b6000614800614811565b905061480c8282614b2d565b919050565b6000604051905090565b600067ffffffffffffffff82111561483657614835614d20565b5b61483f82614d63565b9050602081019050919050565b600067ffffffffffffffff82111561486757614866614d20565b5b61487082614d63565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061492482614aa2565b915061492f83614aa2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561496457614963614c06565b5b828201905092915050565b600061497a82614aa2565b915061498583614aa2565b92508261499557614994614c35565b5b828204905092915050565b60006149ab82614aa2565b91506149b683614aa2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156149ef576149ee614c06565b5b828202905092915050565b6000614a0582614aa2565b9150614a1083614aa2565b925082821015614a2357614a22614c06565b5b828203905092915050565b6000614a3982614a82565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614ae6578082015181840152602081019050614acb565b83811115614af5576000848401525b50505050565b60006002820490506001821680614b1357607f821691505b60208210811415614b2757614b26614c93565b5b50919050565b614b3682614d63565b810181811067ffffffffffffffff82111715614b5557614b54614d20565b5b80604052505050565b6000614b6982614aa2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b9c57614b9b614c06565b5b600182019050919050565b6000614bb282614bc3565b9050919050565b6000819050919050565b6000614bce82614d74565b9050919050565b6000614be082614aa2565b9150614beb83614aa2565b925082614bfb57614bfa614c35565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f4d696e74696e6720776f756c6420657863656564206d6178207065722077616c60008201527f6c657420666f722070726573616c650000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d696e74696e6720697320696e207072652d73616c65206d6f64650000000000600082015250565b7f416d6f756e742073656e74206c657373207468616e2074686520636f7374206f60008201527f66206d696e74696e67204e465428732900000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f66204e465400000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d696e74696e672063757272656e746c79206f6e20686f6c6400000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4d6178696d756d206d696e7420616d6f756e7420657863656564656400000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f41646472657373206e6f742077686974656c697374656420666f72207072657360008201527f616c650000000000000000000000000000000000000000000000000000000000602082015250565b7f556e61626c6520746f2077697468647261772062616c616e6365000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f5072652d73616c65206973206e6f742063757272656e746c792072756e6e696e60008201527f6700000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416d6f756e7420746f206d696e742063616e206e6f7420626520300000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a20746f6b656e555249207175657269656460008201527f20666f72206e6f6e6578697374656e7420746f6b656e00000000000000000000602082015250565b6155f481614a2e565b81146155ff57600080fd5b50565b61560b81614a40565b811461561657600080fd5b50565b61562281614a56565b811461562d57600080fd5b50565b61563981614aa2565b811461564457600080fd5b5056fea2646970667358221220c7e8f8bb6c2cde563847b7363a3afb78dc38d512bd1d39f8f73399511442151664736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000c4269672042756773204e46540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000542424e4654000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001768747470733a2f2f626967627567732e696f2f6e66742f000000000000000000

Deployed Bytecode

0x60806040526004361061023b5760003560e01c80635e7ac1381161012e578063a22cb465116100ab578063d5abeb011161006f578063d5abeb0114610831578063d5f394881461085c578063e985e9c514610887578063f2fde38b146108c4578063fd24a854146108ed5761023b565b8063a22cb46514610774578063b88d4fde1461079d578063c4ae3168146107c6578063c87b56dd146107dd578063ca3cb5221461081a5761023b565b8063715018a6116100f2578063715018a6146106c257806384864129146106d95780638da5cb5b1461070257806395d89b411461072d578063a0712d68146107585761023b565b80635e7ac138146105c95780636352211e146105f45780636c0360eb146106315780636c19e7831461065c57806370a08231146106855761023b565b80632d5537b0116101bc57806344a0d68a1161018057806344a0d68a146104e45780634f6ccce71461050d57806355f804b31461054a5780635a7adf7f146105735780635c975abb1461059e5761023b565b80632d5537b01461040c5780632f745c59146104375780633ccfd60b1461047457806342842e0e1461047e578063438b6300146104a75761023b565b806313faede61161020357806313faede61461033757806318160ddd14610362578063238ac9331461038d578063239c70ae146103b857806323b872dd146103e35761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063088a4ed0146102e5578063095ea7b31461030e575b600080fd5b34801561024c57600080fd5b50610267600480360381019061026291906139dc565b610909565b6040516102749190614359565b60405180910390f35b34801561028957600080fd5b50610292610983565b60405161029f91906143b9565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190613a7f565b610a15565b6040516102dc91906142d0565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613a7f565b610a9a565b005b34801561031a57600080fd5b506103356004803603810190610330919061399c565b610b20565b005b34801561034357600080fd5b5061034c610c38565b60405161035991906147db565b60405180910390f35b34801561036e57600080fd5b50610377610c3e565b60405161038491906147db565b60405180910390f35b34801561039957600080fd5b506103a2610c4b565b6040516103af91906142d0565b60405180910390f35b3480156103c457600080fd5b506103cd610c71565b6040516103da91906147db565b60405180910390f35b3480156103ef57600080fd5b5061040a60048036038101906104059190613886565b610c77565b005b34801561041857600080fd5b50610421610cd7565b60405161042e91906143b9565b60405180910390f35b34801561044357600080fd5b5061045e6004803603810190610459919061399c565b610d65565b60405161046b91906147db565b60405180910390f35b61047c610e0a565b005b34801561048a57600080fd5b506104a560048036038101906104a09190613886565b610f35565b005b3480156104b357600080fd5b506104ce60048036038101906104c99190613819565b610f55565b6040516104db9190614337565b60405180910390f35b3480156104f057600080fd5b5061050b60048036038101906105069190613a7f565b611003565b005b34801561051957600080fd5b50610534600480360381019061052f9190613a7f565b611089565b60405161054191906147db565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c9190613a36565b6110fa565b005b34801561057f57600080fd5b50610588611190565b6040516105959190614359565b60405180910390f35b3480156105aa57600080fd5b506105b36111a3565b6040516105c09190614359565b60405180910390f35b3480156105d557600080fd5b506105de6111b6565b6040516105eb91906147db565b60405180910390f35b34801561060057600080fd5b5061061b60048036038101906106169190613a7f565b6111bb565b60405161062891906142d0565b60405180910390f35b34801561063d57600080fd5b5061064661126d565b60405161065391906143b9565b60405180910390f35b34801561066857600080fd5b50610683600480360381019061067e9190613819565b6112fb565b005b34801561069157600080fd5b506106ac60048036038101906106a79190613819565b6113bb565b6040516106b991906147db565b60405180910390f35b3480156106ce57600080fd5b506106d7611473565b005b3480156106e557600080fd5b5061070060048036038101906106fb9190613aac565b6114fb565b005b34801561070e57600080fd5b50610717611601565b60405161072491906142d0565b60405180910390f35b34801561073957600080fd5b5061074261162b565b60405161074f91906143b9565b60405180910390f35b610772600480360381019061076d9190613a7f565b6116bd565b005b34801561078057600080fd5b5061079b6004803603810190610796919061395c565b611769565b005b3480156107a957600080fd5b506107c460048036038101906107bf91906138d9565b6118ea565b005b3480156107d257600080fd5b506107db61194c565b005b3480156107e957600080fd5b5061080460048036038101906107ff9190613a7f565b6119f4565b60405161081191906143b9565b60405180910390f35b34801561082657600080fd5b5061082f611a9f565b005b34801561083d57600080fd5b50610846611b47565b60405161085391906147db565b60405180910390f35b34801561086857600080fd5b50610871611b4d565b60405161087e91906142d0565b60405180910390f35b34801561089357600080fd5b506108ae60048036038101906108a99190613846565b611b73565b6040516108bb9190614359565b60405180910390f35b3480156108d057600080fd5b506108eb60048036038101906108e69190613819565b611c07565b005b61090760048036038101906109029190613b27565b611cff565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061097c575061097b82611ee0565b5b9050919050565b60606000805461099290614afb565b80601f01602080910402602001604051908101604052809291908181526020018280546109be90614afb565b8015610a0b5780601f106109e057610100808354040283529160200191610a0b565b820191906000526020600020905b8154815290600101906020018083116109ee57829003601f168201915b5050505050905090565b6000610a2082611fc2565b610a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a569061467b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610aa261202e565b73ffffffffffffffffffffffffffffffffffffffff16610ac0611601565b73ffffffffffffffffffffffffffffffffffffffff1614610b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0d9061469b565b60405180910390fd5b80600f8190555050565b6000610b2b826111bb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b939061473b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bbb61202e565b73ffffffffffffffffffffffffffffffffffffffff161480610bea5750610be981610be461202e565b611b73565b5b610c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c20906145bb565b60405180910390fd5b610c338383612036565b505050565b600d5481565b6000600880549050905090565b601060029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b610c88610c8261202e565b826120ef565b610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbe9061475b565b60405180910390fd5b610cd28383836121cd565b505050565b600c8054610ce490614afb565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1090614afb565b8015610d5d5780601f10610d3257610100808354040283529160200191610d5d565b820191906000526020600020905b815481529060010190602001808311610d4057829003601f168201915b505050505081565b6000610d70836113bb565b8210610db1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da89061443b565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e1261202e565b73ffffffffffffffffffffffffffffffffffffffff16610e30611601565b73ffffffffffffffffffffffffffffffffffffffff1614610e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7d9061469b565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610eac906142bb565b60006040518083038185875af1925050503d8060008114610ee9576040519150601f19603f3d011682016040523d82523d6000602084013e610eee565b606091505b5050905080610f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f29906146db565b60405180910390fd5b50565b610f50838383604051806020016040528060008152506118ea565b505050565b60606000610f62836113bb565b905060008167ffffffffffffffff811115610f8057610f7f614d20565b5b604051908082528060200260200182016040528015610fae5781602001602082028036833780820191505090505b50905060005b82811015610ff857610fc68582610d65565b828281518110610fd957610fd8614cf1565b5b6020026020010181815250508080610ff090614b5e565b915050610fb4565b508092505050919050565b61100b61202e565b73ffffffffffffffffffffffffffffffffffffffff16611029611601565b73ffffffffffffffffffffffffffffffffffffffff161461107f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110769061469b565b60405180910390fd5b80600d8190555050565b6000611093610c3e565b82106110d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cb9061479b565b60405180910390fd5b600882815481106110e8576110e7614cf1565b5b90600052602060002001549050919050565b61110261202e565b73ffffffffffffffffffffffffffffffffffffffff16611120611601565b73ffffffffffffffffffffffffffffffffffffffff1614611176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116d9061469b565b60405180910390fd5b80600b908051906020019061118c92919061362d565b5050565b601060019054906101000a900460ff1681565b601060009054906101000a900460ff1681565b600381565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125b906145fb565b60405180910390fd5b80915050919050565b600b805461127a90614afb565b80601f01602080910402602001604051908101604052809291908181526020018280546112a690614afb565b80156112f35780601f106112c8576101008083540402835291602001916112f3565b820191906000526020600020905b8154815290600101906020018083116112d657829003601f168201915b505050505081565b61130361202e565b73ffffffffffffffffffffffffffffffffffffffff16611321611601565b73ffffffffffffffffffffffffffffffffffffffff1614611377576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136e9061469b565b60405180910390fd5b80601060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561142c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611423906145db565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61147b61202e565b73ffffffffffffffffffffffffffffffffffffffff16611499611601565b73ffffffffffffffffffffffffffffffffffffffff16146114ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e69061469b565b60405180910390fd5b6114f96000612429565b565b61150361202e565b73ffffffffffffffffffffffffffffffffffffffff16611521611601565b73ffffffffffffffffffffffffffffffffffffffff1614611577576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156e9061469b565b60405180910390fd5b84600d8190555083601060006101000a81548160ff02191690831515021790555082601060016101000a81548160ff02191690831515021790555081600f8190555080601060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461163a90614afb565b80601f016020809104026020016040519081016040528092919081815260200182805461166690614afb565b80156116b35780601f10611688576101008083540402835291602001916116b3565b820191906000526020600020905b81548152906001019060200180831161169657829003601f168201915b5050505050905090565b601060009054906101000a900460ff161561170d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117049061459b565b60405180910390fd5b601060019054906101000a900460ff161561175d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611754906144bb565b60405180910390fd5b611766816124ef565b50565b61177161202e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d69061453b565b60405180910390fd5b80600560006117ec61202e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661189961202e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118de9190614359565b60405180910390a35050565b6118fb6118f561202e565b836120ef565b61193a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119319061475b565b60405180910390fd5b61194684848484612705565b50505050565b61195461202e565b73ffffffffffffffffffffffffffffffffffffffff16611972611601565b73ffffffffffffffffffffffffffffffffffffffff16146119c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bf9061469b565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b60606119ff82611fc2565b611a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a35906147bb565b60405180910390fd5b6000611a48612761565b90506000815111611a685760405180602001604052806000815250611a97565b600b611a73846127f3565b600c604051602001611a8793929190614264565b6040516020818303038152906040525b915050919050565b611aa761202e565b73ffffffffffffffffffffffffffffffffffffffff16611ac5611601565b73ffffffffffffffffffffffffffffffffffffffff1614611b1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b129061469b565b60405180910390fd5b601060019054906101000a900460ff1615601060016101000a81548160ff021916908315150217905550565b600e5481565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c0f61202e565b73ffffffffffffffffffffffffffffffffffffffff16611c2d611601565b73ffffffffffffffffffffffffffffffffffffffff1614611c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7a9061469b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cea9061447b565b60405180910390fd5b611cfc81612429565b50565b601060019054906101000a900460ff16611d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d459061471b565b60405180910390fd5b6000611d5a3383612954565b9050601060029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611e055750601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3b906146bb565b60405180910390fd5b600383601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e919190614919565b1115611ed2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec9906143fb565b60405180910390fd5b611edb836124ef565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611fab57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611fbb5750611fba8261297e565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166120a9836111bb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006120fa82611fc2565b612139576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121309061457b565b60405180910390fd5b6000612144836111bb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806121b357508373ffffffffffffffffffffffffffffffffffffffff1661219b84610a15565b73ffffffffffffffffffffffffffffffffffffffff16145b806121c457506121c38185611b73565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166121ed826111bb565b73ffffffffffffffffffffffffffffffffffffffff1614612243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223a906146fb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122aa9061451b565b60405180910390fd5b6122be8383836129e8565b6122c9600082612036565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461231991906149fa565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123709190614919565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006124f9610c3e565b90506000821161253e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125359061477b565b60405180910390fd5b600f54821115612583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257a9061461b565b60405180910390fd5b600e5482826125929190614919565b11156125d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ca906144fb565b60405180910390fd5b6125db611601565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146126ca57601060019054906101000a900460ff16156126795781601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126719190614919565b925050819055505b81600d5461268791906149a0565b3410156126c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c0906144db565b60405180910390fd5b5b6000600190505b828111612700576126ed3382846126e89190614919565b612afc565b80806126f890614b5e565b9150506126d1565b505050565b6127108484846121cd565b61271c84848484612b1a565b61275b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127529061445b565b60405180910390fd5b50505050565b6060600b805461277090614afb565b80601f016020809104026020016040519081016040528092919081815260200182805461279c90614afb565b80156127e95780601f106127be576101008083540402835291602001916127e9565b820191906000526020600020905b8154815290600101906020018083116127cc57829003601f168201915b5050505050905090565b6060600082141561283b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061294f565b600082905060005b6000821461286d57808061285690614b5e565b915050600a82612866919061496f565b9150612843565b60008167ffffffffffffffff81111561288957612888614d20565b5b6040519080825280601f01601f1916602001820160405280156128bb5781602001600182028036833780820191505090505b5090505b60008514612948576001826128d491906149fa565b9150600a856128e39190614bd5565b60306128ef9190614919565b60f81b81838151811061290557612904614cf1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612941919061496f565b94506128bf565b8093505050505b919050565b60008061296084612cb1565b90506129758382612d0c90919063ffffffff16565b91505092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6129f3838383612d33565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a3657612a3181612d38565b612a75565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a7457612a738382612d81565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ab857612ab381612eee565b612af7565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612af657612af58282612fbf565b5b5b505050565b612b1682826040518060200160405280600081525061303e565b5050565b6000612b3b8473ffffffffffffffffffffffffffffffffffffffff16613099565b15612ca4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b6461202e565b8786866040518563ffffffff1660e01b8152600401612b8694939291906142eb565b602060405180830381600087803b158015612ba057600080fd5b505af1925050508015612bd157506040513d601f19601f82011682018060405250810190612bce9190613a09565b60015b612c54573d8060008114612c01576040519150601f19603f3d011682016040523d82523d6000602084013e612c06565b606091505b50600081511415612c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c439061445b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ca9565b600190505b949350505050565b60008082604051602001612cc59190614249565b60405160208183030381529060405280519060200120905080604051602001612cee9190614295565b60405160208183030381529060405280519060200120915050919050565b6000806000612d1b85856130ac565b91509150612d288161312f565b819250505092915050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d8e846113bb565b612d9891906149fa565b9050600060076000848152602001908152602001600020549050818114612e7d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612f0291906149fa565b9050600060096000848152602001908152602001600020549050600060088381548110612f3257612f31614cf1565b5b906000526020600020015490508060088381548110612f5457612f53614cf1565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612fa357612fa2614cc2565b5b6001900381819060005260206000200160009055905550505050565b6000612fca836113bb565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6130488383613304565b6130556000848484612b1a565b613094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308b9061445b565b60405180910390fd5b505050565b600080823b905060008111915050919050565b6000806041835114156130ee5760008060006020860151925060408601519150606086015160001a90506130e2878285856134d2565b94509450505050613128565b60408351141561311f5760008060208501519150604085015190506131148683836135df565b935093505050613128565b60006002915091505b9250929050565b6000600481111561314357613142614c64565b5b81600481111561315657613155614c64565b5b141561316157613301565b6001600481111561317557613174614c64565b5b81600481111561318857613187614c64565b5b14156131c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c0906143db565b60405180910390fd5b600260048111156131dd576131dc614c64565b5b8160048111156131f0576131ef614c64565b5b1415613231576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132289061441b565b60405180910390fd5b6003600481111561324557613244614c64565b5b81600481111561325857613257614c64565b5b1415613299576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132909061455b565b60405180910390fd5b6004808111156132ac576132ab614c64565b5b8160048111156132bf576132be614c64565b5b1415613300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f79061463b565b60405180910390fd5b5b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161336b9061465b565b60405180910390fd5b61337d81611fc2565b156133bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b49061449b565b60405180910390fd5b6133c9600083836129e8565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134199190614919565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561350d5760006003915091506135d6565b601b8560ff16141580156135255750601c8560ff1614155b156135375760006004915091506135d6565b60006001878787876040516000815260200160405260405161355c9493929190614374565b6020604051602081039080840390855afa15801561357e573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156135cd576000600192509250506135d6565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c01905061361f878288856134d2565b935093505050935093915050565b82805461363990614afb565b90600052602060002090601f01602090048101928261365b57600085556136a2565b82601f1061367457805160ff19168380011785556136a2565b828001600101855582156136a2579182015b828111156136a1578251825591602001919060010190613686565b5b5090506136af91906136b3565b5090565b5b808211156136cc5760008160009055506001016136b4565b5090565b60006136e36136de8461481b565b6147f6565b9050828152602081018484840111156136ff576136fe614d54565b5b61370a848285614ab9565b509392505050565b60006137256137208461484c565b6147f6565b90508281526020810184848401111561374157613740614d54565b5b61374c848285614ab9565b509392505050565b600081359050613763816155eb565b92915050565b60008135905061377881615602565b92915050565b60008135905061378d81615619565b92915050565b6000815190506137a281615619565b92915050565b600082601f8301126137bd576137bc614d4f565b5b81356137cd8482602086016136d0565b91505092915050565b600082601f8301126137eb576137ea614d4f565b5b81356137fb848260208601613712565b91505092915050565b60008135905061381381615630565b92915050565b60006020828403121561382f5761382e614d5e565b5b600061383d84828501613754565b91505092915050565b6000806040838503121561385d5761385c614d5e565b5b600061386b85828601613754565b925050602061387c85828601613754565b9150509250929050565b60008060006060848603121561389f5761389e614d5e565b5b60006138ad86828701613754565b93505060206138be86828701613754565b92505060406138cf86828701613804565b9150509250925092565b600080600080608085870312156138f3576138f2614d5e565b5b600061390187828801613754565b945050602061391287828801613754565b935050604061392387828801613804565b925050606085013567ffffffffffffffff81111561394457613943614d59565b5b613950878288016137a8565b91505092959194509250565b6000806040838503121561397357613972614d5e565b5b600061398185828601613754565b925050602061399285828601613769565b9150509250929050565b600080604083850312156139b3576139b2614d5e565b5b60006139c185828601613754565b92505060206139d285828601613804565b9150509250929050565b6000602082840312156139f2576139f1614d5e565b5b6000613a008482850161377e565b91505092915050565b600060208284031215613a1f57613a1e614d5e565b5b6000613a2d84828501613793565b91505092915050565b600060208284031215613a4c57613a4b614d5e565b5b600082013567ffffffffffffffff811115613a6a57613a69614d59565b5b613a76848285016137d6565b91505092915050565b600060208284031215613a9557613a94614d5e565b5b6000613aa384828501613804565b91505092915050565b600080600080600060a08688031215613ac857613ac7614d5e565b5b6000613ad688828901613804565b9550506020613ae788828901613769565b9450506040613af888828901613769565b9350506060613b0988828901613804565b9250506080613b1a88828901613754565b9150509295509295909350565b60008060408385031215613b3e57613b3d614d5e565b5b6000613b4c85828601613804565b925050602083013567ffffffffffffffff811115613b6d57613b6c614d59565b5b613b79858286016137a8565b9150509250929050565b6000613b8f838361421c565b60208301905092915050565b613ba481614a2e565b82525050565b613bbb613bb682614a2e565b614ba7565b82525050565b6000613bcc826148a2565b613bd681856148d0565b9350613be18361487d565b8060005b83811015613c12578151613bf98882613b83565b9750613c04836148c3565b925050600181019050613be5565b5085935050505092915050565b613c2881614a40565b82525050565b613c3781614a4c565b82525050565b613c4e613c4982614a4c565b614bb9565b82525050565b6000613c5f826148ad565b613c6981856148e1565b9350613c79818560208601614ac8565b613c8281614d63565b840191505092915050565b6000613c98826148b8565b613ca281856148fd565b9350613cb2818560208601614ac8565b613cbb81614d63565b840191505092915050565b6000613cd1826148b8565b613cdb818561490e565b9350613ceb818560208601614ac8565b80840191505092915050565b60008154613d0481614afb565b613d0e818661490e565b94506001821660008114613d295760018114613d3a57613d6d565b60ff19831686528186019350613d6d565b613d438561488d565b60005b83811015613d6557815481890152600182019150602081019050613d46565b838801955050505b50505092915050565b6000613d836018836148fd565b9150613d8e82614d81565b602082019050919050565b6000613da6602f836148fd565b9150613db182614daa565b604082019050919050565b6000613dc9601f836148fd565b9150613dd482614df9565b602082019050919050565b6000613dec601c8361490e565b9150613df782614e22565b601c82019050919050565b6000613e0f602b836148fd565b9150613e1a82614e4b565b604082019050919050565b6000613e326032836148fd565b9150613e3d82614e9a565b604082019050919050565b6000613e556026836148fd565b9150613e6082614ee9565b604082019050919050565b6000613e78601c836148fd565b9150613e8382614f38565b602082019050919050565b6000613e9b601b836148fd565b9150613ea682614f61565b602082019050919050565b6000613ebe6030836148fd565b9150613ec982614f8a565b604082019050919050565b6000613ee16027836148fd565b9150613eec82614fd9565b604082019050919050565b6000613f046024836148fd565b9150613f0f82615028565b604082019050919050565b6000613f276019836148fd565b9150613f3282615077565b602082019050919050565b6000613f4a6022836148fd565b9150613f55826150a0565b604082019050919050565b6000613f6d602c836148fd565b9150613f78826150ef565b604082019050919050565b6000613f906019836148fd565b9150613f9b8261513e565b602082019050919050565b6000613fb36038836148fd565b9150613fbe82615167565b604082019050919050565b6000613fd6602a836148fd565b9150613fe1826151b6565b604082019050919050565b6000613ff96029836148fd565b915061400482615205565b604082019050919050565b600061401c601c836148fd565b915061402782615254565b602082019050919050565b600061403f6022836148fd565b915061404a8261527d565b604082019050919050565b60006140626020836148fd565b915061406d826152cc565b602082019050919050565b6000614085602c836148fd565b9150614090826152f5565b604082019050919050565b60006140a86020836148fd565b91506140b382615344565b602082019050919050565b60006140cb6023836148fd565b91506140d68261536d565b604082019050919050565b60006140ee601a836148fd565b91506140f9826153bc565b602082019050919050565b60006141116029836148fd565b915061411c826153e5565b604082019050919050565b60006141346021836148fd565b915061413f82615434565b604082019050919050565b60006141576021836148fd565b915061416282615483565b604082019050919050565b600061417a6000836148f2565b9150614185826154d2565b600082019050919050565b600061419d6031836148fd565b91506141a8826154d5565b604082019050919050565b60006141c0601b836148fd565b91506141cb82615524565b602082019050919050565b60006141e3602c836148fd565b91506141ee8261554d565b604082019050919050565b60006142066036836148fd565b91506142118261559c565b604082019050919050565b61422581614aa2565b82525050565b61423481614aa2565b82525050565b61424381614aac565b82525050565b60006142558284613baa565b60148201915081905092915050565b60006142708286613cf7565b915061427c8285613cc6565b91506142888284613cf7565b9150819050949350505050565b60006142a082613ddf565b91506142ac8284613c3d565b60208201915081905092915050565b60006142c68261416d565b9150819050919050565b60006020820190506142e56000830184613b9b565b92915050565b60006080820190506143006000830187613b9b565b61430d6020830186613b9b565b61431a604083018561422b565b818103606083015261432c8184613c54565b905095945050505050565b600060208201905081810360008301526143518184613bc1565b905092915050565b600060208201905061436e6000830184613c1f565b92915050565b60006080820190506143896000830187613c2e565b614396602083018661423a565b6143a36040830185613c2e565b6143b06060830184613c2e565b95945050505050565b600060208201905081810360008301526143d38184613c8d565b905092915050565b600060208201905081810360008301526143f481613d76565b9050919050565b6000602082019050818103600083015261441481613d99565b9050919050565b6000602082019050818103600083015261443481613dbc565b9050919050565b6000602082019050818103600083015261445481613e02565b9050919050565b6000602082019050818103600083015261447481613e25565b9050919050565b6000602082019050818103600083015261449481613e48565b9050919050565b600060208201905081810360008301526144b481613e6b565b9050919050565b600060208201905081810360008301526144d481613e8e565b9050919050565b600060208201905081810360008301526144f481613eb1565b9050919050565b6000602082019050818103600083015261451481613ed4565b9050919050565b6000602082019050818103600083015261453481613ef7565b9050919050565b6000602082019050818103600083015261455481613f1a565b9050919050565b6000602082019050818103600083015261457481613f3d565b9050919050565b6000602082019050818103600083015261459481613f60565b9050919050565b600060208201905081810360008301526145b481613f83565b9050919050565b600060208201905081810360008301526145d481613fa6565b9050919050565b600060208201905081810360008301526145f481613fc9565b9050919050565b6000602082019050818103600083015261461481613fec565b9050919050565b600060208201905081810360008301526146348161400f565b9050919050565b6000602082019050818103600083015261465481614032565b9050919050565b6000602082019050818103600083015261467481614055565b9050919050565b6000602082019050818103600083015261469481614078565b9050919050565b600060208201905081810360008301526146b48161409b565b9050919050565b600060208201905081810360008301526146d4816140be565b9050919050565b600060208201905081810360008301526146f4816140e1565b9050919050565b6000602082019050818103600083015261471481614104565b9050919050565b6000602082019050818103600083015261473481614127565b9050919050565b600060208201905081810360008301526147548161414a565b9050919050565b6000602082019050818103600083015261477481614190565b9050919050565b60006020820190508181036000830152614794816141b3565b9050919050565b600060208201905081810360008301526147b4816141d6565b9050919050565b600060208201905081810360008301526147d4816141f9565b9050919050565b60006020820190506147f0600083018461422b565b92915050565b6000614800614811565b905061480c8282614b2d565b919050565b6000604051905090565b600067ffffffffffffffff82111561483657614835614d20565b5b61483f82614d63565b9050602081019050919050565b600067ffffffffffffffff82111561486757614866614d20565b5b61487082614d63565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061492482614aa2565b915061492f83614aa2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561496457614963614c06565b5b828201905092915050565b600061497a82614aa2565b915061498583614aa2565b92508261499557614994614c35565b5b828204905092915050565b60006149ab82614aa2565b91506149b683614aa2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156149ef576149ee614c06565b5b828202905092915050565b6000614a0582614aa2565b9150614a1083614aa2565b925082821015614a2357614a22614c06565b5b828203905092915050565b6000614a3982614a82565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614ae6578082015181840152602081019050614acb565b83811115614af5576000848401525b50505050565b60006002820490506001821680614b1357607f821691505b60208210811415614b2757614b26614c93565b5b50919050565b614b3682614d63565b810181811067ffffffffffffffff82111715614b5557614b54614d20565b5b80604052505050565b6000614b6982614aa2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b9c57614b9b614c06565b5b600182019050919050565b6000614bb282614bc3565b9050919050565b6000819050919050565b6000614bce82614d74565b9050919050565b6000614be082614aa2565b9150614beb83614aa2565b925082614bfb57614bfa614c35565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f4d696e74696e6720776f756c6420657863656564206d6178207065722077616c60008201527f6c657420666f722070726573616c650000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d696e74696e6720697320696e207072652d73616c65206d6f64650000000000600082015250565b7f416d6f756e742073656e74206c657373207468616e2074686520636f7374206f60008201527f66206d696e74696e67204e465428732900000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f66204e465400000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d696e74696e672063757272656e746c79206f6e20686f6c6400000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4d6178696d756d206d696e7420616d6f756e7420657863656564656400000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f41646472657373206e6f742077686974656c697374656420666f72207072657360008201527f616c650000000000000000000000000000000000000000000000000000000000602082015250565b7f556e61626c6520746f2077697468647261772062616c616e6365000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f5072652d73616c65206973206e6f742063757272656e746c792072756e6e696e60008201527f6700000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416d6f756e7420746f206d696e742063616e206e6f7420626520300000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a20746f6b656e555249207175657269656460008201527f20666f72206e6f6e6578697374656e7420746f6b656e00000000000000000000602082015250565b6155f481614a2e565b81146155ff57600080fd5b50565b61560b81614a40565b811461561657600080fd5b50565b61562281614a56565b811461562d57600080fd5b50565b61563981614aa2565b811461564457600080fd5b5056fea2646970667358221220c7e8f8bb6c2cde563847b7363a3afb78dc38d512bd1d39f8f73399511442151664736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000c4269672042756773204e46540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000542424e4654000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001768747470733a2f2f626967627567732e696f2f6e66742f000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Big Bugs NFT
Arg [1] : _symbol (string): BBNFT
Arg [2] : _initBaseURI (string): https://bigbugs.io/nft/

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [4] : 4269672042756773204e46540000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [6] : 42424e4654000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [8] : 68747470733a2f2f626967627567732e696f2f6e66742f000000000000000000


Deployed Bytecode Sourcemap

52194:4688:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45973:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33865:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35424:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55898:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34947:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52381:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46613:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52563:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52459:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36314:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52341:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46281:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56598:279;;;:::i;:::-;;36724:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54513:357;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55808:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46803:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56024:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52529:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52496:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52621:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33559:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52313:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55710:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33289:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13564:94;;;;;;;;;;;;;:::i;:::-;;56312:278;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12913:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34034:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53091:199;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35717:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36980:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56138:77;;;;;;;;;;;;;:::i;:::-;;54878:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56223:81;;;;;;;;;;;;;:::i;:::-;;52420:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52591:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36083:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13813:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53300:488;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45973:224;46075:4;46114:35;46099:50;;;:11;:50;;;;:90;;;;46153:36;46177:11;46153:23;:36::i;:::-;46099:90;46092:97;;45973:224;;;:::o;33865:100::-;33919:13;33952:5;33945:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33865:100;:::o;35424:221::-;35500:7;35528:16;35536:7;35528;:16::i;:::-;35520:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35613:15;:24;35629:7;35613:24;;;;;;;;;;;;;;;;;;;;;35606:31;;35424:221;;;:::o;55898:118::-;13144:12;:10;:12::i;:::-;13133:23;;:7;:5;:7::i;:::-;:23;;;13125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55994:14:::1;55978:13;:30;;;;55898:118:::0;:::o;34947:411::-;35028:13;35044:23;35059:7;35044:14;:23::i;:::-;35028:39;;35092:5;35086:11;;:2;:11;;;;35078:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;35186:5;35170:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;35195:37;35212:5;35219:12;:10;:12::i;:::-;35195:16;:37::i;:::-;35170:62;35148:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;35329:21;35338:2;35342:7;35329:8;:21::i;:::-;35017:341;34947:411;;:::o;52381:32::-;;;;:::o;46613:113::-;46674:7;46701:10;:17;;;;46694:24;;46613:113;:::o;52563:21::-;;;;;;;;;;;;;:::o;52459:30::-;;;;:::o;36314:339::-;36509:41;36528:12;:10;:12::i;:::-;36542:7;36509:18;:41::i;:::-;36501:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;36617:28;36627:4;36633:2;36637:7;36617:9;:28::i;:::-;36314:339;;;:::o;52341:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46281:256::-;46378:7;46414:23;46431:5;46414:16;:23::i;:::-;46406:5;:31;46398:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;46503:12;:19;46516:5;46503:19;;;;;;;;;;;;;;;:26;46523:5;46503:26;;;;;;;;;;;;46496:33;;46281:256;;;;:::o;56598:279::-;13144:12;:10;:12::i;:::-;13133:23;;:7;:5;:7::i;:::-;:23;;;13125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56736:12:::1;56761:10;56753:24;;56786:21;56753:59;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56735:77;;;56831:7;56823:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;56645:232;56598:279::o:0;36724:185::-;36862:39;36879:4;36885:2;36889:7;36862:39;;;;;;;;;;;;:16;:39::i;:::-;36724:185;;;:::o;54513:357::-;54573:16;54601:23;54627:17;54637:6;54627:9;:17::i;:::-;54601:43;;54655:25;54697:15;54683:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54655:58;;54729:9;54724:113;54744:15;54740:1;:19;54724:113;;;54795:30;54815:6;54823:1;54795:19;:30::i;:::-;54781:8;54790:1;54781:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;54761:3;;;;;:::i;:::-;;;;54724:113;;;;54854:8;54847:15;;;;54513:357;;;:::o;55808:82::-;13144:12;:10;:12::i;:::-;13133:23;;:7;:5;:7::i;:::-;:23;;;13125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55877:5:::1;55870:4;:12;;;;55808:82:::0;:::o;46803:233::-;46878:7;46914:30;:28;:30::i;:::-;46906:5;:38;46898:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;47011:10;47022:5;47011:17;;;;;;;;:::i;:::-;;;;;;;;;;47004:24;;46803:233;;;:::o;56024:106::-;13144:12;:10;:12::i;:::-;13133:23;;:7;:5;:7::i;:::-;:23;;;13125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56111:11:::1;56101:7;:21;;;;;;;;;;;;:::i;:::-;;56024:106:::0;:::o;52529:27::-;;;;;;;;;;;;;:::o;52496:26::-;;;;;;;;;;;;;:::o;52621:47::-;52667:1;52621:47;:::o;33559:239::-;33631:7;33651:13;33667:7;:16;33675:7;33667:16;;;;;;;;;;;;;;;;;;;;;33651:32;;33719:1;33702:19;;:5;:19;;;;33694:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33785:5;33778:12;;;33559:239;;;:::o;52313:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55710:90::-;13144:12;:10;:12::i;:::-;13133:23;;:7;:5;:7::i;:::-;:23;;;13125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55785:7:::1;55776:6;;:16;;;;;;;;;;;;;;;;;;55710:90:::0;:::o;33289:208::-;33361:7;33406:1;33389:19;;:5;:19;;;;33381:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;33473:9;:16;33483:5;33473:16;;;;;;;;;;;;;;;;33466:23;;33289:208;;;:::o;13564:94::-;13144:12;:10;:12::i;:::-;13133:23;;:7;:5;:7::i;:::-;:23;;;13125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13629:21:::1;13647:1;13629:9;:21::i;:::-;13564:94::o:0;56312:278::-;13144:12;:10;:12::i;:::-;13133:23;;:7;:5;:7::i;:::-;:23;;;13125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56453:5:::1;56446:4;:12;;;;56478:7;56469:6;;:16;;;;;;;;;;;;;;;;;;56506:8;56496:7;;:18;;;;;;;;;;;;;;;;;;56541:14;56525:13;:30;;;;56575:7;56566:6;;:16;;;;;;;;;;;;;;;;;;56312:278:::0;;;;;:::o;12913:87::-;12959:7;12986:6;;;;;;;;;;;12979:13;;12913:87;:::o;34034:104::-;34090:13;34123:7;34116:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34034:104;:::o;53091:199::-;53158:6;;;;;;;;;;;53157:7;53149:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;53214:7;;;;;;;;;;;53213:8;53205:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;53264:18;53270:11;53264:5;:18::i;:::-;53091:199;:::o;35717:295::-;35832:12;:10;:12::i;:::-;35820:24;;:8;:24;;;;35812:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;35932:8;35887:18;:32;35906:12;:10;:12::i;:::-;35887:32;;;;;;;;;;;;;;;:42;35920:8;35887:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;35985:8;35956:48;;35971:12;:10;:12::i;:::-;35956:48;;;35995:8;35956:48;;;;;;:::i;:::-;;;;;;;;35717:295;;:::o;36980:328::-;37155:41;37174:12;:10;:12::i;:::-;37188:7;37155:18;:41::i;:::-;37147:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;37261:39;37275:4;37281:2;37285:7;37294:5;37261:13;:39::i;:::-;36980:328;;;;:::o;56138:77::-;13144:12;:10;:12::i;:::-;13133:23;;:7;:5;:7::i;:::-;:23;;;13125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56201:6:::1;;;;;;;;;;;56200:7;56191:6;;:16;;;;;;;;;;;;;;;;;;56138:77::o:0;54878:365::-;54951:13;54986:16;54994:7;54986;:16::i;:::-;54978:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;55072:28;55103:10;:8;:10::i;:::-;55072:41;;55162:1;55137:14;55131:28;:32;:104;;;;;;;;;;;;;;;;;55190:7;55199:18;:7;:16;:18::i;:::-;55219:9;55173:56;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55131:104;55124:111;;;54878:365;;;:::o;56223:81::-;13144:12;:10;:12::i;:::-;13133:23;;:7;:5;:7::i;:::-;:23;;;13125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56289:7:::1;;;;;;;;;;;56288:8;56278:7;;:18;;;;;;;;;;;;;;;;;;56223:81::o:0;52420:32::-;;;;:::o;52591:23::-;;;;;;;;;;;;;:::o;36083:164::-;36180:4;36204:18;:25;36223:5;36204:25;;;;;;;;;;;;;;;:35;36230:8;36204:35;;;;;;;;;;;;;;;;;;;;;;;;;36197:42;;36083:164;;;;:::o;13813:192::-;13144:12;:10;:12::i;:::-;13133:23;;:7;:5;:7::i;:::-;:23;;;13125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13922:1:::1;13902:22;;:8;:22;;;;13894:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;13978:19;13988:8;13978:9;:19::i;:::-;13813:192:::0;:::o;53300:488::-;53397:7;;;;;;;;;;;53389:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;53453:15;53471:43;53492:10;53504:9;53471:20;:43::i;:::-;53453:61;;53545:6;;;;;;;;;;;53534:17;;:7;:17;;;:40;;;;53566:8;;;;;;;;;;;53555:19;;:7;:19;;;53534:40;53525:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;52667:1;53662:11;53634:13;:25;53648:10;53634:25;;;;;;;;;;;;;;;;:39;;;;:::i;:::-;:65;;53626:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;53762:18;53768:11;53762:5;:18::i;:::-;53378:410;53300:488;;:::o;32920:305::-;33022:4;33074:25;33059:40;;;:11;:40;;;;:105;;;;33131:33;33116:48;;;:11;:48;;;;33059:105;:158;;;;33181:36;33205:11;33181:23;:36::i;:::-;33059:158;33039:178;;32920:305;;;:::o;38818:127::-;38883:4;38935:1;38907:30;;:7;:16;38915:7;38907:16;;;;;;;;;;;;;;;;;;;;;:30;;;;38900:37;;38818:127;;;:::o;11701:98::-;11754:7;11781:10;11774:17;;11701:98;:::o;42800:174::-;42902:2;42875:15;:24;42891:7;42875:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;42958:7;42954:2;42920:46;;42929:23;42944:7;42929:14;:23::i;:::-;42920:46;;;;;;;;;;;;42800:174;;:::o;39112:348::-;39205:4;39230:16;39238:7;39230;:16::i;:::-;39222:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;39306:13;39322:23;39337:7;39322:14;:23::i;:::-;39306:39;;39375:5;39364:16;;:7;:16;;;:51;;;;39408:7;39384:31;;:20;39396:7;39384:11;:20::i;:::-;:31;;;39364:51;:87;;;;39419:32;39436:5;39443:7;39419:16;:32::i;:::-;39364:87;39356:96;;;39112:348;;;;:::o;42104:578::-;42263:4;42236:31;;:23;42251:7;42236:14;:23::i;:::-;:31;;;42228:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;42346:1;42332:16;;:2;:16;;;;42324:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;42402:39;42423:4;42429:2;42433:7;42402:20;:39::i;:::-;42506:29;42523:1;42527:7;42506:8;:29::i;:::-;42567:1;42548:9;:15;42558:4;42548:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;42596:1;42579:9;:13;42589:2;42579:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;42627:2;42608:7;:16;42616:7;42608:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42666:7;42662:2;42647:27;;42656:4;42647:27;;;;;;;;;;;;42104:578;;;:::o;14013:173::-;14069:16;14088:6;;;;;;;;;;;14069:25;;14114:8;14105:6;;:17;;;;;;;;;;;;;;;;;;14169:8;14138:40;;14159:8;14138:40;;;;;;;;;;;;14058:128;14013:173;:::o;53796:709::-;53848:14;53865:13;:11;:13::i;:::-;53848:30;;53911:1;53897:11;:15;53889:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;53978:13;;53963:11;:28;;53955:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;54067:9;;54052:11;54043:6;:20;;;;:::i;:::-;:33;;54035:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;54153:7;:5;:7::i;:::-;54139:21;;:10;:21;;;54135:248;;54181:7;;;;;;;;;;;54177:88;;;54238:11;54209:13;:25;54223:10;54209:25;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;54177:88;54307:11;54300:4;;:18;;;;:::i;:::-;54287:9;:31;;54279:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;54135:248;54400:9;54412:1;54400:13;;54395:103;54420:11;54415:1;:16;54395:103;;54453:33;54463:10;54484:1;54475:6;:10;;;;:::i;:::-;54453:9;:33::i;:::-;54433:3;;;;;:::i;:::-;;;;54395:103;;;;53837:668;53796:709;:::o;38190:315::-;38347:28;38357:4;38363:2;38367:7;38347:9;:28::i;:::-;38394:48;38417:4;38423:2;38427:7;38436:5;38394:22;:48::i;:::-;38386:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;38190:315;;;;:::o;52976:107::-;53036:13;53068:7;53061:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52976:107;:::o;9317:723::-;9373:13;9603:1;9594:5;:10;9590:53;;;9621:10;;;;;;;;;;;;;;;;;;;;;9590:53;9653:12;9668:5;9653:20;;9684:14;9709:78;9724:1;9716:4;:9;9709:78;;9742:8;;;;;:::i;:::-;;;;9773:2;9765:10;;;;;:::i;:::-;;;9709:78;;;9797:19;9829:6;9819:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9797:39;;9847:154;9863:1;9854:5;:10;9847:154;;9891:1;9881:11;;;;;:::i;:::-;;;9958:2;9950:5;:10;;;;:::i;:::-;9937:2;:24;;;;:::i;:::-;9924:39;;9907:6;9914;9907:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9987:2;9978:11;;;;;:::i;:::-;;;9847:154;;;10025:6;10011:21;;;;;9317:723;;;;:::o;55503:199::-;55595:7;55615:12;55630:23;55646:6;55630:15;:23::i;:::-;55615:38;;55671:23;55684:9;55671:4;:12;;:23;;;;:::i;:::-;55664:30;;;55503:199;;;;:::o;24899:157::-;24984:4;25023:25;25008:40;;;:11;:40;;;;25001:47;;24899:157;;;:::o;47649:589::-;47793:45;47820:4;47826:2;47830:7;47793:26;:45::i;:::-;47871:1;47855:18;;:4;:18;;;47851:187;;;47890:40;47922:7;47890:31;:40::i;:::-;47851:187;;;47960:2;47952:10;;:4;:10;;;47948:90;;47979:47;48012:4;48018:7;47979:32;:47::i;:::-;47948:90;47851:187;48066:1;48052:16;;:2;:16;;;48048:183;;;48085:45;48122:7;48085:36;:45::i;:::-;48048:183;;;48158:4;48152:10;;:2;:10;;;48148:83;;48179:40;48207:2;48211:7;48179:27;:40::i;:::-;48148:83;48048:183;47649:589;;;:::o;39802:110::-;39878:26;39888:2;39892:7;39878:26;;;;;;;;;;;;:9;:26::i;:::-;39802:110;;:::o;43539:799::-;43694:4;43715:15;:2;:13;;;:15::i;:::-;43711:620;;;43767:2;43751:36;;;43788:12;:10;:12::i;:::-;43802:4;43808:7;43817:5;43751:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;43747:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44010:1;43993:6;:13;:18;43989:272;;;44036:60;;;;;;;;;;:::i;:::-;;;;;;;;43989:272;44211:6;44205:13;44196:6;44192:2;44188:15;44181:38;43747:529;43884:41;;;43874:51;;;:6;:51;;;;43867:58;;;;;43711:620;44315:4;44308:11;;43539:799;;;;;;;:::o;55259:236::-;55322:7;55342:16;55388:6;55371:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;55361:35;;;;;;55342:54;;55477:8;55424:62;;;;;;;;:::i;:::-;;;;;;;;;;;;;55414:73;;;;;;55407:80;;;55259:236;;;:::o;4335:231::-;4413:7;4434:17;4453:18;4475:27;4486:4;4492:9;4475:10;:27::i;:::-;4433:69;;;;4513:18;4525:5;4513:11;:18::i;:::-;4549:9;4542:16;;;;4335:231;;;;:::o;44910:126::-;;;;:::o;48961:164::-;49065:10;:17;;;;49038:15;:24;49054:7;49038:24;;;;;;;;;;;:44;;;;49093:10;49109:7;49093:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48961:164;:::o;49752:988::-;50018:22;50068:1;50043:22;50060:4;50043:16;:22::i;:::-;:26;;;;:::i;:::-;50018:51;;50080:18;50101:17;:26;50119:7;50101:26;;;;;;;;;;;;50080:47;;50248:14;50234:10;:28;50230:328;;50279:19;50301:12;:18;50314:4;50301:18;;;;;;;;;;;;;;;:34;50320:14;50301:34;;;;;;;;;;;;50279:56;;50385:11;50352:12;:18;50365:4;50352:18;;;;;;;;;;;;;;;:30;50371:10;50352:30;;;;;;;;;;;:44;;;;50502:10;50469:17;:30;50487:11;50469:30;;;;;;;;;;;:43;;;;50264:294;50230:328;50654:17;:26;50672:7;50654:26;;;;;;;;;;;50647:33;;;50698:12;:18;50711:4;50698:18;;;;;;;;;;;;;;;:34;50717:14;50698:34;;;;;;;;;;;50691:41;;;49833:907;;49752:988;;:::o;51035:1079::-;51288:22;51333:1;51313:10;:17;;;;:21;;;;:::i;:::-;51288:46;;51345:18;51366:15;:24;51382:7;51366:24;;;;;;;;;;;;51345:45;;51717:19;51739:10;51750:14;51739:26;;;;;;;;:::i;:::-;;;;;;;;;;51717:48;;51803:11;51778:10;51789;51778:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;51914:10;51883:15;:28;51899:11;51883:28;;;;;;;;;;;:41;;;;52055:15;:24;52071:7;52055:24;;;;;;;;;;;52048:31;;;52090:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51106:1008;;;51035:1079;:::o;48539:221::-;48624:14;48641:20;48658:2;48641:16;:20::i;:::-;48624:37;;48699:7;48672:12;:16;48685:2;48672:16;;;;;;;;;;;;;;;:24;48689:6;48672:24;;;;;;;;;;;:34;;;;48746:6;48717:17;:26;48735:7;48717:26;;;;;;;;;;;:35;;;;48613:147;48539:221;;:::o;40139:321::-;40269:18;40275:2;40279:7;40269:5;:18::i;:::-;40320:54;40351:1;40355:2;40359:7;40368:5;40320:22;:54::i;:::-;40298:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;40139:321;;;:::o;14959:387::-;15019:4;15227:12;15294:7;15282:20;15274:28;;15337:1;15330:4;:8;15323:15;;;14959:387;;;:::o;2225:1308::-;2306:7;2315:12;2560:2;2540:9;:16;:22;2536:990;;;2579:9;2603;2627:7;2836:4;2825:9;2821:20;2815:27;2810:32;;2886:4;2875:9;2871:20;2865:27;2860:32;;2944:4;2933:9;2929:20;2923:27;2920:1;2915:36;2910:41;;2987:25;2998:4;3004:1;3007;3010;2987:10;:25::i;:::-;2980:32;;;;;;;;;2536:990;3054:2;3034:9;:16;:22;3030:496;;;3073:9;3097:10;3309:4;3298:9;3294:20;3288:27;3283:32;;3360:4;3349:9;3345:20;3339:27;3333:33;;3402:23;3413:4;3419:1;3422:2;3402:10;:23::i;:::-;3395:30;;;;;;;;3030:496;3474:1;3478:35;3458:56;;;;2225:1308;;;;;;:::o;496:643::-;574:20;565:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;561:571;;;611:7;;561:571;672:29;663:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;659:473;;;718:34;;;;;;;;;;:::i;:::-;;;;;;;;659:473;783:35;774:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;770:362;;;835:41;;;;;;;;;;:::i;:::-;;;;;;;;770:362;907:30;898:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;894:238;;;954:44;;;;;;;;;;:::i;:::-;;;;;;;;894:238;1029:30;1020:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;1016:116;;;1076:44;;;;;;;;;;:::i;:::-;;;;;;;;1016:116;496:643;;:::o;40796:382::-;40890:1;40876:16;;:2;:16;;;;40868:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;40949:16;40957:7;40949;:16::i;:::-;40948:17;40940:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;41011:45;41040:1;41044:2;41048:7;41011:20;:45::i;:::-;41086:1;41069:9;:13;41079:2;41069:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41117:2;41098:7;:16;41106:7;41098:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41162:7;41158:2;41137:33;;41154:1;41137:33;;;;;;;;;;;;40796:382;;:::o;5834:1632::-;5965:7;5974:12;6899:66;6894:1;6886:10;;:79;6882:163;;;6998:1;7002:30;6982:51;;;;;;6882:163;7064:2;7059:1;:7;;;;:18;;;;;7075:2;7070:1;:7;;;;7059:18;7055:102;;;7110:1;7114:30;7094:51;;;;;;7055:102;7254:14;7271:24;7281:4;7287:1;7290;7293;7271:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7254:41;;7328:1;7310:20;;:6;:20;;;7306:103;;;7363:1;7367:29;7347:50;;;;;;;7306:103;7429:6;7437:20;7421:37;;;;;5834:1632;;;;;;;;:::o;4829:391::-;4943:7;4952:12;4977:9;4997:7;5052:66;5048:2;5044:75;5039:80;;5156:2;5151;5146:3;5142:12;5138:21;5133:26;;5187:25;5198:4;5204:1;5207;5210;5187:10;:25::i;:::-;5180:32;;;;;;4829:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:899::-;7247:6;7255;7263;7271;7279;7328:3;7316:9;7307:7;7303:23;7299:33;7296:120;;;7335:79;;:::i;:::-;7296:120;7455:1;7480:53;7525:7;7516:6;7505:9;7501:22;7480:53;:::i;:::-;7470:63;;7426:117;7582:2;7608:50;7650:7;7641:6;7630:9;7626:22;7608:50;:::i;:::-;7598:60;;7553:115;7707:2;7733:50;7775:7;7766:6;7755:9;7751:22;7733:50;:::i;:::-;7723:60;;7678:115;7832:2;7858:53;7903:7;7894:6;7883:9;7879:22;7858:53;:::i;:::-;7848:63;;7803:118;7960:3;7987:53;8032:7;8023:6;8012:9;8008:22;7987:53;:::i;:::-;7977:63;;7931:119;7158:899;;;;;;;;:::o;8063:652::-;8140:6;8148;8197:2;8185:9;8176:7;8172:23;8168:32;8165:119;;;8203:79;;:::i;:::-;8165:119;8323:1;8348:53;8393:7;8384:6;8373:9;8369:22;8348:53;:::i;:::-;8338:63;;8294:117;8478:2;8467:9;8463:18;8450:32;8509:18;8501:6;8498:30;8495:117;;;8531:79;;:::i;:::-;8495:117;8636:62;8690:7;8681:6;8670:9;8666:22;8636:62;:::i;:::-;8626:72;;8421:287;8063:652;;;;;:::o;8721:179::-;8790:10;8811:46;8853:3;8845:6;8811:46;:::i;:::-;8889:4;8884:3;8880:14;8866:28;;8721:179;;;;:::o;8906:118::-;8993:24;9011:5;8993:24;:::i;:::-;8988:3;8981:37;8906:118;;:::o;9030:157::-;9135:45;9155:24;9173:5;9155:24;:::i;:::-;9135:45;:::i;:::-;9130:3;9123:58;9030:157;;:::o;9223:732::-;9342:3;9371:54;9419:5;9371:54;:::i;:::-;9441:86;9520:6;9515:3;9441:86;:::i;:::-;9434:93;;9551:56;9601:5;9551:56;:::i;:::-;9630:7;9661:1;9646:284;9671:6;9668:1;9665:13;9646:284;;;9747:6;9741:13;9774:63;9833:3;9818:13;9774:63;:::i;:::-;9767:70;;9860:60;9913:6;9860:60;:::i;:::-;9850:70;;9706:224;9693:1;9690;9686:9;9681:14;;9646:284;;;9650:14;9946:3;9939:10;;9347:608;;;9223:732;;;;:::o;9961:109::-;10042:21;10057:5;10042:21;:::i;:::-;10037:3;10030:34;9961:109;;:::o;10076:118::-;10163:24;10181:5;10163:24;:::i;:::-;10158:3;10151:37;10076:118;;:::o;10200:157::-;10305:45;10325:24;10343:5;10325:24;:::i;:::-;10305:45;:::i;:::-;10300:3;10293:58;10200:157;;:::o;10363:360::-;10449:3;10477:38;10509:5;10477:38;:::i;:::-;10531:70;10594:6;10589:3;10531:70;:::i;:::-;10524:77;;10610:52;10655:6;10650:3;10643:4;10636:5;10632:16;10610:52;:::i;:::-;10687:29;10709:6;10687:29;:::i;:::-;10682:3;10678:39;10671:46;;10453:270;10363:360;;;;:::o;10729:364::-;10817:3;10845:39;10878:5;10845:39;:::i;:::-;10900:71;10964:6;10959:3;10900:71;:::i;:::-;10893:78;;10980:52;11025:6;11020:3;11013:4;11006:5;11002:16;10980:52;:::i;:::-;11057:29;11079:6;11057:29;:::i;:::-;11052:3;11048:39;11041:46;;10821:272;10729:364;;;;:::o;11099:377::-;11205:3;11233:39;11266:5;11233:39;:::i;:::-;11288:89;11370:6;11365:3;11288:89;:::i;:::-;11281:96;;11386:52;11431:6;11426:3;11419:4;11412:5;11408:16;11386:52;:::i;:::-;11463:6;11458:3;11454:16;11447:23;;11209:267;11099:377;;;;:::o;11506:845::-;11609:3;11646:5;11640:12;11675:36;11701:9;11675:36;:::i;:::-;11727:89;11809:6;11804:3;11727:89;:::i;:::-;11720:96;;11847:1;11836:9;11832:17;11863:1;11858:137;;;;12009:1;12004:341;;;;11825:520;;11858:137;11942:4;11938:9;11927;11923:25;11918:3;11911:38;11978:6;11973:3;11969:16;11962:23;;11858:137;;12004:341;12071:38;12103:5;12071:38;:::i;:::-;12131:1;12145:154;12159:6;12156:1;12153:13;12145:154;;;12233:7;12227:14;12223:1;12218:3;12214:11;12207:35;12283:1;12274:7;12270:15;12259:26;;12181:4;12178:1;12174:12;12169:17;;12145:154;;;12328:6;12323:3;12319:16;12312:23;;12011:334;;11825:520;;11613:738;;11506:845;;;;:::o;12357:366::-;12499:3;12520:67;12584:2;12579:3;12520:67;:::i;:::-;12513:74;;12596:93;12685:3;12596:93;:::i;:::-;12714:2;12709:3;12705:12;12698:19;;12357:366;;;:::o;12729:::-;12871:3;12892:67;12956:2;12951:3;12892:67;:::i;:::-;12885:74;;12968:93;13057:3;12968:93;:::i;:::-;13086:2;13081:3;13077:12;13070:19;;12729:366;;;:::o;13101:::-;13243:3;13264:67;13328:2;13323:3;13264:67;:::i;:::-;13257:74;;13340:93;13429:3;13340:93;:::i;:::-;13458:2;13453:3;13449:12;13442:19;;13101:366;;;:::o;13473:402::-;13633:3;13654:85;13736:2;13731:3;13654:85;:::i;:::-;13647:92;;13748:93;13837:3;13748:93;:::i;:::-;13866:2;13861:3;13857:12;13850:19;;13473:402;;;:::o;13881:366::-;14023:3;14044:67;14108:2;14103:3;14044:67;:::i;:::-;14037:74;;14120:93;14209:3;14120:93;:::i;:::-;14238:2;14233:3;14229:12;14222:19;;13881:366;;;:::o;14253:::-;14395:3;14416:67;14480:2;14475:3;14416:67;:::i;:::-;14409:74;;14492:93;14581:3;14492:93;:::i;:::-;14610:2;14605:3;14601:12;14594:19;;14253:366;;;:::o;14625:::-;14767:3;14788:67;14852:2;14847:3;14788:67;:::i;:::-;14781:74;;14864:93;14953:3;14864:93;:::i;:::-;14982:2;14977:3;14973:12;14966:19;;14625:366;;;:::o;14997:::-;15139:3;15160:67;15224:2;15219:3;15160:67;:::i;:::-;15153:74;;15236:93;15325:3;15236:93;:::i;:::-;15354:2;15349:3;15345:12;15338:19;;14997:366;;;:::o;15369:::-;15511:3;15532:67;15596:2;15591:3;15532:67;:::i;:::-;15525:74;;15608:93;15697:3;15608:93;:::i;:::-;15726:2;15721:3;15717:12;15710:19;;15369:366;;;:::o;15741:::-;15883:3;15904:67;15968:2;15963:3;15904:67;:::i;:::-;15897:74;;15980:93;16069:3;15980:93;:::i;:::-;16098:2;16093:3;16089:12;16082:19;;15741:366;;;:::o;16113:::-;16255:3;16276:67;16340:2;16335:3;16276:67;:::i;:::-;16269:74;;16352:93;16441:3;16352:93;:::i;:::-;16470:2;16465:3;16461:12;16454:19;;16113:366;;;:::o;16485:::-;16627:3;16648:67;16712:2;16707:3;16648:67;:::i;:::-;16641:74;;16724:93;16813:3;16724:93;:::i;:::-;16842:2;16837:3;16833:12;16826:19;;16485:366;;;:::o;16857:::-;16999:3;17020:67;17084:2;17079:3;17020:67;:::i;:::-;17013:74;;17096:93;17185:3;17096:93;:::i;:::-;17214:2;17209:3;17205:12;17198:19;;16857:366;;;:::o;17229:::-;17371:3;17392:67;17456:2;17451:3;17392:67;:::i;:::-;17385:74;;17468:93;17557:3;17468:93;:::i;:::-;17586:2;17581:3;17577:12;17570:19;;17229:366;;;:::o;17601:::-;17743:3;17764:67;17828:2;17823:3;17764:67;:::i;:::-;17757:74;;17840:93;17929:3;17840:93;:::i;:::-;17958:2;17953:3;17949:12;17942:19;;17601:366;;;:::o;17973:::-;18115:3;18136:67;18200:2;18195:3;18136:67;:::i;:::-;18129:74;;18212:93;18301:3;18212:93;:::i;:::-;18330:2;18325:3;18321:12;18314:19;;17973:366;;;:::o;18345:::-;18487:3;18508:67;18572:2;18567:3;18508:67;:::i;:::-;18501:74;;18584:93;18673:3;18584:93;:::i;:::-;18702:2;18697:3;18693:12;18686:19;;18345:366;;;:::o;18717:::-;18859:3;18880:67;18944:2;18939:3;18880:67;:::i;:::-;18873:74;;18956:93;19045:3;18956:93;:::i;:::-;19074:2;19069:3;19065:12;19058:19;;18717:366;;;:::o;19089:::-;19231:3;19252:67;19316:2;19311:3;19252:67;:::i;:::-;19245:74;;19328:93;19417:3;19328:93;:::i;:::-;19446:2;19441:3;19437:12;19430:19;;19089:366;;;:::o;19461:::-;19603:3;19624:67;19688:2;19683:3;19624:67;:::i;:::-;19617:74;;19700:93;19789:3;19700:93;:::i;:::-;19818:2;19813:3;19809:12;19802:19;;19461:366;;;:::o;19833:::-;19975:3;19996:67;20060:2;20055:3;19996:67;:::i;:::-;19989:74;;20072:93;20161:3;20072:93;:::i;:::-;20190:2;20185:3;20181:12;20174:19;;19833:366;;;:::o;20205:::-;20347:3;20368:67;20432:2;20427:3;20368:67;:::i;:::-;20361:74;;20444:93;20533:3;20444:93;:::i;:::-;20562:2;20557:3;20553:12;20546:19;;20205:366;;;:::o;20577:::-;20719:3;20740:67;20804:2;20799:3;20740:67;:::i;:::-;20733:74;;20816:93;20905:3;20816:93;:::i;:::-;20934:2;20929:3;20925:12;20918:19;;20577:366;;;:::o;20949:::-;21091:3;21112:67;21176:2;21171:3;21112:67;:::i;:::-;21105:74;;21188:93;21277:3;21188:93;:::i;:::-;21306:2;21301:3;21297:12;21290:19;;20949:366;;;:::o;21321:::-;21463:3;21484:67;21548:2;21543:3;21484:67;:::i;:::-;21477:74;;21560:93;21649:3;21560:93;:::i;:::-;21678:2;21673:3;21669:12;21662:19;;21321:366;;;:::o;21693:::-;21835:3;21856:67;21920:2;21915:3;21856:67;:::i;:::-;21849:74;;21932:93;22021:3;21932:93;:::i;:::-;22050:2;22045:3;22041:12;22034:19;;21693:366;;;:::o;22065:::-;22207:3;22228:67;22292:2;22287:3;22228:67;:::i;:::-;22221:74;;22304:93;22393:3;22304:93;:::i;:::-;22422:2;22417:3;22413:12;22406:19;;22065:366;;;:::o;22437:::-;22579:3;22600:67;22664:2;22659:3;22600:67;:::i;:::-;22593:74;;22676:93;22765:3;22676:93;:::i;:::-;22794:2;22789:3;22785:12;22778:19;;22437:366;;;:::o;22809:::-;22951:3;22972:67;23036:2;23031:3;22972:67;:::i;:::-;22965:74;;23048:93;23137:3;23048:93;:::i;:::-;23166:2;23161:3;23157:12;23150:19;;22809:366;;;:::o;23181:398::-;23340:3;23361:83;23442:1;23437:3;23361:83;:::i;:::-;23354:90;;23453:93;23542:3;23453:93;:::i;:::-;23571:1;23566:3;23562:11;23555:18;;23181:398;;;:::o;23585:366::-;23727:3;23748:67;23812:2;23807:3;23748:67;:::i;:::-;23741:74;;23824:93;23913:3;23824:93;:::i;:::-;23942:2;23937:3;23933:12;23926:19;;23585:366;;;:::o;23957:::-;24099:3;24120:67;24184:2;24179:3;24120:67;:::i;:::-;24113:74;;24196:93;24285:3;24196:93;:::i;:::-;24314:2;24309:3;24305:12;24298:19;;23957:366;;;:::o;24329:::-;24471:3;24492:67;24556:2;24551:3;24492:67;:::i;:::-;24485:74;;24568:93;24657:3;24568:93;:::i;:::-;24686:2;24681:3;24677:12;24670:19;;24329:366;;;:::o;24701:::-;24843:3;24864:67;24928:2;24923:3;24864:67;:::i;:::-;24857:74;;24940:93;25029:3;24940:93;:::i;:::-;25058:2;25053:3;25049:12;25042:19;;24701:366;;;:::o;25073:108::-;25150:24;25168:5;25150:24;:::i;:::-;25145:3;25138:37;25073:108;;:::o;25187:118::-;25274:24;25292:5;25274:24;:::i;:::-;25269:3;25262:37;25187:118;;:::o;25311:112::-;25394:22;25410:5;25394:22;:::i;:::-;25389:3;25382:35;25311:112;;:::o;25429:256::-;25541:3;25556:75;25627:3;25618:6;25556:75;:::i;:::-;25656:2;25651:3;25647:12;25640:19;;25676:3;25669:10;;25429:256;;;;:::o;25691:583::-;25913:3;25935:92;26023:3;26014:6;25935:92;:::i;:::-;25928:99;;26044:95;26135:3;26126:6;26044:95;:::i;:::-;26037:102;;26156:92;26244:3;26235:6;26156:92;:::i;:::-;26149:99;;26265:3;26258:10;;25691:583;;;;;;:::o;26280:522::-;26493:3;26515:148;26659:3;26515:148;:::i;:::-;26508:155;;26673:75;26744:3;26735:6;26673:75;:::i;:::-;26773:2;26768:3;26764:12;26757:19;;26793:3;26786:10;;26280:522;;;;:::o;26808:379::-;26992:3;27014:147;27157:3;27014:147;:::i;:::-;27007:154;;27178:3;27171:10;;26808:379;;;:::o;27193:222::-;27286:4;27324:2;27313:9;27309:18;27301:26;;27337:71;27405:1;27394:9;27390:17;27381:6;27337:71;:::i;:::-;27193:222;;;;:::o;27421:640::-;27616:4;27654:3;27643:9;27639:19;27631:27;;27668:71;27736:1;27725:9;27721:17;27712:6;27668:71;:::i;:::-;27749:72;27817:2;27806:9;27802:18;27793:6;27749:72;:::i;:::-;27831;27899:2;27888:9;27884:18;27875:6;27831:72;:::i;:::-;27950:9;27944:4;27940:20;27935:2;27924:9;27920:18;27913:48;27978:76;28049:4;28040:6;27978:76;:::i;:::-;27970:84;;27421:640;;;;;;;:::o;28067:373::-;28210:4;28248:2;28237:9;28233:18;28225:26;;28297:9;28291:4;28287:20;28283:1;28272:9;28268:17;28261:47;28325:108;28428:4;28419:6;28325:108;:::i;:::-;28317:116;;28067:373;;;;:::o;28446:210::-;28533:4;28571:2;28560:9;28556:18;28548:26;;28584:65;28646:1;28635:9;28631:17;28622:6;28584:65;:::i;:::-;28446:210;;;;:::o;28662:545::-;28835:4;28873:3;28862:9;28858:19;28850:27;;28887:71;28955:1;28944:9;28940:17;28931:6;28887:71;:::i;:::-;28968:68;29032:2;29021:9;29017:18;29008:6;28968:68;:::i;:::-;29046:72;29114:2;29103:9;29099:18;29090:6;29046:72;:::i;:::-;29128;29196:2;29185:9;29181:18;29172:6;29128:72;:::i;:::-;28662:545;;;;;;;:::o;29213:313::-;29326:4;29364:2;29353:9;29349:18;29341:26;;29413:9;29407:4;29403:20;29399:1;29388:9;29384:17;29377:47;29441:78;29514:4;29505:6;29441:78;:::i;:::-;29433:86;;29213:313;;;;:::o;29532:419::-;29698:4;29736:2;29725:9;29721:18;29713:26;;29785:9;29779:4;29775:20;29771:1;29760:9;29756:17;29749:47;29813:131;29939:4;29813:131;:::i;:::-;29805:139;;29532:419;;;:::o;29957:::-;30123:4;30161:2;30150:9;30146:18;30138:26;;30210:9;30204:4;30200:20;30196:1;30185:9;30181:17;30174:47;30238:131;30364:4;30238:131;:::i;:::-;30230:139;;29957:419;;;:::o;30382:::-;30548:4;30586:2;30575:9;30571:18;30563:26;;30635:9;30629:4;30625:20;30621:1;30610:9;30606:17;30599:47;30663:131;30789:4;30663:131;:::i;:::-;30655:139;;30382:419;;;:::o;30807:::-;30973:4;31011:2;31000:9;30996:18;30988:26;;31060:9;31054:4;31050:20;31046:1;31035:9;31031:17;31024:47;31088:131;31214:4;31088:131;:::i;:::-;31080:139;;30807:419;;;:::o;31232:::-;31398:4;31436:2;31425:9;31421:18;31413:26;;31485:9;31479:4;31475:20;31471:1;31460:9;31456:17;31449:47;31513:131;31639:4;31513:131;:::i;:::-;31505:139;;31232:419;;;:::o;31657:::-;31823:4;31861:2;31850:9;31846:18;31838:26;;31910:9;31904:4;31900:20;31896:1;31885:9;31881:17;31874:47;31938:131;32064:4;31938:131;:::i;:::-;31930:139;;31657:419;;;:::o;32082:::-;32248:4;32286:2;32275:9;32271:18;32263:26;;32335:9;32329:4;32325:20;32321:1;32310:9;32306:17;32299:47;32363:131;32489:4;32363:131;:::i;:::-;32355:139;;32082:419;;;:::o;32507:::-;32673:4;32711:2;32700:9;32696:18;32688:26;;32760:9;32754:4;32750:20;32746:1;32735:9;32731:17;32724:47;32788:131;32914:4;32788:131;:::i;:::-;32780:139;;32507:419;;;:::o;32932:::-;33098:4;33136:2;33125:9;33121:18;33113:26;;33185:9;33179:4;33175:20;33171:1;33160:9;33156:17;33149:47;33213:131;33339:4;33213:131;:::i;:::-;33205:139;;32932:419;;;:::o;33357:::-;33523:4;33561:2;33550:9;33546:18;33538:26;;33610:9;33604:4;33600:20;33596:1;33585:9;33581:17;33574:47;33638:131;33764:4;33638:131;:::i;:::-;33630:139;;33357:419;;;:::o;33782:::-;33948:4;33986:2;33975:9;33971:18;33963:26;;34035:9;34029:4;34025:20;34021:1;34010:9;34006:17;33999:47;34063:131;34189:4;34063:131;:::i;:::-;34055:139;;33782:419;;;:::o;34207:::-;34373:4;34411:2;34400:9;34396:18;34388:26;;34460:9;34454:4;34450:20;34446:1;34435:9;34431:17;34424:47;34488:131;34614:4;34488:131;:::i;:::-;34480:139;;34207:419;;;:::o;34632:::-;34798:4;34836:2;34825:9;34821:18;34813:26;;34885:9;34879:4;34875:20;34871:1;34860:9;34856:17;34849:47;34913:131;35039:4;34913:131;:::i;:::-;34905:139;;34632:419;;;:::o;35057:::-;35223:4;35261:2;35250:9;35246:18;35238:26;;35310:9;35304:4;35300:20;35296:1;35285:9;35281:17;35274:47;35338:131;35464:4;35338:131;:::i;:::-;35330:139;;35057:419;;;:::o;35482:::-;35648:4;35686:2;35675:9;35671:18;35663:26;;35735:9;35729:4;35725:20;35721:1;35710:9;35706:17;35699:47;35763:131;35889:4;35763:131;:::i;:::-;35755:139;;35482:419;;;:::o;35907:::-;36073:4;36111:2;36100:9;36096:18;36088:26;;36160:9;36154:4;36150:20;36146:1;36135:9;36131:17;36124:47;36188:131;36314:4;36188:131;:::i;:::-;36180:139;;35907:419;;;:::o;36332:::-;36498:4;36536:2;36525:9;36521:18;36513:26;;36585:9;36579:4;36575:20;36571:1;36560:9;36556:17;36549:47;36613:131;36739:4;36613:131;:::i;:::-;36605:139;;36332:419;;;:::o;36757:::-;36923:4;36961:2;36950:9;36946:18;36938:26;;37010:9;37004:4;37000:20;36996:1;36985:9;36981:17;36974:47;37038:131;37164:4;37038:131;:::i;:::-;37030:139;;36757:419;;;:::o;37182:::-;37348:4;37386:2;37375:9;37371:18;37363:26;;37435:9;37429:4;37425:20;37421:1;37410:9;37406:17;37399:47;37463:131;37589:4;37463:131;:::i;:::-;37455:139;;37182:419;;;:::o;37607:::-;37773:4;37811:2;37800:9;37796:18;37788:26;;37860:9;37854:4;37850:20;37846:1;37835:9;37831:17;37824:47;37888:131;38014:4;37888:131;:::i;:::-;37880:139;;37607:419;;;:::o;38032:::-;38198:4;38236:2;38225:9;38221:18;38213:26;;38285:9;38279:4;38275:20;38271:1;38260:9;38256:17;38249:47;38313:131;38439:4;38313:131;:::i;:::-;38305:139;;38032:419;;;:::o;38457:::-;38623:4;38661:2;38650:9;38646:18;38638:26;;38710:9;38704:4;38700:20;38696:1;38685:9;38681:17;38674:47;38738:131;38864:4;38738:131;:::i;:::-;38730:139;;38457:419;;;:::o;38882:::-;39048:4;39086:2;39075:9;39071:18;39063:26;;39135:9;39129:4;39125:20;39121:1;39110:9;39106:17;39099:47;39163:131;39289:4;39163:131;:::i;:::-;39155:139;;38882:419;;;:::o;39307:::-;39473:4;39511:2;39500:9;39496:18;39488:26;;39560:9;39554:4;39550:20;39546:1;39535:9;39531:17;39524:47;39588:131;39714:4;39588:131;:::i;:::-;39580:139;;39307:419;;;:::o;39732:::-;39898:4;39936:2;39925:9;39921:18;39913:26;;39985:9;39979:4;39975:20;39971:1;39960:9;39956:17;39949:47;40013:131;40139:4;40013:131;:::i;:::-;40005:139;;39732:419;;;:::o;40157:::-;40323:4;40361:2;40350:9;40346:18;40338:26;;40410:9;40404:4;40400:20;40396:1;40385:9;40381:17;40374:47;40438:131;40564:4;40438:131;:::i;:::-;40430:139;;40157:419;;;:::o;40582:::-;40748:4;40786:2;40775:9;40771:18;40763:26;;40835:9;40829:4;40825:20;40821:1;40810:9;40806:17;40799:47;40863:131;40989:4;40863:131;:::i;:::-;40855:139;;40582:419;;;:::o;41007:::-;41173:4;41211:2;41200:9;41196:18;41188:26;;41260:9;41254:4;41250:20;41246:1;41235:9;41231:17;41224:47;41288:131;41414:4;41288:131;:::i;:::-;41280:139;;41007:419;;;:::o;41432:::-;41598:4;41636:2;41625:9;41621:18;41613:26;;41685:9;41679:4;41675:20;41671:1;41660:9;41656:17;41649:47;41713:131;41839:4;41713:131;:::i;:::-;41705:139;;41432:419;;;:::o;41857:::-;42023:4;42061:2;42050:9;42046:18;42038:26;;42110:9;42104:4;42100:20;42096:1;42085:9;42081:17;42074:47;42138:131;42264:4;42138:131;:::i;:::-;42130:139;;41857:419;;;:::o;42282:::-;42448:4;42486:2;42475:9;42471:18;42463:26;;42535:9;42529:4;42525:20;42521:1;42510:9;42506:17;42499:47;42563:131;42689:4;42563:131;:::i;:::-;42555:139;;42282:419;;;:::o;42707:::-;42873:4;42911:2;42900:9;42896:18;42888:26;;42960:9;42954:4;42950:20;42946:1;42935:9;42931:17;42924:47;42988:131;43114:4;42988:131;:::i;:::-;42980:139;;42707:419;;;:::o;43132:222::-;43225:4;43263:2;43252:9;43248:18;43240:26;;43276:71;43344:1;43333:9;43329:17;43320:6;43276:71;:::i;:::-;43132:222;;;;:::o;43360:129::-;43394:6;43421:20;;:::i;:::-;43411:30;;43450:33;43478:4;43470:6;43450:33;:::i;:::-;43360:129;;;:::o;43495:75::-;43528:6;43561:2;43555:9;43545:19;;43495:75;:::o;43576:307::-;43637:4;43727:18;43719:6;43716:30;43713:56;;;43749:18;;:::i;:::-;43713:56;43787:29;43809:6;43787:29;:::i;:::-;43779:37;;43871:4;43865;43861:15;43853:23;;43576:307;;;:::o;43889:308::-;43951:4;44041:18;44033:6;44030:30;44027:56;;;44063:18;;:::i;:::-;44027:56;44101:29;44123:6;44101:29;:::i;:::-;44093:37;;44185:4;44179;44175:15;44167:23;;43889:308;;;:::o;44203:132::-;44270:4;44293:3;44285:11;;44323:4;44318:3;44314:14;44306:22;;44203:132;;;:::o;44341:141::-;44390:4;44413:3;44405:11;;44436:3;44433:1;44426:14;44470:4;44467:1;44457:18;44449:26;;44341:141;;;:::o;44488:114::-;44555:6;44589:5;44583:12;44573:22;;44488:114;;;:::o;44608:98::-;44659:6;44693:5;44687:12;44677:22;;44608:98;;;:::o;44712:99::-;44764:6;44798:5;44792:12;44782:22;;44712:99;;;:::o;44817:113::-;44887:4;44919;44914:3;44910:14;44902:22;;44817:113;;;:::o;44936:184::-;45035:11;45069:6;45064:3;45057:19;45109:4;45104:3;45100:14;45085:29;;44936:184;;;;:::o;45126:168::-;45209:11;45243:6;45238:3;45231:19;45283:4;45278:3;45274:14;45259:29;;45126:168;;;;:::o;45300:147::-;45401:11;45438:3;45423:18;;45300:147;;;;:::o;45453:169::-;45537:11;45571:6;45566:3;45559:19;45611:4;45606:3;45602:14;45587:29;;45453:169;;;;:::o;45628:148::-;45730:11;45767:3;45752:18;;45628:148;;;;:::o;45782:305::-;45822:3;45841:20;45859:1;45841:20;:::i;:::-;45836:25;;45875:20;45893:1;45875:20;:::i;:::-;45870:25;;46029:1;45961:66;45957:74;45954:1;45951:81;45948:107;;;46035:18;;:::i;:::-;45948:107;46079:1;46076;46072:9;46065:16;;45782:305;;;;:::o;46093:185::-;46133:1;46150:20;46168:1;46150:20;:::i;:::-;46145:25;;46184:20;46202:1;46184:20;:::i;:::-;46179:25;;46223:1;46213:35;;46228:18;;:::i;:::-;46213:35;46270:1;46267;46263:9;46258:14;;46093:185;;;;:::o;46284:348::-;46324:7;46347:20;46365:1;46347:20;:::i;:::-;46342:25;;46381:20;46399:1;46381:20;:::i;:::-;46376:25;;46569:1;46501:66;46497:74;46494:1;46491:81;46486:1;46479:9;46472:17;46468:105;46465:131;;;46576:18;;:::i;:::-;46465:131;46624:1;46621;46617:9;46606:20;;46284:348;;;;:::o;46638:191::-;46678:4;46698:20;46716:1;46698:20;:::i;:::-;46693:25;;46732:20;46750:1;46732:20;:::i;:::-;46727:25;;46771:1;46768;46765:8;46762:34;;;46776:18;;:::i;:::-;46762:34;46821:1;46818;46814:9;46806:17;;46638:191;;;;:::o;46835:96::-;46872:7;46901:24;46919:5;46901:24;:::i;:::-;46890:35;;46835:96;;;:::o;46937:90::-;46971:7;47014:5;47007:13;47000:21;46989:32;;46937:90;;;:::o;47033:77::-;47070:7;47099:5;47088:16;;47033:77;;;:::o;47116:149::-;47152:7;47192:66;47185:5;47181:78;47170:89;;47116:149;;;:::o;47271:126::-;47308:7;47348:42;47341:5;47337:54;47326:65;;47271:126;;;:::o;47403:77::-;47440:7;47469:5;47458:16;;47403:77;;;:::o;47486:86::-;47521:7;47561:4;47554:5;47550:16;47539:27;;47486:86;;;:::o;47578:154::-;47662:6;47657:3;47652;47639:30;47724:1;47715:6;47710:3;47706:16;47699:27;47578:154;;;:::o;47738:307::-;47806:1;47816:113;47830:6;47827:1;47824:13;47816:113;;;47915:1;47910:3;47906:11;47900:18;47896:1;47891:3;47887:11;47880:39;47852:2;47849:1;47845:10;47840:15;;47816:113;;;47947:6;47944:1;47941:13;47938:101;;;48027:1;48018:6;48013:3;48009:16;48002:27;47938:101;47787:258;47738:307;;;:::o;48051:320::-;48095:6;48132:1;48126:4;48122:12;48112:22;;48179:1;48173:4;48169:12;48200:18;48190:81;;48256:4;48248:6;48244:17;48234:27;;48190:81;48318:2;48310:6;48307:14;48287:18;48284:38;48281:84;;;48337:18;;:::i;:::-;48281:84;48102:269;48051:320;;;:::o;48377:281::-;48460:27;48482:4;48460:27;:::i;:::-;48452:6;48448:40;48590:6;48578:10;48575:22;48554:18;48542:10;48539:34;48536:62;48533:88;;;48601:18;;:::i;:::-;48533:88;48641:10;48637:2;48630:22;48420:238;48377:281;;:::o;48664:233::-;48703:3;48726:24;48744:5;48726:24;:::i;:::-;48717:33;;48772:66;48765:5;48762:77;48759:103;;;48842:18;;:::i;:::-;48759:103;48889:1;48882:5;48878:13;48871:20;;48664:233;;;:::o;48903:100::-;48942:7;48971:26;48991:5;48971:26;:::i;:::-;48960:37;;48903:100;;;:::o;49009:79::-;49048:7;49077:5;49066:16;;49009:79;;;:::o;49094:94::-;49133:7;49162:20;49176:5;49162:20;:::i;:::-;49151:31;;49094:94;;;:::o;49194:176::-;49226:1;49243:20;49261:1;49243:20;:::i;:::-;49238:25;;49277:20;49295:1;49277:20;:::i;:::-;49272:25;;49316:1;49306:35;;49321:18;;:::i;:::-;49306:35;49362:1;49359;49355:9;49350:14;;49194:176;;;;:::o;49376:180::-;49424:77;49421:1;49414:88;49521:4;49518:1;49511:15;49545:4;49542:1;49535:15;49562:180;49610:77;49607:1;49600:88;49707:4;49704:1;49697:15;49731:4;49728:1;49721:15;49748:180;49796:77;49793:1;49786:88;49893:4;49890:1;49883:15;49917:4;49914:1;49907:15;49934:180;49982:77;49979:1;49972:88;50079:4;50076:1;50069:15;50103:4;50100:1;50093:15;50120:180;50168:77;50165:1;50158:88;50265:4;50262:1;50255:15;50289:4;50286:1;50279:15;50306:180;50354:77;50351:1;50344:88;50451:4;50448:1;50441:15;50475:4;50472:1;50465:15;50492:180;50540:77;50537:1;50530:88;50637:4;50634:1;50627:15;50661:4;50658:1;50651:15;50678:117;50787:1;50784;50777:12;50801:117;50910:1;50907;50900:12;50924:117;51033:1;51030;51023:12;51047:117;51156:1;51153;51146:12;51170:102;51211:6;51262:2;51258:7;51253:2;51246:5;51242:14;51238:28;51228:38;;51170:102;;;:::o;51278:94::-;51311:8;51359:5;51355:2;51351:14;51330:35;;51278:94;;;:::o;51378:174::-;51518:26;51514:1;51506:6;51502:14;51495:50;51378:174;:::o;51558:234::-;51698:34;51694:1;51686:6;51682:14;51675:58;51767:17;51762:2;51754:6;51750:15;51743:42;51558:234;:::o;51798:181::-;51938:33;51934:1;51926:6;51922:14;51915:57;51798:181;:::o;51985:214::-;52125:66;52121:1;52113:6;52109:14;52102:90;51985:214;:::o;52205:230::-;52345:34;52341:1;52333:6;52329:14;52322:58;52414:13;52409:2;52401:6;52397:15;52390:38;52205:230;:::o;52441:237::-;52581:34;52577:1;52569:6;52565:14;52558:58;52650:20;52645:2;52637:6;52633:15;52626:45;52441:237;:::o;52684:225::-;52824:34;52820:1;52812:6;52808:14;52801:58;52893:8;52888:2;52880:6;52876:15;52869:33;52684:225;:::o;52915:178::-;53055:30;53051:1;53043:6;53039:14;53032:54;52915:178;:::o;53099:177::-;53239:29;53235:1;53227:6;53223:14;53216:53;53099:177;:::o;53282:235::-;53422:34;53418:1;53410:6;53406:14;53399:58;53491:18;53486:2;53478:6;53474:15;53467:43;53282:235;:::o;53523:226::-;53663:34;53659:1;53651:6;53647:14;53640:58;53732:9;53727:2;53719:6;53715:15;53708:34;53523:226;:::o;53755:223::-;53895:34;53891:1;53883:6;53879:14;53872:58;53964:6;53959:2;53951:6;53947:15;53940:31;53755:223;:::o;53984:175::-;54124:27;54120:1;54112:6;54108:14;54101:51;53984:175;:::o;54165:221::-;54305:34;54301:1;54293:6;54289:14;54282:58;54374:4;54369:2;54361:6;54357:15;54350:29;54165:221;:::o;54392:231::-;54532:34;54528:1;54520:6;54516:14;54509:58;54601:14;54596:2;54588:6;54584:15;54577:39;54392:231;:::o;54629:175::-;54769:27;54765:1;54757:6;54753:14;54746:51;54629:175;:::o;54810:243::-;54950:34;54946:1;54938:6;54934:14;54927:58;55019:26;55014:2;55006:6;55002:15;54995:51;54810:243;:::o;55059:229::-;55199:34;55195:1;55187:6;55183:14;55176:58;55268:12;55263:2;55255:6;55251:15;55244:37;55059:229;:::o;55294:228::-;55434:34;55430:1;55422:6;55418:14;55411:58;55503:11;55498:2;55490:6;55486:15;55479:36;55294:228;:::o;55528:178::-;55668:30;55664:1;55656:6;55652:14;55645:54;55528:178;:::o;55712:221::-;55852:34;55848:1;55840:6;55836:14;55829:58;55921:4;55916:2;55908:6;55904:15;55897:29;55712:221;:::o;55939:182::-;56079:34;56075:1;56067:6;56063:14;56056:58;55939:182;:::o;56127:231::-;56267:34;56263:1;56255:6;56251:14;56244:58;56336:14;56331:2;56323:6;56319:15;56312:39;56127:231;:::o;56364:182::-;56504:34;56500:1;56492:6;56488:14;56481:58;56364:182;:::o;56552:222::-;56692:34;56688:1;56680:6;56676:14;56669:58;56761:5;56756:2;56748:6;56744:15;56737:30;56552:222;:::o;56780:176::-;56920:28;56916:1;56908:6;56904:14;56897:52;56780:176;:::o;56962:228::-;57102:34;57098:1;57090:6;57086:14;57079:58;57171:11;57166:2;57158:6;57154:15;57147:36;56962:228;:::o;57196:220::-;57336:34;57332:1;57324:6;57320:14;57313:58;57405:3;57400:2;57392:6;57388:15;57381:28;57196:220;:::o;57422:::-;57562:34;57558:1;57550:6;57546:14;57539:58;57631:3;57626:2;57618:6;57614:15;57607:28;57422:220;:::o;57648:114::-;;:::o;57768:236::-;57908:34;57904:1;57896:6;57892:14;57885:58;57977:19;57972:2;57964:6;57960:15;57953:44;57768:236;:::o;58010:177::-;58150:29;58146:1;58138:6;58134:14;58127:53;58010:177;:::o;58193:231::-;58333:34;58329:1;58321:6;58317:14;58310:58;58402:14;58397:2;58389:6;58385:15;58378:39;58193:231;:::o;58430:241::-;58570:34;58566:1;58558:6;58554:14;58547:58;58639:24;58634:2;58626:6;58622:15;58615:49;58430:241;:::o;58677:122::-;58750:24;58768:5;58750:24;:::i;:::-;58743:5;58740:35;58730:63;;58789:1;58786;58779:12;58730:63;58677:122;:::o;58805:116::-;58875:21;58890:5;58875:21;:::i;:::-;58868:5;58865:32;58855:60;;58911:1;58908;58901:12;58855:60;58805:116;:::o;58927:120::-;58999:23;59016:5;58999:23;:::i;:::-;58992:5;58989:34;58979:62;;59037:1;59034;59027:12;58979:62;58927:120;:::o;59053:122::-;59126:24;59144:5;59126:24;:::i;:::-;59119:5;59116:35;59106:63;;59165:1;59162;59155:12;59106:63;59053:122;:::o

Swarm Source

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