ETH Price: $2,590.18 (-2.75%)

Token

The Shorty NFT (SHORTY)
 

Overview

Max Total Supply

1,000 SHORTY

Holders

205

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 SHORTY
0x03972e55234971cfddCcfBc59008158bC0056457
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:
TheShortyNFT

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-07
*/

// 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/security/ReentrancyGuard.sol


// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

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

// File: @openzeppelin/contracts/utils/math/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/interfaces/IERC2981.sol


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// 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.2) (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 {}

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

    /**
     * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override.
     *
     * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant
     * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such
     * that `ownerOf(tokenId)` is `a`.
     */
    // solhint-disable-next-line func-name-mixedcase
    function __unsafe_increaseBalance(address account, uint256 amount) internal {
        _balances[account] += amount;
    }
}

// File: ShortyNFT.sol



pragma solidity ^0.8.9;







contract TheShortyNFT is ERC721, IERC2981, ReentrancyGuard, Ownable {
  using Counters for Counters.Counter;

  constructor(string memory customBaseURI_) ERC721("The Shorty NFT", "SHORTY") {
    customBaseURI = customBaseURI_;
  }

  /** MINTING **/

  uint256 public constant MAX_SUPPLY = 1000;

  uint256 public constant MAX_MULTIMINT = 5;

  Counters.Counter private supplyCounter;

  function mint(uint256 count) public nonReentrant {
    require(saleIsActive, "Sale not active");

    require(totalSupply() + count - 1 < MAX_SUPPLY, "Exceeds max supply");

    require(count <= MAX_MULTIMINT, "Mint at most 5 at a time");

    for (uint256 i = 0; i < count; i++) {
      _mint(msg.sender, totalSupply());

      supplyCounter.increment();
    }
  }

  function totalSupply() public view returns (uint256) {
    return supplyCounter.current();
  }

  /** ACTIVATION **/

  bool public saleIsActive = true;

  function setSaleIsActive(bool saleIsActive_) external onlyOwner {
    saleIsActive = saleIsActive_;
  }

  bool public accessTokenIsActive = true;

  function setAccessTokenIsActive(bool accessTokenIsActive_) external onlyOwner
  {
    accessTokenIsActive = accessTokenIsActive_;
  }


  /** URI HANDLING **/

  string private customBaseURI;

  function setBaseURI(string memory customBaseURI_) external onlyOwner {
    customBaseURI = customBaseURI_;
  }

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

  function tokenURI(uint256 tokenId) public view override
    returns (string memory)
  {
    return string(abi.encodePacked(super.tokenURI(tokenId), ".json"));
  }

  /** PAYOUT **/

  function withdraw() public nonReentrant {
    uint256 balance = address(this).balance;

    Address.sendValue(payable(owner()), balance);
  }

  /** ROYALTIES **/

  function royaltyInfo(uint256, uint256 salePrice) external view override
    returns (address receiver, uint256 royaltyAmount)
  {
    return (address(this), (salePrice * 1000) / 10000);
  }

  function supportsInterface(bytes4 interfaceId)
    public
    view
    virtual
    override(ERC721, IERC165)
    returns (bool)
  {
    return (
      interfaceId == type(IERC2981).interfaceId ||
      super.supportsInterface(interfaceId)
    );
  }
}

