ETH Price: $2,410.06 (-0.97%)

Token

Puff Music Entertainment: Generative (PUFF)
 

Overview

Max Total Supply

0 PUFF

Holders

153

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 PUFF
0xb480bf6c8bd3e319826a7a7f1db9d2686d44518b
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:
PuffMusicEntertainmentGenerative

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// 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/math/SafeMath.sol


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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


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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// 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/token/ERC721/ERC721.sol


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

// File: contracts/puff_generative.sol


pragma solidity ^0.8.0;
/*                                                                                                                                      
PPPPPPPPPPPPPPPPP                        ffffffffffffffff    ffffffffffffffff       MMMMMMMM               MMMMMMMM                    
P::::::::::::::::P                      f::::::::::::::::f  f::::::::::::::::f      M:::::::M             M:::::::M                    
P::::::PPPPPP:::::P                    f::::::::::::::::::ff::::::::::::::::::f     M::::::::M           M::::::::M                    
PP:::::P     P:::::P                   f::::::fffffff:::::ff::::::fffffff:::::f     M:::::::::M         M:::::::::M                    
  P::::P     P:::::Puuuuuu    uuuuuu   f:::::f       fffffff:::::f       ffffff     M::::::::::M       M::::::::::M    eeeeeeeeeeee    
  P::::P     P:::::Pu::::u    u::::u   f:::::f             f:::::f                  M:::::::::::M     M:::::::::::M  ee::::::::::::ee  
  P::::PPPPPP:::::P u::::u    u::::u  f:::::::ffffff      f:::::::ffffff            M:::::::M::::M   M::::M:::::::M e::::::eeeee:::::ee
  P:::::::::::::PP  u::::u    u::::u  f::::::::::::f      f::::::::::::f            M::::::M M::::M M::::M M::::::Me::::::e     e:::::e
  P::::PPPPPPPPP    u::::u    u::::u  f::::::::::::f      f::::::::::::f            M::::::M  M::::M::::M  M::::::Me:::::::eeeee::::::e
  P::::P            u::::u    u::::u  f:::::::ffffff      f:::::::ffffff            M::::::M   M:::::::M   M::::::Me:::::::::::::::::e 
  P::::P            u::::u    u::::u   f:::::f             f:::::f                  M::::::M    M:::::M    M::::::Me::::::eeeeeeeeeee  
  P::::P            u:::::uuuu:::::u   f:::::f             f:::::f                  M::::::M     MMMMM     M::::::Me:::::::e           
PP::::::PP          u:::::::::::::::uuf:::::::f           f:::::::f                 M::::::M               M::::::Me::::::::e          
P::::::::P           u:::::::::::::::uf:::::::f           f:::::::f                 M::::::M               M::::::M e::::::::eeeeeeee  
P::::::::P            uu::::::::uu:::uf:::::::f           f:::::::f                 M::::::M               M::::::M  ee:::::::::::::e  
PPPPPPPPPP              uuuuuuuu  uuuufffffffff           fffffffff                 MMMMMMMM               MMMMMMMM    eeeeeeeeeeeeee  
*/










contract PuffMusicEntertainmentGenerative is ERC721, Ownable, Pausable, ReentrancyGuard {
  using SafeMath for uint256; 
  using ECDSA for bytes32;
  using Counters for Counters.Counter;
  using Strings for uint256;

  uint256 public constant MAX_PUFF_SUPPLY = 4400;
  uint256 public constant MAX_PUFF_PER_TRANSACTION = 5;
  uint256 public constant OG_MAX_PER_TRANSACTION = 3;
  uint256 public constant WL_MAX_PER_TRANSACTION = 2;
  uint256 public constant PRE_SALE_PRICE = 0.04 ether;
  uint256 public constant SALE_PRICE = 0.06 ether;
  uint256 public constant startingIndex = 2111;
  uint256 public constant saleDuration = 720 minutes;// 720
  uint256 public saleStartTime;

  string public PUFF_PROVENANCE = "2ae1ebcfca65affe3a3aae8b28fc1c010a79d4a745c3851a00f41688b6951b13";
  string public tokenBaseURI;
  string public unrevealedURI;
  string public constant baseExtension = ".json";

  bool public revealActive  = false;
  bool public saleActive = false;

  bytes32 public ogMerkleRoot = 0xed6f2a1266aa6a4ff9b9618b02fdbc36b2f0422d48c2296187053c197f8d0afb;
  bytes32 public wlMerkleRoot = 0xe065ceae49334decd10381bd0ea4217472cff2d19396f7a9852f2801c0b8117a;

  mapping(address=>bool) public wlClaimed;
  mapping(address=>bool) public ogClaimed;

  Counters.Counter public tokenSupply;

  constructor() ERC721("Puff Music Entertainment: Generative", "PUFF") {}

  function setTokenBaseURI(string memory _baseURI) external onlyOwner {
    tokenBaseURI = _baseURI;
  }

  function setUnrevealedURI(string memory _unrevealedUri) external onlyOwner {
    unrevealedURI = _unrevealedUri;
  }

  function tokenURI(uint256 _tokenId) override public view returns (string memory) {
    require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
    string memory sequenceId;

    if (!revealActive) {
      return unrevealedURI;
    }

    sequenceId = ( (_tokenId + startingIndex) % MAX_PUFF_SUPPLY ).toString();

    return string(abi.encodePacked(tokenBaseURI, sequenceId, baseExtension));
  }

  function setProvenanceHash(string memory provenanceHash) external onlyOwner {
    PUFF_PROVENANCE = provenanceHash;
  }

  /**************
   * Public Mint *
   **************/
  function mint(uint256 _quantity, bytes32[] calldata _merkleProof) external payable nonReentrant{
    require(saleActive, "Public Sale have not started.");
    require(_quantity > 0, "You must mint at least 1 puff.");
    bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
    bool isWL = MerkleProof.verify(_merkleProof,wlMerkleRoot,leaf);
    bool isOG = MerkleProof.verify(_merkleProof,ogMerkleRoot,leaf);
    if(isOG){
      if(!ogClaimed[msg.sender]){
        if(isPresaleExpired() == true){
          require(_quantity <= MAX_PUFF_PER_TRANSACTION, "Only 5 puff can be minted per transaction.");
        } 
        else{
          require(_quantity <= OG_MAX_PER_TRANSACTION, "Only 3 puff can be minted per transaction.");
        }
        require(msg.value >= getPrice() * _quantity, "The og payment amount is not correct.");
        require(tokenSupply.current().add(_quantity) <= MAX_PUFF_SUPPLY, "This purchase exceeds the max supply of generative puff.");
        ogClaimed[msg.sender] = true;
        mintPresale(_quantity);
      }
      else{
        MintPublic(_quantity);
      }
    }
    if(isWL){
      if(!wlClaimed[msg.sender]){
        if(isPresaleExpired() == true){
          require(_quantity <= MAX_PUFF_PER_TRANSACTION, "Only 5 puff can be minted per transaction.");
        }
        else{
          require(_quantity <= WL_MAX_PER_TRANSACTION, "Only 2 puff can be minted per transaction.");
        }
        require(msg.value >= getPrice() * _quantity, "The wl payment amount is not correct.");
        require(tokenSupply.current().add(_quantity) <= MAX_PUFF_SUPPLY, "This purchase exceeds the max supply of generative puff.");
        wlClaimed[msg.sender] = true;
        mintPresale(_quantity);
      }
      else{
        MintPublic(_quantity);
      }
    }
    if(!isOG && !isWL){
      MintPublic(_quantity);
    }
  }

  function mintPresale(uint256 _quantity) internal whenNotPaused {
    for (uint256 i = 0; i < _quantity; i++) {
      uint256 mintIndex = tokenSupply.current();

      if (mintIndex < MAX_PUFF_SUPPLY) {
        tokenSupply.increment();
        _safeMint(msg.sender, mintIndex);
      }
    }

    uint256 refund = msg.value - getPrice() * _quantity;
    if (refund > 0) {
        payable(msg.sender).transfer(refund);
    }
  }

  function MintPublic(uint256 _quantity) internal whenNotPaused {
    require(_quantity <= MAX_PUFF_PER_TRANSACTION, "Only 5 puff can be minted per transaction.");
    require(tokenSupply.current().add(_quantity) <= MAX_PUFF_SUPPLY, "This purchase exceeds the max supply of generative puff.");
    require(msg.value >= SALE_PRICE * _quantity, "The payment amount is not correct.");

    for (uint256 i = 0; i < _quantity; i++) {   
      uint256 mintIndex = tokenSupply.current();

      if (mintIndex < MAX_PUFF_SUPPLY) {
        tokenSupply.increment();
        _safeMint(msg.sender, mintIndex);
      }
    }

    uint256 refund = msg.value - SALE_PRICE * _quantity;
    if (refund > 0) {
        payable(msg.sender).transfer(refund);
    }
  }

 function isPresaleExpired()
    public
    view
    returns (bool)
  {
    if (block.timestamp - saleStartTime >= saleDuration) {
      return true;
    } else {
      return false;
    }
  }

 function getPrice()
    public
    view
    returns (uint256)
  {
    if (block.timestamp - saleStartTime >= saleDuration) {
      return SALE_PRICE;
    } else {
      return PRE_SALE_PRICE;
    }
  }

 /*****************
   * Reserved Mint *
   *****************/
  function reservedMint(uint256 _amount) external onlyOwner {
    require(tokenSupply.current().add(_amount) <= MAX_PUFF_SUPPLY, "This mint would exceed max supply of generative puff");

    for (uint256 i = 0; i < _amount; i++) {
      uint256 mintIndex = tokenSupply.current();

      if (mintIndex < MAX_PUFF_SUPPLY) {
        tokenSupply.increment();
        _safeMint(msg.sender, mintIndex);
      }
    }
  }

  function setReveal(bool _active) external onlyOwner {
    revealActive = _active;
  }

  function setSaleActive(bool _active) external onlyOwner {
    saleActive = _active;
    saleStartTime = block.timestamp;
  }

  function setOgMerkleRoot(bytes32 _root) external onlyOwner {
    ogMerkleRoot = _root;
  }

  function setWlMerkleRoot(bytes32 _root) external onlyOwner {
    wlMerkleRoot = _root;
  }

  function setSaleStartTime(uint256 _timestamp) external onlyOwner {
    saleStartTime = _timestamp;
  }

  /**************
   * Withdrawal *
   **************/
  function withdraw() external onlyOwner {
    uint256 balance = address(this).balance;
    payable(msg.sender).transfer(balance);
  }


  function isApprovedForAll(
      address _owner,
      address _operator
    ) 
      public 
      override 
      view 
      returns 
      (bool isOperator) 
    {
    // if OpenSea's ERC721 Proxy Address is detected, auto-return true
      if (_operator == address(0x58807baD0B376efc12F5AD86aAc70E78ed67deaE)) {
          return true;
      }
      
      // otherwise, use the default ERC721.isApprovedForAll()
      return ERC721.isApprovedForAll(_owner, _operator);
    }

    function pause() 
        external 
        onlyOwner 
    {
        _pause();
    }

    function unpause() 
        external 
        onlyOwner 
    {
        _unpause();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_PUFF_PER_TRANSACTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PUFF_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OG_MAX_PER_TRANSACTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRE_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUFF_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WL_MAX_PER_TRANSACTION","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":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"isOperator","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleExpired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ogClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ogMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"reservedMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setOgMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_active","type":"bool"}],"name":"setReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_active","type":"bool"}],"name":"setSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"setSaleStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setTokenBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_unrevealedUri","type":"string"}],"name":"setUnrevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setWlMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenSupply","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unrevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"wlClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"}]

