ETH Price: $2,672.91 (+9.64%)
Gas: 6 Gwei

Token

BullaBulla (BULLA)
 

Overview

Max Total Supply

0 BULLA

Holders

82

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 BULLA
0xef745e6ce2d8ba9468bc7ef8f7e17b587e1685aa
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:
BullaBulla

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-18
*/

// 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/math/Math.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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


// OpenZeppelin Contracts (last updated v4.8.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 // Deprecated in v4.8
    }

    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");
        }
    }

    /**
     * @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) {
        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.
            /// @solidity memory-safe-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 {
            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 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 (last updated v4.7.0) (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 Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

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

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

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        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 (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-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 (last updated v4.6.0) (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 `IERC721Receiver.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 (last updated v4.8.0) (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`.
     *
     * 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;

    /**
     * @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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @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);
}

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721: invalid token ID");
        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) {
        _requireMinted(tokenId);

        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 overridden 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 token owner or approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        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: caller is not token owner or 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: caller is not token owner or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

    /**
     * @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 _ownerOf(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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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, 1);

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

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

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

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

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

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

        _beforeTokenTransfer(from, to, tokenId, 1);

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {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 an {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 Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256, /* firstTokenId */
        uint256 batchSize
    ) internal virtual {
        if (batchSize > 1) {
            if (from != address(0)) {
                _balances[from] -= batchSize;
            }
            if (to != address(0)) {
                _balances[to] += batchSize;
            }
        }
    }

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}
}

// File: nft.sol

pragma solidity ^0.8.2;