// Contract created with Studio 721 v1.5.0
// https://721.so

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"customBaseURI_","type":"string"}],"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":[],"name":"MAX_MULTIMINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accessTokenIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"accessTokenIsActive_","type":"bool"}],"name":"setAccessTokenIsActive","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":"customBaseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"saleIsActive_","type":"bool"}],"name":"setSaleIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526001600960006101000a81548160ff0219169083151502179055506001600960016101000a81548160ff0219169083151502179055503480156200004757600080fd5b5060405162003e3038038062003e3083398181016040528101906200006d9190620003a1565b6040518060400160405280600e81526020017f5468652053686f727479204e46540000000000000000000000000000000000008152506040518060400160405280600681526020017f53484f52545900000000000000000000000000000000000000000000000000008152508160009081620000ea91906200063d565b508060019081620000fc91906200063d565b5050506001600681905550620001276200011b6200014060201b60201c565b6200014860201b60201c565b80600a90816200013891906200063d565b505062000724565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000277826200022c565b810181811067ffffffffffffffff821117156200029957620002986200023d565b5b80604052505050565b6000620002ae6200020e565b9050620002bc82826200026c565b919050565b600067ffffffffffffffff821115620002df57620002de6200023d565b5b620002ea826200022c565b9050602081019050919050565b60005b8381101562000317578082015181840152602081019050620002fa565b60008484015250505050565b60006200033a6200033484620002c1565b620002a2565b90508281526020810184848401111562000359576200035862000227565b5b62000366848285620002f7565b509392505050565b600082601f83011262000386576200038562000222565b5b81516200039884826020860162000323565b91505092915050565b600060208284031215620003ba57620003b962000218565b5b600082015167ffffffffffffffff811115620003db57620003da6200021d565b5b620003e9848285016200036e565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200044557607f821691505b6020821081036200045b576200045a620003fd565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004c57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000486565b620004d1868362000486565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200051e620005186200051284620004e9565b620004f3565b620004e9565b9050919050565b6000819050919050565b6200053a83620004fd565b62000552620005498262000525565b84845462000493565b825550505050565b600090565b620005696200055a565b620005768184846200052f565b505050565b5b818110156200059e57620005926000826200055f565b6001810190506200057c565b5050565b601f821115620005ed57620005b78162000461565b620005c28462000476565b81016020851015620005d2578190505b620005ea620005e18562000476565b8301826200057b565b50505b505050565b600082821c905092915050565b60006200061260001984600802620005f2565b1980831691505092915050565b60006200062d8383620005ff565b9150826002028217905092915050565b6200064882620003f2565b67ffffffffffffffff8111156200066457620006636200023d565b5b6200067082546200042c565b6200067d828285620005a2565b600060209050601f831160018114620006b55760008415620006a0578287015190505b620006ac85826200061f565b8655506200071c565b601f198416620006c58662000461565b60005b82811015620006ef57848901518255600182019150602085019450602081019050620006c8565b868310156200070f57848901516200070b601f891682620005ff565b8355505b6001600288020188555050505b505050505050565b6136fc80620007346000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c80636352211e116100f9578063b88d4fde11610097578063e985e9c511610071578063e985e9c514610495578063eb8d2444146104c5578063eeda2be7146104e3578063f2fde38b146104ff576101a9565b8063b88d4fde1461042b578063b8fc105114610447578063c87b56dd14610465576101a9565b80638da5cb5b116100d35780638da5cb5b146103b757806395d89b41146103d5578063a0712d68146103f3578063a22cb4651461040f576101a9565b80636352211e1461034d57806370a082311461037d578063715018a6146103ad576101a9565b806323b872dd116101665780633ccfd60b116101405780633ccfd60b146102ed57806342842e0e146102f757806355f804b3146103135780635e59409a1461032f576101a9565b806323b872dd146102825780632a55205a1461029e57806332cb6b0c146102cf576101a9565b806301ffc9a7146101ae57806302c88989146101de57806306fdde03146101fa578063081812fc14610218578063095ea7b31461024857806318160ddd14610264575b600080fd5b6101c860048036038101906101c39190612048565b61051b565b6040516101d59190612090565b60405180910390f35b6101f860048036038101906101f391906120d7565b610595565b005b6102026105ba565b60405161020f9190612194565b60405180910390f35b610232600480360381019061022d91906121ec565b61064c565b60405161023f919061225a565b60405180910390f35b610262600480360381019061025d91906122a1565b610692565b005b61026c6107a9565b60405161027991906122f0565b60405180910390f35b61029c6004803603810190610297919061230b565b6107ba565b005b6102b860048036038101906102b3919061235e565b61081a565b6040516102c692919061239e565b60405180910390f35b6102d7610844565b6040516102e491906122f0565b60405180910390f35b6102f561084a565b005b610311600480360381019061030c919061230b565b610873565b005b61032d600480360381019061032891906124fc565b610893565b005b6103376108ae565b6040516103449190612090565b60405180910390f35b610367600480360381019061036291906121ec565b6108c1565b604051610374919061225a565b60405180910390f35b61039760048036038101906103929190612545565b610947565b6040516103a491906122f0565b60405180910390f35b6103b56109fe565b005b6103bf610a12565b6040516103cc919061225a565b60405180910390f35b6103dd610a3c565b6040516103ea9190612194565b60405180910390f35b61040d600480360381019061040891906121ec565b610ace565b005b61042960048036038101906104249190612572565b610c10565b005b61044560048036038101906104409190612653565b610c26565b005b61044f610c88565b60405161045c91906122f0565b60405180910390f35b61047f600480360381019061047a91906121ec565b610c8d565b60405161048c9190612194565b60405180910390f35b6104af60048036038101906104aa91906126d6565b610cbe565b6040516104bc9190612090565b60405180910390f35b6104cd610d52565b6040516104da9190612090565b60405180910390f35b6104fd60048036038101906104f891906120d7565b610d65565b005b61051960048036038101906105149190612545565b610d8a565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061058e575061058d82610e0d565b5b9050919050565b61059d610eef565b80600960006101000a81548160ff02191690831515021790555050565b6060600080546105c990612745565b80601f01602080910402602001604051908101604052809291908181526020018280546105f590612745565b80156106425780601f1061061757610100808354040283529160200191610642565b820191906000526020600020905b81548152906001019060200180831161062557829003601f168201915b5050505050905090565b600061065782610f6d565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061069d826108c1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361070d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610704906127e8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661072c610fb8565b73ffffffffffffffffffffffffffffffffffffffff16148061075b575061075a81610755610fb8565b610cbe565b5b61079a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107919061287a565b60405180910390fd5b6107a48383610fc0565b505050565b60006107b56008611079565b905090565b6107cb6107c5610fb8565b82611087565b61080a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108019061290c565b60405180910390fd5b61081583838361111c565b505050565b600080306127106103e88561082f919061295b565b61083991906129cc565b915091509250929050565b6103e881565b610852611415565b6000479050610868610862610a12565b82611464565b50610871611558565b565b61088e83838360405180602001604052806000815250610c26565b505050565b61089b610eef565b80600a90816108aa9190612ba9565b5050565b600960019054906101000a900460ff1681565b6000806108cd83611562565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361093e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093590612cc7565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ae90612d59565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a06610eef565b610a10600061159f565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610a4b90612745565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7790612745565b8015610ac45780601f10610a9957610100808354040283529160200191610ac4565b820191906000526020600020905b815481529060010190602001808311610aa757829003601f168201915b5050505050905090565b610ad6611415565b600960009054906101000a900460ff16610b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1c90612dc5565b60405180910390fd5b6103e8600182610b336107a9565b610b3d9190612de5565b610b479190612e19565b10610b87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7e90612e99565b60405180910390fd5b6005811115610bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc290612f05565b60405180910390fd5b60005b81811015610c0457610be733610be26107a9565b611665565b610bf16008611882565b8080610bfc90612f25565b915050610bce565b50610c0d611558565b50565b610c22610c1b610fb8565b8383611898565b5050565b610c37610c31610fb8565b83611087565b610c76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6d9061290c565b60405180910390fd5b610c8284848484611a04565b50505050565b600581565b6060610c9882611a60565b604051602001610ca89190612ff5565b6040516020818303038152906040529050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600960009054906101000a900460ff1681565b610d6d610eef565b80600960016101000a81548160ff02191690831515021790555050565b610d92610eef565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df890613089565b60405180910390fd5b610e0a8161159f565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ed857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ee85750610ee782611ac8565b5b9050919050565b610ef7610fb8565b73ffffffffffffffffffffffffffffffffffffffff16610f15610a12565b73ffffffffffffffffffffffffffffffffffffffff1614610f6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f62906130f5565b60405180910390fd5b565b610f7681611b32565b610fb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fac90612cc7565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611033836108c1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600080611093836108c1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806110d557506110d48185610cbe565b5b8061111357508373ffffffffffffffffffffffffffffffffffffffff166110fb8461064c565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661113c826108c1565b73ffffffffffffffffffffffffffffffffffffffff1614611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118990613187565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f890613219565b60405180910390fd5b61120e8383836001611b73565b8273ffffffffffffffffffffffffffffffffffffffff1661122e826108c1565b73ffffffffffffffffffffffffffffffffffffffff1614611284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127b90613187565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46114108383836001611b79565b505050565b60026006540361145a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145190613285565b60405180910390fd5b6002600681905550565b804710156114a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149e906132f1565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516114cd90613342565b60006040518083038185875af1925050503d806000811461150a576040519150601f19603f3d011682016040523d82523d6000602084013e61150f565b606091505b5050905080611553576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154a906133c9565b60405180910390fd5b505050565b6001600681905550565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cb90613435565b60405180910390fd5b6116dd81611b32565b1561171d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611714906134a1565b60405180910390fd5b61172b600083836001611b73565b61173481611b32565b15611774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176b906134a1565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461187e600083836001611b79565b5050565b6001816000016000828254019250508190555050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611906576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fd9061350d565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119f79190612090565b60405180910390a3505050565b611a0f84848461111c565b611a1b84848484611b7f565b611a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a519061359f565b60405180910390fd5b50505050565b6060611a6b82610f6d565b6000611a75611d06565b90506000815111611a955760405180602001604052806000815250611ac0565b80611a9f84611d98565b604051602001611ab09291906135bf565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16611b5483611562565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b6000611ba08473ffffffffffffffffffffffffffffffffffffffff16611e66565b15611cf9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611bc9610fb8565b8786866040518563ffffffff1660e01b8152600401611beb9493929190613638565b6020604051808303816000875af1925050508015611c2757506040513d601f19601f82011682018060405250810190611c249190613699565b60015b611ca9573d8060008114611c57576040519150601f19603f3d011682016040523d82523d6000602084013e611c5c565b606091505b506000815103611ca1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c989061359f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611cfe565b600190505b949350505050565b6060600a8054611d1590612745565b80601f0160208091040260200160405190810160405280929190818152602001828054611d4190612745565b8015611d8e5780601f10611d6357610100808354040283529160200191611d8e565b820191906000526020600020905b815481529060010190602001808311611d7157829003601f168201915b5050505050905090565b606060006001611da784611e89565b01905060008167ffffffffffffffff811115611dc657611dc56123d1565b5b6040519080825280601f01601f191660200182016040528015611df85781602001600182028036833780820191505090505b509050600082602001820190505b600115611e5b578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611e4f57611e4e61299d565b5b04945060008503611e06575b819350505050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611ee7577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611edd57611edc61299d565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611f24576d04ee2d6d415b85acef81000000008381611f1a57611f1961299d565b5b0492506020810190505b662386f26fc100008310611f5357662386f26fc100008381611f4957611f4861299d565b5b0492506010810190505b6305f5e1008310611f7c576305f5e1008381611f7257611f7161299d565b5b0492506008810190505b6127108310611fa1576127108381611f9757611f9661299d565b5b0492506004810190505b60648310611fc45760648381611fba57611fb961299d565b5b0492506002810190505b600a8310611fd3576001810190505b80915050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61202581611ff0565b811461203057600080fd5b50565b6000813590506120428161201c565b92915050565b60006020828403121561205e5761205d611fe6565b5b600061206c84828501612033565b91505092915050565b60008115159050919050565b61208a81612075565b82525050565b60006020820190506120a56000830184612081565b92915050565b6120b481612075565b81146120bf57600080fd5b50565b6000813590506120d1816120ab565b92915050565b6000602082840312156120ed576120ec611fe6565b5b60006120fb848285016120c2565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561213e578082015181840152602081019050612123565b60008484015250505050565b6000601f19601f8301169050919050565b600061216682612104565b612170818561210f565b9350612180818560208601612120565b6121898161214a565b840191505092915050565b600060208201905081810360008301526121ae818461215b565b905092915050565b6000819050919050565b6121c9816121b6565b81146121d457600080fd5b50565b6000813590506121e6816121c0565b92915050565b60006020828403121561220257612201611fe6565b5b6000612210848285016121d7565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061224482612219565b9050919050565b61225481612239565b82525050565b600060208201905061226f600083018461224b565b92915050565b61227e81612239565b811461228957600080fd5b50565b60008135905061229b81612275565b92915050565b600080604083850312156122b8576122b7611fe6565b5b60006122c68582860161228c565b92505060206122d7858286016121d7565b9150509250929050565b6122ea816121b6565b82525050565b600060208201905061230560008301846122e1565b92915050565b60008060006060848603121561232457612323611fe6565b5b60006123328682870161228c565b93505060206123438682870161228c565b9250506040612354868287016121d7565b9150509250925092565b6000806040838503121561237557612374611fe6565b5b6000612383858286016121d7565b9250506020612394858286016121d7565b9150509250929050565b60006040820190506123b3600083018561224b565b6123c060208301846122e1565b9392505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6124098261214a565b810181811067ffffffffffffffff82111715612428576124276123d1565b5b80604052505050565b600061243b611fdc565b90506124478282612400565b919050565b600067ffffffffffffffff821115612467576124666123d1565b5b6124708261214a565b9050602081019050919050565b82818337600083830152505050565b600061249f61249a8461244c565b612431565b9050828152602081018484840111156124bb576124ba6123cc565b5b6124c684828561247d565b509392505050565b600082601f8301126124e3576124e26123c7565b5b81356124f384826020860161248c565b91505092915050565b60006020828403121561251257612511611fe6565b5b600082013567ffffffffffffffff8111156125305761252f611feb565b5b61253c848285016124ce565b91505092915050565b60006020828403121561255b5761255a611fe6565b5b60006125698482850161228c565b91505092915050565b6000806040838503121561258957612588611fe6565b5b60006125978582860161228c565b92505060206125a8858286016120c2565b9150509250929050565b600067ffffffffffffffff8211156125cd576125cc6123d1565b5b6125d68261214a565b9050602081019050919050565b60006125f66125f1846125b2565b612431565b905082815260208101848484011115612612576126116123cc565b5b61261d84828561247d565b509392505050565b600082601f83011261263a576126396123c7565b5b813561264a8482602086016125e3565b91505092915050565b6000806000806080858703121561266d5761266c611fe6565b5b600061267b8782880161228c565b945050602061268c8782880161228c565b935050604061269d878288016121d7565b925050606085013567ffffffffffffffff8111156126be576126bd611feb565b5b6126ca87828801612625565b91505092959194509250565b600080604083850312156126ed576126ec611fe6565b5b60006126fb8582860161228c565b925050602061270c8582860161228c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061275d57607f821691505b6020821081036127705761276f612716565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006127d260218361210f565b91506127dd82612776565b604082019050919050565b60006020820190508181036000830152612801816127c5565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612864603d8361210f565b915061286f82612808565b604082019050919050565b6000602082019050818103600083015261289381612857565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006128f6602d8361210f565b91506129018261289a565b604082019050919050565b60006020820190508181036000830152612925816128e9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612966826121b6565b9150612971836121b6565b925082820261297f816121b6565b915082820484148315176129965761299561292c565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006129d7826121b6565b91506129e2836121b6565b9250826129f2576129f161299d565b5b828204905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612a5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612a22565b612a698683612a22565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612aa6612aa1612a9c846121b6565b612a81565b6121b6565b9050919050565b6000819050919050565b612ac083612a8b565b612ad4612acc82612aad565b848454612a2f565b825550505050565b600090565b612ae9612adc565b612af4818484612ab7565b505050565b5b81811015612b1857612b0d600082612ae1565b600181019050612afa565b5050565b601f821115612b5d57612b2e816129fd565b612b3784612a12565b81016020851015612b46578190505b612b5a612b5285612a12565b830182612af9565b50505b505050565b600082821c905092915050565b6000612b8060001984600802612b62565b1980831691505092915050565b6000612b998383612b6f565b9150826002028217905092915050565b612bb282612104565b67ffffffffffffffff811115612bcb57612bca6123d1565b5b612bd58254612745565b612be0828285612b1c565b600060209050601f831160018114612c135760008415612c01578287015190505b612c0b8582612b8d565b865550612c73565b601f198416612c21866129fd565b60005b82811015612c4957848901518255600182019150602085019450602081019050612c24565b86831015612c665784890151612c62601f891682612b6f565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612cb160188361210f565b9150612cbc82612c7b565b602082019050919050565b60006020820190508181036000830152612ce081612ca4565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612d4360298361210f565b9150612d4e82612ce7565b604082019050919050565b60006020820190508181036000830152612d7281612d36565b9050919050565b7f53616c65206e6f74206163746976650000000000000000000000000000000000600082015250565b6000612daf600f8361210f565b9150612dba82612d79565b602082019050919050565b60006020820190508181036000830152612dde81612da2565b9050919050565b6000612df0826121b6565b9150612dfb836121b6565b9250828201905080821115612e1357612e1261292c565b5b92915050565b6000612e24826121b6565b9150612e2f836121b6565b9250828203905081811115612e4757612e4661292c565b5b92915050565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b6000612e8360128361210f565b9150612e8e82612e4d565b602082019050919050565b60006020820190508181036000830152612eb281612e76565b9050919050565b7f4d696e74206174206d6f7374203520617420612074696d650000000000000000600082015250565b6000612eef60188361210f565b9150612efa82612eb9565b602082019050919050565b60006020820190508181036000830152612f1e81612ee2565b9050919050565b6000612f30826121b6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612f6257612f6161292c565b5b600182019050919050565b600081905092915050565b6000612f8382612104565b612f8d8185612f6d565b9350612f9d818560208601612120565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000612fdf600583612f6d565b9150612fea82612fa9565b600582019050919050565b60006130018284612f78565b915061300c82612fd2565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061307360268361210f565b915061307e82613017565b604082019050919050565b600060208201905081810360008301526130a281613066565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006130df60208361210f565b91506130ea826130a9565b602082019050919050565b6000602082019050818103600083015261310e816130d2565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061317160258361210f565b915061317c82613115565b604082019050919050565b600060208201905081810360008301526131a081613164565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061320360248361210f565b915061320e826131a7565b604082019050919050565b60006020820190508181036000830152613232816131f6565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061326f601f8361210f565b915061327a82613239565b602082019050919050565b6000602082019050818103600083015261329e81613262565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b60006132db601d8361210f565b91506132e6826132a5565b602082019050919050565b6000602082019050818103600083015261330a816132ce565b9050919050565b600081905092915050565b50565b600061332c600083613311565b91506133378261331c565b600082019050919050565b600061334d8261331f565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b60006133b3603a8361210f565b91506133be82613357565b604082019050919050565b600060208201905081810360008301526133e2816133a6565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061341f60208361210f565b915061342a826133e9565b602082019050919050565b6000602082019050818103600083015261344e81613412565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061348b601c8361210f565b915061349682613455565b602082019050919050565b600060208201905081810360008301526134ba8161347e565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006134f760198361210f565b9150613502826134c1565b602082019050919050565b60006020820190508181036000830152613526816134ea565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061358960328361210f565b91506135948261352d565b604082019050919050565b600060208201905081810360008301526135b88161357c565b9050919050565b60006135cb8285612f78565b91506135d78284612f78565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b600061360a826135e3565b61361481856135ee565b9350613624818560208601612120565b61362d8161214a565b840191505092915050565b600060808201905061364d600083018761224b565b61365a602083018661224b565b61366760408301856122e1565b818103606083015261367981846135ff565b905095945050505050565b6000815190506136938161201c565b92915050565b6000602082840312156136af576136ae611fe6565b5b60006136bd84828501613684565b9150509291505056fea2646970667358221220f88fc2c66e29dc658807482ca245928d85d8e914fdd76c71f7cdac27875f2f7764736f6c6343000813003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000043697066733a2f2f6261667962656963346c37687671356d6836676c703561647165736a6d6679786b366c796d75696c7065766135616176763579736f326b366d6b652f0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101a95760003560e01c80636352211e116100f9578063b88d4fde11610097578063e985e9c511610071578063e985e9c514610495578063eb8d2444146104c5578063eeda2be7146104e3578063f2fde38b146104ff576101a9565b8063b88d4fde1461042b578063b8fc105114610447578063c87b56dd14610465576101a9565b80638da5cb5b116100d35780638da5cb5b146103b757806395d89b41146103d5578063a0712d68146103f3578063a22cb4651461040f576101a9565b80636352211e1461034d57806370a082311461037d578063715018a6146103ad576101a9565b806323b872dd116101665780633ccfd60b116101405780633ccfd60b146102ed57806342842e0e146102f757806355f804b3146103135780635e59409a1461032f576101a9565b806323b872dd146102825780632a55205a1461029e57806332cb6b0c146102cf576101a9565b806301ffc9a7146101ae57806302c88989146101de57806306fdde03146101fa578063081812fc14610218578063095ea7b31461024857806318160ddd14610264575b600080fd5b6101c860048036038101906101c39190612048565b61051b565b6040516101d59190612090565b60405180910390f35b6101f860048036038101906101f391906120d7565b610595565b005b6102026105ba565b60405161020f9190612194565b60405180910390f35b610232600480360381019061022d91906121ec565b61064c565b60405161023f919061225a565b60405180910390f35b610262600480360381019061025d91906122a1565b610692565b005b61026c6107a9565b60405161027991906122f0565b60405180910390f35b61029c6004803603810190610297919061230b565b6107ba565b005b6102b860048036038101906102b3919061235e565b61081a565b6040516102c692919061239e565b60405180910390f35b6102d7610844565b6040516102e491906122f0565b60405180910390f35b6102f561084a565b005b610311600480360381019061030c919061230b565b610873565b005b61032d600480360381019061032891906124fc565b610893565b005b6103376108ae565b6040516103449190612090565b60405180910390f35b610367600480360381019061036291906121ec565b6108c1565b604051610374919061225a565b60405180910390f35b61039760048036038101906103929190612545565b610947565b6040516103a491906122f0565b60405180910390f35b6103b56109fe565b005b6103bf610a12565b6040516103cc919061225a565b60405180910390f35b6103dd610a3c565b6040516103ea9190612194565b60405180910390f35b61040d600480360381019061040891906121ec565b610ace565b005b61042960048036038101906104249190612572565b610c10565b005b61044560048036038101906104409190612653565b610c26565b005b61044f610c88565b60405161045c91906122f0565b60405180910390f35b61047f600480360381019061047a91906121ec565b610c8d565b60405161048c9190612194565b60405180910390f35b6104af60048036038101906104aa91906126d6565b610cbe565b6040516104bc9190612090565b60405180910390f35b6104cd610d52565b6040516104da9190612090565b60405180910390f35b6104fd60048036038101906104f891906120d7565b610d65565b005b61051960048036038101906105149190612545565b610d8a565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061058e575061058d82610e0d565b5b9050919050565b61059d610eef565b80600960006101000a81548160ff02191690831515021790555050565b6060600080546105c990612745565b80601f01602080910402602001604051908101604052809291908181526020018280546105f590612745565b80156106425780601f1061061757610100808354040283529160200191610642565b820191906000526020600020905b81548152906001019060200180831161062557829003601f168201915b5050505050905090565b600061065782610f6d565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061069d826108c1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361070d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610704906127e8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661072c610fb8565b73ffffffffffffffffffffffffffffffffffffffff16148061075b575061075a81610755610fb8565b610cbe565b5b61079a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107919061287a565b60405180910390fd5b6107a48383610fc0565b505050565b60006107b56008611079565b905090565b6107cb6107c5610fb8565b82611087565b61080a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108019061290c565b60405180910390fd5b61081583838361111c565b505050565b600080306127106103e88561082f919061295b565b61083991906129cc565b915091509250929050565b6103e881565b610852611415565b6000479050610868610862610a12565b82611464565b50610871611558565b565b61088e83838360405180602001604052806000815250610c26565b505050565b61089b610eef565b80600a90816108aa9190612ba9565b5050565b600960019054906101000a900460ff1681565b6000806108cd83611562565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361093e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093590612cc7565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ae90612d59565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a06610eef565b610a10600061159f565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610a4b90612745565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7790612745565b8015610ac45780601f10610a9957610100808354040283529160200191610ac4565b820191906000526020600020905b815481529060010190602001808311610aa757829003601f168201915b5050505050905090565b610ad6611415565b600960009054906101000a900460ff16610b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1c90612dc5565b60405180910390fd5b6103e8600182610b336107a9565b610b3d9190612de5565b610b479190612e19565b10610b87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7e90612e99565b60405180910390fd5b6005811115610bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc290612f05565b60405180910390fd5b60005b81811015610c0457610be733610be26107a9565b611665565b610bf16008611882565b8080610bfc90612f25565b915050610bce565b50610c0d611558565b50565b610c22610c1b610fb8565b8383611898565b5050565b610c37610c31610fb8565b83611087565b610c76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6d9061290c565b60405180910390fd5b610c8284848484611a04565b50505050565b600581565b6060610c9882611a60565b604051602001610ca89190612ff5565b6040516020818303038152906040529050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600960009054906101000a900460ff1681565b610d6d610eef565b80600960016101000a81548160ff02191690831515021790555050565b610d92610eef565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df890613089565b60405180910390fd5b610e0a8161159f565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ed857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ee85750610ee782611ac8565b5b9050919050565b610ef7610fb8565b73ffffffffffffffffffffffffffffffffffffffff16610f15610a12565b73ffffffffffffffffffffffffffffffffffffffff1614610f6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f62906130f5565b60405180910390fd5b565b610f7681611b32565b610fb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fac90612cc7565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611033836108c1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600080611093836108c1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806110d557506110d48185610cbe565b5b8061111357508373ffffffffffffffffffffffffffffffffffffffff166110fb8461064c565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661113c826108c1565b73ffffffffffffffffffffffffffffffffffffffff1614611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118990613187565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f890613219565b60405180910390fd5b61120e8383836001611b73565b8273ffffffffffffffffffffffffffffffffffffffff1661122e826108c1565b73ffffffffffffffffffffffffffffffffffffffff1614611284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127b90613187565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46114108383836001611b79565b505050565b60026006540361145a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145190613285565b60405180910390fd5b6002600681905550565b804710156114a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149e906132f1565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516114cd90613342565b60006040518083038185875af1925050503d806000811461150a576040519150601f19603f3d011682016040523d82523d6000602084013e61150f565b606091505b5050905080611553576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154a906133c9565b60405180910390fd5b505050565b6001600681905550565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cb90613435565b60405180910390fd5b6116dd81611b32565b1561171d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611714906134a1565b60405180910390fd5b61172b600083836001611b73565b61173481611b32565b15611774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176b906134a1565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461187e600083836001611b79565b5050565b6001816000016000828254019250508190555050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611906576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fd9061350d565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119f79190612090565b60405180910390a3505050565b611a0f84848461111c565b611a1b84848484611b7f565b611a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a519061359f565b60405180910390fd5b50505050565b6060611a6b82610f6d565b6000611a75611d06565b90506000815111611a955760405180602001604052806000815250611ac0565b80611a9f84611d98565b604051602001611ab09291906135bf565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16611b5483611562565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b6000611ba08473ffffffffffffffffffffffffffffffffffffffff16611e66565b15611cf9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611bc9610fb8565b8786866040518563ffffffff1660e01b8152600401611beb9493929190613638565b6020604051808303816000875af1925050508015611c2757506040513d601f19601f82011682018060405250810190611c249190613699565b60015b611ca9573d8060008114611c57576040519150601f19603f3d011682016040523d82523d6000602084013e611c5c565b606091505b506000815103611ca1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c989061359f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611cfe565b600190505b949350505050565b6060600a8054611d1590612745565b80601f0160208091040260200160405190810160405280929190818152602001828054611d4190612745565b8015611d8e5780601f10611d6357610100808354040283529160200191611d8e565b820191906000526020600020905b815481529060010190602001808311611d7157829003601f168201915b5050505050905090565b606060006001611da784611e89565b01905060008167ffffffffffffffff811115611dc657611dc56123d1565b5b6040519080825280601f01601f191660200182016040528015611df85781602001600182028036833780820191505090505b509050600082602001820190505b600115611e5b578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611e4f57611e4e61299d565b5b04945060008503611e06575b819350505050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611ee7577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611edd57611edc61299d565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611f24576d04ee2d6d415b85acef81000000008381611f1a57611f1961299d565b5b0492506020810190505b662386f26fc100008310611f5357662386f26fc100008381611f4957611f4861299d565b5b0492506010810190505b6305f5e1008310611f7c576305f5e1008381611f7257611f7161299d565b5b0492506008810190505b6127108310611fa1576127108381611f9757611f9661299d565b5b0492506004810190505b60648310611fc45760648381611fba57611fb961299d565b5b0492506002810190505b600a8310611fd3576001810190505b80915050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61202581611ff0565b811461203057600080fd5b50565b6000813590506120428161201c565b92915050565b60006020828403121561205e5761205d611fe6565b5b600061206c84828501612033565b91505092915050565b60008115159050919050565b61208a81612075565b82525050565b60006020820190506120a56000830184612081565b92915050565b6120b481612075565b81146120bf57600080fd5b50565b6000813590506120d1816120ab565b92915050565b6000602082840312156120ed576120ec611fe6565b5b60006120fb848285016120c2565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561213e578082015181840152602081019050612123565b60008484015250505050565b6000601f19601f8301169050919050565b600061216682612104565b612170818561210f565b9350612180818560208601612120565b6121898161214a565b840191505092915050565b600060208201905081810360008301526121ae818461215b565b905092915050565b6000819050919050565b6121c9816121b6565b81146121d457600080fd5b50565b6000813590506121e6816121c0565b92915050565b60006020828403121561220257612201611fe6565b5b6000612210848285016121d7565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061224482612219565b9050919050565b61225481612239565b82525050565b600060208201905061226f600083018461224b565b92915050565b61227e81612239565b811461228957600080fd5b50565b60008135905061229b81612275565b92915050565b600080604083850312156122b8576122b7611fe6565b5b60006122c68582860161228c565b92505060206122d7858286016121d7565b9150509250929050565b6122ea816121b6565b82525050565b600060208201905061230560008301846122e1565b92915050565b60008060006060848603121561232457612323611fe6565b5b60006123328682870161228c565b93505060206123438682870161228c565b9250506040612354868287016121d7565b9150509250925092565b6000806040838503121561237557612374611fe6565b5b6000612383858286016121d7565b9250506020612394858286016121d7565b9150509250929050565b60006040820190506123b3600083018561224b565b6123c060208301846122e1565b9392505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6124098261214a565b810181811067ffffffffffffffff82111715612428576124276123d1565b5b80604052505050565b600061243b611fdc565b90506124478282612400565b919050565b600067ffffffffffffffff821115612467576124666123d1565b5b6124708261214a565b9050602081019050919050565b82818337600083830152505050565b600061249f61249a8461244c565b612431565b9050828152602081018484840111156124bb576124ba6123cc565b5b6124c684828561247d565b509392505050565b600082601f8301126124e3576124e26123c7565b5b81356124f384826020860161248c565b91505092915050565b60006020828403121561251257612511611fe6565b5b600082013567ffffffffffffffff8111156125305761252f611feb565b5b61253c848285016124ce565b91505092915050565b60006020828403121561255b5761255a611fe6565b5b60006125698482850161228c565b91505092915050565b6000806040838503121561258957612588611fe6565b5b60006125978582860161228c565b92505060206125a8858286016120c2565b9150509250929050565b600067ffffffffffffffff8211156125cd576125cc6123d1565b5b6125d68261214a565b9050602081019050919050565b60006125f66125f1846125b2565b612431565b905082815260208101848484011115612612576126116123cc565b5b61261d84828561247d565b509392505050565b600082601f83011261263a576126396123c7565b5b813561264a8482602086016125e3565b91505092915050565b6000806000806080858703121561266d5761266c611fe6565b5b600061267b8782880161228c565b945050602061268c8782880161228c565b935050604061269d878288016121d7565b925050606085013567ffffffffffffffff8111156126be576126bd611feb565b5b6126ca87828801612625565b91505092959194509250565b600080604083850312156126ed576126ec611fe6565b5b60006126fb8582860161228c565b925050602061270c8582860161228c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061275d57607f821691505b6020821081036127705761276f612716565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006127d260218361210f565b91506127dd82612776565b604082019050919050565b60006020820190508181036000830152612801816127c5565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612864603d8361210f565b915061286f82612808565b604082019050919050565b6000602082019050818103600083015261289381612857565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006128f6602d8361210f565b91506129018261289a565b604082019050919050565b60006020820190508181036000830152612925816128e9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612966826121b6565b9150612971836121b6565b925082820261297f816121b6565b915082820484148315176129965761299561292c565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006129d7826121b6565b91506129e2836121b6565b9250826129f2576129f161299d565b5b828204905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612a5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612a22565b612a698683612a22565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612aa6612aa1612a9c846121b6565b612a81565b6121b6565b9050919050565b6000819050919050565b612ac083612a8b565b612ad4612acc82612aad565b848454612a2f565b825550505050565b600090565b612ae9612adc565b612af4818484612ab7565b505050565b5b81811015612b1857612b0d600082612ae1565b600181019050612afa565b5050565b601f821115612b5d57612b2e816129fd565b612b3784612a12565b81016020851015612b46578190505b612b5a612b5285612a12565b830182612af9565b50505b505050565b600082821c905092915050565b6000612b8060001984600802612b62565b1980831691505092915050565b6000612b998383612b6f565b9150826002028217905092915050565b612bb282612104565b67ffffffffffffffff811115612bcb57612bca6123d1565b5b612bd58254612745565b612be0828285612b1c565b600060209050601f831160018114612c135760008415612c01578287015190505b612c0b8582612b8d565b865550612c73565b601f198416612c21866129fd565b60005b82811015612c4957848901518255600182019150602085019450602081019050612c24565b86831015612c665784890151612c62601f891682612b6f565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612cb160188361210f565b9150612cbc82612c7b565b602082019050919050565b60006020820190508181036000830152612ce081612ca4565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612d4360298361210f565b9150612d4e82612ce7565b604082019050919050565b60006020820190508181036000830152612d7281612d36565b9050919050565b7f53616c65206e6f74206163746976650000000000000000000000000000000000600082015250565b6000612daf600f8361210f565b9150612dba82612d79565b602082019050919050565b60006020820190508181036000830152612dde81612da2565b9050919050565b6000612df0826121b6565b9150612dfb836121b6565b9250828201905080821115612e1357612e1261292c565b5b92915050565b6000612e24826121b6565b9150612e2f836121b6565b9250828203905081811115612e4757612e4661292c565b5b92915050565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b6000612e8360128361210f565b9150612e8e82612e4d565b602082019050919050565b60006020820190508181036000830152612eb281612e76565b9050919050565b7f4d696e74206174206d6f7374203520617420612074696d650000000000000000600082015250565b6000612eef60188361210f565b9150612efa82612eb9565b602082019050919050565b60006020820190508181036000830152612f1e81612ee2565b9050919050565b6000612f30826121b6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612f6257612f6161292c565b5b600182019050919050565b600081905092915050565b6000612f8382612104565b612f8d8185612f6d565b9350612f9d818560208601612120565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000612fdf600583612f6d565b9150612fea82612fa9565b600582019050919050565b60006130018284612f78565b915061300c82612fd2565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061307360268361210f565b915061307e82613017565b604082019050919050565b600060208201905081810360008301526130a281613066565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006130df60208361210f565b91506130ea826130a9565b602082019050919050565b6000602082019050818103600083015261310e816130d2565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061317160258361210f565b915061317c82613115565b604082019050919050565b600060208201905081810360008301526131a081613164565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061320360248361210f565b915061320e826131a7565b604082019050919050565b60006020820190508181036000830152613232816131f6565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061326f601f8361210f565b915061327a82613239565b602082019050919050565b6000602082019050818103600083015261329e81613262565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b60006132db601d8361210f565b91506132e6826132a5565b602082019050919050565b6000602082019050818103600083015261330a816132ce565b9050919050565b600081905092915050565b50565b600061332c600083613311565b91506133378261331c565b600082019050919050565b600061334d8261331f565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b60006133b3603a8361210f565b91506133be82613357565b604082019050919050565b600060208201905081810360008301526133e2816133a6565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061341f60208361210f565b915061342a826133e9565b602082019050919050565b6000602082019050818103600083015261344e81613412565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061348b601c8361210f565b915061349682613455565b602082019050919050565b600060208201905081810360008301526134ba8161347e565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006134f760198361210f565b9150613502826134c1565b602082019050919050565b60006020820190508181036000830152613526816134ea565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061358960328361210f565b91506135948261352d565b604082019050919050565b600060208201905081810360008301526135b88161357c565b9050919050565b60006135cb8285612f78565b91506135d78284612f78565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b600061360a826135e3565b61361481856135ee565b9350613624818560208601612120565b61362d8161214a565b840191505092915050565b600060808201905061364d600083018761224b565b61365a602083018661224b565b61366760408301856122e1565b818103606083015261367981846135ff565b905095945050505050565b6000815190506136938161201c565b92915050565b6000602082840312156136af576136ae611fe6565b5b60006136bd84828501613684565b9150509291505056fea2646970667358221220f88fc2c66e29dc658807482ca245928d85d8e914fdd76c71f7cdac27875f2f7764736f6c63430008130033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000043697066733a2f2f6261667962656963346c37687671356d6836676c703561647165736a6d6679786b366c796d75696c7065766135616176763579736f326b366d6b652f0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : customBaseURI_ (string): ipfs://bafybeic4l7hvq5mh6glp5adqesjmfyxk6lymuilpeva5aavv5yso2k6mke/

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [2] : 697066733a2f2f6261667962656963346c37687671356d6836676c7035616471
Arg [3] : 65736a6d6679786b366c796d75696c7065766135616176763579736f326b366d
Arg [4] : 6b652f0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

