ETH Price: $2,459.69 (-1.66%)

Token

QuirkiesComicsVol1 (QRKC)
 

Overview

Max Total Supply

2,154 QRKC

Holders

836

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 QRKC
0x23916b9b41e3ba99f0b85d604cd4f5b20779f323
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Quirkies Comic Tokens will be a key in the ever expanding Quirksville universe.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
QuirkiesComicsVol1

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-18
*/

// File @openzeppelin/contracts/security/[email protected]

// SPDX-License-Identifier: MIT
// 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/[email protected]


// 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/utils/math/[email protected]


// 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/[email protected]


// 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 operator-filter-registry/src/[email protected]


pragma solidity ^0.8.13;

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


// File operator-filter-registry/src/[email protected]


pragma solidity ^0.8.13;

abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

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

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(operatorFilterRegistry).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (
                !(
                    operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)
                        && operatorFilterRegistry.isOperatorAllowed(address(this), from)
                )
            ) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }
}


// File operator-filter-registry/src/[email protected]


pragma solidity ^0.8.13;

abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


// 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/[email protected]


// 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/[email protected]


// 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/introspection/[email protected]


// 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/token/ERC721/[email protected]


// 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/[email protected]


// 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/utils/introspection/[email protected]


// 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/[email protected]


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

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

        _owners[tokenId] = to;

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

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

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

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

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

        // Clear approvals
        delete _tokenApprovals[tokenId];

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId, 1);

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

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

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

        emit Transfer(from, to, tokenId);

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

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

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

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

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

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

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


// File contracts/QuirkiesComicsVol1.sol














pragma solidity ^0.8.0;

contract QuirkiesComicsVol1 is DefaultOperatorFilterer, Ownable, ERC721, ReentrancyGuard {
    uint256 public nftPrice = 0 ether;
    uint256 public totalSupply = 0;

    uint256 public constant nftLimit = 5000;
    uint256 public constant claimLimit = 5000;

    bool public saleClaim = false;

    address public claimAddressOG;
    address public claimAddressLING;
    uint256 public mintCount = 0;

    string public baseURI = "";
    mapping(uint256 => uint256) public claimedTokens;

    constructor(
        string memory _initURI,
        address _claimAddressOG,
        address _claimAddressLING
    ) ERC721("QuirkiesComicsVol1", "QRKC") {
        baseURI = _initURI;
        claimAddressOG = _claimAddressOG;
        claimAddressLING = _claimAddressLING;
    }

    function mintClaim(uint256[] memory _tokenIds) public nonReentrant {
        require(saleClaim == true, "QuirkComic: Not Started");
        for (uint256 i = 0; i < _tokenIds.length; i++) {
            uint256 _tokenId = _tokenIds[i];
            require(
                IERC721(claimAddressOG).ownerOf(_tokenId) == _msgSender(),
                "QuirkComic: Not Quirkies Token Owner"
            );
            require(
                IERC721(claimAddressLING).ownerOf(_tokenId) == _msgSender(),
                "QuirkComic: Not QuirkLings Token Owner"
            );
            require(
                claimedTokens[_tokenId] == 0,
                "QuirkComic: Token Already Claimed"
            );
            claimedTokens[_tokenId] = 1;
            _safeMint(_msgSender(), _tokenId);
        }
        totalSupply += _tokenIds.length;
    }

    function tokensOfOwnerByIndex(address _owner, uint256 _index)
        public
        view
        returns (uint256)
    {
        return tokensOfOwner(_owner)[_index];
    }

    function tokensOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 _tokenCount = balanceOf(_owner);
        uint256[] memory _tokenIds = new uint256[](_tokenCount);
        uint256 _tokenIndex = 0;
        for (uint256 i = 0; i < nftLimit; i++) {
            if (_exists(i) && ownerOf(i) == _owner) {
                _tokenIds[_tokenIndex] = i;
                _tokenIndex++;
            }
        }
        return _tokenIds;
    }

    function tokenClaimStatus(uint256[] calldata _tokenIds)
        public
        view
        returns (uint256[] memory)
    {
        uint256[] memory claimed = new uint256[](_tokenIds.length);
        for (uint256 i = 0; i < _tokenIds.length; i++) {
            claimed[i] = claimedTokens[_tokenIds[i]];
        }
        return claimed;
    }

    function withdraw() public payable onlyOwner {
        uint256 _balance = address(this).balance;
        address TEAM3 = 0xd56f05CaB51a36e5b17a8e06f4bB286a8104aE98;
        address TEAM2 = 0x1c46a964f9404193AFf03769559cAe1cbDE9e82d;
        address TEAM1 = 0xa176cBefedb9dbF436BfEFC102e4120aa2e9FC9b;

        (bool team3tx, ) = payable(TEAM3).call{value: (_balance * 15) / 100}(
            ""
        );
        require(team3tx, "QuirkiesComicsVol1: Transfer 3 Failed");

        (bool team2tx, ) = payable(TEAM2).call{value: (_balance * 45) / 100}(
            ""
        );
        require(team2tx, "QuirkiesComicsVol1: Transfer 2 Failed");

        (bool team1tx, ) = payable(TEAM1).call{value: address(this).balance}(
            ""
        );
        require(team1tx, "QuirkiesComicsVol1: Transfer 1 Failed");
    }

    function toggleSaleClaim() public onlyOwner {
        saleClaim = !saleClaim;
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

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

    function contractURI() public view returns (string memory) {
        return string(abi.encodePacked(baseURI, "contract"));
    }

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

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

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

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initURI","type":"string"},{"internalType":"address","name":"_claimAddressOG","type":"address"},{"internalType":"address","name":"_claimAddressLING","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimAddressLING","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimAddressOG","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"_tokenIds","type":"uint256[]"}],"name":"mintClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"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":"saleClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","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":[],"name":"toggleSaleClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"tokenClaimStatus","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokensOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"payable","type":"function"}]

