ETH Price: $3,442.97 (+1.30%)
Gas: 6.15 Gwei

Token

Dungeons Pass (DP)
 

Overview

Max Total Supply

0 DP

Holders

774

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 DP
0xc336a0febd89a59a51110f74a668bb61cda23798
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:
DungeonsPass

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-10
*/

// File: IOperatorFilterRegistry.sol


pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

// File: OperatorFilterer.sol


pragma solidity ^0.8.13;


/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}

// File: DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;


/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

// 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/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/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: TERC721.sol

pragma solidity ^0.8.13;




contract DungeonsPass is ERC721, DefaultOperatorFilterer {
    address public owner = msg.sender;

    uint256 public supply = 2020;
    uint256 public free_supply = 200;
    uint256 public price = 2000000000000000;
    string public base_uri = "https://dungeonsgenesis.s3.us-west-1.amazonaws.com/";

    uint256 public latest_token_id = 0;

    modifier only_owner() {
        require(msg.sender == owner, "This function is restricted to the owner");
        _;
    }

    constructor() ERC721("Dungeons Pass", "DP") {
        owner = msg.sender;
    }

    function set_price(uint256 _price) external only_owner {
        price = _price;
    }

    function set_free_supply(uint256 _free_supply) external only_owner {
        free_supply = _free_supply;
    }

    function mint(address wallet, uint256 n_items) internal {
        require(latest_token_id + n_items <= supply, "Can't mint requested amount!");
        for (uint256 i = 0; i < n_items; i++) {
            latest_token_id++;
            _mint(wallet, latest_token_id);
        }
    }

    function free_mint() public {
        require(latest_token_id < free_supply, "No more free mints!");
        mint(msg.sender, 1);
    }

    function public_mint(uint256 n_items) external payable {
        require(msg.value >= price * n_items, "Not enough eth sent!");
        mint(msg.sender, n_items);
    }

    function admin_mint(address wallet, uint256 n_items) external only_owner {
        mint(wallet, n_items);
    }

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

    function set_base_uri(string memory new_uri) external only_owner {
        base_uri = new_uri;
    }

    function contractURI() public pure returns (string memory) {
        return "http://dungeonspass.com";
    }

    function withdraw(address payable wallet) public only_owner {
        uint256 amount = address(this).balance;
        wallet.transfer(amount);
        emit Transfer(address(this), wallet, amount);
    }


    // Creator Royalties ===================================================
    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) {
        super.approve(operator, tokenId);
    }

    function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId, data);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"n_items","type":"uint256"}],"name":"admin_mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"base_uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"free_mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"free_supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latest_token_id","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"n_items","type":"uint256"}],"name":"public_mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"new_uri","type":"string"}],"name":"set_base_uri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_free_supply","type":"uint256"}],"name":"set_free_supply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"set_price","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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 payable","name":"wallet","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405233600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506107e460075560c860085566071afd498d000060095560405180606001604052806033815260200162003d3160339139600a90805190602001906200008c92919062000395565b506000600b553480156200009f57600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600d81526020017f44756e67656f6e732050617373000000000000000000000000000000000000008152506040518060400160405280600281526020017f445000000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200013b92919062000395565b5080600190805190602001906200015492919062000395565b50505060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200034c57801562000212576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620001d89291906200048a565b600060405180830381600087803b158015620001f357600080fd5b505af115801562000208573d6000803e3d6000fd5b505050506200034b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620002cc576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002929291906200048a565b600060405180830381600087803b158015620002ad57600080fd5b505af1158015620002c2573d6000803e3d6000fd5b505050506200034a565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620003159190620004b7565b600060405180830381600087803b1580156200033057600080fd5b505af115801562000345573d6000803e3d6000fd5b505050505b5b5b505033600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000538565b828054620003a39062000503565b90600052602060002090601f016020900481019282620003c7576000855562000413565b82601f10620003e257805160ff191683800117855562000413565b8280016001018555821562000413579182015b8281111562000412578251825591602001919060010190620003f5565b5b50905062000422919062000426565b5090565b5b808211156200044157600081600090555060010162000427565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620004728262000445565b9050919050565b620004848162000465565b82525050565b6000604082019050620004a1600083018562000479565b620004b0602083018462000479565b9392505050565b6000602082019050620004ce600083018462000479565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200051c57607f821691505b602082108103620005325762000531620004d4565b5b50919050565b6137e980620005486000396000f3fe6080604052600436106101b75760003560e01c8063786f2910116100ec578063b88d4fde1161008a578063d8e8708911610064578063d8e87089146105e9578063e8a3d48514610614578063e985e9c51461063f578063f21a0c0d1461067c576101b7565b8063b88d4fde1461055a578063c87b56dd14610583578063d4c4641c146105c0576101b7565b8063a035b1fe116100c6578063a035b1fe146104c6578063a22cb465146104f1578063a4c19a9f1461051a578063af1c521114610531576101b7565b8063786f2910146104455780638da5cb5b1461047057806395d89b411461049b576101b7565b806341f434341161015957806351cff8d91161013357806351cff8d9146103775780636352211e146103a057806366fe513a146103dd57806370a0823114610408576101b7565b806341f434341461030757806342842e0e146103325780634bbcd31c1461035b576101b7565b8063081812fc11610195578063081812fc1461024f578063095ea7b31461028c57806323b872dd146102b557806328bf794d146102de576101b7565b806301ffc9a7146101bc578063047fc9aa146101f957806306fdde0314610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612571565b6106a5565b6040516101f091906125b9565b60405180910390f35b34801561020557600080fd5b5061020e610787565b60405161021b91906125ed565b60405180910390f35b34801561023057600080fd5b5061023961078d565b60405161024691906126a1565b60405180910390f35b34801561025b57600080fd5b50610276600480360381019061027191906126ef565b61081f565b604051610283919061275d565b60405180910390f35b34801561029857600080fd5b506102b360048036038101906102ae91906127a4565b610865565b005b3480156102c157600080fd5b506102dc60048036038101906102d791906127e4565b61087e565b005b3480156102ea57600080fd5b50610305600480360381019061030091906126ef565b6108cd565b005b34801561031357600080fd5b5061031c610967565b6040516103299190612896565b60405180910390f35b34801561033e57600080fd5b50610359600480360381019061035491906127e4565b610979565b005b610375600480360381019061037091906126ef565b6109c8565b005b34801561038357600080fd5b5061039e600480360381019061039991906128ef565b610a25565b005b3480156103ac57600080fd5b506103c760048036038101906103c291906126ef565b610b60565b6040516103d4919061275d565b60405180910390f35b3480156103e957600080fd5b506103f2610be6565b6040516103ff91906125ed565b60405180910390f35b34801561041457600080fd5b5061042f600480360381019061042a919061291c565b610bec565b60405161043c91906125ed565b60405180910390f35b34801561045157600080fd5b5061045a610ca3565b60405161046791906126a1565b60405180910390f35b34801561047c57600080fd5b50610485610d31565b604051610492919061275d565b60405180910390f35b3480156104a757600080fd5b506104b0610d57565b6040516104bd91906126a1565b60405180910390f35b3480156104d257600080fd5b506104db610de9565b6040516104e891906125ed565b60405180910390f35b3480156104fd57600080fd5b5061051860048036038101906105139190612975565b610def565b005b34801561052657600080fd5b5061052f610e08565b005b34801561053d57600080fd5b5061055860048036038101906105539190612aea565b610e5b565b005b34801561056657600080fd5b50610581600480360381019061057c9190612bd4565b610f05565b005b34801561058f57600080fd5b506105aa60048036038101906105a591906126ef565b610f56565b6040516105b791906126a1565b60405180910390f35b3480156105cc57600080fd5b506105e760048036038101906105e291906126ef565b610fbe565b005b3480156105f557600080fd5b506105fe611058565b60405161060b91906125ed565b60405180910390f35b34801561062057600080fd5b5061062961105e565b60405161063691906126a1565b60405180910390f35b34801561064b57600080fd5b5061066660048036038101906106619190612c57565b61109b565b60405161067391906125b9565b60405180910390f35b34801561068857600080fd5b506106a3600480360381019061069e91906127a4565b61112f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061077057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610780575061077f826111cd565b5b9050919050565b60075481565b60606000805461079c90612cc6565b80601f01602080910402602001604051908101604052809291908181526020018280546107c890612cc6565b80156108155780601f106107ea57610100808354040283529160200191610815565b820191906000526020600020905b8154815290600101906020018083116107f857829003601f168201915b5050505050905090565b600061082a82611237565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8161086f81611282565b610879838361137f565b505050565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108bc576108bb33611282565b5b6108c7848484611496565b50505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461095d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095490612d69565b60405180910390fd5b8060098190555050565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109b7576109b633611282565b5b6109c28484846114f6565b50505050565b806009546109d69190612db8565b341015610a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0f90612e5e565b60405180910390fd5b610a223382611516565b50565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aac90612d69565b60405180910390fd5b60004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610b00573d6000803e3d6000fd5b50808273ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080610b6c836115af565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd490612eca565b60405180910390fd5b80915050919050565b60085481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5390612f5c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600a8054610cb090612cc6565b80601f0160208091040260200160405190810160405280929190818152602001828054610cdc90612cc6565b8015610d295780601f10610cfe57610100808354040283529160200191610d29565b820191906000526020600020905b815481529060010190602001808311610d0c57829003601f168201915b505050505081565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060018054610d6690612cc6565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9290612cc6565b8015610ddf5780601f10610db457610100808354040283529160200191610ddf565b820191906000526020600020905b815481529060010190602001808311610dc257829003601f168201915b5050505050905090565b60095481565b81610df981611282565b610e0383836115ec565b505050565b600854600b5410610e4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4590612fc8565b60405180910390fd5b610e59336001611516565b565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee290612d69565b60405180910390fd5b80600a9080519060200190610f01929190612462565b5050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f4357610f4233611282565b5b610f4f85858585611602565b5050505050565b6060610f6182611237565b6000610f6b611664565b90506000815111610f8b5760405180602001604052806000815250610fb6565b80610f95846116f6565b604051602001610fa6929190613024565b6040516020818303038152906040525b915050919050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461104e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104590612d69565b60405180910390fd5b8060088190555050565b600b5481565b60606040518060400160405280601781526020017f687474703a2f2f64756e67656f6e73706173732e636f6d000000000000000000815250905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b690612d69565b60405180910390fd5b6111c98282611516565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611240816117c4565b61127f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127690612eca565b60405180910390fd5b50565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561137c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016112f9929190613048565b602060405180830381865afa158015611316573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133a9190613086565b61137b57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611372919061275d565b60405180910390fd5b5b50565b600061138a82610b60565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f190613125565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611419611805565b73ffffffffffffffffffffffffffffffffffffffff161480611448575061144781611442611805565b61109b565b5b611487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147e906131b7565b60405180910390fd5b611491838361180d565b505050565b6114a76114a1611805565b826118c6565b6114e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114dd90613249565b60405180910390fd5b6114f183838361195b565b505050565b61151183838360405180602001604052806000815250610f05565b505050565b60075481600b546115279190613269565b1115611568576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155f9061330b565b60405180910390fd5b60005b818110156115aa57600b60008154809291906115869061332b565b919050555061159783600b54611c54565b80806115a29061332b565b91505061156b565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6115fe6115f7611805565b8383611e71565b5050565b61161361160d611805565b836118c6565b611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164990613249565b60405180910390fd5b61165e84848484611fdd565b50505050565b6060600a805461167390612cc6565b80601f016020809104026020016040519081016040528092919081815260200182805461169f90612cc6565b80156116ec5780601f106116c1576101008083540402835291602001916116ec565b820191906000526020600020905b8154815290600101906020018083116116cf57829003601f168201915b5050505050905090565b60606000600161170584612039565b01905060008167ffffffffffffffff811115611724576117236129bf565b5b6040519080825280601f01601f1916602001820160405280156117565781602001600182028036833780820191505090505b509050600082602001820190505b6001156117b9578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816117ad576117ac613373565b5b04945060008503611764575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166117e6836115af565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661188083610b60565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806118d283610b60565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806119145750611913818561109b565b5b8061195257508373ffffffffffffffffffffffffffffffffffffffff1661193a8461081f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661197b82610b60565b73ffffffffffffffffffffffffffffffffffffffff16146119d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c890613414565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a37906134a6565b60405180910390fd5b611a4d838383600161218c565b8273ffffffffffffffffffffffffffffffffffffffff16611a6d82610b60565b73ffffffffffffffffffffffffffffffffffffffff1614611ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aba90613414565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c4f83838360016122b2565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611cc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cba90613512565b60405180910390fd5b611ccc816117c4565b15611d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d039061357e565b60405180910390fd5b611d1a60008383600161218c565b611d23816117c4565b15611d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5a9061357e565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e6d6000838360016122b2565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed6906135ea565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fd091906125b9565b60405180910390a3505050565b611fe884848461195b565b611ff4848484846122b8565b612033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202a9061367c565b60405180910390fd5b50505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612097577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161208d5761208c613373565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106120d4576d04ee2d6d415b85acef810000000083816120ca576120c9613373565b5b0492506020810190505b662386f26fc10000831061210357662386f26fc1000083816120f9576120f8613373565b5b0492506010810190505b6305f5e100831061212c576305f5e100838161212257612121613373565b5b0492506008810190505b612710831061215157612710838161214757612146613373565b5b0492506004810190505b60648310612174576064838161216a57612169613373565b5b0492506002810190505b600a8310612183576001810190505b80915050919050565b60018111156122ac57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146122205780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612218919061369c565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146122ab5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122a39190613269565b925050819055505b5b50505050565b50505050565b60006122d98473ffffffffffffffffffffffffffffffffffffffff1661243f565b15612432578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612302611805565b8786866040518563ffffffff1660e01b81526004016123249493929190613725565b6020604051808303816000875af192505050801561236057506040513d601f19601f8201168201806040525081019061235d9190613786565b60015b6123e2573d8060008114612390576040519150601f19603f3d011682016040523d82523d6000602084013e612395565b606091505b5060008151036123da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d19061367c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612437565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461246e90612cc6565b90600052602060002090601f01602090048101928261249057600085556124d7565b82601f106124a957805160ff19168380011785556124d7565b828001600101855582156124d7579182015b828111156124d65782518255916020019190600101906124bb565b5b5090506124e491906124e8565b5090565b5b808211156125015760008160009055506001016124e9565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61254e81612519565b811461255957600080fd5b50565b60008135905061256b81612545565b92915050565b6000602082840312156125875761258661250f565b5b60006125958482850161255c565b91505092915050565b60008115159050919050565b6125b38161259e565b82525050565b60006020820190506125ce60008301846125aa565b92915050565b6000819050919050565b6125e7816125d4565b82525050565b600060208201905061260260008301846125de565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612642578082015181840152602081019050612627565b83811115612651576000848401525b50505050565b6000601f19601f8301169050919050565b600061267382612608565b61267d8185612613565b935061268d818560208601612624565b61269681612657565b840191505092915050565b600060208201905081810360008301526126bb8184612668565b905092915050565b6126cc816125d4565b81146126d757600080fd5b50565b6000813590506126e9816126c3565b92915050565b6000602082840312156127055761270461250f565b5b6000612713848285016126da565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127478261271c565b9050919050565b6127578161273c565b82525050565b6000602082019050612772600083018461274e565b92915050565b6127818161273c565b811461278c57600080fd5b50565b60008135905061279e81612778565b92915050565b600080604083850312156127bb576127ba61250f565b5b60006127c98582860161278f565b92505060206127da858286016126da565b9150509250929050565b6000806000606084860312156127fd576127fc61250f565b5b600061280b8682870161278f565b935050602061281c8682870161278f565b925050604061282d868287016126da565b9150509250925092565b6000819050919050565b600061285c6128576128528461271c565b612837565b61271c565b9050919050565b600061286e82612841565b9050919050565b600061288082612863565b9050919050565b61289081612875565b82525050565b60006020820190506128ab6000830184612887565b92915050565b60006128bc8261271c565b9050919050565b6128cc816128b1565b81146128d757600080fd5b50565b6000813590506128e9816128c3565b92915050565b6000602082840312156129055761290461250f565b5b6000612913848285016128da565b91505092915050565b6000602082840312156129325761293161250f565b5b60006129408482850161278f565b91505092915050565b6129528161259e565b811461295d57600080fd5b50565b60008135905061296f81612949565b92915050565b6000806040838503121561298c5761298b61250f565b5b600061299a8582860161278f565b92505060206129ab85828601612960565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6129f782612657565b810181811067ffffffffffffffff82111715612a1657612a156129bf565b5b80604052505050565b6000612a29612505565b9050612a3582826129ee565b919050565b600067ffffffffffffffff821115612a5557612a546129bf565b5b612a5e82612657565b9050602081019050919050565b82818337600083830152505050565b6000612a8d612a8884612a3a565b612a1f565b905082815260208101848484011115612aa957612aa86129ba565b5b612ab4848285612a6b565b509392505050565b600082601f830112612ad157612ad06129b5565b5b8135612ae1848260208601612a7a565b91505092915050565b600060208284031215612b0057612aff61250f565b5b600082013567ffffffffffffffff811115612b1e57612b1d612514565b5b612b2a84828501612abc565b91505092915050565b600067ffffffffffffffff821115612b4e57612b4d6129bf565b5b612b5782612657565b9050602081019050919050565b6000612b77612b7284612b33565b612a1f565b905082815260208101848484011115612b9357612b926129ba565b5b612b9e848285612a6b565b509392505050565b600082601f830112612bbb57612bba6129b5565b5b8135612bcb848260208601612b64565b91505092915050565b60008060008060808587031215612bee57612bed61250f565b5b6000612bfc8782880161278f565b9450506020612c0d8782880161278f565b9350506040612c1e878288016126da565b925050606085013567ffffffffffffffff811115612c3f57612c3e612514565b5b612c4b87828801612ba6565b91505092959194509250565b60008060408385031215612c6e57612c6d61250f565b5b6000612c7c8582860161278f565b9250506020612c8d8582860161278f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612cde57607f821691505b602082108103612cf157612cf0612c97565b5b50919050565b7f546869732066756e6374696f6e206973207265737472696374656420746f207460008201527f6865206f776e6572000000000000000000000000000000000000000000000000602082015250565b6000612d53602883612613565b9150612d5e82612cf7565b604082019050919050565b60006020820190508181036000830152612d8281612d46565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612dc3826125d4565b9150612dce836125d4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e0757612e06612d89565b5b828202905092915050565b7f4e6f7420656e6f756768206574682073656e7421000000000000000000000000600082015250565b6000612e48601483612613565b9150612e5382612e12565b602082019050919050565b60006020820190508181036000830152612e7781612e3b565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612eb4601883612613565b9150612ebf82612e7e565b602082019050919050565b60006020820190508181036000830152612ee381612ea7565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612f46602983612613565b9150612f5182612eea565b604082019050919050565b60006020820190508181036000830152612f7581612f39565b9050919050565b7f4e6f206d6f72652066726565206d696e74732100000000000000000000000000600082015250565b6000612fb2601383612613565b9150612fbd82612f7c565b602082019050919050565b60006020820190508181036000830152612fe181612fa5565b9050919050565b600081905092915050565b6000612ffe82612608565b6130088185612fe8565b9350613018818560208601612624565b80840191505092915050565b60006130308285612ff3565b915061303c8284612ff3565b91508190509392505050565b600060408201905061305d600083018561274e565b61306a602083018461274e565b9392505050565b60008151905061308081612949565b92915050565b60006020828403121561309c5761309b61250f565b5b60006130aa84828501613071565b91505092915050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061310f602183612613565b915061311a826130b3565b604082019050919050565b6000602082019050818103600083015261313e81613102565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006131a1603d83612613565b91506131ac82613145565b604082019050919050565b600060208201905081810360008301526131d081613194565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613233602d83612613565b915061323e826131d7565b604082019050919050565b6000602082019050818103600083015261326281613226565b9050919050565b6000613274826125d4565b915061327f836125d4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132b4576132b3612d89565b5b828201905092915050565b7f43616e2774206d696e742072657175657374656420616d6f756e742100000000600082015250565b60006132f5601c83612613565b9150613300826132bf565b602082019050919050565b60006020820190508181036000830152613324816132e8565b9050919050565b6000613336826125d4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361336857613367612d89565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006133fe602583612613565b9150613409826133a2565b604082019050919050565b6000602082019050818103600083015261342d816133f1565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613490602483612613565b915061349b82613434565b604082019050919050565b600060208201905081810360008301526134bf81613483565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006134fc602083612613565b9150613507826134c6565b602082019050919050565b6000602082019050818103600083015261352b816134ef565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613568601c83612613565b915061357382613532565b602082019050919050565b600060208201905081810360008301526135978161355b565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006135d4601983612613565b91506135df8261359e565b602082019050919050565b60006020820190508181036000830152613603816135c7565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613666603283612613565b91506136718261360a565b604082019050919050565b6000602082019050818103600083015261369581613659565b9050919050565b60006136a7826125d4565b91506136b2836125d4565b9250828210156136c5576136c4612d89565b5b828203905092915050565b600081519050919050565b600082825260208201905092915050565b60006136f7826136d0565b61370181856136db565b9350613711818560208601612624565b61371a81612657565b840191505092915050565b600060808201905061373a600083018761274e565b613747602083018661274e565b61375460408301856125de565b818103606083015261376681846136ec565b905095945050505050565b60008151905061378081612545565b92915050565b60006020828403121561379c5761379b61250f565b5b60006137aa84828501613771565b9150509291505056fea2646970667358221220de0cdf13bfb72de1cf764e97b7e3a6dcbd7f58c97a96de1aa16990cce2d31b2064736f6c634300080d003368747470733a2f2f64756e67656f6e7367656e657369732e73332e75732d776573742d312e616d617a6f6e6177732e636f6d2f