60117:2371:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62225:260;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61067:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44781:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46293:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45811:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60903:96;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46993:335;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62026:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;60379:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61852:145;;;:::i;:::-;;47399:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61428:112;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61178:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44491:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44222:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22386:103;;;:::i;:::-;;21738:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44950:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60520:377;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46536:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47655:322;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60427:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61660:166;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46762:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61029:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61223:136;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22644:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62225:260;62352:4;62399:26;62384:41;;;:11;:41;;;;:88;;;;62436:36;62460:11;62436:23;:36::i;:::-;62384:88;62368:111;;62225:260;;;:::o;61067:105::-;21624:13;:11;:13::i;:::-;61153::::1;61138:12;;:28;;;;;;;;;;;;;;;;;;61067:105:::0;:::o;44781:100::-;44835:13;44868:5;44861:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44781:100;:::o;46293:171::-;46369:7;46389:23;46404:7;46389:14;:23::i;:::-;46432:15;:24;46448:7;46432:24;;;;;;;;;;;;;;;;;;;;;46425:31;;46293:171;;;:::o;45811:416::-;45892:13;45908:23;45923:7;45908:14;:23::i;:::-;45892:39;;45956:5;45950:11;;:2;:11;;;45942:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;46050:5;46034:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;46059:37;46076:5;46083:12;:10;:12::i;:::-;46059:16;:37::i;:::-;46034:62;46012:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;46198:21;46207:2;46211:7;46198:8;:21::i;:::-;45881:346;45811:416;;:::o;60903:96::-;60947:7;60970:23;:13;:21;:23::i;:::-;60963:30;;60903:96;:::o;46993:335::-;47188:41;47207:12;:10;:12::i;:::-;47221:7;47188:18;:41::i;:::-;47180:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;47292:28;47302:4;47308:2;47312:7;47292:9;:28::i;:::-;46993:335;;;:::o;62026:193::-;62112:16;62130:21;62179:4;62207:5;62199:4;62187:9;:16;;;;:::i;:::-;62186:26;;;;:::i;:::-;62163:50;;;;62026:193;;;;;:::o;60379:41::-;60416:4;60379:41;:::o;61852:145::-;3810:21;:19;:21::i;:::-;61899:15:::1;61917:21;61899:39;;61947:44;61973:7;:5;:7::i;:::-;61983;61947:17;:44::i;:::-;61892:105;3854:20:::0;:18;:20::i;:::-;61852:145::o;47399:185::-;47537:39;47554:4;47560:2;47564:7;47537:39;;;;;;;;;;;;:16;:39::i;:::-;47399:185;;;:::o;61428:112::-;21624:13;:11;:13::i;:::-;61520:14:::1;61504:13;:30;;;;;;:::i;:::-;;61428:112:::0;:::o;61178:38::-;;;;;;;;;;;;;:::o;44491:223::-;44563:7;44583:13;44599:17;44608:7;44599:8;:17::i;:::-;44583:33;;44652:1;44635:19;;:5;:19;;;44627:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;44701:5;44694:12;;;44491:223;;;:::o;44222:207::-;44294:7;44339:1;44322:19;;:5;:19;;;44314:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44405:9;:16;44415:5;44405:16;;;;;;;;;;;;;;;;44398:23;;44222:207;;;:::o;22386:103::-;21624:13;:11;:13::i;:::-;22451:30:::1;22478:1;22451:18;:30::i;:::-;22386:103::o:0;21738:87::-;21784:7;21811:6;;;;;;;;;;;21804:13;;21738:87;:::o;44950:104::-;45006:13;45039:7;45032:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44950:104;:::o;60520:377::-;3810:21;:19;:21::i;:::-;60584:12:::1;;;;;;;;;;;60576:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;60416:4;60657:1;60649:5;60633:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:25;;;;:::i;:::-;:38;60625:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;60467:1;60711:5;:22;;60703:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;60776:9;60771:121;60795:5;60791:1;:9;60771:121;;;60816:32;60822:10;60834:13;:11;:13::i;:::-;60816:5;:32::i;:::-;60859:25;:13;:23;:25::i;:::-;60802:3;;;;;:::i;:::-;;;;60771:121;;;;3854:20:::0;:18;:20::i;:::-;60520:377;:::o;46536:155::-;46631:52;46650:12;:10;:12::i;:::-;46664:8;46674;46631:18;:52::i;:::-;46536:155;;:::o;47655:322::-;47829:41;47848:12;:10;:12::i;:::-;47862:7;47829:18;:41::i;:::-;47821:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;47931:38;47945:4;47951:2;47955:7;47964:4;47931:13;:38::i;:::-;47655:322;;;;:::o;60427:41::-;60467:1;60427:41;:::o;61660:166::-;61730:13;61786:23;61801:7;61786:14;:23::i;:::-;61769:50;;;;;;;;:::i;:::-;;;;;;;;;;;;;61755:65;;61660:166;;;:::o;46762:164::-;46859:4;46883:18;:25;46902:5;46883:25;;;;;;;;;;;;;;;:35;46909:8;46883:35;;;;;;;;;;;;;;;;;;;;;;;;;46876:42;;46762:164;;;;:::o;61029:31::-;;;;;;;;;;;;;:::o;61223:136::-;21624:13;:11;:13::i;:::-;61333:20:::1;61311:19;;:42;;;;;;;;;;;;;;;;;;61223:136:::0;:::o;22644:201::-;21624:13;:11;:13::i;:::-;22753:1:::1;22733:22;;:8;:22;;::::0;22725:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;22809:28;22828:8;22809:18;:28::i;:::-;22644:201:::0;:::o;43853:305::-;43955:4;44007:25;43992:40;;;:11;:40;;;;:105;;;;44064:33;44049:48;;;:11;:48;;;;43992:105;:158;;;;44114:36;44138:11;44114:23;:36::i;:::-;43992:158;43972:178;;43853:305;;;:::o;21903:132::-;21978:12;:10;:12::i;:::-;21967:23;;:7;:5;:7::i;:::-;:23;;;21959:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21903:132::o;56112:135::-;56194:16;56202:7;56194;:16::i;:::-;56186:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;56112:135;:::o;20289:98::-;20342:7;20369:10;20362:17;;20289:98;:::o;55391:174::-;55493:2;55466:15;:24;55482:7;55466:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;55549:7;55545:2;55511:46;;55520:23;55535:7;55520:14;:23::i;:::-;55511:46;;;;;;;;;;;;55391:174;;:::o;872:114::-;937:7;964;:14;;;957:21;;872:114;;;:::o;50010:264::-;50103:4;50120:13;50136:23;50151:7;50136:14;:23::i;:::-;50120:39;;50189:5;50178:16;;:7;:16;;;:52;;;;50198:32;50215:5;50222:7;50198:16;:32::i;:::-;50178:52;:87;;;;50258:7;50234:31;;:20;50246:7;50234:11;:20::i;:::-;:31;;;50178:87;50170:96;;;50010:264;;;;:::o;54009:1263::-;54168:4;54141:31;;:23;54156:7;54141:14;:23::i;:::-;:31;;;54133:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;54247:1;54233:16;;:2;:16;;;54225:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;54303:42;54324:4;54330:2;54334:7;54343:1;54303:20;:42::i;:::-;54475:4;54448:31;;:23;54463:7;54448:14;:23::i;:::-;:31;;;54440:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;54593:15;:24;54609:7;54593:24;;;;;;;;;;;;54586:31;;;;;;;;;;;55088:1;55069:9;:15;55079:4;55069:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;55121:1;55104:9;:13;55114:2;55104:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;55163:2;55144:7;:16;55152:7;55144:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;55202:7;55198:2;55183:27;;55192:4;55183:27;;;;;;;;;;;;55223:41;55243:4;55249:2;55253:7;55262:1;55223:19;:41::i;:::-;54009:1263;;;:::o;3890:293::-;3292:1;4024:7;;:19;4016:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;3292:1;4157:7;:18;;;;3890:293::o;25697:317::-;25812:6;25787:21;:31;;25779:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25866:12;25884:9;:14;;25906:6;25884:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25865:52;;;25936:7;25928:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;25768:246;25697:317;;:::o;4191:213::-;3248:1;4374:7;:22;;;;4191:213::o;49285:117::-;49351:7;49378;:16;49386:7;49378:16;;;;;;;;;;;;;;;;;;;;;49371:23;;49285:117;;;:::o;23005:191::-;23079:16;23098:6;;;;;;;;;;;23079:25;;23124:8;23115:6;;:17;;;;;;;;;;;;;;;;;;23179:8;23148:40;;23169:8;23148:40;;;;;;;;;;;;23068:128;23005:191;:::o;51608:942::-;51702:1;51688:16;;:2;:16;;;51680:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;51761:16;51769:7;51761;:16::i;:::-;51760:17;51752:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51823:48;51852:1;51856:2;51860:7;51869:1;51823:20;:48::i;:::-;51970:16;51978:7;51970;:16::i;:::-;51969:17;51961:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;52385:1;52368:9;:13;52378:2;52368:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;52429:2;52410:7;:16;52418:7;52410:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;52474:7;52470:2;52449:33;;52466:1;52449:33;;;;;;;;;;;;52495:47;52523:1;52527:2;52531:7;52540:1;52495:19;:47::i;:::-;51608:942;;:::o;994:127::-;1101:1;1083:7;:14;;;:19;;;;;;;;;;;994:127;:::o;55708:315::-;55863:8;55854:17;;:5;:17;;;55846:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;55950:8;55912:18;:25;55931:5;55912:25;;;;;;;;;;;;;;;:35;55938:8;55912:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;55996:8;55974:41;;55989:5;55974:41;;;56006:8;55974:41;;;;;;:::i;:::-;;;;;;;;55708:315;;;:::o;48858:313::-;49014:28;49024:4;49030:2;49034:7;49014:9;:28::i;:::-;49061:47;49084:4;49090:2;49094:7;49103:4;49061:22;:47::i;:::-;49053:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;48858:313;;;;:::o;45125:281::-;45198:13;45224:23;45239:7;45224:14;:23::i;:::-;45260:21;45284:10;:8;:10::i;:::-;45260:34;;45336:1;45318:7;45312:21;:25;:86;;;;;;;;;;;;;;;;;45364:7;45373:18;:7;:16;:18::i;:::-;45347:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45312:86;45305:93;;;45125:281;;;:::o;36365:157::-;36450:4;36489:25;36474:40;;;:11;:40;;;;36467:47;;36365:157;;;:::o;49715:128::-;49780:4;49833:1;49804:31;;:17;49813:7;49804:8;:17::i;:::-;:31;;;;49797:38;;49715:128;;;:::o;58396:159::-;;;;;:::o;59277:158::-;;;;;:::o;56811:853::-;56965:4;56986:15;:2;:13;;;:15::i;:::-;56982:675;;;57038:2;57022:36;;;57059:12;:10;:12::i;:::-;57073:4;57079:7;57088:4;57022:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;57018:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57280:1;57263:6;:13;:18;57259:328;;57306:60;;;;;;;;;;:::i;:::-;;;;;;;;57259:328;57537:6;57531:13;57522:6;57518:2;57514:15;57507:38;57018:584;57154:41;;;57144:51;;;:6;:51;;;;57137:58;;;;;56982:675;57641:4;57634:11;;56811:853;;;;;;;:::o;61546:108::-;61606:13;61635;61628:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61546:108;:::o;17716:716::-;17772:13;17823:14;17860:1;17840:17;17851:5;17840:10;:17::i;:::-;:21;17823:38;;17876:20;17910:6;17899:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17876:41;;17932:11;18061:6;18057:2;18053:15;18045:6;18041:28;18034:35;;18098:288;18105:4;18098:288;;;18130:5;;;;;;;;18272:8;18267:2;18260:5;18256:14;18251:30;18246:3;18238:44;18328:2;18319:11;;;;;;:::i;:::-;;;;;18362:1;18353:5;:10;18098:288;18349:21;18098:288;18407:6;18400:13;;;;;17716:716;;;:::o;24436:326::-;24496:4;24753:1;24731:7;:19;;;:23;24724:30;;24436:326;;;:::o;14582:922::-;14635:7;14655:14;14672:1;14655:18;;14722:6;14713:5;:15;14709:102;;14758:6;14749:15;;;;;;:::i;:::-;;;;;14793:2;14783:12;;;;14709:102;14838:6;14829:5;:15;14825:102;;14874:6;14865:15;;;;;;:::i;:::-;;;;;14909:2;14899:12;;;;14825:102;14954:6;14945:5;:15;14941:102;;14990:6;14981:15;;;;;;:::i;:::-;;;;;15025:2;15015:12;;;;14941:102;15070:5;15061;:14;15057:99;;15105:5;15096:14;;;;;;:::i;:::-;;;;;15139:1;15129:11;;;;15057:99;15183:5;15174;:14;15170:99;;15218:5;15209:14;;;;;;:::i;:::-;;;;;15252:1;15242:11;;;;15170:99;15296:5;15287;:14;15283:99;;15331:5;15322:14;;;;;;:::i;:::-;;;;;15365:1;15355:11;;;;15283:99;15409:5;15400;:14;15396:66;;15445:1;15435:11;;;;15396:66;15490:6;15483:13;;;14582:922;;;:::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:116::-;1588:21;1603:5;1588:21;:::i;:::-;1581:5;1578:32;1568:60;;1624:1;1621;1614:12;1568:60;1518:116;:::o;1640:133::-;1683:5;1721:6;1708:20;1699:29;;1737:30;1761:5;1737:30;:::i;:::-;1640:133;;;;:::o;1779:323::-;1835:6;1884:2;1872:9;1863:7;1859:23;1855:32;1852:119;;;1890:79;;:::i;:::-;1852:119;2010:1;2035:50;2077:7;2068:6;2057:9;2053:22;2035:50;:::i;:::-;2025:60;;1981:114;1779:323;;;;:::o;2108:99::-;2160:6;2194:5;2188:12;2178:22;;2108:99;;;:::o;2213:169::-;2297:11;2331:6;2326:3;2319:19;2371:4;2366:3;2362:14;2347:29;;2213:169;;;;:::o;2388:246::-;2469:1;2479:113;2493:6;2490:1;2487:13;2479:113;;;2578:1;2573:3;2569:11;2563:18;2559:1;2554:3;2550:11;2543:39;2515:2;2512:1;2508:10;2503:15;;2479:113;;;2626:1;2617:6;2612:3;2608:16;2601:27;2450:184;2388:246;;;:::o;2640:102::-;2681:6;2732:2;2728:7;2723:2;2716:5;2712:14;2708:28;2698:38;;2640:102;;;:::o;2748:377::-;2836:3;2864:39;2897:5;2864:39;:::i;:::-;2919:71;2983:6;2978:3;2919:71;:::i;:::-;2912:78;;2999:65;3057:6;3052:3;3045:4;3038:5;3034:16;2999:65;:::i;:::-;3089:29;3111:6;3089:29;:::i;:::-;3084:3;3080:39;3073:46;;2840:285;2748:377;;;;:::o;3131:313::-;3244:4;3282:2;3271:9;3267:18;3259:26;;3331:9;3325:4;3321:20;3317:1;3306:9;3302:17;3295:47;3359:78;3432:4;3423:6;3359:78;:::i;:::-;3351:86;;3131:313;;;;:::o;3450:77::-;3487:7;3516:5;3505:16;;3450:77;;;:::o;3533:122::-;3606:24;3624:5;3606:24;:::i;:::-;3599:5;3596:35;3586:63;;3645:1;3642;3635:12;3586:63;3533:122;:::o;3661:139::-;3707:5;3745:6;3732:20;3723:29;;3761:33;3788:5;3761:33;:::i;:::-;3661:139;;;;:::o;3806:329::-;3865:6;3914:2;3902:9;3893:7;3889:23;3885:32;3882:119;;;3920:79;;:::i;:::-;3882:119;4040:1;4065:53;4110:7;4101:6;4090:9;4086:22;4065:53;:::i;:::-;4055:63;;4011:117;3806:329;;;;:::o;4141:126::-;4178:7;4218:42;4211:5;4207:54;4196:65;;4141:126;;;:::o;4273:96::-;4310:7;4339:24;4357:5;4339:24;:::i;:::-;4328:35;;4273:96;;;:::o;4375:118::-;4462:24;4480:5;4462:24;:::i;:::-;4457:3;4450:37;4375:118;;:::o;4499:222::-;4592:4;4630:2;4619:9;4615:18;4607:26;;4643:71;4711:1;4700:9;4696:17;4687:6;4643:71;:::i;:::-;4499:222;;;;:::o;4727:122::-;4800:24;4818:5;4800:24;:::i;:::-;4793:5;4790:35;4780:63;;4839:1;4836;4829:12;4780:63;4727:122;:::o;4855:139::-;4901:5;4939:6;4926:20;4917:29;;4955:33;4982:5;4955:33;:::i;:::-;4855:139;;;;:::o;5000:474::-;5068:6;5076;5125:2;5113:9;5104:7;5100:23;5096:32;5093:119;;;5131:79;;:::i;:::-;5093:119;5251:1;5276:53;5321:7;5312:6;5301:9;5297:22;5276:53;:::i;:::-;5266:63;;5222:117;5378:2;5404:53;5449:7;5440:6;5429:9;5425:22;5404:53;:::i;:::-;5394:63;;5349:118;5000:474;;;;;:::o;5480:118::-;5567:24;5585:5;5567:24;:::i;:::-;5562:3;5555:37;5480:118;;:::o;5604:222::-;5697:4;5735:2;5724:9;5720:18;5712:26;;5748:71;5816:1;5805:9;5801:17;5792:6;5748:71;:::i;:::-;5604:222;;;;:::o;5832:619::-;5909:6;5917;5925;5974:2;5962:9;5953:7;5949:23;5945:32;5942:119;;;5980:79;;:::i;:::-;5942:119;6100:1;6125:53;6170:7;6161:6;6150:9;6146:22;6125:53;:::i;:::-;6115:63;;6071:117;6227:2;6253:53;6298:7;6289:6;6278:9;6274:22;6253:53;:::i;:::-;6243:63;;6198:118;6355:2;6381:53;6426:7;6417:6;6406:9;6402:22;6381:53;:::i;:::-;6371:63;;6326:118;5832:619;;;;;:::o;6457:474::-;6525:6;6533;6582:2;6570:9;6561:7;6557:23;6553:32;6550:119;;;6588:79;;:::i;:::-;6550:119;6708:1;6733:53;6778:7;6769:6;6758:9;6754:22;6733:53;:::i;:::-;6723:63;;6679:117;6835:2;6861:53;6906:7;6897:6;6886:9;6882:22;6861:53;:::i;:::-;6851:63;;6806:118;6457:474;;;;;:::o;6937:332::-;7058:4;7096:2;7085:9;7081:18;7073:26;;7109:71;7177:1;7166:9;7162:17;7153:6;7109:71;:::i;:::-;7190:72;7258:2;7247:9;7243:18;7234:6;7190:72;:::i;:::-;6937:332;;;;;:::o;7275:117::-;7384:1;7381;7374:12;7398:117;7507:1;7504;7497:12;7521:180;7569:77;7566:1;7559:88;7666:4;7663:1;7656:15;7690:4;7687:1;7680:15;7707:281;7790:27;7812:4;7790:27;:::i;:::-;7782:6;7778:40;7920:6;7908:10;7905:22;7884:18;7872:10;7869:34;7866:62;7863:88;;;7931:18;;:::i;:::-;7863:88;7971:10;7967:2;7960:22;7750:238;7707:281;;:::o;7994:129::-;8028:6;8055:20;;:::i;:::-;8045:30;;8084:33;8112:4;8104:6;8084:33;:::i;:::-;7994:129;;;:::o;8129:308::-;8191:4;8281:18;8273:6;8270:30;8267:56;;;8303:18;;:::i;:::-;8267:56;8341:29;8363:6;8341:29;:::i;:::-;8333:37;;8425:4;8419;8415:15;8407:23;;8129:308;;;:::o;8443:146::-;8540:6;8535:3;8530;8517:30;8581:1;8572:6;8567:3;8563:16;8556:27;8443:146;;;:::o;8595:425::-;8673:5;8698:66;8714:49;8756:6;8714:49;:::i;:::-;8698:66;:::i;:::-;8689:75;;8787:6;8780:5;8773:21;8825:4;8818:5;8814:16;8863:3;8854:6;8849:3;8845:16;8842:25;8839:112;;;8870:79;;:::i;:::-;8839:112;8960:54;9007:6;9002:3;8997;8960:54;:::i;:::-;8679:341;8595:425;;;;;:::o;9040:340::-;9096:5;9145:3;9138:4;9130:6;9126:17;9122:27;9112:122;;9153:79;;:::i;:::-;9112:122;9270:6;9257:20;9295:79;9370:3;9362:6;9355:4;9347:6;9343:17;9295:79;:::i;:::-;9286:88;;9102:278;9040:340;;;;:::o;9386:509::-;9455:6;9504:2;9492:9;9483:7;9479:23;9475:32;9472:119;;;9510:79;;:::i;:::-;9472:119;9658:1;9647:9;9643:17;9630:31;9688:18;9680:6;9677:30;9674:117;;;9710:79;;:::i;:::-;9674:117;9815:63;9870:7;9861:6;9850:9;9846:22;9815:63;:::i;:::-;9805:73;;9601:287;9386:509;;;;:::o;9901:329::-;9960:6;10009:2;9997:9;9988:7;9984:23;9980:32;9977:119;;;10015:79;;:::i;:::-;9977:119;10135:1;10160:53;10205:7;10196:6;10185:9;10181:22;10160:53;:::i;:::-;10150:63;;10106:117;9901:329;;;;:::o;10236:468::-;10301:6;10309;10358:2;10346:9;10337:7;10333:23;10329:32;10326:119;;;10364:79;;:::i;:::-;10326:119;10484:1;10509:53;10554:7;10545:6;10534:9;10530:22;10509:53;:::i;:::-;10499:63;;10455:117;10611:2;10637:50;10679:7;10670:6;10659:9;10655:22;10637:50;:::i;:::-;10627:60;;10582:115;10236:468;;;;;:::o;10710:307::-;10771:4;10861:18;10853:6;10850:30;10847:56;;;10883:18;;:::i;:::-;10847:56;10921:29;10943:6;10921:29;:::i;:::-;10913:37;;11005:4;10999;10995:15;10987:23;;10710:307;;;:::o;11023:423::-;11100:5;11125:65;11141:48;11182:6;11141:48;:::i;:::-;11125:65;:::i;:::-;11116:74;;11213:6;11206:5;11199:21;11251:4;11244:5;11240:16;11289:3;11280:6;11275:3;11271:16;11268:25;11265:112;;;11296:79;;:::i;:::-;11265:112;11386:54;11433:6;11428:3;11423;11386:54;:::i;:::-;11106:340;11023:423;;;;;:::o;11465:338::-;11520:5;11569:3;11562:4;11554:6;11550:17;11546:27;11536:122;;11577:79;;:::i;:::-;11536:122;11694:6;11681:20;11719:78;11793:3;11785:6;11778:4;11770:6;11766:17;11719:78;:::i;:::-;11710:87;;11526:277;11465:338;;;;:::o;11809:943::-;11904:6;11912;11920;11928;11977:3;11965:9;11956:7;11952:23;11948:33;11945:120;;;11984:79;;:::i;:::-;11945:120;12104:1;12129:53;12174:7;12165:6;12154:9;12150:22;12129:53;:::i;:::-;12119:63;;12075:117;12231:2;12257:53;12302:7;12293:6;12282:9;12278:22;12257:53;:::i;:::-;12247:63;;12202:118;12359:2;12385:53;12430:7;12421:6;12410:9;12406:22;12385:53;:::i;:::-;12375:63;;12330:118;12515:2;12504:9;12500:18;12487:32;12546:18;12538:6;12535:30;12532:117;;;12568:79;;:::i;:::-;12532:117;12673:62;12727:7;12718:6;12707:9;12703:22;12673:62;:::i;:::-;12663:72;;12458:287;11809:943;;;;;;;:::o;12758:474::-;12826:6;12834;12883:2;12871:9;12862:7;12858:23;12854:32;12851:119;;;12889:79;;:::i;:::-;12851:119;13009:1;13034:53;13079:7;13070:6;13059:9;13055:22;13034:53;:::i;:::-;13024:63;;12980:117;13136:2;13162:53;13207:7;13198:6;13187:9;13183:22;13162:53;:::i;:::-;13152:63;;13107:118;12758:474;;;;;:::o;13238:180::-;13286:77;13283:1;13276:88;13383:4;13380:1;13373:15;13407:4;13404:1;13397:15;13424:320;13468:6;13505:1;13499:4;13495:12;13485:22;;13552:1;13546:4;13542:12;13573:18;13563:81;;13629:4;13621:6;13617:17;13607:27;;13563:81;13691:2;13683:6;13680:14;13660:18;13657:38;13654:84;;13710:18;;:::i;:::-;13654:84;13475:269;13424:320;;;:::o;13750:220::-;13890:34;13886:1;13878:6;13874:14;13867:58;13959:3;13954:2;13946:6;13942:15;13935:28;13750:220;:::o;13976:366::-;14118:3;14139:67;14203:2;14198:3;14139:67;:::i;:::-;14132:74;;14215:93;14304:3;14215:93;:::i;:::-;14333:2;14328:3;14324:12;14317:19;;13976:366;;;:::o;14348:419::-;14514:4;14552:2;14541:9;14537:18;14529:26;;14601:9;14595:4;14591:20;14587:1;14576:9;14572:17;14565:47;14629:131;14755:4;14629:131;:::i;:::-;14621:139;;14348:419;;;:::o;14773:248::-;14913:34;14909:1;14901:6;14897:14;14890:58;14982:31;14977:2;14969:6;14965:15;14958:56;14773:248;:::o;15027:366::-;15169:3;15190:67;15254:2;15249:3;15190:67;:::i;:::-;15183:74;;15266:93;15355:3;15266:93;:::i;:::-;15384:2;15379:3;15375:12;15368:19;;15027:366;;;:::o;15399:419::-;15565:4;15603:2;15592:9;15588:18;15580:26;;15652:9;15646:4;15642:20;15638:1;15627:9;15623:17;15616:47;15680:131;15806:4;15680:131;:::i;:::-;15672:139;;15399:419;;;:::o;15824:232::-;15964:34;15960:1;15952:6;15948:14;15941:58;16033:15;16028:2;16020:6;16016:15;16009:40;15824:232;:::o;16062:366::-;16204:3;16225:67;16289:2;16284:3;16225:67;:::i;:::-;16218:74;;16301:93;16390:3;16301:93;:::i;:::-;16419:2;16414:3;16410:12;16403:19;;16062:366;;;:::o;16434:419::-;16600:4;16638:2;16627:9;16623:18;16615:26;;16687:9;16681:4;16677:20;16673:1;16662:9;16658:17;16651:47;16715:131;16841:4;16715:131;:::i;:::-;16707:139;;16434:419;;;:::o;16859:180::-;16907:77;16904:1;16897:88;17004:4;17001:1;16994:15;17028:4;17025:1;17018:15;17045:410;17085:7;17108:20;17126:1;17108:20;:::i;:::-;17103:25;;17142:20;17160:1;17142:20;:::i;:::-;17137:25;;17197:1;17194;17190:9;17219:30;17237:11;17219:30;:::i;:::-;17208:41;;17398:1;17389:7;17385:15;17382:1;17379:22;17359:1;17352:9;17332:83;17309:139;;17428:18;;:::i;:::-;17309:139;17093:362;17045:410;;;;:::o;17461:180::-;17509:77;17506:1;17499:88;17606:4;17603:1;17596:15;17630:4;17627:1;17620:15;17647:185;17687:1;17704:20;17722:1;17704:20;:::i;:::-;17699:25;;17738:20;17756:1;17738:20;:::i;:::-;17733:25;;17777:1;17767:35;;17782:18;;:::i;:::-;17767:35;17824:1;17821;17817:9;17812:14;;17647:185;;;;:::o;17838:141::-;17887:4;17910:3;17902:11;;17933:3;17930:1;17923:14;17967:4;17964:1;17954:18;17946:26;;17838:141;;;:::o;17985:93::-;18022:6;18069:2;18064;18057:5;18053:14;18049:23;18039:33;;17985:93;;;:::o;18084:107::-;18128:8;18178:5;18172:4;18168:16;18147:37;;18084:107;;;;:::o;18197:393::-;18266:6;18316:1;18304:10;18300:18;18339:97;18369:66;18358:9;18339:97;:::i;:::-;18457:39;18487:8;18476:9;18457:39;:::i;:::-;18445:51;;18529:4;18525:9;18518:5;18514:21;18505:30;;18578:4;18568:8;18564:19;18557:5;18554:30;18544:40;;18273:317;;18197:393;;;;;:::o;18596:60::-;18624:3;18645:5;18638:12;;18596:60;;;:::o;18662:142::-;18712:9;18745:53;18763:34;18772:24;18790:5;18772:24;:::i;:::-;18763:34;:::i;:::-;18745:53;:::i;:::-;18732:66;;18662:142;;;:::o;18810:75::-;18853:3;18874:5;18867:12;;18810:75;;;:::o;18891:269::-;19001:39;19032:7;19001:39;:::i;:::-;19062:91;19111:41;19135:16;19111:41;:::i;:::-;19103:6;19096:4;19090:11;19062:91;:::i;:::-;19056:4;19049:105;18967:193;18891:269;;;:::o;19166:73::-;19211:3;19166:73;:::o;19245:189::-;19322:32;;:::i;:::-;19363:65;19421:6;19413;19407:4;19363:65;:::i;:::-;19298:136;19245:189;;:::o;19440:186::-;19500:120;19517:3;19510:5;19507:14;19500:120;;;19571:39;19608:1;19601:5;19571:39;:::i;:::-;19544:1;19537:5;19533:13;19524:22;;19500:120;;;19440:186;;:::o;19632:543::-;19733:2;19728:3;19725:11;19722:446;;;19767:38;19799:5;19767:38;:::i;:::-;19851:29;19869:10;19851:29;:::i;:::-;19841:8;19837:44;20034:2;20022:10;20019:18;20016:49;;;20055:8;20040:23;;20016:49;20078:80;20134:22;20152:3;20134:22;:::i;:::-;20124:8;20120:37;20107:11;20078:80;:::i;:::-;19737:431;;19722:446;19632:543;;;:::o;20181:117::-;20235:8;20285:5;20279:4;20275:16;20254:37;;20181:117;;;;:::o;20304:169::-;20348:6;20381:51;20429:1;20425:6;20417:5;20414:1;20410:13;20381:51;:::i;:::-;20377:56;20462:4;20456;20452:15;20442:25;;20355:118;20304:169;;;;:::o;20478:295::-;20554:4;20700:29;20725:3;20719:4;20700:29;:::i;:::-;20692:37;;20762:3;20759:1;20755:11;20749:4;20746:21;20738:29;;20478:295;;;;:::o;20778:1395::-;20895:37;20928:3;20895:37;:::i;:::-;20997:18;20989:6;20986:30;20983:56;;;21019:18;;:::i;:::-;20983:56;21063:38;21095:4;21089:11;21063:38;:::i;:::-;21148:67;21208:6;21200;21194:4;21148:67;:::i;:::-;21242:1;21266:4;21253:17;;21298:2;21290:6;21287:14;21315:1;21310:618;;;;21972:1;21989:6;21986:77;;;22038:9;22033:3;22029:19;22023:26;22014:35;;21986:77;22089:67;22149:6;22142:5;22089:67;:::i;:::-;22083:4;22076:81;21945:222;21280:887;;21310:618;21362:4;21358:9;21350:6;21346:22;21396:37;21428:4;21396:37;:::i;:::-;21455:1;21469:208;21483:7;21480:1;21477:14;21469:208;;;21562:9;21557:3;21553:19;21547:26;21539:6;21532:42;21613:1;21605:6;21601:14;21591:24;;21660:2;21649:9;21645:18;21632:31;;21506:4;21503:1;21499:12;21494:17;;21469:208;;;21705:6;21696:7;21693:19;21690:179;;;21763:9;21758:3;21754:19;21748:26;21806:48;21848:4;21840:6;21836:17;21825:9;21806:48;:::i;:::-;21798:6;21791:64;21713:156;21690:179;21915:1;21911;21903:6;21899:14;21895:22;21889:4;21882:36;21317:611;;;21280:887;;20870:1303;;;20778:1395;;:::o;22179:174::-;22319:26;22315:1;22307:6;22303:14;22296:50;22179:174;:::o;22359:366::-;22501:3;22522:67;22586:2;22581:3;22522:67;:::i;:::-;22515:74;;22598:93;22687:3;22598:93;:::i;:::-;22716:2;22711:3;22707:12;22700:19;;22359:366;;;:::o;22731:419::-;22897:4;22935:2;22924:9;22920:18;22912:26;;22984:9;22978:4;22974:20;22970:1;22959:9;22955:17;22948:47;23012:131;23138:4;23012:131;:::i;:::-;23004:139;;22731:419;;;:::o;23156:228::-;23296:34;23292:1;23284:6;23280:14;23273:58;23365:11;23360:2;23352:6;23348:15;23341:36;23156:228;:::o;23390:366::-;23532:3;23553:67;23617:2;23612:3;23553:67;:::i;:::-;23546:74;;23629:93;23718:3;23629:93;:::i;:::-;23747:2;23742:3;23738:12;23731:19;;23390:366;;;:::o;23762:419::-;23928:4;23966:2;23955:9;23951:18;23943:26;;24015:9;24009:4;24005:20;24001:1;23990:9;23986:17;23979:47;24043:131;24169:4;24043:131;:::i;:::-;24035:139;;23762:419;;;:::o;24187:165::-;24327:17;24323:1;24315:6;24311:14;24304:41;24187:165;:::o;24358:366::-;24500:3;24521:67;24585:2;24580:3;24521:67;:::i;:::-;24514:74;;24597:93;24686:3;24597:93;:::i;:::-;24715:2;24710:3;24706:12;24699:19;;24358:366;;;:::o;24730:419::-;24896:4;24934:2;24923:9;24919:18;24911:26;;24983:9;24977:4;24973:20;24969:1;24958:9;24954:17;24947:47;25011:131;25137:4;25011:131;:::i;:::-;25003:139;;24730:419;;;:::o;25155:191::-;25195:3;25214:20;25232:1;25214:20;:::i;:::-;25209:25;;25248:20;25266:1;25248:20;:::i;:::-;25243:25;;25291:1;25288;25284:9;25277:16;;25312:3;25309:1;25306:10;25303:36;;;25319:18;;:::i;:::-;25303:36;25155:191;;;;:::o;25352:194::-;25392:4;25412:20;25430:1;25412:20;:::i;:::-;25407:25;;25446:20;25464:1;25446:20;:::i;:::-;25441:25;;25490:1;25487;25483:9;25475:17;;25514:1;25508:4;25505:11;25502:37;;;25519:18;;:::i;:::-;25502:37;25352:194;;;;:::o;25552:168::-;25692:20;25688:1;25680:6;25676:14;25669:44;25552:168;:::o;25726:366::-;25868:3;25889:67;25953:2;25948:3;25889:67;:::i;:::-;25882:74;;25965:93;26054:3;25965:93;:::i;:::-;26083:2;26078:3;26074:12;26067:19;;25726:366;;;:::o;26098:419::-;26264:4;26302:2;26291:9;26287:18;26279:26;;26351:9;26345:4;26341:20;26337:1;26326:9;26322:17;26315:47;26379:131;26505:4;26379:131;:::i;:::-;26371:139;;26098:419;;;:::o;26523:174::-;26663:26;26659:1;26651:6;26647:14;26640:50;26523:174;:::o;26703:366::-;26845:3;26866:67;26930:2;26925:3;26866:67;:::i;:::-;26859:74;;26942:93;27031:3;26942:93;:::i;:::-;27060:2;27055:3;27051:12;27044:19;;26703:366;;;:::o;27075:419::-;27241:4;27279:2;27268:9;27264:18;27256:26;;27328:9;27322:4;27318:20;27314:1;27303:9;27299:17;27292:47;27356:131;27482:4;27356:131;:::i;:::-;27348:139;;27075:419;;;:::o;27500:233::-;27539:3;27562:24;27580:5;27562:24;:::i;:::-;27553:33;;27608:66;27601:5;27598:77;27595:103;;27678:18;;:::i;:::-;27595:103;27725:1;27718:5;27714:13;27707:20;;27500:233;;;:::o;27739:148::-;27841:11;27878:3;27863:18;;27739:148;;;;:::o;27893:390::-;27999:3;28027:39;28060:5;28027:39;:::i;:::-;28082:89;28164:6;28159:3;28082:89;:::i;:::-;28075:96;;28180:65;28238:6;28233:3;28226:4;28219:5;28215:16;28180:65;:::i;:::-;28270:6;28265:3;28261:16;28254:23;;28003:280;27893:390;;;;:::o;28289:155::-;28429:7;28425:1;28417:6;28413:14;28406:31;28289:155;:::o;28450:400::-;28610:3;28631:84;28713:1;28708:3;28631:84;:::i;:::-;28624:91;;28724:93;28813:3;28724:93;:::i;:::-;28842:1;28837:3;28833:11;28826:18;;28450:400;;;:::o;28856:541::-;29089:3;29111:95;29202:3;29193:6;29111:95;:::i;:::-;29104:102;;29223:148;29367:3;29223:148;:::i;:::-;29216:155;;29388:3;29381:10;;28856:541;;;;:::o;29403:225::-;29543:34;29539:1;29531:6;29527:14;29520:58;29612:8;29607:2;29599:6;29595:15;29588:33;29403:225;:::o;29634:366::-;29776:3;29797:67;29861:2;29856:3;29797:67;:::i;:::-;29790:74;;29873:93;29962:3;29873:93;:::i;:::-;29991:2;29986:3;29982:12;29975:19;;29634:366;;;:::o;30006:419::-;30172:4;30210:2;30199:9;30195:18;30187:26;;30259:9;30253:4;30249:20;30245:1;30234:9;30230:17;30223:47;30287:131;30413:4;30287:131;:::i;:::-;30279:139;;30006:419;;;:::o;30431:182::-;30571:34;30567:1;30559:6;30555:14;30548:58;30431:182;:::o;30619:366::-;30761:3;30782:67;30846:2;30841:3;30782:67;:::i;:::-;30775:74;;30858:93;30947:3;30858:93;:::i;:::-;30976:2;30971:3;30967:12;30960:19;;30619:366;;;:::o;30991:419::-;31157:4;31195:2;31184:9;31180:18;31172:26;;31244:9;31238:4;31234:20;31230:1;31219:9;31215:17;31208:47;31272:131;31398:4;31272:131;:::i;:::-;31264:139;;30991:419;;;:::o;31416:224::-;31556:34;31552:1;31544:6;31540:14;31533:58;31625:7;31620:2;31612:6;31608:15;31601:32;31416:224;:::o;31646:366::-;31788:3;31809:67;31873:2;31868:3;31809:67;:::i;:::-;31802:74;;31885:93;31974:3;31885:93;:::i;:::-;32003:2;31998:3;31994:12;31987:19;;31646:366;;;:::o;32018:419::-;32184:4;32222:2;32211:9;32207:18;32199:26;;32271:9;32265:4;32261:20;32257:1;32246:9;32242:17;32235:47;32299:131;32425:4;32299:131;:::i;:::-;32291:139;;32018:419;;;:::o;32443:223::-;32583:34;32579:1;32571:6;32567:14;32560:58;32652:6;32647:2;32639:6;32635:15;32628:31;32443:223;:::o;32672:366::-;32814:3;32835:67;32899:2;32894:3;32835:67;:::i;:::-;32828:74;;32911:93;33000:3;32911:93;:::i;:::-;33029:2;33024:3;33020:12;33013:19;;32672:366;;;:::o;33044:419::-;33210:4;33248:2;33237:9;33233:18;33225:26;;33297:9;33291:4;33287:20;33283:1;33272:9;33268:17;33261:47;33325:131;33451:4;33325:131;:::i;:::-;33317:139;;33044:419;;;:::o;33469:181::-;33609:33;33605:1;33597:6;33593:14;33586:57;33469:181;:::o;33656:366::-;33798:3;33819:67;33883:2;33878:3;33819:67;:::i;:::-;33812:74;;33895:93;33984:3;33895:93;:::i;:::-;34013:2;34008:3;34004:12;33997:19;;33656:366;;;:::o;34028:419::-;34194:4;34232:2;34221:9;34217:18;34209:26;;34281:9;34275:4;34271:20;34267:1;34256:9;34252:17;34245:47;34309:131;34435:4;34309:131;:::i;:::-;34301:139;;34028:419;;;:::o;34453:179::-;34593:31;34589:1;34581:6;34577:14;34570:55;34453:179;:::o;34638:366::-;34780:3;34801:67;34865:2;34860:3;34801:67;:::i;:::-;34794:74;;34877:93;34966:3;34877:93;:::i;:::-;34995:2;34990:3;34986:12;34979:19;;34638:366;;;:::o;35010:419::-;35176:4;35214:2;35203:9;35199:18;35191:26;;35263:9;35257:4;35253:20;35249:1;35238:9;35234:17;35227:47;35291:131;35417:4;35291:131;:::i;:::-;35283:139;;35010:419;;;:::o;35435:147::-;35536:11;35573:3;35558:18;;35435:147;;;;:::o;35588:114::-;;:::o;35708:398::-;35867:3;35888:83;35969:1;35964:3;35888:83;:::i;:::-;35881:90;;35980:93;36069:3;35980:93;:::i;:::-;36098:1;36093:3;36089:11;36082:18;;35708:398;;;:::o;36112:379::-;36296:3;36318:147;36461:3;36318:147;:::i;:::-;36311:154;;36482:3;36475:10;;36112:379;;;:::o;36497:245::-;36637:34;36633:1;36625:6;36621:14;36614:58;36706:28;36701:2;36693:6;36689:15;36682:53;36497:245;:::o;36748:366::-;36890:3;36911:67;36975:2;36970:3;36911:67;:::i;:::-;36904:74;;36987:93;37076:3;36987:93;:::i;:::-;37105:2;37100:3;37096:12;37089:19;;36748:366;;;:::o;37120:419::-;37286:4;37324:2;37313:9;37309:18;37301:26;;37373:9;37367:4;37363:20;37359:1;37348:9;37344:17;37337:47;37401:131;37527:4;37401:131;:::i;:::-;37393:139;;37120:419;;;:::o;37545:182::-;37685:34;37681:1;37673:6;37669:14;37662:58;37545:182;:::o;37733:366::-;37875:3;37896:67;37960:2;37955:3;37896:67;:::i;:::-;37889:74;;37972:93;38061:3;37972:93;:::i;:::-;38090:2;38085:3;38081:12;38074:19;;37733:366;;;:::o;38105:419::-;38271:4;38309:2;38298:9;38294:18;38286:26;;38358:9;38352:4;38348:20;38344:1;38333:9;38329:17;38322:47;38386:131;38512:4;38386:131;:::i;:::-;38378:139;;38105:419;;;:::o;38530:178::-;38670:30;38666:1;38658:6;38654:14;38647:54;38530:178;:::o;38714:366::-;38856:3;38877:67;38941:2;38936:3;38877:67;:::i;:::-;38870:74;;38953:93;39042:3;38953:93;:::i;:::-;39071:2;39066:3;39062:12;39055:19;;38714:366;;;:::o;39086:419::-;39252:4;39290:2;39279:9;39275:18;39267:26;;39339:9;39333:4;39329:20;39325:1;39314:9;39310:17;39303:47;39367:131;39493:4;39367:131;:::i;:::-;39359:139;;39086:419;;;:::o;39511:175::-;39651:27;39647:1;39639:6;39635:14;39628:51;39511:175;:::o;39692:366::-;39834:3;39855:67;39919:2;39914:3;39855:67;:::i;:::-;39848:74;;39931:93;40020:3;39931:93;:::i;:::-;40049:2;40044:3;40040:12;40033:19;;39692:366;;;:::o;40064:419::-;40230:4;40268:2;40257:9;40253:18;40245:26;;40317:9;40311:4;40307:20;40303:1;40292:9;40288:17;40281:47;40345:131;40471:4;40345:131;:::i;:::-;40337:139;;40064:419;;;:::o;40489:237::-;40629:34;40625:1;40617:6;40613:14;40606:58;40698:20;40693:2;40685:6;40681:15;40674:45;40489:237;:::o;40732:366::-;40874:3;40895:67;40959:2;40954:3;40895:67;:::i;:::-;40888:74;;40971:93;41060:3;40971:93;:::i;:::-;41089:2;41084:3;41080:12;41073:19;;40732:366;;;:::o;41104:419::-;41270:4;41308:2;41297:9;41293:18;41285:26;;41357:9;41351:4;41347:20;41343:1;41332:9;41328:17;41321:47;41385:131;41511:4;41385:131;:::i;:::-;41377:139;;41104:419;;;:::o;41529:435::-;41709:3;41731:95;41822:3;41813:6;41731:95;:::i;:::-;41724:102;;41843:95;41934:3;41925:6;41843:95;:::i;:::-;41836:102;;41955:3;41948:10;;41529:435;;;;;:::o;41970:98::-;42021:6;42055:5;42049:12;42039:22;;41970:98;;;:::o;42074:168::-;42157:11;42191:6;42186:3;42179:19;42231:4;42226:3;42222:14;42207:29;;42074:168;;;;:::o;42248:373::-;42334:3;42362:38;42394:5;42362:38;:::i;:::-;42416:70;42479:6;42474:3;42416:70;:::i;:::-;42409:77;;42495:65;42553:6;42548:3;42541:4;42534:5;42530:16;42495:65;:::i;:::-;42585:29;42607:6;42585:29;:::i;:::-;42580:3;42576:39;42569:46;;42338:283;42248:373;;;;:::o;42627:640::-;42822:4;42860:3;42849:9;42845:19;42837:27;;42874:71;42942:1;42931:9;42927:17;42918:6;42874:71;:::i;:::-;42955:72;43023:2;43012:9;43008:18;42999:6;42955:72;:::i;:::-;43037;43105:2;43094:9;43090:18;43081:6;43037:72;:::i;:::-;43156:9;43150:4;43146:20;43141:2;43130:9;43126:18;43119:48;43184:76;43255:4;43246:6;43184:76;:::i;:::-;43176:84;;42627:640;;;;;;;:::o;43273:141::-;43329:5;43360:6;43354:13;43345:22;;43376:32;43402:5;43376:32;:::i;:::-;43273:141;;;;:::o;43420:349::-;43489:6;43538:2;43526:9;43517:7;43513:23;43509:32;43506:119;;;43544:79;;:::i;:::-;43506:119;43664:1;43689:63;43744:7;43735:6;43724:9;43720:22;43689:63;:::i;:::-;43679:73;;43635:127;43420:349;;;;:::o

Swarm Source

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