ETH Price: $3,271.67 (+0.80%)
Gas: 1 Gwei

Token

NFT University GOAT Pass (GOAT)
 

Overview

Max Total Supply

0 GOAT

Holders

111

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
hopppiii.eth
Balance
1 GOAT
0xd6bc4979936Aa4B96B44A04faEAF964239e5f762
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:
NFTUGOATPass

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-22
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/math/Math.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

// File: @openzeppelin/contracts/utils/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/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

    /**
     * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

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

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

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

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

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

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

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

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

        _owners[tokenId] = to;

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

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

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

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

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

        // Clear approvals
        delete _tokenApprovals[tokenId];

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId, 1);

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

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

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

        emit Transfer(from, to, tokenId);

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

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

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

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

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

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

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

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


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

pragma solidity ^0.8.0;



/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
        _burn(tokenId);
    }
}

// File: contracts/GOATpass.sol


pragma solidity ^0.8.4;





contract NFTUGOATPass is ERC721, ERC721Burnable, Ownable {
    using Counters for Counters.Counter;

    string private baseUri;

    mapping(address => bool) public whitelist;

    Counters.Counter private _tokenIdCounter;

    address payable private receiver;

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _baseUri,
        address payable _receiver
    ) ERC721(_name, _symbol) {
        baseUri = _baseUri;
        receiver = _receiver;
        _tokenIdCounter.increment();
    }

    function canMint(address _user) public view returns (bool) {
        return whitelist[_user];
    }

    function safeMint() payable public {
        // calculate 0.00111 eth in wei 
        require(msg.value == 111 * 10 ** 14 wei, "Eth value is not 0.0111 ETH.");
        require(canMint(msg.sender), "User not in whitelist");
        // prevents that a user mints twice 
        whitelist[msg.sender] = false;
        
        // send funds to contract payout address 
        receiver.transfer(msg.value);

        // increment counter and mint token
        uint256 tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();
        _safeMint(msg.sender, tokenId);
    }

    function whitelistUsers(address[] memory _users) public onlyOwner {
        for (uint i = 0; i < _users.length; i++) {
            whitelist[_users[i]] = true;
        }
    }


    function setBaseTokenURI(string memory _baseUri) public onlyOwner {
        baseUri = _baseUri;
    }

    function tokenURI(uint256 _tokenId)
    public
    view
    override
    returns (string memory)
    {
        return
            string(
                abi.encodePacked(baseUri, Strings.toString(_tokenId), ".json")
            );
    }

    // Sould Bound modification with onlyOwner modifier 

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override onlyOwner{
        _safeTransfer(from, to, tokenId, _data);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override onlyOwner{
        _safeTransfer(from, to, tokenId, "");
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override onlyOwner{
        //solhint-disable-next-line max-line-length
        _transfer(from, to, tokenId);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_baseUri","type":"string"},{"internalType":"address payable","name":"_receiver","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"canMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"safeMint","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":"_baseUri","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162003de338038062003de38339818101604052810190620000379190620003cf565b838381600090816200004a9190620006e9565b5080600190816200005c9190620006e9565b5050506200007f62000073620000f360201b60201c565b620000fb60201b60201c565b8160079081620000909190620006e9565b5080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620000e96009620001c160201b62000ecf1760201c565b50505050620007d0565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200024082620001f5565b810181811067ffffffffffffffff8211171562000262576200026162000206565b5b80604052505050565b600062000277620001d7565b905062000285828262000235565b919050565b600067ffffffffffffffff821115620002a857620002a762000206565b5b620002b382620001f5565b9050602081019050919050565b60005b83811015620002e0578082015181840152602081019050620002c3565b60008484015250505050565b600062000303620002fd846200028a565b6200026b565b905082815260208101848484011115620003225762000321620001f0565b5b6200032f848285620002c0565b509392505050565b600082601f8301126200034f576200034e620001eb565b5b815162000361848260208601620002ec565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000397826200036a565b9050919050565b620003a9816200038a565b8114620003b557600080fd5b50565b600081519050620003c9816200039e565b92915050565b60008060008060808587031215620003ec57620003eb620001e1565b5b600085015167ffffffffffffffff8111156200040d576200040c620001e6565b5b6200041b8782880162000337565b945050602085015167ffffffffffffffff8111156200043f576200043e620001e6565b5b6200044d8782880162000337565b935050604085015167ffffffffffffffff811115620004715762000470620001e6565b5b6200047f8782880162000337565b92505060606200049287828801620003b8565b91505092959194509250565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004f157607f821691505b602082108103620005075762000506620004a9565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005717fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000532565b6200057d868362000532565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005ca620005c4620005be8462000595565b6200059f565b62000595565b9050919050565b6000819050919050565b620005e683620005a9565b620005fe620005f582620005d1565b8484546200053f565b825550505050565b600090565b6200061562000606565b62000622818484620005db565b505050565b5b818110156200064a576200063e6000826200060b565b60018101905062000628565b5050565b601f821115620006995762000663816200050d565b6200066e8462000522565b810160208510156200067e578190505b620006966200068d8562000522565b83018262000627565b50505b505050565b600082821c905092915050565b6000620006be600019846008026200069e565b1980831691505092915050565b6000620006d98383620006ab565b9150826002028217905092915050565b620006f4826200049e565b67ffffffffffffffff81111562000710576200070f62000206565b5b6200071c8254620004d8565b620007298282856200064e565b600060209050601f8311600181146200076157600084156200074c578287015190505b620007588582620006cb565b865550620007c8565b601f19841662000771866200050d565b60005b828110156200079b5784890151825560018201915060208501945060208101905062000774565b86831015620007bb5784890151620007b7601f891682620006ab565b8355505b6001600288020188555050505b505050505050565b61360380620007e06000396000f3fe6080604052600436106101355760003560e01c8063715018a6116100ab578063b88d4fde1161006f578063b88d4fde14610403578063c2ba47441461042c578063c87b56dd14610469578063e985e9c5146104a6578063edec5f27146104e3578063f2fde38b1461050c57610135565b8063715018a6146103305780638da5cb5b1461034757806395d89b41146103725780639b19251a1461039d578063a22cb465146103da57610135565b806330176e13116100fd57806330176e131461023157806342842e0e1461025a57806342966c68146102835780636352211e146102ac5780636871ee40146102e957806370a08231146102f357610135565b806301ffc9a71461013a57806306fdde0314610177578063081812fc146101a2578063095ea7b3146101df57806323b872dd14610208575b600080fd5b34801561014657600080fd5b50610161600480360381019061015c91906120c8565b610535565b60405161016e9190612110565b60405180910390f35b34801561018357600080fd5b5061018c610617565b60405161019991906121bb565b60405180910390f35b3480156101ae57600080fd5b506101c960048036038101906101c49190612213565b6106a9565b6040516101d69190612281565b60405180910390f35b3480156101eb57600080fd5b50610206600480360381019061020191906122c8565b6106ef565b005b34801561021457600080fd5b5061022f600480360381019061022a9190612308565b610806565b005b34801561023d57600080fd5b5061025860048036038101906102539190612490565b61081e565b005b34801561026657600080fd5b50610281600480360381019061027c9190612308565b610839565b005b34801561028f57600080fd5b506102aa60048036038101906102a59190612213565b610861565b005b3480156102b857600080fd5b506102d360048036038101906102ce9190612213565b6108bd565b6040516102e09190612281565b60405180910390f35b6102f1610943565b005b3480156102ff57600080fd5b5061031a600480360381019061031591906124d9565b610aba565b6040516103279190612515565b60405180910390f35b34801561033c57600080fd5b50610345610b71565b005b34801561035357600080fd5b5061035c610b85565b6040516103699190612281565b60405180910390f35b34801561037e57600080fd5b50610387610baf565b60405161039491906121bb565b60405180910390f35b3480156103a957600080fd5b506103c460048036038101906103bf91906124d9565b610c41565b6040516103d19190612110565b60405180910390f35b3480156103e657600080fd5b5061040160048036038101906103fc919061255c565b610c61565b005b34801561040f57600080fd5b5061042a6004803603810190610425919061263d565b610c77565b005b34801561043857600080fd5b50610453600480360381019061044e91906124d9565b610c91565b6040516104609190612110565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b9190612213565b610ce7565b60405161049d91906121bb565b60405180910390f35b3480156104b257600080fd5b506104cd60048036038101906104c891906126c0565b610d1b565b6040516104da9190612110565b60405180910390f35b3480156104ef57600080fd5b5061050a600480360381019061050591906127c8565b610daf565b005b34801561051857600080fd5b50610533600480360381019061052e91906124d9565b610e4c565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061060057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610610575061060f82610ee5565b5b9050919050565b60606000805461062690612840565b80601f016020809104026020016040519081016040528092919081815260200182805461065290612840565b801561069f5780601f106106745761010080835404028352916020019161069f565b820191906000526020600020905b81548152906001019060200180831161068257829003601f168201915b5050505050905090565b60006106b482610f4f565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106fa826108bd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361076a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610761906128e3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610789610f9a565b73ffffffffffffffffffffffffffffffffffffffff1614806107b857506107b7816107b2610f9a565b610d1b565b5b6107f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ee90612975565b60405180910390fd5b6108018383610fa2565b505050565b61080e61105b565b6108198383836110d9565b505050565b61082661105b565b80600790816108359190612b41565b5050565b61084161105b565b61085c838383604051806020016040528060008152506113d2565b505050565b61087261086c610f9a565b8261142e565b6108b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a890612c85565b60405180910390fd5b6108ba816114c3565b50565b6000806108c983611611565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361093a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190612cf1565b60405180910390fd5b80915050919050565b66276f642501c000341461098c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098390612d5d565b60405180910390fd5b61099533610c91565b6109d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cb90612dc9565b60405180910390fd5b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015610a94573d6000803e3d6000fd5b506000610aa1600961164e565b9050610aad6009610ecf565b610ab7338261165c565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2190612e5b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b7961105b565b610b83600061167a565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610bbe90612840565b80601f0160208091040260200160405190810160405280929190818152602001828054610bea90612840565b8015610c375780601f10610c0c57610100808354040283529160200191610c37565b820191906000526020600020905b815481529060010190602001808311610c1a57829003601f168201915b5050505050905090565b60086020528060005260406000206000915054906101000a900460ff1681565b610c73610c6c610f9a565b8383611740565b5050565b610c7f61105b565b610c8b848484846113d2565b50505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60606007610cf4836118ac565b604051602001610d05929190612f86565b6040516020818303038152906040529050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610db761105b565b60005b8151811015610e4857600160086000848481518110610ddc57610ddb612fb5565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610e4090613013565b915050610dba565b5050565b610e5461105b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eba906130cd565b60405180910390fd5b610ecc8161167a565b50565b6001816000016000828254019250508190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610f588161197a565b610f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8e90612cf1565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611015836108bd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611063610f9a565b73ffffffffffffffffffffffffffffffffffffffff16611081610b85565b73ffffffffffffffffffffffffffffffffffffffff16146110d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ce90613139565b60405180910390fd5b565b8273ffffffffffffffffffffffffffffffffffffffff166110f9826108bd565b73ffffffffffffffffffffffffffffffffffffffff161461114f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611146906131cb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b59061325d565b60405180910390fd5b6111cb83838360016119bb565b8273ffffffffffffffffffffffffffffffffffffffff166111eb826108bd565b73ffffffffffffffffffffffffffffffffffffffff1614611241576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611238906131cb565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113cd8383836001611ae1565b505050565b6113dd8484846110d9565b6113e984848484611ae7565b611428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141f906132ef565b60405180910390fd5b50505050565b60008061143a836108bd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061147c575061147b8185610d1b565b5b806114ba57508373ffffffffffffffffffffffffffffffffffffffff166114a2846106a9565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b60006114ce826108bd565b90506114de8160008460016119bb565b6114e7826108bd565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461160d816000846001611ae1565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600081600001549050919050565b611676828260405180602001604052806000815250611c6e565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036117ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a59061335b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161189f9190612110565b60405180910390a3505050565b6060600060016118bb84611cc9565b01905060008167ffffffffffffffff8111156118da576118d9612365565b5b6040519080825280601f01601f19166020018201604052801561190c5781602001600182028036833780820191505090505b509050600082602001820190505b60011561196f578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816119635761196261337b565b5b0494506000850361191a575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff1661199c83611611565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6001811115611adb57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611a4f5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a4791906133aa565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611ada5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ad291906133de565b925050819055505b5b50505050565b50505050565b6000611b088473ffffffffffffffffffffffffffffffffffffffff16611e1c565b15611c61578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b31610f9a565b8786866040518563ffffffff1660e01b8152600401611b539493929190613467565b6020604051808303816000875af1925050508015611b8f57506040513d601f19601f82011682018060405250810190611b8c91906134c8565b60015b611c11573d8060008114611bbf576040519150601f19603f3d011682016040523d82523d6000602084013e611bc4565b606091505b506000815103611c09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c00906132ef565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611c66565b600190505b949350505050565b611c788383611e3f565b611c856000848484611ae7565b611cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbb906132ef565b60405180910390fd5b505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611d27577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611d1d57611d1c61337b565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611d64576d04ee2d6d415b85acef81000000008381611d5a57611d5961337b565b5b0492506020810190505b662386f26fc100008310611d9357662386f26fc100008381611d8957611d8861337b565b5b0492506010810190505b6305f5e1008310611dbc576305f5e1008381611db257611db161337b565b5b0492506008810190505b6127108310611de1576127108381611dd757611dd661337b565b5b0492506004810190505b60648310611e045760648381611dfa57611df961337b565b5b0492506002810190505b600a8310611e13576001810190505b80915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea590613541565b60405180910390fd5b611eb78161197a565b15611ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eee906135ad565b60405180910390fd5b611f056000838360016119bb565b611f0e8161197a565b15611f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f45906135ad565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612058600083836001611ae1565b5050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6120a581612070565b81146120b057600080fd5b50565b6000813590506120c28161209c565b92915050565b6000602082840312156120de576120dd612066565b5b60006120ec848285016120b3565b91505092915050565b60008115159050919050565b61210a816120f5565b82525050565b60006020820190506121256000830184612101565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561216557808201518184015260208101905061214a565b60008484015250505050565b6000601f19601f8301169050919050565b600061218d8261212b565b6121978185612136565b93506121a7818560208601612147565b6121b081612171565b840191505092915050565b600060208201905081810360008301526121d58184612182565b905092915050565b6000819050919050565b6121f0816121dd565b81146121fb57600080fd5b50565b60008135905061220d816121e7565b92915050565b60006020828403121561222957612228612066565b5b6000612237848285016121fe565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061226b82612240565b9050919050565b61227b81612260565b82525050565b60006020820190506122966000830184612272565b92915050565b6122a581612260565b81146122b057600080fd5b50565b6000813590506122c28161229c565b92915050565b600080604083850312156122df576122de612066565b5b60006122ed858286016122b3565b92505060206122fe858286016121fe565b9150509250929050565b60008060006060848603121561232157612320612066565b5b600061232f868287016122b3565b9350506020612340868287016122b3565b9250506040612351868287016121fe565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61239d82612171565b810181811067ffffffffffffffff821117156123bc576123bb612365565b5b80604052505050565b60006123cf61205c565b90506123db8282612394565b919050565b600067ffffffffffffffff8211156123fb576123fa612365565b5b61240482612171565b9050602081019050919050565b82818337600083830152505050565b600061243361242e846123e0565b6123c5565b90508281526020810184848401111561244f5761244e612360565b5b61245a848285612411565b509392505050565b600082601f8301126124775761247661235b565b5b8135612487848260208601612420565b91505092915050565b6000602082840312156124a6576124a5612066565b5b600082013567ffffffffffffffff8111156124c4576124c361206b565b5b6124d084828501612462565b91505092915050565b6000602082840312156124ef576124ee612066565b5b60006124fd848285016122b3565b91505092915050565b61250f816121dd565b82525050565b600060208201905061252a6000830184612506565b92915050565b612539816120f5565b811461254457600080fd5b50565b60008135905061255681612530565b92915050565b6000806040838503121561257357612572612066565b5b6000612581858286016122b3565b925050602061259285828601612547565b9150509250929050565b600067ffffffffffffffff8211156125b7576125b6612365565b5b6125c082612171565b9050602081019050919050565b60006125e06125db8461259c565b6123c5565b9050828152602081018484840111156125fc576125fb612360565b5b612607848285612411565b509392505050565b600082601f8301126126245761262361235b565b5b81356126348482602086016125cd565b91505092915050565b6000806000806080858703121561265757612656612066565b5b6000612665878288016122b3565b9450506020612676878288016122b3565b9350506040612687878288016121fe565b925050606085013567ffffffffffffffff8111156126a8576126a761206b565b5b6126b48782880161260f565b91505092959194509250565b600080604083850312156126d7576126d6612066565b5b60006126e5858286016122b3565b92505060206126f6858286016122b3565b9150509250929050565b600067ffffffffffffffff82111561271b5761271a612365565b5b602082029050602081019050919050565b600080fd5b600061274461273f84612700565b6123c5565b905080838252602082019050602084028301858111156127675761276661272c565b5b835b81811015612790578061277c88826122b3565b845260208401935050602081019050612769565b5050509392505050565b600082601f8301126127af576127ae61235b565b5b81356127bf848260208601612731565b91505092915050565b6000602082840312156127de576127dd612066565b5b600082013567ffffffffffffffff8111156127fc576127fb61206b565b5b6128088482850161279a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061285857607f821691505b60208210810361286b5761286a612811565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006128cd602183612136565b91506128d882612871565b604082019050919050565b600060208201905081810360008301526128fc816128c0565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b600061295f603d83612136565b915061296a82612903565b604082019050919050565b6000602082019050818103600083015261298e81612952565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026129f77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826129ba565b612a0186836129ba565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612a3e612a39612a34846121dd565b612a19565b6121dd565b9050919050565b6000819050919050565b612a5883612a23565b612a6c612a6482612a45565b8484546129c7565b825550505050565b600090565b612a81612a74565b612a8c818484612a4f565b505050565b5b81811015612ab057612aa5600082612a79565b600181019050612a92565b5050565b601f821115612af557612ac681612995565b612acf846129aa565b81016020851015612ade578190505b612af2612aea856129aa565b830182612a91565b50505b505050565b600082821c905092915050565b6000612b1860001984600802612afa565b1980831691505092915050565b6000612b318383612b07565b9150826002028217905092915050565b612b4a8261212b565b67ffffffffffffffff811115612b6357612b62612365565b5b612b6d8254612840565b612b78828285612ab4565b600060209050601f831160018114612bab5760008415612b99578287015190505b612ba38582612b25565b865550612c0b565b601f198416612bb986612995565b60005b82811015612be157848901518255600182019150602085019450602081019050612bbc565b86831015612bfe5784890151612bfa601f891682612b07565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000612c6f602d83612136565b9150612c7a82612c13565b604082019050919050565b60006020820190508181036000830152612c9e81612c62565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612cdb601883612136565b9150612ce682612ca5565b602082019050919050565b60006020820190508181036000830152612d0a81612cce565b9050919050565b7f4574682076616c7565206973206e6f7420302e30313131204554482e00000000600082015250565b6000612d47601c83612136565b9150612d5282612d11565b602082019050919050565b60006020820190508181036000830152612d7681612d3a565b9050919050565b7f55736572206e6f7420696e2077686974656c6973740000000000000000000000600082015250565b6000612db3601583612136565b9150612dbe82612d7d565b602082019050919050565b60006020820190508181036000830152612de281612da6565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612e45602983612136565b9150612e5082612de9565b604082019050919050565b60006020820190508181036000830152612e7481612e38565b9050919050565b600081905092915050565b60008154612e9381612840565b612e9d8186612e7b565b94506001821660008114612eb85760018114612ecd57612f00565b60ff1983168652811515820286019350612f00565b612ed685612995565b60005b83811015612ef857815481890152600182019150602081019050612ed9565b838801955050505b50505092915050565b6000612f148261212b565b612f1e8185612e7b565b9350612f2e818560208601612147565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000612f70600583612e7b565b9150612f7b82612f3a565b600582019050919050565b6000612f928285612e86565b9150612f9e8284612f09565b9150612fa982612f63565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061301e826121dd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036130505761304f612fe4565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006130b7602683612136565b91506130c28261305b565b604082019050919050565b600060208201905081810360008301526130e6816130aa565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613123602083612136565b915061312e826130ed565b602082019050919050565b6000602082019050818103600083015261315281613116565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006131b5602583612136565b91506131c082613159565b604082019050919050565b600060208201905081810360008301526131e4816131a8565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613247602483612136565b9150613252826131eb565b604082019050919050565b600060208201905081810360008301526132768161323a565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006132d9603283612136565b91506132e48261327d565b604082019050919050565b60006020820190508181036000830152613308816132cc565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613345601983612136565b91506133508261330f565b602082019050919050565b6000602082019050818103600083015261337481613338565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006133b5826121dd565b91506133c0836121dd565b92508282039050818111156133d8576133d7612fe4565b5b92915050565b60006133e9826121dd565b91506133f4836121dd565b925082820190508082111561340c5761340b612fe4565b5b92915050565b600081519050919050565b600082825260208201905092915050565b600061343982613412565b613443818561341d565b9350613453818560208601612147565b61345c81612171565b840191505092915050565b600060808201905061347c6000830187612272565b6134896020830186612272565b6134966040830185612506565b81810360608301526134a8818461342e565b905095945050505050565b6000815190506134c28161209c565b92915050565b6000602082840312156134de576134dd612066565b5b60006134ec848285016134b3565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061352b602083612136565b9150613536826134f5565b602082019050919050565b6000602082019050818103600083015261355a8161351e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613597601c83612136565b91506135a282613561565b602082019050919050565b600060208201905081810360008301526135c68161358a565b905091905056fea26469706673582212200cf993e97d43f8486b3d91796045f0b8966ecd87921d12cc4e8c1086fc09a6bd64736f6c63430008110033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000001dd61a773f8c330f4e600486b44eafb489ff3f4300000000000000000000000000000000000000000000000000000000000000184e465420556e697665727369747920474f4154205061737300000000000000000000000000000000000000000000000000000000000000000000000000000004474f415400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f68747470733a2f2f6e66742d756e69766572736974792e64652f676f6174706173736e66742f6d657461646174612f0000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101355760003560e01c8063715018a6116100ab578063b88d4fde1161006f578063b88d4fde14610403578063c2ba47441461042c578063c87b56dd14610469578063e985e9c5146104a6578063edec5f27146104e3578063f2fde38b1461050c57610135565b8063715018a6146103305780638da5cb5b1461034757806395d89b41146103725780639b19251a1461039d578063a22cb465146103da57610135565b806330176e13116100fd57806330176e131461023157806342842e0e1461025a57806342966c68146102835780636352211e146102ac5780636871ee40146102e957806370a08231146102f357610135565b806301ffc9a71461013a57806306fdde0314610177578063081812fc146101a2578063095ea7b3146101df57806323b872dd14610208575b600080fd5b34801561014657600080fd5b50610161600480360381019061015c91906120c8565b610535565b60405161016e9190612110565b60405180910390f35b34801561018357600080fd5b5061018c610617565b60405161019991906121bb565b60405180910390f35b3480156101ae57600080fd5b506101c960048036038101906101c49190612213565b6106a9565b6040516101d69190612281565b60405180910390f35b3480156101eb57600080fd5b50610206600480360381019061020191906122c8565b6106ef565b005b34801561021457600080fd5b5061022f600480360381019061022a9190612308565b610806565b005b34801561023d57600080fd5b5061025860048036038101906102539190612490565b61081e565b005b34801561026657600080fd5b50610281600480360381019061027c9190612308565b610839565b005b34801561028f57600080fd5b506102aa60048036038101906102a59190612213565b610861565b005b3480156102b857600080fd5b506102d360048036038101906102ce9190612213565b6108bd565b6040516102e09190612281565b60405180910390f35b6102f1610943565b005b3480156102ff57600080fd5b5061031a600480360381019061031591906124d9565b610aba565b6040516103279190612515565b60405180910390f35b34801561033c57600080fd5b50610345610b71565b005b34801561035357600080fd5b5061035c610b85565b6040516103699190612281565b60405180910390f35b34801561037e57600080fd5b50610387610baf565b60405161039491906121bb565b60405180910390f35b3480156103a957600080fd5b506103c460048036038101906103bf91906124d9565b610c41565b6040516103d19190612110565b60405180910390f35b3480156103e657600080fd5b5061040160048036038101906103fc919061255c565b610c61565b005b34801561040f57600080fd5b5061042a6004803603810190610425919061263d565b610c77565b005b34801561043857600080fd5b50610453600480360381019061044e91906124d9565b610c91565b6040516104609190612110565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b9190612213565b610ce7565b60405161049d91906121bb565b60405180910390f35b3480156104b257600080fd5b506104cd60048036038101906104c891906126c0565b610d1b565b6040516104da9190612110565b60405180910390f35b3480156104ef57600080fd5b5061050a600480360381019061050591906127c8565b610daf565b005b34801561051857600080fd5b50610533600480360381019061052e91906124d9565b610e4c565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061060057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610610575061060f82610ee5565b5b9050919050565b60606000805461062690612840565b80601f016020809104026020016040519081016040528092919081815260200182805461065290612840565b801561069f5780601f106106745761010080835404028352916020019161069f565b820191906000526020600020905b81548152906001019060200180831161068257829003601f168201915b5050505050905090565b60006106b482610f4f565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106fa826108bd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361076a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610761906128e3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610789610f9a565b73ffffffffffffffffffffffffffffffffffffffff1614806107b857506107b7816107b2610f9a565b610d1b565b5b6107f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ee90612975565b60405180910390fd5b6108018383610fa2565b505050565b61080e61105b565b6108198383836110d9565b505050565b61082661105b565b80600790816108359190612b41565b5050565b61084161105b565b61085c838383604051806020016040528060008152506113d2565b505050565b61087261086c610f9a565b8261142e565b6108b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a890612c85565b60405180910390fd5b6108ba816114c3565b50565b6000806108c983611611565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361093a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190612cf1565b60405180910390fd5b80915050919050565b66276f642501c000341461098c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098390612d5d565b60405180910390fd5b61099533610c91565b6109d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cb90612dc9565b60405180910390fd5b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015610a94573d6000803e3d6000fd5b506000610aa1600961164e565b9050610aad6009610ecf565b610ab7338261165c565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2190612e5b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b7961105b565b610b83600061167a565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610bbe90612840565b80601f0160208091040260200160405190810160405280929190818152602001828054610bea90612840565b8015610c375780601f10610c0c57610100808354040283529160200191610c37565b820191906000526020600020905b815481529060010190602001808311610c1a57829003601f168201915b5050505050905090565b60086020528060005260406000206000915054906101000a900460ff1681565b610c73610c6c610f9a565b8383611740565b5050565b610c7f61105b565b610c8b848484846113d2565b50505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60606007610cf4836118ac565b604051602001610d05929190612f86565b6040516020818303038152906040529050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610db761105b565b60005b8151811015610e4857600160086000848481518110610ddc57610ddb612fb5565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610e4090613013565b915050610dba565b5050565b610e5461105b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eba906130cd565b60405180910390fd5b610ecc8161167a565b50565b6001816000016000828254019250508190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610f588161197a565b610f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8e90612cf1565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611015836108bd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611063610f9a565b73ffffffffffffffffffffffffffffffffffffffff16611081610b85565b73ffffffffffffffffffffffffffffffffffffffff16146110d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ce90613139565b60405180910390fd5b565b8273ffffffffffffffffffffffffffffffffffffffff166110f9826108bd565b73ffffffffffffffffffffffffffffffffffffffff161461114f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611146906131cb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b59061325d565b60405180910390fd5b6111cb83838360016119bb565b8273ffffffffffffffffffffffffffffffffffffffff166111eb826108bd565b73ffffffffffffffffffffffffffffffffffffffff1614611241576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611238906131cb565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113cd8383836001611ae1565b505050565b6113dd8484846110d9565b6113e984848484611ae7565b611428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141f906132ef565b60405180910390fd5b50505050565b60008061143a836108bd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061147c575061147b8185610d1b565b5b806114ba57508373ffffffffffffffffffffffffffffffffffffffff166114a2846106a9565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b60006114ce826108bd565b90506114de8160008460016119bb565b6114e7826108bd565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461160d816000846001611ae1565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600081600001549050919050565b611676828260405180602001604052806000815250611c6e565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036117ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a59061335b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161189f9190612110565b60405180910390a3505050565b6060600060016118bb84611cc9565b01905060008167ffffffffffffffff8111156118da576118d9612365565b5b6040519080825280601f01601f19166020018201604052801561190c5781602001600182028036833780820191505090505b509050600082602001820190505b60011561196f578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816119635761196261337b565b5b0494506000850361191a575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff1661199c83611611565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6001811115611adb57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611a4f5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a4791906133aa565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611ada5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ad291906133de565b925050819055505b5b50505050565b50505050565b6000611b088473ffffffffffffffffffffffffffffffffffffffff16611e1c565b15611c61578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b31610f9a565b8786866040518563ffffffff1660e01b8152600401611b539493929190613467565b6020604051808303816000875af1925050508015611b8f57506040513d601f19601f82011682018060405250810190611b8c91906134c8565b60015b611c11573d8060008114611bbf576040519150601f19603f3d011682016040523d82523d6000602084013e611bc4565b606091505b506000815103611c09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c00906132ef565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611c66565b600190505b949350505050565b611c788383611e3f565b611c856000848484611ae7565b611cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbb906132ef565b60405180910390fd5b505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611d27577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611d1d57611d1c61337b565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611d64576d04ee2d6d415b85acef81000000008381611d5a57611d5961337b565b5b0492506020810190505b662386f26fc100008310611d9357662386f26fc100008381611d8957611d8861337b565b5b0492506010810190505b6305f5e1008310611dbc576305f5e1008381611db257611db161337b565b5b0492506008810190505b6127108310611de1576127108381611dd757611dd661337b565b5b0492506004810190505b60648310611e045760648381611dfa57611df961337b565b5b0492506002810190505b600a8310611e13576001810190505b80915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea590613541565b60405180910390fd5b611eb78161197a565b15611ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eee906135ad565b60405180910390fd5b611f056000838360016119bb565b611f0e8161197a565b15611f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f45906135ad565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612058600083836001611ae1565b5050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6120a581612070565b81146120b057600080fd5b50565b6000813590506120c28161209c565b92915050565b6000602082840312156120de576120dd612066565b5b60006120ec848285016120b3565b91505092915050565b60008115159050919050565b61210a816120f5565b82525050565b60006020820190506121256000830184612101565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561216557808201518184015260208101905061214a565b60008484015250505050565b6000601f19601f8301169050919050565b600061218d8261212b565b6121978185612136565b93506121a7818560208601612147565b6121b081612171565b840191505092915050565b600060208201905081810360008301526121d58184612182565b905092915050565b6000819050919050565b6121f0816121dd565b81146121fb57600080fd5b50565b60008135905061220d816121e7565b92915050565b60006020828403121561222957612228612066565b5b6000612237848285016121fe565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061226b82612240565b9050919050565b61227b81612260565b82525050565b60006020820190506122966000830184612272565b92915050565b6122a581612260565b81146122b057600080fd5b50565b6000813590506122c28161229c565b92915050565b600080604083850312156122df576122de612066565b5b60006122ed858286016122b3565b92505060206122fe858286016121fe565b9150509250929050565b60008060006060848603121561232157612320612066565b5b600061232f868287016122b3565b9350506020612340868287016122b3565b9250506040612351868287016121fe565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61239d82612171565b810181811067ffffffffffffffff821117156123bc576123bb612365565b5b80604052505050565b60006123cf61205c565b90506123db8282612394565b919050565b600067ffffffffffffffff8211156123fb576123fa612365565b5b61240482612171565b9050602081019050919050565b82818337600083830152505050565b600061243361242e846123e0565b6123c5565b90508281526020810184848401111561244f5761244e612360565b5b61245a848285612411565b509392505050565b600082601f8301126124775761247661235b565b5b8135612487848260208601612420565b91505092915050565b6000602082840312156124a6576124a5612066565b5b600082013567ffffffffffffffff8111156124c4576124c361206b565b5b6124d084828501612462565b91505092915050565b6000602082840312156124ef576124ee612066565b5b60006124fd848285016122b3565b91505092915050565b61250f816121dd565b82525050565b600060208201905061252a6000830184612506565b92915050565b612539816120f5565b811461254457600080fd5b50565b60008135905061255681612530565b92915050565b6000806040838503121561257357612572612066565b5b6000612581858286016122b3565b925050602061259285828601612547565b9150509250929050565b600067ffffffffffffffff8211156125b7576125b6612365565b5b6125c082612171565b9050602081019050919050565b60006125e06125db8461259c565b6123c5565b9050828152602081018484840111156125fc576125fb612360565b5b612607848285612411565b509392505050565b600082601f8301126126245761262361235b565b5b81356126348482602086016125cd565b91505092915050565b6000806000806080858703121561265757612656612066565b5b6000612665878288016122b3565b9450506020612676878288016122b3565b9350506040612687878288016121fe565b925050606085013567ffffffffffffffff8111156126a8576126a761206b565b5b6126b48782880161260f565b91505092959194509250565b600080604083850312156126d7576126d6612066565b5b60006126e5858286016122b3565b92505060206126f6858286016122b3565b9150509250929050565b600067ffffffffffffffff82111561271b5761271a612365565b5b602082029050602081019050919050565b600080fd5b600061274461273f84612700565b6123c5565b905080838252602082019050602084028301858111156127675761276661272c565b5b835b81811015612790578061277c88826122b3565b845260208401935050602081019050612769565b5050509392505050565b600082601f8301126127af576127ae61235b565b5b81356127bf848260208601612731565b91505092915050565b6000602082840312156127de576127dd612066565b5b600082013567ffffffffffffffff8111156127fc576127fb61206b565b5b6128088482850161279a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061285857607f821691505b60208210810361286b5761286a612811565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006128cd602183612136565b91506128d882612871565b604082019050919050565b600060208201905081810360008301526128fc816128c0565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b600061295f603d83612136565b915061296a82612903565b604082019050919050565b6000602082019050818103600083015261298e81612952565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026129f77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826129ba565b612a0186836129ba565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612a3e612a39612a34846121dd565b612a19565b6121dd565b9050919050565b6000819050919050565b612a5883612a23565b612a6c612a6482612a45565b8484546129c7565b825550505050565b600090565b612a81612a74565b612a8c818484612a4f565b505050565b5b81811015612ab057612aa5600082612a79565b600181019050612a92565b5050565b601f821115612af557612ac681612995565b612acf846129aa565b81016020851015612ade578190505b612af2612aea856129aa565b830182612a91565b50505b505050565b600082821c905092915050565b6000612b1860001984600802612afa565b1980831691505092915050565b6000612b318383612b07565b9150826002028217905092915050565b612b4a8261212b565b67ffffffffffffffff811115612b6357612b62612365565b5b612b6d8254612840565b612b78828285612ab4565b600060209050601f831160018114612bab5760008415612b99578287015190505b612ba38582612b25565b865550612c0b565b601f198416612bb986612995565b60005b82811015612be157848901518255600182019150602085019450602081019050612bbc565b86831015612bfe5784890151612bfa601f891682612b07565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000612c6f602d83612136565b9150612c7a82612c13565b604082019050919050565b60006020820190508181036000830152612c9e81612c62565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612cdb601883612136565b9150612ce682612ca5565b602082019050919050565b60006020820190508181036000830152612d0a81612cce565b9050919050565b7f4574682076616c7565206973206e6f7420302e30313131204554482e00000000600082015250565b6000612d47601c83612136565b9150612d5282612d11565b602082019050919050565b60006020820190508181036000830152612d7681612d3a565b9050919050565b7f55736572206e6f7420696e2077686974656c6973740000000000000000000000600082015250565b6000612db3601583612136565b9150612dbe82612d7d565b602082019050919050565b60006020820190508181036000830152612de281612da6565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612e45602983612136565b9150612e5082612de9565b604082019050919050565b60006020820190508181036000830152612e7481612e38565b9050919050565b600081905092915050565b60008154612e9381612840565b612e9d8186612e7b565b94506001821660008114612eb85760018114612ecd57612f00565b60ff1983168652811515820286019350612f00565b612ed685612995565b60005b83811015612ef857815481890152600182019150602081019050612ed9565b838801955050505b50505092915050565b6000612f148261212b565b612f1e8185612e7b565b9350612f2e818560208601612147565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000612f70600583612e7b565b9150612f7b82612f3a565b600582019050919050565b6000612f928285612e86565b9150612f9e8284612f09565b9150612fa982612f63565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061301e826121dd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036130505761304f612fe4565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006130b7602683612136565b91506130c28261305b565b604082019050919050565b600060208201905081810360008301526130e6816130aa565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613123602083612136565b915061312e826130ed565b602082019050919050565b6000602082019050818103600083015261315281613116565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006131b5602583612136565b91506131c082613159565b604082019050919050565b600060208201905081810360008301526131e4816131a8565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613247602483612136565b9150613252826131eb565b604082019050919050565b600060208201905081810360008301526132768161323a565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006132d9603283612136565b91506132e48261327d565b604082019050919050565b60006020820190508181036000830152613308816132cc565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613345601983612136565b91506133508261330f565b602082019050919050565b6000602082019050818103600083015261337481613338565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006133b5826121dd565b91506133c0836121dd565b92508282039050818111156133d8576133d7612fe4565b5b92915050565b60006133e9826121dd565b91506133f4836121dd565b925082820190508082111561340c5761340b612fe4565b5b92915050565b600081519050919050565b600082825260208201905092915050565b600061343982613412565b613443818561341d565b9350613453818560208601612147565b61345c81612171565b840191505092915050565b600060808201905061347c6000830187612272565b6134896020830186612272565b6134966040830185612506565b81810360608301526134a8818461342e565b905095945050505050565b6000815190506134c28161209c565b92915050565b6000602082840312156134de576134dd612066565b5b60006134ec848285016134b3565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061352b602083612136565b9150613536826134f5565b602082019050919050565b6000602082019050818103600083015261355a8161351e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613597601c83612136565b91506135a282613561565b602082019050919050565b600060208201905081810360008301526135c68161358a565b905091905056fea26469706673582212200cf993e97d43f8486b3d91796045f0b8966ecd87921d12cc4e8c1086fc09a6bd64736f6c63430008110033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000001dd61a773f8c330f4e600486b44eafb489ff3f4300000000000000000000000000000000000000000000000000000000000000184e465420556e697665727369747920474f4154205061737300000000000000000000000000000000000000000000000000000000000000000000000000000004474f415400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f68747470733a2f2f6e66742d756e69766572736974792e64652f676f6174706173736e66742f6d657461646174612f0000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): NFT University GOAT Pass
Arg [1] : _symbol (string): GOAT
Arg [2] : _baseUri (string): https://nft-university.de/goatpassnft/metadata/
Arg [3] : _receiver (address): 0x1Dd61A773f8C330f4E600486B44EaFb489fF3f43

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000001dd61a773f8c330f4e600486b44eafb489ff3f43
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000018
Arg [5] : 4e465420556e697665727369747920474f415420506173730000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 474f415400000000000000000000000000000000000000000000000000000000
Arg [8] : 000000000000000000000000000000000000000000000000000000000000002f
Arg [9] : 68747470733a2f2f6e66742d756e69766572736974792e64652f676f61747061
Arg [10] : 73736e66742f6d657461646174612f0000000000000000000000000000000000


Deployed Bytecode Sourcemap

56708:2563:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40009:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40937:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42449:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41967:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59034:232;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58178:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58835:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56387:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40647:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57383:598;;;:::i;:::-;;40378:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19440:103;;;;;;;;;;;;;:::i;:::-;;18792:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41106:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56847:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42692:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58604:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57274:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58289:247;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42918:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57989:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19698:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40009:305;40111:4;40163:25;40148:40;;;:11;:40;;;;:105;;;;40220:33;40205:48;;;:11;:48;;;;40148:105;:158;;;;40270:36;40294:11;40270:23;:36::i;:::-;40148:158;40128:178;;40009:305;;;:::o;40937:100::-;40991:13;41024:5;41017:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40937:100;:::o;42449:171::-;42525:7;42545:23;42560:7;42545:14;:23::i;:::-;42588:15;:24;42604:7;42588:24;;;;;;;;;;;;;;;;;;;;;42581:31;;42449:171;;;:::o;41967:416::-;42048:13;42064:23;42079:7;42064:14;:23::i;:::-;42048:39;;42112:5;42106:11;;:2;:11;;;42098:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;42206:5;42190:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;42215:37;42232:5;42239:12;:10;:12::i;:::-;42215:16;:37::i;:::-;42190:62;42168:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;42354:21;42363:2;42367:7;42354:8;:21::i;:::-;42037:346;41967:416;;:::o;59034:232::-;18678:13;:11;:13::i;:::-;59230:28:::1;59240:4;59246:2;59250:7;59230:9;:28::i;:::-;59034:232:::0;;;:::o;58178:103::-;18678:13;:11;:13::i;:::-;58265:8:::1;58255:7;:18;;;;;;:::i;:::-;;58178:103:::0;:::o;58835:191::-;18678:13;:11;:13::i;:::-;58982:36:::1;58996:4;59002:2;59006:7;58982:36;;;;;;;;;;;::::0;:13:::1;:36::i;:::-;58835:191:::0;;;:::o;56387:242::-;56505:41;56524:12;:10;:12::i;:::-;56538:7;56505:18;:41::i;:::-;56497:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;56607:14;56613:7;56607:5;:14::i;:::-;56387:242;:::o;40647:223::-;40719:7;40739:13;40755:17;40764:7;40755:8;:17::i;:::-;40739:33;;40808:1;40791:19;;:5;:19;;;40783:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;40857:5;40850:12;;;40647:223;;;:::o;57383:598::-;57492:18;57479:9;:31;57471:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;57562:19;57570:10;57562:7;:19::i;:::-;57554:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;57688:5;57664:9;:21;57674:10;57664:21;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;57765:8;;;;;;;;;;;:17;;:28;57783:9;57765:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57851:15;57869:25;:15;:23;:25::i;:::-;57851:43;;57905:27;:15;:25;:27::i;:::-;57943:30;57953:10;57965:7;57943:9;:30::i;:::-;57418:563;57383:598::o;40378:207::-;40450:7;40495:1;40478:19;;:5;:19;;;40470:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40561:9;:16;40571:5;40561:16;;;;;;;;;;;;;;;;40554:23;;40378:207;;;:::o;19440:103::-;18678:13;:11;:13::i;:::-;19505:30:::1;19532:1;19505:18;:30::i;:::-;19440:103::o:0;18792:87::-;18838:7;18865:6;;;;;;;;;;;18858:13;;18792:87;:::o;41106:104::-;41162:13;41195:7;41188:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41106:104;:::o;56847:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;42692:155::-;42787:52;42806:12;:10;:12::i;:::-;42820:8;42830;42787:18;:52::i;:::-;42692:155;;:::o;58604:223::-;18678:13;:11;:13::i;:::-;58780:39:::1;58794:4;58800:2;58804:7;58813:5;58780:13;:39::i;:::-;58604:223:::0;;;;:::o;57274:101::-;57327:4;57351:9;:16;57361:5;57351:16;;;;;;;;;;;;;;;;;;;;;;;;;57344:23;;57274:101;;;:::o;58289:247::-;58375:13;58468:7;58477:26;58494:8;58477:16;:26::i;:::-;58451:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58406:122;;58289:247;;;:::o;42918:164::-;43015:4;43039:18;:25;43058:5;43039:25;;;;;;;;;;;;;;;:35;43065:8;43039:35;;;;;;;;;;;;;;;;;;;;;;;;;43032:42;;42918:164;;;;:::o;57989:179::-;18678:13;:11;:13::i;:::-;58071:6:::1;58066:95;58087:6;:13;58083:1;:17;58066:95;;;58145:4;58122:9;:20;58132:6;58139:1;58132:9;;;;;;;;:::i;:::-;;;;;;;;58122:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;58102:3;;;;;:::i;:::-;;;;58066:95;;;;57989:179:::0;:::o;19698:201::-;18678:13;:11;:13::i;:::-;19807:1:::1;19787:22;;:8;:22;;::::0;19779:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;19863:28;19882:8;19863:18;:28::i;:::-;19698:201:::0;:::o;994:127::-;1101:1;1083:7;:14;;;:19;;;;;;;;;;;994:127;:::o;32521:157::-;32606:4;32645:25;32630:40;;;:11;:40;;;;32623:47;;32521:157;;;:::o;52268:135::-;52350:16;52358:7;52350;:16::i;:::-;52342:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;52268:135;:::o;17343:98::-;17396:7;17423:10;17416:17;;17343:98;:::o;51547:174::-;51649:2;51622:15;:24;51638:7;51622:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;51705:7;51701:2;51667:46;;51676:23;51691:7;51676:14;:23::i;:::-;51667:46;;;;;;;;;;;;51547:174;;:::o;18957:132::-;19032:12;:10;:12::i;:::-;19021:23;;:7;:5;:7::i;:::-;:23;;;19013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18957:132::o;50165:1263::-;50324:4;50297:31;;:23;50312:7;50297:14;:23::i;:::-;:31;;;50289:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;50403:1;50389:16;;:2;:16;;;50381:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;50459:42;50480:4;50486:2;50490:7;50499:1;50459:20;:42::i;:::-;50631:4;50604:31;;:23;50619:7;50604:14;:23::i;:::-;:31;;;50596:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;50749:15;:24;50765:7;50749:24;;;;;;;;;;;;50742:31;;;;;;;;;;;51244:1;51225:9;:15;51235:4;51225:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;51277:1;51260:9;:13;51270:2;51260:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;51319:2;51300:7;:16;51308:7;51300:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;51358:7;51354:2;51339:27;;51348:4;51339:27;;;;;;;;;;;;51379:41;51399:4;51405:2;51409:7;51418:1;51379:19;:41::i;:::-;50165:1263;;;:::o;45014:313::-;45170:28;45180:4;45186:2;45190:7;45170:9;:28::i;:::-;45217:47;45240:4;45246:2;45250:7;45259:4;45217:22;:47::i;:::-;45209:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;45014:313;;;;:::o;46166:264::-;46259:4;46276:13;46292:23;46307:7;46292:14;:23::i;:::-;46276:39;;46345:5;46334:16;;:7;:16;;;:52;;;;46354:32;46371:5;46378:7;46354:16;:32::i;:::-;46334:52;:87;;;;46414:7;46390:31;;:20;46402:7;46390:11;:20::i;:::-;:31;;;46334:87;46326:96;;;46166:264;;;;:::o;49045:783::-;49105:13;49121:23;49136:7;49121:14;:23::i;:::-;49105:39;;49157:51;49178:5;49193:1;49197:7;49206:1;49157:20;:51::i;:::-;49321:23;49336:7;49321:14;:23::i;:::-;49313:31;;49392:15;:24;49408:7;49392:24;;;;;;;;;;;;49385:31;;;;;;;;;;;49657:1;49637:9;:16;49647:5;49637:16;;;;;;;;;;;;;;;;:21;;;;;;;;;;;49687:7;:16;49695:7;49687:16;;;;;;;;;;;;49680:23;;;;;;;;;;;49749:7;49745:1;49721:36;;49730:5;49721:36;;;;;;;;;;;;49770:50;49790:5;49805:1;49809:7;49818:1;49770:19;:50::i;:::-;49094:734;49045:783;:::o;45441:117::-;45507:7;45534;:16;45542:7;45534:16;;;;;;;;;;;;;;;;;;;;;45527:23;;45441:117;;;:::o;872:114::-;937:7;964;:14;;;957:21;;872:114;;;:::o;46772:110::-;46848:26;46858:2;46862:7;46848:26;;;;;;;;;;;;:9;:26::i;:::-;46772:110;;:::o;20059:191::-;20133:16;20152:6;;;;;;;;;;;20133:25;;20178:8;20169:6;;:17;;;;;;;;;;;;;;;;;;20233:8;20202:40;;20223:8;20202:40;;;;;;;;;;;;20122:128;20059:191;:::o;51864:315::-;52019:8;52010:17;;:5;:17;;;52002:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;52106:8;52068:18;:25;52087:5;52068:25;;;;;;;;;;;;;;;:35;52094:8;52068:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;52152:8;52130:41;;52145:5;52130:41;;;52162:8;52130:41;;;;;;:::i;:::-;;;;;;;;51864:315;;;:::o;14770:716::-;14826:13;14877:14;14914:1;14894:17;14905:5;14894:10;:17::i;:::-;:21;14877:38;;14930:20;14964:6;14953:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14930:41;;14986:11;15115:6;15111:2;15107:15;15099:6;15095:28;15088:35;;15152:288;15159:4;15152:288;;;15184:5;;;;;;;;15326:8;15321:2;15314:5;15310:14;15305:30;15300:3;15292:44;15382:2;15373:11;;;;;;:::i;:::-;;;;;15416:1;15407:5;:10;15152:288;15403:21;15152:288;15461:6;15454:13;;;;;14770:716;;;:::o;45871:128::-;45936:4;45989:1;45960:31;;:17;45969:7;45960:8;:17::i;:::-;:31;;;;45953:38;;45871:128;;;:::o;54552:410::-;54742:1;54730:9;:13;54726:229;;;54780:1;54764:18;;:4;:18;;;54760:87;;54822:9;54803;:15;54813:4;54803:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;54760:87;54879:1;54865:16;;:2;:16;;;54861:83;;54919:9;54902;:13;54912:2;54902:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;54861:83;54726:229;54552:410;;;;:::o;55684:158::-;;;;;:::o;52967:853::-;53121:4;53142:15;:2;:13;;;:15::i;:::-;53138:675;;;53194:2;53178:36;;;53215:12;:10;:12::i;:::-;53229:4;53235:7;53244:4;53178:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53174:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53436:1;53419:6;:13;:18;53415:328;;53462:60;;;;;;;;;;:::i;:::-;;;;;;;;53415:328;53693:6;53687:13;53678:6;53674:2;53670:15;53663:38;53174:584;53310:41;;;53300:51;;;:6;:51;;;;53293:58;;;;;53138:675;53797:4;53790:11;;52967:853;;;;;;;:::o;47109:319::-;47238:18;47244:2;47248:7;47238:5;:18::i;:::-;47289:53;47320:1;47324:2;47328:7;47337:4;47289:22;:53::i;:::-;47267:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;47109:319;;;:::o;11636:922::-;11689:7;11709:14;11726:1;11709:18;;11776:6;11767:5;:15;11763:102;;11812:6;11803:15;;;;;;:::i;:::-;;;;;11847:2;11837:12;;;;11763:102;11892:6;11883:5;:15;11879:102;;11928:6;11919:15;;;;;;:::i;:::-;;;;;11963:2;11953:12;;;;11879:102;12008:6;11999:5;:15;11995:102;;12044:6;12035:15;;;;;;:::i;:::-;;;;;12079:2;12069:12;;;;11995:102;12124:5;12115;:14;12111:99;;12159:5;12150:14;;;;;;:::i;:::-;;;;;12193:1;12183:11;;;;12111:99;12237:5;12228;:14;12224:99;;12272:5;12263:14;;;;;;:::i;:::-;;;;;12306:1;12296:11;;;;12224:99;12350:5;12341;:14;12337:99;;12385:5;12376:14;;;;;;:::i;:::-;;;;;12419:1;12409:11;;;;12337:99;12463:5;12454;:14;12450:66;;12499:1;12489:11;;;;12450:66;12544:6;12537:13;;;11636:922;;;:::o;21490:326::-;21550:4;21807:1;21785:7;:19;;;:23;21778:30;;21490:326;;;:::o;47764:942::-;47858:1;47844:16;;:2;:16;;;47836:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;47917:16;47925:7;47917;:16::i;:::-;47916:17;47908:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;47979:48;48008:1;48012:2;48016:7;48025:1;47979:20;:48::i;:::-;48126:16;48134:7;48126;:16::i;:::-;48125:17;48117:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48541:1;48524:9;:13;48534:2;48524:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;48585:2;48566:7;:16;48574:7;48566:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;48630:7;48626:2;48605:33;;48622:1;48605:33;;;;;;;;;;;;48651:47;48679:1;48683:2;48687:7;48696:1;48651:19;:47::i;:::-;47764:942;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:619::-;4967:6;4975;4983;5032:2;5020:9;5011:7;5007:23;5003:32;5000:119;;;5038:79;;:::i;:::-;5000:119;5158:1;5183:53;5228:7;5219:6;5208:9;5204:22;5183:53;:::i;:::-;5173:63;;5129:117;5285:2;5311:53;5356:7;5347:6;5336:9;5332:22;5311:53;:::i;:::-;5301:63;;5256:118;5413:2;5439:53;5484:7;5475:6;5464:9;5460:22;5439:53;:::i;:::-;5429:63;;5384:118;4890:619;;;;;:::o;5515:117::-;5624:1;5621;5614:12;5638:117;5747:1;5744;5737:12;5761:180;5809:77;5806:1;5799:88;5906:4;5903:1;5896:15;5930:4;5927:1;5920:15;5947:281;6030:27;6052:4;6030:27;:::i;:::-;6022:6;6018:40;6160:6;6148:10;6145:22;6124:18;6112:10;6109:34;6106:62;6103:88;;;6171:18;;:::i;:::-;6103:88;6211:10;6207:2;6200:22;5990:238;5947:281;;:::o;6234:129::-;6268:6;6295:20;;:::i;:::-;6285:30;;6324:33;6352:4;6344:6;6324:33;:::i;:::-;6234:129;;;:::o;6369:308::-;6431:4;6521:18;6513:6;6510:30;6507:56;;;6543:18;;:::i;:::-;6507:56;6581:29;6603:6;6581:29;:::i;:::-;6573:37;;6665:4;6659;6655:15;6647:23;;6369:308;;;:::o;6683:146::-;6780:6;6775:3;6770;6757:30;6821:1;6812:6;6807:3;6803:16;6796:27;6683:146;;;:::o;6835:425::-;6913:5;6938:66;6954:49;6996:6;6954:49;:::i;:::-;6938:66;:::i;:::-;6929:75;;7027:6;7020:5;7013:21;7065:4;7058:5;7054:16;7103:3;7094:6;7089:3;7085:16;7082:25;7079:112;;;7110:79;;:::i;:::-;7079:112;7200:54;7247:6;7242:3;7237;7200:54;:::i;:::-;6919:341;6835:425;;;;;:::o;7280:340::-;7336:5;7385:3;7378:4;7370:6;7366:17;7362:27;7352:122;;7393:79;;:::i;:::-;7352:122;7510:6;7497:20;7535:79;7610:3;7602:6;7595:4;7587:6;7583:17;7535:79;:::i;:::-;7526:88;;7342:278;7280:340;;;;:::o;7626:509::-;7695:6;7744:2;7732:9;7723:7;7719:23;7715:32;7712:119;;;7750:79;;:::i;:::-;7712:119;7898:1;7887:9;7883:17;7870:31;7928:18;7920:6;7917:30;7914:117;;;7950:79;;:::i;:::-;7914:117;8055:63;8110:7;8101:6;8090:9;8086:22;8055:63;:::i;:::-;8045:73;;7841:287;7626:509;;;;:::o;8141:329::-;8200:6;8249:2;8237:9;8228:7;8224:23;8220:32;8217:119;;;8255:79;;:::i;:::-;8217:119;8375:1;8400:53;8445:7;8436:6;8425:9;8421:22;8400:53;:::i;:::-;8390:63;;8346:117;8141:329;;;;:::o;8476:118::-;8563:24;8581:5;8563:24;:::i;:::-;8558:3;8551:37;8476:118;;:::o;8600:222::-;8693:4;8731:2;8720:9;8716:18;8708:26;;8744:71;8812:1;8801:9;8797:17;8788:6;8744:71;:::i;:::-;8600:222;;;;:::o;8828:116::-;8898:21;8913:5;8898:21;:::i;:::-;8891:5;8888:32;8878:60;;8934:1;8931;8924:12;8878:60;8828:116;:::o;8950:133::-;8993:5;9031:6;9018:20;9009:29;;9047:30;9071:5;9047:30;:::i;:::-;8950:133;;;;:::o;9089:468::-;9154:6;9162;9211:2;9199:9;9190:7;9186:23;9182:32;9179:119;;;9217:79;;:::i;:::-;9179:119;9337:1;9362:53;9407:7;9398:6;9387:9;9383:22;9362:53;:::i;:::-;9352:63;;9308:117;9464:2;9490:50;9532:7;9523:6;9512:9;9508:22;9490:50;:::i;:::-;9480:60;;9435:115;9089:468;;;;;:::o;9563:307::-;9624:4;9714:18;9706:6;9703:30;9700:56;;;9736:18;;:::i;:::-;9700:56;9774:29;9796:6;9774:29;:::i;:::-;9766:37;;9858:4;9852;9848:15;9840:23;;9563:307;;;:::o;9876:423::-;9953:5;9978:65;9994:48;10035:6;9994:48;:::i;:::-;9978:65;:::i;:::-;9969:74;;10066:6;10059:5;10052:21;10104:4;10097:5;10093:16;10142:3;10133:6;10128:3;10124:16;10121:25;10118:112;;;10149:79;;:::i;:::-;10118:112;10239:54;10286:6;10281:3;10276;10239:54;:::i;:::-;9959:340;9876:423;;;;;:::o;10318:338::-;10373:5;10422:3;10415:4;10407:6;10403:17;10399:27;10389:122;;10430:79;;:::i;:::-;10389:122;10547:6;10534:20;10572:78;10646:3;10638:6;10631:4;10623:6;10619:17;10572:78;:::i;:::-;10563:87;;10379:277;10318:338;;;;:::o;10662:943::-;10757:6;10765;10773;10781;10830:3;10818:9;10809:7;10805:23;10801:33;10798:120;;;10837:79;;:::i;:::-;10798:120;10957:1;10982:53;11027:7;11018:6;11007:9;11003:22;10982:53;:::i;:::-;10972:63;;10928:117;11084:2;11110:53;11155:7;11146:6;11135:9;11131:22;11110:53;:::i;:::-;11100:63;;11055:118;11212:2;11238:53;11283:7;11274:6;11263:9;11259:22;11238:53;:::i;:::-;11228:63;;11183:118;11368:2;11357:9;11353:18;11340:32;11399:18;11391:6;11388:30;11385:117;;;11421:79;;:::i;:::-;11385:117;11526:62;11580:7;11571:6;11560:9;11556:22;11526:62;:::i;:::-;11516:72;;11311:287;10662:943;;;;;;;:::o;11611:474::-;11679:6;11687;11736:2;11724:9;11715:7;11711:23;11707:32;11704:119;;;11742:79;;:::i;:::-;11704:119;11862:1;11887:53;11932:7;11923:6;11912:9;11908:22;11887:53;:::i;:::-;11877:63;;11833:117;11989:2;12015:53;12060:7;12051:6;12040:9;12036:22;12015:53;:::i;:::-;12005:63;;11960:118;11611:474;;;;;:::o;12091:311::-;12168:4;12258:18;12250:6;12247:30;12244:56;;;12280:18;;:::i;:::-;12244:56;12330:4;12322:6;12318:17;12310:25;;12390:4;12384;12380:15;12372:23;;12091:311;;;:::o;12408:117::-;12517:1;12514;12507:12;12548:710;12644:5;12669:81;12685:64;12742:6;12685:64;:::i;:::-;12669:81;:::i;:::-;12660:90;;12770:5;12799:6;12792:5;12785:21;12833:4;12826:5;12822:16;12815:23;;12886:4;12878:6;12874:17;12866:6;12862:30;12915:3;12907:6;12904:15;12901:122;;;12934:79;;:::i;:::-;12901:122;13049:6;13032:220;13066:6;13061:3;13058:15;13032:220;;;13141:3;13170:37;13203:3;13191:10;13170:37;:::i;:::-;13165:3;13158:50;13237:4;13232:3;13228:14;13221:21;;13108:144;13092:4;13087:3;13083:14;13076:21;;13032:220;;;13036:21;12650:608;;12548:710;;;;;:::o;13281:370::-;13352:5;13401:3;13394:4;13386:6;13382:17;13378:27;13368:122;;13409:79;;:::i;:::-;13368:122;13526:6;13513:20;13551:94;13641:3;13633:6;13626:4;13618:6;13614:17;13551:94;:::i;:::-;13542:103;;13358:293;13281:370;;;;:::o;13657:539::-;13741:6;13790:2;13778:9;13769:7;13765:23;13761:32;13758:119;;;13796:79;;:::i;:::-;13758:119;13944:1;13933:9;13929:17;13916:31;13974:18;13966:6;13963:30;13960:117;;;13996:79;;:::i;:::-;13960:117;14101:78;14171:7;14162:6;14151:9;14147:22;14101:78;:::i;:::-;14091:88;;13887:302;13657:539;;;;:::o;14202:180::-;14250:77;14247:1;14240:88;14347:4;14344:1;14337:15;14371:4;14368:1;14361:15;14388:320;14432:6;14469:1;14463:4;14459:12;14449:22;;14516:1;14510:4;14506:12;14537:18;14527:81;;14593:4;14585:6;14581:17;14571:27;;14527:81;14655:2;14647:6;14644:14;14624:18;14621:38;14618:84;;14674:18;;:::i;:::-;14618:84;14439:269;14388:320;;;:::o;14714:220::-;14854:34;14850:1;14842:6;14838:14;14831:58;14923:3;14918:2;14910:6;14906:15;14899:28;14714:220;:::o;14940:366::-;15082:3;15103:67;15167:2;15162:3;15103:67;:::i;:::-;15096:74;;15179:93;15268:3;15179:93;:::i;:::-;15297:2;15292:3;15288:12;15281:19;;14940:366;;;:::o;15312:419::-;15478:4;15516:2;15505:9;15501:18;15493:26;;15565:9;15559:4;15555:20;15551:1;15540:9;15536:17;15529:47;15593:131;15719:4;15593:131;:::i;:::-;15585:139;;15312:419;;;:::o;15737:248::-;15877:34;15873:1;15865:6;15861:14;15854:58;15946:31;15941:2;15933:6;15929:15;15922:56;15737:248;:::o;15991:366::-;16133:3;16154:67;16218:2;16213:3;16154:67;:::i;:::-;16147:74;;16230:93;16319:3;16230:93;:::i;:::-;16348:2;16343:3;16339:12;16332:19;;15991:366;;;:::o;16363:419::-;16529:4;16567:2;16556:9;16552:18;16544:26;;16616:9;16610:4;16606:20;16602:1;16591:9;16587:17;16580:47;16644:131;16770:4;16644:131;:::i;:::-;16636:139;;16363:419;;;:::o;16788:141::-;16837:4;16860:3;16852:11;;16883:3;16880:1;16873:14;16917:4;16914:1;16904:18;16896:26;;16788:141;;;:::o;16935:93::-;16972:6;17019:2;17014;17007:5;17003:14;16999:23;16989:33;;16935:93;;;:::o;17034:107::-;17078:8;17128:5;17122:4;17118:16;17097:37;;17034:107;;;;:::o;17147:393::-;17216:6;17266:1;17254:10;17250:18;17289:97;17319:66;17308:9;17289:97;:::i;:::-;17407:39;17437:8;17426:9;17407:39;:::i;:::-;17395:51;;17479:4;17475:9;17468:5;17464:21;17455:30;;17528:4;17518:8;17514:19;17507:5;17504:30;17494:40;;17223:317;;17147:393;;;;;:::o;17546:60::-;17574:3;17595:5;17588:12;;17546:60;;;:::o;17612:142::-;17662:9;17695:53;17713:34;17722:24;17740:5;17722:24;:::i;:::-;17713:34;:::i;:::-;17695:53;:::i;:::-;17682:66;;17612:142;;;:::o;17760:75::-;17803:3;17824:5;17817:12;;17760:75;;;:::o;17841:269::-;17951:39;17982:7;17951:39;:::i;:::-;18012:91;18061:41;18085:16;18061:41;:::i;:::-;18053:6;18046:4;18040:11;18012:91;:::i;:::-;18006:4;17999:105;17917:193;17841:269;;;:::o;18116:73::-;18161:3;18116:73;:::o;18195:189::-;18272:32;;:::i;:::-;18313:65;18371:6;18363;18357:4;18313:65;:::i;:::-;18248:136;18195:189;;:::o;18390:186::-;18450:120;18467:3;18460:5;18457:14;18450:120;;;18521:39;18558:1;18551:5;18521:39;:::i;:::-;18494:1;18487:5;18483:13;18474:22;;18450:120;;;18390:186;;:::o;18582:543::-;18683:2;18678:3;18675:11;18672:446;;;18717:38;18749:5;18717:38;:::i;:::-;18801:29;18819:10;18801:29;:::i;:::-;18791:8;18787:44;18984:2;18972:10;18969:18;18966:49;;;19005:8;18990:23;;18966:49;19028:80;19084:22;19102:3;19084:22;:::i;:::-;19074:8;19070:37;19057:11;19028:80;:::i;:::-;18687:431;;18672:446;18582:543;;;:::o;19131:117::-;19185:8;19235:5;19229:4;19225:16;19204:37;;19131:117;;;;:::o;19254:169::-;19298:6;19331:51;19379:1;19375:6;19367:5;19364:1;19360:13;19331:51;:::i;:::-;19327:56;19412:4;19406;19402:15;19392:25;;19305:118;19254:169;;;;:::o;19428:295::-;19504:4;19650:29;19675:3;19669:4;19650:29;:::i;:::-;19642:37;;19712:3;19709:1;19705:11;19699:4;19696:21;19688:29;;19428:295;;;;:::o;19728:1395::-;19845:37;19878:3;19845:37;:::i;:::-;19947:18;19939:6;19936:30;19933:56;;;19969:18;;:::i;:::-;19933:56;20013:38;20045:4;20039:11;20013:38;:::i;:::-;20098:67;20158:6;20150;20144:4;20098:67;:::i;:::-;20192:1;20216:4;20203:17;;20248:2;20240:6;20237:14;20265:1;20260:618;;;;20922:1;20939:6;20936:77;;;20988:9;20983:3;20979:19;20973:26;20964:35;;20936:77;21039:67;21099:6;21092:5;21039:67;:::i;:::-;21033:4;21026:81;20895:222;20230:887;;20260:618;20312:4;20308:9;20300:6;20296:22;20346:37;20378:4;20346:37;:::i;:::-;20405:1;20419:208;20433:7;20430:1;20427:14;20419:208;;;20512:9;20507:3;20503:19;20497:26;20489:6;20482:42;20563:1;20555:6;20551:14;20541:24;;20610:2;20599:9;20595:18;20582:31;;20456:4;20453:1;20449:12;20444:17;;20419:208;;;20655:6;20646:7;20643:19;20640:179;;;20713:9;20708:3;20704:19;20698:26;20756:48;20798:4;20790:6;20786:17;20775:9;20756:48;:::i;:::-;20748:6;20741:64;20663:156;20640:179;20865:1;20861;20853:6;20849:14;20845:22;20839:4;20832:36;20267:611;;;20230:887;;19820:1303;;;19728:1395;;:::o;21129:232::-;21269:34;21265:1;21257:6;21253:14;21246:58;21338:15;21333:2;21325:6;21321:15;21314:40;21129:232;:::o;21367:366::-;21509:3;21530:67;21594:2;21589:3;21530:67;:::i;:::-;21523:74;;21606:93;21695:3;21606:93;:::i;:::-;21724:2;21719:3;21715:12;21708:19;;21367:366;;;:::o;21739:419::-;21905:4;21943:2;21932:9;21928:18;21920:26;;21992:9;21986:4;21982:20;21978:1;21967:9;21963:17;21956:47;22020:131;22146:4;22020:131;:::i;:::-;22012:139;;21739:419;;;:::o;22164:174::-;22304:26;22300:1;22292:6;22288:14;22281:50;22164:174;:::o;22344:366::-;22486:3;22507:67;22571:2;22566:3;22507:67;:::i;:::-;22500:74;;22583:93;22672:3;22583:93;:::i;:::-;22701:2;22696:3;22692:12;22685:19;;22344:366;;;:::o;22716:419::-;22882:4;22920:2;22909:9;22905:18;22897:26;;22969:9;22963:4;22959:20;22955:1;22944:9;22940:17;22933:47;22997:131;23123:4;22997:131;:::i;:::-;22989:139;;22716:419;;;:::o;23141:178::-;23281:30;23277:1;23269:6;23265:14;23258:54;23141:178;:::o;23325:366::-;23467:3;23488:67;23552:2;23547:3;23488:67;:::i;:::-;23481:74;;23564:93;23653:3;23564:93;:::i;:::-;23682:2;23677:3;23673:12;23666:19;;23325:366;;;:::o;23697:419::-;23863:4;23901:2;23890:9;23886:18;23878:26;;23950:9;23944:4;23940:20;23936:1;23925:9;23921:17;23914:47;23978:131;24104:4;23978:131;:::i;:::-;23970:139;;23697:419;;;:::o;24122:171::-;24262:23;24258:1;24250:6;24246:14;24239:47;24122:171;:::o;24299:366::-;24441:3;24462:67;24526:2;24521:3;24462:67;:::i;:::-;24455:74;;24538:93;24627:3;24538:93;:::i;:::-;24656:2;24651:3;24647:12;24640:19;;24299:366;;;:::o;24671:419::-;24837:4;24875:2;24864:9;24860:18;24852:26;;24924:9;24918:4;24914:20;24910:1;24899:9;24895:17;24888:47;24952:131;25078:4;24952:131;:::i;:::-;24944:139;;24671:419;;;:::o;25096:228::-;25236:34;25232:1;25224:6;25220:14;25213:58;25305:11;25300:2;25292:6;25288:15;25281:36;25096:228;:::o;25330:366::-;25472:3;25493:67;25557:2;25552:3;25493:67;:::i;:::-;25486:74;;25569:93;25658:3;25569:93;:::i;:::-;25687:2;25682:3;25678:12;25671:19;;25330:366;;;:::o;25702:419::-;25868:4;25906:2;25895:9;25891:18;25883:26;;25955:9;25949:4;25945:20;25941:1;25930:9;25926:17;25919:47;25983:131;26109:4;25983:131;:::i;:::-;25975:139;;25702:419;;;:::o;26127:148::-;26229:11;26266:3;26251:18;;26127:148;;;;:::o;26305:874::-;26408:3;26445:5;26439:12;26474:36;26500:9;26474:36;:::i;:::-;26526:89;26608:6;26603:3;26526:89;:::i;:::-;26519:96;;26646:1;26635:9;26631:17;26662:1;26657:166;;;;26837:1;26832:341;;;;26624:549;;26657:166;26741:4;26737:9;26726;26722:25;26717:3;26710:38;26803:6;26796:14;26789:22;26781:6;26777:35;26772:3;26768:45;26761:52;;26657:166;;26832:341;26899:38;26931:5;26899:38;:::i;:::-;26959:1;26973:154;26987:6;26984:1;26981:13;26973:154;;;27061:7;27055:14;27051:1;27046:3;27042:11;27035:35;27111:1;27102:7;27098:15;27087:26;;27009:4;27006:1;27002:12;26997:17;;26973:154;;;27156:6;27151:3;27147:16;27140:23;;26839:334;;26624:549;;26412:767;;26305:874;;;;:::o;27185:390::-;27291:3;27319:39;27352:5;27319:39;:::i;:::-;27374:89;27456:6;27451:3;27374:89;:::i;:::-;27367:96;;27472:65;27530:6;27525:3;27518:4;27511:5;27507:16;27472:65;:::i;:::-;27562:6;27557:3;27553:16;27546:23;;27295:280;27185:390;;;;:::o;27581:155::-;27721:7;27717:1;27709:6;27705:14;27698:31;27581:155;:::o;27742:400::-;27902:3;27923:84;28005:1;28000:3;27923:84;:::i;:::-;27916:91;;28016:93;28105:3;28016:93;:::i;:::-;28134:1;28129:3;28125:11;28118:18;;27742:400;;;:::o;28148:695::-;28426:3;28448:92;28536:3;28527:6;28448:92;:::i;:::-;28441:99;;28557:95;28648:3;28639:6;28557:95;:::i;:::-;28550:102;;28669:148;28813:3;28669:148;:::i;:::-;28662:155;;28834:3;28827:10;;28148:695;;;;;:::o;28849:180::-;28897:77;28894:1;28887:88;28994:4;28991:1;28984:15;29018:4;29015:1;29008:15;29035:180;29083:77;29080:1;29073:88;29180:4;29177:1;29170:15;29204:4;29201:1;29194:15;29221:233;29260:3;29283:24;29301:5;29283:24;:::i;:::-;29274:33;;29329:66;29322:5;29319:77;29316:103;;29399:18;;:::i;:::-;29316:103;29446:1;29439:5;29435:13;29428:20;;29221:233;;;:::o;29460:225::-;29600:34;29596:1;29588:6;29584:14;29577:58;29669:8;29664:2;29656:6;29652:15;29645:33;29460:225;:::o;29691:366::-;29833:3;29854:67;29918:2;29913:3;29854:67;:::i;:::-;29847:74;;29930:93;30019:3;29930:93;:::i;:::-;30048:2;30043:3;30039:12;30032:19;;29691:366;;;:::o;30063:419::-;30229:4;30267:2;30256:9;30252:18;30244:26;;30316:9;30310:4;30306:20;30302:1;30291:9;30287:17;30280:47;30344:131;30470:4;30344:131;:::i;:::-;30336:139;;30063:419;;;:::o;30488:182::-;30628:34;30624:1;30616:6;30612:14;30605:58;30488:182;:::o;30676:366::-;30818:3;30839:67;30903:2;30898:3;30839:67;:::i;:::-;30832:74;;30915:93;31004:3;30915:93;:::i;:::-;31033:2;31028:3;31024:12;31017:19;;30676:366;;;:::o;31048:419::-;31214:4;31252:2;31241:9;31237:18;31229:26;;31301:9;31295:4;31291:20;31287:1;31276:9;31272:17;31265:47;31329:131;31455:4;31329:131;:::i;:::-;31321:139;;31048:419;;;:::o;31473:224::-;31613:34;31609:1;31601:6;31597:14;31590:58;31682:7;31677:2;31669:6;31665:15;31658:32;31473:224;:::o;31703:366::-;31845:3;31866:67;31930:2;31925:3;31866:67;:::i;:::-;31859:74;;31942:93;32031:3;31942:93;:::i;:::-;32060:2;32055:3;32051:12;32044:19;;31703:366;;;:::o;32075:419::-;32241:4;32279:2;32268:9;32264:18;32256:26;;32328:9;32322:4;32318:20;32314:1;32303:9;32299:17;32292:47;32356:131;32482:4;32356:131;:::i;:::-;32348:139;;32075:419;;;:::o;32500:223::-;32640:34;32636:1;32628:6;32624:14;32617:58;32709:6;32704:2;32696:6;32692:15;32685:31;32500:223;:::o;32729:366::-;32871:3;32892:67;32956:2;32951:3;32892:67;:::i;:::-;32885:74;;32968:93;33057:3;32968:93;:::i;:::-;33086:2;33081:3;33077:12;33070:19;;32729:366;;;:::o;33101:419::-;33267:4;33305:2;33294:9;33290:18;33282:26;;33354:9;33348:4;33344:20;33340:1;33329:9;33325:17;33318:47;33382:131;33508:4;33382:131;:::i;:::-;33374:139;;33101:419;;;:::o;33526:237::-;33666:34;33662:1;33654:6;33650:14;33643:58;33735:20;33730:2;33722:6;33718:15;33711:45;33526:237;:::o;33769:366::-;33911:3;33932:67;33996:2;33991:3;33932:67;:::i;:::-;33925:74;;34008:93;34097:3;34008:93;:::i;:::-;34126:2;34121:3;34117:12;34110:19;;33769:366;;;:::o;34141:419::-;34307:4;34345:2;34334:9;34330:18;34322:26;;34394:9;34388:4;34384:20;34380:1;34369:9;34365:17;34358:47;34422:131;34548:4;34422:131;:::i;:::-;34414:139;;34141:419;;;:::o;34566:175::-;34706:27;34702:1;34694:6;34690:14;34683:51;34566:175;:::o;34747:366::-;34889:3;34910:67;34974:2;34969:3;34910:67;:::i;:::-;34903:74;;34986:93;35075:3;34986:93;:::i;:::-;35104:2;35099:3;35095:12;35088:19;;34747:366;;;:::o;35119:419::-;35285:4;35323:2;35312:9;35308:18;35300:26;;35372:9;35366:4;35362:20;35358:1;35347:9;35343:17;35336:47;35400:131;35526:4;35400:131;:::i;:::-;35392:139;;35119:419;;;:::o;35544:180::-;35592:77;35589:1;35582:88;35689:4;35686:1;35679:15;35713:4;35710:1;35703:15;35730:194;35770:4;35790:20;35808:1;35790:20;:::i;:::-;35785:25;;35824:20;35842:1;35824:20;:::i;:::-;35819:25;;35868:1;35865;35861:9;35853:17;;35892:1;35886:4;35883:11;35880:37;;;35897:18;;:::i;:::-;35880:37;35730:194;;;;:::o;35930:191::-;35970:3;35989:20;36007:1;35989:20;:::i;:::-;35984:25;;36023:20;36041:1;36023:20;:::i;:::-;36018:25;;36066:1;36063;36059:9;36052:16;;36087:3;36084:1;36081:10;36078:36;;;36094:18;;:::i;:::-;36078:36;35930:191;;;;:::o;36127:98::-;36178:6;36212:5;36206:12;36196:22;;36127:98;;;:::o;36231:168::-;36314:11;36348:6;36343:3;36336:19;36388:4;36383:3;36379:14;36364:29;;36231:168;;;;:::o;36405:373::-;36491:3;36519:38;36551:5;36519:38;:::i;:::-;36573:70;36636:6;36631:3;36573:70;:::i;:::-;36566:77;;36652:65;36710:6;36705:3;36698:4;36691:5;36687:16;36652:65;:::i;:::-;36742:29;36764:6;36742:29;:::i;:::-;36737:3;36733:39;36726:46;;36495:283;36405:373;;;;:::o;36784:640::-;36979:4;37017:3;37006:9;37002:19;36994:27;;37031:71;37099:1;37088:9;37084:17;37075:6;37031:71;:::i;:::-;37112:72;37180:2;37169:9;37165:18;37156:6;37112:72;:::i;:::-;37194;37262:2;37251:9;37247:18;37238:6;37194:72;:::i;:::-;37313:9;37307:4;37303:20;37298:2;37287:9;37283:18;37276:48;37341:76;37412:4;37403:6;37341:76;:::i;:::-;37333:84;;36784:640;;;;;;;:::o;37430:141::-;37486:5;37517:6;37511:13;37502:22;;37533:32;37559:5;37533:32;:::i;:::-;37430:141;;;;:::o;37577:349::-;37646:6;37695:2;37683:9;37674:7;37670:23;37666:32;37663:119;;;37701:79;;:::i;:::-;37663:119;37821:1;37846:63;37901:7;37892:6;37881:9;37877:22;37846:63;:::i;:::-;37836:73;;37792:127;37577:349;;;;:::o;37932:182::-;38072:34;38068:1;38060:6;38056:14;38049:58;37932:182;:::o;38120:366::-;38262:3;38283:67;38347:2;38342:3;38283:67;:::i;:::-;38276:74;;38359:93;38448:3;38359:93;:::i;:::-;38477:2;38472:3;38468:12;38461:19;;38120:366;;;:::o;38492:419::-;38658:4;38696:2;38685:9;38681:18;38673:26;;38745:9;38739:4;38735:20;38731:1;38720:9;38716:17;38709:47;38773:131;38899:4;38773:131;:::i;:::-;38765:139;;38492:419;;;:::o;38917:178::-;39057:30;39053:1;39045:6;39041:14;39034:54;38917:178;:::o;39101:366::-;39243:3;39264:67;39328:2;39323:3;39264:67;:::i;:::-;39257:74;;39340:93;39429:3;39340:93;:::i;:::-;39458:2;39453:3;39449:12;39442:19;;39101:366;;;:::o;39473:419::-;39639:4;39677:2;39666:9;39662:18;39654:26;;39726:9;39720:4;39716:20;39712:1;39701:9;39697:17;39690:47;39754:131;39880:4;39754:131;:::i;:::-;39746:139;;39473:419;;;:::o

Swarm Source

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