6080604052600060085560006009556000600a60006101000a81548160ff0219169083151502179055506000600c5560405180602001604052806000815250600d908051906020019062000055929190620004cf565b503480156200006357600080fd5b506040516200530138038062005301833981810160405281019062000089919062000781565b6040518060400160405280601281526020017f517569726b696573436f6d696373566f6c3100000000000000000000000000008152506040518060400160405280600481526020017f51524b4300000000000000000000000000000000000000000000000000000000815250733cc6cdda760b79bafa08df41ecfa224f810dceb6600160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111562000301578015620001c7576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200018d9291906200080d565b600060405180830381600087803b158015620001a857600080fd5b505af1158015620001bd573d6000803e3d6000fd5b5050505062000300565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000281576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002479291906200080d565b600060405180830381600087803b1580156200026257600080fd5b505af115801562000277573d6000803e3d6000fd5b50505050620002ff565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620002ca91906200083a565b600060405180830381600087803b158015620002e557600080fd5b505af1158015620002fa573d6000803e3d6000fd5b505050505b5b5b505062000323620003176200040360201b60201c565b6200040b60201b60201c565b81600190805190602001906200033b929190620004cf565b50806002908051906020019062000354929190620004cf565b505050600160078190555082600d908051906020019062000377929190620004cf565b5081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050620008bb565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620004dd9062000886565b90600052602060002090601f0160209004810192826200050157600085556200054d565b82601f106200051c57805160ff19168380011785556200054d565b828001600101855582156200054d579182015b828111156200054c5782518255916020019190600101906200052f565b5b5090506200055c919062000560565b5090565b5b808211156200057b57600081600090555060010162000561565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620005e8826200059d565b810181811067ffffffffffffffff821117156200060a5762000609620005ae565b5b80604052505050565b60006200061f6200057f565b90506200062d8282620005dd565b919050565b600067ffffffffffffffff82111562000650576200064f620005ae565b5b6200065b826200059d565b9050602081019050919050565b60005b83811015620006885780820151818401526020810190506200066b565b8381111562000698576000848401525b50505050565b6000620006b5620006af8462000632565b62000613565b905082815260208101848484011115620006d457620006d362000598565b5b620006e184828562000668565b509392505050565b600082601f83011262000701576200070062000593565b5b8151620007138482602086016200069e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000749826200071c565b9050919050565b6200075b816200073c565b81146200076757600080fd5b50565b6000815190506200077b8162000750565b92915050565b6000806000606084860312156200079d576200079c62000589565b5b600084015167ffffffffffffffff811115620007be57620007bd6200058e565b5b620007cc86828701620006e9565b9350506020620007df868287016200076a565b9250506040620007f2868287016200076a565b9150509250925092565b62000807816200073c565b82525050565b6000604082019050620008246000830185620007fc565b620008336020830184620007fc565b9392505050565b6000602082019050620008516000830184620007fc565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200089f57607f821691505b602082108103620008b557620008b462000857565b5b50919050565b614a3680620008cb6000396000f3fe6080604052600436106101f95760003560e01c8063715018a61161010d578063be610676116100a0578063e985e9c51161006f578063e985e9c51461073e578063ea55569d1461077b578063f2fde38b146107a4578063f7aa2ffc146107cd578063feccbf24146107f8576101f9565b8063be6106761461066e578063c87b56dd14610699578063e5a342a3146106d6578063e8a3d48514610713576101f9565b806395d89b41116100dc57806395d89b41146105c65780639659867e146105f1578063a22cb4651461061c578063b88d4fde14610645576101f9565b8063715018a61461050a5780637d28a191146105215780638462151c1461055e5780638da5cb5b1461059b576101f9565b80632be96ba9116101905780634707f44f1161015f5780634707f44f146103ff57806355f804b31461043c5780636352211e146104655780636c0360eb146104a257806370a08231146104cd576101f9565b80632be96ba9146103765780633ccfd60b146103a157806342842e0e146103ab5780634534346b146103d4576101f9565b80630d39fc81116101cc5780630d39fc81146102cc57806318160ddd146102f757806323b872dd146103225780632a7065ea1461034b576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b50610225600480360381019061022091906130b4565b61080f565b60405161023291906130fc565b60405180910390f35b34801561024757600080fd5b506102506108f1565b60405161025d91906131b0565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190613208565b610983565b60405161029a9190613276565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c591906132bd565b6109c9565b005b3480156102d857600080fd5b506102e1610ae0565b6040516102ee919061330c565b60405180910390f35b34801561030357600080fd5b5061030c610ae6565b604051610319919061330c565b60405180910390f35b34801561032e57600080fd5b5061034960048036038101906103449190613327565b610aec565b005b34801561035757600080fd5b50610360610cce565b60405161036d919061330c565b60405180910390f35b34801561038257600080fd5b5061038b610cd4565b6040516103989190613276565b60405180910390f35b6103a9610cfa565b005b3480156103b757600080fd5b506103d260048036038101906103cd9190613327565b610f8f565b005b3480156103e057600080fd5b506103e9611171565b6040516103f69190613276565b60405180910390f35b34801561040b57600080fd5b50610426600480360381019061042191906132bd565b611197565b604051610433919061330c565b60405180910390f35b34801561044857600080fd5b50610463600480360381019061045e91906134af565b6111c4565b005b34801561047157600080fd5b5061048c60048036038101906104879190613208565b6111e6565b6040516104999190613276565b60405180910390f35b3480156104ae57600080fd5b506104b761126c565b6040516104c491906131b0565b60405180910390f35b3480156104d957600080fd5b506104f460048036038101906104ef91906134f8565b6112fa565b604051610501919061330c565b60405180910390f35b34801561051657600080fd5b5061051f6113b1565b005b34801561052d57600080fd5b5061054860048036038101906105439190613585565b6113c5565b6040516105559190613690565b60405180910390f35b34801561056a57600080fd5b50610585600480360381019061058091906134f8565b61148f565b6040516105929190613690565b60405180910390f35b3480156105a757600080fd5b506105b0611594565b6040516105bd9190613276565b60405180910390f35b3480156105d257600080fd5b506105db6115bd565b6040516105e891906131b0565b60405180910390f35b3480156105fd57600080fd5b5061060661164f565b604051610613919061330c565b60405180910390f35b34801561062857600080fd5b50610643600480360381019061063e91906136de565b611655565b005b34801561065157600080fd5b5061066c600480360381019061066791906137bf565b61166b565b005b34801561067a57600080fd5b50610683611850565b604051610690919061330c565b60405180910390f35b3480156106a557600080fd5b506106c060048036038101906106bb9190613208565b611856565b6040516106cd91906131b0565b60405180910390f35b3480156106e257600080fd5b506106fd60048036038101906106f89190613208565b6118be565b60405161070a919061330c565b60405180910390f35b34801561071f57600080fd5b506107286118d6565b60405161073591906131b0565b60405180910390f35b34801561074a57600080fd5b5061076560048036038101906107609190613842565b6118fe565b60405161077291906130fc565b60405180910390f35b34801561078757600080fd5b506107a2600480360381019061079d9190613945565b611992565b005b3480156107b057600080fd5b506107cb60048036038101906107c691906134f8565b611cf5565b005b3480156107d957600080fd5b506107e2611d78565b6040516107ef91906130fc565b60405180910390f35b34801561080457600080fd5b5061080d611d8b565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108da57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108ea57506108e982611dbf565b5b9050919050565b606060018054610900906139bd565b80601f016020809104026020016040519081016040528092919081815260200182805461092c906139bd565b80156109795780601f1061094e57610100808354040283529160200191610979565b820191906000526020600020905b81548152906001019060200180831161095c57829003601f168201915b5050505050905090565b600061098e82611e29565b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109d4826111e6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3b90613a60565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a63611e74565b73ffffffffffffffffffffffffffffffffffffffff161480610a925750610a9181610a8c611e74565b6118fe565b5b610ad1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac890613af2565b60405180910390fd5b610adb8383611e7c565b505050565b60085481565b60095481565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610cbc573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b5e57610b59848484611f35565b610cc8565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610ba7929190613b12565b602060405180830381865afa158015610bc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be89190613b50565b8015610c7a57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610c38929190613b12565b602060405180830381865afa158015610c55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c799190613b50565b5b610cbb57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610cb29190613276565b60405180910390fd5b5b610cc7848484611f35565b5b50505050565b61138881565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610d02611f95565b6000479050600073d56f05cab51a36e5b17a8e06f4bb286a8104ae9890506000731c46a964f9404193aff03769559cae1cbde9e82d9050600073a176cbefedb9dbf436bfefc102e4120aa2e9fc9b905060008373ffffffffffffffffffffffffffffffffffffffff166064600f87610d7a9190613bac565b610d849190613c35565b604051610d9090613c97565b60006040518083038185875af1925050503d8060008114610dcd576040519150601f19603f3d011682016040523d82523d6000602084013e610dd2565b606091505b5050905080610e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0d90613d1e565b60405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff166064602d88610e3e9190613bac565b610e489190613c35565b604051610e5490613c97565b60006040518083038185875af1925050503d8060008114610e91576040519150601f19603f3d011682016040523d82523d6000602084013e610e96565b606091505b5050905080610eda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed190613db0565b60405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff1647604051610f0090613c97565b60006040518083038185875af1925050503d8060008114610f3d576040519150601f19603f3d011682016040523d82523d6000602084013e610f42565b606091505b5050905080610f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7d90613e42565b60405180910390fd5b50505050505050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561115f573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361100157610ffc848484612013565b61116b565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161104a929190613b12565b602060405180830381865afa158015611067573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108b9190613b50565b801561111d57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016110db929190613b12565b602060405180830381865afa1580156110f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111c9190613b50565b5b61115e57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016111559190613276565b60405180910390fd5b5b61116a848484612013565b5b50505050565b600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006111a28361148f565b82815181106111b4576111b3613e62565b5b6020026020010151905092915050565b6111cc611f95565b80600d90805190602001906111e2929190612fa5565b5050565b6000806111f283612033565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125a90613edd565b60405180910390fd5b80915050919050565b600d8054611279906139bd565b80601f01602080910402602001604051908101604052809291908181526020018280546112a5906139bd565b80156112f25780601f106112c7576101008083540402835291602001916112f2565b820191906000526020600020905b8154815290600101906020018083116112d557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361136a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136190613f6f565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113b9611f95565b6113c36000612070565b565b606060008383905067ffffffffffffffff8111156113e6576113e5613384565b5b6040519080825280602002602001820160405280156114145781602001602082028036833780820191505090505b50905060005b8484905081101561148457600e600086868481811061143c5761143b613e62565b5b9050602002013581526020019081526020016000205482828151811061146557611464613e62565b5b602002602001018181525050808061147c90613f8f565b91505061141a565b508091505092915050565b6060600061149c836112fa565b905060008167ffffffffffffffff8111156114ba576114b9613384565b5b6040519080825280602002602001820160405280156114e85781602001602082028036833780820191505090505b5090506000805b6113888110156115885761150281612134565b801561154157508573ffffffffffffffffffffffffffffffffffffffff16611529826111e6565b73ffffffffffffffffffffffffffffffffffffffff16145b15611575578083838151811061155a57611559613e62565b5b602002602001018181525050818061157190613f8f565b9250505b808061158090613f8f565b9150506114ef565b50819350505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546115cc906139bd565b80601f01602080910402602001604051908101604052809291908181526020018280546115f8906139bd565b80156116455780601f1061161a57610100808354040283529160200191611645565b820191906000526020600020905b81548152906001019060200180831161162857829003601f168201915b5050505050905090565b600c5481565b611667611660611e74565b8383612175565b5050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561183c573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036116de576116d9858585856122e1565b611849565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611727929190613b12565b602060405180830381865afa158015611744573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117689190613b50565b80156117fa57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016117b8929190613b12565b602060405180830381865afa1580156117d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f99190613b50565b5b61183b57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016118329190613276565b60405180910390fd5b5b611848858585856122e1565b5b5050505050565b61138881565b606061186182611e29565b600061186b612343565b9050600081511161188b57604051806020016040528060008152506118b6565b80611895846123d5565b6040516020016118a6929190614013565b6040516020818303038152906040525b915050919050565b600e6020528060005260406000206000915090505481565b6060600d6040516020016118ea9190614117565b604051602081830303815290604052905090565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61199a6124a3565b60011515600a60009054906101000a900460ff161515146119f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e790614185565b60405180910390fd5b60005b8151811015611ccf576000828281518110611a1157611a10613e62565b5b60200260200101519050611a23611e74565b73ffffffffffffffffffffffffffffffffffffffff16600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401611a94919061330c565b602060405180830381865afa158015611ab1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad591906141ba565b73ffffffffffffffffffffffffffffffffffffffff1614611b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2290614259565b60405180910390fd5b611b33611e74565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401611ba4919061330c565b602060405180830381865afa158015611bc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be591906141ba565b73ffffffffffffffffffffffffffffffffffffffff1614611c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c32906142eb565b60405180910390fd5b6000600e60008381526020019081526020016000205414611c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c889061437d565b60405180910390fd5b6001600e600083815260200190815260200160002081905550611cbb611cb5611e74565b826124f2565b508080611cc790613f8f565b9150506119f3565b50805160096000828254611ce3919061439d565b92505081905550611cf2612510565b50565b611cfd611f95565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6390614465565b60405180910390fd5b611d7581612070565b50565b600a60009054906101000a900460ff1681565b611d93611f95565b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611e3281612134565b611e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6890613edd565b60405180910390fd5b50565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611eef836111e6565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611f46611f40611e74565b8261251a565b611f85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7c906144f7565b60405180910390fd5b611f908383836125af565b505050565b611f9d611e74565b73ffffffffffffffffffffffffffffffffffffffff16611fbb611594565b73ffffffffffffffffffffffffffffffffffffffff1614612011576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200890614563565b60405180910390fd5b565b61202e8383836040518060200160405280600081525061166b565b505050565b60006003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008073ffffffffffffffffffffffffffffffffffffffff1661215683612033565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121da906145cf565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122d491906130fc565b60405180910390a3505050565b6122f26122ec611e74565b8361251a565b612331576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612328906144f7565b60405180910390fd5b61233d848484846128a8565b50505050565b6060600d8054612352906139bd565b80601f016020809104026020016040519081016040528092919081815260200182805461237e906139bd565b80156123cb5780601f106123a0576101008083540402835291602001916123cb565b820191906000526020600020905b8154815290600101906020018083116123ae57829003601f168201915b5050505050905090565b6060600060016123e484612904565b01905060008167ffffffffffffffff81111561240357612402613384565b5b6040519080825280601f01601f1916602001820160405280156124355781602001600182028036833780820191505090505b509050600082602001820190505b600115612498578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161248c5761248b613c06565b5b04945060008503612443575b819350505050919050565b6002600754036124e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124df9061463b565b60405180910390fd5b6002600781905550565b61250c828260405180602001604052806000815250612a57565b5050565b6001600781905550565b600080612526836111e6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612568575061256781856118fe565b5b806125a657508373ffffffffffffffffffffffffffffffffffffffff1661258e84610983565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166125cf826111e6565b73ffffffffffffffffffffffffffffffffffffffff1614612625576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261c906146cd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268b9061475f565b60405180910390fd5b6126a18383836001612ab2565b8273ffffffffffffffffffffffffffffffffffffffff166126c1826111e6565b73ffffffffffffffffffffffffffffffffffffffff1614612717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270e906146cd565b60405180910390fd5b6005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128a38383836001612bd8565b505050565b6128b38484846125af565b6128bf84848484612bde565b6128fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f5906147f1565b60405180910390fd5b50505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612962577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161295857612957613c06565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061299f576d04ee2d6d415b85acef8100000000838161299557612994613c06565b5b0492506020810190505b662386f26fc1000083106129ce57662386f26fc1000083816129c4576129c3613c06565b5b0492506010810190505b6305f5e10083106129f7576305f5e10083816129ed576129ec613c06565b5b0492506008810190505b6127108310612a1c576127108381612a1257612a11613c06565b5b0492506004810190505b60648310612a3f5760648381612a3557612a34613c06565b5b0492506002810190505b600a8310612a4e576001810190505b80915050919050565b612a618383612d65565b612a6e6000848484612bde565b612aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa4906147f1565b60405180910390fd5b505050565b6001811115612bd257600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612b465780600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b3e9190614811565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612bd15780600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bc9919061439d565b925050819055505b5b50505050565b50505050565b6000612bff8473ffffffffffffffffffffffffffffffffffffffff16612f82565b15612d58578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c28611e74565b8786866040518563ffffffff1660e01b8152600401612c4a949392919061489a565b6020604051808303816000875af1925050508015612c8657506040513d601f19601f82011682018060405250810190612c8391906148fb565b60015b612d08573d8060008114612cb6576040519150601f19603f3d011682016040523d82523d6000602084013e612cbb565b606091505b506000815103612d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf7906147f1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d5d565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dcb90614974565b60405180910390fd5b612ddd81612134565b15612e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e14906149e0565b60405180910390fd5b612e2b600083836001612ab2565b612e3481612134565b15612e74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6b906149e0565b60405180910390fd5b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f7e600083836001612bd8565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612fb1906139bd565b90600052602060002090601f016020900481019282612fd3576000855561301a565b82601f10612fec57805160ff191683800117855561301a565b8280016001018555821561301a579182015b82811115613019578251825591602001919060010190612ffe565b5b509050613027919061302b565b5090565b5b8082111561304457600081600090555060010161302c565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6130918161305c565b811461309c57600080fd5b50565b6000813590506130ae81613088565b92915050565b6000602082840312156130ca576130c9613052565b5b60006130d88482850161309f565b91505092915050565b60008115159050919050565b6130f6816130e1565b82525050565b600060208201905061311160008301846130ed565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613151578082015181840152602081019050613136565b83811115613160576000848401525b50505050565b6000601f19601f8301169050919050565b600061318282613117565b61318c8185613122565b935061319c818560208601613133565b6131a581613166565b840191505092915050565b600060208201905081810360008301526131ca8184613177565b905092915050565b6000819050919050565b6131e5816131d2565b81146131f057600080fd5b50565b600081359050613202816131dc565b92915050565b60006020828403121561321e5761321d613052565b5b600061322c848285016131f3565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061326082613235565b9050919050565b61327081613255565b82525050565b600060208201905061328b6000830184613267565b92915050565b61329a81613255565b81146132a557600080fd5b50565b6000813590506132b781613291565b92915050565b600080604083850312156132d4576132d3613052565b5b60006132e2858286016132a8565b92505060206132f3858286016131f3565b9150509250929050565b613306816131d2565b82525050565b600060208201905061332160008301846132fd565b92915050565b6000806000606084860312156133405761333f613052565b5b600061334e868287016132a8565b935050602061335f868287016132a8565b9250506040613370868287016131f3565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6133bc82613166565b810181811067ffffffffffffffff821117156133db576133da613384565b5b80604052505050565b60006133ee613048565b90506133fa82826133b3565b919050565b600067ffffffffffffffff82111561341a57613419613384565b5b61342382613166565b9050602081019050919050565b82818337600083830152505050565b600061345261344d846133ff565b6133e4565b90508281526020810184848401111561346e5761346d61337f565b5b613479848285613430565b509392505050565b600082601f8301126134965761349561337a565b5b81356134a684826020860161343f565b91505092915050565b6000602082840312156134c5576134c4613052565b5b600082013567ffffffffffffffff8111156134e3576134e2613057565b5b6134ef84828501613481565b91505092915050565b60006020828403121561350e5761350d613052565b5b600061351c848285016132a8565b91505092915050565b600080fd5b600080fd5b60008083601f8401126135455761354461337a565b5b8235905067ffffffffffffffff81111561356257613561613525565b5b60208301915083602082028301111561357e5761357d61352a565b5b9250929050565b6000806020838503121561359c5761359b613052565b5b600083013567ffffffffffffffff8111156135ba576135b9613057565b5b6135c68582860161352f565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613607816131d2565b82525050565b600061361983836135fe565b60208301905092915050565b6000602082019050919050565b600061363d826135d2565b61364781856135dd565b9350613652836135ee565b8060005b8381101561368357815161366a888261360d565b975061367583613625565b925050600181019050613656565b5085935050505092915050565b600060208201905081810360008301526136aa8184613632565b905092915050565b6136bb816130e1565b81146136c657600080fd5b50565b6000813590506136d8816136b2565b92915050565b600080604083850312156136f5576136f4613052565b5b6000613703858286016132a8565b9250506020613714858286016136c9565b9150509250929050565b600067ffffffffffffffff82111561373957613738613384565b5b61374282613166565b9050602081019050919050565b600061376261375d8461371e565b6133e4565b90508281526020810184848401111561377e5761377d61337f565b5b613789848285613430565b509392505050565b600082601f8301126137a6576137a561337a565b5b81356137b684826020860161374f565b91505092915050565b600080600080608085870312156137d9576137d8613052565b5b60006137e7878288016132a8565b94505060206137f8878288016132a8565b9350506040613809878288016131f3565b925050606085013567ffffffffffffffff81111561382a57613829613057565b5b61383687828801613791565b91505092959194509250565b6000806040838503121561385957613858613052565b5b6000613867858286016132a8565b9250506020613878858286016132a8565b9150509250929050565b600067ffffffffffffffff82111561389d5761389c613384565b5b602082029050602081019050919050565b60006138c16138bc84613882565b6133e4565b905080838252602082019050602084028301858111156138e4576138e361352a565b5b835b8181101561390d57806138f988826131f3565b8452602084019350506020810190506138e6565b5050509392505050565b600082601f83011261392c5761392b61337a565b5b813561393c8482602086016138ae565b91505092915050565b60006020828403121561395b5761395a613052565b5b600082013567ffffffffffffffff81111561397957613978613057565b5b61398584828501613917565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806139d557607f821691505b6020821081036139e8576139e761398e565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a4a602183613122565b9150613a55826139ee565b604082019050919050565b60006020820190508181036000830152613a7981613a3d565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613adc603d83613122565b9150613ae782613a80565b604082019050919050565b60006020820190508181036000830152613b0b81613acf565b9050919050565b6000604082019050613b276000830185613267565b613b346020830184613267565b9392505050565b600081519050613b4a816136b2565b92915050565b600060208284031215613b6657613b65613052565b5b6000613b7484828501613b3b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613bb7826131d2565b9150613bc2836131d2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bfb57613bfa613b7d565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613c40826131d2565b9150613c4b836131d2565b925082613c5b57613c5a613c06565b5b828204905092915050565b600081905092915050565b50565b6000613c81600083613c66565b9150613c8c82613c71565b600082019050919050565b6000613ca282613c74565b9150819050919050565b7f517569726b696573436f6d696373566f6c313a205472616e736665722033204660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b6000613d08602583613122565b9150613d1382613cac565b604082019050919050565b60006020820190508181036000830152613d3781613cfb565b9050919050565b7f517569726b696573436f6d696373566f6c313a205472616e736665722032204660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b6000613d9a602583613122565b9150613da582613d3e565b604082019050919050565b60006020820190508181036000830152613dc981613d8d565b9050919050565b7f517569726b696573436f6d696373566f6c313a205472616e736665722031204660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b6000613e2c602583613122565b9150613e3782613dd0565b604082019050919050565b60006020820190508181036000830152613e5b81613e1f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613ec7601883613122565b9150613ed282613e91565b602082019050919050565b60006020820190508181036000830152613ef681613eba565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613f59602983613122565b9150613f6482613efd565b604082019050919050565b60006020820190508181036000830152613f8881613f4c565b9050919050565b6000613f9a826131d2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613fcc57613fcb613b7d565b5b600182019050919050565b600081905092915050565b6000613fed82613117565b613ff78185613fd7565b9350614007818560208601613133565b80840191505092915050565b600061401f8285613fe2565b915061402b8284613fe2565b91508190509392505050565b60008190508160005260206000209050919050565b60008154614059816139bd565b6140638186613fd7565b9450600182166000811461407e576001811461408f576140c2565b60ff198316865281860193506140c2565b61409885614037565b60005b838110156140ba5781548189015260018201915060208101905061409b565b838801955050505b50505092915050565b7f636f6e7472616374000000000000000000000000000000000000000000000000600082015250565b6000614101600883613fd7565b915061410c826140cb565b600882019050919050565b6000614123828461404c565b915061412e826140f4565b915081905092915050565b7f517569726b436f6d69633a204e6f742053746172746564000000000000000000600082015250565b600061416f601783613122565b915061417a82614139565b602082019050919050565b6000602082019050818103600083015261419e81614162565b9050919050565b6000815190506141b481613291565b92915050565b6000602082840312156141d0576141cf613052565b5b60006141de848285016141a5565b91505092915050565b7f517569726b436f6d69633a204e6f7420517569726b69657320546f6b656e204f60008201527f776e657200000000000000000000000000000000000000000000000000000000602082015250565b6000614243602483613122565b915061424e826141e7565b604082019050919050565b6000602082019050818103600083015261427281614236565b9050919050565b7f517569726b436f6d69633a204e6f7420517569726b4c696e677320546f6b656e60008201527f204f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006142d5602683613122565b91506142e082614279565b604082019050919050565b60006020820190508181036000830152614304816142c8565b9050919050565b7f517569726b436f6d69633a20546f6b656e20416c726561647920436c61696d6560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000614367602183613122565b91506143728261430b565b604082019050919050565b600060208201905081810360008301526143968161435a565b9050919050565b60006143a8826131d2565b91506143b3836131d2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143e8576143e7613b7d565b5b828201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061444f602683613122565b915061445a826143f3565b604082019050919050565b6000602082019050818103600083015261447e81614442565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006144e1602d83613122565b91506144ec82614485565b604082019050919050565b60006020820190508181036000830152614510816144d4565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061454d602083613122565b915061455882614517565b602082019050919050565b6000602082019050818103600083015261457c81614540565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006145b9601983613122565b91506145c482614583565b602082019050919050565b600060208201905081810360008301526145e8816145ac565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614625601f83613122565b9150614630826145ef565b602082019050919050565b6000602082019050818103600083015261465481614618565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006146b7602583613122565b91506146c28261465b565b604082019050919050565b600060208201905081810360008301526146e6816146aa565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614749602483613122565b9150614754826146ed565b604082019050919050565b600060208201905081810360008301526147788161473c565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006147db603283613122565b91506147e68261477f565b604082019050919050565b6000602082019050818103600083015261480a816147ce565b9050919050565b600061481c826131d2565b9150614827836131d2565b92508282101561483a57614839613b7d565b5b828203905092915050565b600081519050919050565b600082825260208201905092915050565b600061486c82614845565b6148768185614850565b9350614886818560208601613133565b61488f81613166565b840191505092915050565b60006080820190506148af6000830187613267565b6148bc6020830186613267565b6148c960408301856132fd565b81810360608301526148db8184614861565b905095945050505050565b6000815190506148f581613088565b92915050565b60006020828403121561491157614910613052565b5b600061491f848285016148e6565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061495e602083613122565b915061496982614928565b602082019050919050565b6000602082019050818103600083015261498d81614951565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006149ca601c83613122565b91506149d582614994565b602082019050919050565b600060208201905081810360008301526149f9816149bd565b905091905056fea2646970667358221220f938645b07c75c2050e747a55c0b7472635a105f087b7aaf324cffe8f93d31d764736f6c634300080d003300000000000000000000000000000000000000000000000000000000000000600000000000000000000000003903d4ffaaa700b62578a66e7a67ba4cb67787f9000000000000000000000000da60730e1feaa7d8321f62ffb069edd869e57d020000000000000000000000000000000000000000000000000000000000000043697066733a2f2f626166796265696871797133706d6f6c7169737a737734336e357775666d73746577357a76727233366333367665347669377077737066673371752f0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101f95760003560e01c8063715018a61161010d578063be610676116100a0578063e985e9c51161006f578063e985e9c51461073e578063ea55569d1461077b578063f2fde38b146107a4578063f7aa2ffc146107cd578063feccbf24146107f8576101f9565b8063be6106761461066e578063c87b56dd14610699578063e5a342a3146106d6578063e8a3d48514610713576101f9565b806395d89b41116100dc57806395d89b41146105c65780639659867e146105f1578063a22cb4651461061c578063b88d4fde14610645576101f9565b8063715018a61461050a5780637d28a191146105215780638462151c1461055e5780638da5cb5b1461059b576101f9565b80632be96ba9116101905780634707f44f1161015f5780634707f44f146103ff57806355f804b31461043c5780636352211e146104655780636c0360eb146104a257806370a08231146104cd576101f9565b80632be96ba9146103765780633ccfd60b146103a157806342842e0e146103ab5780634534346b146103d4576101f9565b80630d39fc81116101cc5780630d39fc81146102cc57806318160ddd146102f757806323b872dd146103225780632a7065ea1461034b576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b50610225600480360381019061022091906130b4565b61080f565b60405161023291906130fc565b60405180910390f35b34801561024757600080fd5b506102506108f1565b60405161025d91906131b0565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190613208565b610983565b60405161029a9190613276565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c591906132bd565b6109c9565b005b3480156102d857600080fd5b506102e1610ae0565b6040516102ee919061330c565b60405180910390f35b34801561030357600080fd5b5061030c610ae6565b604051610319919061330c565b60405180910390f35b34801561032e57600080fd5b5061034960048036038101906103449190613327565b610aec565b005b34801561035757600080fd5b50610360610cce565b60405161036d919061330c565b60405180910390f35b34801561038257600080fd5b5061038b610cd4565b6040516103989190613276565b60405180910390f35b6103a9610cfa565b005b3480156103b757600080fd5b506103d260048036038101906103cd9190613327565b610f8f565b005b3480156103e057600080fd5b506103e9611171565b6040516103f69190613276565b60405180910390f35b34801561040b57600080fd5b50610426600480360381019061042191906132bd565b611197565b604051610433919061330c565b60405180910390f35b34801561044857600080fd5b50610463600480360381019061045e91906134af565b6111c4565b005b34801561047157600080fd5b5061048c60048036038101906104879190613208565b6111e6565b6040516104999190613276565b60405180910390f35b3480156104ae57600080fd5b506104b761126c565b6040516104c491906131b0565b60405180910390f35b3480156104d957600080fd5b506104f460048036038101906104ef91906134f8565b6112fa565b604051610501919061330c565b60405180910390f35b34801561051657600080fd5b5061051f6113b1565b005b34801561052d57600080fd5b5061054860048036038101906105439190613585565b6113c5565b6040516105559190613690565b60405180910390f35b34801561056a57600080fd5b50610585600480360381019061058091906134f8565b61148f565b6040516105929190613690565b60405180910390f35b3480156105a757600080fd5b506105b0611594565b6040516105bd9190613276565b60405180910390f35b3480156105d257600080fd5b506105db6115bd565b6040516105e891906131b0565b60405180910390f35b3480156105fd57600080fd5b5061060661164f565b604051610613919061330c565b60405180910390f35b34801561062857600080fd5b50610643600480360381019061063e91906136de565b611655565b005b34801561065157600080fd5b5061066c600480360381019061066791906137bf565b61166b565b005b34801561067a57600080fd5b50610683611850565b604051610690919061330c565b60405180910390f35b3480156106a557600080fd5b506106c060048036038101906106bb9190613208565b611856565b6040516106cd91906131b0565b60405180910390f35b3480156106e257600080fd5b506106fd60048036038101906106f89190613208565b6118be565b60405161070a919061330c565b60405180910390f35b34801561071f57600080fd5b506107286118d6565b60405161073591906131b0565b60405180910390f35b34801561074a57600080fd5b5061076560048036038101906107609190613842565b6118fe565b60405161077291906130fc565b60405180910390f35b34801561078757600080fd5b506107a2600480360381019061079d9190613945565b611992565b005b3480156107b057600080fd5b506107cb60048036038101906107c691906134f8565b611cf5565b005b3480156107d957600080fd5b506107e2611d78565b6040516107ef91906130fc565b60405180910390f35b34801561080457600080fd5b5061080d611d8b565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108da57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108ea57506108e982611dbf565b5b9050919050565b606060018054610900906139bd565b80601f016020809104026020016040519081016040528092919081815260200182805461092c906139bd565b80156109795780601f1061094e57610100808354040283529160200191610979565b820191906000526020600020905b81548152906001019060200180831161095c57829003601f168201915b5050505050905090565b600061098e82611e29565b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109d4826111e6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3b90613a60565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a63611e74565b73ffffffffffffffffffffffffffffffffffffffff161480610a925750610a9181610a8c611e74565b6118fe565b5b610ad1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac890613af2565b60405180910390fd5b610adb8383611e7c565b505050565b60085481565b60095481565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610cbc573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b5e57610b59848484611f35565b610cc8565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610ba7929190613b12565b602060405180830381865afa158015610bc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be89190613b50565b8015610c7a57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610c38929190613b12565b602060405180830381865afa158015610c55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c799190613b50565b5b610cbb57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610cb29190613276565b60405180910390fd5b5b610cc7848484611f35565b5b50505050565b61138881565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610d02611f95565b6000479050600073d56f05cab51a36e5b17a8e06f4bb286a8104ae9890506000731c46a964f9404193aff03769559cae1cbde9e82d9050600073a176cbefedb9dbf436bfefc102e4120aa2e9fc9b905060008373ffffffffffffffffffffffffffffffffffffffff166064600f87610d7a9190613bac565b610d849190613c35565b604051610d9090613c97565b60006040518083038185875af1925050503d8060008114610dcd576040519150601f19603f3d011682016040523d82523d6000602084013e610dd2565b606091505b5050905080610e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0d90613d1e565b60405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff166064602d88610e3e9190613bac565b610e489190613c35565b604051610e5490613c97565b60006040518083038185875af1925050503d8060008114610e91576040519150601f19603f3d011682016040523d82523d6000602084013e610e96565b606091505b5050905080610eda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed190613db0565b60405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff1647604051610f0090613c97565b60006040518083038185875af1925050503d8060008114610f3d576040519150601f19603f3d011682016040523d82523d6000602084013e610f42565b606091505b5050905080610f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7d90613e42565b60405180910390fd5b50505050505050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561115f573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361100157610ffc848484612013565b61116b565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161104a929190613b12565b602060405180830381865afa158015611067573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108b9190613b50565b801561111d57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016110db929190613b12565b602060405180830381865afa1580156110f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111c9190613b50565b5b61115e57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016111559190613276565b60405180910390fd5b5b61116a848484612013565b5b50505050565b600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006111a28361148f565b82815181106111b4576111b3613e62565b5b6020026020010151905092915050565b6111cc611f95565b80600d90805190602001906111e2929190612fa5565b5050565b6000806111f283612033565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125a90613edd565b60405180910390fd5b80915050919050565b600d8054611279906139bd565b80601f01602080910402602001604051908101604052809291908181526020018280546112a5906139bd565b80156112f25780601f106112c7576101008083540402835291602001916112f2565b820191906000526020600020905b8154815290600101906020018083116112d557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361136a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136190613f6f565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113b9611f95565b6113c36000612070565b565b606060008383905067ffffffffffffffff8111156113e6576113e5613384565b5b6040519080825280602002602001820160405280156114145781602001602082028036833780820191505090505b50905060005b8484905081101561148457600e600086868481811061143c5761143b613e62565b5b9050602002013581526020019081526020016000205482828151811061146557611464613e62565b5b602002602001018181525050808061147c90613f8f565b91505061141a565b508091505092915050565b6060600061149c836112fa565b905060008167ffffffffffffffff8111156114ba576114b9613384565b5b6040519080825280602002602001820160405280156114e85781602001602082028036833780820191505090505b5090506000805b6113888110156115885761150281612134565b801561154157508573ffffffffffffffffffffffffffffffffffffffff16611529826111e6565b73ffffffffffffffffffffffffffffffffffffffff16145b15611575578083838151811061155a57611559613e62565b5b602002602001018181525050818061157190613f8f565b9250505b808061158090613f8f565b9150506114ef565b50819350505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546115cc906139bd565b80601f01602080910402602001604051908101604052809291908181526020018280546115f8906139bd565b80156116455780601f1061161a57610100808354040283529160200191611645565b820191906000526020600020905b81548152906001019060200180831161162857829003601f168201915b5050505050905090565b600c5481565b611667611660611e74565b8383612175565b5050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561183c573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036116de576116d9858585856122e1565b611849565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611727929190613b12565b602060405180830381865afa158015611744573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117689190613b50565b80156117fa57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016117b8929190613b12565b602060405180830381865afa1580156117d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f99190613b50565b5b61183b57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016118329190613276565b60405180910390fd5b5b611848858585856122e1565b5b5050505050565b61138881565b606061186182611e29565b600061186b612343565b9050600081511161188b57604051806020016040528060008152506118b6565b80611895846123d5565b6040516020016118a6929190614013565b6040516020818303038152906040525b915050919050565b600e6020528060005260406000206000915090505481565b6060600d6040516020016118ea9190614117565b604051602081830303815290604052905090565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61199a6124a3565b60011515600a60009054906101000a900460ff161515146119f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e790614185565b60405180910390fd5b60005b8151811015611ccf576000828281518110611a1157611a10613e62565b5b60200260200101519050611a23611e74565b73ffffffffffffffffffffffffffffffffffffffff16600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401611a94919061330c565b602060405180830381865afa158015611ab1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad591906141ba565b73ffffffffffffffffffffffffffffffffffffffff1614611b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2290614259565b60405180910390fd5b611b33611e74565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401611ba4919061330c565b602060405180830381865afa158015611bc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be591906141ba565b73ffffffffffffffffffffffffffffffffffffffff1614611c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c32906142eb565b60405180910390fd5b6000600e60008381526020019081526020016000205414611c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c889061437d565b60405180910390fd5b6001600e600083815260200190815260200160002081905550611cbb611cb5611e74565b826124f2565b508080611cc790613f8f565b9150506119f3565b50805160096000828254611ce3919061439d565b92505081905550611cf2612510565b50565b611cfd611f95565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6390614465565b60405180910390fd5b611d7581612070565b50565b600a60009054906101000a900460ff1681565b611d93611f95565b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611e3281612134565b611e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6890613edd565b60405180910390fd5b50565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611eef836111e6565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611f46611f40611e74565b8261251a565b611f85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7c906144f7565b60405180910390fd5b611f908383836125af565b505050565b611f9d611e74565b73ffffffffffffffffffffffffffffffffffffffff16611fbb611594565b73ffffffffffffffffffffffffffffffffffffffff1614612011576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200890614563565b60405180910390fd5b565b61202e8383836040518060200160405280600081525061166b565b505050565b60006003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008073ffffffffffffffffffffffffffffffffffffffff1661215683612033565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121da906145cf565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122d491906130fc565b60405180910390a3505050565b6122f26122ec611e74565b8361251a565b612331576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612328906144f7565b60405180910390fd5b61233d848484846128a8565b50505050565b6060600d8054612352906139bd565b80601f016020809104026020016040519081016040528092919081815260200182805461237e906139bd565b80156123cb5780601f106123a0576101008083540402835291602001916123cb565b820191906000526020600020905b8154815290600101906020018083116123ae57829003601f168201915b5050505050905090565b6060600060016123e484612904565b01905060008167ffffffffffffffff81111561240357612402613384565b5b6040519080825280601f01601f1916602001820160405280156124355781602001600182028036833780820191505090505b509050600082602001820190505b600115612498578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161248c5761248b613c06565b5b04945060008503612443575b819350505050919050565b6002600754036124e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124df9061463b565b60405180910390fd5b6002600781905550565b61250c828260405180602001604052806000815250612a57565b5050565b6001600781905550565b600080612526836111e6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612568575061256781856118fe565b5b806125a657508373ffffffffffffffffffffffffffffffffffffffff1661258e84610983565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166125cf826111e6565b73ffffffffffffffffffffffffffffffffffffffff1614612625576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261c906146cd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268b9061475f565b60405180910390fd5b6126a18383836001612ab2565b8273ffffffffffffffffffffffffffffffffffffffff166126c1826111e6565b73ffffffffffffffffffffffffffffffffffffffff1614612717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270e906146cd565b60405180910390fd5b6005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128a38383836001612bd8565b505050565b6128b38484846125af565b6128bf84848484612bde565b6128fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f5906147f1565b60405180910390fd5b50505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612962577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161295857612957613c06565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061299f576d04ee2d6d415b85acef8100000000838161299557612994613c06565b5b0492506020810190505b662386f26fc1000083106129ce57662386f26fc1000083816129c4576129c3613c06565b5b0492506010810190505b6305f5e10083106129f7576305f5e10083816129ed576129ec613c06565b5b0492506008810190505b6127108310612a1c576127108381612a1257612a11613c06565b5b0492506004810190505b60648310612a3f5760648381612a3557612a34613c06565b5b0492506002810190505b600a8310612a4e576001810190505b80915050919050565b612a618383612d65565b612a6e6000848484612bde565b612aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa4906147f1565b60405180910390fd5b505050565b6001811115612bd257600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612b465780600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b3e9190614811565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612bd15780600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bc9919061439d565b925050819055505b5b50505050565b50505050565b6000612bff8473ffffffffffffffffffffffffffffffffffffffff16612f82565b15612d58578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c28611e74565b8786866040518563ffffffff1660e01b8152600401612c4a949392919061489a565b6020604051808303816000875af1925050508015612c8657506040513d601f19601f82011682018060405250810190612c8391906148fb565b60015b612d08573d8060008114612cb6576040519150601f19603f3d011682016040523d82523d6000602084013e612cbb565b606091505b506000815103612d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf7906147f1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d5d565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dcb90614974565b60405180910390fd5b612ddd81612134565b15612e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e14906149e0565b60405180910390fd5b612e2b600083836001612ab2565b612e3481612134565b15612e74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6b906149e0565b60405180910390fd5b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f7e600083836001612bd8565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612fb1906139bd565b90600052602060002090601f016020900481019282612fd3576000855561301a565b82601f10612fec57805160ff191683800117855561301a565b8280016001018555821561301a579182015b82811115613019578251825591602001919060010190612ffe565b5b509050613027919061302b565b5090565b5b8082111561304457600081600090555060010161302c565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6130918161305c565b811461309c57600080fd5b50565b6000813590506130ae81613088565b92915050565b6000602082840312156130ca576130c9613052565b5b60006130d88482850161309f565b91505092915050565b60008115159050919050565b6130f6816130e1565b82525050565b600060208201905061311160008301846130ed565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613151578082015181840152602081019050613136565b83811115613160576000848401525b50505050565b6000601f19601f8301169050919050565b600061318282613117565b61318c8185613122565b935061319c818560208601613133565b6131a581613166565b840191505092915050565b600060208201905081810360008301526131ca8184613177565b905092915050565b6000819050919050565b6131e5816131d2565b81146131f057600080fd5b50565b600081359050613202816131dc565b92915050565b60006020828403121561321e5761321d613052565b5b600061322c848285016131f3565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061326082613235565b9050919050565b61327081613255565b82525050565b600060208201905061328b6000830184613267565b92915050565b61329a81613255565b81146132a557600080fd5b50565b6000813590506132b781613291565b92915050565b600080604083850312156132d4576132d3613052565b5b60006132e2858286016132a8565b92505060206132f3858286016131f3565b9150509250929050565b613306816131d2565b82525050565b600060208201905061332160008301846132fd565b92915050565b6000806000606084860312156133405761333f613052565b5b600061334e868287016132a8565b935050602061335f868287016132a8565b9250506040613370868287016131f3565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6133bc82613166565b810181811067ffffffffffffffff821117156133db576133da613384565b5b80604052505050565b60006133ee613048565b90506133fa82826133b3565b919050565b600067ffffffffffffffff82111561341a57613419613384565b5b61342382613166565b9050602081019050919050565b82818337600083830152505050565b600061345261344d846133ff565b6133e4565b90508281526020810184848401111561346e5761346d61337f565b5b613479848285613430565b509392505050565b600082601f8301126134965761349561337a565b5b81356134a684826020860161343f565b91505092915050565b6000602082840312156134c5576134c4613052565b5b600082013567ffffffffffffffff8111156134e3576134e2613057565b5b6134ef84828501613481565b91505092915050565b60006020828403121561350e5761350d613052565b5b600061351c848285016132a8565b91505092915050565b600080fd5b600080fd5b60008083601f8401126135455761354461337a565b5b8235905067ffffffffffffffff81111561356257613561613525565b5b60208301915083602082028301111561357e5761357d61352a565b5b9250929050565b6000806020838503121561359c5761359b613052565b5b600083013567ffffffffffffffff8111156135ba576135b9613057565b5b6135c68582860161352f565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613607816131d2565b82525050565b600061361983836135fe565b60208301905092915050565b6000602082019050919050565b600061363d826135d2565b61364781856135dd565b9350613652836135ee565b8060005b8381101561368357815161366a888261360d565b975061367583613625565b925050600181019050613656565b5085935050505092915050565b600060208201905081810360008301526136aa8184613632565b905092915050565b6136bb816130e1565b81146136c657600080fd5b50565b6000813590506136d8816136b2565b92915050565b600080604083850312156136f5576136f4613052565b5b6000613703858286016132a8565b9250506020613714858286016136c9565b9150509250929050565b600067ffffffffffffffff82111561373957613738613384565b5b61374282613166565b9050602081019050919050565b600061376261375d8461371e565b6133e4565b90508281526020810184848401111561377e5761377d61337f565b5b613789848285613430565b509392505050565b600082601f8301126137a6576137a561337a565b5b81356137b684826020860161374f565b91505092915050565b600080600080608085870312156137d9576137d8613052565b5b60006137e7878288016132a8565b94505060206137f8878288016132a8565b9350506040613809878288016131f3565b925050606085013567ffffffffffffffff81111561382a57613829613057565b5b61383687828801613791565b91505092959194509250565b6000806040838503121561385957613858613052565b5b6000613867858286016132a8565b9250506020613878858286016132a8565b9150509250929050565b600067ffffffffffffffff82111561389d5761389c613384565b5b602082029050602081019050919050565b60006138c16138bc84613882565b6133e4565b905080838252602082019050602084028301858111156138e4576138e361352a565b5b835b8181101561390d57806138f988826131f3565b8452602084019350506020810190506138e6565b5050509392505050565b600082601f83011261392c5761392b61337a565b5b813561393c8482602086016138ae565b91505092915050565b60006020828403121561395b5761395a613052565b5b600082013567ffffffffffffffff81111561397957613978613057565b5b61398584828501613917565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806139d557607f821691505b6020821081036139e8576139e761398e565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a4a602183613122565b9150613a55826139ee565b604082019050919050565b60006020820190508181036000830152613a7981613a3d565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613adc603d83613122565b9150613ae782613a80565b604082019050919050565b60006020820190508181036000830152613b0b81613acf565b9050919050565b6000604082019050613b276000830185613267565b613b346020830184613267565b9392505050565b600081519050613b4a816136b2565b92915050565b600060208284031215613b6657613b65613052565b5b6000613b7484828501613b3b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613bb7826131d2565b9150613bc2836131d2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bfb57613bfa613b7d565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613c40826131d2565b9150613c4b836131d2565b925082613c5b57613c5a613c06565b5b828204905092915050565b600081905092915050565b50565b6000613c81600083613c66565b9150613c8c82613c71565b600082019050919050565b6000613ca282613c74565b9150819050919050565b7f517569726b696573436f6d696373566f6c313a205472616e736665722033204660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b6000613d08602583613122565b9150613d1382613cac565b604082019050919050565b60006020820190508181036000830152613d3781613cfb565b9050919050565b7f517569726b696573436f6d696373566f6c313a205472616e736665722032204660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b6000613d9a602583613122565b9150613da582613d3e565b604082019050919050565b60006020820190508181036000830152613dc981613d8d565b9050919050565b7f517569726b696573436f6d696373566f6c313a205472616e736665722031204660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b6000613e2c602583613122565b9150613e3782613dd0565b604082019050919050565b60006020820190508181036000830152613e5b81613e1f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613ec7601883613122565b9150613ed282613e91565b602082019050919050565b60006020820190508181036000830152613ef681613eba565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613f59602983613122565b9150613f6482613efd565b604082019050919050565b60006020820190508181036000830152613f8881613f4c565b9050919050565b6000613f9a826131d2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613fcc57613fcb613b7d565b5b600182019050919050565b600081905092915050565b6000613fed82613117565b613ff78185613fd7565b9350614007818560208601613133565b80840191505092915050565b600061401f8285613fe2565b915061402b8284613fe2565b91508190509392505050565b60008190508160005260206000209050919050565b60008154614059816139bd565b6140638186613fd7565b9450600182166000811461407e576001811461408f576140c2565b60ff198316865281860193506140c2565b61409885614037565b60005b838110156140ba5781548189015260018201915060208101905061409b565b838801955050505b50505092915050565b7f636f6e7472616374000000000000000000000000000000000000000000000000600082015250565b6000614101600883613fd7565b915061410c826140cb565b600882019050919050565b6000614123828461404c565b915061412e826140f4565b915081905092915050565b7f517569726b436f6d69633a204e6f742053746172746564000000000000000000600082015250565b600061416f601783613122565b915061417a82614139565b602082019050919050565b6000602082019050818103600083015261419e81614162565b9050919050565b6000815190506141b481613291565b92915050565b6000602082840312156141d0576141cf613052565b5b60006141de848285016141a5565b91505092915050565b7f517569726b436f6d69633a204e6f7420517569726b69657320546f6b656e204f60008201527f776e657200000000000000000000000000000000000000000000000000000000602082015250565b6000614243602483613122565b915061424e826141e7565b604082019050919050565b6000602082019050818103600083015261427281614236565b9050919050565b7f517569726b436f6d69633a204e6f7420517569726b4c696e677320546f6b656e60008201527f204f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006142d5602683613122565b91506142e082614279565b604082019050919050565b60006020820190508181036000830152614304816142c8565b9050919050565b7f517569726b436f6d69633a20546f6b656e20416c726561647920436c61696d6560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000614367602183613122565b91506143728261430b565b604082019050919050565b600060208201905081810360008301526143968161435a565b9050919050565b60006143a8826131d2565b91506143b3836131d2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143e8576143e7613b7d565b5b828201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061444f602683613122565b915061445a826143f3565b604082019050919050565b6000602082019050818103600083015261447e81614442565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006144e1602d83613122565b91506144ec82614485565b604082019050919050565b60006020820190508181036000830152614510816144d4565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061454d602083613122565b915061455882614517565b602082019050919050565b6000602082019050818103600083015261457c81614540565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006145b9601983613122565b91506145c482614583565b602082019050919050565b600060208201905081810360008301526145e8816145ac565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614625601f83613122565b9150614630826145ef565b602082019050919050565b6000602082019050818103600083015261465481614618565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006146b7602583613122565b91506146c28261465b565b604082019050919050565b600060208201905081810360008301526146e6816146aa565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614749602483613122565b9150614754826146ed565b604082019050919050565b600060208201905081810360008301526147788161473c565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006147db603283613122565b91506147e68261477f565b604082019050919050565b6000602082019050818103600083015261480a816147ce565b9050919050565b600061481c826131d2565b9150614827836131d2565b92508282101561483a57614839613b7d565b5b828203905092915050565b600081519050919050565b600082825260208201905092915050565b600061486c82614845565b6148768185614850565b9350614886818560208601613133565b61488f81613166565b840191505092915050565b60006080820190506148af6000830187613267565b6148bc6020830186613267565b6148c960408301856132fd565b81810360608301526148db8184614861565b905095945050505050565b6000815190506148f581613088565b92915050565b60006020828403121561491157614910613052565b5b600061491f848285016148e6565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061495e602083613122565b915061496982614928565b602082019050919050565b6000602082019050818103600083015261498d81614951565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006149ca601c83613122565b91506149d582614994565b602082019050919050565b600060208201905081810360008301526149f9816149bd565b905091905056fea2646970667358221220f938645b07c75c2050e747a55c0b7472635a105f087b7aaf324cffe8f93d31d764736f6c634300080d0033

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