contract BullaBulla is ERC721, Ownable, Pausable {
    using Counters for Counters.Counter;
    using Strings for uint256;
    address public signer;
    string public URIlink;

    mapping(address => bool) public wlMintDone;

    event Minted(address indexed to);

    Counters.Counter private _tokenIdCounter;


    constructor(address _signer) ERC721("BullaBulla", "BULLA") {
        signer = _signer;
        uint i=3000;
        for(i;i<=3023;i++){
            _safeMint(msg.sender, i);
        }
        
        _tokenIdCounter.increment();

        _pause();
    }

    function checkValidity(bytes calldata signature, string memory action)
        public
        view
        returns (bool)
    {
        require(
            ECDSA.recover(
                ECDSA.toEthSignedMessageHash(
                    keccak256(abi.encodePacked(msg.sender, action))
                ),
                signature
            ) == signer,
            "invalid signature"
        );
        return true;
    }


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

    function safeMint(address to) internal whenNotPaused {
        uint256 tokenId = _tokenIdCounter.current();
        require(tokenId <= 2345);
        _safeMint(to, tokenId);
        _tokenIdCounter.increment();

        emit Minted(to);
    }

    function whitelistMint(bytes calldata signature) external whenNotPaused {
        require(!wlMintDone[msg.sender], "already minted once!");
        checkValidity(signature, "whitelist-mint");
        wlMintDone[msg.sender] = true;
        safeMint(msg.sender);
    }

    function batchMint(uint amount) public payable whenNotPaused {
        require(amount > 0, "you cant mint 0 nfts!");
        require(msg.value == 0.009 ether*amount, "not enough eth");
        require(amount<=10, "max amount is 10");
        uint i=0;
        for(i;i<amount;i++){
            safeMint(msg.sender);
        }
    }


    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);
        string memory baseURI = _baseURI();
        string memory basePlusId = bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : 'ar://lmqpKuBiAN3GimS3TopJV2f5hRq16ni_d6TkWpUVqpM';
        
        return string(abi.encodePacked(basePlusId, string(".json")));
    }



    function getCounter() public view returns (uint){
            return _tokenIdCounter.current();
        }

    function getSigner() public view returns (address){
        return signer;
    }

    //owner functions

    function changeURI(string memory _URI) external onlyOwner {
        URIlink = _URI;
    } 

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

    function widthdrawContractBalance() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"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":"to","type":"address"}],"name":"Minted","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":"URIlink","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"batchMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_URI","type":"string"}],"name":"changeURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"string","name":"action","type":"string"}],"name":"checkValidity","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"getCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"whitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"widthdrawContractBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"wlMintDone","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040516200569938038062005699833981810160405281019062000037919062000a3c565b6040518060400160405280600a81526020017f42756c6c6142756c6c61000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f42554c4c410000000000000000000000000000000000000000000000000000008152508160009081620000b4919062000ce8565b508060019081620000c6919062000ce8565b505050620000e9620000dd620001ae60201b60201c565b620001b660201b60201c565b6000600660146101000a81548160ff02191690831515021790555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000610bb890505b610bcf81116200017f576200016933826200027c60201b60201c565b8080620001769062000dfe565b9150506200014d565b62000196600a620002a260201b620014191760201c565b620001a6620002b860201b60201c565b50506200127c565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200029e8282604051806020016040528060008152506200032d60201b60201c565b5050565b6001816000016000828254019250508190555050565b620002c86200039b60201b60201c565b6001600660146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25862000314620001ae60201b60201c565b60405162000323919062000e5c565b60405180910390a1565b6200033f8383620003f060201b60201c565b6200035460008484846200063660201b60201c565b62000396576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200038d9062000f00565b60405180910390fd5b505050565b620003ab620007df60201b60201c565b15620003ee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003e59062000f72565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000462576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004599062000fe4565b60405180910390fd5b6200047381620007f660201b60201c565b15620004b6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004ad9062001056565b60405180910390fd5b620004cc6000838360016200083f60201b60201c565b620004dd81620007f660201b60201c565b1562000520576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005179062001056565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4620006326000838360016200096c60201b60201c565b5050565b6000620006648473ffffffffffffffffffffffffffffffffffffffff166200097260201b6200142f1760201c565b15620007d2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0262000696620001ae60201b60201c565b8786866040518563ffffffff1660e01b8152600401620006ba949392919062001123565b6020604051808303816000875af1925050508015620006f957506040513d601f19601f82011682018060405250810190620006f69190620011d4565b60015b62000781573d80600081146200072c576040519150601f19603f3d011682016040523d82523d6000602084013e62000731565b606091505b50600081510362000779576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007709062000f00565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050620007d7565b600190505b949350505050565b6000600660149054906101000a900460ff16905090565b60008073ffffffffffffffffffffffffffffffffffffffff1662000820836200099560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60018111156200096657600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614620008d75780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620008cf919062001206565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614620009655780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200095d919062001241565b925050819055505b5b50505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a0482620009d7565b9050919050565b62000a1681620009f7565b811462000a2257600080fd5b50565b60008151905062000a368162000a0b565b92915050565b60006020828403121562000a555762000a54620009d2565b5b600062000a658482850162000a25565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000af057607f821691505b60208210810362000b065762000b0562000aa8565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000b707fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000b31565b62000b7c868362000b31565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000bc962000bc362000bbd8462000b94565b62000b9e565b62000b94565b9050919050565b6000819050919050565b62000be58362000ba8565b62000bfd62000bf48262000bd0565b84845462000b3e565b825550505050565b600090565b62000c1462000c05565b62000c2181848462000bda565b505050565b5b8181101562000c495762000c3d60008262000c0a565b60018101905062000c27565b5050565b601f82111562000c985762000c628162000b0c565b62000c6d8462000b21565b8101602085101562000c7d578190505b62000c9562000c8c8562000b21565b83018262000c26565b50505b505050565b600082821c905092915050565b600062000cbd6000198460080262000c9d565b1980831691505092915050565b600062000cd8838362000caa565b9150826002028217905092915050565b62000cf38262000a6e565b67ffffffffffffffff81111562000d0f5762000d0e62000a79565b5b62000d1b825462000ad7565b62000d2882828562000c4d565b600060209050601f83116001811462000d60576000841562000d4b578287015190505b62000d57858262000cca565b86555062000dc7565b601f19841662000d708662000b0c565b60005b8281101562000d9a5784890151825560018201915060208501945060208101905062000d73565b8683101562000dba578489015162000db6601f89168262000caa565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000e0b8262000b94565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362000e405762000e3f62000dcf565b5b600182019050919050565b62000e5681620009f7565b82525050565b600060208201905062000e73600083018462000e4b565b92915050565b600082825260208201905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600062000ee860328362000e79565b915062000ef58262000e8a565b604082019050919050565b6000602082019050818103600083015262000f1b8162000ed9565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b600062000f5a60108362000e79565b915062000f678262000f22565b602082019050919050565b6000602082019050818103600083015262000f8d8162000f4b565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600062000fcc60208362000e79565b915062000fd98262000f94565b602082019050919050565b6000602082019050818103600083015262000fff8162000fbd565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006200103e601c8362000e79565b91506200104b8262001006565b602082019050919050565b6000602082019050818103600083015262001071816200102f565b9050919050565b620010838162000b94565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620010c5578082015181840152602081019050620010a8565b60008484015250505050565b6000601f19601f8301169050919050565b6000620010ef8262001089565b620010fb818562001094565b93506200110d818560208601620010a5565b6200111881620010d1565b840191505092915050565b60006080820190506200113a600083018762000e4b565b62001149602083018662000e4b565b62001158604083018562001078565b81810360608301526200116c8184620010e2565b905095945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b620011ae8162001177565b8114620011ba57600080fd5b50565b600081519050620011ce81620011a3565b92915050565b600060208284031215620011ed57620011ec620009d2565b5b6000620011fd84828501620011bd565b91505092915050565b6000620012138262000b94565b9150620012208362000b94565b92508282039050818111156200123b576200123a62000dcf565b5b92915050565b60006200124e8262000b94565b91506200125b8362000b94565b925082820190508082111562001276576200127562000dcf565b5b92915050565b61440d806200128c6000396000f3fe6080604052600436106101cd5760003560e01c806370a08231116100f757806395d89b4111610095578063c87b56dd11610064578063c87b56dd1461062f578063e5e01c111461066c578063e985e9c514610695578063f2fde38b146106d2576101cd565b806395d89b4114610575578063a22cb465146105a0578063b88d4fde146105c9578063bf90a5ce146105f2576101cd565b80638456cb59116100d15780638456cb59146104ec5780638467be0d146105035780638ada066e1461051f5780638da5cb5b1461054a576101cd565b806370a082311461046d578063715018a6146104aa5780637ac3c02f146104c1576101cd565b806330f899531161016f5780635c975abb1161013e5780635c975abb146103b15780636352211e146103dc5780636ab69ef6146104195780636c19e78314610444576101cd565b806330f899531461030b57806337bc4c0b146103485780633f4ba83a1461037157806342842e0e14610388576101cd565b8063095ea7b3116101ab578063095ea7b314610277578063238ac933146102a057806323b872dd146102cb57806330f1c6e0146102f4576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612a1f565b6106fb565b6040516102069190612a67565b60405180910390f35b34801561021b57600080fd5b506102246107dd565b6040516102319190612b12565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612b6a565b61086f565b60405161026e9190612bd8565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612c1f565b6108b5565b005b3480156102ac57600080fd5b506102b56109cc565b6040516102c29190612bd8565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed9190612c5f565b6109f2565b005b34801561030057600080fd5b50610309610a52565b005b34801561031757600080fd5b50610332600480360381019061032d9190612e47565b610aa3565b60405161033f9190612a67565b60405180910390f35b34801561035457600080fd5b5061036f600480360381019061036a9190612ec3565b610bbd565b005b34801561037d57600080fd5b50610386610cf8565b005b34801561039457600080fd5b506103af60048036038101906103aa9190612c5f565b610d0a565b005b3480156103bd57600080fd5b506103c6610d2a565b6040516103d39190612a67565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe9190612b6a565b610d41565b6040516104109190612bd8565b60405180910390f35b34801561042557600080fd5b5061042e610dc7565b60405161043b9190612b12565b60405180910390f35b34801561045057600080fd5b5061046b60048036038101906104669190612f10565b610e55565b005b34801561047957600080fd5b50610494600480360381019061048f9190612f10565b610ea1565b6040516104a19190612f4c565b60405180910390f35b3480156104b657600080fd5b506104bf610f58565b005b3480156104cd57600080fd5b506104d6610f6c565b6040516104e39190612bd8565b60405180910390f35b3480156104f857600080fd5b50610501610f96565b005b61051d60048036038101906105189190612b6a565b610fa8565b005b34801561052b57600080fd5b506105346110b6565b6040516105419190612f4c565b60405180910390f35b34801561055657600080fd5b5061055f6110c7565b60405161056c9190612bd8565b60405180910390f35b34801561058157600080fd5b5061058a6110f1565b6040516105979190612b12565b60405180910390f35b3480156105ac57600080fd5b506105c760048036038101906105c29190612f93565b611183565b005b3480156105d557600080fd5b506105f060048036038101906105eb9190613074565b611199565b005b3480156105fe57600080fd5b5061061960048036038101906106149190612f10565b6111fb565b6040516106269190612a67565b60405180910390f35b34801561063b57600080fd5b5061065660048036038101906106519190612b6a565b61121b565b6040516106639190612b12565b60405180910390f35b34801561067857600080fd5b50610693600480360381019061068e91906130f7565b6112e7565b005b3480156106a157600080fd5b506106bc60048036038101906106b79190613140565b611302565b6040516106c99190612a67565b60405180910390f35b3480156106de57600080fd5b506106f960048036038101906106f49190612f10565b611396565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107c657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107d657506107d582611452565b5b9050919050565b6060600080546107ec906131af565b80601f0160208091040260200160405190810160405280929190818152602001828054610818906131af565b80156108655780601f1061083a57610100808354040283529160200191610865565b820191906000526020600020905b81548152906001019060200180831161084857829003601f168201915b5050505050905090565b600061087a826114bc565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108c082610d41565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610930576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092790613252565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661094f611507565b73ffffffffffffffffffffffffffffffffffffffff16148061097e575061097d81610978611507565b611302565b5b6109bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b4906132e4565b60405180910390fd5b6109c7838361150f565b505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610a036109fd611507565b826115c8565b610a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3990613376565b60405180910390fd5b610a4d83838361165d565b505050565b610a5a611956565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610aa0573d6000803e3d6000fd5b50565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610b5c610b123385604051602001610af792919061341a565b604051602081830303815290604052805190602001206119d4565b86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611a04565b73ffffffffffffffffffffffffffffffffffffffff1614610bb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba99061348e565b60405180910390fd5b600190509392505050565b610bc5611a2b565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c49906134fa565b60405180910390fd5b610c9282826040518060400160405280600e81526020017f77686974656c6973742d6d696e74000000000000000000000000000000000000815250610aa3565b506001600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610cf433611a75565b5050565b610d00611956565b610d08611af5565b565b610d2583838360405180602001604052806000815250611199565b505050565b6000600660149054906101000a900460ff16905090565b600080610d4d83611b58565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610dbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db590613566565b60405180910390fd5b80915050919050565b60088054610dd4906131af565b80601f0160208091040260200160405190810160405280929190818152602001828054610e00906131af565b8015610e4d5780601f10610e2257610100808354040283529160200191610e4d565b820191906000526020600020905b815481529060010190602001808311610e3057829003601f168201915b505050505081565b610e5d611956565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f08906135f8565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f60611956565b610f6a6000611b95565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610f9e611956565b610fa6611c5b565b565b610fb0611a2b565b60008111610ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fea90613664565b60405180910390fd5b80661ff973cafa800061100691906136b3565b3414611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103e90613741565b60405180910390fd5b600a81111561108b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611082906137ad565b60405180910390fd5b60005b818110156110b25761109f33611a75565b80806110aa906137cd565b91505061108e565b5050565b60006110c2600a611cbe565b905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611100906131af565b80601f016020809104026020016040519081016040528092919081815260200182805461112c906131af565b80156111795780601f1061114e57610100808354040283529160200191611179565b820191906000526020600020905b81548152906001019060200180831161115c57829003601f168201915b5050505050905090565b61119561118e611507565b8383611ccc565b5050565b6111aa6111a4611507565b836115c8565b6111e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e090613376565b60405180910390fd5b6111f584848484611e38565b50505050565b60096020528060005260406000206000915054906101000a900460ff1681565b6060611226826114bc565b6000611230611e94565b905060008082511161125a576040518060600160405280603081526020016143a860309139611285565b8161126485611f26565b604051602001611275929190613815565b6040516020818303038152906040525b9050806040518060400160405280600581526020017f2e6a736f6e0000000000000000000000000000000000000000000000000000008152506040516020016112cf929190613815565b60405160208183030381529060405292505050919050565b6112ef611956565b80600890816112fe91906139e5565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61139e611956565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361140d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140490613b29565b60405180910390fd5b61141681611b95565b50565b6001816000016000828254019250508190555050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6114c581611ff4565b611504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fb90613566565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661158283610d41565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806115d483610d41565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061161657506116158185611302565b5b8061165457508373ffffffffffffffffffffffffffffffffffffffff1661163c8461086f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661167d82610d41565b73ffffffffffffffffffffffffffffffffffffffff16146116d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ca90613bbb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173990613c4d565b60405180910390fd5b61174f8383836001612035565b8273ffffffffffffffffffffffffffffffffffffffff1661176f82610d41565b73ffffffffffffffffffffffffffffffffffffffff16146117c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bc90613bbb565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611951838383600161215b565b505050565b61195e611507565b73ffffffffffffffffffffffffffffffffffffffff1661197c6110c7565b73ffffffffffffffffffffffffffffffffffffffff16146119d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c990613cb9565b60405180910390fd5b565b6000816040516020016119e79190613d50565b604051602081830303815290604052805190602001209050919050565b6000806000611a138585612161565b91509150611a20816121b2565b819250505092915050565b611a33610d2a565b15611a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6a90613dc2565b60405180910390fd5b565b611a7d611a2b565b6000611a89600a611cbe565b9050610929811115611a9a57600080fd5b611aa48282612318565b611aae600a611419565b8173ffffffffffffffffffffffffffffffffffffffff167f90ddedd5a25821bba11fbb98de02ec1f75c1be90ae147d6450ce873e7b78b5d860405160405180910390a25050565b611afd612336565b6000600660146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611b41611507565b604051611b4e9190612bd8565b60405180910390a1565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611c63611a2b565b6001600660146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611ca7611507565b604051611cb49190612bd8565b60405180910390a1565b600081600001549050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3190613e2e565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e2b9190612a67565b60405180910390a3505050565b611e4384848461165d565b611e4f8484848461237f565b611e8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8590613ec0565b60405180910390fd5b50505050565b606060088054611ea3906131af565b80601f0160208091040260200160405190810160405280929190818152602001828054611ecf906131af565b8015611f1c5780601f10611ef157610100808354040283529160200191611f1c565b820191906000526020600020905b815481529060010190602001808311611eff57829003601f168201915b5050505050905090565b606060006001611f3584612506565b01905060008167ffffffffffffffff811115611f5457611f53612d1c565b5b6040519080825280601f01601f191660200182016040528015611f865781602001600182028036833780820191505090505b509050600082602001820190505b600115611fe9578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611fdd57611fdc613ee0565b5b04945060008503611f94575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff1661201683611b58565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600181111561215557600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146120c95780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120c19190613f0f565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146121545780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461214c9190613f43565b925050819055505b5b50505050565b50505050565b60008060418351036121a25760008060006020860151925060408601519150606086015160001a905061219687828585612659565b945094505050506121ab565b60006002915091505b9250929050565b600060048111156121c6576121c5613f77565b5b8160048111156121d9576121d8613f77565b5b031561231557600160048111156121f3576121f2613f77565b5b81600481111561220657612205613f77565b5b03612246576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223d90613ff2565b60405180910390fd5b6002600481111561225a57612259613f77565b5b81600481111561226d5761226c613f77565b5b036122ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a49061405e565b60405180910390fd5b600360048111156122c1576122c0613f77565b5b8160048111156122d4576122d3613f77565b5b03612314576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230b906140f0565b60405180910390fd5b5b50565b61233282826040518060200160405280600081525061273b565b5050565b61233e610d2a565b61237d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123749061415c565b60405180910390fd5b565b60006123a08473ffffffffffffffffffffffffffffffffffffffff1661142f565b156124f9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123c9611507565b8786866040518563ffffffff1660e01b81526004016123eb94939291906141d1565b6020604051808303816000875af192505050801561242757506040513d601f19601f820116820180604052508101906124249190614232565b60015b6124a9573d8060008114612457576040519150601f19603f3d011682016040523d82523d6000602084013e61245c565b606091505b5060008151036124a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249890613ec0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124fe565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612564577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161255a57612559613ee0565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106125a1576d04ee2d6d415b85acef8100000000838161259757612596613ee0565b5b0492506020810190505b662386f26fc1000083106125d057662386f26fc1000083816125c6576125c5613ee0565b5b0492506010810190505b6305f5e10083106125f9576305f5e10083816125ef576125ee613ee0565b5b0492506008810190505b612710831061261e57612710838161261457612613613ee0565b5b0492506004810190505b60648310612641576064838161263757612636613ee0565b5b0492506002810190505b600a8310612650576001810190505b80915050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612694576000600391509150612732565b6000600187878787604051600081526020016040526040516126b9949392919061428a565b6020604051602081039080840390855afa1580156126db573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361272957600060019250925050612732565b80600092509250505b94509492505050565b6127458383612796565b612752600084848461237f565b612791576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278890613ec0565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fc9061431b565b60405180910390fd5b61280e81611ff4565b1561284e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284590614387565b60405180910390fd5b61285c600083836001612035565b61286581611ff4565b156128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c90614387565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129af60008383600161215b565b5050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129fc816129c7565b8114612a0757600080fd5b50565b600081359050612a19816129f3565b92915050565b600060208284031215612a3557612a346129bd565b5b6000612a4384828501612a0a565b91505092915050565b60008115159050919050565b612a6181612a4c565b82525050565b6000602082019050612a7c6000830184612a58565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612abc578082015181840152602081019050612aa1565b60008484015250505050565b6000601f19601f8301169050919050565b6000612ae482612a82565b612aee8185612a8d565b9350612afe818560208601612a9e565b612b0781612ac8565b840191505092915050565b60006020820190508181036000830152612b2c8184612ad9565b905092915050565b6000819050919050565b612b4781612b34565b8114612b5257600080fd5b50565b600081359050612b6481612b3e565b92915050565b600060208284031215612b8057612b7f6129bd565b5b6000612b8e84828501612b55565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612bc282612b97565b9050919050565b612bd281612bb7565b82525050565b6000602082019050612bed6000830184612bc9565b92915050565b612bfc81612bb7565b8114612c0757600080fd5b50565b600081359050612c1981612bf3565b92915050565b60008060408385031215612c3657612c356129bd565b5b6000612c4485828601612c0a565b9250506020612c5585828601612b55565b9150509250929050565b600080600060608486031215612c7857612c776129bd565b5b6000612c8686828701612c0a565b9350506020612c9786828701612c0a565b9250506040612ca886828701612b55565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f840112612cd757612cd6612cb2565b5b8235905067ffffffffffffffff811115612cf457612cf3612cb7565b5b602083019150836001820283011115612d1057612d0f612cbc565b5b9250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612d5482612ac8565b810181811067ffffffffffffffff82111715612d7357612d72612d1c565b5b80604052505050565b6000612d866129b3565b9050612d928282612d4b565b919050565b600067ffffffffffffffff821115612db257612db1612d1c565b5b612dbb82612ac8565b9050602081019050919050565b82818337600083830152505050565b6000612dea612de584612d97565b612d7c565b905082815260208101848484011115612e0657612e05612d17565b5b612e11848285612dc8565b509392505050565b600082601f830112612e2e57612e2d612cb2565b5b8135612e3e848260208601612dd7565b91505092915050565b600080600060408486031215612e6057612e5f6129bd565b5b600084013567ffffffffffffffff811115612e7e57612e7d6129c2565b5b612e8a86828701612cc1565b9350935050602084013567ffffffffffffffff811115612ead57612eac6129c2565b5b612eb986828701612e19565b9150509250925092565b60008060208385031215612eda57612ed96129bd565b5b600083013567ffffffffffffffff811115612ef857612ef76129c2565b5b612f0485828601612cc1565b92509250509250929050565b600060208284031215612f2657612f256129bd565b5b6000612f3484828501612c0a565b91505092915050565b612f4681612b34565b82525050565b6000602082019050612f616000830184612f3d565b92915050565b612f7081612a4c565b8114612f7b57600080fd5b50565b600081359050612f8d81612f67565b92915050565b60008060408385031215612faa57612fa96129bd565b5b6000612fb885828601612c0a565b9250506020612fc985828601612f7e565b9150509250929050565b600067ffffffffffffffff821115612fee57612fed612d1c565b5b612ff782612ac8565b9050602081019050919050565b600061301761301284612fd3565b612d7c565b90508281526020810184848401111561303357613032612d17565b5b61303e848285612dc8565b509392505050565b600082601f83011261305b5761305a612cb2565b5b813561306b848260208601613004565b91505092915050565b6000806000806080858703121561308e5761308d6129bd565b5b600061309c87828801612c0a565b94505060206130ad87828801612c0a565b93505060406130be87828801612b55565b925050606085013567ffffffffffffffff8111156130df576130de6129c2565b5b6130eb87828801613046565b91505092959194509250565b60006020828403121561310d5761310c6129bd565b5b600082013567ffffffffffffffff81111561312b5761312a6129c2565b5b61313784828501612e19565b91505092915050565b60008060408385031215613157576131566129bd565b5b600061316585828601612c0a565b925050602061317685828601612c0a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806131c757607f821691505b6020821081036131da576131d9613180565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061323c602183612a8d565b9150613247826131e0565b604082019050919050565b6000602082019050818103600083015261326b8161322f565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006132ce603d83612a8d565b91506132d982613272565b604082019050919050565b600060208201905081810360008301526132fd816132c1565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613360602d83612a8d565b915061336b82613304565b604082019050919050565b6000602082019050818103600083015261338f81613353565b9050919050565b60008160601b9050919050565b60006133ae82613396565b9050919050565b60006133c0826133a3565b9050919050565b6133d86133d382612bb7565b6133b5565b82525050565b600081905092915050565b60006133f482612a82565b6133fe81856133de565b935061340e818560208601612a9e565b80840191505092915050565b600061342682856133c7565b60148201915061343682846133e9565b91508190509392505050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b6000613478601183612a8d565b915061348382613442565b602082019050919050565b600060208201905081810360008301526134a78161346b565b9050919050565b7f616c7265616479206d696e746564206f6e636521000000000000000000000000600082015250565b60006134e4601483612a8d565b91506134ef826134ae565b602082019050919050565b60006020820190508181036000830152613513816134d7565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613550601883612a8d565b915061355b8261351a565b602082019050919050565b6000602082019050818103600083015261357f81613543565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006135e2602983612a8d565b91506135ed82613586565b604082019050919050565b60006020820190508181036000830152613611816135d5565b9050919050565b7f796f752063616e74206d696e742030206e667473210000000000000000000000600082015250565b600061364e601583612a8d565b915061365982613618565b602082019050919050565b6000602082019050818103600083015261367d81613641565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006136be82612b34565b91506136c983612b34565b92508282026136d781612b34565b915082820484148315176136ee576136ed613684565b5b5092915050565b7f6e6f7420656e6f75676820657468000000000000000000000000000000000000600082015250565b600061372b600e83612a8d565b9150613736826136f5565b602082019050919050565b6000602082019050818103600083015261375a8161371e565b9050919050565b7f6d617820616d6f756e7420697320313000000000000000000000000000000000600082015250565b6000613797601083612a8d565b91506137a282613761565b602082019050919050565b600060208201905081810360008301526137c68161378a565b9050919050565b60006137d882612b34565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361380a57613809613684565b5b600182019050919050565b600061382182856133e9565b915061382d82846133e9565b91508190509392505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261389b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261385e565b6138a5868361385e565b95508019841693508086168417925050509392505050565b6000819050919050565b60006138e26138dd6138d884612b34565b6138bd565b612b34565b9050919050565b6000819050919050565b6138fc836138c7565b613910613908826138e9565b84845461386b565b825550505050565b600090565b613925613918565b6139308184846138f3565b505050565b5b818110156139545761394960008261391d565b600181019050613936565b5050565b601f8211156139995761396a81613839565b6139738461384e565b81016020851015613982578190505b61399661398e8561384e565b830182613935565b50505b505050565b600082821c905092915050565b60006139bc6000198460080261399e565b1980831691505092915050565b60006139d583836139ab565b9150826002028217905092915050565b6139ee82612a82565b67ffffffffffffffff811115613a0757613a06612d1c565b5b613a1182546131af565b613a1c828285613958565b600060209050601f831160018114613a4f5760008415613a3d578287015190505b613a4785826139c9565b865550613aaf565b601f198416613a5d86613839565b60005b82811015613a8557848901518255600182019150602085019450602081019050613a60565b86831015613aa25784890151613a9e601f8916826139ab565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613b13602683612a8d565b9150613b1e82613ab7565b604082019050919050565b60006020820190508181036000830152613b4281613b06565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613ba5602583612a8d565b9150613bb082613b49565b604082019050919050565b60006020820190508181036000830152613bd481613b98565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613c37602483612a8d565b9150613c4282613bdb565b604082019050919050565b60006020820190508181036000830152613c6681613c2a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613ca3602083612a8d565b9150613cae82613c6d565b602082019050919050565b60006020820190508181036000830152613cd281613c96565b9050919050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000613d0f601c836133de565b9150613d1a82613cd9565b601c82019050919050565b6000819050919050565b6000819050919050565b613d4a613d4582613d25565b613d2f565b82525050565b6000613d5b82613d02565b9150613d678284613d39565b60208201915081905092915050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000613dac601083612a8d565b9150613db782613d76565b602082019050919050565b60006020820190508181036000830152613ddb81613d9f565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613e18601983612a8d565b9150613e2382613de2565b602082019050919050565b60006020820190508181036000830152613e4781613e0b565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613eaa603283612a8d565b9150613eb582613e4e565b604082019050919050565b60006020820190508181036000830152613ed981613e9d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613f1a82612b34565b9150613f2583612b34565b9250828203905081811115613f3d57613f3c613684565b5b92915050565b6000613f4e82612b34565b9150613f5983612b34565b9250828201905080821115613f7157613f70613684565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000613fdc601883612a8d565b9150613fe782613fa6565b602082019050919050565b6000602082019050818103600083015261400b81613fcf565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000614048601f83612a8d565b915061405382614012565b602082019050919050565b600060208201905081810360008301526140778161403b565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006140da602283612a8d565b91506140e58261407e565b604082019050919050565b60006020820190508181036000830152614109816140cd565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614146601483612a8d565b915061415182614110565b602082019050919050565b6000602082019050818103600083015261417581614139565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006141a38261417c565b6141ad8185614187565b93506141bd818560208601612a9e565b6141c681612ac8565b840191505092915050565b60006080820190506141e66000830187612bc9565b6141f36020830186612bc9565b6142006040830185612f3d565b81810360608301526142128184614198565b905095945050505050565b60008151905061422c816129f3565b92915050565b600060208284031215614248576142476129bd565b5b60006142568482850161421d565b91505092915050565b61426881613d25565b82525050565b600060ff82169050919050565b6142848161426e565b82525050565b600060808201905061429f600083018761425f565b6142ac602083018661427b565b6142b9604083018561425f565b6142c6606083018461425f565b95945050505050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614305602083612a8d565b9150614310826142cf565b602082019050919050565b60006020820190508181036000830152614334816142f8565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614371601c83612a8d565b915061437c8261433b565b602082019050919050565b600060208201905081810360008301526143a081614364565b905091905056fe61723a2f2f6c6d71704b754269414e3347696d5333546f704a5632663568527131366e695f6436546b5770555671704da26469706673582212205dc7d6054c67cd2de7f0d9681a75bfd6ecbb16264bdecd4fc82c1b8744798ee664736f6c634300081100330000000000000000000000008ca2c7e7547c57a5c0e2cb47480cc3a65894c9ae

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c806370a08231116100f757806395d89b4111610095578063c87b56dd11610064578063c87b56dd1461062f578063e5e01c111461066c578063e985e9c514610695578063f2fde38b146106d2576101cd565b806395d89b4114610575578063a22cb465146105a0578063b88d4fde146105c9578063bf90a5ce146105f2576101cd565b80638456cb59116100d15780638456cb59146104ec5780638467be0d146105035780638ada066e1461051f5780638da5cb5b1461054a576101cd565b806370a082311461046d578063715018a6146104aa5780637ac3c02f146104c1576101cd565b806330f899531161016f5780635c975abb1161013e5780635c975abb146103b15780636352211e146103dc5780636ab69ef6146104195780636c19e78314610444576101cd565b806330f899531461030b57806337bc4c0b146103485780633f4ba83a1461037157806342842e0e14610388576101cd565b8063095ea7b3116101ab578063095ea7b314610277578063238ac933146102a057806323b872dd146102cb57806330f1c6e0146102f4576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612a1f565b6106fb565b6040516102069190612a67565b60405180910390f35b34801561021b57600080fd5b506102246107dd565b6040516102319190612b12565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612b6a565b61086f565b60405161026e9190612bd8565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612c1f565b6108b5565b005b3480156102ac57600080fd5b506102b56109cc565b6040516102c29190612bd8565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed9190612c5f565b6109f2565b005b34801561030057600080fd5b50610309610a52565b005b34801561031757600080fd5b50610332600480360381019061032d9190612e47565b610aa3565b60405161033f9190612a67565b60405180910390f35b34801561035457600080fd5b5061036f600480360381019061036a9190612ec3565b610bbd565b005b34801561037d57600080fd5b50610386610cf8565b005b34801561039457600080fd5b506103af60048036038101906103aa9190612c5f565b610d0a565b005b3480156103bd57600080fd5b506103c6610d2a565b6040516103d39190612a67565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe9190612b6a565b610d41565b6040516104109190612bd8565b60405180910390f35b34801561042557600080fd5b5061042e610dc7565b60405161043b9190612b12565b60405180910390f35b34801561045057600080fd5b5061046b60048036038101906104669190612f10565b610e55565b005b34801561047957600080fd5b50610494600480360381019061048f9190612f10565b610ea1565b6040516104a19190612f4c565b60405180910390f35b3480156104b657600080fd5b506104bf610f58565b005b3480156104cd57600080fd5b506104d6610f6c565b6040516104e39190612bd8565b60405180910390f35b3480156104f857600080fd5b50610501610f96565b005b61051d60048036038101906105189190612b6a565b610fa8565b005b34801561052b57600080fd5b506105346110b6565b6040516105419190612f4c565b60405180910390f35b34801561055657600080fd5b5061055f6110c7565b60405161056c9190612bd8565b60405180910390f35b34801561058157600080fd5b5061058a6110f1565b6040516105979190612b12565b60405180910390f35b3480156105ac57600080fd5b506105c760048036038101906105c29190612f93565b611183565b005b3480156105d557600080fd5b506105f060048036038101906105eb9190613074565b611199565b005b3480156105fe57600080fd5b5061061960048036038101906106149190612f10565b6111fb565b6040516106269190612a67565b60405180910390f35b34801561063b57600080fd5b5061065660048036038101906106519190612b6a565b61121b565b6040516106639190612b12565b60405180910390f35b34801561067857600080fd5b50610693600480360381019061068e91906130f7565b6112e7565b005b3480156106a157600080fd5b506106bc60048036038101906106b79190613140565b611302565b6040516106c99190612a67565b60405180910390f35b3480156106de57600080fd5b506106f960048036038101906106f49190612f10565b611396565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107c657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107d657506107d582611452565b5b9050919050565b6060600080546107ec906131af565b80601f0160208091040260200160405190810160405280929190818152602001828054610818906131af565b80156108655780601f1061083a57610100808354040283529160200191610865565b820191906000526020600020905b81548152906001019060200180831161084857829003601f168201915b5050505050905090565b600061087a826114bc565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108c082610d41565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610930576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092790613252565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661094f611507565b73ffffffffffffffffffffffffffffffffffffffff16148061097e575061097d81610978611507565b611302565b5b6109bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b4906132e4565b60405180910390fd5b6109c7838361150f565b505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610a036109fd611507565b826115c8565b610a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3990613376565b60405180910390fd5b610a4d83838361165d565b505050565b610a5a611956565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610aa0573d6000803e3d6000fd5b50565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610b5c610b123385604051602001610af792919061341a565b604051602081830303815290604052805190602001206119d4565b86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611a04565b73ffffffffffffffffffffffffffffffffffffffff1614610bb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba99061348e565b60405180910390fd5b600190509392505050565b610bc5611a2b565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c49906134fa565b60405180910390fd5b610c9282826040518060400160405280600e81526020017f77686974656c6973742d6d696e74000000000000000000000000000000000000815250610aa3565b506001600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610cf433611a75565b5050565b610d00611956565b610d08611af5565b565b610d2583838360405180602001604052806000815250611199565b505050565b6000600660149054906101000a900460ff16905090565b600080610d4d83611b58565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610dbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db590613566565b60405180910390fd5b80915050919050565b60088054610dd4906131af565b80601f0160208091040260200160405190810160405280929190818152602001828054610e00906131af565b8015610e4d5780601f10610e2257610100808354040283529160200191610e4d565b820191906000526020600020905b815481529060010190602001808311610e3057829003601f168201915b505050505081565b610e5d611956565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f08906135f8565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f60611956565b610f6a6000611b95565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610f9e611956565b610fa6611c5b565b565b610fb0611a2b565b60008111610ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fea90613664565b60405180910390fd5b80661ff973cafa800061100691906136b3565b3414611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103e90613741565b60405180910390fd5b600a81111561108b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611082906137ad565b60405180910390fd5b60005b818110156110b25761109f33611a75565b80806110aa906137cd565b91505061108e565b5050565b60006110c2600a611cbe565b905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611100906131af565b80601f016020809104026020016040519081016040528092919081815260200182805461112c906131af565b80156111795780601f1061114e57610100808354040283529160200191611179565b820191906000526020600020905b81548152906001019060200180831161115c57829003601f168201915b5050505050905090565b61119561118e611507565b8383611ccc565b5050565b6111aa6111a4611507565b836115c8565b6111e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e090613376565b60405180910390fd5b6111f584848484611e38565b50505050565b60096020528060005260406000206000915054906101000a900460ff1681565b6060611226826114bc565b6000611230611e94565b905060008082511161125a576040518060600160405280603081526020016143a860309139611285565b8161126485611f26565b604051602001611275929190613815565b6040516020818303038152906040525b9050806040518060400160405280600581526020017f2e6a736f6e0000000000000000000000000000000000000000000000000000008152506040516020016112cf929190613815565b60405160208183030381529060405292505050919050565b6112ef611956565b80600890816112fe91906139e5565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61139e611956565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361140d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140490613b29565b60405180910390fd5b61141681611b95565b50565b6001816000016000828254019250508190555050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6114c581611ff4565b611504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fb90613566565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661158283610d41565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806115d483610d41565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061161657506116158185611302565b5b8061165457508373ffffffffffffffffffffffffffffffffffffffff1661163c8461086f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661167d82610d41565b73ffffffffffffffffffffffffffffffffffffffff16146116d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ca90613bbb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173990613c4d565b60405180910390fd5b61174f8383836001612035565b8273ffffffffffffffffffffffffffffffffffffffff1661176f82610d41565b73ffffffffffffffffffffffffffffffffffffffff16146117c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bc90613bbb565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611951838383600161215b565b505050565b61195e611507565b73ffffffffffffffffffffffffffffffffffffffff1661197c6110c7565b73ffffffffffffffffffffffffffffffffffffffff16146119d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c990613cb9565b60405180910390fd5b565b6000816040516020016119e79190613d50565b604051602081830303815290604052805190602001209050919050565b6000806000611a138585612161565b91509150611a20816121b2565b819250505092915050565b611a33610d2a565b15611a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6a90613dc2565b60405180910390fd5b565b611a7d611a2b565b6000611a89600a611cbe565b9050610929811115611a9a57600080fd5b611aa48282612318565b611aae600a611419565b8173ffffffffffffffffffffffffffffffffffffffff167f90ddedd5a25821bba11fbb98de02ec1f75c1be90ae147d6450ce873e7b78b5d860405160405180910390a25050565b611afd612336565b6000600660146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611b41611507565b604051611b4e9190612bd8565b60405180910390a1565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611c63611a2b565b6001600660146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611ca7611507565b604051611cb49190612bd8565b60405180910390a1565b600081600001549050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3190613e2e565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e2b9190612a67565b60405180910390a3505050565b611e4384848461165d565b611e4f8484848461237f565b611e8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8590613ec0565b60405180910390fd5b50505050565b606060088054611ea3906131af565b80601f0160208091040260200160405190810160405280929190818152602001828054611ecf906131af565b8015611f1c5780601f10611ef157610100808354040283529160200191611f1c565b820191906000526020600020905b815481529060010190602001808311611eff57829003601f168201915b5050505050905090565b606060006001611f3584612506565b01905060008167ffffffffffffffff811115611f5457611f53612d1c565b5b6040519080825280601f01601f191660200182016040528015611f865781602001600182028036833780820191505090505b509050600082602001820190505b600115611fe9578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611fdd57611fdc613ee0565b5b04945060008503611f94575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff1661201683611b58565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600181111561215557600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146120c95780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120c19190613f0f565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146121545780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461214c9190613f43565b925050819055505b5b50505050565b50505050565b60008060418351036121a25760008060006020860151925060408601519150606086015160001a905061219687828585612659565b945094505050506121ab565b60006002915091505b9250929050565b600060048111156121c6576121c5613f77565b5b8160048111156121d9576121d8613f77565b5b031561231557600160048111156121f3576121f2613f77565b5b81600481111561220657612205613f77565b5b03612246576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223d90613ff2565b60405180910390fd5b6002600481111561225a57612259613f77565b5b81600481111561226d5761226c613f77565b5b036122ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a49061405e565b60405180910390fd5b600360048111156122c1576122c0613f77565b5b8160048111156122d4576122d3613f77565b5b03612314576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230b906140f0565b60405180910390fd5b5b50565b61233282826040518060200160405280600081525061273b565b5050565b61233e610d2a565b61237d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123749061415c565b60405180910390fd5b565b60006123a08473ffffffffffffffffffffffffffffffffffffffff1661142f565b156124f9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123c9611507565b8786866040518563ffffffff1660e01b81526004016123eb94939291906141d1565b6020604051808303816000875af192505050801561242757506040513d601f19601f820116820180604052508101906124249190614232565b60015b6124a9573d8060008114612457576040519150601f19603f3d011682016040523d82523d6000602084013e61245c565b606091505b5060008151036124a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249890613ec0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124fe565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612564577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161255a57612559613ee0565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106125a1576d04ee2d6d415b85acef8100000000838161259757612596613ee0565b5b0492506020810190505b662386f26fc1000083106125d057662386f26fc1000083816125c6576125c5613ee0565b5b0492506010810190505b6305f5e10083106125f9576305f5e10083816125ef576125ee613ee0565b5b0492506008810190505b612710831061261e57612710838161261457612613613ee0565b5b0492506004810190505b60648310612641576064838161263757612636613ee0565b5b0492506002810190505b600a8310612650576001810190505b80915050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612694576000600391509150612732565b6000600187878787604051600081526020016040526040516126b9949392919061428a565b6020604051602081039080840390855afa1580156126db573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361272957600060019250925050612732565b80600092509250505b94509492505050565b6127458383612796565b612752600084848461237f565b612791576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278890613ec0565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fc9061431b565b60405180910390fd5b61280e81611ff4565b1561284e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284590614387565b60405180910390fd5b61285c600083836001612035565b61286581611ff4565b156128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c90614387565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129af60008383600161215b565b5050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129fc816129c7565b8114612a0757600080fd5b50565b600081359050612a19816129f3565b92915050565b600060208284031215612a3557612a346129bd565b5b6000612a4384828501612a0a565b91505092915050565b60008115159050919050565b612a6181612a4c565b82525050565b6000602082019050612a7c6000830184612a58565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612abc578082015181840152602081019050612aa1565b60008484015250505050565b6000601f19601f8301169050919050565b6000612ae482612a82565b612aee8185612a8d565b9350612afe818560208601612a9e565b612b0781612ac8565b840191505092915050565b60006020820190508181036000830152612b2c8184612ad9565b905092915050565b6000819050919050565b612b4781612b34565b8114612b5257600080fd5b50565b600081359050612b6481612b3e565b92915050565b600060208284031215612b8057612b7f6129bd565b5b6000612b8e84828501612b55565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612bc282612b97565b9050919050565b612bd281612bb7565b82525050565b6000602082019050612bed6000830184612bc9565b92915050565b612bfc81612bb7565b8114612c0757600080fd5b50565b600081359050612c1981612bf3565b92915050565b60008060408385031215612c3657612c356129bd565b5b6000612c4485828601612c0a565b9250506020612c5585828601612b55565b9150509250929050565b600080600060608486031215612c7857612c776129bd565b5b6000612c8686828701612c0a565b9350506020612c9786828701612c0a565b9250506040612ca886828701612b55565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f840112612cd757612cd6612cb2565b5b8235905067ffffffffffffffff811115612cf457612cf3612cb7565b5b602083019150836001820283011115612d1057612d0f612cbc565b5b9250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612d5482612ac8565b810181811067ffffffffffffffff82111715612d7357612d72612d1c565b5b80604052505050565b6000612d866129b3565b9050612d928282612d4b565b919050565b600067ffffffffffffffff821115612db257612db1612d1c565b5b612dbb82612ac8565b9050602081019050919050565b82818337600083830152505050565b6000612dea612de584612d97565b612d7c565b905082815260208101848484011115612e0657612e05612d17565b5b612e11848285612dc8565b509392505050565b600082601f830112612e2e57612e2d612cb2565b5b8135612e3e848260208601612dd7565b91505092915050565b600080600060408486031215612e6057612e5f6129bd565b5b600084013567ffffffffffffffff811115612e7e57612e7d6129c2565b5b612e8a86828701612cc1565b9350935050602084013567ffffffffffffffff811115612ead57612eac6129c2565b5b612eb986828701612e19565b9150509250925092565b60008060208385031215612eda57612ed96129bd565b5b600083013567ffffffffffffffff811115612ef857612ef76129c2565b5b612f0485828601612cc1565b92509250509250929050565b600060208284031215612f2657612f256129bd565b5b6000612f3484828501612c0a565b91505092915050565b612f4681612b34565b82525050565b6000602082019050612f616000830184612f3d565b92915050565b612f7081612a4c565b8114612f7b57600080fd5b50565b600081359050612f8d81612f67565b92915050565b60008060408385031215612faa57612fa96129bd565b5b6000612fb885828601612c0a565b9250506020612fc985828601612f7e565b9150509250929050565b600067ffffffffffffffff821115612fee57612fed612d1c565b5b612ff782612ac8565b9050602081019050919050565b600061301761301284612fd3565b612d7c565b90508281526020810184848401111561303357613032612d17565b5b61303e848285612dc8565b509392505050565b600082601f83011261305b5761305a612cb2565b5b813561306b848260208601613004565b91505092915050565b6000806000806080858703121561308e5761308d6129bd565b5b600061309c87828801612c0a565b94505060206130ad87828801612c0a565b93505060406130be87828801612b55565b925050606085013567ffffffffffffffff8111156130df576130de6129c2565b5b6130eb87828801613046565b91505092959194509250565b60006020828403121561310d5761310c6129bd565b5b600082013567ffffffffffffffff81111561312b5761312a6129c2565b5b61313784828501612e19565b91505092915050565b60008060408385031215613157576131566129bd565b5b600061316585828601612c0a565b925050602061317685828601612c0a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806131c757607f821691505b6020821081036131da576131d9613180565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061323c602183612a8d565b9150613247826131e0565b604082019050919050565b6000602082019050818103600083015261326b8161322f565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006132ce603d83612a8d565b91506132d982613272565b604082019050919050565b600060208201905081810360008301526132fd816132c1565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613360602d83612a8d565b915061336b82613304565b604082019050919050565b6000602082019050818103600083015261338f81613353565b9050919050565b60008160601b9050919050565b60006133ae82613396565b9050919050565b60006133c0826133a3565b9050919050565b6133d86133d382612bb7565b6133b5565b82525050565b600081905092915050565b60006133f482612a82565b6133fe81856133de565b935061340e818560208601612a9e565b80840191505092915050565b600061342682856133c7565b60148201915061343682846133e9565b91508190509392505050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b6000613478601183612a8d565b915061348382613442565b602082019050919050565b600060208201905081810360008301526134a78161346b565b9050919050565b7f616c7265616479206d696e746564206f6e636521000000000000000000000000600082015250565b60006134e4601483612a8d565b91506134ef826134ae565b602082019050919050565b60006020820190508181036000830152613513816134d7565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613550601883612a8d565b915061355b8261351a565b602082019050919050565b6000602082019050818103600083015261357f81613543565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006135e2602983612a8d565b91506135ed82613586565b604082019050919050565b60006020820190508181036000830152613611816135d5565b9050919050565b7f796f752063616e74206d696e742030206e667473210000000000000000000000600082015250565b600061364e601583612a8d565b915061365982613618565b602082019050919050565b6000602082019050818103600083015261367d81613641565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006136be82612b34565b91506136c983612b34565b92508282026136d781612b34565b915082820484148315176136ee576136ed613684565b5b5092915050565b7f6e6f7420656e6f75676820657468000000000000000000000000000000000000600082015250565b600061372b600e83612a8d565b9150613736826136f5565b602082019050919050565b6000602082019050818103600083015261375a8161371e565b9050919050565b7f6d617820616d6f756e7420697320313000000000000000000000000000000000600082015250565b6000613797601083612a8d565b91506137a282613761565b602082019050919050565b600060208201905081810360008301526137c68161378a565b9050919050565b60006137d882612b34565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361380a57613809613684565b5b600182019050919050565b600061382182856133e9565b915061382d82846133e9565b91508190509392505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261389b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261385e565b6138a5868361385e565b95508019841693508086168417925050509392505050565b6000819050919050565b60006138e26138dd6138d884612b34565b6138bd565b612b34565b9050919050565b6000819050919050565b6138fc836138c7565b613910613908826138e9565b84845461386b565b825550505050565b600090565b613925613918565b6139308184846138f3565b505050565b5b818110156139545761394960008261391d565b600181019050613936565b5050565b601f8211156139995761396a81613839565b6139738461384e565b81016020851015613982578190505b61399661398e8561384e565b830182613935565b50505b505050565b600082821c905092915050565b60006139bc6000198460080261399e565b1980831691505092915050565b60006139d583836139ab565b9150826002028217905092915050565b6139ee82612a82565b67ffffffffffffffff811115613a0757613a06612d1c565b5b613a1182546131af565b613a1c828285613958565b600060209050601f831160018114613a4f5760008415613a3d578287015190505b613a4785826139c9565b865550613aaf565b601f198416613a5d86613839565b60005b82811015613a8557848901518255600182019150602085019450602081019050613a60565b86831015613aa25784890151613a9e601f8916826139ab565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613b13602683612a8d565b9150613b1e82613ab7565b604082019050919050565b60006020820190508181036000830152613b4281613b06565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613ba5602583612a8d565b9150613bb082613b49565b604082019050919050565b60006020820190508181036000830152613bd481613b98565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613c37602483612a8d565b9150613c4282613bdb565b604082019050919050565b60006020820190508181036000830152613c6681613c2a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613ca3602083612a8d565b9150613cae82613c6d565b602082019050919050565b60006020820190508181036000830152613cd281613c96565b9050919050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000613d0f601c836133de565b9150613d1a82613cd9565b601c82019050919050565b6000819050919050565b6000819050919050565b613d4a613d4582613d25565b613d2f565b82525050565b6000613d5b82613d02565b9150613d678284613d39565b60208201915081905092915050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000613dac601083612a8d565b9150613db782613d76565b602082019050919050565b60006020820190508181036000830152613ddb81613d9f565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613e18601983612a8d565b9150613e2382613de2565b602082019050919050565b60006020820190508181036000830152613e4781613e0b565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613eaa603283612a8d565b9150613eb582613e4e565b604082019050919050565b60006020820190508181036000830152613ed981613e9d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613f1a82612b34565b9150613f2583612b34565b9250828203905081811115613f3d57613f3c613684565b5b92915050565b6000613f4e82612b34565b9150613f5983612b34565b9250828201905080821115613f7157613f70613684565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000613fdc601883612a8d565b9150613fe782613fa6565b602082019050919050565b6000602082019050818103600083015261400b81613fcf565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000614048601f83612a8d565b915061405382614012565b602082019050919050565b600060208201905081810360008301526140778161403b565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006140da602283612a8d565b91506140e58261407e565b604082019050919050565b60006020820190508181036000830152614109816140cd565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614146601483612a8d565b915061415182614110565b602082019050919050565b6000602082019050818103600083015261417581614139565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006141a38261417c565b6141ad8185614187565b93506141bd818560208601612a9e565b6141c681612ac8565b840191505092915050565b60006080820190506141e66000830187612bc9565b6141f36020830186612bc9565b6142006040830185612f3d565b81810360608301526142128184614198565b905095945050505050565b60008151905061422c816129f3565b92915050565b600060208284031215614248576142476129bd565b5b60006142568482850161421d565b91505092915050565b61426881613d25565b82525050565b600060ff82169050919050565b6142848161426e565b82525050565b600060808201905061429f600083018761425f565b6142ac602083018661427b565b6142b9604083018561425f565b6142c6606083018461425f565b95945050505050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614305602083612a8d565b9150614310826142cf565b602082019050919050565b60006020820190508181036000830152614334816142f8565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614371601c83612a8d565b915061437c8261433b565b602082019050919050565b600060208201905081810360008301526143a081614364565b905091905056fe61723a2f2f6c6d71704b754269414e3347696d5333546f704a5632663568527131366e695f6436546b5770555671704da26469706673582212205dc7d6054c67cd2de7f0d9681a75bfd6ecbb16264bdecd4fc82c1b8744798ee664736f6c63430008110033

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