60806040526040518060600160405280604081526020016200592160409139600990805190602001906200003592919062000263565b506000600c60006101000a81548160ff0219169083151502179055506000600c60016101000a81548160ff0219169083151502179055507fed6f2a1266aa6a4ff9b9618b02fdbc36b2f0422d48c2296187053c197f8d0afb60001b600d557fe065ceae49334decd10381bd0ea4217472cff2d19396f7a9852f2801c0b8117a60001b600e55348015620000c757600080fd5b50604051806060016040528060248152602001620058fd602491396040518060400160405280600481526020017f505546460000000000000000000000000000000000000000000000000000000081525081600090805190602001906200013092919062000263565b5080600190805190602001906200014992919062000263565b5050506200016c620001606200019560201b60201c565b6200019d60201b60201c565b6000600660146101000a81548160ff021916908315150217905550600160078190555062000377565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002719062000342565b90600052602060002090601f016020900481019282620002955760008555620002e1565b82601f10620002b057805160ff1916838001178555620002e1565b82800160010185558215620002e1579182015b82811115620002e0578251825591602001919060010190620002c3565b5b509050620002f09190620002f4565b5090565b5b808211156200030f576000816000905550600101620002f5565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200035b57607f821691505b60208210810362000371576200037062000313565b5b50919050565b61557680620003876000396000f3fe6080604052600436106102ff5760003560e01c8063715018a61161019057806398d5fdca116100dc578063c87b56dd11610095578063e985e9c51161006f578063e985e9c514610b19578063f2fde38b14610b56578063fe2c7fee14610b7f578063fe6b935614610ba8576102ff565b8063c87b56dd14610a88578063cb774d4714610ac5578063d8a7ab8914610af0576102ff565b806398d5fdca14610999578063a22cb465146109c4578063b88d4fde146109ed578063ba41b0c614610a16578063c2c37e7914610a32578063c668286214610a5d576102ff565b80638ac1e161116101495780638ef79e91116101235780638ef79e91146108ef5780638fd7bce21461091857806395d89b411461094357806396b914521461096e576102ff565b80638ac1e161146108725780638c74bf0e1461089b5780638da5cb5b146108c4576102ff565b8063715018a61461078857806373fc16ad1461079f5780637824407f146107dc5780637f205a7414610807578063841718a6146108325780638456cb591461085b576102ff565b80633ccfd60b1161024f57806354c06aee116102085780636352211e116101e25780636352211e146106b857806368428a1b146106f55780637035bf181461072057806370a082311461074b576102ff565b806354c06aee146106255780635a089b30146106505780635c975abb1461068d576102ff565b80633ccfd60b1461054f5780633f4ba83a1461056657806342842e0e1461057d578063474b6547146105a65780634e99b800146105d1578063525f8a5c146105fc576102ff565b8063193402bb116102bc578063267f3a8111610296578063267f3a81146104a55780632a3f300c146104d05780633711d9fb146104f957806339c5c1a714610524576102ff565b8063193402bb146104265780631cbaee2d1461045157806323b872dd1461047c576102ff565b806301ffc9a71461030457806306fdde0314610341578063081812fc1461036c578063095ea7b3146103a95780630a302530146103d257806310969523146103fd575b600080fd5b34801561031057600080fd5b5061032b6004803603810190610326919061398f565b610bd3565b60405161033891906139d7565b60405180910390f35b34801561034d57600080fd5b50610356610cb5565b6040516103639190613a8b565b60405180910390f35b34801561037857600080fd5b50610393600480360381019061038e9190613ae3565b610d47565b6040516103a09190613b51565b60405180910390f35b3480156103b557600080fd5b506103d060048036038101906103cb9190613b98565b610dcc565b005b3480156103de57600080fd5b506103e7610ee3565b6040516103f49190613bf1565b60405180910390f35b34801561040957600080fd5b50610424600480360381019061041f9190613d41565b610ee9565b005b34801561043257600080fd5b5061043b610f7f565b6040516104489190613d99565b60405180910390f35b34801561045d57600080fd5b50610466610f8a565b6040516104739190613d99565b60405180910390f35b34801561048857600080fd5b506104a3600480360381019061049e9190613db4565b610f90565b005b3480156104b157600080fd5b506104ba610ff0565b6040516104c79190613d99565b60405180910390f35b3480156104dc57600080fd5b506104f760048036038101906104f29190613e33565b610ff5565b005b34801561050557600080fd5b5061050e61108e565b60405161051b9190613d99565b60405180910390f35b34801561053057600080fd5b50610539611094565b60405161054691906139d7565b60405180910390f35b34801561055b57600080fd5b506105646110a7565b005b34801561057257600080fd5b5061057b611172565b005b34801561058957600080fd5b506105a4600480360381019061059f9190613db4565b6111f8565b005b3480156105b257600080fd5b506105bb611218565b6040516105c89190613d99565b60405180910390f35b3480156105dd57600080fd5b506105e661121e565b6040516105f39190613a8b565b60405180910390f35b34801561060857600080fd5b50610623600480360381019061061e9190613ae3565b6112ac565b005b34801561063157600080fd5b5061063a611332565b6040516106479190613bf1565b60405180910390f35b34801561065c57600080fd5b5061067760048036038101906106729190613e60565b611338565b60405161068491906139d7565b60405180910390f35b34801561069957600080fd5b506106a2611358565b6040516106af91906139d7565b60405180910390f35b3480156106c457600080fd5b506106df60048036038101906106da9190613ae3565b61136f565b6040516106ec9190613b51565b60405180910390f35b34801561070157600080fd5b5061070a611420565b60405161071791906139d7565b60405180910390f35b34801561072c57600080fd5b50610735611433565b6040516107429190613a8b565b60405180910390f35b34801561075757600080fd5b50610772600480360381019061076d9190613e60565b6114c1565b60405161077f9190613d99565b60405180910390f35b34801561079457600080fd5b5061079d611578565b005b3480156107ab57600080fd5b506107c660048036038101906107c19190613e60565b611600565b6040516107d391906139d7565b60405180910390f35b3480156107e857600080fd5b506107f1611620565b6040516107fe9190613d99565b60405180910390f35b34801561081357600080fd5b5061081c61162c565b6040516108299190613d99565b60405180910390f35b34801561083e57600080fd5b5061085960048036038101906108549190613e33565b611637565b005b34801561086757600080fd5b506108706116d7565b005b34801561087e57600080fd5b5061089960048036038101906108949190613eb9565b61175d565b005b3480156108a757600080fd5b506108c260048036038101906108bd9190613ae3565b6117e3565b005b3480156108d057600080fd5b506108d961190f565b6040516108e69190613b51565b60405180910390f35b3480156108fb57600080fd5b5061091660048036038101906109119190613d41565b611939565b005b34801561092457600080fd5b5061092d6119cf565b60405161093a9190613a8b565b60405180910390f35b34801561094f57600080fd5b50610958611a5d565b6040516109659190613a8b565b60405180910390f35b34801561097a57600080fd5b50610983611aef565b6040516109909190613d99565b60405180910390f35b3480156109a557600080fd5b506109ae611af4565b6040516109bb9190613d99565b60405180910390f35b3480156109d057600080fd5b506109eb60048036038101906109e69190613ee6565b611b29565b005b3480156109f957600080fd5b50610a146004803603810190610a0f9190613fc7565b611b3f565b005b610a306004803603810190610a2b91906140aa565b611ba1565b005b348015610a3e57600080fd5b50610a476121b6565b604051610a549190613d99565b60405180910390f35b348015610a6957600080fd5b50610a726121bb565b604051610a7f9190613a8b565b60405180910390f35b348015610a9457600080fd5b50610aaf6004803603810190610aaa9190613ae3565b6121f4565b604051610abc9190613a8b565b60405180910390f35b348015610ad157600080fd5b50610ada61236f565b604051610ae79190613d99565b60405180910390f35b348015610afc57600080fd5b50610b176004803603810190610b129190613eb9565b612375565b005b348015610b2557600080fd5b50610b406004803603810190610b3b919061410a565b6123fb565b604051610b4d91906139d7565b60405180910390f35b348015610b6257600080fd5b50610b7d6004803603810190610b789190613e60565b612460565b005b348015610b8b57600080fd5b50610ba66004803603810190610ba19190613d41565b612557565b005b348015610bb457600080fd5b50610bbd6125ed565b604051610bca91906139d7565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c9e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610cae5750610cad82612616565b5b9050919050565b606060008054610cc490614179565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf090614179565b8015610d3d5780601f10610d1257610100808354040283529160200191610d3d565b820191906000526020600020905b815481529060010190602001808311610d2057829003601f168201915b5050505050905090565b6000610d5282612680565b610d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d889061421c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610dd78261136f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3e906142ae565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e666126ec565b73ffffffffffffffffffffffffffffffffffffffff161480610e955750610e9481610e8f6126ec565b6123fb565b5b610ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecb90614340565b60405180910390fd5b610ede83836126f4565b505050565b600d5481565b610ef16126ec565b73ffffffffffffffffffffffffffffffffffffffff16610f0f61190f565b73ffffffffffffffffffffffffffffffffffffffff1614610f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5c906143ac565b60405180910390fd5b8060099080519060200190610f7b929190613880565b5050565b668e1bc9bf04000081565b60085481565b610fa1610f9b6126ec565b826127ad565b610fe0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd79061443e565b60405180910390fd5b610feb83838361288b565b505050565b600581565b610ffd6126ec565b73ffffffffffffffffffffffffffffffffffffffff1661101b61190f565b73ffffffffffffffffffffffffffffffffffffffff1614611071576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611068906143ac565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b61a8c081565b600c60009054906101000a900460ff1681565b6110af6126ec565b73ffffffffffffffffffffffffffffffffffffffff166110cd61190f565b73ffffffffffffffffffffffffffffffffffffffff1614611123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111a906143ac565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561116e573d6000803e3d6000fd5b5050565b61117a6126ec565b73ffffffffffffffffffffffffffffffffffffffff1661119861190f565b73ffffffffffffffffffffffffffffffffffffffff16146111ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e5906143ac565b60405180910390fd5b6111f6612ae6565b565b61121383838360405180602001604052806000815250611b3f565b505050565b61113081565b600a805461122b90614179565b80601f016020809104026020016040519081016040528092919081815260200182805461125790614179565b80156112a45780601f10611279576101008083540402835291602001916112a4565b820191906000526020600020905b81548152906001019060200180831161128757829003601f168201915b505050505081565b6112b46126ec565b73ffffffffffffffffffffffffffffffffffffffff166112d261190f565b73ffffffffffffffffffffffffffffffffffffffff1614611328576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131f906143ac565b60405180910390fd5b8060088190555050565b600e5481565b600f6020528060005260406000206000915054906101000a900460ff1681565b6000600660149054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140e906144d0565b60405180910390fd5b80915050919050565b600c60019054906101000a900460ff1681565b600b805461144090614179565b80601f016020809104026020016040519081016040528092919081815260200182805461146c90614179565b80156114b95780601f1061148e576101008083540402835291602001916114b9565b820191906000526020600020905b81548152906001019060200180831161149c57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152890614562565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115806126ec565b73ffffffffffffffffffffffffffffffffffffffff1661159e61190f565b73ffffffffffffffffffffffffffffffffffffffff16146115f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115eb906143ac565b60405180910390fd5b6115fe6000612b88565b565b60106020528060005260406000206000915054906101000a900460ff1681565b60118060000154905081565b66d529ae9e86000081565b61163f6126ec565b73ffffffffffffffffffffffffffffffffffffffff1661165d61190f565b73ffffffffffffffffffffffffffffffffffffffff16146116b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116aa906143ac565b60405180910390fd5b80600c60016101000a81548160ff0219169083151502179055504260088190555050565b6116df6126ec565b73ffffffffffffffffffffffffffffffffffffffff166116fd61190f565b73ffffffffffffffffffffffffffffffffffffffff1614611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174a906143ac565b60405180910390fd5b61175b612c4e565b565b6117656126ec565b73ffffffffffffffffffffffffffffffffffffffff1661178361190f565b73ffffffffffffffffffffffffffffffffffffffff16146117d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d0906143ac565b60405180910390fd5b80600e8190555050565b6117eb6126ec565b73ffffffffffffffffffffffffffffffffffffffff1661180961190f565b73ffffffffffffffffffffffffffffffffffffffff161461185f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611856906143ac565b60405180910390fd5b61113061187e826118706011612cf1565b612cff90919063ffffffff16565b11156118bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b6906145f4565b60405180910390fd5b60005b8181101561190b5760006118d66011612cf1565b90506111308110156118f7576118ec6011612d15565b6118f63382612d2b565b5b50808061190390614643565b9150506118c2565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119416126ec565b73ffffffffffffffffffffffffffffffffffffffff1661195f61190f565b73ffffffffffffffffffffffffffffffffffffffff16146119b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ac906143ac565b60405180910390fd5b80600a90805190602001906119cb929190613880565b5050565b600980546119dc90614179565b80601f0160208091040260200160405190810160405280929190818152602001828054611a0890614179565b8015611a555780601f10611a2a57610100808354040283529160200191611a55565b820191906000526020600020905b815481529060010190602001808311611a3857829003601f168201915b505050505081565b606060018054611a6c90614179565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9890614179565b8015611ae55780601f10611aba57610100808354040283529160200191611ae5565b820191906000526020600020905b815481529060010190602001808311611ac857829003601f168201915b5050505050905090565b600281565b600061a8c060085442611b07919061468b565b10611b1b5766d529ae9e8600009050611b26565b668e1bc9bf04000090505b90565b611b3b611b346126ec565b8383612d49565b5050565b611b50611b4a6126ec565b836127ad565b611b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b869061443e565b60405180910390fd5b611b9b84848484612eb5565b50505050565b600260075403611be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdd9061470b565b60405180910390fd5b6002600781905550600c60019054906101000a900460ff16611c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3490614777565b60405180910390fd5b60008311611c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c77906147e3565b60405180910390fd5b600033604051602001611c93919061484b565b6040516020818303038152906040528051906020012090506000611cfb848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5484612f11565b90506000611d4d858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d5485612f11565b90508015611f6d57601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611f625760011515611db26125ed565b151503611e02576005861115611dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df4906148d8565b60405180910390fd5b611e47565b6003861115611e46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3d9061496a565b60405180910390fd5b5b85611e50611af4565b611e5a919061498a565b341015611e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9390614a56565b60405180910390fd5b611130611ebb87611ead6011612cf1565b612cff90919063ffffffff16565b1115611efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef390614ae8565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611f5d86612f28565b611f6c565b611f6b86613034565b5b5b811561218b57600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166121805760011515611fd06125ed565b15150361202057600586111561201b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612012906148d8565b60405180910390fd5b612065565b6002861115612064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205b90614b7a565b60405180910390fd5b5b8561206e611af4565b612078919061498a565b3410156120ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b190614c0c565b60405180910390fd5b6111306120d9876120cb6011612cf1565b612cff90919063ffffffff16565b111561211a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211190614ae8565b60405180910390fd5b6001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061217b86612f28565b61218a565b61218986613034565b5b5b80158015612197575081155b156121a6576121a586613034565b5b5050506001600781905550505050565b600381565b6040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525081565b60606121ff82612680565b61223e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223590614c9e565b60405180910390fd5b6060600c60009054906101000a900460ff166122e757600b805461226190614179565b80601f016020809104026020016040519081016040528092919081815260200182805461228d90614179565b80156122da5780601f106122af576101008083540402835291602001916122da565b820191906000526020600020905b8154815290600101906020018083116122bd57829003601f168201915b505050505091505061236a565b61230a61113061083f856122fb9190614cbe565b6123059190614d43565b613239565b9050600a816040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060405160200161235793929190614e44565b6040516020818303038152906040529150505b919050565b61083f81565b61237d6126ec565b73ffffffffffffffffffffffffffffffffffffffff1661239b61190f565b73ffffffffffffffffffffffffffffffffffffffff16146123f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e8906143ac565b60405180910390fd5b80600d8190555050565b60007358807bad0b376efc12f5ad86aac70e78ed67deae73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361244d576001905061245a565b6124578383613399565b90505b92915050565b6124686126ec565b73ffffffffffffffffffffffffffffffffffffffff1661248661190f565b73ffffffffffffffffffffffffffffffffffffffff16146124dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d3906143ac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361254b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254290614ee7565b60405180910390fd5b61255481612b88565b50565b61255f6126ec565b73ffffffffffffffffffffffffffffffffffffffff1661257d61190f565b73ffffffffffffffffffffffffffffffffffffffff16146125d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ca906143ac565b60405180910390fd5b80600b90805190602001906125e9929190613880565b5050565b600061a8c060085442612600919061468b565b1061260e5760019050612613565b600090505b90565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127678361136f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006127b882612680565b6127f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ee90614f79565b60405180910390fd5b60006128028361136f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061287157508373ffffffffffffffffffffffffffffffffffffffff1661285984610d47565b73ffffffffffffffffffffffffffffffffffffffff16145b80612882575061288181856123fb565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128ab8261136f565b73ffffffffffffffffffffffffffffffffffffffff1614612901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f89061500b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612970576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129679061509d565b60405180910390fd5b61297b83838361342d565b6129866000826126f4565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129d6919061468b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a2d9190614cbe565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612aee611358565b612b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2490615109565b60405180910390fd5b6000600660146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612b716126ec565b604051612b7e9190613b51565b60405180910390a1565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c56611358565b15612c96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8d90615175565b60405180910390fd5b6001600660146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612cda6126ec565b604051612ce79190613b51565b60405180910390a1565b600081600001549050919050565b60008183612d0d9190614cbe565b905092915050565b6001816000016000828254019250508190555050565b612d45828260405180602001604052806000815250613432565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dae906151e1565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ea891906139d7565b60405180910390a3505050565b612ec084848461288b565b612ecc8484848461348d565b612f0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0290615273565b60405180910390fd5b50505050565b600082612f1e8584613614565b1490509392505050565b612f30611358565b15612f70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6790615175565b60405180910390fd5b60005b81811015612fbc576000612f876011612cf1565b9050611130811015612fa857612f9d6011612d15565b612fa73382612d2b565b5b508080612fb490614643565b915050612f73565b50600081612fc8611af4565b612fd2919061498a565b34612fdd919061468b565b90506000811115613030573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561302e573d6000803e3d6000fd5b505b5050565b61303c611358565b1561307c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307390615175565b60405180910390fd5b60058111156130c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b7906148d8565b60405180910390fd5b6111306130df826130d16011612cf1565b612cff90919063ffffffff16565b1115613120576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311790614ae8565b60405180910390fd5b8066d529ae9e860000613133919061498a565b341015613175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316c90615305565b60405180910390fd5b60005b818110156131c157600061318c6011612cf1565b90506111308110156131ad576131a26011612d15565b6131ac3382612d2b565b5b5080806131b990614643565b915050613178565b5060008166d529ae9e8600006131d7919061498a565b346131e2919061468b565b90506000811115613235573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015613233573d6000803e3d6000fd5b505b5050565b606060008203613280576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613394565b600082905060005b600082146132b257808061329b90614643565b915050600a826132ab9190615325565b9150613288565b60008167ffffffffffffffff8111156132ce576132cd613c16565b5b6040519080825280601f01601f1916602001820160405280156133005781602001600182028036833780820191505090505b5090505b6000851461338d57600182613319919061468b565b9150600a856133289190614d43565b60306133349190614cbe565b60f81b81838151811061334a57613349615356565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133869190615325565b9450613304565b8093505050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b505050565b61343c8383613689565b613449600084848461348d565b613488576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161347f90615273565b60405180910390fd5b505050565b60006134ae8473ffffffffffffffffffffffffffffffffffffffff16613856565b15613607578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026134d76126ec565b8786866040518563ffffffff1660e01b81526004016134f994939291906153da565b6020604051808303816000875af192505050801561353557506040513d601f19601f82011682018060405250810190613532919061543b565b60015b6135b7573d8060008114613565576040519150601f19603f3d011682016040523d82523d6000602084013e61356a565b606091505b5060008151036135af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135a690615273565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061360c565b600190505b949350505050565b60008082905060005b845181101561367e57600085828151811061363b5761363a615356565b5b6020026020010151905080831161365d576136568382613869565b925061366a565b6136678184613869565b92505b50808061367690614643565b91505061361d565b508091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036136f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ef906154b4565b60405180910390fd5b61370181612680565b15613741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161373890615520565b60405180910390fd5b61374d6000838361342d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461379d9190614cbe565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b600082600052816020526040600020905092915050565b82805461388c90614179565b90600052602060002090601f0160209004810192826138ae57600085556138f5565b82601f106138c757805160ff19168380011785556138f5565b828001600101855582156138f5579182015b828111156138f45782518255916020019190600101906138d9565b5b5090506139029190613906565b5090565b5b8082111561391f576000816000905550600101613907565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61396c81613937565b811461397757600080fd5b50565b60008135905061398981613963565b92915050565b6000602082840312156139a5576139a461392d565b5b60006139b38482850161397a565b91505092915050565b60008115159050919050565b6139d1816139bc565b82525050565b60006020820190506139ec60008301846139c8565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613a2c578082015181840152602081019050613a11565b83811115613a3b576000848401525b50505050565b6000601f19601f8301169050919050565b6000613a5d826139f2565b613a6781856139fd565b9350613a77818560208601613a0e565b613a8081613a41565b840191505092915050565b60006020820190508181036000830152613aa58184613a52565b905092915050565b6000819050919050565b613ac081613aad565b8114613acb57600080fd5b50565b600081359050613add81613ab7565b92915050565b600060208284031215613af957613af861392d565b5b6000613b0784828501613ace565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613b3b82613b10565b9050919050565b613b4b81613b30565b82525050565b6000602082019050613b666000830184613b42565b92915050565b613b7581613b30565b8114613b8057600080fd5b50565b600081359050613b9281613b6c565b92915050565b60008060408385031215613baf57613bae61392d565b5b6000613bbd85828601613b83565b9250506020613bce85828601613ace565b9150509250929050565b6000819050919050565b613beb81613bd8565b82525050565b6000602082019050613c066000830184613be2565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613c4e82613a41565b810181811067ffffffffffffffff82111715613c6d57613c6c613c16565b5b80604052505050565b6000613c80613923565b9050613c8c8282613c45565b919050565b600067ffffffffffffffff821115613cac57613cab613c16565b5b613cb582613a41565b9050602081019050919050565b82818337600083830152505050565b6000613ce4613cdf84613c91565b613c76565b905082815260208101848484011115613d0057613cff613c11565b5b613d0b848285613cc2565b509392505050565b600082601f830112613d2857613d27613c0c565b5b8135613d38848260208601613cd1565b91505092915050565b600060208284031215613d5757613d5661392d565b5b600082013567ffffffffffffffff811115613d7557613d74613932565b5b613d8184828501613d13565b91505092915050565b613d9381613aad565b82525050565b6000602082019050613dae6000830184613d8a565b92915050565b600080600060608486031215613dcd57613dcc61392d565b5b6000613ddb86828701613b83565b9350506020613dec86828701613b83565b9250506040613dfd86828701613ace565b9150509250925092565b613e10816139bc565b8114613e1b57600080fd5b50565b600081359050613e2d81613e07565b92915050565b600060208284031215613e4957613e4861392d565b5b6000613e5784828501613e1e565b91505092915050565b600060208284031215613e7657613e7561392d565b5b6000613e8484828501613b83565b91505092915050565b613e9681613bd8565b8114613ea157600080fd5b50565b600081359050613eb381613e8d565b92915050565b600060208284031215613ecf57613ece61392d565b5b6000613edd84828501613ea4565b91505092915050565b60008060408385031215613efd57613efc61392d565b5b6000613f0b85828601613b83565b9250506020613f1c85828601613e1e565b9150509250929050565b600067ffffffffffffffff821115613f4157613f40613c16565b5b613f4a82613a41565b9050602081019050919050565b6000613f6a613f6584613f26565b613c76565b905082815260208101848484011115613f8657613f85613c11565b5b613f91848285613cc2565b509392505050565b600082601f830112613fae57613fad613c0c565b5b8135613fbe848260208601613f57565b91505092915050565b60008060008060808587031215613fe157613fe061392d565b5b6000613fef87828801613b83565b945050602061400087828801613b83565b935050604061401187828801613ace565b925050606085013567ffffffffffffffff81111561403257614031613932565b5b61403e87828801613f99565b91505092959194509250565b600080fd5b600080fd5b60008083601f84011261406a57614069613c0c565b5b8235905067ffffffffffffffff8111156140875761408661404a565b5b6020830191508360208202830111156140a3576140a261404f565b5b9250929050565b6000806000604084860312156140c3576140c261392d565b5b60006140d186828701613ace565b935050602084013567ffffffffffffffff8111156140f2576140f1613932565b5b6140fe86828701614054565b92509250509250925092565b600080604083850312156141215761412061392d565b5b600061412f85828601613b83565b925050602061414085828601613b83565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061419157607f821691505b6020821081036141a4576141a361414a565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614206602c836139fd565b9150614211826141aa565b604082019050919050565b60006020820190508181036000830152614235816141f9565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006142986021836139fd565b91506142a38261423c565b604082019050919050565b600060208201905081810360008301526142c78161428b565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061432a6038836139fd565b9150614335826142ce565b604082019050919050565b600060208201905081810360008301526143598161431d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006143966020836139fd565b91506143a182614360565b602082019050919050565b600060208201905081810360008301526143c581614389565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006144286031836139fd565b9150614433826143cc565b604082019050919050565b600060208201905081810360008301526144578161441b565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006144ba6029836139fd565b91506144c58261445e565b604082019050919050565b600060208201905081810360008301526144e9816144ad565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061454c602a836139fd565b9150614557826144f0565b604082019050919050565b6000602082019050818103600083015261457b8161453f565b9050919050565b7f54686973206d696e7420776f756c6420657863656564206d617820737570706c60008201527f79206f662067656e657261746976652070756666000000000000000000000000602082015250565b60006145de6034836139fd565b91506145e982614582565b604082019050919050565b6000602082019050818103600083015261460d816145d1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061464e82613aad565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036146805761467f614614565b5b600182019050919050565b600061469682613aad565b91506146a183613aad565b9250828210156146b4576146b3614614565b5b828203905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006146f5601f836139fd565b9150614700826146bf565b602082019050919050565b60006020820190508181036000830152614724816146e8565b9050919050565b7f5075626c69632053616c652068617665206e6f7420737461727465642e000000600082015250565b6000614761601d836139fd565b915061476c8261472b565b602082019050919050565b6000602082019050818103600083015261479081614754565b9050919050565b7f596f75206d757374206d696e74206174206c65617374203120707566662e0000600082015250565b60006147cd601e836139fd565b91506147d882614797565b602082019050919050565b600060208201905081810360008301526147fc816147c0565b9050919050565b60008160601b9050919050565b600061481b82614803565b9050919050565b600061482d82614810565b9050919050565b61484561484082613b30565b614822565b82525050565b60006148578284614834565b60148201915081905092915050565b7f4f6e6c79203520707566662063616e206265206d696e7465642070657220747260008201527f616e73616374696f6e2e00000000000000000000000000000000000000000000602082015250565b60006148c2602a836139fd565b91506148cd82614866565b604082019050919050565b600060208201905081810360008301526148f1816148b5565b9050919050565b7f4f6e6c79203320707566662063616e206265206d696e7465642070657220747260008201527f616e73616374696f6e2e00000000000000000000000000000000000000000000602082015250565b6000614954602a836139fd565b915061495f826148f8565b604082019050919050565b6000602082019050818103600083015261498381614947565b9050919050565b600061499582613aad565b91506149a083613aad565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156149d9576149d8614614565b5b828202905092915050565b7f546865206f67207061796d656e7420616d6f756e74206973206e6f7420636f7260008201527f726563742e000000000000000000000000000000000000000000000000000000602082015250565b6000614a406025836139fd565b9150614a4b826149e4565b604082019050919050565b60006020820190508181036000830152614a6f81614a33565b9050919050565b7f54686973207075726368617365206578636565647320746865206d617820737560008201527f70706c79206f662067656e6572617469766520707566662e0000000000000000602082015250565b6000614ad26038836139fd565b9150614add82614a76565b604082019050919050565b60006020820190508181036000830152614b0181614ac5565b9050919050565b7f4f6e6c79203220707566662063616e206265206d696e7465642070657220747260008201527f616e73616374696f6e2e00000000000000000000000000000000000000000000602082015250565b6000614b64602a836139fd565b9150614b6f82614b08565b604082019050919050565b60006020820190508181036000830152614b9381614b57565b9050919050565b7f54686520776c207061796d656e7420616d6f756e74206973206e6f7420636f7260008201527f726563742e000000000000000000000000000000000000000000000000000000602082015250565b6000614bf66025836139fd565b9150614c0182614b9a565b604082019050919050565b60006020820190508181036000830152614c2581614be9565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614c88602f836139fd565b9150614c9382614c2c565b604082019050919050565b60006020820190508181036000830152614cb781614c7b565b9050919050565b6000614cc982613aad565b9150614cd483613aad565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d0957614d08614614565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614d4e82613aad565b9150614d5983613aad565b925082614d6957614d68614d14565b5b828206905092915050565b600081905092915050565b60008190508160005260206000209050919050565b60008154614da181614179565b614dab8186614d74565b94506001821660008114614dc65760018114614dd757614e0a565b60ff19831686528186019350614e0a565b614de085614d7f565b60005b83811015614e0257815481890152600182019150602081019050614de3565b838801955050505b50505092915050565b6000614e1e826139f2565b614e288185614d74565b9350614e38818560208601613a0e565b80840191505092915050565b6000614e508286614d94565b9150614e5c8285614e13565b9150614e688284614e13565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614ed16026836139fd565b9150614edc82614e75565b604082019050919050565b60006020820190508181036000830152614f0081614ec4565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614f63602c836139fd565b9150614f6e82614f07565b604082019050919050565b60006020820190508181036000830152614f9281614f56565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614ff56029836139fd565b915061500082614f99565b604082019050919050565b6000602082019050818103600083015261502481614fe8565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006150876024836139fd565b91506150928261502b565b604082019050919050565b600060208201905081810360008301526150b68161507a565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006150f36014836139fd565b91506150fe826150bd565b602082019050919050565b60006020820190508181036000830152615122816150e6565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b600061515f6010836139fd565b915061516a82615129565b602082019050919050565b6000602082019050818103600083015261518e81615152565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006151cb6019836139fd565b91506151d682615195565b602082019050919050565b600060208201905081810360008301526151fa816151be565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061525d6032836139fd565b915061526882615201565b604082019050919050565b6000602082019050818103600083015261528c81615250565b9050919050565b7f546865207061796d656e7420616d6f756e74206973206e6f7420636f7272656360008201527f742e000000000000000000000000000000000000000000000000000000000000602082015250565b60006152ef6022836139fd565b91506152fa82615293565b604082019050919050565b6000602082019050818103600083015261531e816152e2565b9050919050565b600061533082613aad565b915061533b83613aad565b92508261534b5761534a614d14565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006153ac82615385565b6153b68185615390565b93506153c6818560208601613a0e565b6153cf81613a41565b840191505092915050565b60006080820190506153ef6000830187613b42565b6153fc6020830186613b42565b6154096040830185613d8a565b818103606083015261541b81846153a1565b905095945050505050565b60008151905061543581613963565b92915050565b6000602082840312156154515761545061392d565b5b600061545f84828501615426565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061549e6020836139fd565b91506154a982615468565b602082019050919050565b600060208201905081810360008301526154cd81615491565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061550a601c836139fd565b9150615515826154d4565b602082019050919050565b60006020820190508181036000830152615539816154fd565b905091905056fea264697066735822122062c5d0ae2a8890ba7982e8ffa01ea9eab732e0d0874cc45118f11afbaec169d864736f6c634300080d003350756666204d7573696320456e7465727461696e6d656e743a2047656e6572617469766532616531656263666361363561666665336133616165386232386663316330313061373964346137343563333835316130306634313638386236393531623133