Deployed Bytecode

0x6080604052600436106101b75760003560e01c8063786f2910116100ec578063b88d4fde1161008a578063d8e8708911610064578063d8e87089146105e9578063e8a3d48514610614578063e985e9c51461063f578063f21a0c0d1461067c576101b7565b8063b88d4fde1461055a578063c87b56dd14610583578063d4c4641c146105c0576101b7565b8063a035b1fe116100c6578063a035b1fe146104c6578063a22cb465146104f1578063a4c19a9f1461051a578063af1c521114610531576101b7565b8063786f2910146104455780638da5cb5b1461047057806395d89b411461049b576101b7565b806341f434341161015957806351cff8d91161013357806351cff8d9146103775780636352211e146103a057806366fe513a146103dd57806370a0823114610408576101b7565b806341f434341461030757806342842e0e146103325780634bbcd31c1461035b576101b7565b8063081812fc11610195578063081812fc1461024f578063095ea7b31461028c57806323b872dd146102b557806328bf794d146102de576101b7565b806301ffc9a7146101bc578063047fc9aa146101f957806306fdde0314610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612571565b6106a5565b6040516101f091906125b9565b60405180910390f35b34801561020557600080fd5b5061020e610787565b60405161021b91906125ed565b60405180910390f35b34801561023057600080fd5b5061023961078d565b60405161024691906126a1565b60405180910390f35b34801561025b57600080fd5b50610276600480360381019061027191906126ef565b61081f565b604051610283919061275d565b60405180910390f35b34801561029857600080fd5b506102b360048036038101906102ae91906127a4565b610865565b005b3480156102c157600080fd5b506102dc60048036038101906102d791906127e4565b61087e565b005b3480156102ea57600080fd5b50610305600480360381019061030091906126ef565b6108cd565b005b34801561031357600080fd5b5061031c610967565b6040516103299190612896565b60405180910390f35b34801561033e57600080fd5b50610359600480360381019061035491906127e4565b610979565b005b610375600480360381019061037091906126ef565b6109c8565b005b34801561038357600080fd5b5061039e600480360381019061039991906128ef565b610a25565b005b3480156103ac57600080fd5b506103c760048036038101906103c291906126ef565b610b60565b6040516103d4919061275d565b60405180910390f35b3480156103e957600080fd5b506103f2610be6565b6040516103ff91906125ed565b60405180910390f35b34801561041457600080fd5b5061042f600480360381019061042a919061291c565b610bec565b60405161043c91906125ed565b60405180910390f35b34801561045157600080fd5b5061045a610ca3565b60405161046791906126a1565b60405180910390f35b34801561047c57600080fd5b50610485610d31565b604051610492919061275d565b60405180910390f35b3480156104a757600080fd5b506104b0610d57565b6040516104bd91906126a1565b60405180910390f35b3480156104d257600080fd5b506104db610de9565b6040516104e891906125ed565b60405180910390f35b3480156104fd57600080fd5b5061051860048036038101906105139190612975565b610def565b005b34801561052657600080fd5b5061052f610e08565b005b34801561053d57600080fd5b5061055860048036038101906105539190612aea565b610e5b565b005b34801561056657600080fd5b50610581600480360381019061057c9190612bd4565b610f05565b005b34801561058f57600080fd5b506105aa60048036038101906105a591906126ef565b610f56565b6040516105b791906126a1565b60405180910390f35b3480156105cc57600080fd5b506105e760048036038101906105e291906126ef565b610fbe565b005b3480156105f557600080fd5b506105fe611058565b60405161060b91906125ed565b60405180910390f35b34801561062057600080fd5b5061062961105e565b60405161063691906126a1565b60405180910390f35b34801561064b57600080fd5b5061066660048036038101906106619190612c57565b61109b565b60405161067391906125b9565b60405180910390f35b34801561068857600080fd5b506106a3600480360381019061069e91906127a4565b61112f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061077057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610780575061077f826111cd565b5b9050919050565b60075481565b60606000805461079c90612cc6565b80601f01602080910402602001604051908101604052809291908181526020018280546107c890612cc6565b80156108155780601f106107ea57610100808354040283529160200191610815565b820191906000526020600020905b8154815290600101906020018083116107f857829003601f168201915b5050505050905090565b600061082a82611237565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8161086f81611282565b610879838361137f565b505050565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108bc576108bb33611282565b5b6108c7848484611496565b50505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461095d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095490612d69565b60405180910390fd5b8060098190555050565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109b7576109b633611282565b5b6109c28484846114f6565b50505050565b806009546109d69190612db8565b341015610a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0f90612e5e565b60405180910390fd5b610a223382611516565b50565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aac90612d69565b60405180910390fd5b60004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610b00573d6000803e3d6000fd5b50808273ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080610b6c836115af565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd490612eca565b60405180910390fd5b80915050919050565b60085481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5390612f5c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600a8054610cb090612cc6565b80601f0160208091040260200160405190810160405280929190818152602001828054610cdc90612cc6565b8015610d295780601f10610cfe57610100808354040283529160200191610d29565b820191906000526020600020905b815481529060010190602001808311610d0c57829003601f168201915b505050505081565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060018054610d6690612cc6565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9290612cc6565b8015610ddf5780601f10610db457610100808354040283529160200191610ddf565b820191906000526020600020905b815481529060010190602001808311610dc257829003601f168201915b5050505050905090565b60095481565b81610df981611282565b610e0383836115ec565b505050565b600854600b5410610e4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4590612fc8565b60405180910390fd5b610e59336001611516565b565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee290612d69565b60405180910390fd5b80600a9080519060200190610f01929190612462565b5050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f4357610f4233611282565b5b610f4f85858585611602565b5050505050565b6060610f6182611237565b6000610f6b611664565b90506000815111610f8b5760405180602001604052806000815250610fb6565b80610f95846116f6565b604051602001610fa6929190613024565b6040516020818303038152906040525b915050919050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461104e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104590612d69565b60405180910390fd5b8060088190555050565b600b5481565b60606040518060400160405280601781526020017f687474703a2f2f64756e67656f6e73706173732e636f6d000000000000000000815250905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b690612d69565b60405180910390fd5b6111c98282611516565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611240816117c4565b61127f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127690612eca565b60405180910390fd5b50565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561137c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016112f9929190613048565b602060405180830381865afa158015611316573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133a9190613086565b61137b57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611372919061275d565b60405180910390fd5b5b50565b600061138a82610b60565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f190613125565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611419611805565b73ffffffffffffffffffffffffffffffffffffffff161480611448575061144781611442611805565b61109b565b5b611487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147e906131b7565b60405180910390fd5b611491838361180d565b505050565b6114a76114a1611805565b826118c6565b6114e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114dd90613249565b60405180910390fd5b6114f183838361195b565b505050565b61151183838360405180602001604052806000815250610f05565b505050565b60075481600b546115279190613269565b1115611568576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155f9061330b565b60405180910390fd5b60005b818110156115aa57600b60008154809291906115869061332b565b919050555061159783600b54611c54565b80806115a29061332b565b91505061156b565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6115fe6115f7611805565b8383611e71565b5050565b61161361160d611805565b836118c6565b611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164990613249565b60405180910390fd5b61165e84848484611fdd565b50505050565b6060600a805461167390612cc6565b80601f016020809104026020016040519081016040528092919081815260200182805461169f90612cc6565b80156116ec5780601f106116c1576101008083540402835291602001916116ec565b820191906000526020600020905b8154815290600101906020018083116116cf57829003601f168201915b5050505050905090565b60606000600161170584612039565b01905060008167ffffffffffffffff811115611724576117236129bf565b5b6040519080825280601f01601f1916602001820160405280156117565781602001600182028036833780820191505090505b509050600082602001820190505b6001156117b9578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816117ad576117ac613373565b5b04945060008503611764575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166117e6836115af565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661188083610b60565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806118d283610b60565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806119145750611913818561109b565b5b8061195257508373ffffffffffffffffffffffffffffffffffffffff1661193a8461081f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661197b82610b60565b73ffffffffffffffffffffffffffffffffffffffff16146119d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c890613414565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a37906134a6565b60405180910390fd5b611a4d838383600161218c565b8273ffffffffffffffffffffffffffffffffffffffff16611a6d82610b60565b73ffffffffffffffffffffffffffffffffffffffff1614611ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aba90613414565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c4f83838360016122b2565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611cc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cba90613512565b60405180910390fd5b611ccc816117c4565b15611d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d039061357e565b60405180910390fd5b611d1a60008383600161218c565b611d23816117c4565b15611d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5a9061357e565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e6d6000838360016122b2565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed6906135ea565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fd091906125b9565b60405180910390a3505050565b611fe884848461195b565b611ff4848484846122b8565b612033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202a9061367c565b60405180910390fd5b50505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612097577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161208d5761208c613373565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106120d4576d04ee2d6d415b85acef810000000083816120ca576120c9613373565b5b0492506020810190505b662386f26fc10000831061210357662386f26fc1000083816120f9576120f8613373565b5b0492506010810190505b6305f5e100831061212c576305f5e100838161212257612121613373565b5b0492506008810190505b612710831061215157612710838161214757612146613373565b5b0492506004810190505b60648310612174576064838161216a57612169613373565b5b0492506002810190505b600a8310612183576001810190505b80915050919050565b60018111156122ac57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146122205780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612218919061369c565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146122ab5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122a39190613269565b925050819055505b5b50505050565b50505050565b60006122d98473ffffffffffffffffffffffffffffffffffffffff1661243f565b15612432578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612302611805565b8786866040518563ffffffff1660e01b81526004016123249493929190613725565b6020604051808303816000875af192505050801561236057506040513d601f19601f8201168201806040525081019061235d9190613786565b60015b6123e2573d8060008114612390576040519150601f19603f3d011682016040523d82523d6000602084013e612395565b606091505b5060008151036123da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d19061367c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612437565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461246e90612cc6565b90600052602060002090601f01602090048101928261249057600085556124d7565b82601f106124a957805160ff19168380011785556124d7565b828001600101855582156124d7579182015b828111156124d65782518255916020019190600101906124bb565b5b5090506124e491906124e8565b5090565b5b808211156125015760008160009055506001016124e9565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61254e81612519565b811461255957600080fd5b50565b60008135905061256b81612545565b92915050565b6000602082840312156125875761258661250f565b5b60006125958482850161255c565b91505092915050565b60008115159050919050565b6125b38161259e565b82525050565b60006020820190506125ce60008301846125aa565b92915050565b6000819050919050565b6125e7816125d4565b82525050565b600060208201905061260260008301846125de565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612642578082015181840152602081019050612627565b83811115612651576000848401525b50505050565b6000601f19601f8301169050919050565b600061267382612608565b61267d8185612613565b935061268d818560208601612624565b61269681612657565b840191505092915050565b600060208201905081810360008301526126bb8184612668565b905092915050565b6126cc816125d4565b81146126d757600080fd5b50565b6000813590506126e9816126c3565b92915050565b6000602082840312156127055761270461250f565b5b6000612713848285016126da565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127478261271c565b9050919050565b6127578161273c565b82525050565b6000602082019050612772600083018461274e565b92915050565b6127818161273c565b811461278c57600080fd5b50565b60008135905061279e81612778565b92915050565b600080604083850312156127bb576127ba61250f565b5b60006127c98582860161278f565b92505060206127da858286016126da565b9150509250929050565b6000806000606084860312156127fd576127fc61250f565b5b600061280b8682870161278f565b935050602061281c8682870161278f565b925050604061282d868287016126da565b9150509250925092565b6000819050919050565b600061285c6128576128528461271c565b612837565b61271c565b9050919050565b600061286e82612841565b9050919050565b600061288082612863565b9050919050565b61289081612875565b82525050565b60006020820190506128ab6000830184612887565b92915050565b60006128bc8261271c565b9050919050565b6128cc816128b1565b81146128d757600080fd5b50565b6000813590506128e9816128c3565b92915050565b6000602082840312156129055761290461250f565b5b6000612913848285016128da565b91505092915050565b6000602082840312156129325761293161250f565b5b60006129408482850161278f565b91505092915050565b6129528161259e565b811461295d57600080fd5b50565b60008135905061296f81612949565b92915050565b6000806040838503121561298c5761298b61250f565b5b600061299a8582860161278f565b92505060206129ab85828601612960565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6129f782612657565b810181811067ffffffffffffffff82111715612a1657612a156129bf565b5b80604052505050565b6000612a29612505565b9050612a3582826129ee565b919050565b600067ffffffffffffffff821115612a5557612a546129bf565b5b612a5e82612657565b9050602081019050919050565b82818337600083830152505050565b6000612a8d612a8884612a3a565b612a1f565b905082815260208101848484011115612aa957612aa86129ba565b5b612ab4848285612a6b565b509392505050565b600082601f830112612ad157612ad06129b5565b5b8135612ae1848260208601612a7a565b91505092915050565b600060208284031215612b0057612aff61250f565b5b600082013567ffffffffffffffff811115612b1e57612b1d612514565b5b612b2a84828501612abc565b91505092915050565b600067ffffffffffffffff821115612b4e57612b4d6129bf565b5b612b5782612657565b9050602081019050919050565b6000612b77612b7284612b33565b612a1f565b905082815260208101848484011115612b9357612b926129ba565b5b612b9e848285612a6b565b509392505050565b600082601f830112612bbb57612bba6129b5565b5b8135612bcb848260208601612b64565b91505092915050565b60008060008060808587031215612bee57612bed61250f565b5b6000612bfc8782880161278f565b9450506020612c0d8782880161278f565b9350506040612c1e878288016126da565b925050606085013567ffffffffffffffff811115612c3f57612c3e612514565b5b612c4b87828801612ba6565b91505092959194509250565b60008060408385031215612c6e57612c6d61250f565b5b6000612c7c8582860161278f565b9250506020612c8d8582860161278f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612cde57607f821691505b602082108103612cf157612cf0612c97565b5b50919050565b7f546869732066756e6374696f6e206973207265737472696374656420746f207460008201527f6865206f776e6572000000000000000000000000000000000000000000000000602082015250565b6000612d53602883612613565b9150612d5e82612cf7565b604082019050919050565b60006020820190508181036000830152612d8281612d46565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612dc3826125d4565b9150612dce836125d4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e0757612e06612d89565b5b828202905092915050565b7f4e6f7420656e6f756768206574682073656e7421000000000000000000000000600082015250565b6000612e48601483612613565b9150612e5382612e12565b602082019050919050565b60006020820190508181036000830152612e7781612e3b565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612eb4601883612613565b9150612ebf82612e7e565b602082019050919050565b60006020820190508181036000830152612ee381612ea7565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612f46602983612613565b9150612f5182612eea565b604082019050919050565b60006020820190508181036000830152612f7581612f39565b9050919050565b7f4e6f206d6f72652066726565206d696e74732100000000000000000000000000600082015250565b6000612fb2601383612613565b9150612fbd82612f7c565b602082019050919050565b60006020820190508181036000830152612fe181612fa5565b9050919050565b600081905092915050565b6000612ffe82612608565b6130088185612fe8565b9350613018818560208601612624565b80840191505092915050565b60006130308285612ff3565b915061303c8284612ff3565b91508190509392505050565b600060408201905061305d600083018561274e565b61306a602083018461274e565b9392505050565b60008151905061308081612949565b92915050565b60006020828403121561309c5761309b61250f565b5b60006130aa84828501613071565b91505092915050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061310f602183612613565b915061311a826130b3565b604082019050919050565b6000602082019050818103600083015261313e81613102565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006131a1603d83612613565b91506131ac82613145565b604082019050919050565b600060208201905081810360008301526131d081613194565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613233602d83612613565b915061323e826131d7565b604082019050919050565b6000602082019050818103600083015261326281613226565b9050919050565b6000613274826125d4565b915061327f836125d4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132b4576132b3612d89565b5b828201905092915050565b7f43616e2774206d696e742072657175657374656420616d6f756e742100000000600082015250565b60006132f5601c83612613565b9150613300826132bf565b602082019050919050565b60006020820190508181036000830152613324816132e8565b9050919050565b6000613336826125d4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361336857613367612d89565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006133fe602583612613565b9150613409826133a2565b604082019050919050565b6000602082019050818103600083015261342d816133f1565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613490602483612613565b915061349b82613434565b604082019050919050565b600060208201905081810360008301526134bf81613483565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006134fc602083612613565b9150613507826134c6565b602082019050919050565b6000602082019050818103600083015261352b816134ef565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613568601c83612613565b915061357382613532565b602082019050919050565b600060208201905081810360008301526135978161355b565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006135d4601983612613565b91506135df8261359e565b602082019050919050565b60006020820190508181036000830152613603816135c7565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613666603283612613565b91506136718261360a565b604082019050919050565b6000602082019050818103600083015261369581613659565b9050919050565b60006136a7826125d4565b91506136b2836125d4565b9250828210156136c5576136c4612d89565b5b828203905092915050565b600081519050919050565b600082825260208201905092915050565b60006136f7826136d0565b61370181856136db565b9350613711818560208601612624565b61371a81612657565b840191505092915050565b600060808201905061373a600083018761274e565b613747602083018661274e565b61375460408301856125de565b818103606083015261376681846136ec565b905095945050505050565b60008151905061378081612545565b92915050565b60006020828403121561379c5761379b61250f565b5b60006137aa84828501613771565b9150509291505056fea2646970667358221220de0cdf13bfb72de1cf764e97b7e3a6dcbd7f58c97a96de1aa16990cce2d31b2064736f6c634300080d0033