00000000000000000000000000000000000000000000000000000000000000600000000000000000000000003903d4ffaaa700b62578a66e7a67ba4cb67787f9000000000000000000000000da60730e1feaa7d8321f62ffb069edd869e57d020000000000000000000000000000000000000000000000000000000000000043697066733a2f2f626166796265696871797133706d6f6c7169737a737734336e357775666d73746577357a76727233366333367665347669377077737066673371752f0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _initURI (string): ipfs://bafybeihqyq3pmolqiszsw43n5wufmstew5zvrr36c36ve4vi7pwspfg3qu/
Arg [1] : _claimAddressOG (address): 0x3903d4fFaAa700b62578a66e7a67Ba4cb67787f9
Arg [2] : _claimAddressLING (address): 0xDA60730E1feAa7D8321f62fFb069eDd869E57D02

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 0000000000000000000000003903d4ffaaa700b62578a66e7a67ba4cb67787f9
Arg [2] : 000000000000000000000000da60730e1feaa7d8321f62ffb069edd869e57d02
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [4] : 697066733a2f2f626166796265696871797133706d6f6c7169737a737734336e
Arg [5] : 357775666d73746577357a767272333663333676653476693770777370666733
Arg [6] : 71752f0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

62205:4631:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46266:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47194:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48706:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48224:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62301:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62341:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66253:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62380:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62550:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64944:842;;;:::i;:::-;;66424:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62514:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63885:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65887:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46904:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62625:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46635:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36147:103;;;;;;;;;;;;;:::i;:::-;;64583:353;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64072:503;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35499:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47363:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62588:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48949:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66603:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62426:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47538:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62658:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66115:130;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49175:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63009:868;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36405:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62476:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65794:85;;;;;;;;;;;;;:::i;:::-;;46266:305;46368:4;46420:25;46405:40;;;:11;:40;;;;:105;;;;46477:33;46462:48;;;:11;:48;;;;46405:105;:158;;;;46527:36;46551:11;46527:23;:36::i;:::-;46405:158;46385:178;;46266:305;;;:::o;47194:100::-;47248:13;47281:5;47274:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47194:100;:::o;48706:171::-;48782:7;48802:23;48817:7;48802:14;:23::i;:::-;48845:15;:24;48861:7;48845:24;;;;;;;;;;;;;;;;;;;;;48838:31;;48706:171;;;:::o;48224:416::-;48305:13;48321:23;48336:7;48321:14;:23::i;:::-;48305:39;;48369:5;48363:11;;:2;:11;;;48355:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;48463:5;48447:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;48472:37;48489:5;48496:12;:10;:12::i;:::-;48472:16;:37::i;:::-;48447:62;48425:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;48611:21;48620:2;48624:7;48611:8;:21::i;:::-;48294:346;48224:416;;:::o;62301:33::-;;;;:::o;62341:30::-;;;;:::o;66253:163::-;66354:4;31276:1;30090:42;31230:43;;;:47;31226:699;;;31517:10;31509:18;;:4;:18;;;31505:85;;66371:37:::1;66390:4;66396:2;66400:7;66371:18;:37::i;:::-;31568:7:::0;;31505:85;30090:42;31650:40;;;31699:4;31706:10;31650:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;30090:42;31746:40;;;31795:4;31802;31746:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31650:157;31604:310;;31887:10;31868:30;;;;;;;;;;;:::i;:::-;;;;;;;;31604:310;31226:699;66371:37:::1;66390:4;66396:2;66400:7;66371:18;:37::i;:::-;66253:163:::0;;;;;:::o;62380:39::-;62415:4;62380:39;:::o;62550:31::-;;;;;;;;;;;;;:::o;64944:842::-;35385:13;:11;:13::i;:::-;65000:16:::1;65019:21;65000:40;;65051:13;65067:42;65051:58;;65120:13;65136:42;65120:58;;65189:13;65205:42;65189:58;;65261:12;65287:5;65279:19;;65324:3;65318:2;65307:8;:13;;;;:::i;:::-;65306:21;;;;:::i;:::-;65279:77;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65260:96;;;65375:7;65367:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;65438:12;65464:5;65456:19;;65501:3;65495:2;65484:8;:13;;;;:::i;:::-;65483:21;;;;:::i;:::-;65456:77;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65437:96;;;65552:7;65544:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;65615:12;65641:5;65633:19;;65660:21;65633:77;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65614:96;;;65729:7;65721:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;64989:797;;;;;;;64944:842::o:0;66424:171::-;66529:4;31276:1;30090:42;31230:43;;;:47;31226:699;;;31517:10;31509:18;;:4;:18;;;31505:85;;66546:41:::1;66569:4;66575:2;66579:7;66546:22;:41::i;:::-;31568:7:::0;;31505:85;30090:42;31650:40;;;31699:4;31706:10;31650:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;30090:42;31746:40;;;31795:4;31802;31746:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31650:157;31604:310;;31887:10;31868:30;;;;;;;;;;;:::i;:::-;;;;;;;;31604:310;31226:699;66546:41:::1;66569:4;66575:2;66579:7;66546:22;:41::i;:::-;66424:171:::0;;;;;:::o;62514:29::-;;;;;;;;;;;;;:::o;63885:179::-;63995:7;64027:21;64041:6;64027:13;:21::i;:::-;64049:6;64027:29;;;;;;;;:::i;:::-;;;;;;;;64020:36;;63885:179;;;;:::o;65887:104::-;35385:13;:11;:13::i;:::-;65972:11:::1;65962:7;:21;;;;;;;;;;;;:::i;:::-;;65887:104:::0;:::o;46904:223::-;46976:7;46996:13;47012:17;47021:7;47012:8;:17::i;:::-;46996:33;;47065:1;47048:19;;:5;:19;;;47040:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;47114:5;47107:12;;;46904:223;;;:::o;62625:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46635:207::-;46707:7;46752:1;46735:19;;:5;:19;;;46727:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46818:9;:16;46828:5;46818:16;;;;;;;;;;;;;;;;46811:23;;46635:207;;;:::o;36147:103::-;35385:13;:11;:13::i;:::-;36212:30:::1;36239:1;36212:18;:30::i;:::-;36147:103::o:0;64583:353::-;64687:16;64721:24;64762:9;;:16;;64748:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64721:58;;64795:9;64790:114;64814:9;;:16;;64810:1;:20;64790:114;;;64865:13;:27;64879:9;;64889:1;64879:12;;;;;;;:::i;:::-;;;;;;;;64865:27;;;;;;;;;;;;64852:7;64860:1;64852:10;;;;;;;;:::i;:::-;;;;;;;:40;;;;;64832:3;;;;;:::i;:::-;;;;64790:114;;;;64921:7;64914:14;;;64583:353;;;;:::o;64072:503::-;64159:16;64193:19;64215:17;64225:6;64215:9;:17::i;:::-;64193:39;;64243:26;64286:11;64272:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64243:55;;64309:19;64348:9;64343:198;62415:4;64363:1;:12;64343:198;;;64401:10;64409:1;64401:7;:10::i;:::-;:34;;;;;64429:6;64415:20;;:10;64423:1;64415:7;:10::i;:::-;:20;;;64401:34;64397:133;;;64481:1;64456:9;64466:11;64456:22;;;;;;;;:::i;:::-;;;;;;;:26;;;;;64501:13;;;;;:::i;:::-;;;;64397:133;64377:3;;;;;:::i;:::-;;;;64343:198;;;;64558:9;64551:16;;;;;64072:503;;;:::o;35499:87::-;35545:7;35572:6;;;;;;;;;;;35565:13;;35499:87;:::o;47363:104::-;47419:13;47452:7;47445:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47363:104;:::o;62588:28::-;;;;:::o;48949:155::-;49044:52;49063:12;:10;:12::i;:::-;49077:8;49087;49044:18;:52::i;:::-;48949:155;;:::o;66603:228::-;66754:4;31276:1;30090:42;31230:43;;;:47;31226:699;;;31517:10;31509:18;;:4;:18;;;31505:85;;66776:47:::1;66799:4;66805:2;66809:7;66818:4;66776:22;:47::i;:::-;31568:7:::0;;31505:85;30090:42;31650:40;;;31699:4;31706:10;31650:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;30090:42;31746:40;;;31795:4;31802;31746:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31650:157;31604:310;;31887:10;31868:30;;;;;;;;;;;:::i;:::-;;;;;;;;31604:310;31226:699;66776:47:::1;66799:4;66805:2;66809:7;66818:4;66776:22;:47::i;:::-;66603:228:::0;;;;;;:::o;62426:41::-;62463:4;62426:41;:::o;47538:281::-;47611:13;47637:23;47652:7;47637:14;:23::i;:::-;47673:21;47697:10;:8;:10::i;:::-;47673:34;;47749:1;47731:7;47725:21;:25;:86;;;;;;;;;;;;;;;;;47777:7;47786:18;:7;:16;:18::i;:::-;47760:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47725:86;47718:93;;;47538:281;;;:::o;62658:48::-;;;;;;;;;;;;;;;;;:::o;66115:130::-;66159:13;66216:7;66199:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;66185:52;;66115:130;:::o;49175:164::-;49272:4;49296:18;:25;49315:5;49296:25;;;;;;;;;;;;;;;:35;49322:8;49296:35;;;;;;;;;;;;;;;;;;;;;;;;;49289:42;;49175:164;;;;:::o;63009:868::-;2382:21;:19;:21::i;:::-;63108:4:::1;63095:17;;:9;;;;;;;;;;;:17;;;63087:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;63156:9;63151:677;63175:9;:16;63171:1;:20;63151:677;;;63213:16;63232:9;63242:1;63232:12;;;;;;;;:::i;:::-;;;;;;;;63213:31;;63330:12;:10;:12::i;:::-;63285:57;;63293:14;;;;;;;;;;;63285:31;;;63317:8;63285:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;;63259:155;;;;;;;;;;;;:::i;:::-;;;;;;;;;63502:12;:10;:12::i;:::-;63455:59;;63463:16;;;;;;;;;;;63455:33;;;63489:8;63455:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;;63429:159;;;;;;;;;;;;:::i;:::-;;;;;;;;;63656:1;63629:13;:23;63643:8;63629:23;;;;;;;;;;;;:28;63603:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;63767:1;63741:13;:23;63755:8;63741:23;;;;;;;;;;;:27;;;;63783:33;63793:12;:10;:12::i;:::-;63807:8;63783:9;:33::i;:::-;63198:630;63193:3;;;;;:::i;:::-;;;;63151:677;;;;63853:9;:16;63838:11;;:31;;;;;;;:::i;:::-;;;;;;;;2426:20:::0;:18;:20::i;:::-;63009:868;:::o;36405:201::-;35385:13;:11;:13::i;:::-;36514:1:::1;36494:22;;:8;:22;;::::0;36486:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;36570:28;36589:8;36570:18;:28::i;:::-;36405:201:::0;:::o;62476:29::-;;;;;;;;;;;;;:::o;65794:85::-;35385:13;:11;:13::i;:::-;65862:9:::1;;;;;;;;;;;65861:10;65849:9;;:22;;;;;;;;;;;;;;;;;;65794:85::o:0;44689:157::-;44774:4;44813:25;44798:40;;;:11;:40;;;;44791:47;;44689:157;;;:::o;58525:135::-;58607:16;58615:7;58607;:16::i;:::-;58599:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;58525:135;:::o;34044:98::-;34097:7;34124:10;34117:17;;34044:98;:::o;57804:174::-;57906:2;57879:15;:24;57895:7;57879:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;57962:7;57958:2;57924:46;;57933:23;57948:7;57933:14;:23::i;:::-;57924:46;;;;;;;;;;;;57804:174;;:::o;49406:335::-;49601:41;49620:12;:10;:12::i;:::-;49634:7;49601:18;:41::i;:::-;49593:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;49705:28;49715:4;49721:2;49725:7;49705:9;:28::i;:::-;49406:335;;;:::o;35664:132::-;35739:12;:10;:12::i;:::-;35728:23;;:7;:5;:7::i;:::-;:23;;;35720:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35664:132::o;49812:185::-;49950:39;49967:4;49973:2;49977:7;49950:39;;;;;;;;;;;;:16;:39::i;:::-;49812:185;;;:::o;51698:117::-;51764:7;51791;:16;51799:7;51791:16;;;;;;;;;;;;;;;;;;;;;51784:23;;51698:117;;;:::o;36766:191::-;36840:16;36859:6;;;;;;;;;;;36840:25;;36885:8;36876:6;;:17;;;;;;;;;;;;;;;;;;36940:8;36909:40;;36930:8;36909:40;;;;;;;;;;;;36829:128;36766:191;:::o;52128:128::-;52193:4;52246:1;52217:31;;:17;52226:7;52217:8;:17::i;:::-;:31;;;;52210:38;;52128:128;;;:::o;58121:315::-;58276:8;58267:17;;:5;:17;;;58259:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;58363:8;58325:18;:25;58344:5;58325:25;;;;;;;;;;;;;;;:35;58351:8;58325:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;58409:8;58387:41;;58402:5;58387:41;;;58419:8;58387:41;;;;;;:::i;:::-;;;;;;;;58121:315;;;:::o;50068:322::-;50242:41;50261:12;:10;:12::i;:::-;50275:7;50242:18;:41::i;:::-;50234:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;50344:38;50358:4;50364:2;50368:7;50377:4;50344:13;:38::i;:::-;50068:322;;;;:::o;65999:108::-;66059:13;66092:7;66085:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65999:108;:::o;25738:716::-;25794:13;25845:14;25882:1;25862:17;25873:5;25862:10;:17::i;:::-;:21;25845:38;;25898:20;25932:6;25921:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25898:41;;25954:11;26083:6;26079:2;26075:15;26067:6;26063:28;26056:35;;26120:288;26127:4;26120:288;;;26152:5;;;;;;;;26294:8;26289:2;26282:5;26278:14;26273:30;26268:3;26260:44;26350:2;26341:11;;;;;;:::i;:::-;;;;;26384:1;26375:5;:10;26120:288;26371:21;26120:288;26429:6;26422:13;;;;;25738:716;;;:::o;2462:293::-;1864:1;2596:7;;:19;2588:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1864:1;2729:7;:18;;;;2462:293::o;53029:110::-;53105:26;53115:2;53119:7;53105:26;;;;;;;;;;;;:9;:26::i;:::-;53029:110;;:::o;2763:213::-;1820:1;2946:7;:22;;;;2763:213::o;52423:264::-;52516:4;52533:13;52549:23;52564:7;52549:14;:23::i;:::-;52533:39;;52602:5;52591:16;;:7;:16;;;:52;;;;52611:32;52628:5;52635:7;52611:16;:32::i;:::-;52591:52;:87;;;;52671:7;52647:31;;:20;52659:7;52647:11;:20::i;:::-;:31;;;52591:87;52583:96;;;52423:264;;;;:::o;56422:1263::-;56581:4;56554:31;;:23;56569:7;56554:14;:23::i;:::-;:31;;;56546:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;56660:1;56646:16;;:2;:16;;;56638:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;56716:42;56737:4;56743:2;56747:7;56756:1;56716:20;:42::i;:::-;56888:4;56861:31;;:23;56876:7;56861:14;:23::i;:::-;:31;;;56853:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;57006:15;:24;57022:7;57006:24;;;;;;;;;;;;56999:31;;;;;;;;;;;57501:1;57482:9;:15;57492:4;57482:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;57534:1;57517:9;:13;57527:2;57517:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;57576:2;57557:7;:16;57565:7;57557:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;57615:7;57611:2;57596:27;;57605:4;57596:27;;;;;;;;;;;;57636:41;57656:4;57662:2;57666:7;57675:1;57636:19;:41::i;:::-;56422:1263;;;:::o;51271:313::-;51427:28;51437:4;51443:2;51447:7;51427:9;:28::i;:::-;51474:47;51497:4;51503:2;51507:7;51516:4;51474:22;:47::i;:::-;51466:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;51271:313;;;;:::o;22598:922::-;22651:7;22671:14;22688:1;22671:18;;22738:6;22729:5;:15;22725:102;;22774:6;22765:15;;;;;;:::i;:::-;;;;;22809:2;22799:12;;;;22725:102;22854:6;22845:5;:15;22841:102;;22890:6;22881:15;;;;;;:::i;:::-;;;;;22925:2;22915:12;;;;22841:102;22970:6;22961:5;:15;22957:102;;23006:6;22997:15;;;;;;:::i;:::-;;;;;23041:2;23031:12;;;;22957:102;23086:5;23077;:14;23073:99;;23121:5;23112:14;;;;;;:::i;:::-;;;;;23155:1;23145:11;;;;23073:99;23199:5;23190;:14;23186:99;;23234:5;23225:14;;;;;;:::i;:::-;;;;;23268:1;23258:11;;;;23186:99;23312:5;23303;:14;23299:99;;23347:5;23338:14;;;;;;:::i;:::-;;;;;23381:1;23371:11;;;;23299:99;23425:5;23416;:14;23412:66;;23461:1;23451:11;;;;23412:66;23506:6;23499:13;;;22598:922;;;:::o;53366:319::-;53495:18;53501:2;53505:7;53495:5;:18::i;:::-;53546:53;53577:1;53581:2;53585:7;53594:4;53546:22;:53::i;:::-;53524:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;53366:319;;;:::o;60809:410::-;60999:1;60987:9;:13;60983:229;;;61037:1;61021:18;;:4;:18;;;61017:87;;61079:9;61060;:15;61070:4;61060:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;61017:87;61136:1;61122:16;;:2;:16;;;61118:83;;61176:9;61159;:13;61169:2;61159:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;61118:83;60983:229;60809:410;;;;:::o;61941:158::-;;;;;:::o;59224:853::-;59378:4;59399:15;:2;:13;;;:15::i;:::-;59395:675;;;59451:2;59435:36;;;59472:12;:10;:12::i;:::-;59486:4;59492:7;59501:4;59435:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;59431:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59693:1;59676:6;:13;:18;59672:328;;59719:60;;;;;;;;;;:::i;:::-;;;;;;;;59672:328;59950:6;59944:13;59935:6;59931:2;59927:15;59920:38;59431:584;59567:41;;;59557:51;;;:6;:51;;;;59550:58;;;;;59395:675;60054:4;60047:11;;59224:853;;;;;;;:::o;54021:942::-;54115:1;54101:16;;:2;:16;;;54093:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;54174:16;54182:7;54174;:16::i;:::-;54173:17;54165:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;54236:48;54265:1;54269:2;54273:7;54282:1;54236:20;:48::i;:::-;54383:16;54391:7;54383;:16::i;:::-;54382:17;54374:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;54798:1;54781:9;:13;54791:2;54781:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;54842:2;54823:7;:16;54831:7;54823:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;54887:7;54883:2;54862:33;;54879:1;54862:33;;;;;;;;;;;;54908:47;54936:1;54940:2;54944:7;54953:1;54908:19;:47::i;:::-;54021:942;;:::o;4224:326::-;4284:4;4541:1;4519:7;:19;;;:23;4512:30;;4224:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:117::-;6024:1;6021;6014:12;6038:117;6147:1;6144;6137:12;6161:180;6209:77;6206:1;6199:88;6306:4;6303:1;6296:15;6330:4;6327:1;6320:15;6347:281;6430:27;6452:4;6430:27;:::i;:::-;6422:6;6418:40;6560:6;6548:10;6545:22;6524:18;6512:10;6509:34;6506:62;6503:88;;;6571:18;;:::i;:::-;6503:88;6611:10;6607:2;6600:22;6390:238;6347:281;;:::o;6634:129::-;6668:6;6695:20;;:::i;:::-;6685:30;;6724:33;6752:4;6744:6;6724:33;:::i;:::-;6634:129;;;:::o;6769:308::-;6831:4;6921:18;6913:6;6910:30;6907:56;;;6943:18;;:::i;:::-;6907:56;6981:29;7003:6;6981:29;:::i;:::-;6973:37;;7065:4;7059;7055:15;7047:23;;6769:308;;;:::o;7083:154::-;7167:6;7162:3;7157;7144:30;7229:1;7220:6;7215:3;7211:16;7204:27;7083:154;;;:::o;7243:412::-;7321:5;7346:66;7362:49;7404:6;7362:49;:::i;:::-;7346:66;:::i;:::-;7337:75;;7435:6;7428:5;7421:21;7473:4;7466:5;7462:16;7511:3;7502:6;7497:3;7493:16;7490:25;7487:112;;;7518:79;;:::i;:::-;7487:112;7608:41;7642:6;7637:3;7632;7608:41;:::i;:::-;7327:328;7243:412;;;;;:::o;7675:340::-;7731:5;7780:3;7773:4;7765:6;7761:17;7757:27;7747:122;;7788:79;;:::i;:::-;7747:122;7905:6;7892:20;7930:79;8005:3;7997:6;7990:4;7982:6;7978:17;7930:79;:::i;:::-;7921:88;;7737:278;7675:340;;;;:::o;8021:509::-;8090:6;8139:2;8127:9;8118:7;8114:23;8110:32;8107:119;;;8145:79;;:::i;:::-;8107:119;8293:1;8282:9;8278:17;8265:31;8323:18;8315:6;8312:30;8309:117;;;8345:79;;:::i;:::-;8309:117;8450:63;8505:7;8496:6;8485:9;8481:22;8450:63;:::i;:::-;8440:73;;8236:287;8021:509;;;;:::o;8536:329::-;8595:6;8644:2;8632:9;8623:7;8619:23;8615:32;8612:119;;;8650:79;;:::i;:::-;8612:119;8770:1;8795:53;8840:7;8831:6;8820:9;8816:22;8795:53;:::i;:::-;8785:63;;8741:117;8536:329;;;;:::o;8871:117::-;8980:1;8977;8970:12;8994:117;9103:1;9100;9093:12;9134:568;9207:8;9217:6;9267:3;9260:4;9252:6;9248:17;9244:27;9234:122;;9275:79;;:::i;:::-;9234:122;9388:6;9375:20;9365:30;;9418:18;9410:6;9407:30;9404:117;;;9440:79;;:::i;:::-;9404:117;9554:4;9546:6;9542:17;9530:29;;9608:3;9600:4;9592:6;9588:17;9578:8;9574:32;9571:41;9568:128;;;9615:79;;:::i;:::-;9568:128;9134:568;;;;;:::o;9708:559::-;9794:6;9802;9851:2;9839:9;9830:7;9826:23;9822:32;9819:119;;;9857:79;;:::i;:::-;9819:119;10005:1;9994:9;9990:17;9977:31;10035:18;10027:6;10024:30;10021:117;;;10057:79;;:::i;:::-;10021:117;10170:80;10242:7;10233:6;10222:9;10218:22;10170:80;:::i;:::-;10152:98;;;;9948:312;9708:559;;;;;:::o;10273:114::-;10340:6;10374:5;10368:12;10358:22;;10273:114;;;:::o;10393:184::-;10492:11;10526:6;10521:3;10514:19;10566:4;10561:3;10557:14;10542:29;;10393:184;;;;:::o;10583:132::-;10650:4;10673:3;10665:11;;10703:4;10698:3;10694:14;10686:22;;10583:132;;;:::o;10721:108::-;10798:24;10816:5;10798:24;:::i;:::-;10793:3;10786:37;10721:108;;:::o;10835:179::-;10904:10;10925:46;10967:3;10959:6;10925:46;:::i;:::-;11003:4;10998:3;10994:14;10980:28;;10835:179;;;;:::o;11020:113::-;11090:4;11122;11117:3;11113:14;11105:22;;11020:113;;;:::o;11169:732::-;11288:3;11317:54;11365:5;11317:54;:::i;:::-;11387:86;11466:6;11461:3;11387:86;:::i;:::-;11380:93;;11497:56;11547:5;11497:56;:::i;:::-;11576:7;11607:1;11592:284;11617:6;11614:1;11611:13;11592:284;;;11693:6;11687:13;11720:63;11779:3;11764:13;11720:63;:::i;:::-;11713:70;;11806:60;11859:6;11806:60;:::i;:::-;11796:70;;11652:224;11639:1;11636;11632:9;11627:14;;11592:284;;;11596:14;11892:3;11885:10;;11293:608;;;11169:732;;;;:::o;11907:373::-;12050:4;12088:2;12077:9;12073:18;12065:26;;12137:9;12131:4;12127:20;12123:1;12112:9;12108:17;12101:47;12165:108;12268:4;12259:6;12165:108;:::i;:::-;12157:116;;11907:373;;;;:::o;12286:116::-;12356:21;12371:5;12356:21;:::i;:::-;12349:5;12346:32;12336:60;;12392:1;12389;12382:12;12336:60;12286:116;:::o;12408:133::-;12451:5;12489:6;12476:20;12467:29;;12505:30;12529:5;12505:30;:::i;:::-;12408:133;;;;:::o;12547:468::-;12612:6;12620;12669:2;12657:9;12648:7;12644:23;12640:32;12637:119;;;12675:79;;:::i;:::-;12637:119;12795:1;12820:53;12865:7;12856:6;12845:9;12841:22;12820:53;:::i;:::-;12810:63;;12766:117;12922:2;12948:50;12990:7;12981:6;12970:9;12966:22;12948:50;:::i;:::-;12938:60;;12893:115;12547:468;;;;;:::o;13021:307::-;13082:4;13172:18;13164:6;13161:30;13158:56;;;13194:18;;:::i;:::-;13158:56;13232:29;13254:6;13232:29;:::i;:::-;13224:37;;13316:4;13310;13306:15;13298:23;;13021:307;;;:::o;13334:410::-;13411:5;13436:65;13452:48;13493:6;13452:48;:::i;:::-;13436:65;:::i;:::-;13427:74;;13524:6;13517:5;13510:21;13562:4;13555:5;13551:16;13600:3;13591:6;13586:3;13582:16;13579:25;13576:112;;;13607:79;;:::i;:::-;13576:112;13697:41;13731:6;13726:3;13721;13697:41;:::i;:::-;13417:327;13334:410;;;;;:::o;13763:338::-;13818:5;13867:3;13860:4;13852:6;13848:17;13844:27;13834:122;;13875:79;;:::i;:::-;13834:122;13992:6;13979:20;14017:78;14091:3;14083:6;14076:4;14068:6;14064:17;14017:78;:::i;:::-;14008:87;;13824:277;13763:338;;;;:::o;14107:943::-;14202:6;14210;14218;14226;14275:3;14263:9;14254:7;14250:23;14246:33;14243:120;;;14282:79;;:::i;:::-;14243:120;14402:1;14427:53;14472:7;14463:6;14452:9;14448:22;14427:53;:::i;:::-;14417:63;;14373:117;14529:2;14555:53;14600:7;14591:6;14580:9;14576:22;14555:53;:::i;:::-;14545:63;;14500:118;14657:2;14683:53;14728:7;14719:6;14708:9;14704:22;14683:53;:::i;:::-;14673:63;;14628:118;14813:2;14802:9;14798:18;14785:32;14844:18;14836:6;14833:30;14830:117;;;14866:79;;:::i;:::-;14830:117;14971:62;15025:7;15016:6;15005:9;15001:22;14971:62;:::i;:::-;14961:72;;14756:287;14107:943;;;;;;;:::o;15056:474::-;15124:6;15132;15181:2;15169:9;15160:7;15156:23;15152:32;15149:119;;;15187:79;;:::i;:::-;15149:119;15307:1;15332:53;15377:7;15368:6;15357:9;15353:22;15332:53;:::i;:::-;15322:63;;15278:117;15434:2;15460:53;15505:7;15496:6;15485:9;15481:22;15460:53;:::i;:::-;15450:63;;15405:118;15056:474;;;;;:::o;15536:311::-;15613:4;15703:18;15695:6;15692:30;15689:56;;;15725:18;;:::i;:::-;15689:56;15775:4;15767:6;15763:17;15755:25;;15835:4;15829;15825:15;15817:23;;15536:311;;;:::o;15870:710::-;15966:5;15991:81;16007:64;16064:6;16007:64;:::i;:::-;15991:81;:::i;:::-;15982:90;;16092:5;16121:6;16114:5;16107:21;16155:4;16148:5;16144:16;16137:23;;16208:4;16200:6;16196:17;16188:6;16184:30;16237:3;16229:6;16226:15;16223:122;;;16256:79;;:::i;:::-;16223:122;16371:6;16354:220;16388:6;16383:3;16380:15;16354:220;;;16463:3;16492:37;16525:3;16513:10;16492:37;:::i;:::-;16487:3;16480:50;16559:4;16554:3;16550:14;16543:21;;16430:144;16414:4;16409:3;16405:14;16398:21;;16354:220;;;16358:21;15972:608;;15870:710;;;;;:::o;16603:370::-;16674:5;16723:3;16716:4;16708:6;16704:17;16700:27;16690:122;;16731:79;;:::i;:::-;16690:122;16848:6;16835:20;16873:94;16963:3;16955:6;16948:4;16940:6;16936:17;16873:94;:::i;:::-;16864:103;;16680:293;16603:370;;;;:::o;16979:539::-;17063:6;17112:2;17100:9;17091:7;17087:23;17083:32;17080:119;;;17118:79;;:::i;:::-;17080:119;17266:1;17255:9;17251:17;17238:31;17296:18;17288:6;17285:30;17282:117;;;17318:79;;:::i;:::-;17282:117;17423:78;17493:7;17484:6;17473:9;17469:22;17423:78;:::i;:::-;17413:88;;17209:302;16979:539;;;;:::o;17524:180::-;17572:77;17569:1;17562:88;17669:4;17666:1;17659:15;17693:4;17690:1;17683:15;17710:320;17754:6;17791:1;17785:4;17781:12;17771:22;;17838:1;17832:4;17828:12;17859:18;17849:81;;17915:4;17907:6;17903:17;17893:27;;17849:81;17977:2;17969:6;17966:14;17946:18;17943:38;17940:84;;17996:18;;:::i;:::-;17940:84;17761:269;17710:320;;;:::o;18036:220::-;18176:34;18172:1;18164:6;18160:14;18153:58;18245:3;18240:2;18232:6;18228:15;18221:28;18036:220;:::o;18262:366::-;18404:3;18425:67;18489:2;18484:3;18425:67;:::i;:::-;18418:74;;18501:93;18590:3;18501:93;:::i;:::-;18619:2;18614:3;18610:12;18603:19;;18262:366;;;:::o;18634:419::-;18800:4;18838:2;18827:9;18823:18;18815:26;;18887:9;18881:4;18877:20;18873:1;18862:9;18858:17;18851:47;18915:131;19041:4;18915:131;:::i;:::-;18907:139;;18634:419;;;:::o;19059:248::-;19199:34;19195:1;19187:6;19183:14;19176:58;19268:31;19263:2;19255:6;19251:15;19244:56;19059:248;:::o;19313:366::-;19455:3;19476:67;19540:2;19535:3;19476:67;:::i;:::-;19469:74;;19552:93;19641:3;19552:93;:::i;:::-;19670:2;19665:3;19661:12;19654:19;;19313:366;;;:::o;19685:419::-;19851:4;19889:2;19878:9;19874:18;19866:26;;19938:9;19932:4;19928:20;19924:1;19913:9;19909:17;19902:47;19966:131;20092:4;19966:131;:::i;:::-;19958:139;;19685:419;;;:::o;20110:332::-;20231:4;20269:2;20258:9;20254:18;20246:26;;20282:71;20350:1;20339:9;20335:17;20326:6;20282:71;:::i;:::-;20363:72;20431:2;20420:9;20416:18;20407:6;20363:72;:::i;:::-;20110:332;;;;;:::o;20448:137::-;20502:5;20533:6;20527:13;20518:22;;20549:30;20573:5;20549:30;:::i;:::-;20448:137;;;;:::o;20591:345::-;20658:6;20707:2;20695:9;20686:7;20682:23;20678:32;20675:119;;;20713:79;;:::i;:::-;20675:119;20833:1;20858:61;20911:7;20902:6;20891:9;20887:22;20858:61;:::i;:::-;20848:71;;20804:125;20591:345;;;;:::o;20942:180::-;20990:77;20987:1;20980:88;21087:4;21084:1;21077:15;21111:4;21108:1;21101:15;21128:348;21168:7;21191:20;21209:1;21191:20;:::i;:::-;21186:25;;21225:20;21243:1;21225:20;:::i;:::-;21220:25;;21413:1;21345:66;21341:74;21338:1;21335:81;21330:1;21323:9;21316:17;21312:105;21309:131;;;21420:18;;:::i;:::-;21309:131;21468:1;21465;21461:9;21450:20;;21128:348;;;;:::o;21482:180::-;21530:77;21527:1;21520:88;21627:4;21624:1;21617:15;21651:4;21648:1;21641:15;21668:185;21708:1;21725:20;21743:1;21725:20;:::i;:::-;21720:25;;21759:20;21777:1;21759:20;:::i;:::-;21754:25;;21798:1;21788:35;;21803:18;;:::i;:::-;21788:35;21845:1;21842;21838:9;21833:14;;21668:185;;;;:::o;21859:147::-;21960:11;21997:3;21982:18;;21859:147;;;;:::o;22012:114::-;;:::o;22132:398::-;22291:3;22312:83;22393:1;22388:3;22312:83;:::i;:::-;22305:90;;22404:93;22493:3;22404:93;:::i;:::-;22522:1;22517:3;22513:11;22506:18;;22132:398;;;:::o;22536:379::-;22720:3;22742:147;22885:3;22742:147;:::i;:::-;22735:154;;22906:3;22899:10;;22536:379;;;:::o;22921:224::-;23061:34;23057:1;23049:6;23045:14;23038:58;23130:7;23125:2;23117:6;23113:15;23106:32;22921:224;:::o;23151:366::-;23293:3;23314:67;23378:2;23373:3;23314:67;:::i;:::-;23307:74;;23390:93;23479:3;23390:93;:::i;:::-;23508:2;23503:3;23499:12;23492:19;;23151:366;;;:::o;23523:419::-;23689:4;23727:2;23716:9;23712:18;23704:26;;23776:9;23770:4;23766:20;23762:1;23751:9;23747:17;23740:47;23804:131;23930:4;23804:131;:::i;:::-;23796:139;;23523:419;;;:::o;23948:224::-;24088:34;24084:1;24076:6;24072:14;24065:58;24157:7;24152:2;24144:6;24140:15;24133:32;23948:224;:::o;24178:366::-;24320:3;24341:67;24405:2;24400:3;24341:67;:::i;:::-;24334:74;;24417:93;24506:3;24417:93;:::i;:::-;24535:2;24530:3;24526:12;24519:19;;24178:366;;;:::o;24550:419::-;24716:4;24754:2;24743:9;24739:18;24731:26;;24803:9;24797:4;24793:20;24789:1;24778:9;24774:17;24767:47;24831:131;24957:4;24831:131;:::i;:::-;24823:139;;24550:419;;;:::o;24975:224::-;25115:34;25111:1;25103:6;25099:14;25092:58;25184:7;25179:2;25171:6;25167:15;25160:32;24975:224;:::o;25205:366::-;25347:3;25368:67;25432:2;25427:3;25368:67;:::i;:::-;25361:74;;25444:93;25533:3;25444:93;:::i;:::-;25562:2;25557:3;25553:12;25546:19;;25205:366;;;:::o;25577:419::-;25743:4;25781:2;25770:9;25766:18;25758:26;;25830:9;25824:4;25820:20;25816:1;25805:9;25801:17;25794:47;25858:131;25984:4;25858:131;:::i;:::-;25850:139;;25577:419;;;:::o;26002:180::-;26050:77;26047:1;26040:88;26147:4;26144:1;26137:15;26171:4;26168:1;26161:15;26188:174;26328:26;26324:1;26316:6;26312:14;26305:50;26188:174;:::o;26368:366::-;26510:3;26531:67;26595:2;26590:3;26531:67;:::i;:::-;26524:74;;26607:93;26696:3;26607:93;:::i;:::-;26725:2;26720:3;26716:12;26709:19;;26368:366;;;:::o;26740:419::-;26906:4;26944:2;26933:9;26929:18;26921:26;;26993:9;26987:4;26983:20;26979:1;26968:9;26964:17;26957:47;27021:131;27147:4;27021:131;:::i;:::-;27013:139;;26740:419;;;:::o;27165:228::-;27305:34;27301:1;27293:6;27289:14;27282:58;27374:11;27369:2;27361:6;27357:15;27350:36;27165:228;:::o;27399:366::-;27541:3;27562:67;27626:2;27621:3;27562:67;:::i;:::-;27555:74;;27638:93;27727:3;27638:93;:::i;:::-;27756:2;27751:3;27747:12;27740:19;;27399:366;;;:::o;27771:419::-;27937:4;27975:2;27964:9;27960:18;27952:26;;28024:9;28018:4;28014:20;28010:1;27999:9;27995:17;27988:47;28052:131;28178:4;28052:131;:::i;:::-;28044:139;;27771:419;;;:::o;28196:233::-;28235:3;28258:24;28276:5;28258:24;:::i;:::-;28249:33;;28304:66;28297:5;28294:77;28291:103;;28374:18;;:::i;:::-;28291:103;28421:1;28414:5;28410:13;28403:20;;28196:233;;;:::o;28435:148::-;28537:11;28574:3;28559:18;;28435:148;;;;:::o;28589:377::-;28695:3;28723:39;28756:5;28723:39;:::i;:::-;28778:89;28860:6;28855:3;28778:89;:::i;:::-;28771:96;;28876:52;28921:6;28916:3;28909:4;28902:5;28898:16;28876:52;:::i;:::-;28953:6;28948:3;28944:16;28937:23;;28699:267;28589:377;;;;:::o;28972:435::-;29152:3;29174:95;29265:3;29256:6;29174:95;:::i;:::-;29167:102;;29286:95;29377:3;29368:6;29286:95;:::i;:::-;29279:102;;29398:3;29391:10;;28972:435;;;;;:::o;29413:141::-;29462:4;29485:3;29477:11;;29508:3;29505:1;29498:14;29542:4;29539:1;29529:18;29521:26;;29413:141;;;:::o;29584:845::-;29687:3;29724:5;29718:12;29753:36;29779:9;29753:36;:::i;:::-;29805:89;29887:6;29882:3;29805:89;:::i;:::-;29798:96;;29925:1;29914:9;29910:17;29941:1;29936:137;;;;30087:1;30082:341;;;;29903:520;;29936:137;30020:4;30016:9;30005;30001:25;29996:3;29989:38;30056:6;30051:3;30047:16;30040:23;;29936:137;;30082:341;30149:38;30181:5;30149:38;:::i;:::-;30209:1;30223:154;30237:6;30234:1;30231:13;30223:154;;;30311:7;30305:14;30301:1;30296:3;30292:11;30285:35;30361:1;30352:7;30348:15;30337:26;;30259:4;30256:1;30252:12;30247:17;;30223:154;;;30406:6;30401:3;30397:16;30390:23;;30089:334;;29903:520;;29691:738;;29584:845;;;;:::o;30435:158::-;30575:10;30571:1;30563:6;30559:14;30552:34;30435:158;:::o;30599:400::-;30759:3;30780:84;30862:1;30857:3;30780:84;:::i;:::-;30773:91;;30873:93;30962:3;30873:93;:::i;:::-;30991:1;30986:3;30982:11;30975:18;;30599:400;;;:::o;31005:535::-;31235:3;31257:92;31345:3;31336:6;31257:92;:::i;:::-;31250:99;;31366:148;31510:3;31366:148;:::i;:::-;31359:155;;31531:3;31524:10;;31005:535;;;;:::o;31546:173::-;31686:25;31682:1;31674:6;31670:14;31663:49;31546:173;:::o;31725:366::-;31867:3;31888:67;31952:2;31947:3;31888:67;:::i;:::-;31881:74;;31964:93;32053:3;31964:93;:::i;:::-;32082:2;32077:3;32073:12;32066:19;;31725:366;;;:::o;32097:419::-;32263:4;32301:2;32290:9;32286:18;32278:26;;32350:9;32344:4;32340:20;32336:1;32325:9;32321:17;32314:47;32378:131;32504:4;32378:131;:::i;:::-;32370:139;;32097:419;;;:::o;32522:143::-;32579:5;32610:6;32604:13;32595:22;;32626:33;32653:5;32626:33;:::i;:::-;32522:143;;;;:::o;32671:351::-;32741:6;32790:2;32778:9;32769:7;32765:23;32761:32;32758:119;;;32796:79;;:::i;:::-;32758:119;32916:1;32941:64;32997:7;32988:6;32977:9;32973:22;32941:64;:::i;:::-;32931:74;;32887:128;32671:351;;;;:::o;33028:223::-;33168:34;33164:1;33156:6;33152:14;33145:58;33237:6;33232:2;33224:6;33220:15;33213:31;33028:223;:::o;33257:366::-;33399:3;33420:67;33484:2;33479:3;33420:67;:::i;:::-;33413:74;;33496:93;33585:3;33496:93;:::i;:::-;33614:2;33609:3;33605:12;33598:19;;33257:366;;;:::o;33629:419::-;33795:4;33833:2;33822:9;33818:18;33810:26;;33882:9;33876:4;33872:20;33868:1;33857:9;33853:17;33846:47;33910:131;34036:4;33910:131;:::i;:::-;33902:139;;33629:419;;;:::o;34054:225::-;34194:34;34190:1;34182:6;34178:14;34171:58;34263:8;34258:2;34250:6;34246:15;34239:33;34054:225;:::o;34285:366::-;34427:3;34448:67;34512:2;34507:3;34448:67;:::i;:::-;34441:74;;34524:93;34613:3;34524:93;:::i;:::-;34642:2;34637:3;34633:12;34626:19;;34285:366;;;:::o;34657:419::-;34823:4;34861:2;34850:9;34846:18;34838:26;;34910:9;34904:4;34900:20;34896:1;34885:9;34881:17;34874:47;34938:131;35064:4;34938:131;:::i;:::-;34930:139;;34657:419;;;:::o;35082:220::-;35222:34;35218:1;35210:6;35206:14;35199:58;35291:3;35286:2;35278:6;35274:15;35267:28;35082:220;:::o;35308:366::-;35450:3;35471:67;35535:2;35530:3;35471:67;:::i;:::-;35464:74;;35547:93;35636:3;35547:93;:::i;:::-;35665:2;35660:3;35656:12;35649:19;;35308:366;;;:::o;35680:419::-;35846:4;35884:2;35873:9;35869:18;35861:26;;35933:9;35927:4;35923:20;35919:1;35908:9;35904:17;35897:47;35961:131;36087:4;35961:131;:::i;:::-;35953:139;;35680:419;;;:::o;36105:305::-;36145:3;36164:20;36182:1;36164:20;:::i;:::-;36159:25;;36198:20;36216:1;36198:20;:::i;:::-;36193:25;;36352:1;36284:66;36280:74;36277:1;36274:81;36271:107;;;36358:18;;:::i;:::-;36271:107;36402:1;36399;36395:9;36388:16;;36105:305;;;;:::o;36416:225::-;36556:34;36552:1;36544:6;36540:14;36533:58;36625:8;36620:2;36612:6;36608:15;36601:33;36416:225;:::o;36647:366::-;36789:3;36810:67;36874:2;36869:3;36810:67;:::i;:::-;36803:74;;36886:93;36975:3;36886:93;:::i;:::-;37004:2;36999:3;36995:12;36988:19;;36647:366;;;:::o;37019:419::-;37185:4;37223:2;37212:9;37208:18;37200:26;;37272:9;37266:4;37262:20;37258:1;37247:9;37243:17;37236:47;37300:131;37426:4;37300:131;:::i;:::-;37292:139;;37019:419;;;:::o;37444:232::-;37584:34;37580:1;37572:6;37568:14;37561:58;37653:15;37648:2;37640:6;37636:15;37629:40;37444:232;:::o;37682:366::-;37824:3;37845:67;37909:2;37904:3;37845:67;:::i;:::-;37838:74;;37921:93;38010:3;37921:93;:::i;:::-;38039:2;38034:3;38030:12;38023:19;;37682:366;;;:::o;38054:419::-;38220:4;38258:2;38247:9;38243:18;38235:26;;38307:9;38301:4;38297:20;38293:1;38282:9;38278:17;38271:47;38335:131;38461:4;38335:131;:::i;:::-;38327:139;;38054:419;;;:::o;38479:182::-;38619:34;38615:1;38607:6;38603:14;38596:58;38479:182;:::o;38667:366::-;38809:3;38830:67;38894:2;38889:3;38830:67;:::i;:::-;38823:74;;38906:93;38995:3;38906:93;:::i;:::-;39024:2;39019:3;39015:12;39008:19;;38667:366;;;:::o;39039:419::-;39205:4;39243:2;39232:9;39228:18;39220:26;;39292:9;39286:4;39282:20;39278:1;39267:9;39263:17;39256:47;39320:131;39446:4;39320:131;:::i;:::-;39312:139;;39039:419;;;:::o;39464:175::-;39604:27;39600:1;39592:6;39588:14;39581:51;39464:175;:::o;39645:366::-;39787:3;39808:67;39872:2;39867:3;39808:67;:::i;:::-;39801:74;;39884:93;39973:3;39884:93;:::i;:::-;40002:2;39997:3;39993:12;39986:19;;39645:366;;;:::o;40017:419::-;40183:4;40221:2;40210:9;40206:18;40198:26;;40270:9;40264:4;40260:20;40256:1;40245:9;40241:17;40234:47;40298:131;40424:4;40298:131;:::i;:::-;40290:139;;40017:419;;;:::o;40442:181::-;40582:33;40578:1;40570:6;40566:14;40559:57;40442:181;:::o;40629:366::-;40771:3;40792:67;40856:2;40851:3;40792:67;:::i;:::-;40785:74;;40868:93;40957:3;40868:93;:::i;:::-;40986:2;40981:3;40977:12;40970:19;;40629:366;;;:::o;41001:419::-;41167:4;41205:2;41194:9;41190:18;41182:26;;41254:9;41248:4;41244:20;41240:1;41229:9;41225:17;41218:47;41282:131;41408:4;41282:131;:::i;:::-;41274:139;;41001:419;;;:::o;41426:224::-;41566:34;41562:1;41554:6;41550:14;41543:58;41635:7;41630:2;41622:6;41618:15;41611:32;41426:224;:::o;41656:366::-;41798:3;41819:67;41883:2;41878:3;41819:67;:::i;:::-;41812:74;;41895:93;41984:3;41895:93;:::i;:::-;42013:2;42008:3;42004:12;41997:19;;41656:366;;;:::o;42028:419::-;42194:4;42232:2;42221:9;42217:18;42209:26;;42281:9;42275:4;42271:20;42267:1;42256:9;42252:17;42245:47;42309:131;42435:4;42309:131;:::i;:::-;42301:139;;42028:419;;;:::o;42453:223::-;42593:34;42589:1;42581:6;42577:14;42570:58;42662:6;42657:2;42649:6;42645:15;42638:31;42453:223;:::o;42682:366::-;42824:3;42845:67;42909:2;42904:3;42845:67;:::i;:::-;42838:74;;42921:93;43010:3;42921:93;:::i;:::-;43039:2;43034:3;43030:12;43023:19;;42682:366;;;:::o;43054:419::-;43220:4;43258:2;43247:9;43243:18;43235:26;;43307:9;43301:4;43297:20;43293:1;43282:9;43278:17;43271:47;43335:131;43461:4;43335:131;:::i;:::-;43327:139;;43054:419;;;:::o;43479:237::-;43619:34;43615:1;43607:6;43603:14;43596:58;43688:20;43683:2;43675:6;43671:15;43664:45;43479:237;:::o;43722:366::-;43864:3;43885:67;43949:2;43944:3;43885:67;:::i;:::-;43878:74;;43961:93;44050:3;43961:93;:::i;:::-;44079:2;44074:3;44070:12;44063:19;;43722:366;;;:::o;44094:419::-;44260:4;44298:2;44287:9;44283:18;44275:26;;44347:9;44341:4;44337:20;44333:1;44322:9;44318:17;44311:47;44375:131;44501:4;44375:131;:::i;:::-;44367:139;;44094:419;;;:::o;44519:191::-;44559:4;44579:20;44597:1;44579:20;:::i;:::-;44574:25;;44613:20;44631:1;44613:20;:::i;:::-;44608:25;;44652:1;44649;44646:8;44643:34;;;44657:18;;:::i;:::-;44643:34;44702:1;44699;44695:9;44687:17;;44519:191;;;;:::o;44716:98::-;44767:6;44801:5;44795:12;44785:22;;44716:98;;;:::o;44820:168::-;44903:11;44937:6;44932:3;44925:19;44977:4;44972:3;44968:14;44953:29;;44820:168;;;;:::o;44994:360::-;45080:3;45108:38;45140:5;45108:38;:::i;:::-;45162:70;45225:6;45220:3;45162:70;:::i;:::-;45155:77;;45241:52;45286:6;45281:3;45274:4;45267:5;45263:16;45241:52;:::i;:::-;45318:29;45340:6;45318:29;:::i;:::-;45313:3;45309:39;45302:46;;45084:270;44994:360;;;;:::o;45360:640::-;45555:4;45593:3;45582:9;45578:19;45570:27;;45607:71;45675:1;45664:9;45660:17;45651:6;45607:71;:::i;:::-;45688:72;45756:2;45745:9;45741:18;45732:6;45688:72;:::i;:::-;45770;45838:2;45827:9;45823:18;45814:6;45770:72;:::i;:::-;45889:9;45883:4;45879:20;45874:2;45863:9;45859:18;45852:48;45917:76;45988:4;45979:6;45917:76;:::i;:::-;45909:84;;45360:640;;;;;;;:::o;46006:141::-;46062:5;46093:6;46087:13;46078:22;;46109:32;46135:5;46109:32;:::i;:::-;46006:141;;;;:::o;46153:349::-;46222:6;46271:2;46259:9;46250:7;46246:23;46242:32;46239:119;;;46277:79;;:::i;:::-;46239:119;46397:1;46422:63;46477:7;46468:6;46457:9;46453:22;46422:63;:::i;:::-;46412:73;;46368:127;46153:349;;;;:::o;46508:182::-;46648:34;46644:1;46636:6;46632:14;46625:58;46508:182;:::o;46696:366::-;46838:3;46859:67;46923:2;46918:3;46859:67;:::i;:::-;46852:74;;46935:93;47024:3;46935:93;:::i;:::-;47053:2;47048:3;47044:12;47037:19;;46696:366;;;:::o;47068:419::-;47234:4;47272:2;47261:9;47257:18;47249:26;;47321:9;47315:4;47311:20;47307:1;47296:9;47292:17;47285:47;47349:131;47475:4;47349:131;:::i;:::-;47341:139;;47068:419;;;:::o;47493:178::-;47633:30;47629:1;47621:6;47617:14;47610:54;47493:178;:::o;47677:366::-;47819:3;47840:67;47904:2;47899:3;47840:67;:::i;:::-;47833:74;;47916:93;48005:3;47916:93;:::i;:::-;48034:2;48029:3;48025:12;48018:19;;47677:366;;;:::o;48049:419::-;48215:4;48253:2;48242:9;48238:18;48230:26;;48302:9;48296:4;48292:20;48288:1;48277:9;48273:17;48266:47;48330:131;48456:4;48330:131;:::i;:::-;48322:139;;48049:419;;;:::o

Swarm Source

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