Deployed Bytecode

0x6080604052600436106102ff5760003560e01c8063715018a61161019057806398d5fdca116100dc578063c87b56dd11610095578063e985e9c51161006f578063e985e9c514610b19578063f2fde38b14610b56578063fe2c7fee14610b7f578063fe6b935614610ba8576102ff565b8063c87b56dd14610a88578063cb774d4714610ac5578063d8a7ab8914610af0576102ff565b806398d5fdca14610999578063a22cb465146109c4578063b88d4fde146109ed578063ba41b0c614610a16578063c2c37e7914610a32578063c668286214610a5d576102ff565b80638ac1e161116101495780638ef79e91116101235780638ef79e91146108ef5780638fd7bce21461091857806395d89b411461094357806396b914521461096e576102ff565b80638ac1e161146108725780638c74bf0e1461089b5780638da5cb5b146108c4576102ff565b8063715018a61461078857806373fc16ad1461079f5780637824407f146107dc5780637f205a7414610807578063841718a6146108325780638456cb591461085b576102ff565b80633ccfd60b1161024f57806354c06aee116102085780636352211e116101e25780636352211e146106b857806368428a1b146106f55780637035bf181461072057806370a082311461074b576102ff565b806354c06aee146106255780635a089b30146106505780635c975abb1461068d576102ff565b80633ccfd60b1461054f5780633f4ba83a1461056657806342842e0e1461057d578063474b6547146105a65780634e99b800146105d1578063525f8a5c146105fc576102ff565b8063193402bb116102bc578063267f3a8111610296578063267f3a81146104a55780632a3f300c146104d05780633711d9fb146104f957806339c5c1a714610524576102ff565b8063193402bb146104265780631cbaee2d1461045157806323b872dd1461047c576102ff565b806301ffc9a71461030457806306fdde0314610341578063081812fc1461036c578063095ea7b3146103a95780630a302530146103d257806310969523146103fd575b600080fd5b34801561031057600080fd5b5061032b6004803603810190610326919061398f565b610bd3565b60405161033891906139d7565b60405180910390f35b34801561034d57600080fd5b50610356610cb5565b6040516103639190613a8b565b60405180910390f35b34801561037857600080fd5b50610393600480360381019061038e9190613ae3565b610d47565b6040516103a09190613b51565b60405180910390f35b3480156103b557600080fd5b506103d060048036038101906103cb9190613b98565b610dcc565b005b3480156103de57600080fd5b506103e7610ee3565b6040516103f49190613bf1565b60405180910390f35b34801561040957600080fd5b50610424600480360381019061041f9190613d41565b610ee9565b005b34801561043257600080fd5b5061043b610f7f565b6040516104489190613d99565b60405180910390f35b34801561045d57600080fd5b50610466610f8a565b6040516104739190613d99565b60405180910390f35b34801561048857600080fd5b506104a3600480360381019061049e9190613db4565b610f90565b005b3480156104b157600080fd5b506104ba610ff0565b6040516104c79190613d99565b60405180910390f35b3480156104dc57600080fd5b506104f760048036038101906104f29190613e33565b610ff5565b005b34801561050557600080fd5b5061050e61108e565b60405161051b9190613d99565b60405180910390f35b34801561053057600080fd5b50610539611094565b60405161054691906139d7565b60405180910390f35b34801561055b57600080fd5b506105646110a7565b005b34801561057257600080fd5b5061057b611172565b005b34801561058957600080fd5b506105a4600480360381019061059f9190613db4565b6111f8565b005b3480156105b257600080fd5b506105bb611218565b6040516105c89190613d99565b60405180910390f35b3480156105dd57600080fd5b506105e661121e565b6040516105f39190613a8b565b60405180910390f35b34801561060857600080fd5b50610623600480360381019061061e9190613ae3565b6112ac565b005b34801561063157600080fd5b5061063a611332565b6040516106479190613bf1565b60405180910390f35b34801561065c57600080fd5b5061067760048036038101906106729190613e60565b611338565b60405161068491906139d7565b60405180910390f35b34801561069957600080fd5b506106a2611358565b6040516106af91906139d7565b60405180910390f35b3480156106c457600080fd5b506106df60048036038101906106da9190613ae3565b61136f565b6040516106ec9190613b51565b60405180910390f35b34801561070157600080fd5b5061070a611420565b60405161071791906139d7565b60405180910390f35b34801561072c57600080fd5b50610735611433565b6040516107429190613a8b565b60405180910390f35b34801561075757600080fd5b50610772600480360381019061076d9190613e60565b6114c1565b60405161077f9190613d99565b60405180910390f35b34801561079457600080fd5b5061079d611578565b005b3480156107ab57600080fd5b506107c660048036038101906107c19190613e60565b611600565b6040516107d391906139d7565b60405180910390f35b3480156107e857600080fd5b506107f1611620565b6040516107fe9190613d99565b60405180910390f35b34801561081357600080fd5b5061081c61162c565b6040516108299190613d99565b60405180910390f35b34801561083e57600080fd5b5061085960048036038101906108549190613e33565b611637565b005b34801561086757600080fd5b506108706116d7565b005b34801561087e57600080fd5b5061089960048036038101906108949190613eb9565b61175d565b005b3480156108a757600080fd5b506108c260048036038101906108bd9190613ae3565b6117e3565b005b3480156108d057600080fd5b506108d961190f565b6040516108e69190613b51565b60405180910390f35b3480156108fb57600080fd5b5061091660048036038101906109119190613d41565b611939565b005b34801561092457600080fd5b5061092d6119cf565b60405161093a9190613a8b565b60405180910390f35b34801561094f57600080fd5b50610958611a5d565b6040516109659190613a8b565b60405180910390f35b34801561097a57600080fd5b50610983611aef565b6040516109909190613d99565b60405180910390f35b3480156109a557600080fd5b506109ae611af4565b6040516109bb9190613d99565b60405180910390f35b3480156109d057600080fd5b506109eb60048036038101906109e69190613ee6565b611b29565b005b3480156109f957600080fd5b50610a146004803603810190610a0f9190613fc7565b611b3f565b005b610a306004803603810190610a2b91906140aa565b611ba1565b005b348015610a3e57600080fd5b50610a476121b6565b604051610a549190613d99565b60405180910390f35b348015610a6957600080fd5b50610a726121bb565b604051610a7f9190613a8b565b60405180910390f35b348015610a9457600080fd5b50610aaf6004803603810190610aaa9190613ae3565b6121f4565b604051610abc9190613a8b565b60405180910390f35b348015610ad157600080fd5b50610ada61236f565b604051610ae79190613d99565b60405180910390f35b348015610afc57600080fd5b50610b176004803603810190610b129190613eb9565b612375565b005b348015610b2557600080fd5b50610b406004803603810190610b3b919061410a565b6123fb565b604051610b4d91906139d7565b60405180910390f35b348015610b6257600080fd5b50610b7d6004803603810190610b789190613e60565b612460565b005b348015610b8b57600080fd5b50610ba66004803603810190610ba19190613d41565b612557565b005b348015610bb457600080fd5b50610bbd6125ed565b604051610bca91906139d7565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c9e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610cae5750610cad82612616565b5b9050919050565b606060008054610cc490614179565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf090614179565b8015610d3d5780601f10610d1257610100808354040283529160200191610d3d565b820191906000526020600020905b815481529060010190602001808311610d2057829003601f168201915b5050505050905090565b6000610d5282612680565b610d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d889061421c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610dd78261136f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3e906142ae565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e666126ec565b73ffffffffffffffffffffffffffffffffffffffff161480610e955750610e9481610e8f6126ec565b6123fb565b5b610ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecb90614340565b60405180910390fd5b610ede83836126f4565b505050565b600d5481565b610ef16126ec565b73ffffffffffffffffffffffffffffffffffffffff16610f0f61190f565b73ffffffffffffffffffffffffffffffffffffffff1614610f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5c906143ac565b60405180910390fd5b8060099080519060200190610f7b929190613880565b5050565b668e1bc9bf04000081565b60085481565b610fa1610f9b6126ec565b826127ad565b610fe0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd79061443e565b60405180910390fd5b610feb83838361288b565b505050565b600581565b610ffd6126ec565b73ffffffffffffffffffffffffffffffffffffffff1661101b61190f565b73ffffffffffffffffffffffffffffffffffffffff1614611071576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611068906143ac565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b61a8c081565b600c60009054906101000a900460ff1681565b6110af6126ec565b73ffffffffffffffffffffffffffffffffffffffff166110cd61190f565b73ffffffffffffffffffffffffffffffffffffffff1614611123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111a906143ac565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561116e573d6000803e3d6000fd5b5050565b61117a6126ec565b73ffffffffffffffffffffffffffffffffffffffff1661119861190f565b73ffffffffffffffffffffffffffffffffffffffff16146111ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e5906143ac565b60405180910390fd5b6111f6612ae6565b565b61121383838360405180602001604052806000815250611b3f565b505050565b61113081565b600a805461122b90614179565b80601f016020809104026020016040519081016040528092919081815260200182805461125790614179565b80156112a45780601f10611279576101008083540402835291602001916112a4565b820191906000526020600020905b81548152906001019060200180831161128757829003601f168201915b505050505081565b6112b46126ec565b73ffffffffffffffffffffffffffffffffffffffff166112d261190f565b73ffffffffffffffffffffffffffffffffffffffff1614611328576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131f906143ac565b60405180910390fd5b8060088190555050565b600e5481565b600f6020528060005260406000206000915054906101000a900460ff1681565b6000600660149054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140e906144d0565b60405180910390fd5b80915050919050565b600c60019054906101000a900460ff1681565b600b805461144090614179565b80601f016020809104026020016040519081016040528092919081815260200182805461146c90614179565b80156114b95780601f1061148e576101008083540402835291602001916114b9565b820191906000526020600020905b81548152906001019060200180831161149c57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152890614562565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115806126ec565b73ffffffffffffffffffffffffffffffffffffffff1661159e61190f565b73ffffffffffffffffffffffffffffffffffffffff16146115f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115eb906143ac565b60405180910390fd5b6115fe6000612b88565b565b60106020528060005260406000206000915054906101000a900460ff1681565b60118060000154905081565b66d529ae9e86000081565b61163f6126ec565b73ffffffffffffffffffffffffffffffffffffffff1661165d61190f565b73ffffffffffffffffffffffffffffffffffffffff16146116b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116aa906143ac565b60405180910390fd5b80600c60016101000a81548160ff0219169083151502179055504260088190555050565b6116df6126ec565b73ffffffffffffffffffffffffffffffffffffffff166116fd61190f565b73ffffffffffffffffffffffffffffffffffffffff1614611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174a906143ac565b60405180910390fd5b61175b612c4e565b565b6117656126ec565b73ffffffffffffffffffffffffffffffffffffffff1661178361190f565b73ffffffffffffffffffffffffffffffffffffffff16146117d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d0906143ac565b60405180910390fd5b80600e8190555050565b6117eb6126ec565b73ffffffffffffffffffffffffffffffffffffffff1661180961190f565b73ffffffffffffffffffffffffffffffffffffffff161461185f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611856906143ac565b60405180910390fd5b61113061187e826118706011612cf1565b612cff90919063ffffffff16565b11156118bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b6906145f4565b60405180910390fd5b60005b8181101561190b5760006118d66011612cf1565b90506111308110156118f7576118ec6011612d15565b6118f63382612d2b565b5b50808061190390614643565b9150506118c2565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119416126ec565b73ffffffffffffffffffffffffffffffffffffffff1661195f61190f565b73ffffffffffffffffffffffffffffffffffffffff16146119b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ac906143ac565b60405180910390fd5b80600a90805190602001906119cb929190613880565b5050565b600980546119dc90614179565b80601f0160208091040260200160405190810160405280929190818152602001828054611a0890614179565b8015611a555780601f10611a2a57610100808354040283529160200191611a55565b820191906000526020600020905b815481529060010190602001808311611a3857829003601f168201915b505050505081565b606060018054611a6c90614179565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9890614179565b8015611ae55780601f10611aba57610100808354040283529160200191611ae5565b820191906000526020600020905b815481529060010190602001808311611ac857829003601f168201915b5050505050905090565b600281565b600061a8c060085442611b07919061468b565b10611b1b5766d529ae9e8600009050611b26565b668e1bc9bf04000090505b90565b611b3b611b346126ec565b8383612d49565b5050565b611b50611b4a6126ec565b836127ad565b611b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b869061443e565b60405180910390fd5b611b9b84848484612eb5565b50505050565b600260075403611be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdd9061470b565b60405180910390fd5b6002600781905550600c60019054906101000a900460ff16611c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3490614777565b60405180910390fd5b60008311611c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c77906147e3565b60405180910390fd5b600033604051602001611c93919061484b565b6040516020818303038152906040528051906020012090506000611cfb848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5484612f11565b90506000611d4d858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d5485612f11565b90508015611f6d57601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611f625760011515611db26125ed565b151503611e02576005861115611dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df4906148d8565b60405180910390fd5b611e47565b6003861115611e46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3d9061496a565b60405180910390fd5b5b85611e50611af4565b611e5a919061498a565b341015611e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9390614a56565b60405180910390fd5b611130611ebb87611ead6011612cf1565b612cff90919063ffffffff16565b1115611efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef390614ae8565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611f5d86612f28565b611f6c565b611f6b86613034565b5b5b811561218b57600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166121805760011515611fd06125ed565b15150361202057600586111561201b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612012906148d8565b60405180910390fd5b612065565b6002861115612064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205b90614b7a565b60405180910390fd5b5b8561206e611af4565b612078919061498a565b3410156120ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b190614c0c565b60405180910390fd5b6111306120d9876120cb6011612cf1565b612cff90919063ffffffff16565b111561211a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211190614ae8565b60405180910390fd5b6001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061217b86612f28565b61218a565b61218986613034565b5b5b80158015612197575081155b156121a6576121a586613034565b5b5050506001600781905550505050565b600381565b6040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525081565b60606121ff82612680565b61223e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223590614c9e565b60405180910390fd5b6060600c60009054906101000a900460ff166122e757600b805461226190614179565b80601f016020809104026020016040519081016040528092919081815260200182805461228d90614179565b80156122da5780601f106122af576101008083540402835291602001916122da565b820191906000526020600020905b8154815290600101906020018083116122bd57829003601f168201915b505050505091505061236a565b61230a61113061083f856122fb9190614cbe565b6123059190614d43565b613239565b9050600a816040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060405160200161235793929190614e44565b6040516020818303038152906040529150505b919050565b61083f81565b61237d6126ec565b73ffffffffffffffffffffffffffffffffffffffff1661239b61190f565b73ffffffffffffffffffffffffffffffffffffffff16146123f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e8906143ac565b60405180910390fd5b80600d8190555050565b60007358807bad0b376efc12f5ad86aac70e78ed67deae73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361244d576001905061245a565b6124578383613399565b90505b92915050565b6124686126ec565b73ffffffffffffffffffffffffffffffffffffffff1661248661190f565b73ffffffffffffffffffffffffffffffffffffffff16146124dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d3906143ac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361254b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254290614ee7565b60405180910390fd5b61255481612b88565b50565b61255f6126ec565b73ffffffffffffffffffffffffffffffffffffffff1661257d61190f565b73ffffffffffffffffffffffffffffffffffffffff16146125d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ca906143ac565b60405180910390fd5b80600b90805190602001906125e9929190613880565b5050565b600061a8c060085442612600919061468b565b1061260e5760019050612613565b600090505b90565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127678361136f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006127b882612680565b6127f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ee90614f79565b60405180910390fd5b60006128028361136f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061287157508373ffffffffffffffffffffffffffffffffffffffff1661285984610d47565b73ffffffffffffffffffffffffffffffffffffffff16145b80612882575061288181856123fb565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128ab8261136f565b73ffffffffffffffffffffffffffffffffffffffff1614612901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f89061500b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612970576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129679061509d565b60405180910390fd5b61297b83838361342d565b6129866000826126f4565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129d6919061468b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a2d9190614cbe565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612aee611358565b612b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2490615109565b60405180910390fd5b6000600660146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612b716126ec565b604051612b7e9190613b51565b60405180910390a1565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c56611358565b15612c96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8d90615175565b60405180910390fd5b6001600660146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612cda6126ec565b604051612ce79190613b51565b60405180910390a1565b600081600001549050919050565b60008183612d0d9190614cbe565b905092915050565b6001816000016000828254019250508190555050565b612d45828260405180602001604052806000815250613432565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dae906151e1565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ea891906139d7565b60405180910390a3505050565b612ec084848461288b565b612ecc8484848461348d565b612f0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0290615273565b60405180910390fd5b50505050565b600082612f1e8584613614565b1490509392505050565b612f30611358565b15612f70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6790615175565b60405180910390fd5b60005b81811015612fbc576000612f876011612cf1565b9050611130811015612fa857612f9d6011612d15565b612fa73382612d2b565b5b508080612fb490614643565b915050612f73565b50600081612fc8611af4565b612fd2919061498a565b34612fdd919061468b565b90506000811115613030573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561302e573d6000803e3d6000fd5b505b5050565b61303c611358565b1561307c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307390615175565b60405180910390fd5b60058111156130c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b7906148d8565b60405180910390fd5b6111306130df826130d16011612cf1565b612cff90919063ffffffff16565b1115613120576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311790614ae8565b60405180910390fd5b8066d529ae9e860000613133919061498a565b341015613175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316c90615305565b60405180910390fd5b60005b818110156131c157600061318c6011612cf1565b90506111308110156131ad576131a26011612d15565b6131ac3382612d2b565b5b5080806131b990614643565b915050613178565b5060008166d529ae9e8600006131d7919061498a565b346131e2919061468b565b90506000811115613235573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015613233573d6000803e3d6000fd5b505b5050565b606060008203613280576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613394565b600082905060005b600082146132b257808061329b90614643565b915050600a826132ab9190615325565b9150613288565b60008167ffffffffffffffff8111156132ce576132cd613c16565b5b6040519080825280601f01601f1916602001820160405280156133005781602001600182028036833780820191505090505b5090505b6000851461338d57600182613319919061468b565b9150600a856133289190614d43565b60306133349190614cbe565b60f81b81838151811061334a57613349615356565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133869190615325565b9450613304565b8093505050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b505050565b61343c8383613689565b613449600084848461348d565b613488576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161347f90615273565b60405180910390fd5b505050565b60006134ae8473ffffffffffffffffffffffffffffffffffffffff16613856565b15613607578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026134d76126ec565b8786866040518563ffffffff1660e01b81526004016134f994939291906153da565b6020604051808303816000875af192505050801561353557506040513d601f19601f82011682018060405250810190613532919061543b565b60015b6135b7573d8060008114613565576040519150601f19603f3d011682016040523d82523d6000602084013e61356a565b606091505b5060008151036135af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135a690615273565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061360c565b600190505b949350505050565b60008082905060005b845181101561367e57600085828151811061363b5761363a615356565b5b6020026020010151905080831161365d576136568382613869565b925061366a565b6136678184613869565b92505b50808061367690614643565b91505061361d565b508091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036136f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ef906154b4565b60405180910390fd5b61370181612680565b15613741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161373890615520565b60405180910390fd5b61374d6000838361342d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461379d9190614cbe565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b600082600052816020526040600020905092915050565b82805461388c90614179565b90600052602060002090601f0160209004810192826138ae57600085556138f5565b82601f106138c757805160ff19168380011785556138f5565b828001600101855582156138f5579182015b828111156138f45782518255916020019190600101906138d9565b5b5090506139029190613906565b5090565b5b8082111561391f576000816000905550600101613907565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61396c81613937565b811461397757600080fd5b50565b60008135905061398981613963565b92915050565b6000602082840312156139a5576139a461392d565b5b60006139b38482850161397a565b91505092915050565b60008115159050919050565b6139d1816139bc565b82525050565b60006020820190506139ec60008301846139c8565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613a2c578082015181840152602081019050613a11565b83811115613a3b576000848401525b50505050565b6000601f19601f8301169050919050565b6000613a5d826139f2565b613a6781856139fd565b9350613a77818560208601613a0e565b613a8081613a41565b840191505092915050565b60006020820190508181036000830152613aa58184613a52565b905092915050565b6000819050919050565b613ac081613aad565b8114613acb57600080fd5b50565b600081359050613add81613ab7565b92915050565b600060208284031215613af957613af861392d565b5b6000613b0784828501613ace565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613b3b82613b10565b9050919050565b613b4b81613b30565b82525050565b6000602082019050613b666000830184613b42565b92915050565b613b7581613b30565b8114613b8057600080fd5b50565b600081359050613b9281613b6c565b92915050565b60008060408385031215613baf57613bae61392d565b5b6000613bbd85828601613b83565b9250506020613bce85828601613ace565b9150509250929050565b6000819050919050565b613beb81613bd8565b82525050565b6000602082019050613c066000830184613be2565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613c4e82613a41565b810181811067ffffffffffffffff82111715613c6d57613c6c613c16565b5b80604052505050565b6000613c80613923565b9050613c8c8282613c45565b919050565b600067ffffffffffffffff821115613cac57613cab613c16565b5b613cb582613a41565b9050602081019050919050565b82818337600083830152505050565b6000613ce4613cdf84613c91565b613c76565b905082815260208101848484011115613d0057613cff613c11565b5b613d0b848285613cc2565b509392505050565b600082601f830112613d2857613d27613c0c565b5b8135613d38848260208601613cd1565b91505092915050565b600060208284031215613d5757613d5661392d565b5b600082013567ffffffffffffffff811115613d7557613d74613932565b5b613d8184828501613d13565b91505092915050565b613d9381613aad565b82525050565b6000602082019050613dae6000830184613d8a565b92915050565b600080600060608486031215613dcd57613dcc61392d565b5b6000613ddb86828701613b83565b9350506020613dec86828701613b83565b9250506040613dfd86828701613ace565b9150509250925092565b613e10816139bc565b8114613e1b57600080fd5b50565b600081359050613e2d81613e07565b92915050565b600060208284031215613e4957613e4861392d565b5b6000613e5784828501613e1e565b91505092915050565b600060208284031215613e7657613e7561392d565b5b6000613e8484828501613b83565b91505092915050565b613e9681613bd8565b8114613ea157600080fd5b50565b600081359050613eb381613e8d565b92915050565b600060208284031215613ecf57613ece61392d565b5b6000613edd84828501613ea4565b91505092915050565b60008060408385031215613efd57613efc61392d565b5b6000613f0b85828601613b83565b9250506020613f1c85828601613e1e565b9150509250929050565b600067ffffffffffffffff821115613f4157613f40613c16565b5b613f4a82613a41565b9050602081019050919050565b6000613f6a613f6584613f26565b613c76565b905082815260208101848484011115613f8657613f85613c11565b5b613f91848285613cc2565b509392505050565b600082601f830112613fae57613fad613c0c565b5b8135613fbe848260208601613f57565b91505092915050565b60008060008060808587031215613fe157613fe061392d565b5b6000613fef87828801613b83565b945050602061400087828801613b83565b935050604061401187828801613ace565b925050606085013567ffffffffffffffff81111561403257614031613932565b5b61403e87828801613f99565b91505092959194509250565b600080fd5b600080fd5b60008083601f84011261406a57614069613c0c565b5b8235905067ffffffffffffffff8111156140875761408661404a565b5b6020830191508360208202830111156140a3576140a261404f565b5b9250929050565b6000806000604084860312156140c3576140c261392d565b5b60006140d186828701613ace565b935050602084013567ffffffffffffffff8111156140f2576140f1613932565b5b6140fe86828701614054565b92509250509250925092565b600080604083850312156141215761412061392d565b5b600061412f85828601613b83565b925050602061414085828601613b83565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061419157607f821691505b6020821081036141a4576141a361414a565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614206602c836139fd565b9150614211826141aa565b604082019050919050565b60006020820190508181036000830152614235816141f9565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006142986021836139fd565b91506142a38261423c565b604082019050919050565b600060208201905081810360008301526142c78161428b565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061432a6038836139fd565b9150614335826142ce565b604082019050919050565b600060208201905081810360008301526143598161431d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006143966020836139fd565b91506143a182614360565b602082019050919050565b600060208201905081810360008301526143c581614389565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006144286031836139fd565b9150614433826143cc565b604082019050919050565b600060208201905081810360008301526144578161441b565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006144ba6029836139fd565b91506144c58261445e565b604082019050919050565b600060208201905081810360008301526144e9816144ad565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061454c602a836139fd565b9150614557826144f0565b604082019050919050565b6000602082019050818103600083015261457b8161453f565b9050919050565b7f54686973206d696e7420776f756c6420657863656564206d617820737570706c60008201527f79206f662067656e657261746976652070756666000000000000000000000000602082015250565b60006145de6034836139fd565b91506145e982614582565b604082019050919050565b6000602082019050818103600083015261460d816145d1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061464e82613aad565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036146805761467f614614565b5b600182019050919050565b600061469682613aad565b91506146a183613aad565b9250828210156146b4576146b3614614565b5b828203905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006146f5601f836139fd565b9150614700826146bf565b602082019050919050565b60006020820190508181036000830152614724816146e8565b9050919050565b7f5075626c69632053616c652068617665206e6f7420737461727465642e000000600082015250565b6000614761601d836139fd565b915061476c8261472b565b602082019050919050565b6000602082019050818103600083015261479081614754565b9050919050565b7f596f75206d757374206d696e74206174206c65617374203120707566662e0000600082015250565b60006147cd601e836139fd565b91506147d882614797565b602082019050919050565b600060208201905081810360008301526147fc816147c0565b9050919050565b60008160601b9050919050565b600061481b82614803565b9050919050565b600061482d82614810565b9050919050565b61484561484082613b30565b614822565b82525050565b60006148578284614834565b60148201915081905092915050565b7f4f6e6c79203520707566662063616e206265206d696e7465642070657220747260008201527f616e73616374696f6e2e00000000000000000000000000000000000000000000602082015250565b60006148c2602a836139fd565b91506148cd82614866565b604082019050919050565b600060208201905081810360008301526148f1816148b5565b9050919050565b7f4f6e6c79203320707566662063616e206265206d696e7465642070657220747260008201527f616e73616374696f6e2e00000000000000000000000000000000000000000000602082015250565b6000614954602a836139fd565b915061495f826148f8565b604082019050919050565b6000602082019050818103600083015261498381614947565b9050919050565b600061499582613aad565b91506149a083613aad565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156149d9576149d8614614565b5b828202905092915050565b7f546865206f67207061796d656e7420616d6f756e74206973206e6f7420636f7260008201527f726563742e000000000000000000000000000000000000000000000000000000602082015250565b6000614a406025836139fd565b9150614a4b826149e4565b604082019050919050565b60006020820190508181036000830152614a6f81614a33565b9050919050565b7f54686973207075726368617365206578636565647320746865206d617820737560008201527f70706c79206f662067656e6572617469766520707566662e0000000000000000602082015250565b6000614ad26038836139fd565b9150614add82614a76565b604082019050919050565b60006020820190508181036000830152614b0181614ac5565b9050919050565b7f4f6e6c79203220707566662063616e206265206d696e7465642070657220747260008201527f616e73616374696f6e2e00000000000000000000000000000000000000000000602082015250565b6000614b64602a836139fd565b9150614b6f82614b08565b604082019050919050565b60006020820190508181036000830152614b9381614b57565b9050919050565b7f54686520776c207061796d656e7420616d6f756e74206973206e6f7420636f7260008201527f726563742e000000000000000000000000000000000000000000000000000000602082015250565b6000614bf66025836139fd565b9150614c0182614b9a565b604082019050919050565b60006020820190508181036000830152614c2581614be9565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614c88602f836139fd565b9150614c9382614c2c565b604082019050919050565b60006020820190508181036000830152614cb781614c7b565b9050919050565b6000614cc982613aad565b9150614cd483613aad565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d0957614d08614614565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614d4e82613aad565b9150614d5983613aad565b925082614d6957614d68614d14565b5b828206905092915050565b600081905092915050565b60008190508160005260206000209050919050565b60008154614da181614179565b614dab8186614d74565b94506001821660008114614dc65760018114614dd757614e0a565b60ff19831686528186019350614e0a565b614de085614d7f565b60005b83811015614e0257815481890152600182019150602081019050614de3565b838801955050505b50505092915050565b6000614e1e826139f2565b614e288185614d74565b9350614e38818560208601613a0e565b80840191505092915050565b6000614e508286614d94565b9150614e5c8285614e13565b9150614e688284614e13565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614ed16026836139fd565b9150614edc82614e75565b604082019050919050565b60006020820190508181036000830152614f0081614ec4565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614f63602c836139fd565b9150614f6e82614f07565b604082019050919050565b60006020820190508181036000830152614f9281614f56565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614ff56029836139fd565b915061500082614f99565b604082019050919050565b6000602082019050818103600083015261502481614fe8565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006150876024836139fd565b91506150928261502b565b604082019050919050565b600060208201905081810360008301526150b68161507a565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006150f36014836139fd565b91506150fe826150bd565b602082019050919050565b60006020820190508181036000830152615122816150e6565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b600061515f6010836139fd565b915061516a82615129565b602082019050919050565b6000602082019050818103600083015261518e81615152565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006151cb6019836139fd565b91506151d682615195565b602082019050919050565b600060208201905081810360008301526151fa816151be565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061525d6032836139fd565b915061526882615201565b604082019050919050565b6000602082019050818103600083015261528c81615250565b9050919050565b7f546865207061796d656e7420616d6f756e74206973206e6f7420636f7272656360008201527f742e000000000000000000000000000000000000000000000000000000000000602082015250565b60006152ef6022836139fd565b91506152fa82615293565b604082019050919050565b6000602082019050818103600083015261531e816152e2565b9050919050565b600061533082613aad565b915061533b83613aad565b92508261534b5761534a614d14565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006153ac82615385565b6153b68185615390565b93506153c6818560208601613a0e565b6153cf81613a41565b840191505092915050565b60006080820190506153ef6000830187613b42565b6153fc6020830186613b42565b6154096040830185613d8a565b818103606083015261541b81846153a1565b905095945050505050565b60008151905061543581613963565b92915050565b6000602082840312156154515761545061392d565b5b600061545f84828501615426565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061549e6020836139fd565b91506154a982615468565b602082019050919050565b600060208201905081810360008301526154cd81615491565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061550a601c836139fd565b9150615515826154d4565b602082019050919050565b60006020820190508181036000830152615539816154fd565b905091905056fea264697066735822122062c5d0ae2a8890ba7982e8ffa01ea9eab732e0d0874cc45118f11afbaec169d864736f6c634300080d0033