0000000000000000000000008ca2c7e7547c57a5c0e2cb47480cc3a65894c9ae

-----Decoded View---------------
Arg [0] : _signer (address): 0x8cA2C7E7547c57A5c0E2CB47480CC3a65894C9aE

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000008ca2c7e7547c57a5c0e2cb47480cc3a65894c9ae


Deployed Bytecode Sourcemap

67326:3187:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51425:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52353:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53865:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53383:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67456:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54565:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70239:125;;;;;;;;;;;;;:::i;:::-;;67929:440;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68744:271;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70443:67;;;;;;;;;;;;;:::i;:::-;;54971:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27991:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52063:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67484:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70141:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51794:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30856:103;;;;;;;;;;;;;:::i;:::-;;69926:82;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70372:63;;;;;;;;;;;;;:::i;:::-;;69023:338;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69811:107;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30208:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52522:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54108:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55227:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67514:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69371:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70041:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54334:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31114:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51425:305;51527:4;51579:25;51564:40;;;:11;:40;;;;:105;;;;51636:33;51621:48;;;:11;:48;;;;51564:105;:158;;;;51686:36;51710:11;51686:23;:36::i;:::-;51564:158;51544:178;;51425:305;;;:::o;52353:100::-;52407:13;52440:5;52433:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52353:100;:::o;53865:171::-;53941:7;53961:23;53976:7;53961:14;:23::i;:::-;54004:15;:24;54020:7;54004:24;;;;;;;;;;;;;;;;;;;;;53997:31;;53865:171;;;:::o;53383:416::-;53464:13;53480:23;53495:7;53480:14;:23::i;:::-;53464:39;;53528:5;53522:11;;:2;:11;;;53514:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;53622:5;53606:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;53631:37;53648:5;53655:12;:10;:12::i;:::-;53631:16;:37::i;:::-;53606:62;53584:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;53770:21;53779:2;53783:7;53770:8;:21::i;:::-;53453:346;53383:416;;:::o;67456:21::-;;;;;;;;;;;;;:::o;54565:335::-;54760:41;54779:12;:10;:12::i;:::-;54793:7;54760:18;:41::i;:::-;54752:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;54864:28;54874:4;54880:2;54884:7;54864:9;:28::i;:::-;54565:335;;;:::o;70239:125::-;30094:13;:11;:13::i;:::-;70313:10:::1;70305:28;;:51;70334:21;70305:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;70239:125::o:0;67929:440::-;68048:4;68288:6;;;;;;;;;;;68092:202;;:192;68124:117;68202:10;68214:6;68185:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68175:47;;;;;;68124:28;:117::i;:::-;68260:9;;68092:192;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:192::i;:::-;:202;;;68070:269;;;;;;;;;;;;:::i;:::-;;;;;;;;;68357:4;68350:11;;67929:440;;;;;:::o;68744:271::-;27596:19;:17;:19::i;:::-;68836:10:::1;:22;68847:10;68836:22;;;;;;;;;;;;;;;;;;;;;;;;;68835:23;68827:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;68894:42;68908:9;;68894:42;;;;;;;;;;;;;;;;::::0;:13:::1;:42::i;:::-;;68972:4;68947:10;:22;68958:10;68947:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;68987:20;68996:10;68987:8;:20::i;:::-;68744:271:::0;;:::o;70443:67::-;30094:13;:11;:13::i;:::-;70492:10:::1;:8;:10::i;:::-;70443:67::o:0;54971:185::-;55109:39;55126:4;55132:2;55136:7;55109:39;;;;;;;;;;;;:16;:39::i;:::-;54971:185;;;:::o;27991:86::-;28038:4;28062:7;;;;;;;;;;;28055:14;;27991:86;:::o;52063:223::-;52135:7;52155:13;52171:17;52180:7;52171:8;:17::i;:::-;52155:33;;52224:1;52207:19;;:5;:19;;;52199:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;52273:5;52266:12;;;52063:223;;;:::o;67484:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;70141:90::-;30094:13;:11;:13::i;:::-;70216:7:::1;70207:6;;:16;;;;;;;;;;;;;;;;;;70141:90:::0;:::o;51794:207::-;51866:7;51911:1;51894:19;;:5;:19;;;51886:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;51977:9;:16;51987:5;51977:16;;;;;;;;;;;;;;;;51970:23;;51794:207;;;:::o;30856:103::-;30094:13;:11;:13::i;:::-;30921:30:::1;30948:1;30921:18;:30::i;:::-;30856:103::o:0;69926:82::-;69968:7;69994:6;;;;;;;;;;;69987:13;;69926:82;:::o;70372:63::-;30094:13;:11;:13::i;:::-;70419:8:::1;:6;:8::i;:::-;70372:63::o:0;69023:338::-;27596:19;:17;:19::i;:::-;69112:1:::1;69103:6;:10;69095:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;69183:6;69171:11;:18;;;;:::i;:::-;69158:9;:31;69150:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;69235:2;69227:6;:10;;69219:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;69269:6;69288:66;69296:6;69294:1;:8;69288:66;;;69322:20;69331:10;69322:8;:20::i;:::-;69303:3;;;;;:::i;:::-;;;;69288:66;;;69084:277;69023:338:::0;:::o;69811:107::-;69854:4;69881:25;:15;:23;:25::i;:::-;69874:32;;69811:107;:::o;30208:87::-;30254:7;30281:6;;;;;;;;;;;30274:13;;30208:87;:::o;52522:104::-;52578:13;52611:7;52604:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52522:104;:::o;54108:155::-;54203:52;54222:12;:10;:12::i;:::-;54236:8;54246;54203:18;:52::i;:::-;54108:155;;:::o;55227:322::-;55401:41;55420:12;:10;:12::i;:::-;55434:7;55401:18;:41::i;:::-;55393:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;55503:38;55517:4;55523:2;55527:7;55536:4;55503:13;:38::i;:::-;55227:322;;;;:::o;67514:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;69371:428::-;69444:13;69470:23;69485:7;69470:14;:23::i;:::-;69504:21;69528:10;:8;:10::i;:::-;69504:34;;69549:24;69600:1;69582:7;69576:21;:25;:134;;;;;;;;;;;;;;;;;;;;;;69628:7;69637:18;:7;:16;:18::i;:::-;69611:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69576:134;69549:161;;69762:10;69774:15;;;;;;;;;;;;;;;;;69745:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69731:60;;;;69371:428;;;:::o;70041:91::-;30094:13;:11;:13::i;:::-;70120:4:::1;70110:7;:14;;;;;;:::i;:::-;;70041:91:::0;:::o;54334:164::-;54431:4;54455:18;:25;54474:5;54455:25;;;;;;;;;;;;;;;:35;54481:8;54455:35;;;;;;;;;;;;;;;;;;;;;;;;;54448:42;;54334:164;;;;:::o;31114:201::-;30094:13;:11;:13::i;:::-;31223:1:::1;31203:22;;:8;:22;;::::0;31195:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;31279:28;31298:8;31279:18;:28::i;:::-;31114:201:::0;:::o;994:127::-;1101:1;1083:7;:14;;;:19;;;;;;;;;;;994:127;:::o;32906:326::-;32966:4;33223:1;33201:7;:19;;;:23;33194:30;;32906:326;;;:::o;43937:157::-;44022:4;44061:25;44046:40;;;:11;:40;;;;44039:47;;43937:157;;;:::o;63684:135::-;63766:16;63774:7;63766;:16::i;:::-;63758:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;63684:135;:::o;26104:98::-;26157:7;26184:10;26177:17;;26104:98;:::o;62963:174::-;63065:2;63038:15;:24;63054:7;63038:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;63121:7;63117:2;63083:46;;63092:23;63107:7;63092:14;:23::i;:::-;63083:46;;;;;;;;;;;;62963:174;;:::o;57582:264::-;57675:4;57692:13;57708:23;57723:7;57708:14;:23::i;:::-;57692:39;;57761:5;57750:16;;:7;:16;;;:52;;;;57770:32;57787:5;57794:7;57770:16;:32::i;:::-;57750:52;:87;;;;57830:7;57806:31;;:20;57818:7;57806:11;:20::i;:::-;:31;;;57750:87;57742:96;;;57582:264;;;;:::o;61581:1263::-;61740:4;61713:31;;:23;61728:7;61713:14;:23::i;:::-;:31;;;61705:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;61819:1;61805:16;;:2;:16;;;61797:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;61875:42;61896:4;61902:2;61906:7;61915:1;61875:20;:42::i;:::-;62047:4;62020:31;;:23;62035:7;62020:14;:23::i;:::-;:31;;;62012:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;62165:15;:24;62181:7;62165:24;;;;;;;;;;;;62158:31;;;;;;;;;;;62660:1;62641:9;:15;62651:4;62641:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;62693:1;62676:9;:13;62686:2;62676:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;62735:2;62716:7;:16;62724:7;62716:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;62774:7;62770:2;62755:27;;62764:4;62755:27;;;;;;;;;;;;62795:41;62815:4;62821:2;62825:7;62834:1;62795:19;:41::i;:::-;61581:1263;;;:::o;30373:132::-;30448:12;:10;:12::i;:::-;30437:23;;:7;:5;:7::i;:::-;:23;;;30429:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30373:132::o;24110:269::-;24179:7;24365:4;24312:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;24302:69;;;;;;24295:76;;24110:269;;;:::o;20420:231::-;20498:7;20519:17;20538:18;20560:27;20571:4;20577:9;20560:10;:27::i;:::-;20518:69;;;;20598:18;20610:5;20598:11;:18::i;:::-;20634:9;20627:16;;;;20420:231;;;;:::o;28150:108::-;28221:8;:6;:8::i;:::-;28220:9;28212:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;28150:108::o;68487:249::-;27596:19;:17;:19::i;:::-;68551:15:::1;68569:25;:15;:23;:25::i;:::-;68551:43;;68624:4;68613:7;:15;;68605:24;;;::::0;::::1;;68640:22;68650:2;68654:7;68640:9;:22::i;:::-;68673:27;:15;:25;:27::i;:::-;68725:2;68718:10;;;;;;;;;;;;68540:196;68487:249:::0;:::o;28846:120::-;27855:16;:14;:16::i;:::-;28915:5:::1;28905:7;;:15;;;;;;;;;;;;;;;;;;28936:22;28945:12;:10;:12::i;:::-;28936:22;;;;;;:::i;:::-;;;;;;;;28846:120::o:0;56857:117::-;56923:7;56950;:16;56958:7;56950:16;;;;;;;;;;;;;;;;;;;;;56943:23;;56857:117;;;:::o;31475:191::-;31549:16;31568:6;;;;;;;;;;;31549:25;;31594:8;31585:6;;:17;;;;;;;;;;;;;;;;;;31649:8;31618:40;;31639:8;31618:40;;;;;;;;;;;;31538:128;31475:191;:::o;28587:118::-;27596:19;:17;:19::i;:::-;28657:4:::1;28647:7;;:14;;;;;;;;;;;;;;;;;;28677:20;28684:12;:10;:12::i;:::-;28677:20;;;;;;:::i;:::-;;;;;;;;28587:118::o:0;872:114::-;937:7;964;:14;;;957:21;;872:114;;;:::o;63280:315::-;63435:8;63426:17;;:5;:17;;;63418:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;63522:8;63484:18;:25;63503:5;63484:25;;;;;;;;;;;;;;;:35;63510:8;63484:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;63568:8;63546:41;;63561:5;63546:41;;;63578:8;63546:41;;;;;;:::i;:::-;;;;;;;;63280:315;;;:::o;56430:313::-;56586:28;56596:4;56602:2;56606:7;56586:9;:28::i;:::-;56633:47;56656:4;56662:2;56666:7;56675:4;56633:22;:47::i;:::-;56625:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;56430:313;;;;:::o;68379:100::-;68431:13;68464:7;68457:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68379:100;:::o;14770:716::-;14826:13;14877:14;14914:1;14894:17;14905:5;14894:10;:17::i;:::-;:21;14877:38;;14930:20;14964:6;14953:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14930:41;;14986:11;15115:6;15111:2;15107:15;15099:6;15095:28;15088:35;;15152:288;15159:4;15152:288;;;15184:5;;;;;;;;15326:8;15321:2;15314:5;15310:14;15305:30;15300:3;15292:44;15382:2;15373:11;;;;;;:::i;:::-;;;;;15416:1;15407:5;:10;15152:288;15403:21;15152:288;15461:6;15454:13;;;;;14770:716;;;:::o;57287:128::-;57352:4;57405:1;57376:31;;:17;57385:7;57376:8;:17::i;:::-;:31;;;;57369:38;;57287:128;;;:::o;65968:410::-;66158:1;66146:9;:13;66142:229;;;66196:1;66180:18;;:4;:18;;;66176:87;;66238:9;66219;:15;66229:4;66219:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;66176:87;66295:1;66281:16;;:2;:16;;;66277:83;;66335:9;66318;:13;66328:2;66318:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;66277:83;66142:229;65968:410;;;;:::o;67100:158::-;;;;;:::o;18871:747::-;18952:7;18961:12;19010:2;18990:9;:16;:22;18986:625;;19029:9;19053;19077:7;19334:4;19323:9;19319:20;19313:27;19308:32;;19384:4;19373:9;19369:20;19363:27;19358:32;;19442:4;19431:9;19427:20;19421:27;19418:1;19413:36;19408:41;;19485:25;19496:4;19502:1;19505;19508;19485:10;:25::i;:::-;19478:32;;;;;;;;;18986:625;19559:1;19563:35;19543:56;;;;18871:747;;;;;;:::o;17264:521::-;17342:20;17333:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;17329:449;17379:7;17329:449;17440:29;17431:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;17427:351;;17486:34;;;;;;;;;;:::i;:::-;;;;;;;;17427:351;17551:35;17542:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;17538:240;;17603:41;;;;;;;;;;:::i;:::-;;;;;;;;17538:240;17675:30;17666:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;17662:116;;17722:44;;;;;;;;;;:::i;:::-;;;;;;;;17662:116;17264:521;;:::o;58188:110::-;58264:26;58274:2;58278:7;58264:26;;;;;;;;;;;;:9;:26::i;:::-;58188:110;;:::o;28335:108::-;28402:8;:6;:8::i;:::-;28394:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;28335:108::o;64383:853::-;64537:4;64558:15;:2;:13;;;:15::i;:::-;64554:675;;;64610:2;64594:36;;;64631:12;:10;:12::i;:::-;64645:4;64651:7;64660:4;64594:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;64590:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64852:1;64835:6;:13;:18;64831:328;;64878:60;;;;;;;;;;:::i;:::-;;;;;;;;64831:328;65109:6;65103:13;65094:6;65090:2;65086:15;65079:38;64590:584;64726:41;;;64716:51;;;:6;:51;;;;64709:58;;;;;64554:675;65213:4;65206:11;;64383:853;;;;;;;:::o;11636:922::-;11689:7;11709:14;11726:1;11709:18;;11776:6;11767:5;:15;11763:102;;11812:6;11803:15;;;;;;:::i;:::-;;;;;11847:2;11837:12;;;;11763:102;11892:6;11883:5;:15;11879:102;;11928:6;11919:15;;;;;;:::i;:::-;;;;;11963:2;11953:12;;;;11879:102;12008:6;11999:5;:15;11995:102;;12044:6;12035:15;;;;;;:::i;:::-;;;;;12079:2;12069:12;;;;11995:102;12124:5;12115;:14;12111:99;;12159:5;12150:14;;;;;;:::i;:::-;;;;;12193:1;12183:11;;;;12111:99;12237:5;12228;:14;12224:99;;12272:5;12263:14;;;;;;:::i;:::-;;;;;12306:1;12296:11;;;;12224:99;12350:5;12341;:14;12337:99;;12385:5;12376:14;;;;;;:::i;:::-;;;;;12419:1;12409:11;;;;12337:99;12463:5;12454;:14;12450:66;;12499:1;12489:11;;;;12450:66;12544:6;12537:13;;;11636:922;;;:::o;21872:1520::-;22003:7;22012:12;22937:66;22932:1;22924:10;;:79;22920:163;;;23036:1;23040:30;23020:51;;;;;;22920:163;23180:14;23197:24;23207:4;23213:1;23216;23219;23197:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23180:41;;23254:1;23236:20;;:6;:20;;;23232:103;;23289:1;23293:29;23273:50;;;;;;;23232:103;23355:6;23363:20;23347:37;;;;;21872:1520;;;;;;;;:::o;58525:319::-;58654:18;58660:2;58664:7;58654:5;:18::i;:::-;58705:53;58736:1;58740:2;58744:7;58753:4;58705:22;:53::i;:::-;58683:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;58525:319;;;:::o;59180:942::-;59274:1;59260:16;;:2;:16;;;59252:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;59333:16;59341:7;59333;:16::i;:::-;59332:17;59324:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;59395:48;59424:1;59428:2;59432:7;59441:1;59395:20;:48::i;:::-;59542:16;59550:7;59542;:16::i;:::-;59541:17;59533:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;59957:1;59940:9;:13;59950:2;59940:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;60001:2;59982:7;:16;59990:7;59982:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;60046:7;60042:2;60021:33;;60038:1;60021:33;;;;;;;;;;;;60067:47;60095:1;60099:2;60103:7;60112:1;60067:19;:47::i;:::-;59180:942;;:::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:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:619::-;4967:6;4975;4983;5032:2;5020:9;5011:7;5007:23;5003:32;5000:119;;;5038:79;;:::i;:::-;5000:119;5158:1;5183:53;5228:7;5219:6;5208:9;5204:22;5183:53;:::i;:::-;5173:63;;5129:117;5285:2;5311:53;5356:7;5347:6;5336:9;5332:22;5311:53;:::i;:::-;5301:63;;5256:118;5413:2;5439:53;5484:7;5475:6;5464:9;5460:22;5439:53;:::i;:::-;5429:63;;5384:118;4890:619;;;;;:::o;5515:117::-;5624:1;5621;5614:12;5638:117;5747:1;5744;5737:12;5761:117;5870:1;5867;5860:12;5897:552;5954:8;5964:6;6014:3;6007:4;5999:6;5995:17;5991:27;5981:122;;6022:79;;:::i;:::-;5981:122;6135:6;6122:20;6112:30;;6165:18;6157:6;6154:30;6151:117;;;6187:79;;:::i;:::-;6151:117;6301:4;6293:6;6289:17;6277:29;;6355:3;6347:4;6339:6;6335:17;6325:8;6321:32;6318:41;6315:128;;;6362:79;;:::i;:::-;6315:128;5897:552;;;;;:::o;6455:117::-;6564:1;6561;6554:12;6578:180;6626:77;6623:1;6616:88;6723:4;6720:1;6713:15;6747:4;6744:1;6737:15;6764:281;6847:27;6869:4;6847:27;:::i;:::-;6839:6;6835:40;6977:6;6965:10;6962:22;6941:18;6929:10;6926:34;6923:62;6920:88;;;6988:18;;:::i;:::-;6920:88;7028:10;7024:2;7017:22;6807:238;6764:281;;:::o;7051:129::-;7085:6;7112:20;;:::i;:::-;7102:30;;7141:33;7169:4;7161:6;7141:33;:::i;:::-;7051:129;;;:::o;7186:308::-;7248:4;7338:18;7330:6;7327:30;7324:56;;;7360:18;;:::i;:::-;7324:56;7398:29;7420:6;7398:29;:::i;:::-;7390:37;;7482:4;7476;7472:15;7464:23;;7186:308;;;:::o;7500:146::-;7597:6;7592:3;7587;7574:30;7638:1;7629:6;7624:3;7620:16;7613:27;7500:146;;;:::o;7652:425::-;7730:5;7755:66;7771:49;7813:6;7771:49;:::i;:::-;7755:66;:::i;:::-;7746:75;;7844:6;7837:5;7830:21;7882:4;7875:5;7871:16;7920:3;7911:6;7906:3;7902:16;7899:25;7896:112;;;7927:79;;:::i;:::-;7896:112;8017:54;8064:6;8059:3;8054;8017:54;:::i;:::-;7736:341;7652:425;;;;;:::o;8097:340::-;8153:5;8202:3;8195:4;8187:6;8183:17;8179:27;8169:122;;8210:79;;:::i;:::-;8169:122;8327:6;8314:20;8352:79;8427:3;8419:6;8412:4;8404:6;8400:17;8352:79;:::i;:::-;8343:88;;8159:278;8097:340;;;;:::o;8443:852::-;8532:6;8540;8548;8597:2;8585:9;8576:7;8572:23;8568:32;8565:119;;;8603:79;;:::i;:::-;8565:119;8751:1;8740:9;8736:17;8723:31;8781:18;8773:6;8770:30;8767:117;;;8803:79;;:::i;:::-;8767:117;8916:64;8972:7;8963:6;8952:9;8948:22;8916:64;:::i;:::-;8898:82;;;;8694:296;9057:2;9046:9;9042:18;9029:32;9088:18;9080:6;9077:30;9074:117;;;9110:79;;:::i;:::-;9074:117;9215:63;9270:7;9261:6;9250:9;9246:22;9215:63;:::i;:::-;9205:73;;9000:288;8443:852;;;;;:::o;9301:527::-;9371:6;9379;9428:2;9416:9;9407:7;9403:23;9399:32;9396:119;;;9434:79;;:::i;:::-;9396:119;9582:1;9571:9;9567:17;9554:31;9612:18;9604:6;9601:30;9598:117;;;9634:79;;:::i;:::-;9598:117;9747:64;9803:7;9794:6;9783:9;9779:22;9747:64;:::i;:::-;9729:82;;;;9525:296;9301:527;;;;;:::o;9834:329::-;9893:6;9942:2;9930:9;9921:7;9917:23;9913:32;9910:119;;;9948:79;;:::i;:::-;9910:119;10068:1;10093:53;10138:7;10129:6;10118:9;10114:22;10093:53;:::i;:::-;10083:63;;10039:117;9834:329;;;;:::o;10169:118::-;10256:24;10274:5;10256:24;:::i;:::-;10251:3;10244:37;10169:118;;:::o;10293:222::-;10386:4;10424:2;10413:9;10409:18;10401:26;;10437:71;10505:1;10494:9;10490:17;10481:6;10437:71;:::i;:::-;10293:222;;;;:::o;10521:116::-;10591:21;10606:5;10591:21;:::i;:::-;10584:5;10581:32;10571:60;;10627:1;10624;10617:12;10571:60;10521:116;:::o;10643:133::-;10686:5;10724:6;10711:20;10702:29;;10740:30;10764:5;10740:30;:::i;:::-;10643:133;;;;:::o;10782:468::-;10847:6;10855;10904:2;10892:9;10883:7;10879:23;10875:32;10872:119;;;10910:79;;:::i;:::-;10872:119;11030:1;11055:53;11100:7;11091:6;11080:9;11076:22;11055:53;:::i;:::-;11045:63;;11001:117;11157:2;11183:50;11225:7;11216:6;11205:9;11201:22;11183:50;:::i;:::-;11173:60;;11128:115;10782:468;;;;;:::o;11256:307::-;11317:4;11407:18;11399:6;11396:30;11393:56;;;11429:18;;:::i;:::-;11393:56;11467:29;11489:6;11467:29;:::i;:::-;11459:37;;11551:4;11545;11541:15;11533:23;;11256:307;;;:::o;11569:423::-;11646:5;11671:65;11687:48;11728:6;11687:48;:::i;:::-;11671:65;:::i;:::-;11662:74;;11759:6;11752:5;11745:21;11797:4;11790:5;11786:16;11835:3;11826:6;11821:3;11817:16;11814:25;11811:112;;;11842:79;;:::i;:::-;11811:112;11932:54;11979:6;11974:3;11969;11932:54;:::i;:::-;11652:340;11569:423;;;;;:::o;12011:338::-;12066:5;12115:3;12108:4;12100:6;12096:17;12092:27;12082:122;;12123:79;;:::i;:::-;12082:122;12240:6;12227:20;12265:78;12339:3;12331:6;12324:4;12316:6;12312:17;12265:78;:::i;:::-;12256:87;;12072:277;12011:338;;;;:::o;12355:943::-;12450:6;12458;12466;12474;12523:3;12511:9;12502:7;12498:23;12494:33;12491:120;;;12530:79;;:::i;:::-;12491:120;12650:1;12675:53;12720:7;12711:6;12700:9;12696:22;12675:53;:::i;:::-;12665:63;;12621:117;12777:2;12803:53;12848:7;12839:6;12828:9;12824:22;12803:53;:::i;:::-;12793:63;;12748:118;12905:2;12931:53;12976:7;12967:6;12956:9;12952:22;12931:53;:::i;:::-;12921:63;;12876:118;13061:2;13050:9;13046:18;13033:32;13092:18;13084:6;13081:30;13078:117;;;13114:79;;:::i;:::-;13078:117;13219:62;13273:7;13264:6;13253:9;13249:22;13219:62;:::i;:::-;13209:72;;13004:287;12355:943;;;;;;;:::o;13304:509::-;13373:6;13422:2;13410:9;13401:7;13397:23;13393:32;13390:119;;;13428:79;;:::i;:::-;13390:119;13576:1;13565:9;13561:17;13548:31;13606:18;13598:6;13595:30;13592:117;;;13628:79;;:::i;:::-;13592:117;13733:63;13788:7;13779:6;13768:9;13764:22;13733:63;:::i;:::-;13723:73;;13519:287;13304:509;;;;:::o;13819:474::-;13887:6;13895;13944:2;13932:9;13923:7;13919:23;13915:32;13912:119;;;13950:79;;:::i;:::-;13912:119;14070:1;14095:53;14140:7;14131:6;14120:9;14116:22;14095:53;:::i;:::-;14085:63;;14041:117;14197:2;14223:53;14268:7;14259:6;14248:9;14244:22;14223:53;:::i;:::-;14213:63;;14168:118;13819:474;;;;;:::o;14299:180::-;14347:77;14344:1;14337:88;14444:4;14441:1;14434:15;14468:4;14465:1;14458:15;14485:320;14529:6;14566:1;14560:4;14556:12;14546:22;;14613:1;14607:4;14603:12;14634:18;14624:81;;14690:4;14682:6;14678:17;14668:27;;14624:81;14752:2;14744:6;14741:14;14721:18;14718:38;14715:84;;14771:18;;:::i;:::-;14715:84;14536:269;14485:320;;;:::o;14811:220::-;14951:34;14947:1;14939:6;14935:14;14928:58;15020:3;15015:2;15007:6;15003:15;14996:28;14811:220;:::o;15037:366::-;15179:3;15200:67;15264:2;15259:3;15200:67;:::i;:::-;15193:74;;15276:93;15365:3;15276:93;:::i;:::-;15394:2;15389:3;15385:12;15378:19;;15037:366;;;:::o;15409:419::-;15575:4;15613:2;15602:9;15598:18;15590:26;;15662:9;15656:4;15652:20;15648:1;15637:9;15633:17;15626:47;15690:131;15816:4;15690:131;:::i;:::-;15682:139;;15409:419;;;:::o;15834:248::-;15974:34;15970:1;15962:6;15958:14;15951:58;16043:31;16038:2;16030:6;16026:15;16019:56;15834:248;:::o;16088:366::-;16230:3;16251:67;16315:2;16310:3;16251:67;:::i;:::-;16244:74;;16327:93;16416:3;16327:93;:::i;:::-;16445:2;16440:3;16436:12;16429:19;;16088:366;;;:::o;16460:419::-;16626:4;16664:2;16653:9;16649:18;16641:26;;16713:9;16707:4;16703:20;16699:1;16688:9;16684:17;16677:47;16741:131;16867:4;16741:131;:::i;:::-;16733:139;;16460:419;;;:::o;16885:232::-;17025:34;17021:1;17013:6;17009:14;17002:58;17094:15;17089:2;17081:6;17077:15;17070:40;16885:232;:::o;17123:366::-;17265:3;17286:67;17350:2;17345:3;17286:67;:::i;:::-;17279:74;;17362:93;17451:3;17362:93;:::i;:::-;17480:2;17475:3;17471:12;17464:19;;17123:366;;;:::o;17495:419::-;17661:4;17699:2;17688:9;17684:18;17676:26;;17748:9;17742:4;17738:20;17734:1;17723:9;17719:17;17712:47;17776:131;17902:4;17776:131;:::i;:::-;17768:139;;17495:419;;;:::o;17920:94::-;17953:8;18001:5;17997:2;17993:14;17972:35;;17920:94;;;:::o;18020:::-;18059:7;18088:20;18102:5;18088:20;:::i;:::-;18077:31;;18020:94;;;:::o;18120:100::-;18159:7;18188:26;18208:5;18188:26;:::i;:::-;18177:37;;18120:100;;;:::o;18226:157::-;18331:45;18351:24;18369:5;18351:24;:::i;:::-;18331:45;:::i;:::-;18326:3;18319:58;18226:157;;:::o;18389:148::-;18491:11;18528:3;18513:18;;18389:148;;;;:::o;18543:390::-;18649:3;18677:39;18710:5;18677:39;:::i;:::-;18732:89;18814:6;18809:3;18732:89;:::i;:::-;18725:96;;18830:65;18888:6;18883:3;18876:4;18869:5;18865:16;18830:65;:::i;:::-;18920:6;18915:3;18911:16;18904:23;;18653:280;18543:390;;;;:::o;18939:416::-;19099:3;19114:75;19185:3;19176:6;19114:75;:::i;:::-;19214:2;19209:3;19205:12;19198:19;;19234:95;19325:3;19316:6;19234:95;:::i;:::-;19227:102;;19346:3;19339:10;;18939:416;;;;;:::o;19361:167::-;19501:19;19497:1;19489:6;19485:14;19478:43;19361:167;:::o;19534:366::-;19676:3;19697:67;19761:2;19756:3;19697:67;:::i;:::-;19690:74;;19773:93;19862:3;19773:93;:::i;:::-;19891:2;19886:3;19882:12;19875:19;;19534:366;;;:::o;19906:419::-;20072:4;20110:2;20099:9;20095:18;20087:26;;20159:9;20153:4;20149:20;20145:1;20134:9;20130:17;20123:47;20187:131;20313:4;20187:131;:::i;:::-;20179:139;;19906:419;;;:::o;20331:170::-;20471:22;20467:1;20459:6;20455:14;20448:46;20331:170;:::o;20507:366::-;20649:3;20670:67;20734:2;20729:3;20670:67;:::i;:::-;20663:74;;20746:93;20835:3;20746:93;:::i;:::-;20864:2;20859:3;20855:12;20848:19;;20507:366;;;:::o;20879:419::-;21045:4;21083:2;21072:9;21068:18;21060:26;;21132:9;21126:4;21122:20;21118:1;21107:9;21103:17;21096:47;21160:131;21286:4;21160:131;:::i;:::-;21152:139;;20879:419;;;:::o;21304:174::-;21444:26;21440:1;21432:6;21428:14;21421:50;21304:174;:::o;21484:366::-;21626:3;21647:67;21711:2;21706:3;21647:67;:::i;:::-;21640:74;;21723:93;21812:3;21723:93;:::i;:::-;21841:2;21836:3;21832:12;21825:19;;21484:366;;;:::o;21856:419::-;22022:4;22060:2;22049:9;22045:18;22037:26;;22109:9;22103:4;22099:20;22095:1;22084:9;22080:17;22073:47;22137:131;22263:4;22137:131;:::i;:::-;22129:139;;21856:419;;;:::o;22281:228::-;22421:34;22417:1;22409:6;22405:14;22398:58;22490:11;22485:2;22477:6;22473:15;22466:36;22281:228;:::o;22515:366::-;22657:3;22678:67;22742:2;22737:3;22678:67;:::i;:::-;22671:74;;22754:93;22843:3;22754:93;:::i;:::-;22872:2;22867:3;22863:12;22856:19;;22515:366;;;:::o;22887:419::-;23053:4;23091:2;23080:9;23076:18;23068:26;;23140:9;23134:4;23130:20;23126:1;23115:9;23111:17;23104:47;23168:131;23294:4;23168:131;:::i;:::-;23160:139;;22887:419;;;:::o;23312:171::-;23452:23;23448:1;23440:6;23436:14;23429:47;23312:171;:::o;23489:366::-;23631:3;23652:67;23716:2;23711:3;23652:67;:::i;:::-;23645:74;;23728:93;23817:3;23728:93;:::i;:::-;23846:2;23841:3;23837:12;23830:19;;23489:366;;;:::o;23861:419::-;24027:4;24065:2;24054:9;24050:18;24042:26;;24114:9;24108:4;24104:20;24100:1;24089:9;24085:17;24078:47;24142:131;24268:4;24142:131;:::i;:::-;24134:139;;23861:419;;;:::o;24286:180::-;24334:77;24331:1;24324:88;24431:4;24428:1;24421:15;24455:4;24452:1;24445:15;24472:410;24512:7;24535:20;24553:1;24535:20;:::i;:::-;24530:25;;24569:20;24587:1;24569:20;:::i;:::-;24564:25;;24624:1;24621;24617:9;24646:30;24664:11;24646:30;:::i;:::-;24635:41;;24825:1;24816:7;24812:15;24809:1;24806:22;24786:1;24779:9;24759:83;24736:139;;24855:18;;:::i;:::-;24736:139;24520:362;24472:410;;;;:::o;24888:164::-;25028:16;25024:1;25016:6;25012:14;25005:40;24888:164;:::o;25058:366::-;25200:3;25221:67;25285:2;25280:3;25221:67;:::i;:::-;25214:74;;25297:93;25386:3;25297:93;:::i;:::-;25415:2;25410:3;25406:12;25399:19;;25058:366;;;:::o;25430:419::-;25596:4;25634:2;25623:9;25619:18;25611:26;;25683:9;25677:4;25673:20;25669:1;25658:9;25654:17;25647:47;25711:131;25837:4;25711:131;:::i;:::-;25703:139;;25430:419;;;:::o;25855:166::-;25995:18;25991:1;25983:6;25979:14;25972:42;25855:166;:::o;26027:366::-;26169:3;26190:67;26254:2;26249:3;26190:67;:::i;:::-;26183:74;;26266:93;26355:3;26266:93;:::i;:::-;26384:2;26379:3;26375:12;26368:19;;26027:366;;;:::o;26399:419::-;26565:4;26603:2;26592:9;26588:18;26580:26;;26652:9;26646:4;26642:20;26638:1;26627:9;26623:17;26616:47;26680:131;26806:4;26680:131;:::i;:::-;26672:139;;26399:419;;;:::o;26824:233::-;26863:3;26886:24;26904:5;26886:24;:::i;:::-;26877:33;;26932:66;26925:5;26922:77;26919:103;;27002:18;;:::i;:::-;26919:103;27049:1;27042:5;27038:13;27031:20;;26824:233;;;:::o;27063:435::-;27243:3;27265:95;27356:3;27347:6;27265:95;:::i;:::-;27258:102;;27377:95;27468:3;27459:6;27377:95;:::i;:::-;27370:102;;27489:3;27482:10;;27063:435;;;;;:::o;27504:141::-;27553:4;27576:3;27568:11;;27599:3;27596:1;27589:14;27633:4;27630:1;27620:18;27612:26;;27504:141;;;:::o;27651:93::-;27688:6;27735:2;27730;27723:5;27719:14;27715:23;27705:33;;27651:93;;;:::o;27750:107::-;27794:8;27844:5;27838:4;27834:16;27813:37;;27750:107;;;;:::o;27863:393::-;27932:6;27982:1;27970:10;27966:18;28005:97;28035:66;28024:9;28005:97;:::i;:::-;28123:39;28153:8;28142:9;28123:39;:::i;:::-;28111:51;;28195:4;28191:9;28184:5;28180:21;28171:30;;28244:4;28234:8;28230:19;28223:5;28220:30;28210:40;;27939:317;;27863:393;;;;;:::o;28262:60::-;28290:3;28311:5;28304:12;;28262:60;;;:::o;28328:142::-;28378:9;28411:53;28429:34;28438:24;28456:5;28438:24;:::i;:::-;28429:34;:::i;:::-;28411:53;:::i;:::-;28398:66;;28328:142;;;:::o;28476:75::-;28519:3;28540:5;28533:12;;28476:75;;;:::o;28557:269::-;28667:39;28698:7;28667:39;:::i;:::-;28728:91;28777:41;28801:16;28777:41;:::i;:::-;28769:6;28762:4;28756:11;28728:91;:::i;:::-;28722:4;28715:105;28633:193;28557:269;;;:::o;28832:73::-;28877:3;28832:73;:::o;28911:189::-;28988:32;;:::i;:::-;29029:65;29087:6;29079;29073:4;29029:65;:::i;:::-;28964:136;28911:189;;:::o;29106:186::-;29166:120;29183:3;29176:5;29173:14;29166:120;;;29237:39;29274:1;29267:5;29237:39;:::i;:::-;29210:1;29203:5;29199:13;29190:22;;29166:120;;;29106:186;;:::o;29298:543::-;29399:2;29394:3;29391:11;29388:446;;;29433:38;29465:5;29433:38;:::i;:::-;29517:29;29535:10;29517:29;:::i;:::-;29507:8;29503:44;29700:2;29688:10;29685:18;29682:49;;;29721:8;29706:23;;29682:49;29744:80;29800:22;29818:3;29800:22;:::i;:::-;29790:8;29786:37;29773:11;29744:80;:::i;:::-;29403:431;;29388:446;29298:543;;;:::o;29847:117::-;29901:8;29951:5;29945:4;29941:16;29920:37;;29847:117;;;;:::o;29970:169::-;30014:6;30047:51;30095:1;30091:6;30083:5;30080:1;30076:13;30047:51;:::i;:::-;30043:56;30128:4;30122;30118:15;30108:25;;30021:118;29970:169;;;;:::o;30144:295::-;30220:4;30366:29;30391:3;30385:4;30366:29;:::i;:::-;30358:37;;30428:3;30425:1;30421:11;30415:4;30412:21;30404:29;;30144:295;;;;:::o;30444:1395::-;30561:37;30594:3;30561:37;:::i;:::-;30663:18;30655:6;30652:30;30649:56;;;30685:18;;:::i;:::-;30649:56;30729:38;30761:4;30755:11;30729:38;:::i;:::-;30814:67;30874:6;30866;30860:4;30814:67;:::i;:::-;30908:1;30932:4;30919:17;;30964:2;30956:6;30953:14;30981:1;30976:618;;;;31638:1;31655:6;31652:77;;;31704:9;31699:3;31695:19;31689:26;31680:35;;31652:77;31755:67;31815:6;31808:5;31755:67;:::i;:::-;31749:4;31742:81;31611:222;30946:887;;30976:618;31028:4;31024:9;31016:6;31012:22;31062:37;31094:4;31062:37;:::i;:::-;31121:1;31135:208;31149:7;31146:1;31143:14;31135:208;;;31228:9;31223:3;31219:19;31213:26;31205:6;31198:42;31279:1;31271:6;31267:14;31257:24;;31326:2;31315:9;31311:18;31298:31;;31172:4;31169:1;31165:12;31160:17;;31135:208;;;31371:6;31362:7;31359:19;31356:179;;;31429:9;31424:3;31420:19;31414:26;31472:48;31514:4;31506:6;31502:17;31491:9;31472:48;:::i;:::-;31464:6;31457:64;31379:156;31356:179;31581:1;31577;31569:6;31565:14;31561:22;31555:4;31548:36;30983:611;;;30946:887;;30536:1303;;;30444:1395;;:::o;31845:225::-;31985:34;31981:1;31973:6;31969:14;31962:58;32054:8;32049:2;32041:6;32037:15;32030:33;31845:225;:::o;32076:366::-;32218:3;32239:67;32303:2;32298:3;32239:67;:::i;:::-;32232:74;;32315:93;32404:3;32315:93;:::i;:::-;32433:2;32428:3;32424:12;32417:19;;32076:366;;;:::o;32448:419::-;32614:4;32652:2;32641:9;32637:18;32629:26;;32701:9;32695:4;32691:20;32687:1;32676:9;32672:17;32665:47;32729:131;32855:4;32729:131;:::i;:::-;32721:139;;32448:419;;;:::o;32873:224::-;33013:34;33009:1;33001:6;32997:14;32990:58;33082:7;33077:2;33069:6;33065:15;33058:32;32873:224;:::o;33103:366::-;33245:3;33266:67;33330:2;33325:3;33266:67;:::i;:::-;33259:74;;33342:93;33431:3;33342:93;:::i;:::-;33460:2;33455:3;33451:12;33444:19;;33103:366;;;:::o;33475:419::-;33641:4;33679:2;33668:9;33664:18;33656:26;;33728:9;33722:4;33718:20;33714:1;33703:9;33699:17;33692:47;33756:131;33882:4;33756:131;:::i;:::-;33748:139;;33475:419;;;:::o;33900:223::-;34040:34;34036:1;34028:6;34024:14;34017:58;34109:6;34104:2;34096:6;34092:15;34085:31;33900:223;:::o;34129:366::-;34271:3;34292:67;34356:2;34351:3;34292:67;:::i;:::-;34285:74;;34368:93;34457:3;34368:93;:::i;:::-;34486:2;34481:3;34477:12;34470:19;;34129:366;;;:::o;34501:419::-;34667:4;34705:2;34694:9;34690:18;34682:26;;34754:9;34748:4;34744:20;34740:1;34729:9;34725:17;34718:47;34782:131;34908:4;34782:131;:::i;:::-;34774:139;;34501:419;;;:::o;34926:182::-;35066:34;35062:1;35054:6;35050:14;35043:58;34926:182;:::o;35114:366::-;35256:3;35277:67;35341:2;35336:3;35277:67;:::i;:::-;35270:74;;35353:93;35442:3;35353:93;:::i;:::-;35471:2;35466:3;35462:12;35455:19;;35114:366;;;:::o;35486:419::-;35652:4;35690:2;35679:9;35675:18;35667:26;;35739:9;35733:4;35729:20;35725:1;35714:9;35710:17;35703:47;35767:131;35893:4;35767:131;:::i;:::-;35759:139;;35486:419;;;:::o;35911:214::-;36051:66;36047:1;36039:6;36035:14;36028:90;35911:214;:::o;36131:402::-;36291:3;36312:85;36394:2;36389:3;36312:85;:::i;:::-;36305:92;;36406:93;36495:3;36406:93;:::i;:::-;36524:2;36519:3;36515:12;36508:19;;36131:402;;;:::o;36539:77::-;36576:7;36605:5;36594:16;;36539:77;;;:::o;36622:79::-;36661:7;36690:5;36679:16;;36622:79;;;:::o;36707:157::-;36812:45;36832:24;36850:5;36832:24;:::i;:::-;36812:45;:::i;:::-;36807:3;36800:58;36707:157;;:::o;36870:522::-;37083:3;37105:148;37249:3;37105:148;:::i;:::-;37098:155;;37263:75;37334:3;37325:6;37263:75;:::i;:::-;37363:2;37358:3;37354:12;37347:19;;37383:3;37376:10;;36870:522;;;;:::o;37398:166::-;37538:18;37534:1;37526:6;37522:14;37515:42;37398:166;:::o;37570:366::-;37712:3;37733:67;37797:2;37792:3;37733:67;:::i;:::-;37726:74;;37809:93;37898:3;37809:93;:::i;:::-;37927:2;37922:3;37918:12;37911:19;;37570:366;;;:::o;37942:419::-;38108:4;38146:2;38135:9;38131:18;38123:26;;38195:9;38189:4;38185:20;38181:1;38170:9;38166:17;38159:47;38223:131;38349:4;38223:131;:::i;:::-;38215:139;;37942:419;;;:::o;38367:175::-;38507:27;38503:1;38495:6;38491:14;38484:51;38367:175;:::o;38548:366::-;38690:3;38711:67;38775:2;38770:3;38711:67;:::i;:::-;38704:74;;38787:93;38876:3;38787:93;:::i;:::-;38905:2;38900:3;38896:12;38889:19;;38548:366;;;:::o;38920:419::-;39086:4;39124:2;39113:9;39109:18;39101:26;;39173:9;39167:4;39163:20;39159:1;39148:9;39144:17;39137:47;39201:131;39327:4;39201:131;:::i;:::-;39193:139;;38920:419;;;:::o;39345:237::-;39485:34;39481:1;39473:6;39469:14;39462:58;39554:20;39549:2;39541:6;39537:15;39530:45;39345:237;:::o;39588:366::-;39730:3;39751:67;39815:2;39810:3;39751:67;:::i;:::-;39744:74;;39827:93;39916:3;39827:93;:::i;:::-;39945:2;39940:3;39936:12;39929:19;;39588:366;;;:::o;39960:419::-;40126:4;40164:2;40153:9;40149:18;40141:26;;40213:9;40207:4;40203:20;40199:1;40188:9;40184:17;40177:47;40241:131;40367:4;40241:131;:::i;:::-;40233:139;;39960:419;;;:::o;40385:180::-;40433:77;40430:1;40423:88;40530:4;40527:1;40520:15;40554:4;40551:1;40544:15;40571:194;40611:4;40631:20;40649:1;40631:20;:::i;:::-;40626:25;;40665:20;40683:1;40665:20;:::i;:::-;40660:25;;40709:1;40706;40702:9;40694:17;;40733:1;40727:4;40724:11;40721:37;;;40738:18;;:::i;:::-;40721:37;40571:194;;;;:::o;40771:191::-;40811:3;40830:20;40848:1;40830:20;:::i;:::-;40825:25;;40864:20;40882:1;40864:20;:::i;:::-;40859:25;;40907:1;40904;40900:9;40893:16;;40928:3;40925:1;40922:10;40919:36;;;40935:18;;:::i;:::-;40919:36;40771:191;;;;:::o;40968:180::-;41016:77;41013:1;41006:88;41113:4;41110:1;41103:15;41137:4;41134:1;41127:15;41154:174;41294:26;41290:1;41282:6;41278:14;41271:50;41154:174;:::o;41334:366::-;41476:3;41497:67;41561:2;41556:3;41497:67;:::i;:::-;41490:74;;41573:93;41662:3;41573:93;:::i;:::-;41691:2;41686:3;41682:12;41675:19;;41334:366;;;:::o;41706:419::-;41872:4;41910:2;41899:9;41895:18;41887:26;;41959:9;41953:4;41949:20;41945:1;41934:9;41930:17;41923:47;41987:131;42113:4;41987:131;:::i;:::-;41979:139;;41706:419;;;:::o;42131:181::-;42271:33;42267:1;42259:6;42255:14;42248:57;42131:181;:::o;42318:366::-;42460:3;42481:67;42545:2;42540:3;42481:67;:::i;:::-;42474:74;;42557:93;42646:3;42557:93;:::i;:::-;42675:2;42670:3;42666:12;42659:19;;42318:366;;;:::o;42690:419::-;42856:4;42894:2;42883:9;42879:18;42871:26;;42943:9;42937:4;42933:20;42929:1;42918:9;42914:17;42907:47;42971:131;43097:4;42971:131;:::i;:::-;42963:139;;42690:419;;;:::o;43115:221::-;43255:34;43251:1;43243:6;43239:14;43232:58;43324:4;43319:2;43311:6;43307:15;43300:29;43115:221;:::o;43342:366::-;43484:3;43505:67;43569:2;43564:3;43505:67;:::i;:::-;43498:74;;43581:93;43670:3;43581:93;:::i;:::-;43699:2;43694:3;43690:12;43683:19;;43342:366;;;:::o;43714:419::-;43880:4;43918:2;43907:9;43903:18;43895:26;;43967:9;43961:4;43957:20;43953:1;43942:9;43938:17;43931:47;43995:131;44121:4;43995:131;:::i;:::-;43987:139;;43714:419;;;:::o;44139:170::-;44279:22;44275:1;44267:6;44263:14;44256:46;44139:170;:::o;44315:366::-;44457:3;44478:67;44542:2;44537:3;44478:67;:::i;:::-;44471:74;;44554:93;44643:3;44554:93;:::i;:::-;44672:2;44667:3;44663:12;44656:19;;44315:366;;;:::o;44687:419::-;44853:4;44891:2;44880:9;44876:18;44868:26;;44940:9;44934:4;44930:20;44926:1;44915:9;44911:17;44904:47;44968:131;45094:4;44968:131;:::i;:::-;44960:139;;44687:419;;;:::o;45112:98::-;45163:6;45197:5;45191:12;45181:22;;45112:98;;;:::o;45216:168::-;45299:11;45333:6;45328:3;45321:19;45373:4;45368:3;45364:14;45349:29;;45216:168;;;;:::o;45390:373::-;45476:3;45504:38;45536:5;45504:38;:::i;:::-;45558:70;45621:6;45616:3;45558:70;:::i;:::-;45551:77;;45637:65;45695:6;45690:3;45683:4;45676:5;45672:16;45637:65;:::i;:::-;45727:29;45749:6;45727:29;:::i;:::-;45722:3;45718:39;45711:46;;45480:283;45390:373;;;;:::o;45769:640::-;45964:4;46002:3;45991:9;45987:19;45979:27;;46016:71;46084:1;46073:9;46069:17;46060:6;46016:71;:::i;:::-;46097:72;46165:2;46154:9;46150:18;46141:6;46097:72;:::i;:::-;46179;46247:2;46236:9;46232:18;46223:6;46179:72;:::i;:::-;46298:9;46292:4;46288:20;46283:2;46272:9;46268:18;46261:48;46326:76;46397:4;46388:6;46326:76;:::i;:::-;46318:84;;45769:640;;;;;;;:::o;46415:141::-;46471:5;46502:6;46496:13;46487:22;;46518:32;46544:5;46518:32;:::i;:::-;46415:141;;;;:::o;46562:349::-;46631:6;46680:2;46668:9;46659:7;46655:23;46651:32;46648:119;;;46686:79;;:::i;:::-;46648:119;46806:1;46831:63;46886:7;46877:6;46866:9;46862:22;46831:63;:::i;:::-;46821:73;;46777:127;46562:349;;;;:::o;46917:118::-;47004:24;47022:5;47004:24;:::i;:::-;46999:3;46992:37;46917:118;;:::o;47041:86::-;47076:7;47116:4;47109:5;47105:16;47094:27;;47041:86;;;:::o;47133:112::-;47216:22;47232:5;47216:22;:::i;:::-;47211:3;47204:35;47133:112;;:::o;47251:545::-;47424:4;47462:3;47451:9;47447:19;47439:27;;47476:71;47544:1;47533:9;47529:17;47520:6;47476:71;:::i;:::-;47557:68;47621:2;47610:9;47606:18;47597:6;47557:68;:::i;:::-;47635:72;47703:2;47692:9;47688:18;47679:6;47635:72;:::i;:::-;47717;47785:2;47774:9;47770:18;47761:6;47717:72;:::i;:::-;47251:545;;;;;;;:::o;47802:182::-;47942:34;47938:1;47930:6;47926:14;47919:58;47802:182;:::o;47990:366::-;48132:3;48153:67;48217:2;48212:3;48153:67;:::i;:::-;48146:74;;48229:93;48318:3;48229:93;:::i;:::-;48347:2;48342:3;48338:12;48331:19;;47990:366;;;:::o;48362:419::-;48528:4;48566:2;48555:9;48551:18;48543:26;;48615:9;48609:4;48605:20;48601:1;48590:9;48586:17;48579:47;48643:131;48769:4;48643:131;:::i;:::-;48635:139;;48362:419;;;:::o;48787:178::-;48927:30;48923:1;48915:6;48911:14;48904:54;48787:178;:::o;48971:366::-;49113:3;49134:67;49198:2;49193:3;49134:67;:::i;:::-;49127:74;;49210:93;49299:3;49210:93;:::i;:::-;49328:2;49323:3;49319:12;49312:19;;48971:366;;;:::o;49343:419::-;49509:4;49547:2;49536:9;49532:18;49524:26;;49596:9;49590:4;49586:20;49582:1;49571:9;49567:17;49560:47;49624:131;49750:4;49624:131;:::i;:::-;49616:139;;49343:419;;;:::o

Swarm Source

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