ETH Price: $3,602.26 (+5.14%)

Token

NFT 88Dynasty (NFT88D)
 

Overview

Max Total Supply

2,705 NFT88D

Holders

1,470

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 NFT88D
0xe51544985c9a2b0954851Cb6E4eBE4AaC30fc957
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:
NFT88Dynasty

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

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


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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

// File: @openzeppelin/contracts/utils/cryptography/draft-EIP712.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)

pragma solidity ^0.8.0;


/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;
    address private immutable _CACHED_THIS;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _CACHED_THIS = address(this);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}

// File: Whitelist.sol

pragma solidity ^0.8.0;


contract whitelistChecker is EIP712{

    string private constant SIGNING_DOMAIN = "88 Dynasty";
    string private constant SIGNATURE_VERSION = "1";

    struct whitelisted{
        address addr;

	    // 1 -> free list
	    // 2 -> lucky list
	    // 3 -> dynasty list
        uint listType;
	    
        bytes signature;
    }

    constructor() EIP712(SIGNING_DOMAIN, SIGNATURE_VERSION){}
  
  
    function getSigner(whitelisted memory list) public view returns(address){
        return _verify(list);
    }

    
    /// @notice Returns a hash of the given rarity, prepared using EIP712 typed data hashing rules.
  
    function _hash(whitelisted memory list) internal view returns (bytes32) {
        return _hashTypedDataV4(
            keccak256(
                abi.encode(
                    keccak256("whitelisted(address addr,uint listType)"),
                    list.addr,
                    list.listType
                )
            )
        );
    }

    function _verify(whitelisted memory list) internal view returns (address) {
        bytes32 digest = _hash(list);
        return ECDSA.recover(digest, list.signature);
    }

    function getChainID() external view returns (uint256) {
        uint256 id;
        assembly {
            id := chainid()
        }
        return id;
    }
}

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;

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

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

// File: erc721a/contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;








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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: NFT88Dynasty.sol

//SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;