Deployed Bytecode Sourcemap

57080:3065:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41182:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57186:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42110:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43622:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59431:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59596:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57658:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2869:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59767:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58316;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58953:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41820:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57221:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41551:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57306:78;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57144:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42279:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57260:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59247:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58170:138;;;;;;;;;;;;;:::i;:::-;;58725:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59946:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42454:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57754:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57393:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58835:110;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44091:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58495:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41182:305;41284:4;41336:25;41321:40;;;:11;:40;;;;:105;;;;41393:33;41378:48;;;:11;:48;;;;41321:105;:158;;;;41443:36;41467:11;41443:23;:36::i;:::-;41321:158;41301:178;;41182:305;;;:::o;57186:28::-;;;;:::o;42110:100::-;42164:13;42197:5;42190:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42110:100;:::o;43622:171::-;43698:7;43718:23;43733:7;43718:14;:23::i;:::-;43761:15;:24;43777:7;43761:24;;;;;;;;;;;;;;;;;;;;;43754:31;;43622:171;;;:::o;59431:157::-;59527:8;4390:30;4411:8;4390:20;:30::i;:::-;59548:32:::1;59562:8;59572:7;59548:13;:32::i;:::-;59431:157:::0;;;:::o;59596:163::-;59697:4;4218:10;4210:18;;:4;:18;;;4206:83;;4245:32;4266:10;4245:20;:32::i;:::-;4206:83;59714:37:::1;59733:4;59739:2;59743:7;59714:18;:37::i;:::-;59596:163:::0;;;;:::o;57658:88::-;57491:5;;;;;;;;;;;57477:19;;:10;:19;;;57469:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;57732:6:::1;57724:5;:14;;;;57658:88:::0;:::o;2869:143::-;2969:42;2869:143;:::o;59767:171::-;59872:4;4218:10;4210:18;;:4;:18;;;4206:83;;4245:32;4266:10;4245:20;:32::i;:::-;4206:83;59889:41:::1;59912:4;59918:2;59922:7;59889:22;:41::i;:::-;59767:171:::0;;;;:::o;58316:::-;58411:7;58403:5;;:15;;;;:::i;:::-;58390:9;:28;;58382:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;58454:25;58459:10;58471:7;58454:4;:25::i;:::-;58316:171;:::o;58953:206::-;57491:5;;;;;;;;;;;57477:19;;:10;:19;;;57469:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;59024:14:::1;59041:21;59024:38;;59073:6;:15;;:23;59089:6;59073:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;59144:6;59136;59112:39;;59129:4;59112:39;;;;;;;;;;;;59013:146;58953:206:::0;:::o;41820:223::-;41892:7;41912:13;41928:17;41937:7;41928:8;:17::i;:::-;41912:33;;41981:1;41964:19;;:5;:19;;;41956:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;42030:5;42023:12;;;41820:223;;;:::o;57221:32::-;;;;:::o;41551:207::-;41623:7;41668:1;41651:19;;:5;:19;;;41643:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41734:9;:16;41744:5;41734:16;;;;;;;;;;;;;;;;41727:23;;41551:207;;;:::o;57306:78::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57144:33::-;;;;;;;;;;;;;:::o;42279:104::-;42335:13;42368:7;42361:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42279:104;:::o;57260:39::-;;;;:::o;59247:176::-;59351:8;4390:30;4411:8;4390:20;:30::i;:::-;59372:43:::1;59396:8;59406;59372:23;:43::i;:::-;59247:176:::0;;;:::o;58170:138::-;58235:11;;58217:15;;:29;58209:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;58281:19;58286:10;58298:1;58281:4;:19::i;:::-;58170:138::o;58725:102::-;57491:5;;;;;;;;;;;57477:19;;:10;:19;;;57469:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;58812:7:::1;58801:8;:18;;;;;;;;;;;;:::i;:::-;;58725:102:::0;:::o;59946:196::-;60070:4;4218:10;4210:18;;:4;:18;;;4206:83;;4245:32;4266:10;4245:20;:32::i;:::-;4206:83;60087:47:::1;60110:4;60116:2;60120:7;60129:4;60087:22;:47::i;:::-;59946:196:::0;;;;;:::o;42454:281::-;42527:13;42553:23;42568:7;42553:14;:23::i;:::-;42589:21;42613:10;:8;:10::i;:::-;42589:34;;42665:1;42647:7;42641:21;:25;:86;;;;;;;;;;;;;;;;;42693:7;42702:18;:7;:16;:18::i;:::-;42676:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42641:86;42634:93;;;42454:281;;;:::o;57754:112::-;57491:5;;;;;;;;;;;57477:19;;:10;:19;;;57469:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;57846:12:::1;57832:11;:26;;;;57754:112:::0;:::o;57393:34::-;;;;:::o;58835:110::-;58879:13;58905:32;;;;;;;;;;;;;;;;;;;58835:110;:::o;44091:164::-;44188:4;44212:18;:25;44231:5;44212:25;;;;;;;;;;;;;;;:35;44238:8;44212:35;;;;;;;;;;;;;;;;;;;;;;;;;44205:42;;44091:164;;;;:::o;58495:113::-;57491:5;;;;;;;;;;;57477:19;;:10;:19;;;57469:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;58579:21:::1;58584:6;58592:7;58579:4;:21::i;:::-;58495:113:::0;;:::o;33694:157::-;33779:4;33818:25;33803:40;;;:11;:40;;;;33796:47;;33694:157;;;:::o;53441:135::-;53523:16;53531:7;53523;:16::i;:::-;53515:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;53441:135;:::o;4448:419::-;4687:1;2969:42;4639:45;;;:49;4635:225;;;2969:42;4710;;;4761:4;4768:8;4710:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4705:144;;4824:8;4805:28;;;;;;;;;;;:::i;:::-;;;;;;;;4705:144;4635:225;4448:419;:::o;43140:416::-;43221:13;43237:23;43252:7;43237:14;:23::i;:::-;43221:39;;43285:5;43279:11;;:2;:11;;;43271:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;43379:5;43363:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;43388:37;43405:5;43412:12;:10;:12::i;:::-;43388:16;:37::i;:::-;43363:62;43341:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;43527:21;43536:2;43540:7;43527:8;:21::i;:::-;43210:346;43140:416;;:::o;44322:335::-;44517:41;44536:12;:10;:12::i;:::-;44550:7;44517:18;:41::i;:::-;44509:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;44621:28;44631:4;44637:2;44641:7;44621:9;:28::i;:::-;44322:335;;;:::o;44728:185::-;44866:39;44883:4;44889:2;44893:7;44866:39;;;;;;;;;;;;:16;:39::i;:::-;44728:185;;;:::o;57874:288::-;57978:6;;57967:7;57949:15;;:25;;;;:::i;:::-;:35;;57941:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;58033:9;58028:127;58052:7;58048:1;:11;58028:127;;;58081:15;;:17;;;;;;;;;:::i;:::-;;;;;;58113:30;58119:6;58127:15;;58113:5;:30::i;:::-;58061:3;;;;;:::i;:::-;;;;58028:127;;;;57874:288;;:::o;46614:117::-;46680:7;46707;:16;46715:7;46707:16;;;;;;;;;;;;;;;;;;;;;46700:23;;46614:117;;;:::o;43865:155::-;43960:52;43979:12;:10;:12::i;:::-;43993:8;44003;43960:18;:52::i;:::-;43865:155;;:::o;44984:322::-;45158:41;45177:12;:10;:12::i;:::-;45191:7;45158:18;:41::i;:::-;45150:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;45260:38;45274:4;45280:2;45284:7;45293:4;45260:13;:38::i;:::-;44984:322;;;;:::o;58616:101::-;58668:13;58701:8;58694:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58616:101;:::o;18643:716::-;18699:13;18750:14;18787:1;18767:17;18778:5;18767:10;:17::i;:::-;:21;18750:38;;18803:20;18837:6;18826:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18803:41;;18859:11;18988:6;18984:2;18980:15;18972:6;18968:28;18961:35;;19025:288;19032:4;19025:288;;;19057:5;;;;;;;;19199:8;19194:2;19187:5;19183:14;19178:30;19173:3;19165:44;19255:2;19246:11;;;;;;:::i;:::-;;;;;19289:1;19280:5;:10;19025:288;19276:21;19025:288;19334:6;19327:13;;;;;18643:716;;;:::o;47044:128::-;47109:4;47162:1;47133:31;;:17;47142:7;47133:8;:17::i;:::-;:31;;;;47126:38;;47044:128;;;:::o;21216:98::-;21269:7;21296:10;21289:17;;21216:98;:::o;52720:174::-;52822:2;52795:15;:24;52811:7;52795:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;52878:7;52874:2;52840:46;;52849:23;52864:7;52849:14;:23::i;:::-;52840:46;;;;;;;;;;;;52720:174;;:::o;47339:264::-;47432:4;47449:13;47465:23;47480:7;47465:14;:23::i;:::-;47449:39;;47518:5;47507:16;;:7;:16;;;:52;;;;47527:32;47544:5;47551:7;47527:16;:32::i;:::-;47507:52;:87;;;;47587:7;47563:31;;:20;47575:7;47563:11;:20::i;:::-;:31;;;47507:87;47499:96;;;47339:264;;;;:::o;51338:1263::-;51497:4;51470:31;;:23;51485:7;51470:14;:23::i;:::-;:31;;;51462:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;51576:1;51562:16;;:2;:16;;;51554:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;51632:42;51653:4;51659:2;51663:7;51672:1;51632:20;:42::i;:::-;51804:4;51777:31;;:23;51792:7;51777:14;:23::i;:::-;:31;;;51769:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;51922:15;:24;51938:7;51922:24;;;;;;;;;;;;51915:31;;;;;;;;;;;52417:1;52398:9;:15;52408:4;52398:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;52450:1;52433:9;:13;52443:2;52433:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;52492:2;52473:7;:16;52481:7;52473:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;52531:7;52527:2;52512:27;;52521:4;52512:27;;;;;;;;;;;;52552:41;52572:4;52578:2;52582:7;52591:1;52552:19;:41::i;:::-;51338:1263;;;:::o;48937:942::-;49031:1;49017:16;;:2;:16;;;49009:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;49090:16;49098:7;49090;:16::i;:::-;49089:17;49081:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;49152:48;49181:1;49185:2;49189:7;49198:1;49152:20;:48::i;:::-;49299:16;49307:7;49299;:16::i;:::-;49298:17;49290:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;49714:1;49697:9;:13;49707:2;49697:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;49758:2;49739:7;:16;49747:7;49739:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;49803:7;49799:2;49778:33;;49795:1;49778:33;;;;;;;;;;;;49824:47;49852:1;49856:2;49860:7;49869:1;49824:19;:47::i;:::-;48937:942;;:::o;53037:315::-;53192:8;53183:17;;:5;:17;;;53175:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;53279:8;53241:18;:25;53260:5;53241:25;;;;;;;;;;;;;;;:35;53267:8;53241:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;53325:8;53303:41;;53318:5;53303:41;;;53335:8;53303:41;;;;;;:::i;:::-;;;;;;;;53037:315;;;:::o;46187:313::-;46343:28;46353:4;46359:2;46363:7;46343:9;:28::i;:::-;46390:47;46413:4;46419:2;46423:7;46432:4;46390:22;:47::i;:::-;46382:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;46187:313;;;;:::o;15509:922::-;15562:7;15582:14;15599:1;15582:18;;15649:6;15640:5;:15;15636:102;;15685:6;15676:15;;;;;;:::i;:::-;;;;;15720:2;15710:12;;;;15636:102;15765:6;15756:5;:15;15752:102;;15801:6;15792:15;;;;;;:::i;:::-;;;;;15836:2;15826:12;;;;15752:102;15881:6;15872:5;:15;15868:102;;15917:6;15908:15;;;;;;:::i;:::-;;;;;15952:2;15942:12;;;;15868:102;15997:5;15988;:14;15984:99;;16032:5;16023:14;;;;;;:::i;:::-;;;;;16066:1;16056:11;;;;15984:99;16110:5;16101;:14;16097:99;;16145:5;16136:14;;;;;;:::i;:::-;;;;;16179:1;16169:11;;;;16097:99;16223:5;16214;:14;16210:99;;16258:5;16249:14;;;;;;:::i;:::-;;;;;16292:1;16282:11;;;;16210:99;16336:5;16327;:14;16323:66;;16372:1;16362:11;;;;16323:66;16417:6;16410:13;;;15509:922;;;:::o;55725:410::-;55915:1;55903:9;:13;55899:229;;;55953:1;55937:18;;:4;:18;;;55933:87;;55995:9;55976;:15;55986:4;55976:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;55933:87;56052:1;56038:16;;:2;:16;;;56034:83;;56092:9;56075;:13;56085:2;56075:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;56034:83;55899:229;55725:410;;;;:::o;56857:158::-;;;;;:::o;54140:853::-;54294:4;54315:15;:2;:13;;;:15::i;:::-;54311:675;;;54367:2;54351:36;;;54388:12;:10;:12::i;:::-;54402:4;54408:7;54417:4;54351:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;54347:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54609:1;54592:6;:13;:18;54588:328;;54635:60;;;;;;;;;;:::i;:::-;;;;;;;;54588:328;54866:6;54860:13;54851:6;54847:2;54843:15;54836:38;54347:584;54483:41;;;54473:51;;;:6;:51;;;;54466:58;;;;;54311:675;54970:4;54963:11;;54140:853;;;;;;;:::o;22663:326::-;22723:4;22980:1;22958:7;:19;;;:23;22951:30;;22663:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:118::-;1688:24;1706:5;1688:24;:::i;:::-;1683:3;1676:37;1601:118;;:::o;1725:222::-;1818:4;1856:2;1845:9;1841:18;1833:26;;1869:71;1937:1;1926:9;1922:17;1913:6;1869:71;:::i;:::-;1725:222;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:307::-;2301:1;2311:113;2325:6;2322:1;2319:13;2311:113;;;2410:1;2405:3;2401:11;2395:18;2391:1;2386:3;2382:11;2375:39;2347:2;2344:1;2340:10;2335:15;;2311:113;;;2442:6;2439:1;2436:13;2433:101;;;2522:1;2513:6;2508:3;2504:16;2497:27;2433:101;2282:258;2233:307;;;:::o;2546:102::-;2587:6;2638:2;2634:7;2629:2;2622:5;2618:14;2614:28;2604:38;;2546:102;;;:::o;2654:364::-;2742:3;2770:39;2803:5;2770:39;:::i;:::-;2825:71;2889:6;2884:3;2825:71;:::i;:::-;2818:78;;2905:52;2950:6;2945:3;2938:4;2931:5;2927:16;2905:52;:::i;:::-;2982:29;3004:6;2982:29;:::i;:::-;2977:3;2973:39;2966:46;;2746:272;2654:364;;;;:::o;3024:313::-;3137:4;3175:2;3164:9;3160:18;3152:26;;3224:9;3218:4;3214:20;3210:1;3199:9;3195:17;3188:47;3252:78;3325:4;3316:6;3252:78;:::i;:::-;3244:86;;3024:313;;;;:::o;3343:122::-;3416:24;3434:5;3416:24;:::i;:::-;3409:5;3406:35;3396:63;;3455:1;3452;3445:12;3396:63;3343:122;:::o;3471:139::-;3517:5;3555:6;3542:20;3533:29;;3571:33;3598:5;3571:33;:::i;:::-;3471:139;;;;:::o;3616:329::-;3675:6;3724:2;3712:9;3703:7;3699:23;3695:32;3692:119;;;3730:79;;:::i;:::-;3692:119;3850:1;3875:53;3920:7;3911:6;3900:9;3896:22;3875:53;:::i;:::-;3865:63;;3821:117;3616:329;;;;:::o;3951:126::-;3988:7;4028:42;4021:5;4017:54;4006:65;;3951:126;;;:::o;4083:96::-;4120:7;4149:24;4167:5;4149:24;:::i;:::-;4138:35;;4083:96;;;:::o;4185:118::-;4272:24;4290:5;4272:24;:::i;:::-;4267:3;4260:37;4185:118;;:::o;4309:222::-;4402:4;4440:2;4429:9;4425:18;4417:26;;4453:71;4521:1;4510:9;4506:17;4497:6;4453:71;:::i;:::-;4309:222;;;;:::o;4537:122::-;4610:24;4628:5;4610:24;:::i;:::-;4603:5;4600:35;4590:63;;4649:1;4646;4639:12;4590:63;4537:122;:::o;4665:139::-;4711:5;4749:6;4736:20;4727:29;;4765:33;4792:5;4765:33;:::i;:::-;4665:139;;;;:::o;4810:474::-;4878:6;4886;4935:2;4923:9;4914:7;4910:23;4906:32;4903:119;;;4941:79;;:::i;:::-;4903:119;5061:1;5086:53;5131:7;5122:6;5111:9;5107:22;5086:53;:::i;:::-;5076:63;;5032:117;5188:2;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5159:118;4810:474;;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:60::-;5943:3;5964:5;5957:12;;5915:60;;;:::o;5981:142::-;6031:9;6064:53;6082:34;6091:24;6109:5;6091:24;:::i;:::-;6082:34;:::i;:::-;6064:53;:::i;:::-;6051:66;;5981:142;;;:::o;6129:126::-;6179:9;6212:37;6243:5;6212:37;:::i;:::-;6199:50;;6129:126;;;:::o;6261:157::-;6342:9;6375:37;6406:5;6375:37;:::i;:::-;6362:50;;6261:157;;;:::o;6424:193::-;6542:68;6604:5;6542:68;:::i;:::-;6537:3;6530:81;6424:193;;:::o;6623:284::-;6747:4;6785:2;6774:9;6770:18;6762:26;;6798:102;6897:1;6886:9;6882:17;6873:6;6798:102;:::i;:::-;6623:284;;;;:::o;6913:104::-;6958:7;6987:24;7005:5;6987:24;:::i;:::-;6976:35;;6913:104;;;:::o;7023:138::-;7104:32;7130:5;7104:32;:::i;:::-;7097:5;7094:43;7084:71;;7151:1;7148;7141:12;7084:71;7023:138;:::o;7167:155::-;7221:5;7259:6;7246:20;7237:29;;7275:41;7310:5;7275:41;:::i;:::-;7167:155;;;;:::o;7328:345::-;7395:6;7444:2;7432:9;7423:7;7419:23;7415:32;7412:119;;;7450:79;;:::i;:::-;7412:119;7570:1;7595:61;7648:7;7639:6;7628:9;7624:22;7595:61;:::i;:::-;7585:71;;7541:125;7328:345;;;;:::o;7679:329::-;7738:6;7787:2;7775:9;7766:7;7762:23;7758:32;7755:119;;;7793:79;;:::i;:::-;7755:119;7913:1;7938:53;7983:7;7974:6;7963:9;7959:22;7938:53;:::i;:::-;7928:63;;7884:117;7679:329;;;;:::o;8014:116::-;8084:21;8099:5;8084:21;:::i;:::-;8077:5;8074:32;8064:60;;8120:1;8117;8110:12;8064:60;8014:116;:::o;8136:133::-;8179:5;8217:6;8204:20;8195:29;;8233:30;8257:5;8233:30;:::i;:::-;8136:133;;;;:::o;8275:468::-;8340:6;8348;8397:2;8385:9;8376:7;8372:23;8368:32;8365:119;;;8403:79;;:::i;:::-;8365:119;8523:1;8548:53;8593:7;8584:6;8573:9;8569:22;8548:53;:::i;:::-;8538:63;;8494:117;8650:2;8676:50;8718:7;8709:6;8698:9;8694:22;8676:50;:::i;:::-;8666:60;;8621:115;8275:468;;;;;:::o;8749:117::-;8858:1;8855;8848:12;8872:117;8981:1;8978;8971:12;8995:180;9043:77;9040:1;9033:88;9140:4;9137:1;9130:15;9164:4;9161:1;9154:15;9181:281;9264:27;9286:4;9264:27;:::i;:::-;9256:6;9252:40;9394:6;9382:10;9379:22;9358:18;9346:10;9343:34;9340:62;9337:88;;;9405:18;;:::i;:::-;9337:88;9445:10;9441:2;9434:22;9224:238;9181:281;;:::o;9468:129::-;9502:6;9529:20;;:::i;:::-;9519:30;;9558:33;9586:4;9578:6;9558:33;:::i;:::-;9468:129;;;:::o;9603:308::-;9665:4;9755:18;9747:6;9744:30;9741:56;;;9777:18;;:::i;:::-;9741:56;9815:29;9837:6;9815:29;:::i;:::-;9807:37;;9899:4;9893;9889:15;9881:23;;9603:308;;;:::o;9917:154::-;10001:6;9996:3;9991;9978:30;10063:1;10054:6;10049:3;10045:16;10038:27;9917:154;;;:::o;10077:412::-;10155:5;10180:66;10196:49;10238:6;10196:49;:::i;:::-;10180:66;:::i;:::-;10171:75;;10269:6;10262:5;10255:21;10307:4;10300:5;10296:16;10345:3;10336:6;10331:3;10327:16;10324:25;10321:112;;;10352:79;;:::i;:::-;10321:112;10442:41;10476:6;10471:3;10466;10442:41;:::i;:::-;10161:328;10077:412;;;;;:::o;10509:340::-;10565:5;10614:3;10607:4;10599:6;10595:17;10591:27;10581:122;;10622:79;;:::i;:::-;10581:122;10739:6;10726:20;10764:79;10839:3;10831:6;10824:4;10816:6;10812:17;10764:79;:::i;:::-;10755:88;;10571:278;10509:340;;;;:::o;10855:509::-;10924:6;10973:2;10961:9;10952:7;10948:23;10944:32;10941:119;;;10979:79;;:::i;:::-;10941:119;11127:1;11116:9;11112:17;11099:31;11157:18;11149:6;11146:30;11143:117;;;11179:79;;:::i;:::-;11143:117;11284:63;11339:7;11330:6;11319:9;11315:22;11284:63;:::i;:::-;11274:73;;11070:287;10855:509;;;;:::o;11370:307::-;11431:4;11521:18;11513:6;11510:30;11507:56;;;11543:18;;:::i;:::-;11507:56;11581:29;11603:6;11581:29;:::i;:::-;11573:37;;11665:4;11659;11655:15;11647:23;;11370:307;;;:::o;11683:410::-;11760:5;11785:65;11801:48;11842:6;11801:48;:::i;:::-;11785:65;:::i;:::-;11776:74;;11873:6;11866:5;11859:21;11911:4;11904:5;11900:16;11949:3;11940:6;11935:3;11931:16;11928:25;11925:112;;;11956:79;;:::i;:::-;11925:112;12046:41;12080:6;12075:3;12070;12046:41;:::i;:::-;11766:327;11683:410;;;;;:::o;12112:338::-;12167:5;12216:3;12209:4;12201:6;12197:17;12193:27;12183:122;;12224:79;;:::i;:::-;12183:122;12341:6;12328:20;12366:78;12440:3;12432:6;12425:4;12417:6;12413:17;12366:78;:::i;:::-;12357:87;;12173:277;12112:338;;;;:::o;12456:943::-;12551:6;12559;12567;12575;12624:3;12612:9;12603:7;12599:23;12595:33;12592:120;;;12631:79;;:::i;:::-;12592:120;12751:1;12776:53;12821:7;12812:6;12801:9;12797:22;12776:53;:::i;:::-;12766:63;;12722:117;12878:2;12904:53;12949:7;12940:6;12929:9;12925:22;12904:53;:::i;:::-;12894:63;;12849:118;13006:2;13032:53;13077:7;13068:6;13057:9;13053:22;13032:53;:::i;:::-;13022:63;;12977:118;13162:2;13151:9;13147:18;13134:32;13193:18;13185:6;13182:30;13179:117;;;13215:79;;:::i;:::-;13179:117;13320:62;13374:7;13365:6;13354:9;13350:22;13320:62;:::i;:::-;13310:72;;13105:287;12456:943;;;;;;;:::o;13405:474::-;13473:6;13481;13530:2;13518:9;13509:7;13505:23;13501:32;13498:119;;;13536:79;;:::i;:::-;13498:119;13656:1;13681:53;13726:7;13717:6;13706:9;13702:22;13681:53;:::i;:::-;13671:63;;13627:117;13783:2;13809:53;13854:7;13845:6;13834:9;13830:22;13809:53;:::i;:::-;13799:63;;13754:118;13405:474;;;;;:::o;13885:180::-;13933:77;13930:1;13923:88;14030:4;14027:1;14020:15;14054:4;14051:1;14044:15;14071:320;14115:6;14152:1;14146:4;14142:12;14132:22;;14199:1;14193:4;14189:12;14220:18;14210:81;;14276:4;14268:6;14264:17;14254:27;;14210:81;14338:2;14330:6;14327:14;14307:18;14304:38;14301:84;;14357:18;;:::i;:::-;14301:84;14122:269;14071:320;;;:::o;14397:227::-;14537:34;14533:1;14525:6;14521:14;14514:58;14606:10;14601:2;14593:6;14589:15;14582:35;14397:227;:::o;14630:366::-;14772:3;14793:67;14857:2;14852:3;14793:67;:::i;:::-;14786:74;;14869:93;14958:3;14869:93;:::i;:::-;14987:2;14982:3;14978:12;14971:19;;14630:366;;;:::o;15002:419::-;15168:4;15206:2;15195:9;15191:18;15183:26;;15255:9;15249:4;15245:20;15241:1;15230:9;15226:17;15219:47;15283:131;15409:4;15283:131;:::i;:::-;15275:139;;15002:419;;;:::o;15427:180::-;15475:77;15472:1;15465:88;15572:4;15569:1;15562:15;15596:4;15593:1;15586:15;15613:348;15653:7;15676:20;15694:1;15676:20;:::i;:::-;15671:25;;15710:20;15728:1;15710:20;:::i;:::-;15705:25;;15898:1;15830:66;15826:74;15823:1;15820:81;15815:1;15808:9;15801:17;15797:105;15794:131;;;15905:18;;:::i;:::-;15794:131;15953:1;15950;15946:9;15935:20;;15613:348;;;;:::o;15967:170::-;16107:22;16103:1;16095:6;16091:14;16084:46;15967:170;:::o;16143:366::-;16285:3;16306:67;16370:2;16365:3;16306:67;:::i;:::-;16299:74;;16382:93;16471:3;16382:93;:::i;:::-;16500:2;16495:3;16491:12;16484:19;;16143:366;;;:::o;16515:419::-;16681:4;16719:2;16708:9;16704:18;16696:26;;16768:9;16762:4;16758:20;16754:1;16743:9;16739:17;16732:47;16796:131;16922:4;16796:131;:::i;:::-;16788:139;;16515:419;;;:::o;16940:174::-;17080:26;17076:1;17068:6;17064:14;17057:50;16940:174;:::o;17120:366::-;17262:3;17283:67;17347:2;17342:3;17283:67;:::i;:::-;17276:74;;17359:93;17448:3;17359:93;:::i;:::-;17477:2;17472:3;17468:12;17461:19;;17120:366;;;:::o;17492:419::-;17658:4;17696:2;17685:9;17681:18;17673:26;;17745:9;17739:4;17735:20;17731:1;17720:9;17716:17;17709:47;17773:131;17899:4;17773:131;:::i;:::-;17765:139;;17492:419;;;:::o;17917:228::-;18057:34;18053:1;18045:6;18041:14;18034:58;18126:11;18121:2;18113:6;18109:15;18102:36;17917:228;:::o;18151:366::-;18293:3;18314:67;18378:2;18373:3;18314:67;:::i;:::-;18307:74;;18390:93;18479:3;18390:93;:::i;:::-;18508:2;18503:3;18499:12;18492:19;;18151:366;;;:::o;18523:419::-;18689:4;18727:2;18716:9;18712:18;18704:26;;18776:9;18770:4;18766:20;18762:1;18751:9;18747:17;18740:47;18804:131;18930:4;18804:131;:::i;:::-;18796:139;;18523:419;;;:::o;18948:169::-;19088:21;19084:1;19076:6;19072:14;19065:45;18948:169;:::o;19123:366::-;19265:3;19286:67;19350:2;19345:3;19286:67;:::i;:::-;19279:74;;19362:93;19451:3;19362:93;:::i;:::-;19480:2;19475:3;19471:12;19464:19;;19123:366;;;:::o;19495:419::-;19661:4;19699:2;19688:9;19684:18;19676:26;;19748:9;19742:4;19738:20;19734:1;19723:9;19719:17;19712:47;19776:131;19902:4;19776:131;:::i;:::-;19768:139;;19495:419;;;:::o;19920:148::-;20022:11;20059:3;20044:18;;19920:148;;;;:::o;20074:377::-;20180:3;20208:39;20241:5;20208:39;:::i;:::-;20263:89;20345:6;20340:3;20263:89;:::i;:::-;20256:96;;20361:52;20406:6;20401:3;20394:4;20387:5;20383:16;20361:52;:::i;:::-;20438:6;20433:3;20429:16;20422:23;;20184:267;20074:377;;;;:::o;20457:435::-;20637:3;20659:95;20750:3;20741:6;20659:95;:::i;:::-;20652:102;;20771:95;20862:3;20853:6;20771:95;:::i;:::-;20764:102;;20883:3;20876:10;;20457:435;;;;;:::o;20898:332::-;21019:4;21057:2;21046:9;21042:18;21034:26;;21070:71;21138:1;21127:9;21123:17;21114:6;21070:71;:::i;:::-;21151:72;21219:2;21208:9;21204:18;21195:6;21151:72;:::i;:::-;20898:332;;;;;:::o;21236:137::-;21290:5;21321:6;21315:13;21306:22;;21337:30;21361:5;21337:30;:::i;:::-;21236:137;;;;:::o;21379:345::-;21446:6;21495:2;21483:9;21474:7;21470:23;21466:32;21463:119;;;21501:79;;:::i;:::-;21463:119;21621:1;21646:61;21699:7;21690:6;21679:9;21675:22;21646:61;:::i;:::-;21636:71;;21592:125;21379:345;;;;:::o;21730:220::-;21870:34;21866:1;21858:6;21854:14;21847:58;21939:3;21934:2;21926:6;21922:15;21915:28;21730:220;:::o;21956:366::-;22098:3;22119:67;22183:2;22178:3;22119:67;:::i;:::-;22112:74;;22195:93;22284:3;22195:93;:::i;:::-;22313:2;22308:3;22304:12;22297:19;;21956:366;;;:::o;22328:419::-;22494:4;22532:2;22521:9;22517:18;22509:26;;22581:9;22575:4;22571:20;22567:1;22556:9;22552:17;22545:47;22609:131;22735:4;22609:131;:::i;:::-;22601:139;;22328:419;;;:::o;22753:248::-;22893:34;22889:1;22881:6;22877:14;22870:58;22962:31;22957:2;22949:6;22945:15;22938:56;22753:248;:::o;23007:366::-;23149:3;23170:67;23234:2;23229:3;23170:67;:::i;:::-;23163:74;;23246:93;23335:3;23246:93;:::i;:::-;23364:2;23359:3;23355:12;23348:19;;23007:366;;;:::o;23379:419::-;23545:4;23583:2;23572:9;23568:18;23560:26;;23632:9;23626:4;23622:20;23618:1;23607:9;23603:17;23596:47;23660:131;23786:4;23660:131;:::i;:::-;23652:139;;23379:419;;;:::o;23804:232::-;23944:34;23940:1;23932:6;23928:14;23921:58;24013:15;24008:2;24000:6;23996:15;23989:40;23804:232;:::o;24042:366::-;24184:3;24205:67;24269:2;24264:3;24205:67;:::i;:::-;24198:74;;24281:93;24370:3;24281:93;:::i;:::-;24399:2;24394:3;24390:12;24383:19;;24042:366;;;:::o;24414:419::-;24580:4;24618:2;24607:9;24603:18;24595:26;;24667:9;24661:4;24657:20;24653:1;24642:9;24638:17;24631:47;24695:131;24821:4;24695:131;:::i;:::-;24687:139;;24414:419;;;:::o;24839:305::-;24879:3;24898:20;24916:1;24898:20;:::i;:::-;24893:25;;24932:20;24950:1;24932:20;:::i;:::-;24927:25;;25086:1;25018:66;25014:74;25011:1;25008:81;25005:107;;;25092:18;;:::i;:::-;25005:107;25136:1;25133;25129:9;25122:16;;24839:305;;;;:::o;25150:178::-;25290:30;25286:1;25278:6;25274:14;25267:54;25150:178;:::o;25334:366::-;25476:3;25497:67;25561:2;25556:3;25497:67;:::i;:::-;25490:74;;25573:93;25662:3;25573:93;:::i;:::-;25691:2;25686:3;25682:12;25675:19;;25334:366;;;:::o;25706:419::-;25872:4;25910:2;25899:9;25895:18;25887:26;;25959:9;25953:4;25949:20;25945:1;25934:9;25930:17;25923:47;25987:131;26113:4;25987:131;:::i;:::-;25979:139;;25706:419;;;:::o;26131:233::-;26170:3;26193:24;26211:5;26193:24;:::i;:::-;26184:33;;26239:66;26232:5;26229:77;26226:103;;26309:18;;:::i;:::-;26226:103;26356:1;26349:5;26345:13;26338:20;;26131:233;;;:::o;26370:180::-;26418:77;26415:1;26408:88;26515:4;26512:1;26505:15;26539:4;26536:1;26529:15;26556:224;26696:34;26692:1;26684:6;26680:14;26673:58;26765:7;26760:2;26752:6;26748:15;26741:32;26556:224;:::o;26786:366::-;26928:3;26949:67;27013:2;27008:3;26949:67;:::i;:::-;26942:74;;27025:93;27114:3;27025:93;:::i;:::-;27143:2;27138:3;27134:12;27127:19;;26786:366;;;:::o;27158:419::-;27324:4;27362:2;27351:9;27347:18;27339:26;;27411:9;27405:4;27401:20;27397:1;27386:9;27382:17;27375:47;27439:131;27565:4;27439:131;:::i;:::-;27431:139;;27158:419;;;:::o;27583:223::-;27723:34;27719:1;27711:6;27707:14;27700:58;27792:6;27787:2;27779:6;27775:15;27768:31;27583:223;:::o;27812:366::-;27954:3;27975:67;28039:2;28034:3;27975:67;:::i;:::-;27968:74;;28051:93;28140:3;28051:93;:::i;:::-;28169:2;28164:3;28160:12;28153:19;;27812:366;;;:::o;28184:419::-;28350:4;28388:2;28377:9;28373:18;28365:26;;28437:9;28431:4;28427:20;28423:1;28412:9;28408:17;28401:47;28465:131;28591:4;28465:131;:::i;:::-;28457:139;;28184:419;;;:::o;28609:182::-;28749:34;28745:1;28737:6;28733:14;28726:58;28609:182;:::o;28797:366::-;28939:3;28960:67;29024:2;29019:3;28960:67;:::i;:::-;28953:74;;29036:93;29125:3;29036:93;:::i;:::-;29154:2;29149:3;29145:12;29138:19;;28797:366;;;:::o;29169:419::-;29335:4;29373:2;29362:9;29358:18;29350:26;;29422:9;29416:4;29412:20;29408:1;29397:9;29393:17;29386:47;29450:131;29576:4;29450:131;:::i;:::-;29442:139;;29169:419;;;:::o;29594:178::-;29734:30;29730:1;29722:6;29718:14;29711:54;29594:178;:::o;29778:366::-;29920:3;29941:67;30005:2;30000:3;29941:67;:::i;:::-;29934:74;;30017:93;30106:3;30017:93;:::i;:::-;30135:2;30130:3;30126:12;30119:19;;29778:366;;;:::o;30150:419::-;30316:4;30354:2;30343:9;30339:18;30331:26;;30403:9;30397:4;30393:20;30389:1;30378:9;30374:17;30367:47;30431:131;30557:4;30431:131;:::i;:::-;30423:139;;30150:419;;;:::o;30575:175::-;30715:27;30711:1;30703:6;30699:14;30692:51;30575:175;:::o;30756:366::-;30898:3;30919:67;30983:2;30978:3;30919:67;:::i;:::-;30912:74;;30995:93;31084:3;30995:93;:::i;:::-;31113:2;31108:3;31104:12;31097:19;;30756:366;;;:::o;31128:419::-;31294:4;31332:2;31321:9;31317:18;31309:26;;31381:9;31375:4;31371:20;31367:1;31356:9;31352:17;31345:47;31409:131;31535:4;31409:131;:::i;:::-;31401:139;;31128:419;;;:::o;31553:237::-;31693:34;31689:1;31681:6;31677:14;31670:58;31762:20;31757:2;31749:6;31745:15;31738:45;31553:237;:::o;31796:366::-;31938:3;31959:67;32023:2;32018:3;31959:67;:::i;:::-;31952:74;;32035:93;32124:3;32035:93;:::i;:::-;32153:2;32148:3;32144:12;32137:19;;31796:366;;;:::o;32168:419::-;32334:4;32372:2;32361:9;32357:18;32349:26;;32421:9;32415:4;32411:20;32407:1;32396:9;32392:17;32385:47;32449:131;32575:4;32449:131;:::i;:::-;32441:139;;32168:419;;;:::o;32593:191::-;32633:4;32653:20;32671:1;32653:20;:::i;:::-;32648:25;;32687:20;32705:1;32687:20;:::i;:::-;32682:25;;32726:1;32723;32720:8;32717:34;;;32731:18;;:::i;:::-;32717:34;32776:1;32773;32769:9;32761:17;;32593:191;;;;:::o;32790:98::-;32841:6;32875:5;32869:12;32859:22;;32790:98;;;:::o;32894:168::-;32977:11;33011:6;33006:3;32999:19;33051:4;33046:3;33042:14;33027:29;;32894:168;;;;:::o;33068:360::-;33154:3;33182:38;33214:5;33182:38;:::i;:::-;33236:70;33299:6;33294:3;33236:70;:::i;:::-;33229:77;;33315:52;33360:6;33355:3;33348:4;33341:5;33337:16;33315:52;:::i;:::-;33392:29;33414:6;33392:29;:::i;:::-;33387:3;33383:39;33376:46;;33158:270;33068:360;;;;:::o;33434:640::-;33629:4;33667:3;33656:9;33652:19;33644:27;;33681:71;33749:1;33738:9;33734:17;33725:6;33681:71;:::i;:::-;33762:72;33830:2;33819:9;33815:18;33806:6;33762:72;:::i;:::-;33844;33912:2;33901:9;33897:18;33888:6;33844:72;:::i;:::-;33963:9;33957:4;33953:20;33948:2;33937:9;33933:18;33926:48;33991:76;34062:4;34053:6;33991:76;:::i;:::-;33983:84;;33434:640;;;;;;;:::o;34080:141::-;34136:5;34167:6;34161:13;34152:22;;34183:32;34209:5;34183:32;:::i;:::-;34080:141;;;;:::o;34227:349::-;34296:6;34345:2;34333:9;34324:7;34320:23;34316:32;34313:119;;;34351:79;;:::i;:::-;34313:119;34471:1;34496:63;34551:7;34542:6;34531:9;34527:22;34496:63;:::i;:::-;34486:73;;34442:127;34227:349;;;;:::o

Swarm Source

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