Deployed Bytecode Sourcemap

64130:7728:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49267:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50212:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51771:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51294:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65120:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66201:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64573:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64791:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52521:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64406:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70428:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64730:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65045:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71018:135;;;;;;;;;;;;;:::i;:::-;;71762:93;;;;;;;;;;;;;:::i;:::-;;52931:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64355:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64929:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70850:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65221:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65324:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27356:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49906:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65083:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64960:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49636:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30255:103;;;;;;;;;;;;;:::i;:::-;;65368:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65414:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64629:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70521:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71665:89;;;;;;;;;;;;;:::i;:::-;;70752:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69999:423;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29604:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65533:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64826:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50381:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64518:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69716:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52064:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53187:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66387:1903;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64463:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64992:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65767:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64681:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70654:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71161:496;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30513:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65643:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69510:201;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49267:305;49369:4;49421:25;49406:40;;;:11;:40;;;;:105;;;;49478:33;49463:48;;;:11;:48;;;;49406:105;:158;;;;49528:36;49552:11;49528:23;:36::i;:::-;49406:158;49386:178;;49267:305;;;:::o;50212:100::-;50266:13;50299:5;50292:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50212:100;:::o;51771:221::-;51847:7;51875:16;51883:7;51875;:16::i;:::-;51867:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;51960:15;:24;51976:7;51960:24;;;;;;;;;;;;;;;;;;;;;51953:31;;51771:221;;;:::o;51294:411::-;51375:13;51391:23;51406:7;51391:14;:23::i;:::-;51375:39;;51439:5;51433:11;;:2;:11;;;51425:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;51533:5;51517:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;51542:37;51559:5;51566:12;:10;:12::i;:::-;51542:16;:37::i;:::-;51517:62;51495:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;51676:21;51685:2;51689:7;51676:8;:21::i;:::-;51364:341;51294:411;;:::o;65120:96::-;;;;:::o;66201:121::-;29835:12;:10;:12::i;:::-;29824:23;;:7;:5;:7::i;:::-;:23;;;29816:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66302:14:::1;66284:15;:32;;;;;;;;;;;;:::i;:::-;;66201:121:::0;:::o;64573:51::-;64614:10;64573:51;:::o;64791:28::-;;;;:::o;52521:339::-;52716:41;52735:12;:10;:12::i;:::-;52749:7;52716:18;:41::i;:::-;52708:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;52824:28;52834:4;52840:2;52844:7;52824:9;:28::i;:::-;52521:339;;;:::o;64406:52::-;64457:1;64406:52;:::o;70428:87::-;29835:12;:10;:12::i;:::-;29824:23;;:7;:5;:7::i;:::-;:23;;;29816:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70502:7:::1;70487:12;;:22;;;;;;;;;;;;;;;;;;70428:87:::0;:::o;64730:50::-;64769:11;64730:50;:::o;65045:33::-;;;;;;;;;;;;;:::o;71018:135::-;29835:12;:10;:12::i;:::-;29824:23;;:7;:5;:7::i;:::-;:23;;;29816:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71064:15:::1;71082:21;71064:39;;71118:10;71110:28;;:37;71139:7;71110:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;71057:96;71018:135::o:0;71762:93::-;29835:12;:10;:12::i;:::-;29824:23;;:7;:5;:7::i;:::-;:23;;;29816:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71837:10:::1;:8;:10::i;:::-;71762:93::o:0;52931:185::-;53069:39;53086:4;53092:2;53096:7;53069:39;;;;;;;;;;;;:16;:39::i;:::-;52931:185;;;:::o;64355:46::-;64397:4;64355:46;:::o;64929:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;70850:104::-;29835:12;:10;:12::i;:::-;29824:23;;:7;:5;:7::i;:::-;:23;;;29816:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70938:10:::1;70922:13;:26;;;;70850:104:::0;:::o;65221:96::-;;;;:::o;65324:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;27356:86::-;27403:4;27427:7;;;;;;;;;;;27420:14;;27356:86;:::o;49906:239::-;49978:7;49998:13;50014:7;:16;50022:7;50014:16;;;;;;;;;;;;;;;;;;;;;49998:32;;50066:1;50049:19;;:5;:19;;;50041:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;50132:5;50125:12;;;49906:239;;;:::o;65083:30::-;;;;;;;;;;;;;:::o;64960:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49636:208::-;49708:7;49753:1;49736:19;;:5;:19;;;49728:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;49820:9;:16;49830:5;49820:16;;;;;;;;;;;;;;;;49813:23;;49636:208;;;:::o;30255:103::-;29835:12;:10;:12::i;:::-;29824:23;;:7;:5;:7::i;:::-;:23;;;29816:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30320:30:::1;30347:1;30320:18;:30::i;:::-;30255:103::o:0;65368:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;65414:35::-;;;;;;;;;:::o;64629:47::-;64666:10;64629:47;:::o;70521:127::-;29835:12;:10;:12::i;:::-;29824:23;;:7;:5;:7::i;:::-;:23;;;29816:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70597:7:::1;70584:10;;:20;;;;;;;;;;;;;;;;;;70627:15;70611:13;:31;;;;70521:127:::0;:::o;71665:89::-;29835:12;:10;:12::i;:::-;29824:23;;:7;:5;:7::i;:::-;:23;;;29816:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71738:8:::1;:6;:8::i;:::-;71665:89::o:0;70752:92::-;29835:12;:10;:12::i;:::-;29824:23;;:7;:5;:7::i;:::-;:23;;;29816:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70833:5:::1;70818:12;:20;;;;70752:92:::0;:::o;69999:423::-;29835:12;:10;:12::i;:::-;29824:23;;:7;:5;:7::i;:::-;:23;;;29816:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64397:4:::1;70072:34;70098:7;70072:21;:11;:19;:21::i;:::-;:25;;:34;;;;:::i;:::-;:53;;70064:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;70196:9;70191:226;70215:7;70211:1;:11;70191:226;;;70238:17;70258:21;:11;:19;:21::i;:::-;70238:41;;64397:4;70294:9;:27;70290:120;;;70334:23;:11;:21;:23::i;:::-;70368:32;70378:10;70390:9;70368;:32::i;:::-;70290:120;70229:188;70224:3;;;;;:::i;:::-;;;;70191:226;;;;69999:423:::0;:::o;29604:87::-;29650:7;29677:6;;;;;;;;;;;29670:13;;29604:87;:::o;65533:104::-;29835:12;:10;:12::i;:::-;29824:23;;:7;:5;:7::i;:::-;:23;;;29816:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65623:8:::1;65608:12;:23;;;;;;;;;;;;:::i;:::-;;65533:104:::0;:::o;64826:98::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50381:104::-;50437:13;50470:7;50463:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50381:104;:::o;64518:50::-;64567:1;64518:50;:::o;69716:211::-;69772:7;64769:11;69813:13;;69795:15;:31;;;;:::i;:::-;:47;69791:131;;64666:10;69853:17;;;;69791:131;64614:10;69893:21;;69716:211;;:::o;52064:155::-;52159:52;52178:12;:10;:12::i;:::-;52192:8;52202;52159:18;:52::i;:::-;52064:155;;:::o;53187:328::-;53362:41;53381:12;:10;:12::i;:::-;53395:7;53362:18;:41::i;:::-;53354:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;53468:39;53482:4;53488:2;53492:7;53501:5;53468:13;:39::i;:::-;53187:328;;;;:::o;66387:1903::-;1845:1;2443:7;;:19;2435:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1845:1;2576:7;:18;;;;66497:10:::1;;;;;;;;;;;66489:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;66568:1;66556:9;:13;66548:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;66611:12;66653:10;66636:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;66626:39;;;;;;66611:54;;66672:9;66684:50;66703:12;;66684:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66716:12;;66729:4;66684:18;:50::i;:::-;66672:62;;66741:9;66753:50;66772:12;;66753:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66785:12;;66798:4;66753:18;:50::i;:::-;66741:62;;66813:4;66810:704;;;66831:9;:21;66841:10;66831:21;;;;;;;;;;;;;;;;;;;;;;;;;66827:680;;66889:4;66867:26;;:18;:16;:18::i;:::-;:26;;::::0;66864:277:::1;;64457:1;66915:9;:37;;66907:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;66864:277;;;64512:1;67047:9;:35;;67039:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;66864:277;67185:9;67172:10;:8;:10::i;:::-;:22;;;;:::i;:::-;67159:9;:35;;67151:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;64397:4;67255:36;67281:9;67255:21;:11;:19;:21::i;:::-;:25;;:36;;;;:::i;:::-;:55;;67247:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;67406:4;67382:9;:21;67392:10;67382:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;67421:22;67433:9;67421:11;:22::i;:::-;66827:680;;;67476:21;67487:9;67476:10;:21::i;:::-;66827:680;66810:704;67523:4;67520:703;;;67541:9;:21;67551:10;67541:21;;;;;;;;;;;;;;;;;;;;;;;;;67537:679;;67599:4;67577:26;;:18;:16;:18::i;:::-;:26;;::::0;67574:276:::1;;64457:1;67625:9;:37;;67617:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;67574:276;;;64567:1;67756:9;:35;;67748:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;67574:276;67894:9;67881:10;:8;:10::i;:::-;:22;;;;:::i;:::-;67868:9;:35;;67860:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;64397:4;67964:36;67990:9;67964:21;:11;:19;:21::i;:::-;:25;;:36;;;;:::i;:::-;:55;;67956:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;68115:4;68091:9;:21;68101:10;68091:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;68130:22;68142:9;68130:11;:22::i;:::-;67537:679;;;68185:21;68196:9;68185:10;:21::i;:::-;67537:679;67520:703;68233:4;68232:5;:14;;;;;68242:4;68241:5;68232:14;68229:56;;;68256:21;68267:9;68256:10;:21::i;:::-;68229:56;66482:1808;;;1801:1:::0;2755:7;:22;;;;66387:1903;;;:::o;64463:50::-;64512:1;64463:50;:::o;64992:46::-;;;;;;;;;;;;;;;;;;;:::o;65767:428::-;65833:13;65863:17;65871:8;65863:7;:17::i;:::-;65855:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;65939:24;65977:12;;;;;;;;;;;65972:56;;66007:13;66000:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65972:56;66049:59;64397:4;64721;66052:8;:24;;;;:::i;:::-;66051:44;;;;:::i;:::-;66049:57;:59::i;:::-;66036:72;;66148:12;66162:10;66174:13;;;;;;;;;;;;;;;;;66131:57;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66117:72;;;65767:428;;;;:::o;64681:44::-;64721:4;64681:44;:::o;70654:92::-;29835:12;:10;:12::i;:::-;29824:23;;:7;:5;:7::i;:::-;:23;;;29816:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70735:5:::1;70720:12;:20;;;;70654:92:::0;:::o;71161:496::-;71313:15;71442:42;71421:64;;:9;:64;;;71417:104;;71507:4;71500:11;;;;71417:104;71607:42;71631:6;71639:9;71607:23;:42::i;:::-;71600:49;;71161:496;;;;;:::o;30513:201::-;29835:12;:10;:12::i;:::-;29824:23;;:7;:5;:7::i;:::-;:23;;;29816:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30622:1:::1;30602:22;;:8;:22;;::::0;30594:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;30678:28;30697:8;30678:18;:28::i;:::-;30513:201:::0;:::o;65643:118::-;29835:12;:10;:12::i;:::-;29824:23;;:7;:5;:7::i;:::-;:23;;;29816:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65741:14:::1;65725:13;:30;;;;;;;;;;;;:::i;:::-;;65643:118:::0;:::o;69510:201::-;69574:4;64769:11;69612:13;;69594:15;:31;;;;:::i;:::-;:47;69590:116;;69659:4;69652:11;;;;69590:116;69693:5;69686:12;;69510:201;;:::o;42036:157::-;42121:4;42160:25;42145:40;;;:11;:40;;;;42138:47;;42036:157;;;:::o;55025:127::-;55090:4;55142:1;55114:30;;:7;:16;55122:7;55114:16;;;;;;;;;;;;;;;;;;;;;:30;;;;55107:37;;55025:127;;;:::o;26010:98::-;26063:7;26090:10;26083:17;;26010:98;:::o;59007:174::-;59109:2;59082:15;:24;59098:7;59082:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;59165:7;59161:2;59127:46;;59136:23;59151:7;59136:14;:23::i;:::-;59127:46;;;;;;;;;;;;59007:174;;:::o;55319:348::-;55412:4;55437:16;55445:7;55437;:16::i;:::-;55429:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;55513:13;55529:23;55544:7;55529:14;:23::i;:::-;55513:39;;55582:5;55571:16;;:7;:16;;;:51;;;;55615:7;55591:31;;:20;55603:7;55591:11;:20::i;:::-;:31;;;55571:51;:87;;;;55626:32;55643:5;55650:7;55626:16;:32::i;:::-;55571:87;55563:96;;;55319:348;;;;:::o;58311:578::-;58470:4;58443:31;;:23;58458:7;58443:14;:23::i;:::-;:31;;;58435:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;58553:1;58539:16;;:2;:16;;;58531:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;58609:39;58630:4;58636:2;58640:7;58609:20;:39::i;:::-;58713:29;58730:1;58734:7;58713:8;:29::i;:::-;58774:1;58755:9;:15;58765:4;58755:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;58803:1;58786:9;:13;58796:2;58786:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;58834:2;58815:7;:16;58823:7;58815:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;58873:7;58869:2;58854:27;;58863:4;58854:27;;;;;;;;;;;;58311:578;;;:::o;28415:120::-;27959:8;:6;:8::i;:::-;27951:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;28484:5:::1;28474:7;;:15;;;;;;;;;;;;;;;;;;28505:22;28514:12;:10;:12::i;:::-;28505:22;;;;;;:::i;:::-;;;;;;;;28415:120::o:0;30874:191::-;30948:16;30967:6;;;;;;;;;;;30948:25;;30993:8;30984:6;;:17;;;;;;;;;;;;;;;;;;31048:8;31017:40;;31038:8;31017:40;;;;;;;;;;;;30937:128;30874:191;:::o;28156:118::-;27682:8;:6;:8::i;:::-;27681:9;27673:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;28226:4:::1;28216:7;;:14;;;;;;;;;;;;;;;;;;28246:20;28253:12;:10;:12::i;:::-;28246:20;;;;;;:::i;:::-;;;;;;;;28156:118::o:0;13080:114::-;13145:7;13172;:14;;;13165:21;;13080:114;;;:::o;5654:98::-;5712:7;5743:1;5739;:5;;;;:::i;:::-;5732:12;;5654:98;;;;:::o;13202:127::-;13309:1;13291:7;:14;;;:19;;;;;;;;;;;13202:127;:::o;56009:110::-;56085:26;56095:2;56099:7;56085:26;;;;;;;;;;;;:9;:26::i;:::-;56009:110;;:::o;59323:315::-;59478:8;59469:17;;:5;:17;;;59461:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;59565:8;59527:18;:25;59546:5;59527:25;;;;;;;;;;;;;;;:35;59553:8;59527:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;59611:8;59589:41;;59604:5;59589:41;;;59621:8;59589:41;;;;;;:::i;:::-;;;;;;;;59323:315;;;:::o;54397:::-;54554:28;54564:4;54570:2;54574:7;54554:9;:28::i;:::-;54601:48;54624:4;54630:2;54634:7;54643:5;54601:22;:48::i;:::-;54593:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;54397:315;;;;:::o;10742:190::-;10867:4;10920;10891:25;10904:5;10911:4;10891:12;:25::i;:::-;:33;10884:40;;10742:190;;;;;:::o;68296:440::-;27682:8;:6;:8::i;:::-;27681:9;27673:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;68371:9:::1;68366:228;68390:9;68386:1;:13;68366:228;;;68415:17;68435:21;:11;:19;:21::i;:::-;68415:41;;64397:4;68471:9;:27;68467:120;;;68511:23;:11;:21;:23::i;:::-;68545:32;68555:10;68567:9;68545;:32::i;:::-;68467:120;68406:188;68401:3;;;;;:::i;:::-;;;;68366:228;;;;68602:14;68644:9;68631:10;:8;:10::i;:::-;:22;;;;:::i;:::-;68619:9;:34;;;;:::i;:::-;68602:51;;68673:1;68664:6;:10;68660:71;;;68695:10;68687:28;;:36;68716:6;68687:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;68660:71;68359:377;68296:440:::0;:::o;68742:763::-;27682:8;:6;:8::i;:::-;27681:9;27673:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;64457:1:::1;68819:9;:37;;68811:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;64397:4;68918:36;68944:9;68918:21;:11;:19;:21::i;:::-;:25;;:36;;;;:::i;:::-;:55;;68910:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;69075:9;64666:10;69062:22;;;;:::i;:::-;69049:9;:35;;69041:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;69137:9;69132:231;69156:9;69152:1;:13;69132:231;;;69184:17;69204:21;:11;:19;:21::i;:::-;69184:41;;64397:4;69240:9;:27;69236:120;;;69280:23;:11;:21;:23::i;:::-;69314:32;69324:10;69336:9;69314;:32::i;:::-;69236:120;69172:191;69167:3;;;;;:::i;:::-;;;;69132:231;;;;69371:14;69413:9;64666:10;69400:22;;;;:::i;:::-;69388:9;:34;;;;:::i;:::-;69371:51;;69442:1;69433:6;:10;69429:71;;;69464:10;69456:28;;:36;69485:6;69456:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;69429:71;68804:701;68742:763:::0;:::o;14038:723::-;14094:13;14324:1;14315:5;:10;14311:53;;14342:10;;;;;;;;;;;;;;;;;;;;;14311:53;14374:12;14389:5;14374:20;;14405:14;14430:78;14445:1;14437:4;:9;14430:78;;14463:8;;;;;:::i;:::-;;;;14494:2;14486:10;;;;;:::i;:::-;;;14430:78;;;14518:19;14550:6;14540:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14518:39;;14568:154;14584:1;14575:5;:10;14568:154;;14612:1;14602:11;;;;;:::i;:::-;;;14679:2;14671:5;:10;;;;:::i;:::-;14658:2;:24;;;;:::i;:::-;14645:39;;14628:6;14635;14628:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;14708:2;14699:11;;;;;:::i;:::-;;;14568:154;;;14746:6;14732:21;;;;;14038:723;;;;:::o;52290:164::-;52387:4;52411:18;:25;52430:5;52411:25;;;;;;;;;;;;;;;:35;52437:8;52411:35;;;;;;;;;;;;;;;;;;;;;;;;;52404:42;;52290:164;;;;:::o;61574:126::-;;;;:::o;56346:321::-;56476:18;56482:2;56486:7;56476:5;:18::i;:::-;56527:54;56558:1;56562:2;56566:7;56575:5;56527:22;:54::i;:::-;56505:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;56346:321;;;:::o;60203:799::-;60358:4;60379:15;:2;:13;;;:15::i;:::-;60375:620;;;60431:2;60415:36;;;60452:12;:10;:12::i;:::-;60466:4;60472:7;60481:5;60415:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;60411:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60674:1;60657:6;:13;:18;60653:272;;60700:60;;;;;;;;;;:::i;:::-;;;;;;;;60653:272;60875:6;60869:13;60860:6;60856:2;60852:15;60845:38;60411:529;60548:41;;;60538:51;;;:6;:51;;;;60531:58;;;;;60375:620;60979:4;60972:11;;60203:799;;;;;;;:::o;11294:675::-;11377:7;11397:20;11420:4;11397:27;;11440:9;11435:497;11459:5;:12;11455:1;:16;11435:497;;;11493:20;11516:5;11522:1;11516:8;;;;;;;;:::i;:::-;;;;;;;;11493:31;;11559:12;11543;:28;11539:382;;11686:42;11701:12;11715;11686:14;:42::i;:::-;11671:57;;11539:382;;;11863:42;11878:12;11892;11863:14;:42::i;:::-;11848:57;;11539:382;11478:454;11473:3;;;;;:::i;:::-;;;;11435:497;;;;11949:12;11942:19;;;11294:675;;;;:::o;57003:382::-;57097:1;57083:16;;:2;:16;;;57075:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;57156:16;57164:7;57156;:16::i;:::-;57155:17;57147:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;57218:45;57247:1;57251:2;57255:7;57218:20;:45::i;:::-;57293:1;57276:9;:13;57286:2;57276:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;57324:2;57305:7;:16;57313:7;57305:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;57369:7;57365:2;57344:33;;57361:1;57344:33;;;;;;;;;;;;57003:382;;:::o;31892:387::-;31952:4;32160:12;32227:7;32215:20;32207:28;;32270:1;32263:4;:8;32256:15;;;31892:387;;;:::o;11977:224::-;12045:13;12108:1;12102:4;12095:15;12137:1;12131:4;12124:15;12178:4;12172;12162:21;12153:30;;11977:224;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:77::-;4975:7;5004:5;4993:16;;4938:77;;;:::o;5021:118::-;5108:24;5126:5;5108:24;:::i;:::-;5103:3;5096:37;5021:118;;:::o;5145:222::-;5238:4;5276:2;5265:9;5261:18;5253:26;;5289:71;5357:1;5346:9;5342:17;5333:6;5289:71;:::i;:::-;5145:222;;;;:::o;5373:117::-;5482:1;5479;5472:12;5496:117;5605:1;5602;5595:12;5619:180;5667:77;5664:1;5657:88;5764:4;5761:1;5754:15;5788:4;5785:1;5778:15;5805:281;5888:27;5910:4;5888:27;:::i;:::-;5880:6;5876:40;6018:6;6006:10;6003:22;5982:18;5970:10;5967:34;5964:62;5961:88;;;6029:18;;:::i;:::-;5961:88;6069:10;6065:2;6058:22;5848:238;5805:281;;:::o;6092:129::-;6126:6;6153:20;;:::i;:::-;6143:30;;6182:33;6210:4;6202:6;6182:33;:::i;:::-;6092:129;;;:::o;6227:308::-;6289:4;6379:18;6371:6;6368:30;6365:56;;;6401:18;;:::i;:::-;6365:56;6439:29;6461:6;6439:29;:::i;:::-;6431:37;;6523:4;6517;6513:15;6505:23;;6227:308;;;:::o;6541:154::-;6625:6;6620:3;6615;6602:30;6687:1;6678:6;6673:3;6669:16;6662:27;6541:154;;;:::o;6701:412::-;6779:5;6804:66;6820:49;6862:6;6820:49;:::i;:::-;6804:66;:::i;:::-;6795:75;;6893:6;6886:5;6879:21;6931:4;6924:5;6920:16;6969:3;6960:6;6955:3;6951:16;6948:25;6945:112;;;6976:79;;:::i;:::-;6945:112;7066:41;7100:6;7095:3;7090;7066:41;:::i;:::-;6785:328;6701:412;;;;;:::o;7133:340::-;7189:5;7238:3;7231:4;7223:6;7219:17;7215:27;7205:122;;7246:79;;:::i;:::-;7205:122;7363:6;7350:20;7388:79;7463:3;7455:6;7448:4;7440:6;7436:17;7388:79;:::i;:::-;7379:88;;7195:278;7133:340;;;;:::o;7479:509::-;7548:6;7597:2;7585:9;7576:7;7572:23;7568:32;7565:119;;;7603:79;;:::i;:::-;7565:119;7751:1;7740:9;7736:17;7723:31;7781:18;7773:6;7770:30;7767:117;;;7803:79;;:::i;:::-;7767:117;7908:63;7963:7;7954:6;7943:9;7939:22;7908:63;:::i;:::-;7898:73;;7694:287;7479:509;;;;:::o;7994:118::-;8081:24;8099:5;8081:24;:::i;:::-;8076:3;8069:37;7994:118;;:::o;8118:222::-;8211:4;8249:2;8238:9;8234:18;8226:26;;8262:71;8330:1;8319:9;8315:17;8306:6;8262:71;:::i;:::-;8118:222;;;;:::o;8346:619::-;8423:6;8431;8439;8488:2;8476:9;8467:7;8463:23;8459:32;8456:119;;;8494:79;;:::i;:::-;8456:119;8614:1;8639:53;8684:7;8675:6;8664:9;8660:22;8639:53;:::i;:::-;8629:63;;8585:117;8741:2;8767:53;8812:7;8803:6;8792:9;8788:22;8767:53;:::i;:::-;8757:63;;8712:118;8869:2;8895:53;8940:7;8931:6;8920:9;8916:22;8895:53;:::i;:::-;8885:63;;8840:118;8346:619;;;;;:::o;8971:116::-;9041:21;9056:5;9041:21;:::i;:::-;9034:5;9031:32;9021:60;;9077:1;9074;9067:12;9021:60;8971:116;:::o;9093:133::-;9136:5;9174:6;9161:20;9152:29;;9190:30;9214:5;9190:30;:::i;:::-;9093:133;;;;:::o;9232:323::-;9288:6;9337:2;9325:9;9316:7;9312:23;9308:32;9305:119;;;9343:79;;:::i;:::-;9305:119;9463:1;9488:50;9530:7;9521:6;9510:9;9506:22;9488:50;:::i;:::-;9478:60;;9434:114;9232:323;;;;:::o;9561:329::-;9620:6;9669:2;9657:9;9648:7;9644:23;9640:32;9637:119;;;9675:79;;:::i;:::-;9637:119;9795:1;9820:53;9865:7;9856:6;9845:9;9841:22;9820:53;:::i;:::-;9810:63;;9766:117;9561:329;;;;:::o;9896:122::-;9969:24;9987:5;9969:24;:::i;:::-;9962:5;9959:35;9949:63;;10008:1;10005;9998:12;9949:63;9896:122;:::o;10024:139::-;10070:5;10108:6;10095:20;10086:29;;10124:33;10151:5;10124:33;:::i;:::-;10024:139;;;;:::o;10169:329::-;10228:6;10277:2;10265:9;10256:7;10252:23;10248:32;10245:119;;;10283:79;;:::i;:::-;10245:119;10403:1;10428:53;10473:7;10464:6;10453:9;10449:22;10428:53;:::i;:::-;10418:63;;10374:117;10169:329;;;;:::o;10504:468::-;10569:6;10577;10626:2;10614:9;10605:7;10601:23;10597:32;10594:119;;;10632:79;;:::i;:::-;10594:119;10752:1;10777:53;10822:7;10813:6;10802:9;10798:22;10777:53;:::i;:::-;10767:63;;10723:117;10879:2;10905:50;10947:7;10938:6;10927:9;10923:22;10905:50;:::i;:::-;10895:60;;10850:115;10504:468;;;;;:::o;10978:307::-;11039:4;11129:18;11121:6;11118:30;11115:56;;;11151:18;;:::i;:::-;11115:56;11189:29;11211:6;11189:29;:::i;:::-;11181:37;;11273:4;11267;11263:15;11255:23;;10978:307;;;:::o;11291:410::-;11368:5;11393:65;11409:48;11450:6;11409:48;:::i;:::-;11393:65;:::i;:::-;11384:74;;11481:6;11474:5;11467:21;11519:4;11512:5;11508:16;11557:3;11548:6;11543:3;11539:16;11536:25;11533:112;;;11564:79;;:::i;:::-;11533:112;11654:41;11688:6;11683:3;11678;11654:41;:::i;:::-;11374:327;11291:410;;;;;:::o;11720:338::-;11775:5;11824:3;11817:4;11809:6;11805:17;11801:27;11791:122;;11832:79;;:::i;:::-;11791:122;11949:6;11936:20;11974:78;12048:3;12040:6;12033:4;12025:6;12021:17;11974:78;:::i;:::-;11965:87;;11781:277;11720:338;;;;:::o;12064:943::-;12159:6;12167;12175;12183;12232:3;12220:9;12211:7;12207:23;12203:33;12200:120;;;12239:79;;:::i;:::-;12200:120;12359:1;12384:53;12429:7;12420:6;12409:9;12405:22;12384:53;:::i;:::-;12374:63;;12330:117;12486:2;12512:53;12557:7;12548:6;12537:9;12533:22;12512:53;:::i;:::-;12502:63;;12457:118;12614:2;12640:53;12685:7;12676:6;12665:9;12661:22;12640:53;:::i;:::-;12630:63;;12585:118;12770:2;12759:9;12755:18;12742:32;12801:18;12793:6;12790:30;12787:117;;;12823:79;;:::i;:::-;12787:117;12928:62;12982:7;12973:6;12962:9;12958:22;12928:62;:::i;:::-;12918:72;;12713:287;12064:943;;;;;;;:::o;13013:117::-;13122:1;13119;13112:12;13136:117;13245:1;13242;13235:12;13276:568;13349:8;13359:6;13409:3;13402:4;13394:6;13390:17;13386:27;13376:122;;13417:79;;:::i;:::-;13376:122;13530:6;13517:20;13507:30;;13560:18;13552:6;13549:30;13546:117;;;13582:79;;:::i;:::-;13546:117;13696:4;13688:6;13684:17;13672:29;;13750:3;13742:4;13734:6;13730:17;13720:8;13716:32;13713:41;13710:128;;;13757:79;;:::i;:::-;13710:128;13276:568;;;;;:::o;13850:704::-;13945:6;13953;13961;14010:2;13998:9;13989:7;13985:23;13981:32;13978:119;;;14016:79;;:::i;:::-;13978:119;14136:1;14161:53;14206:7;14197:6;14186:9;14182:22;14161:53;:::i;:::-;14151:63;;14107:117;14291:2;14280:9;14276:18;14263:32;14322:18;14314:6;14311:30;14308:117;;;14344:79;;:::i;:::-;14308:117;14457:80;14529:7;14520:6;14509:9;14505:22;14457:80;:::i;:::-;14439:98;;;;14234:313;13850:704;;;;;:::o;14560:474::-;14628:6;14636;14685:2;14673:9;14664:7;14660:23;14656:32;14653:119;;;14691:79;;:::i;:::-;14653:119;14811:1;14836:53;14881:7;14872:6;14861:9;14857:22;14836:53;:::i;:::-;14826:63;;14782:117;14938:2;14964:53;15009:7;15000:6;14989:9;14985:22;14964:53;:::i;:::-;14954:63;;14909:118;14560:474;;;;;:::o;15040:180::-;15088:77;15085:1;15078:88;15185:4;15182:1;15175:15;15209:4;15206:1;15199:15;15226:320;15270:6;15307:1;15301:4;15297:12;15287:22;;15354:1;15348:4;15344:12;15375:18;15365:81;;15431:4;15423:6;15419:17;15409:27;;15365:81;15493:2;15485:6;15482:14;15462:18;15459:38;15456:84;;15512:18;;:::i;:::-;15456:84;15277:269;15226:320;;;:::o;15552:231::-;15692:34;15688:1;15680:6;15676:14;15669:58;15761:14;15756:2;15748:6;15744:15;15737:39;15552:231;:::o;15789:366::-;15931:3;15952:67;16016:2;16011:3;15952:67;:::i;:::-;15945:74;;16028:93;16117:3;16028:93;:::i;:::-;16146:2;16141:3;16137:12;16130:19;;15789:366;;;:::o;16161:419::-;16327:4;16365:2;16354:9;16350:18;16342:26;;16414:9;16408:4;16404:20;16400:1;16389:9;16385:17;16378:47;16442:131;16568:4;16442:131;:::i;:::-;16434:139;;16161:419;;;:::o;16586:220::-;16726:34;16722:1;16714:6;16710:14;16703:58;16795:3;16790:2;16782:6;16778:15;16771:28;16586:220;:::o;16812:366::-;16954:3;16975:67;17039:2;17034:3;16975:67;:::i;:::-;16968:74;;17051:93;17140:3;17051:93;:::i;:::-;17169:2;17164:3;17160:12;17153:19;;16812:366;;;:::o;17184:419::-;17350:4;17388:2;17377:9;17373:18;17365:26;;17437:9;17431:4;17427:20;17423:1;17412:9;17408:17;17401:47;17465:131;17591:4;17465:131;:::i;:::-;17457:139;;17184:419;;;:::o;17609:243::-;17749:34;17745:1;17737:6;17733:14;17726:58;17818:26;17813:2;17805:6;17801:15;17794:51;17609:243;:::o;17858:366::-;18000:3;18021:67;18085:2;18080:3;18021:67;:::i;:::-;18014:74;;18097:93;18186:3;18097:93;:::i;:::-;18215:2;18210:3;18206:12;18199:19;;17858:366;;;:::o;18230:419::-;18396:4;18434:2;18423:9;18419:18;18411:26;;18483:9;18477:4;18473:20;18469:1;18458:9;18454:17;18447:47;18511:131;18637:4;18511:131;:::i;:::-;18503:139;;18230:419;;;:::o;18655:182::-;18795:34;18791:1;18783:6;18779:14;18772:58;18655:182;:::o;18843:366::-;18985:3;19006:67;19070:2;19065:3;19006:67;:::i;:::-;18999:74;;19082:93;19171:3;19082:93;:::i;:::-;19200:2;19195:3;19191:12;19184:19;;18843:366;;;:::o;19215:419::-;19381:4;19419:2;19408:9;19404:18;19396:26;;19468:9;19462:4;19458:20;19454:1;19443:9;19439:17;19432:47;19496:131;19622:4;19496:131;:::i;:::-;19488:139;;19215:419;;;:::o;19640:236::-;19780:34;19776:1;19768:6;19764:14;19757:58;19849:19;19844:2;19836:6;19832:15;19825:44;19640:236;:::o;19882:366::-;20024:3;20045:67;20109:2;20104:3;20045:67;:::i;:::-;20038:74;;20121:93;20210:3;20121:93;:::i;:::-;20239:2;20234:3;20230:12;20223:19;;19882:366;;;:::o;20254:419::-;20420:4;20458:2;20447:9;20443:18;20435:26;;20507:9;20501:4;20497:20;20493:1;20482:9;20478:17;20471:47;20535:131;20661:4;20535:131;:::i;:::-;20527:139;;20254:419;;;:::o;20679:228::-;20819:34;20815:1;20807:6;20803:14;20796:58;20888:11;20883:2;20875:6;20871:15;20864:36;20679:228;:::o;20913:366::-;21055:3;21076:67;21140:2;21135:3;21076:67;:::i;:::-;21069:74;;21152:93;21241:3;21152:93;:::i;:::-;21270:2;21265:3;21261:12;21254:19;;20913:366;;;:::o;21285:419::-;21451:4;21489:2;21478:9;21474:18;21466:26;;21538:9;21532:4;21528:20;21524:1;21513:9;21509:17;21502:47;21566:131;21692:4;21566:131;:::i;:::-;21558:139;;21285:419;;;:::o;21710:229::-;21850:34;21846:1;21838:6;21834:14;21827:58;21919:12;21914:2;21906:6;21902:15;21895:37;21710:229;:::o;21945:366::-;22087:3;22108:67;22172:2;22167:3;22108:67;:::i;:::-;22101:74;;22184:93;22273:3;22184:93;:::i;:::-;22302:2;22297:3;22293:12;22286:19;;21945:366;;;:::o;22317:419::-;22483:4;22521:2;22510:9;22506:18;22498:26;;22570:9;22564:4;22560:20;22556:1;22545:9;22541:17;22534:47;22598:131;22724:4;22598:131;:::i;:::-;22590:139;;22317:419;;;:::o;22742:239::-;22882:34;22878:1;22870:6;22866:14;22859:58;22951:22;22946:2;22938:6;22934:15;22927:47;22742:239;:::o;22987:366::-;23129:3;23150:67;23214:2;23209:3;23150:67;:::i;:::-;23143:74;;23226:93;23315:3;23226:93;:::i;:::-;23344:2;23339:3;23335:12;23328:19;;22987:366;;;:::o;23359:419::-;23525:4;23563:2;23552:9;23548:18;23540:26;;23612:9;23606:4;23602:20;23598:1;23587:9;23583:17;23576:47;23640:131;23766:4;23640:131;:::i;:::-;23632:139;;23359:419;;;:::o;23784:180::-;23832:77;23829:1;23822:88;23929:4;23926:1;23919:15;23953:4;23950:1;23943:15;23970:233;24009:3;24032:24;24050:5;24032:24;:::i;:::-;24023:33;;24078:66;24071:5;24068:77;24065:103;;24148:18;;:::i;:::-;24065:103;24195:1;24188:5;24184:13;24177:20;;23970:233;;;:::o;24209:191::-;24249:4;24269:20;24287:1;24269:20;:::i;:::-;24264:25;;24303:20;24321:1;24303:20;:::i;:::-;24298:25;;24342:1;24339;24336:8;24333:34;;;24347:18;;:::i;:::-;24333:34;24392:1;24389;24385:9;24377:17;;24209:191;;;;:::o;24406:181::-;24546:33;24542:1;24534:6;24530:14;24523:57;24406:181;:::o;24593:366::-;24735:3;24756:67;24820:2;24815:3;24756:67;:::i;:::-;24749:74;;24832:93;24921:3;24832:93;:::i;:::-;24950:2;24945:3;24941:12;24934:19;;24593:366;;;:::o;24965:419::-;25131:4;25169:2;25158:9;25154:18;25146:26;;25218:9;25212:4;25208:20;25204:1;25193:9;25189:17;25182:47;25246:131;25372:4;25246:131;:::i;:::-;25238:139;;24965:419;;;:::o;25390:179::-;25530:31;25526:1;25518:6;25514:14;25507:55;25390:179;:::o;25575:366::-;25717:3;25738:67;25802:2;25797:3;25738:67;:::i;:::-;25731:74;;25814:93;25903:3;25814:93;:::i;:::-;25932:2;25927:3;25923:12;25916:19;;25575:366;;;:::o;25947:419::-;26113:4;26151:2;26140:9;26136:18;26128:26;;26200:9;26194:4;26190:20;26186:1;26175:9;26171:17;26164:47;26228:131;26354:4;26228:131;:::i;:::-;26220:139;;25947:419;;;:::o;26372:180::-;26512:32;26508:1;26500:6;26496:14;26489:56;26372:180;:::o;26558:366::-;26700:3;26721:67;26785:2;26780:3;26721:67;:::i;:::-;26714:74;;26797:93;26886:3;26797:93;:::i;:::-;26915:2;26910:3;26906:12;26899:19;;26558:366;;;:::o;26930:419::-;27096:4;27134:2;27123:9;27119:18;27111:26;;27183:9;27177:4;27173:20;27169:1;27158:9;27154:17;27147:47;27211:131;27337:4;27211:131;:::i;:::-;27203:139;;26930:419;;;:::o;27355:94::-;27388:8;27436:5;27432:2;27428:14;27407:35;;27355:94;;;:::o;27455:::-;27494:7;27523:20;27537:5;27523:20;:::i;:::-;27512:31;;27455:94;;;:::o;27555:100::-;27594:7;27623:26;27643:5;27623:26;:::i;:::-;27612:37;;27555:100;;;:::o;27661:157::-;27766:45;27786:24;27804:5;27786:24;:::i;:::-;27766:45;:::i;:::-;27761:3;27754:58;27661:157;;:::o;27824:256::-;27936:3;27951:75;28022:3;28013:6;27951:75;:::i;:::-;28051:2;28046:3;28042:12;28035:19;;28071:3;28064:10;;27824:256;;;;:::o;28086:229::-;28226:34;28222:1;28214:6;28210:14;28203:58;28295:12;28290:2;28282:6;28278:15;28271:37;28086:229;:::o;28321:366::-;28463:3;28484:67;28548:2;28543:3;28484:67;:::i;:::-;28477:74;;28560:93;28649:3;28560:93;:::i;:::-;28678:2;28673:3;28669:12;28662:19;;28321:366;;;:::o;28693:419::-;28859:4;28897:2;28886:9;28882:18;28874:26;;28946:9;28940:4;28936:20;28932:1;28921:9;28917:17;28910:47;28974:131;29100:4;28974:131;:::i;:::-;28966:139;;28693:419;;;:::o;29118:229::-;29258:34;29254:1;29246:6;29242:14;29235:58;29327:12;29322:2;29314:6;29310:15;29303:37;29118:229;:::o;29353:366::-;29495:3;29516:67;29580:2;29575:3;29516:67;:::i;:::-;29509:74;;29592:93;29681:3;29592:93;:::i;:::-;29710:2;29705:3;29701:12;29694:19;;29353:366;;;:::o;29725:419::-;29891:4;29929:2;29918:9;29914:18;29906:26;;29978:9;29972:4;29968:20;29964:1;29953:9;29949:17;29942:47;30006:131;30132:4;30006:131;:::i;:::-;29998:139;;29725:419;;;:::o;30150:348::-;30190:7;30213:20;30231:1;30213:20;:::i;:::-;30208:25;;30247:20;30265:1;30247:20;:::i;:::-;30242:25;;30435:1;30367:66;30363:74;30360:1;30357:81;30352:1;30345:9;30338:17;30334:105;30331:131;;;30442:18;;:::i;:::-;30331:131;30490:1;30487;30483:9;30472:20;;30150:348;;;;:::o;30504:224::-;30644:34;30640:1;30632:6;30628:14;30621:58;30713:7;30708:2;30700:6;30696:15;30689:32;30504:224;:::o;30734:366::-;30876:3;30897:67;30961:2;30956:3;30897:67;:::i;:::-;30890:74;;30973:93;31062:3;30973:93;:::i;:::-;31091:2;31086:3;31082:12;31075:19;;30734:366;;;:::o;31106:419::-;31272:4;31310:2;31299:9;31295:18;31287:26;;31359:9;31353:4;31349:20;31345:1;31334:9;31330:17;31323:47;31387:131;31513:4;31387:131;:::i;:::-;31379:139;;31106:419;;;:::o;31531:243::-;31671:34;31667:1;31659:6;31655:14;31648:58;31740:26;31735:2;31727:6;31723:15;31716:51;31531:243;:::o;31780:366::-;31922:3;31943:67;32007:2;32002:3;31943:67;:::i;:::-;31936:74;;32019:93;32108:3;32019:93;:::i;:::-;32137:2;32132:3;32128:12;32121:19;;31780:366;;;:::o;32152:419::-;32318:4;32356:2;32345:9;32341:18;32333:26;;32405:9;32399:4;32395:20;32391:1;32380:9;32376:17;32369:47;32433:131;32559:4;32433:131;:::i;:::-;32425:139;;32152:419;;;:::o;32577:229::-;32717:34;32713:1;32705:6;32701:14;32694:58;32786:12;32781:2;32773:6;32769:15;32762:37;32577:229;:::o;32812:366::-;32954:3;32975:67;33039:2;33034:3;32975:67;:::i;:::-;32968:74;;33051:93;33140:3;33051:93;:::i;:::-;33169:2;33164:3;33160:12;33153:19;;32812:366;;;:::o;33184:419::-;33350:4;33388:2;33377:9;33373:18;33365:26;;33437:9;33431:4;33427:20;33423:1;33412:9;33408:17;33401:47;33465:131;33591:4;33465:131;:::i;:::-;33457:139;;33184:419;;;:::o;33609:224::-;33749:34;33745:1;33737:6;33733:14;33726:58;33818:7;33813:2;33805:6;33801:15;33794:32;33609:224;:::o;33839:366::-;33981:3;34002:67;34066:2;34061:3;34002:67;:::i;:::-;33995:74;;34078:93;34167:3;34078:93;:::i;:::-;34196:2;34191:3;34187:12;34180:19;;33839:366;;;:::o;34211:419::-;34377:4;34415:2;34404:9;34400:18;34392:26;;34464:9;34458:4;34454:20;34450:1;34439:9;34435:17;34428:47;34492:131;34618:4;34492:131;:::i;:::-;34484:139;;34211:419;;;:::o;34636:234::-;34776:34;34772:1;34764:6;34760:14;34753:58;34845:17;34840:2;34832:6;34828:15;34821:42;34636:234;:::o;34876:366::-;35018:3;35039:67;35103:2;35098:3;35039:67;:::i;:::-;35032:74;;35115:93;35204:3;35115:93;:::i;:::-;35233:2;35228:3;35224:12;35217:19;;34876:366;;;:::o;35248:419::-;35414:4;35452:2;35441:9;35437:18;35429:26;;35501:9;35495:4;35491:20;35487:1;35476:9;35472:17;35465:47;35529:131;35655:4;35529:131;:::i;:::-;35521:139;;35248:419;;;:::o;35673:305::-;35713:3;35732:20;35750:1;35732:20;:::i;:::-;35727:25;;35766:20;35784:1;35766:20;:::i;:::-;35761:25;;35920:1;35852:66;35848:74;35845:1;35842:81;35839:107;;;35926:18;;:::i;:::-;35839:107;35970:1;35967;35963:9;35956:16;;35673:305;;;;:::o;35984:180::-;36032:77;36029:1;36022:88;36129:4;36126:1;36119:15;36153:4;36150:1;36143:15;36170:176;36202:1;36219:20;36237:1;36219:20;:::i;:::-;36214:25;;36253:20;36271:1;36253:20;:::i;:::-;36248:25;;36292:1;36282:35;;36297:18;;:::i;:::-;36282:35;36338:1;36335;36331:9;36326:14;;36170:176;;;;:::o;36352:148::-;36454:11;36491:3;36476:18;;36352:148;;;;:::o;36506:141::-;36555:4;36578:3;36570:11;;36601:3;36598:1;36591:14;36635:4;36632:1;36622:18;36614:26;;36506:141;;;:::o;36677:845::-;36780:3;36817:5;36811:12;36846:36;36872:9;36846:36;:::i;:::-;36898:89;36980:6;36975:3;36898:89;:::i;:::-;36891:96;;37018:1;37007:9;37003:17;37034:1;37029:137;;;;37180:1;37175:341;;;;36996:520;;37029:137;37113:4;37109:9;37098;37094:25;37089:3;37082:38;37149:6;37144:3;37140:16;37133:23;;37029:137;;37175:341;37242:38;37274:5;37242:38;:::i;:::-;37302:1;37316:154;37330:6;37327:1;37324:13;37316:154;;;37404:7;37398:14;37394:1;37389:3;37385:11;37378:35;37454:1;37445:7;37441:15;37430:26;;37352:4;37349:1;37345:12;37340:17;;37316:154;;;37499:6;37494:3;37490:16;37483:23;;37182:334;;36996:520;;36784:738;;36677:845;;;;:::o;37528:377::-;37634:3;37662:39;37695:5;37662:39;:::i;:::-;37717:89;37799:6;37794:3;37717:89;:::i;:::-;37710:96;;37815:52;37860:6;37855:3;37848:4;37841:5;37837:16;37815:52;:::i;:::-;37892:6;37887:3;37883:16;37876:23;;37638:267;37528:377;;;;:::o;37911:589::-;38136:3;38158:92;38246:3;38237:6;38158:92;:::i;:::-;38151:99;;38267:95;38358:3;38349:6;38267:95;:::i;:::-;38260:102;;38379:95;38470:3;38461:6;38379:95;:::i;:::-;38372:102;;38491:3;38484:10;;37911:589;;;;;;:::o;38506:225::-;38646:34;38642:1;38634:6;38630:14;38623:58;38715:8;38710:2;38702:6;38698:15;38691:33;38506:225;:::o;38737:366::-;38879:3;38900:67;38964:2;38959:3;38900:67;:::i;:::-;38893:74;;38976:93;39065:3;38976:93;:::i;:::-;39094:2;39089:3;39085:12;39078:19;;38737:366;;;:::o;39109:419::-;39275:4;39313:2;39302:9;39298:18;39290:26;;39362:9;39356:4;39352:20;39348:1;39337:9;39333:17;39326:47;39390:131;39516:4;39390:131;:::i;:::-;39382:139;;39109:419;;;:::o;39534:231::-;39674:34;39670:1;39662:6;39658:14;39651:58;39743:14;39738:2;39730:6;39726:15;39719:39;39534:231;:::o;39771:366::-;39913:3;39934:67;39998:2;39993:3;39934:67;:::i;:::-;39927:74;;40010:93;40099:3;40010:93;:::i;:::-;40128:2;40123:3;40119:12;40112:19;;39771:366;;;:::o;40143:419::-;40309:4;40347:2;40336:9;40332:18;40324:26;;40396:9;40390:4;40386:20;40382:1;40371:9;40367:17;40360:47;40424:131;40550:4;40424:131;:::i;:::-;40416:139;;40143:419;;;:::o;40568:228::-;40708:34;40704:1;40696:6;40692:14;40685:58;40777:11;40772:2;40764:6;40760:15;40753:36;40568:228;:::o;40802:366::-;40944:3;40965:67;41029:2;41024:3;40965:67;:::i;:::-;40958:74;;41041:93;41130:3;41041:93;:::i;:::-;41159:2;41154:3;41150:12;41143:19;;40802:366;;;:::o;41174:419::-;41340:4;41378:2;41367:9;41363:18;41355:26;;41427:9;41421:4;41417:20;41413:1;41402:9;41398:17;41391:47;41455:131;41581:4;41455:131;:::i;:::-;41447:139;;41174:419;;;:::o;41599:223::-;41739:34;41735:1;41727:6;41723:14;41716:58;41808:6;41803:2;41795:6;41791:15;41784:31;41599:223;:::o;41828:366::-;41970:3;41991:67;42055:2;42050:3;41991:67;:::i;:::-;41984:74;;42067:93;42156:3;42067:93;:::i;:::-;42185:2;42180:3;42176:12;42169:19;;41828:366;;;:::o;42200:419::-;42366:4;42404:2;42393:9;42389:18;42381:26;;42453:9;42447:4;42443:20;42439:1;42428:9;42424:17;42417:47;42481:131;42607:4;42481:131;:::i;:::-;42473:139;;42200:419;;;:::o;42625:170::-;42765:22;42761:1;42753:6;42749:14;42742:46;42625:170;:::o;42801:366::-;42943:3;42964:67;43028:2;43023:3;42964:67;:::i;:::-;42957:74;;43040:93;43129:3;43040:93;:::i;:::-;43158:2;43153:3;43149:12;43142:19;;42801:366;;;:::o;43173:419::-;43339:4;43377:2;43366:9;43362:18;43354:26;;43426:9;43420:4;43416:20;43412:1;43401:9;43397:17;43390:47;43454:131;43580:4;43454:131;:::i;:::-;43446:139;;43173:419;;;:::o;43598:166::-;43738:18;43734:1;43726:6;43722:14;43715:42;43598:166;:::o;43770:366::-;43912:3;43933:67;43997:2;43992:3;43933:67;:::i;:::-;43926:74;;44009:93;44098:3;44009:93;:::i;:::-;44127:2;44122:3;44118:12;44111:19;;43770:366;;;:::o;44142:419::-;44308:4;44346:2;44335:9;44331:18;44323:26;;44395:9;44389:4;44385:20;44381:1;44370:9;44366:17;44359:47;44423:131;44549:4;44423:131;:::i;:::-;44415:139;;44142:419;;;:::o;44567:175::-;44707:27;44703:1;44695:6;44691:14;44684:51;44567:175;:::o;44748:366::-;44890:3;44911:67;44975:2;44970:3;44911:67;:::i;:::-;44904:74;;44987:93;45076:3;44987:93;:::i;:::-;45105:2;45100:3;45096:12;45089:19;;44748:366;;;:::o;45120:419::-;45286:4;45324:2;45313:9;45309:18;45301:26;;45373:9;45367:4;45363:20;45359:1;45348:9;45344:17;45337:47;45401:131;45527:4;45401:131;:::i;:::-;45393:139;;45120:419;;;:::o;45545:237::-;45685:34;45681:1;45673:6;45669:14;45662:58;45754:20;45749:2;45741:6;45737:15;45730:45;45545:237;:::o;45788:366::-;45930:3;45951:67;46015:2;46010:3;45951:67;:::i;:::-;45944:74;;46027:93;46116:3;46027:93;:::i;:::-;46145:2;46140:3;46136:12;46129:19;;45788:366;;;:::o;46160:419::-;46326:4;46364:2;46353:9;46349:18;46341:26;;46413:9;46407:4;46403:20;46399:1;46388:9;46384:17;46377:47;46441:131;46567:4;46441:131;:::i;:::-;46433:139;;46160:419;;;:::o;46585:221::-;46725:34;46721:1;46713:6;46709:14;46702:58;46794:4;46789:2;46781:6;46777:15;46770:29;46585:221;:::o;46812:366::-;46954:3;46975:67;47039:2;47034:3;46975:67;:::i;:::-;46968:74;;47051:93;47140:3;47051:93;:::i;:::-;47169:2;47164:3;47160:12;47153:19;;46812:366;;;:::o;47184:419::-;47350:4;47388:2;47377:9;47373:18;47365:26;;47437:9;47431:4;47427:20;47423:1;47412:9;47408:17;47401:47;47465:131;47591:4;47465:131;:::i;:::-;47457:139;;47184:419;;;:::o;47609:185::-;47649:1;47666:20;47684:1;47666:20;:::i;:::-;47661:25;;47700:20;47718:1;47700:20;:::i;:::-;47695:25;;47739:1;47729:35;;47744:18;;:::i;:::-;47729:35;47786:1;47783;47779:9;47774:14;;47609:185;;;;:::o;47800:180::-;47848:77;47845:1;47838:88;47945:4;47942:1;47935:15;47969:4;47966:1;47959:15;47986:98;48037:6;48071:5;48065:12;48055:22;;47986:98;;;:::o;48090:168::-;48173:11;48207:6;48202:3;48195:19;48247:4;48242:3;48238:14;48223:29;;48090:168;;;;:::o;48264:360::-;48350:3;48378:38;48410:5;48378:38;:::i;:::-;48432:70;48495:6;48490:3;48432:70;:::i;:::-;48425:77;;48511:52;48556:6;48551:3;48544:4;48537:5;48533:16;48511:52;:::i;:::-;48588:29;48610:6;48588:29;:::i;:::-;48583:3;48579:39;48572:46;;48354:270;48264:360;;;;:::o;48630:640::-;48825:4;48863:3;48852:9;48848:19;48840:27;;48877:71;48945:1;48934:9;48930:17;48921:6;48877:71;:::i;:::-;48958:72;49026:2;49015:9;49011:18;49002:6;48958:72;:::i;:::-;49040;49108:2;49097:9;49093:18;49084:6;49040:72;:::i;:::-;49159:9;49153:4;49149:20;49144:2;49133:9;49129:18;49122:48;49187:76;49258:4;49249:6;49187:76;:::i;:::-;49179:84;;48630:640;;;;;;;:::o;49276:141::-;49332:5;49363:6;49357:13;49348:22;;49379:32;49405:5;49379:32;:::i;:::-;49276:141;;;;:::o;49423:349::-;49492:6;49541:2;49529:9;49520:7;49516:23;49512:32;49509:119;;;49547:79;;:::i;:::-;49509:119;49667:1;49692:63;49747:7;49738:6;49727:9;49723:22;49692:63;:::i;:::-;49682:73;;49638:127;49423:349;;;;:::o;49778:182::-;49918:34;49914:1;49906:6;49902:14;49895:58;49778:182;:::o;49966:366::-;50108:3;50129:67;50193:2;50188:3;50129:67;:::i;:::-;50122:74;;50205:93;50294:3;50205:93;:::i;:::-;50323:2;50318:3;50314:12;50307:19;;49966:366;;;:::o;50338:419::-;50504:4;50542:2;50531:9;50527:18;50519:26;;50591:9;50585:4;50581:20;50577:1;50566:9;50562:17;50555:47;50619:131;50745:4;50619:131;:::i;:::-;50611:139;;50338:419;;;:::o;50763:178::-;50903:30;50899:1;50891:6;50887:14;50880:54;50763:178;:::o;50947:366::-;51089:3;51110:67;51174:2;51169:3;51110:67;:::i;:::-;51103:74;;51186:93;51275:3;51186:93;:::i;:::-;51304:2;51299:3;51295:12;51288:19;;50947:366;;;:::o;51319:419::-;51485:4;51523:2;51512:9;51508:18;51500:26;;51572:9;51566:4;51562:20;51558:1;51547:9;51543:17;51536:47;51600:131;51726:4;51600:131;:::i;:::-;51592:139;;51319:419;;;:::o

Swarm Source

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