contract NFT88Dynasty is ERC721A, Ownable, whitelistChecker, ReentrancyGuard {

    uint public CAP = 6888;
    uint public VAULT_CAP = 50;
    uint public PRESALE_CAP = 5500;
    
    uint public WHITELIST_PRICE = 0.0888 ether;
    uint public PUBLIC_PRICE = 0.1 ether;
    
    // Fri, 15 Apr 2022, 9AM PST
    uint public WHITELIST_START_TIME = 1649993400; 
    
    address payable public TREASURY;

    address public designatedSigner;
    string public baseTokenURI;
    
    uint internal _ownerMinted;
    uint internal _presaleMinted;
   
    mapping(address => uint) public presaleHasBought;
    mapping(address => uint) public publicSaleHasBought;
    
    constructor(
        string memory _name,
        string memory _symbol,
        address payable _treasury
    ) ERC721A(_name, _symbol) {
        TREASURY = _treasury;
        
        // tokenIds will start from 1
        _currentIndex++;
    }
    
    function ownerMint(
        uint _amount
    ) external onlyOwner {
        require(_amount != 0, "invalid amount");
        require(_ownerMinted + _amount <= VAULT_CAP);
        
        _ownerMinted += _amount;
        _safeMint(msg.sender, _amount);
    }


    function freeMint(
        whitelisted memory whitelist
    ) external nonReentrant {
        require(WHITELIST_START_TIME <= block.timestamp && block.timestamp <= WHITELIST_START_TIME + 14400, "free list: outside time window");
        require(getSigner(whitelist) == designatedSigner, "free list: invalid signature");
        require(whitelist.listType == 1, "free list: invalid type"); 
        require(msg.sender == whitelist.addr, "free list: not in the list");
        require(presaleHasBought[msg.sender] == 0, "free list: already bought");
        require(_presaleMinted < PRESALE_CAP, "free list: exceeding presale cap");
        
        _presaleMinted += 1;
        presaleHasBought[msg.sender] += 1;
        _safeMint(msg.sender, 1); 

    }

    function whitelistMint(
        whitelisted memory whitelist, 
        uint amount
    ) external payable nonReentrant {
        require(WHITELIST_START_TIME <= block.timestamp && block.timestamp <= WHITELIST_START_TIME + 14400, "whitelist: outside time window");
        require(getSigner(whitelist) == designatedSigner, "whitelist: invalid signature");
        require(whitelist.listType == 2 || whitelist.listType == 3, "whitelist: invalid type"); 
        require(msg.sender == whitelist.addr, "whitelist: not in the list");
        
        // type == 2: Lucky list
        if (whitelist.listType == 2) {
            require(presaleHasBought[msg.sender] == 0, "lucky list: already bought");
            require(_presaleMinted < PRESALE_CAP, "lucky list: exceeding presale cap");
            require(msg.value >= WHITELIST_PRICE, "lucky list: pay more");            

            _presaleMinted += 1;
            presaleHasBought[msg.sender] += 1;
            _safeMint(msg.sender, 1);
        }

        // type == 3: Dynasty list
        else {
            require(presaleHasBought[msg.sender] + amount <= 2, "dynasty list: cannot mint more than 2");
            require(amount != 0, "dynasty list: invalid amount");
            require(_presaleMinted + amount <= PRESALE_CAP, "dynasty list: exceeding presale cap");
            require(msg.value >= WHITELIST_PRICE * amount, "dynasty list: pay more");

            _presaleMinted += amount;
            presaleHasBought[msg.sender] += amount;
            _safeMint(msg.sender, amount);
        }	
    }


    function publicMint(
        uint amount
    ) external payable nonReentrant {
	require(WHITELIST_START_TIME + 14400 < block.timestamp, "public mint: not started yet");       
	require(publicSaleHasBought[msg.sender] + amount <= 2, "public mint: exceeding permitted limit");
        require(amount != 0, "public mint: invalid amount");
        require(_currentIndex + amount <= CAP - VAULT_CAP, "public mint: sold out");
        require(msg.value >= PUBLIC_PRICE * amount, "public mint: pay more");

	publicSaleHasBought[msg.sender] += amount;
        _safeMint(msg.sender, amount); 
    }


    function withdraw(
    ) public onlyOwner {
        TREASURY.transfer(address(this).balance);
    }

    
    function modifyDesignatedSigner(
        address _signer
    ) external onlyOwner {
        designatedSigner = _signer;
    }


    function currentIndex(
    ) public view returns (uint) {
        return _currentIndex;
    }


    function modifyStartTime(
        uint256 startTime
    ) external onlyOwner {
        WHITELIST_START_TIME = startTime;
    }


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


    function setBaseURI(
        string memory baseURI_
    ) public onlyOwner {
        //require(bytes(_baseURI).length > 0, "88Dynasty.setBaseURI: base URI invalid");
        baseTokenURI = baseURI_;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address payable","name":"_treasury","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TREASURY","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VAULT_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_START_TIME","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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"designatedSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"listType","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct whitelistChecker.whitelisted","name":"whitelist","type":"tuple"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"listType","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct whitelistChecker.whitelisted","name":"list","type":"tuple"}],"name":"getSigner","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":[{"internalType":"address","name":"_signer","type":"address"}],"name":"modifyDesignatedSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startTime","type":"uint256"}],"name":"modifyStartTime","outputs":[],"stateMutability":"nonpayable","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":"_amount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaleHasBought","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicSaleHasBought","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"listType","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct whitelistChecker.whitelisted","name":"whitelist","type":"tuple"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

610140604052611ae8600a556032600b5561157c600c5567013b7b21280e0000600d5567016345785d8a0000600e55636258e6b8600f553480156200004357600080fd5b5060405162005f6638038062005f668339818101604052810190620000699190620004b5565b6040518060400160405280600a81526020017f38382044796e61737479000000000000000000000000000000000000000000008152506040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525084848160029080519060200190620000ef92919062000370565b5080600390805190602001906200010892919062000370565b50620001196200026160201b60201c565b600081905550505062000141620001356200026660201b60201c565b6200026e60201b60201c565b60008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620001aa8184846200033460201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508061012081815250505050505050600160098190555080601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008081548092919062000253906200073c565b919050555050505062000856565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600083838346306040516020016200035195949392919062000582565b6040516020818303038152906040528051906020012090509392505050565b8280546200037e90620006d0565b90600052602060002090601f016020900481019282620003a25760008555620003ee565b82601f10620003bd57805160ff1916838001178555620003ee565b82800160010185558215620003ee579182015b82811115620003ed578251825591602001919060010190620003d0565b5b509050620003fd919062000401565b5090565b5b808211156200041c57600081600090555060010162000402565b5090565b600062000437620004318462000608565b620005df565b9050828152602081018484840111156200045657620004556200081c565b5b620004638482856200069a565b509392505050565b6000815190506200047c816200083c565b92915050565b600082601f8301126200049a576200049962000817565b5b8151620004ac84826020860162000420565b91505092915050565b600080600060608486031215620004d157620004d062000826565b5b600084015167ffffffffffffffff811115620004f257620004f162000821565b5b620005008682870162000482565b935050602084015167ffffffffffffffff81111562000524576200052362000821565b5b620005328682870162000482565b925050604062000545868287016200046b565b9150509250925092565b6200055a816200063e565b82525050565b6200056b8162000666565b82525050565b6200057c8162000690565b82525050565b600060a08201905062000599600083018862000560565b620005a8602083018762000560565b620005b7604083018662000560565b620005c6606083018562000571565b620005d560808301846200054f565b9695505050505050565b6000620005eb620005fe565b9050620005f9828262000706565b919050565b6000604051905090565b600067ffffffffffffffff821115620006265762000625620007e8565b5b62000631826200082b565b9050602081019050919050565b60006200064b8262000670565b9050919050565b60006200065f8262000670565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015620006ba5780820151818401526020810190506200069d565b83811115620006ca576000848401525b50505050565b60006002820490506001821680620006e957607f821691505b602082108114156200070057620006ff620007b9565b5b50919050565b62000711826200082b565b810181811067ffffffffffffffff82111715620007335762000732620007e8565b5b80604052505050565b6000620007498262000690565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156200077f576200077e6200078a565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b620008478162000652565b81146200085357600080fd5b50565b60805160a05160c05160601c60e05161010051610120516156bd620008a960003960006137fb0152600061383d0152600061381c01526000613751015260006137a7015260006137d001526156bd6000f3fe6080604052600436106102305760003560e01c806368a6db211161012e578063b88d4fde116100ab578063e985e9c51161006f578063e985e9c514610811578063ec81b4831461084e578063f19e75d414610879578063f2fde38b146108a2578063fb73f90d146108cb57610230565b8063b88d4fde14610718578063bd94fafc14610741578063c87b56dd1461076c578063d47cb35a146107a9578063d547cfb7146107e657610230565b806395d89b41116100f257806395d89b4114610633578063a22cb4651461065e578063a461185d14610687578063aae25051146106c4578063b768cd5d146106ef57610230565b806368a6db211461056057806370a0823114610589578063715018a6146105c657806376d8b246146105dd5780638da5cb5b1461060857610230565b80632d2c5565116101bc57806351847ed51161018057806351847ed51461047957806355f804b3146104a4578063564b81ef146104cd578063611f3f10146104f85780636352211e1461052357610230565b80632d2c5565146103c95780632db11544146103f45780633079c91c146104105780633ccfd60b1461043957806342842e0e1461045057610230565b806317e7f2951161020357806317e7f2951461030357806318160ddd1461032e5780631fe5e56a1461035957806323b872dd1461037557806326987b601461039e57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613eb2565b610908565b6040516102699190614655565b60405180910390f35b34801561027e57600080fd5b506102876109ea565b604051610294919061473f565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190613ffa565b610a7c565b6040516102d191906145d3565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc9190613e72565b610af8565b005b34801561030f57600080fd5b50610318610c03565b6040516103259190614b21565b60405180910390f35b34801561033a57600080fd5b50610343610c09565b6040516103509190614b21565b60405180910390f35b610373600480360381019061036e9190613f9e565b610c20565b005b34801561038157600080fd5b5061039c60048036038101906103979190613d5c565b6111c3565b005b3480156103aa57600080fd5b506103b36111d3565b6040516103c09190614b21565b60405180910390f35b3480156103d557600080fd5b506103de6111dc565b6040516103eb91906145ee565b60405180910390f35b61040e60048036038101906104099190613ffa565b611202565b005b34801561041c57600080fd5b5061043760048036038101906104329190613f55565b61148d565b005b34801561044557600080fd5b5061044e6117db565b005b34801561045c57600080fd5b5061047760048036038101906104729190613d5c565b6118c2565b005b34801561048557600080fd5b5061048e6118e2565b60405161049b9190614b21565b60405180910390f35b3480156104b057600080fd5b506104cb60048036038101906104c69190613f0c565b6118e8565b005b3480156104d957600080fd5b506104e261197e565b6040516104ef9190614b21565b60405180910390f35b34801561050457600080fd5b5061050d61198b565b60405161051a9190614b21565b60405180910390f35b34801561052f57600080fd5b5061054a60048036038101906105459190613ffa565b611991565b60405161055791906145d3565b60405180910390f35b34801561056c57600080fd5b5061058760048036038101906105829190613cef565b6119a7565b005b34801561059557600080fd5b506105b060048036038101906105ab9190613cef565b611a67565b6040516105bd9190614b21565b60405180910390f35b3480156105d257600080fd5b506105db611b37565b005b3480156105e957600080fd5b506105f2611bbf565b6040516105ff9190614b21565b60405180910390f35b34801561061457600080fd5b5061061d611bc5565b60405161062a91906145d3565b60405180910390f35b34801561063f57600080fd5b50610648611bef565b604051610655919061473f565b60405180910390f35b34801561066a57600080fd5b5061068560048036038101906106809190613e32565b611c81565b005b34801561069357600080fd5b506106ae60048036038101906106a99190613f55565b611df9565b6040516106bb91906145d3565b60405180910390f35b3480156106d057600080fd5b506106d9611e0b565b6040516106e691906145d3565b60405180910390f35b3480156106fb57600080fd5b5061071660048036038101906107119190613ffa565b611e31565b005b34801561072457600080fd5b5061073f600480360381019061073a9190613daf565b611eb7565b005b34801561074d57600080fd5b50610756611f33565b6040516107639190614b21565b60405180910390f35b34801561077857600080fd5b50610793600480360381019061078e9190613ffa565b611f39565b6040516107a0919061473f565b60405180910390f35b3480156107b557600080fd5b506107d060048036038101906107cb9190613cef565b611fd8565b6040516107dd9190614b21565b60405180910390f35b3480156107f257600080fd5b506107fb611ff0565b604051610808919061473f565b60405180910390f35b34801561081d57600080fd5b5061083860048036038101906108339190613d1c565b61207e565b6040516108459190614655565b60405180910390f35b34801561085a57600080fd5b50610863612112565b6040516108709190614b21565b60405180910390f35b34801561088557600080fd5b506108a0600480360381019061089b9190613ffa565b612118565b005b3480156108ae57600080fd5b506108c960048036038101906108c49190613cef565b61221a565b005b3480156108d757600080fd5b506108f260048036038101906108ed9190613cef565b612312565b6040516108ff9190614b21565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109d357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109e357506109e28261232a565b5b9050919050565b6060600280546109f990614dfa565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2590614dfa565b8015610a725780601f10610a4757610100808354040283529160200191610a72565b820191906000526020600020905b815481529060010190602001808311610a5557829003601f168201915b5050505050905090565b6000610a8782612394565b610abd576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b0382611991565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b6b576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b8a6123e2565b73ffffffffffffffffffffffffffffffffffffffff1614158015610bbc5750610bba81610bb56123e2565b61207e565b155b15610bf3576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bfe8383836123ea565b505050565b600d5481565b6000610c1361249c565b6001546000540303905090565b60026009541415610c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5d90614ae1565b60405180910390fd5b600260098190555042600f5411158015610c8f5750613840600f54610c8b9190614c06565b4211155b610cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc5906148a1565b60405180910390fd5b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610d1083611df9565b73ffffffffffffffffffffffffffffffffffffffff1614610d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5d906148e1565b60405180910390fd5b600282602001511480610d7d575060038260200151145b610dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db390614ac1565b60405180910390fd5b816000015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e25906147e1565b60405180910390fd5b600282602001511415610fc9576000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb490614a81565b60405180910390fd5b600c5460145410610f03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efa90614a21565b60405180910390fd5b600d54341015610f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3f90614801565b60405180910390fd5b600160146000828254610f5b9190614c06565b925050819055506001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fb29190614c06565b92505081905550610fc43360016124a1565b6111b7565b600281601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110169190614c06565b1115611057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104e90614b01565b60405180910390fd5b600081141561109b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611092906147c1565b60405180910390fd5b600c54816014546110ac9190614c06565b11156110ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e4906149c1565b60405180910390fd5b80600d546110fb9190614c8d565b34101561113d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611134906149e1565b60405180910390fd5b806014600082825461114f9190614c06565b9250508190555080601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111a59190614c06565b925050819055506111b633826124a1565b5b60016009819055505050565b6111ce8383836124bf565b505050565b60008054905090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026009541415611248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123f90614ae1565b60405180910390fd5b600260098190555042613840600f546112619190614c06565b106112a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129890614821565b60405180910390fd5b600281601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112ee9190614c06565b111561132f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132690614981565b60405180910390fd5b6000811415611373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136a90614a41565b60405180910390fd5b600b54600a546113839190614ce7565b816000546113919190614c06565b11156113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c990614a61565b60405180910390fd5b80600e546113e09190614c8d565b341015611422576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141990614961565b60405180910390fd5b80601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114719190614c06565b9250508190555061148233826124a1565b600160098190555050565b600260095414156114d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ca90614ae1565b60405180910390fd5b600260098190555042600f54111580156114fc5750613840600f546114f89190614c06565b4211155b61153b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611532906149a1565b60405180910390fd5b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661157d82611df9565b73ffffffffffffffffffffffffffffffffffffffff16146115d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ca90614921565b60405180910390fd5b600181602001511461161a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611611906148c1565b60405180910390fd5b806000015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461168c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168390614aa1565b60405180910390fd5b6000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461170e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170590614901565b60405180910390fd5b600c5460145410611754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174b90614861565b60405180910390fd5b6001601460008282546117679190614c06565b925050819055506001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117be9190614c06565b925050819055506117d03360016124a1565b600160098190555050565b6117e36123e2565b73ffffffffffffffffffffffffffffffffffffffff16611801611bc5565b73ffffffffffffffffffffffffffffffffffffffff1614611857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184e90614a01565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156118bf573d6000803e3d6000fd5b50565b6118dd83838360405180602001604052806000815250611eb7565b505050565b600f5481565b6118f06123e2565b73ffffffffffffffffffffffffffffffffffffffff1661190e611bc5565b73ffffffffffffffffffffffffffffffffffffffff1614611964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195b90614a01565b60405180910390fd5b806012908051906020019061197a929190613a40565b5050565b6000804690508091505090565b600e5481565b600061199c82612975565b600001519050919050565b6119af6123e2565b73ffffffffffffffffffffffffffffffffffffffff166119cd611bc5565b73ffffffffffffffffffffffffffffffffffffffff1614611a23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1a90614a01565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611acf576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611b3f6123e2565b73ffffffffffffffffffffffffffffffffffffffff16611b5d611bc5565b73ffffffffffffffffffffffffffffffffffffffff1614611bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611baa90614a01565b60405180910390fd5b611bbd6000612c04565b565b600b5481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611bfe90614dfa565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2a90614dfa565b8015611c775780601f10611c4c57610100808354040283529160200191611c77565b820191906000526020600020905b815481529060010190602001808311611c5a57829003601f168201915b5050505050905090565b611c896123e2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cee576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611cfb6123e2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611da86123e2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ded9190614655565b60405180910390a35050565b6000611e0482612cca565b9050919050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611e396123e2565b73ffffffffffffffffffffffffffffffffffffffff16611e57611bc5565b73ffffffffffffffffffffffffffffffffffffffff1614611ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea490614a01565b60405180910390fd5b80600f8190555050565b611ec28484846124bf565b611ee18373ffffffffffffffffffffffffffffffffffffffff16612cee565b8015611ef65750611ef484848484612d11565b155b15611f2d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600c5481565b6060611f4482612394565b611f7a576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611f84612e71565b9050600081511415611fa55760405180602001604052806000815250611fd0565b80611faf84612f03565b604051602001611fc0929190614578565b6040516020818303038152906040525b915050919050565b60166020528060005260406000206000915090505481565b60128054611ffd90614dfa565b80601f016020809104026020016040519081016040528092919081815260200182805461202990614dfa565b80156120765780601f1061204b57610100808354040283529160200191612076565b820191906000526020600020905b81548152906001019060200180831161205957829003601f168201915b505050505081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a5481565b6121206123e2565b73ffffffffffffffffffffffffffffffffffffffff1661213e611bc5565b73ffffffffffffffffffffffffffffffffffffffff1614612194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218b90614a01565b60405180910390fd5b60008114156121d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cf90614841565b60405180910390fd5b600b54816013546121e99190614c06565b11156121f457600080fd5b80601360008282546122069190614c06565b9250508190555061221733826124a1565b50565b6122226123e2565b73ffffffffffffffffffffffffffffffffffffffff16612240611bc5565b73ffffffffffffffffffffffffffffffffffffffff1614612296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228d90614a01565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fd906147a1565b60405180910390fd5b61230f81612c04565b50565b60156020528060005260406000206000915090505481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161239f61249c565b111580156123ae575060005482105b80156123db575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6124bb828260405180602001604052806000815250613064565b5050565b60006124ca82612975565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612535576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166125566123e2565b73ffffffffffffffffffffffffffffffffffffffff16148061258557506125848561257f6123e2565b61207e565b5b806125ca57506125936123e2565b73ffffffffffffffffffffffffffffffffffffffff166125b284610a7c565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612603576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561266a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126778585856001613076565b612683600084876123ea565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561290357600054821461290257878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461296e858585600161307c565b5050505050565b61297d613ac6565b60008290508061298b61249c565b1115801561299a575060005481105b15612bcd576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612bcb57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612aaf578092505050612bff565b5b600115612bca57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612bc5578092505050612bff565b612ab0565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080612cd683613082565b9050612ce68184604001516130e6565b915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d376123e2565b8786866040518563ffffffff1660e01b8152600401612d599493929190614609565b602060405180830381600087803b158015612d7357600080fd5b505af1925050508015612da457506040513d601f19601f82011682018060405250810190612da19190613edf565b60015b612e1e573d8060008114612dd4576040519150601f19603f3d011682016040523d82523d6000602084013e612dd9565b606091505b50600081511415612e16576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060128054612e8090614dfa565b80601f0160208091040260200160405190810160405280929190818152602001828054612eac90614dfa565b8015612ef95780601f10612ece57610100808354040283529160200191612ef9565b820191906000526020600020905b815481529060010190602001808311612edc57829003601f168201915b5050505050905090565b60606000821415612f4b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061305f565b600082905060005b60008214612f7d578080612f6690614e5d565b915050600a82612f769190614c5c565b9150612f53565b60008167ffffffffffffffff811115612f9957612f98614fcc565b5b6040519080825280601f01601f191660200182016040528015612fcb5781602001600182028036833780820191505090505b5090505b6000851461305857600182612fe49190614ce7565b9150600a85612ff39190614eb0565b6030612fff9190614c06565b60f81b81838151811061301557613014614f9d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130519190614c5c565b9450612fcf565b8093505050505b919050565b613071838383600161310d565b505050565b50505050565b50505050565b60006130df7f2c9bcd592d6f781b9b1d85ada2147d8389432d16fa8a5b8332d23f20abc94f6b836000015184602001516040516020016130c493929190614670565b604051602081830303815290604052805190602001206134db565b9050919050565b60008060006130f585856134f5565b9150915061310281613578565b819250505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561317a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156131b5576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6131c26000868387613076565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561338c575061338b8773ffffffffffffffffffffffffffffffffffffffff16612cee565b5b15613452575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46134016000888480600101955088612d11565b613437576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561339257826000541461344d57600080fd5b6134be565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613453575b8160008190555050506134d4600086838761307c565b5050505050565b60006134ee6134e861374d565b83613867565b9050919050565b6000806041835114156135375760008060006020860151925060408601519150606086015160001a905061352b8782858561389a565b94509450505050613571565b60408351141561356857600080602085015191506040850151905061355d8683836139a7565b935093505050613571565b60006002915091505b9250929050565b6000600481111561358c5761358b614f3f565b5b81600481111561359f5761359e614f3f565b5b14156135aa5761374a565b600160048111156135be576135bd614f3f565b5b8160048111156135d1576135d0614f3f565b5b1415613612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360990614761565b60405180910390fd5b6002600481111561362657613625614f3f565b5b81600481111561363957613638614f3f565b5b141561367a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161367190614781565b60405180910390fd5b6003600481111561368e5761368d614f3f565b5b8160048111156136a1576136a0614f3f565b5b14156136e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136d990614881565b60405180910390fd5b6004808111156136f5576136f4614f3f565b5b81600481111561370857613707614f3f565b5b1415613749576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374090614941565b60405180910390fd5b5b50565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156137c957507f000000000000000000000000000000000000000000000000000000000000000046145b156137f6577f00000000000000000000000000000000000000000000000000000000000000009050613864565b6138617f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613a06565b90505b90565b6000828260405160200161387c92919061459c565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156138d557600060039150915061399e565b601b8560ff16141580156138ed5750601c8560ff1614155b156138ff57600060049150915061399e565b60006001878787876040516000815260200160405260405161392494939291906146fa565b6020604051602081039080840390855afa158015613946573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156139955760006001925092505061399e565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6139ea9190614c06565b90506139f88782888561389a565b935093505050935093915050565b60008383834630604051602001613a219594939291906146a7565b6040516020818303038152906040528051906020012090509392505050565b828054613a4c90614dfa565b90600052602060002090601f016020900481019282613a6e5760008555613ab5565b82601f10613a8757805160ff1916838001178555613ab5565b82800160010185558215613ab5579182015b82811115613ab4578251825591602001919060010190613a99565b5b509050613ac29190613b09565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613b22576000816000905550600101613b0a565b5090565b6000613b39613b3484614b61565b614b3c565b905082815260208101848484011115613b5557613b5461500a565b5b613b60848285614db8565b509392505050565b6000613b7b613b7684614b92565b614b3c565b905082815260208101848484011115613b9757613b9661500a565b5b613ba2848285614db8565b509392505050565b600081359050613bb98161562b565b92915050565b600081359050613bce81615642565b92915050565b600081359050613be381615659565b92915050565b600081519050613bf881615659565b92915050565b600082601f830112613c1357613c12614ffb565b5b8135613c23848260208601613b26565b91505092915050565b600082601f830112613c4157613c40614ffb565b5b8135613c51848260208601613b68565b91505092915050565b600060608284031215613c7057613c6f615000565b5b613c7a6060614b3c565b90506000613c8a84828501613baa565b6000830152506020613c9e84828501613cda565b602083015250604082013567ffffffffffffffff811115613cc257613cc1615005565b5b613cce84828501613bfe565b60408301525092915050565b600081359050613ce981615670565b92915050565b600060208284031215613d0557613d04615014565b5b6000613d1384828501613baa565b91505092915050565b60008060408385031215613d3357613d32615014565b5b6000613d4185828601613baa565b9250506020613d5285828601613baa565b9150509250929050565b600080600060608486031215613d7557613d74615014565b5b6000613d8386828701613baa565b9350506020613d9486828701613baa565b9250506040613da586828701613cda565b9150509250925092565b60008060008060808587031215613dc957613dc8615014565b5b6000613dd787828801613baa565b9450506020613de887828801613baa565b9350506040613df987828801613cda565b925050606085013567ffffffffffffffff811115613e1a57613e1961500f565b5b613e2687828801613bfe565b91505092959194509250565b60008060408385031215613e4957613e48615014565b5b6000613e5785828601613baa565b9250506020613e6885828601613bbf565b9150509250929050565b60008060408385031215613e8957613e88615014565b5b6000613e9785828601613baa565b9250506020613ea885828601613cda565b9150509250929050565b600060208284031215613ec857613ec7615014565b5b6000613ed684828501613bd4565b91505092915050565b600060208284031215613ef557613ef4615014565b5b6000613f0384828501613be9565b91505092915050565b600060208284031215613f2257613f21615014565b5b600082013567ffffffffffffffff811115613f4057613f3f61500f565b5b613f4c84828501613c2c565b91505092915050565b600060208284031215613f6b57613f6a615014565b5b600082013567ffffffffffffffff811115613f8957613f8861500f565b5b613f9584828501613c5a565b91505092915050565b60008060408385031215613fb557613fb4615014565b5b600083013567ffffffffffffffff811115613fd357613fd261500f565b5b613fdf85828601613c5a565b9250506020613ff085828601613cda565b9150509250929050565b6000602082840312156140105761400f615014565b5b600061401e84828501613cda565b91505092915050565b61403081614d2d565b82525050565b61403f81614d1b565b82525050565b61404e81614d3f565b82525050565b61405d81614d4b565b82525050565b61407461406f82614d4b565b614ea6565b82525050565b600061408582614bc3565b61408f8185614bd9565b935061409f818560208601614dc7565b6140a881615019565b840191505092915050565b60006140be82614bce565b6140c88185614bea565b93506140d8818560208601614dc7565b6140e181615019565b840191505092915050565b60006140f782614bce565b6141018185614bfb565b9350614111818560208601614dc7565b80840191505092915050565b600061412a601883614bea565b91506141358261502a565b602082019050919050565b600061414d601f83614bea565b915061415882615053565b602082019050919050565b6000614170602683614bea565b915061417b8261507c565b604082019050919050565b6000614193601c83614bea565b915061419e826150cb565b602082019050919050565b60006141b6601a83614bea565b91506141c1826150f4565b602082019050919050565b60006141d9600283614bfb565b91506141e48261511d565b600282019050919050565b60006141fc601483614bea565b915061420782615146565b602082019050919050565b600061421f601c83614bea565b915061422a8261516f565b602082019050919050565b6000614242600e83614bea565b915061424d82615198565b602082019050919050565b6000614265602083614bea565b9150614270826151c1565b602082019050919050565b6000614288602283614bea565b9150614293826151ea565b604082019050919050565b60006142ab601e83614bea565b91506142b682615239565b602082019050919050565b60006142ce601783614bea565b91506142d982615262565b602082019050919050565b60006142f1601c83614bea565b91506142fc8261528b565b602082019050919050565b6000614314601983614bea565b915061431f826152b4565b602082019050919050565b6000614337601c83614bea565b9150614342826152dd565b602082019050919050565b600061435a602283614bea565b915061436582615306565b604082019050919050565b600061437d601583614bea565b915061438882615355565b602082019050919050565b60006143a0602683614bea565b91506143ab8261537e565b604082019050919050565b60006143c3601e83614bea565b91506143ce826153cd565b602082019050919050565b60006143e6602383614bea565b91506143f1826153f6565b604082019050919050565b6000614409601683614bea565b915061441482615445565b602082019050919050565b600061442c602083614bea565b91506144378261546e565b602082019050919050565b600061444f602183614bea565b915061445a82615497565b604082019050919050565b6000614472601b83614bea565b915061447d826154e6565b602082019050919050565b6000614495601583614bea565b91506144a08261550f565b602082019050919050565b60006144b8601a83614bea565b91506144c382615538565b602082019050919050565b60006144db601a83614bea565b91506144e682615561565b602082019050919050565b60006144fe601783614bea565b91506145098261558a565b602082019050919050565b6000614521601f83614bea565b915061452c826155b3565b602082019050919050565b6000614544602583614bea565b915061454f826155dc565b604082019050919050565b61456381614da1565b82525050565b61457281614dab565b82525050565b600061458482856140ec565b915061459082846140ec565b91508190509392505050565b60006145a7826141cc565b91506145b38285614063565b6020820191506145c38284614063565b6020820191508190509392505050565b60006020820190506145e86000830184614036565b92915050565b60006020820190506146036000830184614027565b92915050565b600060808201905061461e6000830187614036565b61462b6020830186614036565b614638604083018561455a565b818103606083015261464a818461407a565b905095945050505050565b600060208201905061466a6000830184614045565b92915050565b60006060820190506146856000830186614054565b6146926020830185614036565b61469f604083018461455a565b949350505050565b600060a0820190506146bc6000830188614054565b6146c96020830187614054565b6146d66040830186614054565b6146e3606083018561455a565b6146f06080830184614036565b9695505050505050565b600060808201905061470f6000830187614054565b61471c6020830186614569565b6147296040830185614054565b6147366060830184614054565b95945050505050565b6000602082019050818103600083015261475981846140b3565b905092915050565b6000602082019050818103600083015261477a8161411d565b9050919050565b6000602082019050818103600083015261479a81614140565b9050919050565b600060208201905081810360008301526147ba81614163565b9050919050565b600060208201905081810360008301526147da81614186565b9050919050565b600060208201905081810360008301526147fa816141a9565b9050919050565b6000602082019050818103600083015261481a816141ef565b9050919050565b6000602082019050818103600083015261483a81614212565b9050919050565b6000602082019050818103600083015261485a81614235565b9050919050565b6000602082019050818103600083015261487a81614258565b9050919050565b6000602082019050818103600083015261489a8161427b565b9050919050565b600060208201905081810360008301526148ba8161429e565b9050919050565b600060208201905081810360008301526148da816142c1565b9050919050565b600060208201905081810360008301526148fa816142e4565b9050919050565b6000602082019050818103600083015261491a81614307565b9050919050565b6000602082019050818103600083015261493a8161432a565b9050919050565b6000602082019050818103600083015261495a8161434d565b9050919050565b6000602082019050818103600083015261497a81614370565b9050919050565b6000602082019050818103600083015261499a81614393565b9050919050565b600060208201905081810360008301526149ba816143b6565b9050919050565b600060208201905081810360008301526149da816143d9565b9050919050565b600060208201905081810360008301526149fa816143fc565b9050919050565b60006020820190508181036000830152614a1a8161441f565b9050919050565b60006020820190508181036000830152614a3a81614442565b9050919050565b60006020820190508181036000830152614a5a81614465565b9050919050565b60006020820190508181036000830152614a7a81614488565b9050919050565b60006020820190508181036000830152614a9a816144ab565b9050919050565b60006020820190508181036000830152614aba816144ce565b9050919050565b60006020820190508181036000830152614ada816144f1565b9050919050565b60006020820190508181036000830152614afa81614514565b9050919050565b60006020820190508181036000830152614b1a81614537565b9050919050565b6000602082019050614b36600083018461455a565b92915050565b6000614b46614b57565b9050614b528282614e2c565b919050565b6000604051905090565b600067ffffffffffffffff821115614b7c57614b7b614fcc565b5b614b8582615019565b9050602081019050919050565b600067ffffffffffffffff821115614bad57614bac614fcc565b5b614bb682615019565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c1182614da1565b9150614c1c83614da1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c5157614c50614ee1565b5b828201905092915050565b6000614c6782614da1565b9150614c7283614da1565b925082614c8257614c81614f10565b5b828204905092915050565b6000614c9882614da1565b9150614ca383614da1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614cdc57614cdb614ee1565b5b828202905092915050565b6000614cf282614da1565b9150614cfd83614da1565b925082821015614d1057614d0f614ee1565b5b828203905092915050565b6000614d2682614d81565b9050919050565b6000614d3882614d81565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614de5578082015181840152602081019050614dca565b83811115614df4576000848401525b50505050565b60006002820490506001821680614e1257607f821691505b60208210811415614e2657614e25614f6e565b5b50919050565b614e3582615019565b810181811067ffffffffffffffff82111715614e5457614e53614fcc565b5b80604052505050565b6000614e6882614da1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e9b57614e9a614ee1565b5b600182019050919050565b6000819050919050565b6000614ebb82614da1565b9150614ec683614da1565b925082614ed657614ed5614f10565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f64796e61737479206c6973743a20696e76616c696420616d6f756e7400000000600082015250565b7f77686974656c6973743a206e6f7420696e20746865206c697374000000000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f6c75636b79206c6973743a20706179206d6f7265000000000000000000000000600082015250565b7f7075626c6963206d696e743a206e6f7420737461727465642079657400000000600082015250565b7f696e76616c696420616d6f756e74000000000000000000000000000000000000600082015250565b7f66726565206c6973743a20657863656564696e672070726573616c6520636170600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f77686974656c6973743a206f7574736964652074696d652077696e646f770000600082015250565b7f66726565206c6973743a20696e76616c69642074797065000000000000000000600082015250565b7f77686974656c6973743a20696e76616c6964207369676e617475726500000000600082015250565b7f66726565206c6973743a20616c726561647920626f7567687400000000000000600082015250565b7f66726565206c6973743a20696e76616c6964207369676e617475726500000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f7075626c6963206d696e743a20706179206d6f72650000000000000000000000600082015250565b7f7075626c6963206d696e743a20657863656564696e67207065726d697474656460008201527f206c696d69740000000000000000000000000000000000000000000000000000602082015250565b7f66726565206c6973743a206f7574736964652074696d652077696e646f770000600082015250565b7f64796e61737479206c6973743a20657863656564696e672070726573616c652060008201527f6361700000000000000000000000000000000000000000000000000000000000602082015250565b7f64796e61737479206c6973743a20706179206d6f726500000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f6c75636b79206c6973743a20657863656564696e672070726573616c6520636160008201527f7000000000000000000000000000000000000000000000000000000000000000602082015250565b7f7075626c6963206d696e743a20696e76616c696420616d6f756e740000000000600082015250565b7f7075626c6963206d696e743a20736f6c64206f75740000000000000000000000600082015250565b7f6c75636b79206c6973743a20616c726561647920626f75676874000000000000600082015250565b7f66726565206c6973743a206e6f7420696e20746865206c697374000000000000600082015250565b7f77686974656c6973743a20696e76616c69642074797065000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f64796e61737479206c6973743a2063616e6e6f74206d696e74206d6f7265207460008201527f68616e2032000000000000000000000000000000000000000000000000000000602082015250565b61563481614d1b565b811461563f57600080fd5b50565b61564b81614d3f565b811461565657600080fd5b50565b61566281614d55565b811461566d57600080fd5b50565b61567981614da1565b811461568457600080fd5b5056fea26469706673582212202b224ea6a635880afbc148b9abcd810404a793cce6bb8199a35fb1d4ad56e07864736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000002ae4cece89e1d044d7733f792f20b8c664f74de4000000000000000000000000000000000000000000000000000000000000000d4e465420383844796e617374790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064e46543838440000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102305760003560e01c806368a6db211161012e578063b88d4fde116100ab578063e985e9c51161006f578063e985e9c514610811578063ec81b4831461084e578063f19e75d414610879578063f2fde38b146108a2578063fb73f90d146108cb57610230565b8063b88d4fde14610718578063bd94fafc14610741578063c87b56dd1461076c578063d47cb35a146107a9578063d547cfb7146107e657610230565b806395d89b41116100f257806395d89b4114610633578063a22cb4651461065e578063a461185d14610687578063aae25051146106c4578063b768cd5d146106ef57610230565b806368a6db211461056057806370a0823114610589578063715018a6146105c657806376d8b246146105dd5780638da5cb5b1461060857610230565b80632d2c5565116101bc57806351847ed51161018057806351847ed51461047957806355f804b3146104a4578063564b81ef146104cd578063611f3f10146104f85780636352211e1461052357610230565b80632d2c5565146103c95780632db11544146103f45780633079c91c146104105780633ccfd60b1461043957806342842e0e1461045057610230565b806317e7f2951161020357806317e7f2951461030357806318160ddd1461032e5780631fe5e56a1461035957806323b872dd1461037557806326987b601461039e57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613eb2565b610908565b6040516102699190614655565b60405180910390f35b34801561027e57600080fd5b506102876109ea565b604051610294919061473f565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190613ffa565b610a7c565b6040516102d191906145d3565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc9190613e72565b610af8565b005b34801561030f57600080fd5b50610318610c03565b6040516103259190614b21565b60405180910390f35b34801561033a57600080fd5b50610343610c09565b6040516103509190614b21565b60405180910390f35b610373600480360381019061036e9190613f9e565b610c20565b005b34801561038157600080fd5b5061039c60048036038101906103979190613d5c565b6111c3565b005b3480156103aa57600080fd5b506103b36111d3565b6040516103c09190614b21565b60405180910390f35b3480156103d557600080fd5b506103de6111dc565b6040516103eb91906145ee565b60405180910390f35b61040e60048036038101906104099190613ffa565b611202565b005b34801561041c57600080fd5b5061043760048036038101906104329190613f55565b61148d565b005b34801561044557600080fd5b5061044e6117db565b005b34801561045c57600080fd5b5061047760048036038101906104729190613d5c565b6118c2565b005b34801561048557600080fd5b5061048e6118e2565b60405161049b9190614b21565b60405180910390f35b3480156104b057600080fd5b506104cb60048036038101906104c69190613f0c565b6118e8565b005b3480156104d957600080fd5b506104e261197e565b6040516104ef9190614b21565b60405180910390f35b34801561050457600080fd5b5061050d61198b565b60405161051a9190614b21565b60405180910390f35b34801561052f57600080fd5b5061054a60048036038101906105459190613ffa565b611991565b60405161055791906145d3565b60405180910390f35b34801561056c57600080fd5b5061058760048036038101906105829190613cef565b6119a7565b005b34801561059557600080fd5b506105b060048036038101906105ab9190613cef565b611a67565b6040516105bd9190614b21565b60405180910390f35b3480156105d257600080fd5b506105db611b37565b005b3480156105e957600080fd5b506105f2611bbf565b6040516105ff9190614b21565b60405180910390f35b34801561061457600080fd5b5061061d611bc5565b60405161062a91906145d3565b60405180910390f35b34801561063f57600080fd5b50610648611bef565b604051610655919061473f565b60405180910390f35b34801561066a57600080fd5b5061068560048036038101906106809190613e32565b611c81565b005b34801561069357600080fd5b506106ae60048036038101906106a99190613f55565b611df9565b6040516106bb91906145d3565b60405180910390f35b3480156106d057600080fd5b506106d9611e0b565b6040516106e691906145d3565b60405180910390f35b3480156106fb57600080fd5b5061071660048036038101906107119190613ffa565b611e31565b005b34801561072457600080fd5b5061073f600480360381019061073a9190613daf565b611eb7565b005b34801561074d57600080fd5b50610756611f33565b6040516107639190614b21565b60405180910390f35b34801561077857600080fd5b50610793600480360381019061078e9190613ffa565b611f39565b6040516107a0919061473f565b60405180910390f35b3480156107b557600080fd5b506107d060048036038101906107cb9190613cef565b611fd8565b6040516107dd9190614b21565b60405180910390f35b3480156107f257600080fd5b506107fb611ff0565b604051610808919061473f565b60405180910390f35b34801561081d57600080fd5b5061083860048036038101906108339190613d1c565b61207e565b6040516108459190614655565b60405180910390f35b34801561085a57600080fd5b50610863612112565b6040516108709190614b21565b60405180910390f35b34801561088557600080fd5b506108a0600480360381019061089b9190613ffa565b612118565b005b3480156108ae57600080fd5b506108c960048036038101906108c49190613cef565b61221a565b005b3480156108d757600080fd5b506108f260048036038101906108ed9190613cef565b612312565b6040516108ff9190614b21565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109d357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109e357506109e28261232a565b5b9050919050565b6060600280546109f990614dfa565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2590614dfa565b8015610a725780601f10610a4757610100808354040283529160200191610a72565b820191906000526020600020905b815481529060010190602001808311610a5557829003601f168201915b5050505050905090565b6000610a8782612394565b610abd576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b0382611991565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b6b576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b8a6123e2565b73ffffffffffffffffffffffffffffffffffffffff1614158015610bbc5750610bba81610bb56123e2565b61207e565b155b15610bf3576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bfe8383836123ea565b505050565b600d5481565b6000610c1361249c565b6001546000540303905090565b60026009541415610c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5d90614ae1565b60405180910390fd5b600260098190555042600f5411158015610c8f5750613840600f54610c8b9190614c06565b4211155b610cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc5906148a1565b60405180910390fd5b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610d1083611df9565b73ffffffffffffffffffffffffffffffffffffffff1614610d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5d906148e1565b60405180910390fd5b600282602001511480610d7d575060038260200151145b610dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db390614ac1565b60405180910390fd5b816000015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e25906147e1565b60405180910390fd5b600282602001511415610fc9576000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb490614a81565b60405180910390fd5b600c5460145410610f03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efa90614a21565b60405180910390fd5b600d54341015610f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3f90614801565b60405180910390fd5b600160146000828254610f5b9190614c06565b925050819055506001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fb29190614c06565b92505081905550610fc43360016124a1565b6111b7565b600281601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110169190614c06565b1115611057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104e90614b01565b60405180910390fd5b600081141561109b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611092906147c1565b60405180910390fd5b600c54816014546110ac9190614c06565b11156110ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e4906149c1565b60405180910390fd5b80600d546110fb9190614c8d565b34101561113d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611134906149e1565b60405180910390fd5b806014600082825461114f9190614c06565b9250508190555080601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111a59190614c06565b925050819055506111b633826124a1565b5b60016009819055505050565b6111ce8383836124bf565b505050565b60008054905090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026009541415611248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123f90614ae1565b60405180910390fd5b600260098190555042613840600f546112619190614c06565b106112a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129890614821565b60405180910390fd5b600281601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112ee9190614c06565b111561132f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132690614981565b60405180910390fd5b6000811415611373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136a90614a41565b60405180910390fd5b600b54600a546113839190614ce7565b816000546113919190614c06565b11156113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c990614a61565b60405180910390fd5b80600e546113e09190614c8d565b341015611422576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141990614961565b60405180910390fd5b80601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114719190614c06565b9250508190555061148233826124a1565b600160098190555050565b600260095414156114d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ca90614ae1565b60405180910390fd5b600260098190555042600f54111580156114fc5750613840600f546114f89190614c06565b4211155b61153b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611532906149a1565b60405180910390fd5b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661157d82611df9565b73ffffffffffffffffffffffffffffffffffffffff16146115d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ca90614921565b60405180910390fd5b600181602001511461161a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611611906148c1565b60405180910390fd5b806000015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461168c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168390614aa1565b60405180910390fd5b6000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461170e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170590614901565b60405180910390fd5b600c5460145410611754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174b90614861565b60405180910390fd5b6001601460008282546117679190614c06565b925050819055506001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117be9190614c06565b925050819055506117d03360016124a1565b600160098190555050565b6117e36123e2565b73ffffffffffffffffffffffffffffffffffffffff16611801611bc5565b73ffffffffffffffffffffffffffffffffffffffff1614611857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184e90614a01565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156118bf573d6000803e3d6000fd5b50565b6118dd83838360405180602001604052806000815250611eb7565b505050565b600f5481565b6118f06123e2565b73ffffffffffffffffffffffffffffffffffffffff1661190e611bc5565b73ffffffffffffffffffffffffffffffffffffffff1614611964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195b90614a01565b60405180910390fd5b806012908051906020019061197a929190613a40565b5050565b6000804690508091505090565b600e5481565b600061199c82612975565b600001519050919050565b6119af6123e2565b73ffffffffffffffffffffffffffffffffffffffff166119cd611bc5565b73ffffffffffffffffffffffffffffffffffffffff1614611a23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1a90614a01565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611acf576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611b3f6123e2565b73ffffffffffffffffffffffffffffffffffffffff16611b5d611bc5565b73ffffffffffffffffffffffffffffffffffffffff1614611bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611baa90614a01565b60405180910390fd5b611bbd6000612c04565b565b600b5481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611bfe90614dfa565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2a90614dfa565b8015611c775780601f10611c4c57610100808354040283529160200191611c77565b820191906000526020600020905b815481529060010190602001808311611c5a57829003601f168201915b5050505050905090565b611c896123e2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cee576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611cfb6123e2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611da86123e2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ded9190614655565b60405180910390a35050565b6000611e0482612cca565b9050919050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611e396123e2565b73ffffffffffffffffffffffffffffffffffffffff16611e57611bc5565b73ffffffffffffffffffffffffffffffffffffffff1614611ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea490614a01565b60405180910390fd5b80600f8190555050565b611ec28484846124bf565b611ee18373ffffffffffffffffffffffffffffffffffffffff16612cee565b8015611ef65750611ef484848484612d11565b155b15611f2d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600c5481565b6060611f4482612394565b611f7a576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611f84612e71565b9050600081511415611fa55760405180602001604052806000815250611fd0565b80611faf84612f03565b604051602001611fc0929190614578565b6040516020818303038152906040525b915050919050565b60166020528060005260406000206000915090505481565b60128054611ffd90614dfa565b80601f016020809104026020016040519081016040528092919081815260200182805461202990614dfa565b80156120765780601f1061204b57610100808354040283529160200191612076565b820191906000526020600020905b81548152906001019060200180831161205957829003601f168201915b505050505081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a5481565b6121206123e2565b73ffffffffffffffffffffffffffffffffffffffff1661213e611bc5565b73ffffffffffffffffffffffffffffffffffffffff1614612194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218b90614a01565b60405180910390fd5b60008114156121d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cf90614841565b60405180910390fd5b600b54816013546121e99190614c06565b11156121f457600080fd5b80601360008282546122069190614c06565b9250508190555061221733826124a1565b50565b6122226123e2565b73ffffffffffffffffffffffffffffffffffffffff16612240611bc5565b73ffffffffffffffffffffffffffffffffffffffff1614612296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228d90614a01565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fd906147a1565b60405180910390fd5b61230f81612c04565b50565b60156020528060005260406000206000915090505481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161239f61249c565b111580156123ae575060005482105b80156123db575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6124bb828260405180602001604052806000815250613064565b5050565b60006124ca82612975565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612535576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166125566123e2565b73ffffffffffffffffffffffffffffffffffffffff16148061258557506125848561257f6123e2565b61207e565b5b806125ca57506125936123e2565b73ffffffffffffffffffffffffffffffffffffffff166125b284610a7c565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612603576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561266a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126778585856001613076565b612683600084876123ea565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561290357600054821461290257878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461296e858585600161307c565b5050505050565b61297d613ac6565b60008290508061298b61249c565b1115801561299a575060005481105b15612bcd576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612bcb57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612aaf578092505050612bff565b5b600115612bca57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612bc5578092505050612bff565b612ab0565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080612cd683613082565b9050612ce68184604001516130e6565b915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d376123e2565b8786866040518563ffffffff1660e01b8152600401612d599493929190614609565b602060405180830381600087803b158015612d7357600080fd5b505af1925050508015612da457506040513d601f19601f82011682018060405250810190612da19190613edf565b60015b612e1e573d8060008114612dd4576040519150601f19603f3d011682016040523d82523d6000602084013e612dd9565b606091505b50600081511415612e16576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060128054612e8090614dfa565b80601f0160208091040260200160405190810160405280929190818152602001828054612eac90614dfa565b8015612ef95780601f10612ece57610100808354040283529160200191612ef9565b820191906000526020600020905b815481529060010190602001808311612edc57829003601f168201915b5050505050905090565b60606000821415612f4b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061305f565b600082905060005b60008214612f7d578080612f6690614e5d565b915050600a82612f769190614c5c565b9150612f53565b60008167ffffffffffffffff811115612f9957612f98614fcc565b5b6040519080825280601f01601f191660200182016040528015612fcb5781602001600182028036833780820191505090505b5090505b6000851461305857600182612fe49190614ce7565b9150600a85612ff39190614eb0565b6030612fff9190614c06565b60f81b81838151811061301557613014614f9d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130519190614c5c565b9450612fcf565b8093505050505b919050565b613071838383600161310d565b505050565b50505050565b50505050565b60006130df7f2c9bcd592d6f781b9b1d85ada2147d8389432d16fa8a5b8332d23f20abc94f6b836000015184602001516040516020016130c493929190614670565b604051602081830303815290604052805190602001206134db565b9050919050565b60008060006130f585856134f5565b9150915061310281613578565b819250505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561317a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156131b5576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6131c26000868387613076565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561338c575061338b8773ffffffffffffffffffffffffffffffffffffffff16612cee565b5b15613452575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46134016000888480600101955088612d11565b613437576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561339257826000541461344d57600080fd5b6134be565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613453575b8160008190555050506134d4600086838761307c565b5050505050565b60006134ee6134e861374d565b83613867565b9050919050565b6000806041835114156135375760008060006020860151925060408601519150606086015160001a905061352b8782858561389a565b94509450505050613571565b60408351141561356857600080602085015191506040850151905061355d8683836139a7565b935093505050613571565b60006002915091505b9250929050565b6000600481111561358c5761358b614f3f565b5b81600481111561359f5761359e614f3f565b5b14156135aa5761374a565b600160048111156135be576135bd614f3f565b5b8160048111156135d1576135d0614f3f565b5b1415613612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360990614761565b60405180910390fd5b6002600481111561362657613625614f3f565b5b81600481111561363957613638614f3f565b5b141561367a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161367190614781565b60405180910390fd5b6003600481111561368e5761368d614f3f565b5b8160048111156136a1576136a0614f3f565b5b14156136e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136d990614881565b60405180910390fd5b6004808111156136f5576136f4614f3f565b5b81600481111561370857613707614f3f565b5b1415613749576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374090614941565b60405180910390fd5b5b50565b60007f0000000000000000000000008b11d603b5bd9cce0ebebd544fa556cf1a6a8bd673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156137c957507f000000000000000000000000000000000000000000000000000000000000000146145b156137f6577f1b893ed1d008ae7431bbd24a0a35fa3fb1c49be56b62a58a16b2e516874d2a0f9050613864565b6138617f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f5f3dd03aef33a586cfebb4773ae0bbbed7363d50f30be8acdaa6076d3934cd187fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6613a06565b90505b90565b6000828260405160200161387c92919061459c565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156138d557600060039150915061399e565b601b8560ff16141580156138ed5750601c8560ff1614155b156138ff57600060049150915061399e565b60006001878787876040516000815260200160405260405161392494939291906146fa565b6020604051602081039080840390855afa158015613946573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156139955760006001925092505061399e565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6139ea9190614c06565b90506139f88782888561389a565b935093505050935093915050565b60008383834630604051602001613a219594939291906146a7565b6040516020818303038152906040528051906020012090509392505050565b828054613a4c90614dfa565b90600052602060002090601f016020900481019282613a6e5760008555613ab5565b82601f10613a8757805160ff1916838001178555613ab5565b82800160010185558215613ab5579182015b82811115613ab4578251825591602001919060010190613a99565b5b509050613ac29190613b09565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613b22576000816000905550600101613b0a565b5090565b6000613b39613b3484614b61565b614b3c565b905082815260208101848484011115613b5557613b5461500a565b5b613b60848285614db8565b509392505050565b6000613b7b613b7684614b92565b614b3c565b905082815260208101848484011115613b9757613b9661500a565b5b613ba2848285614db8565b509392505050565b600081359050613bb98161562b565b92915050565b600081359050613bce81615642565b92915050565b600081359050613be381615659565b92915050565b600081519050613bf881615659565b92915050565b600082601f830112613c1357613c12614ffb565b5b8135613c23848260208601613b26565b91505092915050565b600082601f830112613c4157613c40614ffb565b5b8135613c51848260208601613b68565b91505092915050565b600060608284031215613c7057613c6f615000565b5b613c7a6060614b3c565b90506000613c8a84828501613baa565b6000830152506020613c9e84828501613cda565b602083015250604082013567ffffffffffffffff811115613cc257613cc1615005565b5b613cce84828501613bfe565b60408301525092915050565b600081359050613ce981615670565b92915050565b600060208284031215613d0557613d04615014565b5b6000613d1384828501613baa565b91505092915050565b60008060408385031215613d3357613d32615014565b5b6000613d4185828601613baa565b9250506020613d5285828601613baa565b9150509250929050565b600080600060608486031215613d7557613d74615014565b5b6000613d8386828701613baa565b9350506020613d9486828701613baa565b9250506040613da586828701613cda565b9150509250925092565b60008060008060808587031215613dc957613dc8615014565b5b6000613dd787828801613baa565b9450506020613de887828801613baa565b9350506040613df987828801613cda565b925050606085013567ffffffffffffffff811115613e1a57613e1961500f565b5b613e2687828801613bfe565b91505092959194509250565b60008060408385031215613e4957613e48615014565b5b6000613e5785828601613baa565b9250506020613e6885828601613bbf565b9150509250929050565b60008060408385031215613e8957613e88615014565b5b6000613e9785828601613baa565b9250506020613ea885828601613cda565b9150509250929050565b600060208284031215613ec857613ec7615014565b5b6000613ed684828501613bd4565b91505092915050565b600060208284031215613ef557613ef4615014565b5b6000613f0384828501613be9565b91505092915050565b600060208284031215613f2257613f21615014565b5b600082013567ffffffffffffffff811115613f4057613f3f61500f565b5b613f4c84828501613c2c565b91505092915050565b600060208284031215613f6b57613f6a615014565b5b600082013567ffffffffffffffff811115613f8957613f8861500f565b5b613f9584828501613c5a565b91505092915050565b60008060408385031215613fb557613fb4615014565b5b600083013567ffffffffffffffff811115613fd357613fd261500f565b5b613fdf85828601613c5a565b9250506020613ff085828601613cda565b9150509250929050565b6000602082840312156140105761400f615014565b5b600061401e84828501613cda565b91505092915050565b61403081614d2d565b82525050565b61403f81614d1b565b82525050565b61404e81614d3f565b82525050565b61405d81614d4b565b82525050565b61407461406f82614d4b565b614ea6565b82525050565b600061408582614bc3565b61408f8185614bd9565b935061409f818560208601614dc7565b6140a881615019565b840191505092915050565b60006140be82614bce565b6140c88185614bea565b93506140d8818560208601614dc7565b6140e181615019565b840191505092915050565b60006140f782614bce565b6141018185614bfb565b9350614111818560208601614dc7565b80840191505092915050565b600061412a601883614bea565b91506141358261502a565b602082019050919050565b600061414d601f83614bea565b915061415882615053565b602082019050919050565b6000614170602683614bea565b915061417b8261507c565b604082019050919050565b6000614193601c83614bea565b915061419e826150cb565b602082019050919050565b60006141b6601a83614bea565b91506141c1826150f4565b602082019050919050565b60006141d9600283614bfb565b91506141e48261511d565b600282019050919050565b60006141fc601483614bea565b915061420782615146565b602082019050919050565b600061421f601c83614bea565b915061422a8261516f565b602082019050919050565b6000614242600e83614bea565b915061424d82615198565b602082019050919050565b6000614265602083614bea565b9150614270826151c1565b602082019050919050565b6000614288602283614bea565b9150614293826151ea565b604082019050919050565b60006142ab601e83614bea565b91506142b682615239565b602082019050919050565b60006142ce601783614bea565b91506142d982615262565b602082019050919050565b60006142f1601c83614bea565b91506142fc8261528b565b602082019050919050565b6000614314601983614bea565b915061431f826152b4565b602082019050919050565b6000614337601c83614bea565b9150614342826152dd565b602082019050919050565b600061435a602283614bea565b915061436582615306565b604082019050919050565b600061437d601583614bea565b915061438882615355565b602082019050919050565b60006143a0602683614bea565b91506143ab8261537e565b604082019050919050565b60006143c3601e83614bea565b91506143ce826153cd565b602082019050919050565b60006143e6602383614bea565b91506143f1826153f6565b604082019050919050565b6000614409601683614bea565b915061441482615445565b602082019050919050565b600061442c602083614bea565b91506144378261546e565b602082019050919050565b600061444f602183614bea565b915061445a82615497565b604082019050919050565b6000614472601b83614bea565b915061447d826154e6565b602082019050919050565b6000614495601583614bea565b91506144a08261550f565b602082019050919050565b60006144b8601a83614bea565b91506144c382615538565b602082019050919050565b60006144db601a83614bea565b91506144e682615561565b602082019050919050565b60006144fe601783614bea565b91506145098261558a565b602082019050919050565b6000614521601f83614bea565b915061452c826155b3565b602082019050919050565b6000614544602583614bea565b915061454f826155dc565b604082019050919050565b61456381614da1565b82525050565b61457281614dab565b82525050565b600061458482856140ec565b915061459082846140ec565b91508190509392505050565b60006145a7826141cc565b91506145b38285614063565b6020820191506145c38284614063565b6020820191508190509392505050565b60006020820190506145e86000830184614036565b92915050565b60006020820190506146036000830184614027565b92915050565b600060808201905061461e6000830187614036565b61462b6020830186614036565b614638604083018561455a565b818103606083015261464a818461407a565b905095945050505050565b600060208201905061466a6000830184614045565b92915050565b60006060820190506146856000830186614054565b6146926020830185614036565b61469f604083018461455a565b949350505050565b600060a0820190506146bc6000830188614054565b6146c96020830187614054565b6146d66040830186614054565b6146e3606083018561455a565b6146f06080830184614036565b9695505050505050565b600060808201905061470f6000830187614054565b61471c6020830186614569565b6147296040830185614054565b6147366060830184614054565b95945050505050565b6000602082019050818103600083015261475981846140b3565b905092915050565b6000602082019050818103600083015261477a8161411d565b9050919050565b6000602082019050818103600083015261479a81614140565b9050919050565b600060208201905081810360008301526147ba81614163565b9050919050565b600060208201905081810360008301526147da81614186565b9050919050565b600060208201905081810360008301526147fa816141a9565b9050919050565b6000602082019050818103600083015261481a816141ef565b9050919050565b6000602082019050818103600083015261483a81614212565b9050919050565b6000602082019050818103600083015261485a81614235565b9050919050565b6000602082019050818103600083015261487a81614258565b9050919050565b6000602082019050818103600083015261489a8161427b565b9050919050565b600060208201905081810360008301526148ba8161429e565b9050919050565b600060208201905081810360008301526148da816142c1565b9050919050565b600060208201905081810360008301526148fa816142e4565b9050919050565b6000602082019050818103600083015261491a81614307565b9050919050565b6000602082019050818103600083015261493a8161432a565b9050919050565b6000602082019050818103600083015261495a8161434d565b9050919050565b6000602082019050818103600083015261497a81614370565b9050919050565b6000602082019050818103600083015261499a81614393565b9050919050565b600060208201905081810360008301526149ba816143b6565b9050919050565b600060208201905081810360008301526149da816143d9565b9050919050565b600060208201905081810360008301526149fa816143fc565b9050919050565b60006020820190508181036000830152614a1a8161441f565b9050919050565b60006020820190508181036000830152614a3a81614442565b9050919050565b60006020820190508181036000830152614a5a81614465565b9050919050565b60006020820190508181036000830152614a7a81614488565b9050919050565b60006020820190508181036000830152614a9a816144ab565b9050919050565b60006020820190508181036000830152614aba816144ce565b9050919050565b60006020820190508181036000830152614ada816144f1565b9050919050565b60006020820190508181036000830152614afa81614514565b9050919050565b60006020820190508181036000830152614b1a81614537565b9050919050565b6000602082019050614b36600083018461455a565b92915050565b6000614b46614b57565b9050614b528282614e2c565b919050565b6000604051905090565b600067ffffffffffffffff821115614b7c57614b7b614fcc565b5b614b8582615019565b9050602081019050919050565b600067ffffffffffffffff821115614bad57614bac614fcc565b5b614bb682615019565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c1182614da1565b9150614c1c83614da1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c5157614c50614ee1565b5b828201905092915050565b6000614c6782614da1565b9150614c7283614da1565b925082614c8257614c81614f10565b5b828204905092915050565b6000614c9882614da1565b9150614ca383614da1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614cdc57614cdb614ee1565b5b828202905092915050565b6000614cf282614da1565b9150614cfd83614da1565b925082821015614d1057614d0f614ee1565b5b828203905092915050565b6000614d2682614d81565b9050919050565b6000614d3882614d81565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614de5578082015181840152602081019050614dca565b83811115614df4576000848401525b50505050565b60006002820490506001821680614e1257607f821691505b60208210811415614e2657614e25614f6e565b5b50919050565b614e3582615019565b810181811067ffffffffffffffff82111715614e5457614e53614fcc565b5b80604052505050565b6000614e6882614da1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e9b57614e9a614ee1565b5b600182019050919050565b6000819050919050565b6000614ebb82614da1565b9150614ec683614da1565b925082614ed657614ed5614f10565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f64796e61737479206c6973743a20696e76616c696420616d6f756e7400000000600082015250565b7f77686974656c6973743a206e6f7420696e20746865206c697374000000000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f6c75636b79206c6973743a20706179206d6f7265000000000000000000000000600082015250565b7f7075626c6963206d696e743a206e6f7420737461727465642079657400000000600082015250565b7f696e76616c696420616d6f756e74000000000000000000000000000000000000600082015250565b7f66726565206c6973743a20657863656564696e672070726573616c6520636170600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f77686974656c6973743a206f7574736964652074696d652077696e646f770000600082015250565b7f66726565206c6973743a20696e76616c69642074797065000000000000000000600082015250565b7f77686974656c6973743a20696e76616c6964207369676e617475726500000000600082015250565b7f66726565206c6973743a20616c726561647920626f7567687400000000000000600082015250565b7f66726565206c6973743a20696e76616c6964207369676e617475726500000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f7075626c6963206d696e743a20706179206d6f72650000000000000000000000600082015250565b7f7075626c6963206d696e743a20657863656564696e67207065726d697474656460008201527f206c696d69740000000000000000000000000000000000000000000000000000602082015250565b7f66726565206c6973743a206f7574736964652074696d652077696e646f770000600082015250565b7f64796e61737479206c6973743a20657863656564696e672070726573616c652060008201527f6361700000000000000000000000000000000000000000000000000000000000602082015250565b7f64796e61737479206c6973743a20706179206d6f726500000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f6c75636b79206c6973743a20657863656564696e672070726573616c6520636160008201527f7000000000000000000000000000000000000000000000000000000000000000602082015250565b7f7075626c6963206d696e743a20696e76616c696420616d6f756e740000000000600082015250565b7f7075626c6963206d696e743a20736f6c64206f75740000000000000000000000600082015250565b7f6c75636b79206c6973743a20616c726561647920626f75676874000000000000600082015250565b7f66726565206c6973743a206e6f7420696e20746865206c697374000000000000600082015250565b7f77686974656c6973743a20696e76616c69642074797065000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f64796e61737479206c6973743a2063616e6e6f74206d696e74206d6f7265207460008201527f68616e2032000000000000000000000000000000000000000000000000000000602082015250565b61563481614d1b565b811461563f57600080fd5b50565b61564b81614d3f565b811461565657600080fd5b50565b61566281614d55565b811461566d57600080fd5b50565b61567981614da1565b811461568457600080fd5b5056fea26469706673582212202b224ea6a635880afbc148b9abcd810404a793cce6bb8199a35fb1d4ad56e07864736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000002ae4cece89e1d044d7733f792f20b8c664f74de4000000000000000000000000000000000000000000000000000000000000000d4e465420383844796e617374790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064e46543838440000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): NFT 88Dynasty
Arg [1] : _symbol (string): NFT88D
Arg [2] : _treasury (address): 0x2ae4cEce89E1d044D7733F792F20B8C664f74dE4

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000002ae4cece89e1d044d7733f792f20b8c664f74de4
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [4] : 4e465420383844796e6173747900000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [6] : 4e46543838440000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

63164:5063:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42791:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45904:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47407:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46970:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63355:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42040:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65173:1590;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48272:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67638:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63546:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66773:600;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64398:767;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67383:102;;;;;;;;;;;;;:::i;:::-;;48513:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63487:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68013:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20303:163;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63404:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45712:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67499:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43160:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62249:103;;;;;;;;;;;;;:::i;:::-;;63279:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61598:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46073:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47683:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19526:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63586:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67744:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48769:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63312:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46248:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63791:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63624:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48041:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63250:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64122:266;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62507:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63736:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42791:305;42893:4;42945:25;42930:40;;;:11;:40;;;;:105;;;;43002:33;42987:48;;;:11;:48;;;;42930:105;:158;;;;43052:36;43076:11;43052:23;:36::i;:::-;42930:158;42910:178;;42791:305;;;:::o;45904:100::-;45958:13;45991:5;45984:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45904:100;:::o;47407:204::-;47475:7;47500:16;47508:7;47500;:16::i;:::-;47495:64;;47525:34;;;;;;;;;;;;;;47495:64;47579:15;:24;47595:7;47579:24;;;;;;;;;;;;;;;;;;;;;47572:31;;47407:204;;;:::o;46970:371::-;47043:13;47059:24;47075:7;47059:15;:24::i;:::-;47043:40;;47104:5;47098:11;;:2;:11;;;47094:48;;;47118:24;;;;;;;;;;;;;;47094:48;47175:5;47159:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;47185:37;47202:5;47209:12;:10;:12::i;:::-;47185:16;:37::i;:::-;47184:38;47159:63;47155:138;;;47246:35;;;;;;;;;;;;;;47155:138;47305:28;47314:2;47318:7;47327:5;47305:8;:28::i;:::-;47032:309;46970:371;;:::o;63355:42::-;;;;:::o;42040:303::-;42084:7;42309:15;:13;:15::i;:::-;42294:12;;42278:13;;:28;:46;42271:53;;42040:303;:::o;65173:1590::-;1812:1;2410:7;;:19;;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;65338:15:::1;65314:20;;:39;;:90;;;;;65399:5;65376:20;;:28;;;;:::i;:::-;65357:15;:47;;65314:90;65306:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;65482:16;;;;;;;;;;;65458:40;;:20;65468:9;65458;:20::i;:::-;:40;;;65450:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;65572:1;65550:9;:18;;;:23;:50;;;;65599:1;65577:9;:18;;;:23;65550:50;65542:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;65662:9;:14;;;65648:28;;:10;:28;;;65640:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;65788:1;65766:9;:18;;;:23;65762:993;;;65846:1;65814:16;:28;65831:10;65814:28;;;;;;;;;;;;;;;;:33;65806:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;65918:11;;65901:14;;:28;65893:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;66003:15;;65990:9;:28;;65982:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;66090:1;66072:14;;:19;;;;;;;:::i;:::-;;;;;;;;66138:1;66106:16;:28;66123:10;66106:28;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;66154:24;66164:10;66176:1;66154:9;:24::i;:::-;65762:993;;;66307:1;66297:6;66266:16;:28;66283:10;66266:28;;;;;;;;;;;;;;;;:37;;;;:::i;:::-;:42;;66258:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;66383:1;66373:6;:11;;66365:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;66467:11;;66457:6;66440:14;;:23;;;;:::i;:::-;:38;;66432:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;66572:6;66554:15;;:24;;;;:::i;:::-;66541:9;:37;;66533:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;66640:6;66622:14;;:24;;;;;;;:::i;:::-;;;;;;;;66693:6;66661:16;:28;66678:10;66661:28;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;66714:29;66724:10;66736:6;66714:9;:29::i;:::-;65762:993;1768:1:::0;2722:7;:22;;;;65173:1590;;:::o;48272:170::-;48406:28;48416:4;48422:2;48426:7;48406:9;:28::i;:::-;48272:170;;;:::o;67638:96::-;67689:4;67713:13;;67706:20;;67638:96;:::o;63546:31::-;;;;;;;;;;;;;:::o;66773:600::-;1812:1;2410:7;;:19;;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;66895:15:::1;66887:5;66864:20;;:28;;;;:::i;:::-;:46;66856:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;67006:1;66996:6;66962:19;:31;66982:10;66962:31;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;:45;;66954:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;67079:1;67069:6;:11;;67061:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;67163:9;;67157:3;;:15;;;;:::i;:::-;67147:6;67131:13;;:22;;;;:::i;:::-;:41;;67123:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;67245:6;67230:12;;:21;;;;:::i;:::-;67217:9;:34;;67209:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67318:6;67283:19;:31;67303:10;67283:31;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;67335:29;67345:10;67357:6;67335:9;:29::i;:::-;1768:1:::0;2722:7;:22;;;;66773:600;:::o;64398:767::-;1812:1;2410:7;;:19;;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;64527:15:::1;64503:20;;:39;;:90;;;;;64588:5;64565:20;;:28;;;;:::i;:::-;64546:15;:47;;64503:90;64495:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;64671:16;;;;;;;;;;;64647:40;;:20;64657:9;64647;:20::i;:::-;:40;;;64639:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;64761:1;64739:9;:18;;;:23;64731:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;64824:9;:14;;;64810:28;;:10;:28;;;64802:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;64920:1;64888:16;:28;64905:10;64888:28;;;;;;;;;;;;;;;;:33;64880:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;64987:11;;64970:14;;:28;64962:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;65074:1;65056:14;;:19;;;;;;;:::i;:::-;;;;;;;;65118:1;65086:16;:28;65103:10;65086:28;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;65130:24;65140:10;65152:1;65130:9;:24::i;:::-;1768:1:::0;2722:7;:22;;;;64398:767;:::o;67383:102::-;61829:12;:10;:12::i;:::-;61818:23;;:7;:5;:7::i;:::-;:23;;;61810:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67437:8:::1;;;;;;;;;;;:17;;:40;67455:21;67437:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;67383:102::o:0;48513:185::-;48651:39;48668:4;48674:2;48678:7;48651:39;;;;;;;;;;;;:16;:39::i;:::-;48513:185;;;:::o;63487:45::-;;;;:::o;68013:209::-;61829:12;:10;:12::i;:::-;61818:23;;:7;:5;:7::i;:::-;:23;;;61810:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68206:8:::1;68191:12;:23;;;;;;;;;;;;:::i;:::-;;68013:209:::0;:::o;20303:163::-;20348:7;20368:10;20419:9;20413:15;;20456:2;20449:9;;;20303:163;:::o;63404:36::-;;;;:::o;45712:125::-;45776:7;45803:21;45816:7;45803:12;:21::i;:::-;:26;;;45796:33;;45712:125;;;:::o;67499:129::-;61829:12;:10;:12::i;:::-;61818:23;;:7;:5;:7::i;:::-;:23;;;61810:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67613:7:::1;67594:16;;:26;;;;;;;;;;;;;;;;;;67499:129:::0;:::o;43160:206::-;43224:7;43265:1;43248:19;;:5;:19;;;43244:60;;;43276:28;;;;;;;;;;;;;;43244:60;43330:12;:19;43343:5;43330:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;43322:36;;43315:43;;43160:206;;;:::o;62249:103::-;61829:12;:10;:12::i;:::-;61818:23;;:7;:5;:7::i;:::-;:23;;;61810:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62314:30:::1;62341:1;62314:18;:30::i;:::-;62249:103::o:0;63279:26::-;;;;:::o;61598:87::-;61644:7;61671:6;;;;;;;;;;;61664:13;;61598:87;:::o;46073:104::-;46129:13;46162:7;46155:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46073:104;:::o;47683:287::-;47794:12;:10;:12::i;:::-;47782:24;;:8;:24;;;47778:54;;;47815:17;;;;;;;;;;;;;;47778:54;47890:8;47845:18;:32;47864:12;:10;:12::i;:::-;47845:32;;;;;;;;;;;;;;;:42;47878:8;47845:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;47943:8;47914:48;;47929:12;:10;:12::i;:::-;47914:48;;;47953:8;47914:48;;;;;;:::i;:::-;;;;;;;;47683:287;;:::o;19526:111::-;19590:7;19616:13;19624:4;19616:7;:13::i;:::-;19609:20;;19526:111;;;:::o;63586:31::-;;;;;;;;;;;;;:::o;67744:130::-;61829:12;:10;:12::i;:::-;61818:23;;:7;:5;:7::i;:::-;:23;;;61810:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67857:9:::1;67834:20;:32;;;;67744:130:::0;:::o;48769:369::-;48936:28;48946:4;48952:2;48956:7;48936:9;:28::i;:::-;48979:15;:2;:13;;;:15::i;:::-;:76;;;;;48999:56;49030:4;49036:2;49040:7;49049:5;48999:30;:56::i;:::-;48998:57;48979:76;48975:156;;;49079:40;;;;;;;;;;;;;;48975:156;48769:369;;;;:::o;63312:30::-;;;;:::o;46248:318::-;46321:13;46352:16;46360:7;46352;:16::i;:::-;46347:59;;46377:29;;;;;;;;;;;;;;46347:59;46419:21;46443:10;:8;:10::i;:::-;46419:34;;46496:1;46477:7;46471:21;:26;;:87;;;;;;;;;;;;;;;;;46524:7;46533:18;:7;:16;:18::i;:::-;46507:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46471:87;46464:94;;;46248:318;;;:::o;63791:51::-;;;;;;;;;;;;;;;;;:::o;63624:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48041:164::-;48138:4;48162:18;:25;48181:5;48162:25;;;;;;;;;;;;;;;:35;48188:8;48162:35;;;;;;;;;;;;;;;;;;;;;;;;;48155:42;;48041:164;;;;:::o;63250:22::-;;;;:::o;64122:266::-;61829:12;:10;:12::i;:::-;61818:23;;:7;:5;:7::i;:::-;:23;;;61810:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64220:1:::1;64209:7;:12;;64201:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;64285:9;;64274:7;64259:12;;:22;;;;:::i;:::-;:35;;64251:44;;;::::0;::::1;;64332:7;64316:12;;:23;;;;;;;:::i;:::-;;;;;;;;64350:30;64360:10;64372:7;64350:9;:30::i;:::-;64122:266:::0;:::o;62507:201::-;61829:12;:10;:12::i;:::-;61818:23;;:7;:5;:7::i;:::-;:23;;;61810:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62616:1:::1;62596:22;;:8;:22;;;;62588:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;62672:28;62691:8;62672:18;:28::i;:::-;62507:201:::0;:::o;63736:48::-;;;;;;;;;;;;;;;;;:::o;31789:157::-;31874:4;31913:25;31898:40;;;:11;:40;;;;31891:47;;31789:157;;;:::o;49393:174::-;49450:4;49493:7;49474:15;:13;:15::i;:::-;:26;;:53;;;;;49514:13;;49504:7;:23;49474:53;:85;;;;;49532:11;:20;49544:7;49532:20;;;;;;;;;;;:27;;;;;;;;;;;;49531:28;49474:85;49467:92;;49393:174;;;:::o;38307:98::-;38360:7;38387:10;38380:17;;38307:98;:::o;57550:196::-;57692:2;57665:15;:24;57681:7;57665:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;57730:7;57726:2;57710:28;;57719:5;57710:28;;;;;;;;;;;;57550:196;;;:::o;41814:92::-;41870:7;41814:92;:::o;49575:104::-;49644:27;49654:2;49658:8;49644:27;;;;;;;;;;;;:9;:27::i;:::-;49575:104;;:::o;52493:2130::-;52608:35;52646:21;52659:7;52646:12;:21::i;:::-;52608:59;;52706:4;52684:26;;:13;:18;;;:26;;;52680:67;;52719:28;;;;;;;;;;;;;;52680:67;52760:22;52802:4;52786:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;52823:36;52840:4;52846:12;:10;:12::i;:::-;52823:16;:36::i;:::-;52786:73;:126;;;;52900:12;:10;:12::i;:::-;52876:36;;:20;52888:7;52876:11;:20::i;:::-;:36;;;52786:126;52760:153;;52931:17;52926:66;;52957:35;;;;;;;;;;;;;;52926:66;53021:1;53007:16;;:2;:16;;;53003:52;;;53032:23;;;;;;;;;;;;;;53003:52;53068:43;53090:4;53096:2;53100:7;53109:1;53068:21;:43::i;:::-;53176:35;53193:1;53197:7;53206:4;53176:8;:35::i;:::-;53537:1;53507:12;:18;53520:4;53507:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53581:1;53553:12;:16;53566:2;53553:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53599:31;53633:11;:20;53645:7;53633:20;;;;;;;;;;;53599:54;;53684:2;53668:8;:13;;;:18;;;;;;;;;;;;;;;;;;53734:15;53701:8;:23;;;:49;;;;;;;;;;;;;;;;;;54002:19;54034:1;54024:7;:11;54002:33;;54050:31;54084:11;:24;54096:11;54084:24;;;;;;;;;;;54050:58;;54152:1;54127:27;;:8;:13;;;;;;;;;;;;:27;;;54123:384;;;54337:13;;54322:11;:28;54318:174;;54391:4;54375:8;:13;;;:20;;;;;;;;;;;;;;;;;;54444:13;:28;;;54418:8;:23;;;:54;;;;;;;;;;;;;;;;;;54318:174;54123:384;53482:1036;;;54554:7;54550:2;54535:27;;54544:4;54535:27;;;;;;;;;;;;54573:42;54594:4;54600:2;54604:7;54613:1;54573:20;:42::i;:::-;52597:2026;;52493:2130;;;:::o;44541:1109::-;44603:21;;:::i;:::-;44637:12;44652:7;44637:22;;44720:4;44701:15;:13;:15::i;:::-;:23;;:47;;;;;44735:13;;44728:4;:20;44701:47;44697:886;;;44769:31;44803:11;:17;44815:4;44803:17;;;;;;;;;;;44769:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44844:9;:16;;;44839:729;;44915:1;44889:28;;:9;:14;;;:28;;;44885:101;;44953:9;44946:16;;;;;;44885:101;45288:261;45295:4;45288:261;;;45328:6;;;;;;;;45373:11;:17;45385:4;45373:17;;;;;;;;;;;45361:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45447:1;45421:28;;:9;:14;;;:28;;;45417:109;;45489:9;45482:16;;;;;;45417:109;45288:261;;;44839:729;44750:833;44697:886;45611:31;;;;;;;;;;;;;;44541:1109;;;;:::o;62868:191::-;62942:16;62961:6;;;;;;;;;;;62942:25;;62987:8;62978:6;;:17;;;;;;;;;;;;;;;;;;63042:8;63011:40;;63032:8;63011:40;;;;;;;;;;;;62931:128;62868:191;:::o;20119:176::-;20184:7;20204:14;20221:11;20227:4;20221:5;:11::i;:::-;20204:28;;20250:37;20264:6;20272:4;:14;;;20250:13;:37::i;:::-;20243:44;;;20119:176;;;:::o;21706:326::-;21766:4;22023:1;22001:7;:19;;;:23;21994:30;;21706:326;;;:::o;58238:667::-;58401:4;58438:2;58422:36;;;58459:12;:10;:12::i;:::-;58473:4;58479:7;58488:5;58422:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;58418:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58673:1;58656:6;:13;:18;58652:235;;;58702:40;;;;;;;;;;;;;;58652:235;58845:6;58839:13;58830:6;58826:2;58822:15;58815:38;58418:480;58551:45;;;58541:55;;;:6;:55;;;;58534:62;;;58238:667;;;;;;:::o;67884:119::-;67950:13;67983:12;67976:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67884:119;:::o;3124:723::-;3180:13;3410:1;3401:5;:10;3397:53;;;3428:10;;;;;;;;;;;;;;;;;;;;;3397:53;3460:12;3475:5;3460:20;;3491:14;3516:78;3531:1;3523:4;:9;3516:78;;3549:8;;;;;:::i;:::-;;;;3580:2;3572:10;;;;;:::i;:::-;;;3516:78;;;3604:19;3636:6;3626:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3604:39;;3654:154;3670:1;3661:5;:10;3654:154;;3698:1;3688:11;;;;;:::i;:::-;;;3765:2;3757:5;:10;;;;:::i;:::-;3744:2;:24;;;;:::i;:::-;3731:39;;3714:6;3721;3714:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3794:2;3785:11;;;;;:::i;:::-;;;3654:154;;;3832:6;3818:21;;;;;3124:723;;;;:::o;50042:163::-;50165:32;50171:2;50175:8;50185:5;50192:4;50165:5;:32::i;:::-;50042:163;;;:::o;59553:159::-;;;;;:::o;60371:158::-;;;;;:::o;19756:355::-;19819:7;19846:257;19938:52;20013:4;:9;;;20045:4;:13;;;19905:172;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;19877:215;;;;;;19846:16;:257::i;:::-;19839:264;;19756:355;;;:::o;9300:231::-;9378:7;9399:17;9418:18;9440:27;9451:4;9457:9;9440:10;:27::i;:::-;9398:69;;;;9478:18;9490:5;9478:11;:18::i;:::-;9514:9;9507:16;;;;9300:231;;;;:::o;50464:1775::-;50603:20;50626:13;;50603:36;;50668:1;50654:16;;:2;:16;;;50650:48;;;50679:19;;;;;;;;;;;;;;50650:48;50725:1;50713:8;:13;50709:44;;;50735:18;;;;;;;;;;;;;;50709:44;50766:61;50796:1;50800:2;50804:12;50818:8;50766:21;:61::i;:::-;51139:8;51104:12;:16;51117:2;51104:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51203:8;51163:12;:16;51176:2;51163:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51262:2;51229:11;:25;51241:12;51229:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;51329:15;51279:11;:25;51291:12;51279:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;51362:20;51385:12;51362:35;;51412:11;51441:8;51426:12;:23;51412:37;;51470:4;:23;;;;;51478:15;:2;:13;;;:15::i;:::-;51470:23;51466:641;;;51514:314;51570:12;51566:2;51545:38;;51562:1;51545:38;;;;;;;;;;;;51611:69;51650:1;51654:2;51658:14;;;;;;51674:5;51611:30;:69::i;:::-;51606:174;;51716:40;;;;;;;;;;;;;;51606:174;51823:3;51807:12;:19;;51514:314;;51909:12;51892:13;;:29;51888:43;;51923:8;;;51888:43;51466:641;;;51972:120;52028:14;;;;;;52024:2;52003:40;;52020:1;52003:40;;;;;;;;;;;;52087:3;52071:12;:19;;51972:120;;51466:641;52137:12;52121:13;:28;;;;51079:1082;;52171:60;52200:1;52204:2;52208:12;52222:8;52171:20;:60::i;:::-;50592:1647;50464:1775;;;;:::o;18874:167::-;18951:7;18978:55;19000:20;:18;:20::i;:::-;19022:10;18978:21;:55::i;:::-;18971:62;;18874:167;;;:::o;7190:1308::-;7271:7;7280:12;7525:2;7505:9;:16;:22;7501:990;;;7544:9;7568;7592:7;7801:4;7790:9;7786:20;7780:27;7775:32;;7851:4;7840:9;7836:20;7830:27;7825:32;;7909:4;7898:9;7894:20;7888:27;7885:1;7880:36;7875:41;;7952:25;7963:4;7969:1;7972;7975;7952:10;:25::i;:::-;7945:32;;;;;;;;;7501:990;8019:2;7999:9;:16;:22;7995:496;;;8038:9;8062:10;8274:4;8263:9;8259:20;8253:27;8248:32;;8325:4;8314:9;8310:20;8304:27;8298:33;;8367:23;8378:4;8384:1;8387:2;8367:10;:23::i;:::-;8360:30;;;;;;;;7995:496;8439:1;8443:35;8423:56;;;;7190:1308;;;;;;:::o;5461:643::-;5539:20;5530:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;5526:571;;;5576:7;;5526:571;5637:29;5628:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;5624:473;;;5683:34;;;;;;;;;;:::i;:::-;;;;;;;;5624:473;5748:35;5739:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;5735:362;;;5800:41;;;;;;;;;;:::i;:::-;;;;;;;;5735:362;5872:30;5863:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;5859:238;;;5919:44;;;;;;;;;;:::i;:::-;;;;;;;;5859:238;5994:30;5985:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;5981:116;;;6041:44;;;;;;;;;;:::i;:::-;;;;;;;;5981:116;5461:643;;:::o;17647:314::-;17700:7;17741:12;17724:29;;17732:4;17724:29;;;:66;;;;;17774:16;17757:13;:33;17724:66;17720:234;;;17814:24;17807:31;;;;17720:234;17878:64;17900:10;17912:12;17926:15;17878:21;:64::i;:::-;17871:71;;17647:314;;:::o;14214:196::-;14307:7;14373:15;14390:10;14344:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;14334:68;;;;;;14327:75;;14214:196;;;;:::o;10752:1632::-;10883:7;10892:12;11817:66;11812:1;11804:10;;:79;11800:163;;;11916:1;11920:30;11900:51;;;;;;11800:163;11982:2;11977:1;:7;;;;:18;;;;;11993:2;11988:1;:7;;;;11977:18;11973:102;;;12028:1;12032:30;12012:51;;;;;;11973:102;12172:14;12189:24;12199:4;12205:1;12208;12211;12189:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12172:41;;12246:1;12228:20;;:6;:20;;;12224:103;;;12281:1;12285:29;12265:50;;;;;;;12224:103;12347:6;12355:20;12339:37;;;;;10752:1632;;;;;;;;:::o;9794:344::-;9908:7;9917:12;9942:9;9967:66;9959:75;;9954:2;:80;9942:92;;10045:7;10084:2;10077:3;10070:2;10062:11;;:18;;10061:25;;;;:::i;:::-;10045:42;;10105:25;10116:4;10122:1;10125;10128;10105:10;:25::i;:::-;10098:32;;;;;;9794:344;;;;;;:::o;17969:263::-;18113:7;18161:8;18171;18181:11;18194:13;18217:4;18150:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;18140:84;;;;;;18133:91;;17969:263;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428: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;2175:916::-;2252:5;2296:4;2284:9;2279:3;2275:19;2271:30;2268:117;;;2304:79;;:::i;:::-;2268:117;2403:21;2419:4;2403:21;:::i;:::-;2394:30;;2483:1;2523:49;2568:3;2559:6;2548:9;2544:22;2523:49;:::i;:::-;2516:4;2509:5;2505:16;2498:75;2434:150;2647:2;2688:49;2733:3;2724:6;2713:9;2709:22;2688:49;:::i;:::-;2681:4;2674:5;2670:16;2663:75;2594:155;2841:2;2830:9;2826:18;2813:32;2872:18;2864:6;2861:30;2858:117;;;2894:79;;:::i;:::-;2858:117;3014:58;3068:3;3059:6;3048:9;3044:22;3014:58;:::i;:::-;3007:4;3000:5;2996:16;2989:84;2759:325;2175:916;;;;:::o;3097:139::-;3143:5;3181:6;3168:20;3159:29;;3197:33;3224:5;3197:33;:::i;:::-;3097:139;;;;:::o;3242:329::-;3301:6;3350:2;3338:9;3329:7;3325:23;3321:32;3318:119;;;3356:79;;:::i;:::-;3318:119;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3242:329;;;;:::o;3577:474::-;3645:6;3653;3702:2;3690:9;3681:7;3677:23;3673:32;3670:119;;;3708:79;;:::i;:::-;3670:119;3828:1;3853:53;3898:7;3889:6;3878:9;3874:22;3853:53;:::i;:::-;3843:63;;3799:117;3955:2;3981:53;4026:7;4017:6;4006:9;4002:22;3981:53;:::i;:::-;3971:63;;3926:118;3577:474;;;;;:::o;4057:619::-;4134:6;4142;4150;4199:2;4187:9;4178:7;4174:23;4170:32;4167:119;;;4205:79;;:::i;:::-;4167:119;4325:1;4350:53;4395:7;4386:6;4375:9;4371:22;4350:53;:::i;:::-;4340:63;;4296:117;4452:2;4478:53;4523:7;4514:6;4503:9;4499:22;4478:53;:::i;:::-;4468:63;;4423:118;4580:2;4606:53;4651:7;4642:6;4631:9;4627:22;4606:53;:::i;:::-;4596:63;;4551:118;4057:619;;;;;:::o;4682:943::-;4777:6;4785;4793;4801;4850:3;4838:9;4829:7;4825:23;4821:33;4818:120;;;4857:79;;:::i;:::-;4818:120;4977:1;5002:53;5047:7;5038:6;5027:9;5023:22;5002:53;:::i;:::-;4992:63;;4948:117;5104:2;5130:53;5175:7;5166:6;5155:9;5151:22;5130:53;:::i;:::-;5120:63;;5075:118;5232:2;5258:53;5303:7;5294:6;5283:9;5279:22;5258:53;:::i;:::-;5248:63;;5203:118;5388:2;5377:9;5373:18;5360:32;5419:18;5411:6;5408:30;5405:117;;;5441:79;;:::i;:::-;5405:117;5546:62;5600:7;5591:6;5580:9;5576:22;5546:62;:::i;:::-;5536:72;;5331:287;4682:943;;;;;;;:::o;5631:468::-;5696:6;5704;5753:2;5741:9;5732:7;5728:23;5724:32;5721:119;;;5759:79;;:::i;:::-;5721:119;5879:1;5904:53;5949:7;5940:6;5929:9;5925:22;5904:53;:::i;:::-;5894:63;;5850:117;6006:2;6032:50;6074:7;6065:6;6054:9;6050:22;6032:50;:::i;:::-;6022:60;;5977:115;5631:468;;;;;:::o;6105:474::-;6173:6;6181;6230:2;6218:9;6209:7;6205:23;6201:32;6198:119;;;6236:79;;:::i;:::-;6198:119;6356:1;6381:53;6426:7;6417:6;6406:9;6402:22;6381:53;:::i;:::-;6371:63;;6327:117;6483:2;6509:53;6554:7;6545:6;6534:9;6530:22;6509:53;:::i;:::-;6499:63;;6454:118;6105:474;;;;;:::o;6585:327::-;6643:6;6692:2;6680:9;6671:7;6667:23;6663:32;6660:119;;;6698:79;;:::i;:::-;6660:119;6818:1;6843:52;6887:7;6878:6;6867:9;6863:22;6843:52;:::i;:::-;6833:62;;6789:116;6585:327;;;;:::o;6918:349::-;6987:6;7036:2;7024:9;7015:7;7011:23;7007:32;7004:119;;;7042:79;;:::i;:::-;7004:119;7162:1;7187:63;7242:7;7233:6;7222:9;7218:22;7187:63;:::i;:::-;7177:73;;7133:127;6918:349;;;;:::o;7273:509::-;7342:6;7391:2;7379:9;7370:7;7366:23;7362:32;7359:119;;;7397:79;;:::i;:::-;7359:119;7545:1;7534:9;7530:17;7517:31;7575:18;7567:6;7564:30;7561:117;;;7597:79;;:::i;:::-;7561:117;7702:63;7757:7;7748:6;7737:9;7733:22;7702:63;:::i;:::-;7692:73;;7488:287;7273:509;;;;:::o;7788:545::-;7875:6;7924:2;7912:9;7903:7;7899:23;7895:32;7892:119;;;7930:79;;:::i;:::-;7892:119;8078:1;8067:9;8063:17;8050:31;8108:18;8100:6;8097:30;8094:117;;;8130:79;;:::i;:::-;8094:117;8235:81;8308:7;8299:6;8288:9;8284:22;8235:81;:::i;:::-;8225:91;;8021:305;7788:545;;;;:::o;8339:690::-;8435:6;8443;8492:2;8480:9;8471:7;8467:23;8463:32;8460:119;;;8498:79;;:::i;:::-;8460:119;8646:1;8635:9;8631:17;8618:31;8676:18;8668:6;8665:30;8662:117;;;8698:79;;:::i;:::-;8662:117;8803:81;8876:7;8867:6;8856:9;8852:22;8803:81;:::i;:::-;8793:91;;8589:305;8933:2;8959:53;9004:7;8995:6;8984:9;8980:22;8959:53;:::i;:::-;8949:63;;8904:118;8339:690;;;;;:::o;9035:329::-;9094:6;9143:2;9131:9;9122:7;9118:23;9114:32;9111:119;;;9149:79;;:::i;:::-;9111:119;9269:1;9294:53;9339:7;9330:6;9319:9;9315:22;9294:53;:::i;:::-;9284:63;;9240:117;9035:329;;;;:::o;9370:142::-;9473:32;9499:5;9473:32;:::i;:::-;9468:3;9461:45;9370:142;;:::o;9518:118::-;9605:24;9623:5;9605:24;:::i;:::-;9600:3;9593:37;9518:118;;:::o;9642:109::-;9723:21;9738:5;9723:21;:::i;:::-;9718:3;9711:34;9642:109;;:::o;9757:118::-;9844:24;9862:5;9844:24;:::i;:::-;9839:3;9832:37;9757:118;;:::o;9881:157::-;9986:45;10006:24;10024:5;10006:24;:::i;:::-;9986:45;:::i;:::-;9981:3;9974:58;9881:157;;:::o;10044:360::-;10130:3;10158:38;10190:5;10158:38;:::i;:::-;10212:70;10275:6;10270:3;10212:70;:::i;:::-;10205:77;;10291:52;10336:6;10331:3;10324:4;10317:5;10313:16;10291:52;:::i;:::-;10368:29;10390:6;10368:29;:::i;:::-;10363:3;10359:39;10352:46;;10134:270;10044:360;;;;:::o;10410:364::-;10498:3;10526:39;10559:5;10526:39;:::i;:::-;10581:71;10645:6;10640:3;10581:71;:::i;:::-;10574:78;;10661:52;10706:6;10701:3;10694:4;10687:5;10683:16;10661:52;:::i;:::-;10738:29;10760:6;10738:29;:::i;:::-;10733:3;10729:39;10722:46;;10502:272;10410:364;;;;:::o;10780:377::-;10886:3;10914:39;10947:5;10914:39;:::i;:::-;10969:89;11051:6;11046:3;10969:89;:::i;:::-;10962:96;;11067:52;11112:6;11107:3;11100:4;11093:5;11089:16;11067:52;:::i;:::-;11144:6;11139:3;11135:16;11128:23;;10890:267;10780:377;;;;:::o;11163:366::-;11305:3;11326:67;11390:2;11385:3;11326:67;:::i;:::-;11319:74;;11402:93;11491:3;11402:93;:::i;:::-;11520:2;11515:3;11511:12;11504:19;;11163:366;;;:::o;11535:::-;11677:3;11698:67;11762:2;11757:3;11698:67;:::i;:::-;11691:74;;11774:93;11863:3;11774:93;:::i;:::-;11892:2;11887:3;11883:12;11876:19;;11535:366;;;:::o;11907:::-;12049:3;12070:67;12134:2;12129:3;12070:67;:::i;:::-;12063:74;;12146:93;12235:3;12146:93;:::i;:::-;12264:2;12259:3;12255:12;12248:19;;11907:366;;;:::o;12279:::-;12421:3;12442:67;12506:2;12501:3;12442:67;:::i;:::-;12435:74;;12518:93;12607:3;12518:93;:::i;:::-;12636:2;12631:3;12627:12;12620:19;;12279:366;;;:::o;12651:::-;12793:3;12814:67;12878:2;12873:3;12814:67;:::i;:::-;12807:74;;12890:93;12979:3;12890:93;:::i;:::-;13008:2;13003:3;12999:12;12992:19;;12651:366;;;:::o;13023:400::-;13183:3;13204:84;13286:1;13281:3;13204:84;:::i;:::-;13197:91;;13297:93;13386:3;13297:93;:::i;:::-;13415:1;13410:3;13406:11;13399:18;;13023:400;;;:::o;13429:366::-;13571:3;13592:67;13656:2;13651:3;13592:67;:::i;:::-;13585:74;;13668:93;13757:3;13668:93;:::i;:::-;13786:2;13781:3;13777:12;13770:19;;13429:366;;;:::o;13801:::-;13943:3;13964:67;14028:2;14023:3;13964:67;:::i;:::-;13957:74;;14040:93;14129:3;14040:93;:::i;:::-;14158:2;14153:3;14149:12;14142:19;;13801:366;;;:::o;14173:::-;14315:3;14336:67;14400:2;14395:3;14336:67;:::i;:::-;14329:74;;14412:93;14501:3;14412:93;:::i;:::-;14530:2;14525:3;14521:12;14514:19;;14173:366;;;:::o;14545:::-;14687:3;14708:67;14772:2;14767:3;14708:67;:::i;:::-;14701:74;;14784:93;14873:3;14784:93;:::i;:::-;14902:2;14897:3;14893:12;14886:19;;14545:366;;;:::o;14917:::-;15059:3;15080:67;15144:2;15139:3;15080:67;:::i;:::-;15073:74;;15156:93;15245:3;15156:93;:::i;:::-;15274:2;15269:3;15265:12;15258:19;;14917:366;;;:::o;15289:::-;15431:3;15452:67;15516:2;15511:3;15452:67;:::i;:::-;15445:74;;15528:93;15617:3;15528:93;:::i;:::-;15646:2;15641:3;15637:12;15630:19;;15289:366;;;:::o;15661:::-;15803:3;15824:67;15888:2;15883:3;15824:67;:::i;:::-;15817:74;;15900:93;15989:3;15900:93;:::i;:::-;16018:2;16013:3;16009:12;16002:19;;15661:366;;;:::o;16033:::-;16175:3;16196:67;16260:2;16255:3;16196:67;:::i;:::-;16189:74;;16272:93;16361:3;16272:93;:::i;:::-;16390:2;16385:3;16381:12;16374:19;;16033:366;;;:::o;16405:::-;16547:3;16568:67;16632:2;16627:3;16568:67;:::i;:::-;16561:74;;16644:93;16733:3;16644:93;:::i;:::-;16762:2;16757:3;16753:12;16746:19;;16405:366;;;:::o;16777:::-;16919:3;16940:67;17004:2;16999:3;16940:67;:::i;:::-;16933:74;;17016:93;17105:3;17016:93;:::i;:::-;17134:2;17129:3;17125:12;17118:19;;16777:366;;;:::o;17149:::-;17291:3;17312:67;17376:2;17371:3;17312:67;:::i;:::-;17305:74;;17388:93;17477:3;17388:93;:::i;:::-;17506:2;17501:3;17497:12;17490:19;;17149:366;;;:::o;17521:::-;17663:3;17684:67;17748:2;17743:3;17684:67;:::i;:::-;17677:74;;17760:93;17849:3;17760:93;:::i;:::-;17878:2;17873:3;17869:12;17862:19;;17521:366;;;:::o;17893:::-;18035:3;18056:67;18120:2;18115:3;18056:67;:::i;:::-;18049:74;;18132:93;18221:3;18132:93;:::i;:::-;18250:2;18245:3;18241:12;18234:19;;17893:366;;;:::o;18265:::-;18407:3;18428:67;18492:2;18487:3;18428:67;:::i;:::-;18421:74;;18504:93;18593:3;18504:93;:::i;:::-;18622:2;18617:3;18613:12;18606:19;;18265:366;;;:::o;18637:::-;18779:3;18800:67;18864:2;18859:3;18800:67;:::i;:::-;18793:74;;18876:93;18965:3;18876:93;:::i;:::-;18994:2;18989:3;18985:12;18978:19;;18637:366;;;:::o;19009:::-;19151:3;19172:67;19236:2;19231:3;19172:67;:::i;:::-;19165:74;;19248:93;19337:3;19248:93;:::i;:::-;19366:2;19361:3;19357:12;19350:19;;19009:366;;;:::o;19381:::-;19523:3;19544:67;19608:2;19603:3;19544:67;:::i;:::-;19537:74;;19620:93;19709:3;19620:93;:::i;:::-;19738:2;19733:3;19729:12;19722:19;;19381:366;;;:::o;19753:::-;19895:3;19916:67;19980:2;19975:3;19916:67;:::i;:::-;19909:74;;19992:93;20081:3;19992:93;:::i;:::-;20110:2;20105:3;20101:12;20094:19;;19753:366;;;:::o;20125:::-;20267:3;20288:67;20352:2;20347:3;20288:67;:::i;:::-;20281:74;;20364:93;20453:3;20364:93;:::i;:::-;20482:2;20477:3;20473:12;20466:19;;20125:366;;;:::o;20497:::-;20639:3;20660:67;20724:2;20719:3;20660:67;:::i;:::-;20653:74;;20736:93;20825:3;20736:93;:::i;:::-;20854:2;20849:3;20845:12;20838:19;;20497:366;;;:::o;20869:::-;21011:3;21032:67;21096:2;21091:3;21032:67;:::i;:::-;21025:74;;21108:93;21197:3;21108:93;:::i;:::-;21226:2;21221:3;21217:12;21210:19;;20869:366;;;:::o;21241:::-;21383:3;21404:67;21468:2;21463:3;21404:67;:::i;:::-;21397:74;;21480:93;21569:3;21480:93;:::i;:::-;21598:2;21593:3;21589:12;21582:19;;21241:366;;;:::o;21613:::-;21755:3;21776:67;21840:2;21835:3;21776:67;:::i;:::-;21769:74;;21852:93;21941:3;21852:93;:::i;:::-;21970:2;21965:3;21961:12;21954:19;;21613:366;;;:::o;21985:::-;22127:3;22148:67;22212:2;22207:3;22148:67;:::i;:::-;22141:74;;22224:93;22313:3;22224:93;:::i;:::-;22342:2;22337:3;22333:12;22326:19;;21985:366;;;:::o;22357:::-;22499:3;22520:67;22584:2;22579:3;22520:67;:::i;:::-;22513:74;;22596:93;22685:3;22596:93;:::i;:::-;22714:2;22709:3;22705:12;22698:19;;22357:366;;;:::o;22729:118::-;22816:24;22834:5;22816:24;:::i;:::-;22811:3;22804:37;22729:118;;:::o;22853:112::-;22936:22;22952:5;22936:22;:::i;:::-;22931:3;22924:35;22853:112;;:::o;22971:435::-;23151:3;23173:95;23264:3;23255:6;23173:95;:::i;:::-;23166:102;;23285:95;23376:3;23367:6;23285:95;:::i;:::-;23278:102;;23397:3;23390:10;;22971:435;;;;;:::o;23412:663::-;23653:3;23675:148;23819:3;23675:148;:::i;:::-;23668:155;;23833:75;23904:3;23895:6;23833:75;:::i;:::-;23933:2;23928:3;23924:12;23917:19;;23946:75;24017:3;24008:6;23946:75;:::i;:::-;24046:2;24041:3;24037:12;24030:19;;24066:3;24059:10;;23412:663;;;;;:::o;24081:222::-;24174:4;24212:2;24201:9;24197:18;24189:26;;24225:71;24293:1;24282:9;24278:17;24269:6;24225:71;:::i;:::-;24081:222;;;;:::o;24309:254::-;24418:4;24456:2;24445:9;24441:18;24433:26;;24469:87;24553:1;24542:9;24538:17;24529:6;24469:87;:::i;:::-;24309:254;;;;:::o;24569:640::-;24764:4;24802:3;24791:9;24787:19;24779:27;;24816:71;24884:1;24873:9;24869:17;24860:6;24816:71;:::i;:::-;24897:72;24965:2;24954:9;24950:18;24941:6;24897:72;:::i;:::-;24979;25047:2;25036:9;25032:18;25023:6;24979:72;:::i;:::-;25098:9;25092:4;25088:20;25083:2;25072:9;25068:18;25061:48;25126:76;25197:4;25188:6;25126:76;:::i;:::-;25118:84;;24569:640;;;;;;;:::o;25215:210::-;25302:4;25340:2;25329:9;25325:18;25317:26;;25353:65;25415:1;25404:9;25400:17;25391:6;25353:65;:::i;:::-;25215:210;;;;:::o;25431:442::-;25580:4;25618:2;25607:9;25603:18;25595:26;;25631:71;25699:1;25688:9;25684:17;25675:6;25631:71;:::i;:::-;25712:72;25780:2;25769:9;25765:18;25756:6;25712:72;:::i;:::-;25794;25862:2;25851:9;25847:18;25838:6;25794:72;:::i;:::-;25431:442;;;;;;:::o;25879:664::-;26084:4;26122:3;26111:9;26107:19;26099:27;;26136:71;26204:1;26193:9;26189:17;26180:6;26136:71;:::i;:::-;26217:72;26285:2;26274:9;26270:18;26261:6;26217:72;:::i;:::-;26299;26367:2;26356:9;26352:18;26343:6;26299:72;:::i;:::-;26381;26449:2;26438:9;26434:18;26425:6;26381:72;:::i;:::-;26463:73;26531:3;26520:9;26516:19;26507:6;26463:73;:::i;:::-;25879:664;;;;;;;;:::o;26549:545::-;26722:4;26760:3;26749:9;26745:19;26737:27;;26774:71;26842:1;26831:9;26827:17;26818:6;26774:71;:::i;:::-;26855:68;26919:2;26908:9;26904:18;26895:6;26855:68;:::i;:::-;26933:72;27001:2;26990:9;26986:18;26977:6;26933:72;:::i;:::-;27015;27083:2;27072:9;27068:18;27059:6;27015:72;:::i;:::-;26549:545;;;;;;;:::o;27100:313::-;27213:4;27251:2;27240:9;27236:18;27228:26;;27300:9;27294:4;27290:20;27286:1;27275:9;27271:17;27264:47;27328:78;27401:4;27392:6;27328:78;:::i;:::-;27320:86;;27100:313;;;;:::o;27419:419::-;27585:4;27623:2;27612:9;27608:18;27600:26;;27672:9;27666:4;27662:20;27658:1;27647:9;27643:17;27636:47;27700:131;27826:4;27700:131;:::i;:::-;27692:139;;27419:419;;;:::o;27844:::-;28010:4;28048:2;28037:9;28033:18;28025:26;;28097:9;28091:4;28087:20;28083:1;28072:9;28068:17;28061:47;28125:131;28251:4;28125:131;:::i;:::-;28117:139;;27844:419;;;:::o;28269:::-;28435:4;28473:2;28462:9;28458:18;28450:26;;28522:9;28516:4;28512:20;28508:1;28497:9;28493:17;28486:47;28550:131;28676:4;28550:131;:::i;:::-;28542:139;;28269:419;;;:::o;28694:::-;28860:4;28898:2;28887:9;28883:18;28875:26;;28947:9;28941:4;28937:20;28933:1;28922:9;28918:17;28911:47;28975:131;29101:4;28975:131;:::i;:::-;28967:139;;28694:419;;;:::o;29119:::-;29285:4;29323:2;29312:9;29308:18;29300:26;;29372:9;29366:4;29362:20;29358:1;29347:9;29343:17;29336:47;29400:131;29526:4;29400:131;:::i;:::-;29392:139;;29119:419;;;:::o;29544:::-;29710:4;29748:2;29737:9;29733:18;29725:26;;29797:9;29791:4;29787:20;29783:1;29772:9;29768:17;29761:47;29825:131;29951:4;29825:131;:::i;:::-;29817:139;;29544:419;;;:::o;29969:::-;30135:4;30173:2;30162:9;30158:18;30150:26;;30222:9;30216:4;30212:20;30208:1;30197:9;30193:17;30186:47;30250:131;30376:4;30250:131;:::i;:::-;30242:139;;29969:419;;;:::o;30394:::-;30560:4;30598:2;30587:9;30583:18;30575:26;;30647:9;30641:4;30637:20;30633:1;30622:9;30618:17;30611:47;30675:131;30801:4;30675:131;:::i;:::-;30667:139;;30394:419;;;:::o;30819:::-;30985:4;31023:2;31012:9;31008:18;31000:26;;31072:9;31066:4;31062:20;31058:1;31047:9;31043:17;31036:47;31100:131;31226:4;31100:131;:::i;:::-;31092:139;;30819:419;;;:::o;31244:::-;31410:4;31448:2;31437:9;31433:18;31425:26;;31497:9;31491:4;31487:20;31483:1;31472:9;31468:17;31461:47;31525:131;31651:4;31525:131;:::i;:::-;31517:139;;31244:419;;;:::o;31669:::-;31835:4;31873:2;31862:9;31858:18;31850:26;;31922:9;31916:4;31912:20;31908:1;31897:9;31893:17;31886:47;31950:131;32076:4;31950:131;:::i;:::-;31942:139;;31669:419;;;:::o;32094:::-;32260:4;32298:2;32287:9;32283:18;32275:26;;32347:9;32341:4;32337:20;32333:1;32322:9;32318:17;32311:47;32375:131;32501:4;32375:131;:::i;:::-;32367:139;;32094:419;;;:::o;32519:::-;32685:4;32723:2;32712:9;32708:18;32700:26;;32772:9;32766:4;32762:20;32758:1;32747:9;32743:17;32736:47;32800:131;32926:4;32800:131;:::i;:::-;32792:139;;32519:419;;;:::o;32944:::-;33110:4;33148:2;33137:9;33133:18;33125:26;;33197:9;33191:4;33187:20;33183:1;33172:9;33168:17;33161:47;33225:131;33351:4;33225:131;:::i;:::-;33217:139;;32944:419;;;:::o;33369:::-;33535:4;33573:2;33562:9;33558:18;33550:26;;33622:9;33616:4;33612:20;33608:1;33597:9;33593:17;33586:47;33650:131;33776:4;33650:131;:::i;:::-;33642:139;;33369:419;;;:::o;33794:::-;33960:4;33998:2;33987:9;33983:18;33975:26;;34047:9;34041:4;34037:20;34033:1;34022:9;34018:17;34011:47;34075:131;34201:4;34075:131;:::i;:::-;34067:139;;33794:419;;;:::o;34219:::-;34385:4;34423:2;34412:9;34408:18;34400:26;;34472:9;34466:4;34462:20;34458:1;34447:9;34443:17;34436:47;34500:131;34626:4;34500:131;:::i;:::-;34492:139;;34219:419;;;:::o;34644:::-;34810:4;34848:2;34837:9;34833:18;34825:26;;34897:9;34891:4;34887:20;34883:1;34872:9;34868:17;34861:47;34925:131;35051:4;34925:131;:::i;:::-;34917:139;;34644:419;;;:::o;35069:::-;35235:4;35273:2;35262:9;35258:18;35250:26;;35322:9;35316:4;35312:20;35308:1;35297:9;35293:17;35286:47;35350:131;35476:4;35350:131;:::i;:::-;35342:139;;35069:419;;;:::o;35494:::-;35660:4;35698:2;35687:9;35683:18;35675:26;;35747:9;35741:4;35737:20;35733:1;35722:9;35718:17;35711:47;35775:131;35901:4;35775:131;:::i;:::-;35767:139;;35494:419;;;:::o;35919:::-;36085:4;36123:2;36112:9;36108:18;36100:26;;36172:9;36166:4;36162:20;36158:1;36147:9;36143:17;36136:47;36200:131;36326:4;36200:131;:::i;:::-;36192:139;;35919:419;;;:::o;36344:::-;36510:4;36548:2;36537:9;36533:18;36525:26;;36597:9;36591:4;36587:20;36583:1;36572:9;36568:17;36561:47;36625:131;36751:4;36625:131;:::i;:::-;36617:139;;36344:419;;;:::o;36769:::-;36935:4;36973:2;36962:9;36958:18;36950:26;;37022:9;37016:4;37012:20;37008:1;36997:9;36993:17;36986:47;37050:131;37176:4;37050:131;:::i;:::-;37042:139;;36769:419;;;:::o;37194:::-;37360:4;37398:2;37387:9;37383:18;37375:26;;37447:9;37441:4;37437:20;37433:1;37422:9;37418:17;37411:47;37475:131;37601:4;37475:131;:::i;:::-;37467:139;;37194:419;;;:::o;37619:::-;37785:4;37823:2;37812:9;37808:18;37800:26;;37872:9;37866:4;37862:20;37858:1;37847:9;37843:17;37836:47;37900:131;38026:4;37900:131;:::i;:::-;37892:139;;37619:419;;;:::o;38044:::-;38210:4;38248:2;38237:9;38233:18;38225:26;;38297:9;38291:4;38287:20;38283:1;38272:9;38268:17;38261:47;38325:131;38451:4;38325:131;:::i;:::-;38317:139;;38044:419;;;:::o;38469:::-;38635:4;38673:2;38662:9;38658:18;38650:26;;38722:9;38716:4;38712:20;38708:1;38697:9;38693:17;38686:47;38750:131;38876:4;38750:131;:::i;:::-;38742:139;;38469:419;;;:::o;38894:::-;39060:4;39098:2;39087:9;39083:18;39075:26;;39147:9;39141:4;39137:20;39133:1;39122:9;39118:17;39111:47;39175:131;39301:4;39175:131;:::i;:::-;39167:139;;38894:419;;;:::o;39319:::-;39485:4;39523:2;39512:9;39508:18;39500:26;;39572:9;39566:4;39562:20;39558:1;39547:9;39543:17;39536:47;39600:131;39726:4;39600:131;:::i;:::-;39592:139;;39319:419;;;:::o;39744:::-;39910:4;39948:2;39937:9;39933:18;39925:26;;39997:9;39991:4;39987:20;39983:1;39972:9;39968:17;39961:47;40025:131;40151:4;40025:131;:::i;:::-;40017:139;;39744:419;;;:::o;40169:222::-;40262:4;40300:2;40289:9;40285:18;40277:26;;40313:71;40381:1;40370:9;40366:17;40357:6;40313:71;:::i;:::-;40169:222;;;;:::o;40397:129::-;40431:6;40458:20;;:::i;:::-;40448:30;;40487:33;40515:4;40507:6;40487:33;:::i;:::-;40397:129;;;:::o;40532:75::-;40565:6;40598:2;40592:9;40582:19;;40532:75;:::o;40613:307::-;40674:4;40764:18;40756:6;40753:30;40750:56;;;40786:18;;:::i;:::-;40750:56;40824:29;40846:6;40824:29;:::i;:::-;40816:37;;40908:4;40902;40898:15;40890:23;;40613:307;;;:::o;40926:308::-;40988:4;41078:18;41070:6;41067:30;41064:56;;;41100:18;;:::i;:::-;41064:56;41138:29;41160:6;41138:29;:::i;:::-;41130:37;;41222:4;41216;41212:15;41204:23;;40926:308;;;:::o;41240:98::-;41291:6;41325:5;41319:12;41309:22;;41240:98;;;:::o;41344:99::-;41396:6;41430:5;41424:12;41414:22;;41344:99;;;:::o;41449:168::-;41532:11;41566:6;41561:3;41554:19;41606:4;41601:3;41597:14;41582:29;;41449:168;;;;:::o;41623:169::-;41707:11;41741:6;41736:3;41729:19;41781:4;41776:3;41772:14;41757:29;;41623:169;;;;:::o;41798:148::-;41900:11;41937:3;41922:18;;41798:148;;;;:::o;41952:305::-;41992:3;42011:20;42029:1;42011:20;:::i;:::-;42006:25;;42045:20;42063:1;42045:20;:::i;:::-;42040:25;;42199:1;42131:66;42127:74;42124:1;42121:81;42118:107;;;42205:18;;:::i;:::-;42118:107;42249:1;42246;42242:9;42235:16;;41952:305;;;;:::o;42263:185::-;42303:1;42320:20;42338:1;42320:20;:::i;:::-;42315:25;;42354:20;42372:1;42354:20;:::i;:::-;42349:25;;42393:1;42383:35;;42398:18;;:::i;:::-;42383:35;42440:1;42437;42433:9;42428:14;;42263:185;;;;:::o;42454:348::-;42494:7;42517:20;42535:1;42517:20;:::i;:::-;42512:25;;42551:20;42569:1;42551:20;:::i;:::-;42546:25;;42739:1;42671:66;42667:74;42664:1;42661:81;42656:1;42649:9;42642:17;42638:105;42635:131;;;42746:18;;:::i;:::-;42635:131;42794:1;42791;42787:9;42776:20;;42454:348;;;;:::o;42808:191::-;42848:4;42868:20;42886:1;42868:20;:::i;:::-;42863:25;;42902:20;42920:1;42902:20;:::i;:::-;42897:25;;42941:1;42938;42935:8;42932:34;;;42946:18;;:::i;:::-;42932:34;42991:1;42988;42984:9;42976:17;;42808:191;;;;:::o;43005:96::-;43042:7;43071:24;43089:5;43071:24;:::i;:::-;43060:35;;43005:96;;;:::o;43107:104::-;43152:7;43181:24;43199:5;43181:24;:::i;:::-;43170:35;;43107:104;;;:::o;43217:90::-;43251:7;43294:5;43287:13;43280:21;43269:32;;43217:90;;;:::o;43313:77::-;43350:7;43379:5;43368:16;;43313:77;;;:::o;43396:149::-;43432:7;43472:66;43465:5;43461:78;43450:89;;43396:149;;;:::o;43551:126::-;43588:7;43628:42;43621:5;43617:54;43606:65;;43551:126;;;:::o;43683:77::-;43720:7;43749:5;43738:16;;43683:77;;;:::o;43766:86::-;43801:7;43841:4;43834:5;43830:16;43819:27;;43766:86;;;:::o;43858:154::-;43942:6;43937:3;43932;43919:30;44004:1;43995:6;43990:3;43986:16;43979:27;43858:154;;;:::o;44018:307::-;44086:1;44096:113;44110:6;44107:1;44104:13;44096:113;;;44195:1;44190:3;44186:11;44180:18;44176:1;44171:3;44167:11;44160:39;44132:2;44129:1;44125:10;44120:15;;44096:113;;;44227:6;44224:1;44221:13;44218:101;;;44307:1;44298:6;44293:3;44289:16;44282:27;44218:101;44067:258;44018:307;;;:::o;44331:320::-;44375:6;44412:1;44406:4;44402:12;44392:22;;44459:1;44453:4;44449:12;44480:18;44470:81;;44536:4;44528:6;44524:17;44514:27;;44470:81;44598:2;44590:6;44587:14;44567:18;44564:38;44561:84;;;44617:18;;:::i;:::-;44561:84;44382:269;44331:320;;;:::o;44657:281::-;44740:27;44762:4;44740:27;:::i;:::-;44732:6;44728:40;44870:6;44858:10;44855:22;44834:18;44822:10;44819:34;44816:62;44813:88;;;44881:18;;:::i;:::-;44813:88;44921:10;44917:2;44910:22;44700:238;44657:281;;:::o;44944:233::-;44983:3;45006:24;45024:5;45006:24;:::i;:::-;44997:33;;45052:66;45045:5;45042:77;45039:103;;;45122:18;;:::i;:::-;45039:103;45169:1;45162:5;45158:13;45151:20;;44944:233;;;:::o;45183:79::-;45222:7;45251:5;45240:16;;45183:79;;;:::o;45268:176::-;45300:1;45317:20;45335:1;45317:20;:::i;:::-;45312:25;;45351:20;45369:1;45351:20;:::i;:::-;45346:25;;45390:1;45380:35;;45395:18;;:::i;:::-;45380:35;45436:1;45433;45429:9;45424:14;;45268:176;;;;:::o;45450:180::-;45498:77;45495:1;45488:88;45595:4;45592:1;45585:15;45619:4;45616:1;45609:15;45636:180;45684:77;45681:1;45674:88;45781:4;45778:1;45771:15;45805:4;45802:1;45795:15;45822:180;45870:77;45867:1;45860:88;45967:4;45964:1;45957:15;45991:4;45988:1;45981:15;46008:180;46056:77;46053:1;46046:88;46153:4;46150:1;46143:15;46177:4;46174:1;46167:15;46194:180;46242:77;46239:1;46232:88;46339:4;46336:1;46329:15;46363:4;46360:1;46353:15;46380:180;46428:77;46425:1;46418:88;46525:4;46522:1;46515:15;46549:4;46546:1;46539:15;46566:117;46675:1;46672;46665:12;46689:117;46798:1;46795;46788:12;46812:117;46921:1;46918;46911:12;46935:117;47044:1;47041;47034:12;47058:117;47167:1;47164;47157:12;47181:117;47290:1;47287;47280:12;47304:102;47345:6;47396:2;47392:7;47387:2;47380:5;47376:14;47372:28;47362:38;;47304:102;;;:::o;47412:174::-;47552:26;47548:1;47540:6;47536:14;47529:50;47412:174;:::o;47592:181::-;47732:33;47728:1;47720:6;47716:14;47709:57;47592:181;:::o;47779:225::-;47919:34;47915:1;47907:6;47903:14;47896:58;47988:8;47983:2;47975:6;47971:15;47964:33;47779:225;:::o;48010:178::-;48150:30;48146:1;48138:6;48134:14;48127:54;48010:178;:::o;48194:176::-;48334:28;48330:1;48322:6;48318:14;48311:52;48194:176;:::o;48376:214::-;48516:66;48512:1;48504:6;48500:14;48493:90;48376:214;:::o;48596:170::-;48736:22;48732:1;48724:6;48720:14;48713:46;48596:170;:::o;48772:178::-;48912:30;48908:1;48900:6;48896:14;48889:54;48772:178;:::o;48956:164::-;49096:16;49092:1;49084:6;49080:14;49073:40;48956:164;:::o;49126:182::-;49266:34;49262:1;49254:6;49250:14;49243:58;49126:182;:::o;49314:221::-;49454:34;49450:1;49442:6;49438:14;49431:58;49523:4;49518:2;49510:6;49506:15;49499:29;49314:221;:::o;49541:180::-;49681:32;49677:1;49669:6;49665:14;49658:56;49541:180;:::o;49727:173::-;49867:25;49863:1;49855:6;49851:14;49844:49;49727:173;:::o;49906:178::-;50046:30;50042:1;50034:6;50030:14;50023:54;49906:178;:::o;50090:175::-;50230:27;50226:1;50218:6;50214:14;50207:51;50090:175;:::o;50271:178::-;50411:30;50407:1;50399:6;50395:14;50388:54;50271:178;:::o;50455:221::-;50595:34;50591:1;50583:6;50579:14;50572:58;50664:4;50659:2;50651:6;50647:15;50640:29;50455:221;:::o;50682:171::-;50822:23;50818:1;50810:6;50806:14;50799:47;50682:171;:::o;50859:225::-;50999:34;50995:1;50987:6;50983:14;50976:58;51068:8;51063:2;51055:6;51051:15;51044:33;50859:225;:::o;51090:180::-;51230:32;51226:1;51218:6;51214:14;51207:56;51090:180;:::o;51276:222::-;51416:34;51412:1;51404:6;51400:14;51393:58;51485:5;51480:2;51472:6;51468:15;51461:30;51276:222;:::o;51504:172::-;51644:24;51640:1;51632:6;51628:14;51621:48;51504:172;:::o;51682:182::-;51822:34;51818:1;51810:6;51806:14;51799:58;51682:182;:::o;51870:220::-;52010:34;52006:1;51998:6;51994:14;51987:58;52079:3;52074:2;52066:6;52062:15;52055:28;51870:220;:::o;52096:177::-;52236:29;52232:1;52224:6;52220:14;52213:53;52096:177;:::o;52279:171::-;52419:23;52415:1;52407:6;52403:14;52396:47;52279:171;:::o;52456:176::-;52596:28;52592:1;52584:6;52580:14;52573:52;52456:176;:::o;52638:::-;52778:28;52774:1;52766:6;52762:14;52755:52;52638:176;:::o;52820:173::-;52960:25;52956:1;52948:6;52944:14;52937:49;52820:173;:::o;52999:181::-;53139:33;53135:1;53127:6;53123:14;53116:57;52999:181;:::o;53186:224::-;53326:34;53322:1;53314:6;53310:14;53303:58;53395:7;53390:2;53382:6;53378:15;53371:32;53186:224;:::o;53416:122::-;53489:24;53507:5;53489:24;:::i;:::-;53482:5;53479:35;53469:63;;53528:1;53525;53518:12;53469:63;53416:122;:::o;53544:116::-;53614:21;53629:5;53614:21;:::i;:::-;53607:5;53604:32;53594:60;;53650:1;53647;53640:12;53594:60;53544:116;:::o;53666:120::-;53738:23;53755:5;53738:23;:::i;:::-;53731:5;53728:34;53718:62;;53776:1;53773;53766:12;53718:62;53666:120;:::o;53792:122::-;53865:24;53883:5;53865:24;:::i;:::-;53858:5;53855:35;53845:63;;53904:1;53901;53894:12;53845:63;53792:122;:::o

Swarm Source

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