ETH Price: $3,435.71 (-1.47%)

Token

The Immortals (X_X)
 

Overview

Max Total Supply

500 X_X

Holders

118

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 X_X
0x383CB6cfddaDB52cCb0558f18888940F22f167Fc
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ImmortalsNFT

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Counters.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/interfaces/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)

pragma solidity ^0.8.0;


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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/interfaces/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (interfaces/IERC721.sol)

pragma solidity ^0.8.0;


// File: @openzeppelin/contracts/interfaces/IERC4906.sol


// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC4906.sol)

pragma solidity ^0.8.0;



/// @title EIP-721 Metadata Update Extension
interface IERC4906 is IERC165, IERC721 {
    /// @dev This event emits when the metadata of a token is changed.
    /// So that the third-party platforms such as NFT market could
    /// timely update the images and related attributes of the NFT.
    event MetadataUpdate(uint256 _tokenId);

    /// @dev This event emits when the metadata of a range of tokens is changed.
    /// So that the third-party platforms such as NFT market could
    /// timely update the images and related attributes of the NFTs.
    event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId);
}

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

        _owners[tokenId] = to;

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

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

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

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

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

        // Clear approvals
        delete _tokenApprovals[tokenId];

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId, 1);

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

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

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

        emit Transfer(from, to, tokenId);

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.0;



/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is IERC4906, ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Emits {MetadataUpdate}.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;

        emit MetadataUpdate(tokenId);
    }

    /**
     * @dev See {ERC721-_burn}. This override additionally checks to see if a
     * token-specific URI was set for the token, and if so, it deletes the token URI from
     * the storage mapping.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// File: Immtest.sol


pragma solidity ^0.8.0;





contract ImmortalsNFT is ERC721URIStorage, Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    // NFT Info
    string public baseURI;
    uint256 public mintPrice = 79000000000000000;
    uint256 public maxSupply;
    uint256 public whitelistMintLimit;
    uint256 public totalMinted;
    // Allocation of Mint Funds
    address payable private team1;
    address payable private team2;
    address payable private team3;
    address payable private team4;

    // Phases of Mints
    bool public whitelistMintLive;
    bool public publicMintLive;

    // Tracking whether someone is Whitelisted/Staked/Presale Claimable.
    mapping(address => bool) public whitelist;
    mapping(address => uint256) internal mintedAmount;
   

    constructor(
        string memory uri_,
        address team1_,
        address team2_,
        address team3_,
        address team4_,
        uint256 _maxSupply,
        uint256 _whitelistMintLimit
    ) ERC721("The Immortals", "X_X") {
        baseURI = uri_;
        team1 = payable(team1_);
        team2 = payable(team2_);
        team3 = payable(team3_);
        team4 = payable(team4_);
        maxSupply = _maxSupply;
        whitelistMintLimit = _whitelistMintLimit;
        
    }

    // Current Minted Amount of NFTS
    function totalSupply() public view returns (uint256) {
        return _tokenIds.current();
    }

    
    
    
    // Function of the team to mint at the start
    function ownerMint(uint256 numberOfTokens) external onlyOwner {
    require(numberOfTokens > 0, "Invalid number of tokens");
    require(totalSupply() + numberOfTokens <= maxSupply, "Maximum supply reached");

    for (uint256 i = 0; i < numberOfTokens; ++i) {
        mint(msg.sender);
    }
}


    // Enabling whitelist minting
    function enableWhitelistMint() public onlyOwner {
        whitelistMintLive = true;
    }

    // Enabling public minting
    function enablePublicMint() public onlyOwner {
        publicMintLive = true;
    }

    // Uploading whitelist users and claimable amounts
    function addToWhitelist(address[] calldata users) external onlyOwner {
    

    for (uint256 i = 0; i < users.length; ++i) {
        address user = users[i];
        require(user != address(0), "Invalid user address");
        whitelist[user] = true;
        
    }
}
    
    

// Whitelist mint function
function whitelistMint() external payable {
    require(whitelistMintLive, "Whitelist minting is not available");
    require(whitelist[msg.sender], "Whitelist minting is not available for the sender");
    require(msg.value >= mintPrice, "Insufficient payment");
    require(totalMinted + 1 <= whitelistMintLimit, "Minting limit reached");

    whitelist[msg.sender] = false;
    mint(msg.sender);
    totalMinted++;
}

// Public mint function
function publicMint() external payable {
    require(publicMintLive, "Public minting is not available");
    require(msg.value >= mintPrice, "Insufficient payment");
    require(totalMinted + 1 <= whitelistMintLimit, "Minting limit reached");

    mint(msg.sender);
    totalMinted++;
}

    // Mint function
    function mint(address recipient) internal {
        require(totalSupply() < maxSupply, "Maximum supply reached");

        _tokenIds.increment();
        uint256 newItemId = _tokenIds.current();
        _mint(recipient, newItemId);
        mintedAmount[recipient] += 1;

        string memory tokenURI = string(abi.encodePacked(baseURI, Strings.toString(newItemId), ".json"));
        _setTokenURI(newItemId, tokenURI);
    }

    // Airdrop tokens to multiple addresses
    function airdrop(address[] calldata recipients, uint256[] calldata amounts) external onlyOwner {
        require(recipients.length == amounts.length, "Arrays length mismatch");

        for (uint256 i = 0; i < recipients.length; ++i) {
            address recipient = recipients[i];
            uint256 amount = amounts[i];
            require(amount > 0 && amount <= 2, "Invalid amount");

            for (uint256 j = 0; j < amount; ++j) {
            mint(recipient);
        }
    }
}
 

    // Withdraw funds from the contract
    function withdraw() public onlyOwner {
        uint256 totalBalance = address(this).balance;
        require(totalBalance > 0, "No funds to withdraw");

                                            //percentages
        uint256 team1Share = (totalBalance * 64) / 100;
        uint256 team2Share = (totalBalance * 20) / 100;
        uint256 team3Share = (totalBalance * 10) / 100;
        uint256 team4Share =(totalBalance * 6) / 100;

        team1.transfer(team1Share);
        team2.transfer(team2Share);
        team3.transfer(team3Share);
        team4.transfer(team4Share);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"uri_","type":"string"},{"internalType":"address","name":"team1_","type":"address"},{"internalType":"address","name":"team2_","type":"address"},{"internalType":"address","name":"team3_","type":"address"},{"internalType":"address","name":"team4_","type":"address"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_whitelistMintLimit","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_toTokenId","type":"uint256"}],"name":"BatchMetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","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":"users","type":"address[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enablePublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableWhitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicMintLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","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":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMintLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052670118aa14d9418000600a553480156200001d57600080fd5b5060405162004dc238038062004dc2833981810160405281019062000043919062000527565b6040518060400160405280600d81526020017f54686520496d6d6f7274616c73000000000000000000000000000000000000008152506040518060400160405280600381526020017f585f5800000000000000000000000000000000000000000000000000000000008152508160009081620000c091906200083a565b508060019081620000d291906200083a565b505050620000f5620000e96200022660201b60201c565b6200022e60201b60201c565b86600990816200010691906200083a565b5085600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600b8190555080600c819055505050505050505062000921565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200035d8262000312565b810181811067ffffffffffffffff821117156200037f576200037e62000323565b5b80604052505050565b600062000394620002f4565b9050620003a2828262000352565b919050565b600067ffffffffffffffff821115620003c557620003c462000323565b5b620003d08262000312565b9050602081019050919050565b60005b83811015620003fd578082015181840152602081019050620003e0565b60008484015250505050565b6000620004206200041a84620003a7565b62000388565b9050828152602081018484840111156200043f576200043e6200030d565b5b6200044c848285620003dd565b509392505050565b600082601f8301126200046c576200046b62000308565b5b81516200047e84826020860162000409565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620004b48262000487565b9050919050565b620004c681620004a7565b8114620004d257600080fd5b50565b600081519050620004e681620004bb565b92915050565b6000819050919050565b6200050181620004ec565b81146200050d57600080fd5b50565b6000815190506200052181620004f6565b92915050565b600080600080600080600060e0888a031215620005495762000548620002fe565b5b600088015167ffffffffffffffff8111156200056a576200056962000303565b5b620005788a828b0162000454565b97505060206200058b8a828b01620004d5565b96505060406200059e8a828b01620004d5565b9550506060620005b18a828b01620004d5565b9450506080620005c48a828b01620004d5565b93505060a0620005d78a828b0162000510565b92505060c0620005ea8a828b0162000510565b91505092959891949750929550565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200064c57607f821691505b60208210810362000662576200066162000604565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006cc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200068d565b620006d886836200068d565b95508019841693508086168417925050509392505050565b6000819050919050565b60006200071b620007156200070f84620004ec565b620006f0565b620004ec565b9050919050565b6000819050919050565b6200073783620006fa565b6200074f620007468262000722565b8484546200069a565b825550505050565b600090565b6200076662000757565b620007738184846200072c565b505050565b5b818110156200079b576200078f6000826200075c565b60018101905062000779565b5050565b601f821115620007ea57620007b48162000668565b620007bf846200067d565b81016020851015620007cf578190505b620007e7620007de856200067d565b83018262000778565b50505b505050565b600082821c905092915050565b60006200080f60001984600802620007ef565b1980831691505092915050565b60006200082a8383620007fc565b9150826002028217905092915050565b6200084582620005f9565b67ffffffffffffffff81111562000861576200086062000323565b5b6200086d825462000633565b6200087a8282856200079f565b600060209050601f831160018114620008b257600084156200089d578287015190505b620008a985826200081c565b86555062000919565b601f198416620008c28662000668565b60005b82811015620008ec57848901518255600182019150602085019450602081019050620008c5565b868310156200090c578489015162000908601f891682620007fc565b8355505b6001600288020188555050505b505050505050565b61449180620009316000396000f3fe6080604052600436106101ee5760003560e01c806370a082311161010d578063a2309ff8116100a0578063d62f3b1c1161006f578063d62f3b1c14610687578063ddd1783a1461069e578063e985e9c5146106c9578063f19e75d414610706578063f2fde38b1461072f576101ee565b8063a2309ff8146105cb578063b88d4fde146105f6578063c87b56dd1461061f578063d5abeb011461065c576101ee565b80638da5cb5b116100dc5780638da5cb5b1461050f57806395d89b411461053a5780639b19251a14610565578063a22cb465146105a2576101ee565b806370a0823114610488578063715018a6146104c55780637f649783146104dc578063804f43cd14610505576101ee565b80633ccfd60b116101855780636352211e116101545780636352211e146103cc57806367243482146104095780636817c76c146104325780636c0360eb1461045d576101ee565b80633ccfd60b1461034a578063419a09601461036157806342842e0e1461038c5780634fee1290146103b5576101ee565b806318160ddd116101c157806318160ddd146102c157806323b872dd146102ec57806326092b831461031557806327c7dde71461031f576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612ac0565b610758565b6040516102279190612b08565b60405180910390f35b34801561023c57600080fd5b506102456107b9565b6040516102529190612bb3565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190612c0b565b61084b565b60405161028f9190612c79565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190612cc0565b610891565b005b3480156102cd57600080fd5b506102d66109a8565b6040516102e39190612d0f565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e9190612d2a565b6109b9565b005b61031d610a19565b005b34801561032b57600080fd5b50610334610b23565b6040516103419190612b08565b60405180910390f35b34801561035657600080fd5b5061035f610b36565b005b34801561036d57600080fd5b50610376610da5565b6040516103839190612b08565b60405180910390f35b34801561039857600080fd5b506103b360048036038101906103ae9190612d2a565b610db8565b005b3480156103c157600080fd5b506103ca610dd8565b005b3480156103d857600080fd5b506103f360048036038101906103ee9190612c0b565b610dfd565b6040516104009190612c79565b60405180910390f35b34801561041557600080fd5b50610430600480360381019061042b9190612e38565b610e83565b005b34801561043e57600080fd5b50610447610fbb565b6040516104549190612d0f565b60405180910390f35b34801561046957600080fd5b50610472610fc1565b60405161047f9190612bb3565b60405180910390f35b34801561049457600080fd5b506104af60048036038101906104aa9190612eb9565b61104f565b6040516104bc9190612d0f565b60405180910390f35b3480156104d157600080fd5b506104da611106565b005b3480156104e857600080fd5b5061050360048036038101906104fe9190612ee6565b61111a565b005b61050d61123a565b005b34801561051b57600080fd5b50610524611428565b6040516105319190612c79565b60405180910390f35b34801561054657600080fd5b5061054f611452565b60405161055c9190612bb3565b60405180910390f35b34801561057157600080fd5b5061058c60048036038101906105879190612eb9565b6114e4565b6040516105999190612b08565b60405180910390f35b3480156105ae57600080fd5b506105c960048036038101906105c49190612f5f565b611504565b005b3480156105d757600080fd5b506105e061151a565b6040516105ed9190612d0f565b60405180910390f35b34801561060257600080fd5b5061061d600480360381019061061891906130cf565b611520565b005b34801561062b57600080fd5b5061064660048036038101906106419190612c0b565b611582565b6040516106539190612bb3565b60405180910390f35b34801561066857600080fd5b50610671611694565b60405161067e9190612d0f565b60405180910390f35b34801561069357600080fd5b5061069c61169a565b005b3480156106aa57600080fd5b506106b36116bf565b6040516106c09190612d0f565b60405180910390f35b3480156106d557600080fd5b506106f060048036038101906106eb9190613152565b6116c5565b6040516106fd9190612b08565b60405180910390f35b34801561071257600080fd5b5061072d60048036038101906107289190612c0b565b611759565b005b34801561073b57600080fd5b5061075660048036038101906107519190612eb9565b611824565b005b6000634906490660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107b257506107b1826118a7565b5b9050919050565b6060600080546107c8906131c1565b80601f01602080910402602001604051908101604052809291908181526020018280546107f4906131c1565b80156108415780601f1061081657610100808354040283529160200191610841565b820191906000526020600020905b81548152906001019060200180831161082457829003601f168201915b5050505050905090565b600061085682611989565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061089c82610dfd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361090c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090390613264565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661092b6119d4565b73ffffffffffffffffffffffffffffffffffffffff16148061095a5750610959816109546119d4565b6116c5565b5b610999576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610990906132f6565b60405180910390fd5b6109a383836119dc565b505050565b60006109b46008611a95565b905090565b6109ca6109c46119d4565b82611aa3565b610a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0090613388565b60405180910390fd5b610a14838383611b38565b505050565b601160159054906101000a900460ff16610a68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5f906133f4565b60405180910390fd5b600a54341015610aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa490613460565b60405180910390fd5b600c546001600d54610abf91906134af565b1115610b00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af79061352f565b60405180910390fd5b610b0933611e31565b600d6000815480929190610b1c9061354f565b9190505550565b601160159054906101000a900460ff1681565b610b3e611f33565b600047905060008111610b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7d906135e3565b60405180910390fd5b60006064604083610b979190613603565b610ba19190613674565b905060006064601484610bb49190613603565b610bbe9190613674565b905060006064600a85610bd19190613603565b610bdb9190613674565b905060006064600686610bee9190613603565b610bf89190613674565b9050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f19350505050158015610c62573d6000803e3d6000fd5b50600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015610ccb573d6000803e3d6000fd5b50601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015610d34573d6000803e3d6000fd5b50601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610d9d573d6000803e3d6000fd5b505050505050565b601160149054906101000a900460ff1681565b610dd383838360405180602001604052806000815250611520565b505050565b610de0611f33565b6001601160146101000a81548160ff021916908315150217905550565b600080610e0983611fb1565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e71906136f1565b60405180910390fd5b80915050919050565b610e8b611f33565b818190508484905014610ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eca9061375d565b60405180910390fd5b60005b84849050811015610fb4576000858583818110610ef657610ef561377d565b5b9050602002016020810190610f0b9190612eb9565b90506000848484818110610f2257610f2161377d565b5b905060200201359050600081118015610f3c575060028111155b610f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f72906137f8565b60405180910390fd5b60005b81811015610fa057610f8f83611e31565b80610f999061354f565b9050610f7e565b50505080610fad9061354f565b9050610ed6565b5050505050565b600a5481565b60098054610fce906131c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610ffa906131c1565b80156110475780601f1061101c57610100808354040283529160200191611047565b820191906000526020600020905b81548152906001019060200180831161102a57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b69061388a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61110e611f33565b6111186000611fee565b565b611122611f33565b60005b828290508110156112355760008383838181106111455761114461377d565b5b905060200201602081019061115a9190612eb9565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c2906138f6565b60405180910390fd5b6001601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550508061122e9061354f565b9050611125565b505050565b601160149054906101000a900460ff16611289576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128090613988565b60405180910390fd5b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130c90613a1a565b60405180910390fd5b600a5434101561135a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135190613460565b60405180910390fd5b600c546001600d5461136c91906134af565b11156113ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a49061352f565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061140e33611e31565b600d60008154809291906114219061354f565b9190505550565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611461906131c1565b80601f016020809104026020016040519081016040528092919081815260200182805461148d906131c1565b80156114da5780601f106114af576101008083540402835291602001916114da565b820191906000526020600020905b8154815290600101906020018083116114bd57829003601f168201915b5050505050905090565b60126020528060005260406000206000915054906101000a900460ff1681565b61151661150f6119d4565b83836120b4565b5050565b600d5481565b61153161152b6119d4565b83611aa3565b611570576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156790613388565b60405180910390fd5b61157c84848484612220565b50505050565b606061158d82611989565b60006006600084815260200190815260200160002080546115ad906131c1565b80601f01602080910402602001604051908101604052809291908181526020018280546115d9906131c1565b80156116265780601f106115fb57610100808354040283529160200191611626565b820191906000526020600020905b81548152906001019060200180831161160957829003601f168201915b50505050509050600061163761227c565b9050600081510361164c57819250505061168f565b600082511115611681578082604051602001611669929190613a76565b6040516020818303038152906040529250505061168f565b61168a84612293565b925050505b919050565b600b5481565b6116a2611f33565b6001601160156101000a81548160ff021916908315150217905550565b600c5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611761611f33565b600081116117a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179b90613ae6565b60405180910390fd5b600b54816117b06109a8565b6117ba91906134af565b11156117fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f290613b52565b60405180910390fd5b60005b818110156118205761180f33611e31565b806118199061354f565b90506117fe565b5050565b61182c611f33565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361189b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189290613be4565b60405180910390fd5b6118a481611fee565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061197257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806119825750611981826122fb565b5b9050919050565b61199281612365565b6119d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c8906136f1565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a4f83610dfd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600080611aaf83610dfd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611af15750611af081856116c5565b5b80611b2f57508373ffffffffffffffffffffffffffffffffffffffff16611b178461084b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b5882610dfd565b73ffffffffffffffffffffffffffffffffffffffff1614611bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba590613c76565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1490613d08565b60405180910390fd5b611c2a83838360016123a6565b8273ffffffffffffffffffffffffffffffffffffffff16611c4a82610dfd565b73ffffffffffffffffffffffffffffffffffffffff1614611ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9790613c76565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e2c83838360016123ac565b505050565b600b54611e3c6109a8565b10611e7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7390613b52565b60405180910390fd5b611e8660086123b2565b6000611e926008611a95565b9050611e9e82826123c8565b6001601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eee91906134af565b9250508190555060006009611f02836125e5565b604051602001611f13929190613e0c565b6040516020818303038152906040529050611f2e82826126b3565b505050565b611f3b6119d4565b73ffffffffffffffffffffffffffffffffffffffff16611f59611428565b73ffffffffffffffffffffffffffffffffffffffff1614611faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa690613e87565b60405180910390fd5b565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612122576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211990613ef3565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122139190612b08565b60405180910390a3505050565b61222b848484611b38565b61223784848484612757565b612276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226d90613f85565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b606061229e82611989565b60006122a861227c565b905060008151116122c857604051806020016040528060008152506122f3565b806122d2846125e5565b6040516020016122e3929190613a76565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff1661238783611fb1565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612437576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242e90613ff1565b60405180910390fd5b61244081612365565b15612480576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124779061405d565b60405180910390fd5b61248e6000838360016123a6565b61249781612365565b156124d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ce9061405d565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125e16000838360016123ac565b5050565b6060600060016125f4846128de565b01905060008167ffffffffffffffff81111561261357612612612fa4565b5b6040519080825280601f01601f1916602001820160405280156126455781602001600182028036833780820191505090505b509050600082602001820190505b6001156126a8578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161269c5761269b613645565b5b04945060008503612653575b819350505050919050565b6126bc82612365565b6126fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f2906140ef565b60405180910390fd5b8060066000848152602001908152602001600020908161271b91906142a6565b507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78260405161274b9190612d0f565b60405180910390a15050565b60006127788473ffffffffffffffffffffffffffffffffffffffff16612a31565b156128d1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127a16119d4565b8786866040518563ffffffff1660e01b81526004016127c394939291906143cd565b6020604051808303816000875af19250505080156127ff57506040513d601f19601f820116820180604052508101906127fc919061442e565b60015b612881573d806000811461282f576040519150601f19603f3d011682016040523d82523d6000602084013e612834565b606091505b506000815103612879576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287090613f85565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128d6565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061293c577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161293257612931613645565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612979576d04ee2d6d415b85acef8100000000838161296f5761296e613645565b5b0492506020810190505b662386f26fc1000083106129a857662386f26fc10000838161299e5761299d613645565b5b0492506010810190505b6305f5e10083106129d1576305f5e10083816129c7576129c6613645565b5b0492506008810190505b61271083106129f65761271083816129ec576129eb613645565b5b0492506004810190505b60648310612a195760648381612a0f57612a0e613645565b5b0492506002810190505b600a8310612a28576001810190505b80915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a9d81612a68565b8114612aa857600080fd5b50565b600081359050612aba81612a94565b92915050565b600060208284031215612ad657612ad5612a5e565b5b6000612ae484828501612aab565b91505092915050565b60008115159050919050565b612b0281612aed565b82525050565b6000602082019050612b1d6000830184612af9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612b5d578082015181840152602081019050612b42565b60008484015250505050565b6000601f19601f8301169050919050565b6000612b8582612b23565b612b8f8185612b2e565b9350612b9f818560208601612b3f565b612ba881612b69565b840191505092915050565b60006020820190508181036000830152612bcd8184612b7a565b905092915050565b6000819050919050565b612be881612bd5565b8114612bf357600080fd5b50565b600081359050612c0581612bdf565b92915050565b600060208284031215612c2157612c20612a5e565b5b6000612c2f84828501612bf6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612c6382612c38565b9050919050565b612c7381612c58565b82525050565b6000602082019050612c8e6000830184612c6a565b92915050565b612c9d81612c58565b8114612ca857600080fd5b50565b600081359050612cba81612c94565b92915050565b60008060408385031215612cd757612cd6612a5e565b5b6000612ce585828601612cab565b9250506020612cf685828601612bf6565b9150509250929050565b612d0981612bd5565b82525050565b6000602082019050612d246000830184612d00565b92915050565b600080600060608486031215612d4357612d42612a5e565b5b6000612d5186828701612cab565b9350506020612d6286828701612cab565b9250506040612d7386828701612bf6565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f840112612da257612da1612d7d565b5b8235905067ffffffffffffffff811115612dbf57612dbe612d82565b5b602083019150836020820283011115612ddb57612dda612d87565b5b9250929050565b60008083601f840112612df857612df7612d7d565b5b8235905067ffffffffffffffff811115612e1557612e14612d82565b5b602083019150836020820283011115612e3157612e30612d87565b5b9250929050565b60008060008060408587031215612e5257612e51612a5e565b5b600085013567ffffffffffffffff811115612e7057612e6f612a63565b5b612e7c87828801612d8c565b9450945050602085013567ffffffffffffffff811115612e9f57612e9e612a63565b5b612eab87828801612de2565b925092505092959194509250565b600060208284031215612ecf57612ece612a5e565b5b6000612edd84828501612cab565b91505092915050565b60008060208385031215612efd57612efc612a5e565b5b600083013567ffffffffffffffff811115612f1b57612f1a612a63565b5b612f2785828601612d8c565b92509250509250929050565b612f3c81612aed565b8114612f4757600080fd5b50565b600081359050612f5981612f33565b92915050565b60008060408385031215612f7657612f75612a5e565b5b6000612f8485828601612cab565b9250506020612f9585828601612f4a565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612fdc82612b69565b810181811067ffffffffffffffff82111715612ffb57612ffa612fa4565b5b80604052505050565b600061300e612a54565b905061301a8282612fd3565b919050565b600067ffffffffffffffff82111561303a57613039612fa4565b5b61304382612b69565b9050602081019050919050565b82818337600083830152505050565b600061307261306d8461301f565b613004565b90508281526020810184848401111561308e5761308d612f9f565b5b613099848285613050565b509392505050565b600082601f8301126130b6576130b5612d7d565b5b81356130c684826020860161305f565b91505092915050565b600080600080608085870312156130e9576130e8612a5e565b5b60006130f787828801612cab565b945050602061310887828801612cab565b935050604061311987828801612bf6565b925050606085013567ffffffffffffffff81111561313a57613139612a63565b5b613146878288016130a1565b91505092959194509250565b6000806040838503121561316957613168612a5e565b5b600061317785828601612cab565b925050602061318885828601612cab565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806131d957607f821691505b6020821081036131ec576131eb613192565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061324e602183612b2e565b9150613259826131f2565b604082019050919050565b6000602082019050818103600083015261327d81613241565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006132e0603d83612b2e565b91506132eb82613284565b604082019050919050565b6000602082019050818103600083015261330f816132d3565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613372602d83612b2e565b915061337d82613316565b604082019050919050565b600060208201905081810360008301526133a181613365565b9050919050565b7f5075626c6963206d696e74696e67206973206e6f7420617661696c61626c6500600082015250565b60006133de601f83612b2e565b91506133e9826133a8565b602082019050919050565b6000602082019050818103600083015261340d816133d1565b9050919050565b7f496e73756666696369656e74207061796d656e74000000000000000000000000600082015250565b600061344a601483612b2e565b915061345582613414565b602082019050919050565b600060208201905081810360008301526134798161343d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006134ba82612bd5565b91506134c583612bd5565b92508282019050808211156134dd576134dc613480565b5b92915050565b7f4d696e74696e67206c696d697420726561636865640000000000000000000000600082015250565b6000613519601583612b2e565b9150613524826134e3565b602082019050919050565b600060208201905081810360008301526135488161350c565b9050919050565b600061355a82612bd5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361358c5761358b613480565b5b600182019050919050565b7f4e6f2066756e647320746f207769746864726177000000000000000000000000600082015250565b60006135cd601483612b2e565b91506135d882613597565b602082019050919050565b600060208201905081810360008301526135fc816135c0565b9050919050565b600061360e82612bd5565b915061361983612bd5565b925082820261362781612bd5565b9150828204841483151761363e5761363d613480565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061367f82612bd5565b915061368a83612bd5565b92508261369a57613699613645565b5b828204905092915050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006136db601883612b2e565b91506136e6826136a5565b602082019050919050565b6000602082019050818103600083015261370a816136ce565b9050919050565b7f417272617973206c656e677468206d69736d6174636800000000000000000000600082015250565b6000613747601683612b2e565b915061375282613711565b602082019050919050565b600060208201905081810360008301526137768161373a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f496e76616c696420616d6f756e74000000000000000000000000000000000000600082015250565b60006137e2600e83612b2e565b91506137ed826137ac565b602082019050919050565b60006020820190508181036000830152613811816137d5565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613874602983612b2e565b915061387f82613818565b604082019050919050565b600060208201905081810360008301526138a381613867565b9050919050565b7f496e76616c696420757365722061646472657373000000000000000000000000600082015250565b60006138e0601483612b2e565b91506138eb826138aa565b602082019050919050565b6000602082019050818103600083015261390f816138d3565b9050919050565b7f57686974656c697374206d696e74696e67206973206e6f7420617661696c616260008201527f6c65000000000000000000000000000000000000000000000000000000000000602082015250565b6000613972602283612b2e565b915061397d82613916565b604082019050919050565b600060208201905081810360008301526139a181613965565b9050919050565b7f57686974656c697374206d696e74696e67206973206e6f7420617661696c616260008201527f6c6520666f72207468652073656e646572000000000000000000000000000000602082015250565b6000613a04603183612b2e565b9150613a0f826139a8565b604082019050919050565b60006020820190508181036000830152613a33816139f7565b9050919050565b600081905092915050565b6000613a5082612b23565b613a5a8185613a3a565b9350613a6a818560208601612b3f565b80840191505092915050565b6000613a828285613a45565b9150613a8e8284613a45565b91508190509392505050565b7f496e76616c6964206e756d626572206f6620746f6b656e730000000000000000600082015250565b6000613ad0601883612b2e565b9150613adb82613a9a565b602082019050919050565b60006020820190508181036000830152613aff81613ac3565b9050919050565b7f4d6178696d756d20737570706c79207265616368656400000000000000000000600082015250565b6000613b3c601683612b2e565b9150613b4782613b06565b602082019050919050565b60006020820190508181036000830152613b6b81613b2f565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613bce602683612b2e565b9150613bd982613b72565b604082019050919050565b60006020820190508181036000830152613bfd81613bc1565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613c60602583612b2e565b9150613c6b82613c04565b604082019050919050565b60006020820190508181036000830152613c8f81613c53565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613cf2602483612b2e565b9150613cfd82613c96565b604082019050919050565b60006020820190508181036000830152613d2181613ce5565b9050919050565b60008190508160005260206000209050919050565b60008154613d4a816131c1565b613d548186613a3a565b94506001821660008114613d6f5760018114613d8457613db7565b60ff1983168652811515820286019350613db7565b613d8d85613d28565b60005b83811015613daf57815481890152600182019150602081019050613d90565b838801955050505b50505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613df6600583613a3a565b9150613e0182613dc0565b600582019050919050565b6000613e188285613d3d565b9150613e248284613a45565b9150613e2f82613de9565b91508190509392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613e71602083612b2e565b9150613e7c82613e3b565b602082019050919050565b60006020820190508181036000830152613ea081613e64565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613edd601983612b2e565b9150613ee882613ea7565b602082019050919050565b60006020820190508181036000830152613f0c81613ed0565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613f6f603283612b2e565b9150613f7a82613f13565b604082019050919050565b60006020820190508181036000830152613f9e81613f62565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613fdb602083612b2e565b9150613fe682613fa5565b602082019050919050565b6000602082019050818103600083015261400a81613fce565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614047601c83612b2e565b915061405282614011565b602082019050919050565b600060208201905081810360008301526140768161403a565b9050919050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b60006140d9602e83612b2e565b91506140e48261407d565b604082019050919050565b60006020820190508181036000830152614108816140cc565b9050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261415c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261411f565b614166868361411f565b95508019841693508086168417925050509392505050565b6000819050919050565b60006141a361419e61419984612bd5565b61417e565b612bd5565b9050919050565b6000819050919050565b6141bd83614188565b6141d16141c9826141aa565b84845461412c565b825550505050565b600090565b6141e66141d9565b6141f18184846141b4565b505050565b5b818110156142155761420a6000826141de565b6001810190506141f7565b5050565b601f82111561425a5761422b81613d28565b6142348461410f565b81016020851015614243578190505b61425761424f8561410f565b8301826141f6565b50505b505050565b600082821c905092915050565b600061427d6000198460080261425f565b1980831691505092915050565b6000614296838361426c565b9150826002028217905092915050565b6142af82612b23565b67ffffffffffffffff8111156142c8576142c7612fa4565b5b6142d282546131c1565b6142dd828285614219565b600060209050601f83116001811461431057600084156142fe578287015190505b614308858261428a565b865550614370565b601f19841661431e86613d28565b60005b8281101561434657848901518255600182019150602085019450602081019050614321565b86831015614363578489015161435f601f89168261426c565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b600082825260208201905092915050565b600061439f82614378565b6143a98185614383565b93506143b9818560208601612b3f565b6143c281612b69565b840191505092915050565b60006080820190506143e26000830187612c6a565b6143ef6020830186612c6a565b6143fc6040830185612d00565b818103606083015261440e8184614394565b905095945050505050565b60008151905061442881612a94565b92915050565b60006020828403121561444457614443612a5e565b5b600061445284828501614419565b9150509291505056fea26469706673582212204c2e17c319ae2391d524c3dd68857a4e56785240738274c3cc2a64b0d200f4db64736f6c6343000813003300000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000e6bb1cb8c00f77451d8016028151a2615c46e435000000000000000000000000cac8219986bdf99ec18849f5414cfa04a135da96000000000000000000000000ee1f2cbecb8dcd3c2faac83d5601c6b448d2ce08000000000000000000000000e361364c3d3f67d0882aadd7576d01c2b5dd48c900000000000000000000000000000000000000000000000000000000000001f40000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000002e68747470733a2f2f7777772e696d6d6f7274616c736e66742e78797a2f6170692f6d6574613f65646974696f6e3d000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101ee5760003560e01c806370a082311161010d578063a2309ff8116100a0578063d62f3b1c1161006f578063d62f3b1c14610687578063ddd1783a1461069e578063e985e9c5146106c9578063f19e75d414610706578063f2fde38b1461072f576101ee565b8063a2309ff8146105cb578063b88d4fde146105f6578063c87b56dd1461061f578063d5abeb011461065c576101ee565b80638da5cb5b116100dc5780638da5cb5b1461050f57806395d89b411461053a5780639b19251a14610565578063a22cb465146105a2576101ee565b806370a0823114610488578063715018a6146104c55780637f649783146104dc578063804f43cd14610505576101ee565b80633ccfd60b116101855780636352211e116101545780636352211e146103cc57806367243482146104095780636817c76c146104325780636c0360eb1461045d576101ee565b80633ccfd60b1461034a578063419a09601461036157806342842e0e1461038c5780634fee1290146103b5576101ee565b806318160ddd116101c157806318160ddd146102c157806323b872dd146102ec57806326092b831461031557806327c7dde71461031f576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612ac0565b610758565b6040516102279190612b08565b60405180910390f35b34801561023c57600080fd5b506102456107b9565b6040516102529190612bb3565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190612c0b565b61084b565b60405161028f9190612c79565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190612cc0565b610891565b005b3480156102cd57600080fd5b506102d66109a8565b6040516102e39190612d0f565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e9190612d2a565b6109b9565b005b61031d610a19565b005b34801561032b57600080fd5b50610334610b23565b6040516103419190612b08565b60405180910390f35b34801561035657600080fd5b5061035f610b36565b005b34801561036d57600080fd5b50610376610da5565b6040516103839190612b08565b60405180910390f35b34801561039857600080fd5b506103b360048036038101906103ae9190612d2a565b610db8565b005b3480156103c157600080fd5b506103ca610dd8565b005b3480156103d857600080fd5b506103f360048036038101906103ee9190612c0b565b610dfd565b6040516104009190612c79565b60405180910390f35b34801561041557600080fd5b50610430600480360381019061042b9190612e38565b610e83565b005b34801561043e57600080fd5b50610447610fbb565b6040516104549190612d0f565b60405180910390f35b34801561046957600080fd5b50610472610fc1565b60405161047f9190612bb3565b60405180910390f35b34801561049457600080fd5b506104af60048036038101906104aa9190612eb9565b61104f565b6040516104bc9190612d0f565b60405180910390f35b3480156104d157600080fd5b506104da611106565b005b3480156104e857600080fd5b5061050360048036038101906104fe9190612ee6565b61111a565b005b61050d61123a565b005b34801561051b57600080fd5b50610524611428565b6040516105319190612c79565b60405180910390f35b34801561054657600080fd5b5061054f611452565b60405161055c9190612bb3565b60405180910390f35b34801561057157600080fd5b5061058c60048036038101906105879190612eb9565b6114e4565b6040516105999190612b08565b60405180910390f35b3480156105ae57600080fd5b506105c960048036038101906105c49190612f5f565b611504565b005b3480156105d757600080fd5b506105e061151a565b6040516105ed9190612d0f565b60405180910390f35b34801561060257600080fd5b5061061d600480360381019061061891906130cf565b611520565b005b34801561062b57600080fd5b5061064660048036038101906106419190612c0b565b611582565b6040516106539190612bb3565b60405180910390f35b34801561066857600080fd5b50610671611694565b60405161067e9190612d0f565b60405180910390f35b34801561069357600080fd5b5061069c61169a565b005b3480156106aa57600080fd5b506106b36116bf565b6040516106c09190612d0f565b60405180910390f35b3480156106d557600080fd5b506106f060048036038101906106eb9190613152565b6116c5565b6040516106fd9190612b08565b60405180910390f35b34801561071257600080fd5b5061072d60048036038101906107289190612c0b565b611759565b005b34801561073b57600080fd5b5061075660048036038101906107519190612eb9565b611824565b005b6000634906490660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107b257506107b1826118a7565b5b9050919050565b6060600080546107c8906131c1565b80601f01602080910402602001604051908101604052809291908181526020018280546107f4906131c1565b80156108415780601f1061081657610100808354040283529160200191610841565b820191906000526020600020905b81548152906001019060200180831161082457829003601f168201915b5050505050905090565b600061085682611989565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061089c82610dfd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361090c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090390613264565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661092b6119d4565b73ffffffffffffffffffffffffffffffffffffffff16148061095a5750610959816109546119d4565b6116c5565b5b610999576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610990906132f6565b60405180910390fd5b6109a383836119dc565b505050565b60006109b46008611a95565b905090565b6109ca6109c46119d4565b82611aa3565b610a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0090613388565b60405180910390fd5b610a14838383611b38565b505050565b601160159054906101000a900460ff16610a68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5f906133f4565b60405180910390fd5b600a54341015610aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa490613460565b60405180910390fd5b600c546001600d54610abf91906134af565b1115610b00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af79061352f565b60405180910390fd5b610b0933611e31565b600d6000815480929190610b1c9061354f565b9190505550565b601160159054906101000a900460ff1681565b610b3e611f33565b600047905060008111610b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7d906135e3565b60405180910390fd5b60006064604083610b979190613603565b610ba19190613674565b905060006064601484610bb49190613603565b610bbe9190613674565b905060006064600a85610bd19190613603565b610bdb9190613674565b905060006064600686610bee9190613603565b610bf89190613674565b9050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f19350505050158015610c62573d6000803e3d6000fd5b50600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015610ccb573d6000803e3d6000fd5b50601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015610d34573d6000803e3d6000fd5b50601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610d9d573d6000803e3d6000fd5b505050505050565b601160149054906101000a900460ff1681565b610dd383838360405180602001604052806000815250611520565b505050565b610de0611f33565b6001601160146101000a81548160ff021916908315150217905550565b600080610e0983611fb1565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e71906136f1565b60405180910390fd5b80915050919050565b610e8b611f33565b818190508484905014610ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eca9061375d565b60405180910390fd5b60005b84849050811015610fb4576000858583818110610ef657610ef561377d565b5b9050602002016020810190610f0b9190612eb9565b90506000848484818110610f2257610f2161377d565b5b905060200201359050600081118015610f3c575060028111155b610f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f72906137f8565b60405180910390fd5b60005b81811015610fa057610f8f83611e31565b80610f999061354f565b9050610f7e565b50505080610fad9061354f565b9050610ed6565b5050505050565b600a5481565b60098054610fce906131c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610ffa906131c1565b80156110475780601f1061101c57610100808354040283529160200191611047565b820191906000526020600020905b81548152906001019060200180831161102a57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b69061388a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61110e611f33565b6111186000611fee565b565b611122611f33565b60005b828290508110156112355760008383838181106111455761114461377d565b5b905060200201602081019061115a9190612eb9565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c2906138f6565b60405180910390fd5b6001601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550508061122e9061354f565b9050611125565b505050565b601160149054906101000a900460ff16611289576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128090613988565b60405180910390fd5b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130c90613a1a565b60405180910390fd5b600a5434101561135a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135190613460565b60405180910390fd5b600c546001600d5461136c91906134af565b11156113ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a49061352f565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061140e33611e31565b600d60008154809291906114219061354f565b9190505550565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611461906131c1565b80601f016020809104026020016040519081016040528092919081815260200182805461148d906131c1565b80156114da5780601f106114af576101008083540402835291602001916114da565b820191906000526020600020905b8154815290600101906020018083116114bd57829003601f168201915b5050505050905090565b60126020528060005260406000206000915054906101000a900460ff1681565b61151661150f6119d4565b83836120b4565b5050565b600d5481565b61153161152b6119d4565b83611aa3565b611570576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156790613388565b60405180910390fd5b61157c84848484612220565b50505050565b606061158d82611989565b60006006600084815260200190815260200160002080546115ad906131c1565b80601f01602080910402602001604051908101604052809291908181526020018280546115d9906131c1565b80156116265780601f106115fb57610100808354040283529160200191611626565b820191906000526020600020905b81548152906001019060200180831161160957829003601f168201915b50505050509050600061163761227c565b9050600081510361164c57819250505061168f565b600082511115611681578082604051602001611669929190613a76565b6040516020818303038152906040529250505061168f565b61168a84612293565b925050505b919050565b600b5481565b6116a2611f33565b6001601160156101000a81548160ff021916908315150217905550565b600c5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611761611f33565b600081116117a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179b90613ae6565b60405180910390fd5b600b54816117b06109a8565b6117ba91906134af565b11156117fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f290613b52565b60405180910390fd5b60005b818110156118205761180f33611e31565b806118199061354f565b90506117fe565b5050565b61182c611f33565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361189b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189290613be4565b60405180910390fd5b6118a481611fee565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061197257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806119825750611981826122fb565b5b9050919050565b61199281612365565b6119d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c8906136f1565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a4f83610dfd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600080611aaf83610dfd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611af15750611af081856116c5565b5b80611b2f57508373ffffffffffffffffffffffffffffffffffffffff16611b178461084b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b5882610dfd565b73ffffffffffffffffffffffffffffffffffffffff1614611bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba590613c76565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1490613d08565b60405180910390fd5b611c2a83838360016123a6565b8273ffffffffffffffffffffffffffffffffffffffff16611c4a82610dfd565b73ffffffffffffffffffffffffffffffffffffffff1614611ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9790613c76565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e2c83838360016123ac565b505050565b600b54611e3c6109a8565b10611e7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7390613b52565b60405180910390fd5b611e8660086123b2565b6000611e926008611a95565b9050611e9e82826123c8565b6001601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eee91906134af565b9250508190555060006009611f02836125e5565b604051602001611f13929190613e0c565b6040516020818303038152906040529050611f2e82826126b3565b505050565b611f3b6119d4565b73ffffffffffffffffffffffffffffffffffffffff16611f59611428565b73ffffffffffffffffffffffffffffffffffffffff1614611faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa690613e87565b60405180910390fd5b565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612122576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211990613ef3565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122139190612b08565b60405180910390a3505050565b61222b848484611b38565b61223784848484612757565b612276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226d90613f85565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b606061229e82611989565b60006122a861227c565b905060008151116122c857604051806020016040528060008152506122f3565b806122d2846125e5565b6040516020016122e3929190613a76565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff1661238783611fb1565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612437576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242e90613ff1565b60405180910390fd5b61244081612365565b15612480576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124779061405d565b60405180910390fd5b61248e6000838360016123a6565b61249781612365565b156124d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ce9061405d565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125e16000838360016123ac565b5050565b6060600060016125f4846128de565b01905060008167ffffffffffffffff81111561261357612612612fa4565b5b6040519080825280601f01601f1916602001820160405280156126455781602001600182028036833780820191505090505b509050600082602001820190505b6001156126a8578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161269c5761269b613645565b5b04945060008503612653575b819350505050919050565b6126bc82612365565b6126fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f2906140ef565b60405180910390fd5b8060066000848152602001908152602001600020908161271b91906142a6565b507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78260405161274b9190612d0f565b60405180910390a15050565b60006127788473ffffffffffffffffffffffffffffffffffffffff16612a31565b156128d1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127a16119d4565b8786866040518563ffffffff1660e01b81526004016127c394939291906143cd565b6020604051808303816000875af19250505080156127ff57506040513d601f19601f820116820180604052508101906127fc919061442e565b60015b612881573d806000811461282f576040519150601f19603f3d011682016040523d82523d6000602084013e612834565b606091505b506000815103612879576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287090613f85565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128d6565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061293c577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161293257612931613645565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612979576d04ee2d6d415b85acef8100000000838161296f5761296e613645565b5b0492506020810190505b662386f26fc1000083106129a857662386f26fc10000838161299e5761299d613645565b5b0492506010810190505b6305f5e10083106129d1576305f5e10083816129c7576129c6613645565b5b0492506008810190505b61271083106129f65761271083816129ec576129eb613645565b5b0492506004810190505b60648310612a195760648381612a0f57612a0e613645565b5b0492506002810190505b600a8310612a28576001810190505b80915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a9d81612a68565b8114612aa857600080fd5b50565b600081359050612aba81612a94565b92915050565b600060208284031215612ad657612ad5612a5e565b5b6000612ae484828501612aab565b91505092915050565b60008115159050919050565b612b0281612aed565b82525050565b6000602082019050612b1d6000830184612af9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612b5d578082015181840152602081019050612b42565b60008484015250505050565b6000601f19601f8301169050919050565b6000612b8582612b23565b612b8f8185612b2e565b9350612b9f818560208601612b3f565b612ba881612b69565b840191505092915050565b60006020820190508181036000830152612bcd8184612b7a565b905092915050565b6000819050919050565b612be881612bd5565b8114612bf357600080fd5b50565b600081359050612c0581612bdf565b92915050565b600060208284031215612c2157612c20612a5e565b5b6000612c2f84828501612bf6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612c6382612c38565b9050919050565b612c7381612c58565b82525050565b6000602082019050612c8e6000830184612c6a565b92915050565b612c9d81612c58565b8114612ca857600080fd5b50565b600081359050612cba81612c94565b92915050565b60008060408385031215612cd757612cd6612a5e565b5b6000612ce585828601612cab565b9250506020612cf685828601612bf6565b9150509250929050565b612d0981612bd5565b82525050565b6000602082019050612d246000830184612d00565b92915050565b600080600060608486031215612d4357612d42612a5e565b5b6000612d5186828701612cab565b9350506020612d6286828701612cab565b9250506040612d7386828701612bf6565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f840112612da257612da1612d7d565b5b8235905067ffffffffffffffff811115612dbf57612dbe612d82565b5b602083019150836020820283011115612ddb57612dda612d87565b5b9250929050565b60008083601f840112612df857612df7612d7d565b5b8235905067ffffffffffffffff811115612e1557612e14612d82565b5b602083019150836020820283011115612e3157612e30612d87565b5b9250929050565b60008060008060408587031215612e5257612e51612a5e565b5b600085013567ffffffffffffffff811115612e7057612e6f612a63565b5b612e7c87828801612d8c565b9450945050602085013567ffffffffffffffff811115612e9f57612e9e612a63565b5b612eab87828801612de2565b925092505092959194509250565b600060208284031215612ecf57612ece612a5e565b5b6000612edd84828501612cab565b91505092915050565b60008060208385031215612efd57612efc612a5e565b5b600083013567ffffffffffffffff811115612f1b57612f1a612a63565b5b612f2785828601612d8c565b92509250509250929050565b612f3c81612aed565b8114612f4757600080fd5b50565b600081359050612f5981612f33565b92915050565b60008060408385031215612f7657612f75612a5e565b5b6000612f8485828601612cab565b9250506020612f9585828601612f4a565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612fdc82612b69565b810181811067ffffffffffffffff82111715612ffb57612ffa612fa4565b5b80604052505050565b600061300e612a54565b905061301a8282612fd3565b919050565b600067ffffffffffffffff82111561303a57613039612fa4565b5b61304382612b69565b9050602081019050919050565b82818337600083830152505050565b600061307261306d8461301f565b613004565b90508281526020810184848401111561308e5761308d612f9f565b5b613099848285613050565b509392505050565b600082601f8301126130b6576130b5612d7d565b5b81356130c684826020860161305f565b91505092915050565b600080600080608085870312156130e9576130e8612a5e565b5b60006130f787828801612cab565b945050602061310887828801612cab565b935050604061311987828801612bf6565b925050606085013567ffffffffffffffff81111561313a57613139612a63565b5b613146878288016130a1565b91505092959194509250565b6000806040838503121561316957613168612a5e565b5b600061317785828601612cab565b925050602061318885828601612cab565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806131d957607f821691505b6020821081036131ec576131eb613192565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061324e602183612b2e565b9150613259826131f2565b604082019050919050565b6000602082019050818103600083015261327d81613241565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006132e0603d83612b2e565b91506132eb82613284565b604082019050919050565b6000602082019050818103600083015261330f816132d3565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613372602d83612b2e565b915061337d82613316565b604082019050919050565b600060208201905081810360008301526133a181613365565b9050919050565b7f5075626c6963206d696e74696e67206973206e6f7420617661696c61626c6500600082015250565b60006133de601f83612b2e565b91506133e9826133a8565b602082019050919050565b6000602082019050818103600083015261340d816133d1565b9050919050565b7f496e73756666696369656e74207061796d656e74000000000000000000000000600082015250565b600061344a601483612b2e565b915061345582613414565b602082019050919050565b600060208201905081810360008301526134798161343d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006134ba82612bd5565b91506134c583612bd5565b92508282019050808211156134dd576134dc613480565b5b92915050565b7f4d696e74696e67206c696d697420726561636865640000000000000000000000600082015250565b6000613519601583612b2e565b9150613524826134e3565b602082019050919050565b600060208201905081810360008301526135488161350c565b9050919050565b600061355a82612bd5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361358c5761358b613480565b5b600182019050919050565b7f4e6f2066756e647320746f207769746864726177000000000000000000000000600082015250565b60006135cd601483612b2e565b91506135d882613597565b602082019050919050565b600060208201905081810360008301526135fc816135c0565b9050919050565b600061360e82612bd5565b915061361983612bd5565b925082820261362781612bd5565b9150828204841483151761363e5761363d613480565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061367f82612bd5565b915061368a83612bd5565b92508261369a57613699613645565b5b828204905092915050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006136db601883612b2e565b91506136e6826136a5565b602082019050919050565b6000602082019050818103600083015261370a816136ce565b9050919050565b7f417272617973206c656e677468206d69736d6174636800000000000000000000600082015250565b6000613747601683612b2e565b915061375282613711565b602082019050919050565b600060208201905081810360008301526137768161373a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f496e76616c696420616d6f756e74000000000000000000000000000000000000600082015250565b60006137e2600e83612b2e565b91506137ed826137ac565b602082019050919050565b60006020820190508181036000830152613811816137d5565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613874602983612b2e565b915061387f82613818565b604082019050919050565b600060208201905081810360008301526138a381613867565b9050919050565b7f496e76616c696420757365722061646472657373000000000000000000000000600082015250565b60006138e0601483612b2e565b91506138eb826138aa565b602082019050919050565b6000602082019050818103600083015261390f816138d3565b9050919050565b7f57686974656c697374206d696e74696e67206973206e6f7420617661696c616260008201527f6c65000000000000000000000000000000000000000000000000000000000000602082015250565b6000613972602283612b2e565b915061397d82613916565b604082019050919050565b600060208201905081810360008301526139a181613965565b9050919050565b7f57686974656c697374206d696e74696e67206973206e6f7420617661696c616260008201527f6c6520666f72207468652073656e646572000000000000000000000000000000602082015250565b6000613a04603183612b2e565b9150613a0f826139a8565b604082019050919050565b60006020820190508181036000830152613a33816139f7565b9050919050565b600081905092915050565b6000613a5082612b23565b613a5a8185613a3a565b9350613a6a818560208601612b3f565b80840191505092915050565b6000613a828285613a45565b9150613a8e8284613a45565b91508190509392505050565b7f496e76616c6964206e756d626572206f6620746f6b656e730000000000000000600082015250565b6000613ad0601883612b2e565b9150613adb82613a9a565b602082019050919050565b60006020820190508181036000830152613aff81613ac3565b9050919050565b7f4d6178696d756d20737570706c79207265616368656400000000000000000000600082015250565b6000613b3c601683612b2e565b9150613b4782613b06565b602082019050919050565b60006020820190508181036000830152613b6b81613b2f565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613bce602683612b2e565b9150613bd982613b72565b604082019050919050565b60006020820190508181036000830152613bfd81613bc1565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613c60602583612b2e565b9150613c6b82613c04565b604082019050919050565b60006020820190508181036000830152613c8f81613c53565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613cf2602483612b2e565b9150613cfd82613c96565b604082019050919050565b60006020820190508181036000830152613d2181613ce5565b9050919050565b60008190508160005260206000209050919050565b60008154613d4a816131c1565b613d548186613a3a565b94506001821660008114613d6f5760018114613d8457613db7565b60ff1983168652811515820286019350613db7565b613d8d85613d28565b60005b83811015613daf57815481890152600182019150602081019050613d90565b838801955050505b50505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613df6600583613a3a565b9150613e0182613dc0565b600582019050919050565b6000613e188285613d3d565b9150613e248284613a45565b9150613e2f82613de9565b91508190509392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613e71602083612b2e565b9150613e7c82613e3b565b602082019050919050565b60006020820190508181036000830152613ea081613e64565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613edd601983612b2e565b9150613ee882613ea7565b602082019050919050565b60006020820190508181036000830152613f0c81613ed0565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613f6f603283612b2e565b9150613f7a82613f13565b604082019050919050565b60006020820190508181036000830152613f9e81613f62565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613fdb602083612b2e565b9150613fe682613fa5565b602082019050919050565b6000602082019050818103600083015261400a81613fce565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614047601c83612b2e565b915061405282614011565b602082019050919050565b600060208201905081810360008301526140768161403a565b9050919050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b60006140d9602e83612b2e565b91506140e48261407d565b604082019050919050565b60006020820190508181036000830152614108816140cc565b9050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261415c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261411f565b614166868361411f565b95508019841693508086168417925050509392505050565b6000819050919050565b60006141a361419e61419984612bd5565b61417e565b612bd5565b9050919050565b6000819050919050565b6141bd83614188565b6141d16141c9826141aa565b84845461412c565b825550505050565b600090565b6141e66141d9565b6141f18184846141b4565b505050565b5b818110156142155761420a6000826141de565b6001810190506141f7565b5050565b601f82111561425a5761422b81613d28565b6142348461410f565b81016020851015614243578190505b61425761424f8561410f565b8301826141f6565b50505b505050565b600082821c905092915050565b600061427d6000198460080261425f565b1980831691505092915050565b6000614296838361426c565b9150826002028217905092915050565b6142af82612b23565b67ffffffffffffffff8111156142c8576142c7612fa4565b5b6142d282546131c1565b6142dd828285614219565b600060209050601f83116001811461431057600084156142fe578287015190505b614308858261428a565b865550614370565b601f19841661431e86613d28565b60005b8281101561434657848901518255600182019150602085019450602081019050614321565b86831015614363578489015161435f601f89168261426c565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b600082825260208201905092915050565b600061439f82614378565b6143a98185614383565b93506143b9818560208601612b3f565b6143c281612b69565b840191505092915050565b60006080820190506143e26000830187612c6a565b6143ef6020830186612c6a565b6143fc6040830185612d00565b818103606083015261440e8184614394565b905095945050505050565b60008151905061442881612a94565b92915050565b60006020828403121561444457614443612a5e565b5b600061445284828501614419565b9150509291505056fea26469706673582212204c2e17c319ae2391d524c3dd68857a4e56785240738274c3cc2a64b0d200f4db64736f6c63430008130033

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

00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000e6bb1cb8c00f77451d8016028151a2615c46e435000000000000000000000000cac8219986bdf99ec18849f5414cfa04a135da96000000000000000000000000ee1f2cbecb8dcd3c2faac83d5601c6b448d2ce08000000000000000000000000e361364c3d3f67d0882aadd7576d01c2b5dd48c900000000000000000000000000000000000000000000000000000000000001f40000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000002e68747470733a2f2f7777772e696d6d6f7274616c736e66742e78797a2f6170692f6d6574613f65646974696f6e3d000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : uri_ (string): https://www.immortalsnft.xyz/api/meta?edition=
Arg [1] : team1_ (address): 0xe6bB1cB8C00f77451D8016028151a2615C46e435
Arg [2] : team2_ (address): 0xCAC8219986bdF99Ec18849F5414CFA04a135da96
Arg [3] : team3_ (address): 0xeE1F2cbECB8dCd3c2faAc83D5601C6b448d2Ce08
Arg [4] : team4_ (address): 0xE361364c3D3f67D0882aAdd7576D01c2B5DD48c9
Arg [5] : _maxSupply (uint256): 500
Arg [6] : _whitelistMintLimit (uint256): 85

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [1] : 000000000000000000000000e6bb1cb8c00f77451d8016028151a2615c46e435
Arg [2] : 000000000000000000000000cac8219986bdf99ec18849f5414cfa04a135da96
Arg [3] : 000000000000000000000000ee1f2cbecb8dcd3c2faac83d5601c6b448d2ce08
Arg [4] : 000000000000000000000000e361364c3d3f67d0882aadd7576d01c2b5dd48c9
Arg [5] : 00000000000000000000000000000000000000000000000000000000000001f4
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000055
Arg [7] : 000000000000000000000000000000000000000000000000000000000000002e
Arg [8] : 68747470733a2f2f7777772e696d6d6f7274616c736e66742e78797a2f617069
Arg [9] : 2f6d6574613f65646974696f6e3d000000000000000000000000000000000000


Deployed Bytecode Sourcemap

59816:4898:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57961:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42156:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43668:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43186:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61173:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44368:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62751:293;;;:::i;:::-;;60398:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64114:597;;;;;;;;;;;;;:::i;:::-;;60362:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44774:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61693:91;;;;;;;;;;;;;:::i;:::-;;41866:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63562:500;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60004:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59976:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41597:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19544:103;;;;;;;;;;;;;:::i;:::-;;61973:277;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62294:428;;;:::i;:::-;;18896:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42325:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60507:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43911:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60126:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45030:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58239:624;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60055:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61824:85;;;;;;;;;;;;;:::i;:::-;;60086:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44137:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61347:301;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19802:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57961:207;58063:4;58109:10;58102:18;;58087:33;;;:11;:33;;;;:73;;;;58124:36;58148:11;58124:23;:36::i;:::-;58087:73;58080:80;;57961:207;;;:::o;42156:100::-;42210:13;42243:5;42236:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42156:100;:::o;43668:171::-;43744:7;43764:23;43779:7;43764:14;:23::i;:::-;43807:15;:24;43823:7;43807:24;;;;;;;;;;;;;;;;;;;;;43800:31;;43668:171;;;:::o;43186:416::-;43267:13;43283:23;43298:7;43283:14;:23::i;:::-;43267:39;;43331:5;43325:11;;:2;:11;;;43317:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;43425:5;43409:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;43434:37;43451:5;43458:12;:10;:12::i;:::-;43434:16;:37::i;:::-;43409:62;43387:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;43573:21;43582:2;43586:7;43573:8;:21::i;:::-;43256:346;43186:416;;:::o;61173:98::-;61217:7;61244:19;:9;:17;:19::i;:::-;61237:26;;61173:98;:::o;44368:335::-;44563:41;44582:12;:10;:12::i;:::-;44596:7;44563:18;:41::i;:::-;44555:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;44667:28;44677:4;44683:2;44687:7;44667:9;:28::i;:::-;44368:335;;;:::o;62751:293::-;62805:14;;;;;;;;;;;62797:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;62883:9;;62870;:22;;62862:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;62951:18;;62946:1;62932:11;;:15;;;;:::i;:::-;:37;;62924:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;63004:16;63009:10;63004:4;:16::i;:::-;63027:11;;:13;;;;;;;;;:::i;:::-;;;;;;62751:293::o;60398:26::-;;;;;;;;;;;;;:::o;64114:597::-;18782:13;:11;:13::i;:::-;64162:20:::1;64185:21;64162:44;;64240:1;64225:12;:16;64217:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;64338:18;64381:3;64375:2;64360:12;:17;;;;:::i;:::-;64359:25;;;;:::i;:::-;64338:46;;64395:18;64438:3;64432:2;64417:12;:17;;;;:::i;:::-;64416:25;;;;:::i;:::-;64395:46;;64452:18;64495:3;64489:2;64474:12;:17;;;;:::i;:::-;64473:25;;;;:::i;:::-;64452:46;;64509:18;64550:3;64545:1;64530:12;:16;;;;:::i;:::-;64529:24;;;;:::i;:::-;64509:44;;64566:5;;;;;;;;;;;:14;;:26;64581:10;64566:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;64603:5;;;;;;;;;;;:14;;:26;64618:10;64603:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;64640:5;;;;;;;;;;;:14;;:26;64655:10;64640:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;64677:5;;;;;;;;;;;:14;;:26;64692:10;64677:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;64151:560;;;;;64114:597::o:0;60362:29::-;;;;;;;;;;;;;:::o;44774:185::-;44912:39;44929:4;44935:2;44939:7;44912:39;;;;;;;;;;;;:16;:39::i;:::-;44774:185;;;:::o;61693:91::-;18782:13;:11;:13::i;:::-;61772:4:::1;61752:17;;:24;;;;;;;;;;;;;;;;;;61693:91::o:0;41866:223::-;41938:7;41958:13;41974:17;41983:7;41974:8;:17::i;:::-;41958:33;;42027:1;42010:19;;:5;:19;;;42002:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;42076:5;42069:12;;;41866:223;;;:::o;63562:500::-;18782:13;:11;:13::i;:::-;63697:7:::1;;:14;;63676:10;;:17;;:35;63668:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;63756:9;63751:308;63775:10;;:17;;63771:1;:21;63751:308;;;63814:17;63834:10;;63845:1;63834:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;63814:33;;63862:14;63879:7;;63887:1;63879:10;;;;;;;:::i;:::-;;;;;;;;63862:27;;63921:1;63912:6;:10;:25;;;;;63936:1;63926:6;:11;;63912:25;63904:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;63978:9;63973:79;63997:6;63993:1;:10;63973:79;;;64025:15;64030:9;64025:4;:15::i;:::-;64005:3;;;;:::i;:::-;;;63973:79;;;;63799:260;;63794:3;;;;:::i;:::-;;;63751:308;;;;63562:500:::0;;;;:::o;60004:44::-;;;;:::o;59976:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41597:207::-;41669:7;41714:1;41697:19;;:5;:19;;;41689:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41780:9;:16;41790:5;41780:16;;;;;;;;;;;;;;;;41773:23;;41597:207;;;:::o;19544:103::-;18782:13;:11;:13::i;:::-;19609:30:::1;19636:1;19609:18;:30::i;:::-;19544:103::o:0;61973:277::-;18782:13;:11;:13::i;:::-;62062:9:::1;62057:190;62081:5;;:12;;62077:1;:16;62057:190;;;62111:12;62126:5;;62132:1;62126:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;62111:23;;62169:1;62153:18;;:4;:18;;::::0;62145:51:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;62225:4;62207:9;:15;62217:4;62207:15;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;62100:147;62095:3;;;;:::i;:::-;;;62057:190;;;;61973:277:::0;;:::o;62294:428::-;62351:17;;;;;;;;;;;62343:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;62422:9;:21;62432:10;62422:21;;;;;;;;;;;;;;;;;;;;;;;;;62414:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;62525:9;;62512;:22;;62504:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;62593:18;;62588:1;62574:11;;:15;;;;:::i;:::-;:37;;62566:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;62670:5;62646:9;:21;62656:10;62646:21;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;62682:16;62687:10;62682:4;:16::i;:::-;62705:11;;:13;;;;;;;;;:::i;:::-;;;;;;62294:428::o;18896:87::-;18942:7;18969:6;;;;;;;;;;;18962:13;;18896:87;:::o;42325:104::-;42381:13;42414:7;42407:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42325:104;:::o;60507:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;43911:155::-;44006:52;44025:12;:10;:12::i;:::-;44039:8;44049;44006:18;:52::i;:::-;43911:155;;:::o;60126:26::-;;;;:::o;45030:322::-;45204:41;45223:12;:10;:12::i;:::-;45237:7;45204:18;:41::i;:::-;45196:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;45306:38;45320:4;45326:2;45330:7;45339:4;45306:13;:38::i;:::-;45030:322;;;;:::o;58239:624::-;58312:13;58338:23;58353:7;58338:14;:23::i;:::-;58374;58400:10;:19;58411:7;58400:19;;;;;;;;;;;58374:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58430:18;58451:10;:8;:10::i;:::-;58430:31;;58559:1;58543:4;58537:18;:23;58533:72;;58584:9;58577:16;;;;;;58533:72;58735:1;58715:9;58709:23;:27;58705:108;;;58784:4;58790:9;58767:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58753:48;;;;;;58705:108;58832:23;58847:7;58832:14;:23::i;:::-;58825:30;;;;58239:624;;;;:::o;60055:24::-;;;;:::o;61824:85::-;18782:13;:11;:13::i;:::-;61897:4:::1;61880:14;;:21;;;;;;;;;;;;;;;;;;61824:85::o:0;60086:33::-;;;;:::o;44137:164::-;44234:4;44258:18;:25;44277:5;44258:25;;;;;;;;;;;;;;;:35;44284:8;44258:35;;;;;;;;;;;;;;;;;;;;;;;;;44251:42;;44137:164;;;;:::o;61347:301::-;18782:13;:11;:13::i;:::-;61441:1:::1;61424:14;:18;61416:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;61520:9;;61502:14;61486:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:43;;61478:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;61570:9;61565:80;61589:14;61585:1;:18;61565:80;;;61621:16;61626:10;61621:4;:16::i;:::-;61605:3;;;;:::i;:::-;;;61565:80;;;;61347:301:::0;:::o;19802:201::-;18782:13;:11;:13::i;:::-;19911:1:::1;19891:22;;:8;:22;;::::0;19883:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;19967:28;19986:8;19967:18;:28::i;:::-;19802:201:::0;:::o;41228:305::-;41330:4;41382:25;41367:40;;;:11;:40;;;;:105;;;;41439:33;41424:48;;;:11;:48;;;;41367:105;:158;;;;41489:36;41513:11;41489:23;:36::i;:::-;41367:158;41347:178;;41228:305;;;:::o;53487:135::-;53569:16;53577:7;53569;:16::i;:::-;53561:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;53487:135;:::o;17447:98::-;17500:7;17527:10;17520:17;;17447:98;:::o;52766:174::-;52868:2;52841:15;:24;52857:7;52841:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;52924:7;52920:2;52886:46;;52895:23;52910:7;52895:14;:23::i;:::-;52886:46;;;;;;;;;;;;52766:174;;:::o;976:114::-;1041:7;1068;:14;;;1061:21;;976:114;;;:::o;47385:264::-;47478:4;47495:13;47511:23;47526:7;47511:14;:23::i;:::-;47495:39;;47564:5;47553:16;;:7;:16;;;:52;;;;47573:32;47590:5;47597:7;47573:16;:32::i;:::-;47553:52;:87;;;;47633:7;47609:31;;:20;47621:7;47609:11;:20::i;:::-;:31;;;47553:87;47545:96;;;47385:264;;;;:::o;51384:1263::-;51543:4;51516:31;;:23;51531:7;51516:14;:23::i;:::-;:31;;;51508:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;51622:1;51608:16;;:2;:16;;;51600:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;51678:42;51699:4;51705:2;51709:7;51718:1;51678:20;:42::i;:::-;51850:4;51823:31;;:23;51838:7;51823:14;:23::i;:::-;:31;;;51815:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;51968:15;:24;51984:7;51968:24;;;;;;;;;;;;51961:31;;;;;;;;;;;52463:1;52444:9;:15;52454:4;52444:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;52496:1;52479:9;:13;52489:2;52479:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;52538:2;52519:7;:16;52527:7;52519:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;52577:7;52573:2;52558:27;;52567:4;52558:27;;;;;;;;;;;;52598:41;52618:4;52624:2;52628:7;52637:1;52598:19;:41::i;:::-;51384:1263;;;:::o;63074:435::-;63151:9;;63135:13;:11;:13::i;:::-;:25;63127:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;63200:21;:9;:19;:21::i;:::-;63232:17;63252:19;:9;:17;:19::i;:::-;63232:39;;63282:27;63288:9;63299;63282:5;:27::i;:::-;63347:1;63320:12;:23;63333:9;63320:23;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;63361:22;63410:7;63419:27;63436:9;63419:16;:27::i;:::-;63393:63;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63361:96;;63468:33;63481:9;63492:8;63468:12;:33::i;:::-;63116:393;;63074:435;:::o;19061:132::-;19136:12;:10;:12::i;:::-;19125:23;;:7;:5;:7::i;:::-;:23;;;19117:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19061:132::o;46660:117::-;46726:7;46753;:16;46761:7;46753:16;;;;;;;;;;;;;;;;;;;;;46746:23;;46660:117;;;:::o;20163:191::-;20237:16;20256:6;;;;;;;;;;;20237:25;;20282:8;20273:6;;:17;;;;;;;;;;;;;;;;;;20337:8;20306:40;;20327:8;20306:40;;;;;;;;;;;;20226:128;20163:191;:::o;53083:315::-;53238:8;53229:17;;:5;:17;;;53221:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;53325:8;53287:18;:25;53306:5;53287:25;;;;;;;;;;;;;;;:35;53313:8;53287:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;53371:8;53349:41;;53364:5;53349:41;;;53381:8;53349:41;;;;;;:::i;:::-;;;;;;;;53083:315;;;:::o;46233:313::-;46389:28;46399:4;46405:2;46409:7;46389:9;:28::i;:::-;46436:47;46459:4;46465:2;46469:7;46478:4;46436:22;:47::i;:::-;46428:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;46233:313;;;;:::o;43030:94::-;43081:13;43107:9;;;;;;;;;;;;;;43030:94;:::o;42500:281::-;42573:13;42599:23;42614:7;42599:14;:23::i;:::-;42635:21;42659:10;:8;:10::i;:::-;42635:34;;42711:1;42693:7;42687:21;:25;:86;;;;;;;;;;;;;;;;;42739:7;42748:18;:7;:16;:18::i;:::-;42722:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42687:86;42680:93;;;42500:281;;;:::o;32776:157::-;32861:4;32900:25;32885:40;;;:11;:40;;;;32878:47;;32776:157;;;:::o;47090:128::-;47155:4;47208:1;47179:31;;:17;47188:7;47179:8;:17::i;:::-;:31;;;;47172:38;;47090:128;;;:::o;55771:159::-;;;;;:::o;56652:158::-;;;;;:::o;1098:127::-;1205:1;1187:7;:14;;;:19;;;;;;;;;;;1098:127;:::o;48983:942::-;49077:1;49063:16;;:2;:16;;;49055:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;49136:16;49144:7;49136;:16::i;:::-;49135:17;49127:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;49198:48;49227:1;49231:2;49235:7;49244:1;49198:20;:48::i;:::-;49345:16;49353:7;49345;:16::i;:::-;49344:17;49336:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;49760:1;49743:9;:13;49753:2;49743:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;49804:2;49785:7;:16;49793:7;49785:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;49849:7;49845:2;49824:33;;49841:1;49824:33;;;;;;;;;;;;49870:47;49898:1;49902:2;49906:7;49915:1;49870:19;:47::i;:::-;48983:942;;:::o;14874:716::-;14930:13;14981:14;15018:1;14998:17;15009:5;14998:10;:17::i;:::-;:21;14981:38;;15034:20;15068:6;15057:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15034:41;;15090:11;15219:6;15215:2;15211:15;15203:6;15199:28;15192:35;;15256:288;15263:4;15256:288;;;15288:5;;;;;;;;15430:8;15425:2;15418:5;15414:14;15409:30;15404:3;15396:44;15486:2;15477:11;;;;;;:::i;:::-;;;;;15520:1;15511:5;:10;15256:288;15507:21;15256:288;15565:6;15558:13;;;;;14874:716;;;:::o;59059:258::-;59159:16;59167:7;59159;:16::i;:::-;59151:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;59259:9;59237:10;:19;59248:7;59237:19;;;;;;;;;;;:31;;;;;;:::i;:::-;;59286:23;59301:7;59286:23;;;;;;:::i;:::-;;;;;;;;59059:258;;:::o;54186:853::-;54340:4;54361:15;:2;:13;;;:15::i;:::-;54357:675;;;54413:2;54397:36;;;54434:12;:10;:12::i;:::-;54448:4;54454:7;54463:4;54397:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;54393:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54655:1;54638:6;:13;:18;54634:328;;54681:60;;;;;;;;;;:::i;:::-;;;;;;;;54634:328;54912:6;54906:13;54897:6;54893:2;54889:15;54882:38;54393:584;54529:41;;;54519:51;;;:6;:51;;;;54512:58;;;;;54357:675;55016:4;55009:11;;54186:853;;;;;;;:::o;11740:922::-;11793:7;11813:14;11830:1;11813:18;;11880:6;11871:5;:15;11867:102;;11916:6;11907:15;;;;;;:::i;:::-;;;;;11951:2;11941:12;;;;11867:102;11996:6;11987:5;:15;11983:102;;12032:6;12023:15;;;;;;:::i;:::-;;;;;12067:2;12057:12;;;;11983:102;12112:6;12103:5;:15;12099:102;;12148:6;12139:15;;;;;;:::i;:::-;;;;;12183:2;12173:12;;;;12099:102;12228:5;12219;:14;12215:99;;12263:5;12254:14;;;;;;:::i;:::-;;;;;12297:1;12287:11;;;;12215:99;12341:5;12332;:14;12328:99;;12376:5;12367:14;;;;;;:::i;:::-;;;;;12410:1;12400:11;;;;12328:99;12454:5;12445;:14;12441:99;;12489:5;12480:14;;;;;;:::i;:::-;;;;;12523:1;12513:11;;;;12441:99;12567:5;12558;:14;12554:66;;12603:1;12593:11;;;;12554:66;12648:6;12641:13;;;11740:922;;;:::o;21594:326::-;21654:4;21911:1;21889:7;:19;;;:23;21882:30;;21594:326;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:117::-;5976:1;5973;5966:12;5990:117;6099:1;6096;6089:12;6113:117;6222:1;6219;6212:12;6253:568;6326:8;6336:6;6386:3;6379:4;6371:6;6367:17;6363:27;6353:122;;6394:79;;:::i;:::-;6353:122;6507:6;6494:20;6484:30;;6537:18;6529:6;6526:30;6523:117;;;6559:79;;:::i;:::-;6523:117;6673:4;6665:6;6661:17;6649:29;;6727:3;6719:4;6711:6;6707:17;6697:8;6693:32;6690:41;6687:128;;;6734:79;;:::i;:::-;6687:128;6253:568;;;;;:::o;6844:::-;6917:8;6927:6;6977:3;6970:4;6962:6;6958:17;6954:27;6944:122;;6985:79;;:::i;:::-;6944:122;7098:6;7085:20;7075:30;;7128:18;7120:6;7117:30;7114:117;;;7150:79;;:::i;:::-;7114:117;7264:4;7256:6;7252:17;7240:29;;7318:3;7310:4;7302:6;7298:17;7288:8;7284:32;7281:41;7278:128;;;7325:79;;:::i;:::-;7278:128;6844:568;;;;;:::o;7418:934::-;7540:6;7548;7556;7564;7613:2;7601:9;7592:7;7588:23;7584:32;7581:119;;;7619:79;;:::i;:::-;7581:119;7767:1;7756:9;7752:17;7739:31;7797:18;7789:6;7786:30;7783:117;;;7819:79;;:::i;:::-;7783:117;7932:80;8004:7;7995:6;7984:9;7980:22;7932:80;:::i;:::-;7914:98;;;;7710:312;8089:2;8078:9;8074:18;8061:32;8120:18;8112:6;8109:30;8106:117;;;8142:79;;:::i;:::-;8106:117;8255:80;8327:7;8318:6;8307:9;8303:22;8255:80;:::i;:::-;8237:98;;;;8032:313;7418:934;;;;;;;:::o;8358:329::-;8417:6;8466:2;8454:9;8445:7;8441:23;8437:32;8434:119;;;8472:79;;:::i;:::-;8434:119;8592:1;8617:53;8662:7;8653:6;8642:9;8638:22;8617:53;:::i;:::-;8607:63;;8563:117;8358:329;;;;:::o;8693:559::-;8779:6;8787;8836:2;8824:9;8815:7;8811:23;8807:32;8804:119;;;8842:79;;:::i;:::-;8804:119;8990:1;8979:9;8975:17;8962:31;9020:18;9012:6;9009:30;9006:117;;;9042:79;;:::i;:::-;9006:117;9155:80;9227:7;9218:6;9207:9;9203:22;9155:80;:::i;:::-;9137:98;;;;8933:312;8693:559;;;;;:::o;9258:116::-;9328:21;9343:5;9328:21;:::i;:::-;9321:5;9318:32;9308:60;;9364:1;9361;9354:12;9308:60;9258:116;:::o;9380:133::-;9423:5;9461:6;9448:20;9439:29;;9477:30;9501:5;9477:30;:::i;:::-;9380:133;;;;:::o;9519:468::-;9584:6;9592;9641:2;9629:9;9620:7;9616:23;9612:32;9609:119;;;9647:79;;:::i;:::-;9609:119;9767:1;9792:53;9837:7;9828:6;9817:9;9813:22;9792:53;:::i;:::-;9782:63;;9738:117;9894:2;9920:50;9962:7;9953:6;9942:9;9938:22;9920:50;:::i;:::-;9910:60;;9865:115;9519:468;;;;;:::o;9993:117::-;10102:1;10099;10092:12;10116:180;10164:77;10161:1;10154:88;10261:4;10258:1;10251:15;10285:4;10282:1;10275:15;10302:281;10385:27;10407:4;10385:27;:::i;:::-;10377:6;10373:40;10515:6;10503:10;10500:22;10479:18;10467:10;10464:34;10461:62;10458:88;;;10526:18;;:::i;:::-;10458:88;10566:10;10562:2;10555:22;10345:238;10302:281;;:::o;10589:129::-;10623:6;10650:20;;:::i;:::-;10640:30;;10679:33;10707:4;10699:6;10679:33;:::i;:::-;10589:129;;;:::o;10724:307::-;10785:4;10875:18;10867:6;10864:30;10861:56;;;10897:18;;:::i;:::-;10861:56;10935:29;10957:6;10935:29;:::i;:::-;10927:37;;11019:4;11013;11009:15;11001:23;;10724:307;;;:::o;11037:146::-;11134:6;11129:3;11124;11111:30;11175:1;11166:6;11161:3;11157:16;11150:27;11037:146;;;:::o;11189:423::-;11266:5;11291:65;11307:48;11348:6;11307:48;:::i;:::-;11291:65;:::i;:::-;11282:74;;11379:6;11372:5;11365:21;11417:4;11410:5;11406:16;11455:3;11446:6;11441:3;11437:16;11434:25;11431:112;;;11462:79;;:::i;:::-;11431:112;11552:54;11599:6;11594:3;11589;11552:54;:::i;:::-;11272:340;11189:423;;;;;:::o;11631:338::-;11686:5;11735:3;11728:4;11720:6;11716:17;11712:27;11702:122;;11743:79;;:::i;:::-;11702:122;11860:6;11847:20;11885:78;11959:3;11951:6;11944:4;11936:6;11932:17;11885:78;:::i;:::-;11876:87;;11692:277;11631:338;;;;:::o;11975:943::-;12070:6;12078;12086;12094;12143:3;12131:9;12122:7;12118:23;12114:33;12111:120;;;12150:79;;:::i;:::-;12111:120;12270:1;12295:53;12340:7;12331:6;12320:9;12316:22;12295:53;:::i;:::-;12285:63;;12241:117;12397:2;12423:53;12468:7;12459:6;12448:9;12444:22;12423:53;:::i;:::-;12413:63;;12368:118;12525:2;12551:53;12596:7;12587:6;12576:9;12572:22;12551:53;:::i;:::-;12541:63;;12496:118;12681:2;12670:9;12666:18;12653:32;12712:18;12704:6;12701:30;12698:117;;;12734:79;;:::i;:::-;12698:117;12839:62;12893:7;12884:6;12873:9;12869:22;12839:62;:::i;:::-;12829:72;;12624:287;11975:943;;;;;;;:::o;12924:474::-;12992:6;13000;13049:2;13037:9;13028:7;13024:23;13020:32;13017:119;;;13055:79;;:::i;:::-;13017:119;13175:1;13200:53;13245:7;13236:6;13225:9;13221:22;13200:53;:::i;:::-;13190:63;;13146:117;13302:2;13328:53;13373:7;13364:6;13353:9;13349:22;13328:53;:::i;:::-;13318:63;;13273:118;12924:474;;;;;:::o;13404:180::-;13452:77;13449:1;13442:88;13549:4;13546:1;13539:15;13573:4;13570:1;13563:15;13590:320;13634:6;13671:1;13665:4;13661:12;13651:22;;13718:1;13712:4;13708:12;13739:18;13729:81;;13795:4;13787:6;13783:17;13773:27;;13729:81;13857:2;13849:6;13846:14;13826:18;13823:38;13820:84;;13876:18;;:::i;:::-;13820:84;13641:269;13590:320;;;:::o;13916:220::-;14056:34;14052:1;14044:6;14040:14;14033:58;14125:3;14120:2;14112:6;14108:15;14101:28;13916:220;:::o;14142:366::-;14284:3;14305:67;14369:2;14364:3;14305:67;:::i;:::-;14298:74;;14381:93;14470:3;14381:93;:::i;:::-;14499:2;14494:3;14490:12;14483:19;;14142:366;;;:::o;14514:419::-;14680:4;14718:2;14707:9;14703:18;14695:26;;14767:9;14761:4;14757:20;14753:1;14742:9;14738:17;14731:47;14795:131;14921:4;14795:131;:::i;:::-;14787:139;;14514:419;;;:::o;14939:248::-;15079:34;15075:1;15067:6;15063:14;15056:58;15148:31;15143:2;15135:6;15131:15;15124:56;14939:248;:::o;15193:366::-;15335:3;15356:67;15420:2;15415:3;15356:67;:::i;:::-;15349:74;;15432:93;15521:3;15432:93;:::i;:::-;15550:2;15545:3;15541:12;15534:19;;15193:366;;;:::o;15565:419::-;15731:4;15769:2;15758:9;15754:18;15746:26;;15818:9;15812:4;15808:20;15804:1;15793:9;15789:17;15782:47;15846:131;15972:4;15846:131;:::i;:::-;15838:139;;15565:419;;;:::o;15990:232::-;16130:34;16126:1;16118:6;16114:14;16107:58;16199:15;16194:2;16186:6;16182:15;16175:40;15990:232;:::o;16228:366::-;16370:3;16391:67;16455:2;16450:3;16391:67;:::i;:::-;16384:74;;16467:93;16556:3;16467:93;:::i;:::-;16585:2;16580:3;16576:12;16569:19;;16228:366;;;:::o;16600:419::-;16766:4;16804:2;16793:9;16789:18;16781:26;;16853:9;16847:4;16843:20;16839:1;16828:9;16824:17;16817:47;16881:131;17007:4;16881:131;:::i;:::-;16873:139;;16600:419;;;:::o;17025:181::-;17165:33;17161:1;17153:6;17149:14;17142:57;17025:181;:::o;17212:366::-;17354:3;17375:67;17439:2;17434:3;17375:67;:::i;:::-;17368:74;;17451:93;17540:3;17451:93;:::i;:::-;17569:2;17564:3;17560:12;17553:19;;17212:366;;;:::o;17584:419::-;17750:4;17788:2;17777:9;17773:18;17765:26;;17837:9;17831:4;17827:20;17823:1;17812:9;17808:17;17801:47;17865:131;17991:4;17865:131;:::i;:::-;17857:139;;17584:419;;;:::o;18009:170::-;18149:22;18145:1;18137:6;18133:14;18126:46;18009:170;:::o;18185:366::-;18327:3;18348:67;18412:2;18407:3;18348:67;:::i;:::-;18341:74;;18424:93;18513:3;18424:93;:::i;:::-;18542:2;18537:3;18533:12;18526:19;;18185:366;;;:::o;18557:419::-;18723:4;18761:2;18750:9;18746:18;18738:26;;18810:9;18804:4;18800:20;18796:1;18785:9;18781:17;18774:47;18838:131;18964:4;18838:131;:::i;:::-;18830:139;;18557:419;;;:::o;18982:180::-;19030:77;19027:1;19020:88;19127:4;19124:1;19117:15;19151:4;19148:1;19141:15;19168:191;19208:3;19227:20;19245:1;19227:20;:::i;:::-;19222:25;;19261:20;19279:1;19261:20;:::i;:::-;19256:25;;19304:1;19301;19297:9;19290:16;;19325:3;19322:1;19319:10;19316:36;;;19332:18;;:::i;:::-;19316:36;19168:191;;;;:::o;19365:171::-;19505:23;19501:1;19493:6;19489:14;19482:47;19365:171;:::o;19542:366::-;19684:3;19705:67;19769:2;19764:3;19705:67;:::i;:::-;19698:74;;19781:93;19870:3;19781:93;:::i;:::-;19899:2;19894:3;19890:12;19883:19;;19542:366;;;:::o;19914:419::-;20080:4;20118:2;20107:9;20103:18;20095:26;;20167:9;20161:4;20157:20;20153:1;20142:9;20138:17;20131:47;20195:131;20321:4;20195:131;:::i;:::-;20187:139;;19914:419;;;:::o;20339:233::-;20378:3;20401:24;20419:5;20401:24;:::i;:::-;20392:33;;20447:66;20440:5;20437:77;20434:103;;20517:18;;:::i;:::-;20434:103;20564:1;20557:5;20553:13;20546:20;;20339:233;;;:::o;20578:170::-;20718:22;20714:1;20706:6;20702:14;20695:46;20578:170;:::o;20754:366::-;20896:3;20917:67;20981:2;20976:3;20917:67;:::i;:::-;20910:74;;20993:93;21082:3;20993:93;:::i;:::-;21111:2;21106:3;21102:12;21095:19;;20754:366;;;:::o;21126:419::-;21292:4;21330:2;21319:9;21315:18;21307:26;;21379:9;21373:4;21369:20;21365:1;21354:9;21350:17;21343:47;21407:131;21533:4;21407:131;:::i;:::-;21399:139;;21126:419;;;:::o;21551:410::-;21591:7;21614:20;21632:1;21614:20;:::i;:::-;21609:25;;21648:20;21666:1;21648:20;:::i;:::-;21643:25;;21703:1;21700;21696:9;21725:30;21743:11;21725:30;:::i;:::-;21714:41;;21904:1;21895:7;21891:15;21888:1;21885:22;21865:1;21858:9;21838:83;21815:139;;21934:18;;:::i;:::-;21815:139;21599:362;21551:410;;;;:::o;21967:180::-;22015:77;22012:1;22005:88;22112:4;22109:1;22102:15;22136:4;22133:1;22126:15;22153:185;22193:1;22210:20;22228:1;22210:20;:::i;:::-;22205:25;;22244:20;22262:1;22244:20;:::i;:::-;22239:25;;22283:1;22273:35;;22288:18;;:::i;:::-;22273:35;22330:1;22327;22323:9;22318:14;;22153:185;;;;:::o;22344:174::-;22484:26;22480:1;22472:6;22468:14;22461:50;22344:174;:::o;22524:366::-;22666:3;22687:67;22751:2;22746:3;22687:67;:::i;:::-;22680:74;;22763:93;22852:3;22763:93;:::i;:::-;22881:2;22876:3;22872:12;22865:19;;22524:366;;;:::o;22896:419::-;23062:4;23100:2;23089:9;23085:18;23077:26;;23149:9;23143:4;23139:20;23135:1;23124:9;23120:17;23113:47;23177:131;23303:4;23177:131;:::i;:::-;23169:139;;22896:419;;;:::o;23321:172::-;23461:24;23457:1;23449:6;23445:14;23438:48;23321:172;:::o;23499:366::-;23641:3;23662:67;23726:2;23721:3;23662:67;:::i;:::-;23655:74;;23738:93;23827:3;23738:93;:::i;:::-;23856:2;23851:3;23847:12;23840:19;;23499:366;;;:::o;23871:419::-;24037:4;24075:2;24064:9;24060:18;24052:26;;24124:9;24118:4;24114:20;24110:1;24099:9;24095:17;24088:47;24152:131;24278:4;24152:131;:::i;:::-;24144:139;;23871:419;;;:::o;24296:180::-;24344:77;24341:1;24334:88;24441:4;24438:1;24431:15;24465:4;24462:1;24455:15;24482:164;24622:16;24618:1;24610:6;24606:14;24599:40;24482:164;:::o;24652:366::-;24794:3;24815:67;24879:2;24874:3;24815:67;:::i;:::-;24808:74;;24891:93;24980:3;24891:93;:::i;:::-;25009:2;25004:3;25000:12;24993:19;;24652:366;;;:::o;25024:419::-;25190:4;25228:2;25217:9;25213:18;25205:26;;25277:9;25271:4;25267:20;25263:1;25252:9;25248:17;25241:47;25305:131;25431:4;25305:131;:::i;:::-;25297:139;;25024:419;;;:::o;25449:228::-;25589:34;25585:1;25577:6;25573:14;25566:58;25658:11;25653:2;25645:6;25641:15;25634:36;25449:228;:::o;25683:366::-;25825:3;25846:67;25910:2;25905:3;25846:67;:::i;:::-;25839:74;;25922:93;26011:3;25922:93;:::i;:::-;26040:2;26035:3;26031:12;26024:19;;25683:366;;;:::o;26055:419::-;26221:4;26259:2;26248:9;26244:18;26236:26;;26308:9;26302:4;26298:20;26294:1;26283:9;26279:17;26272:47;26336:131;26462:4;26336:131;:::i;:::-;26328:139;;26055:419;;;:::o;26480:170::-;26620:22;26616:1;26608:6;26604:14;26597:46;26480:170;:::o;26656:366::-;26798:3;26819:67;26883:2;26878:3;26819:67;:::i;:::-;26812:74;;26895:93;26984:3;26895:93;:::i;:::-;27013:2;27008:3;27004:12;26997:19;;26656:366;;;:::o;27028:419::-;27194:4;27232:2;27221:9;27217:18;27209:26;;27281:9;27275:4;27271:20;27267:1;27256:9;27252:17;27245:47;27309:131;27435:4;27309:131;:::i;:::-;27301:139;;27028:419;;;:::o;27453:221::-;27593:34;27589:1;27581:6;27577:14;27570:58;27662:4;27657:2;27649:6;27645:15;27638:29;27453:221;:::o;27680:366::-;27822:3;27843:67;27907:2;27902:3;27843:67;:::i;:::-;27836:74;;27919:93;28008:3;27919:93;:::i;:::-;28037:2;28032:3;28028:12;28021:19;;27680:366;;;:::o;28052:419::-;28218:4;28256:2;28245:9;28241:18;28233:26;;28305:9;28299:4;28295:20;28291:1;28280:9;28276:17;28269:47;28333:131;28459:4;28333:131;:::i;:::-;28325:139;;28052:419;;;:::o;28477:236::-;28617:34;28613:1;28605:6;28601:14;28594:58;28686:19;28681:2;28673:6;28669:15;28662:44;28477:236;:::o;28719:366::-;28861:3;28882:67;28946:2;28941:3;28882:67;:::i;:::-;28875:74;;28958:93;29047:3;28958:93;:::i;:::-;29076:2;29071:3;29067:12;29060:19;;28719:366;;;:::o;29091:419::-;29257:4;29295:2;29284:9;29280:18;29272:26;;29344:9;29338:4;29334:20;29330:1;29319:9;29315:17;29308:47;29372:131;29498:4;29372:131;:::i;:::-;29364:139;;29091:419;;;:::o;29516:148::-;29618:11;29655:3;29640:18;;29516:148;;;;:::o;29670:390::-;29776:3;29804:39;29837:5;29804:39;:::i;:::-;29859:89;29941:6;29936:3;29859:89;:::i;:::-;29852:96;;29957:65;30015:6;30010:3;30003:4;29996:5;29992:16;29957:65;:::i;:::-;30047:6;30042:3;30038:16;30031:23;;29780:280;29670:390;;;;:::o;30066:435::-;30246:3;30268:95;30359:3;30350:6;30268:95;:::i;:::-;30261:102;;30380:95;30471:3;30462:6;30380:95;:::i;:::-;30373:102;;30492:3;30485:10;;30066:435;;;;;:::o;30507:174::-;30647:26;30643:1;30635:6;30631:14;30624:50;30507:174;:::o;30687:366::-;30829:3;30850:67;30914:2;30909:3;30850:67;:::i;:::-;30843:74;;30926:93;31015:3;30926:93;:::i;:::-;31044:2;31039:3;31035:12;31028:19;;30687:366;;;:::o;31059:419::-;31225:4;31263:2;31252:9;31248:18;31240:26;;31312:9;31306:4;31302:20;31298:1;31287:9;31283:17;31276:47;31340:131;31466:4;31340:131;:::i;:::-;31332:139;;31059:419;;;:::o;31484:172::-;31624:24;31620:1;31612:6;31608:14;31601:48;31484:172;:::o;31662:366::-;31804:3;31825:67;31889:2;31884:3;31825:67;:::i;:::-;31818:74;;31901:93;31990:3;31901:93;:::i;:::-;32019:2;32014:3;32010:12;32003:19;;31662:366;;;:::o;32034:419::-;32200:4;32238:2;32227:9;32223:18;32215:26;;32287:9;32281:4;32277:20;32273:1;32262:9;32258:17;32251:47;32315:131;32441:4;32315:131;:::i;:::-;32307:139;;32034:419;;;:::o;32459:225::-;32599:34;32595:1;32587:6;32583:14;32576:58;32668:8;32663:2;32655:6;32651:15;32644:33;32459:225;:::o;32690:366::-;32832:3;32853:67;32917:2;32912:3;32853:67;:::i;:::-;32846:74;;32929:93;33018:3;32929:93;:::i;:::-;33047:2;33042:3;33038:12;33031:19;;32690:366;;;:::o;33062:419::-;33228:4;33266:2;33255:9;33251:18;33243:26;;33315:9;33309:4;33305:20;33301:1;33290:9;33286:17;33279:47;33343:131;33469:4;33343:131;:::i;:::-;33335:139;;33062:419;;;:::o;33487:224::-;33627:34;33623:1;33615:6;33611:14;33604:58;33696:7;33691:2;33683:6;33679:15;33672:32;33487:224;:::o;33717:366::-;33859:3;33880:67;33944:2;33939:3;33880:67;:::i;:::-;33873:74;;33956:93;34045:3;33956:93;:::i;:::-;34074:2;34069:3;34065:12;34058:19;;33717:366;;;:::o;34089:419::-;34255:4;34293:2;34282:9;34278:18;34270:26;;34342:9;34336:4;34332:20;34328:1;34317:9;34313:17;34306:47;34370:131;34496:4;34370:131;:::i;:::-;34362:139;;34089:419;;;:::o;34514:223::-;34654:34;34650:1;34642:6;34638:14;34631:58;34723:6;34718:2;34710:6;34706:15;34699:31;34514:223;:::o;34743:366::-;34885:3;34906:67;34970:2;34965:3;34906:67;:::i;:::-;34899:74;;34982:93;35071:3;34982:93;:::i;:::-;35100:2;35095:3;35091:12;35084:19;;34743:366;;;:::o;35115:419::-;35281:4;35319:2;35308:9;35304:18;35296:26;;35368:9;35362:4;35358:20;35354:1;35343:9;35339:17;35332:47;35396:131;35522:4;35396:131;:::i;:::-;35388:139;;35115:419;;;:::o;35540:141::-;35589:4;35612:3;35604:11;;35635:3;35632:1;35625:14;35669:4;35666:1;35656:18;35648:26;;35540:141;;;:::o;35711:874::-;35814:3;35851:5;35845:12;35880:36;35906:9;35880:36;:::i;:::-;35932:89;36014:6;36009:3;35932:89;:::i;:::-;35925:96;;36052:1;36041:9;36037:17;36068:1;36063:166;;;;36243:1;36238:341;;;;36030:549;;36063:166;36147:4;36143:9;36132;36128:25;36123:3;36116:38;36209:6;36202:14;36195:22;36187:6;36183:35;36178:3;36174:45;36167:52;;36063:166;;36238:341;36305:38;36337:5;36305:38;:::i;:::-;36365:1;36379:154;36393:6;36390:1;36387:13;36379:154;;;36467:7;36461:14;36457:1;36452:3;36448:11;36441:35;36517:1;36508:7;36504:15;36493:26;;36415:4;36412:1;36408:12;36403:17;;36379:154;;;36562:6;36557:3;36553:16;36546:23;;36245:334;;36030:549;;35818:767;;35711:874;;;;:::o;36591:155::-;36731:7;36727:1;36719:6;36715:14;36708:31;36591:155;:::o;36752:400::-;36912:3;36933:84;37015:1;37010:3;36933:84;:::i;:::-;36926:91;;37026:93;37115:3;37026:93;:::i;:::-;37144:1;37139:3;37135:11;37128:18;;36752:400;;;:::o;37158:695::-;37436:3;37458:92;37546:3;37537:6;37458:92;:::i;:::-;37451:99;;37567:95;37658:3;37649:6;37567:95;:::i;:::-;37560:102;;37679:148;37823:3;37679:148;:::i;:::-;37672:155;;37844:3;37837:10;;37158:695;;;;;:::o;37859:182::-;37999:34;37995:1;37987:6;37983:14;37976:58;37859:182;:::o;38047:366::-;38189:3;38210:67;38274:2;38269:3;38210:67;:::i;:::-;38203:74;;38286:93;38375:3;38286:93;:::i;:::-;38404:2;38399:3;38395:12;38388:19;;38047:366;;;:::o;38419:419::-;38585:4;38623:2;38612:9;38608:18;38600:26;;38672:9;38666:4;38662:20;38658:1;38647:9;38643:17;38636:47;38700:131;38826:4;38700:131;:::i;:::-;38692:139;;38419:419;;;:::o;38844:175::-;38984:27;38980:1;38972:6;38968:14;38961:51;38844:175;:::o;39025:366::-;39167:3;39188:67;39252:2;39247:3;39188:67;:::i;:::-;39181:74;;39264:93;39353:3;39264:93;:::i;:::-;39382:2;39377:3;39373:12;39366:19;;39025:366;;;:::o;39397:419::-;39563:4;39601:2;39590:9;39586:18;39578:26;;39650:9;39644:4;39640:20;39636:1;39625:9;39621:17;39614:47;39678:131;39804:4;39678:131;:::i;:::-;39670:139;;39397:419;;;:::o;39822:237::-;39962:34;39958:1;39950:6;39946:14;39939:58;40031:20;40026:2;40018:6;40014:15;40007:45;39822:237;:::o;40065:366::-;40207:3;40228:67;40292:2;40287:3;40228:67;:::i;:::-;40221:74;;40304:93;40393:3;40304:93;:::i;:::-;40422:2;40417:3;40413:12;40406:19;;40065:366;;;:::o;40437:419::-;40603:4;40641:2;40630:9;40626:18;40618:26;;40690:9;40684:4;40680:20;40676:1;40665:9;40661:17;40654:47;40718:131;40844:4;40718:131;:::i;:::-;40710:139;;40437:419;;;:::o;40862:182::-;41002:34;40998:1;40990:6;40986:14;40979:58;40862:182;:::o;41050:366::-;41192:3;41213:67;41277:2;41272:3;41213:67;:::i;:::-;41206:74;;41289:93;41378:3;41289:93;:::i;:::-;41407:2;41402:3;41398:12;41391:19;;41050:366;;;:::o;41422:419::-;41588:4;41626:2;41615:9;41611:18;41603:26;;41675:9;41669:4;41665:20;41661:1;41650:9;41646:17;41639:47;41703:131;41829:4;41703:131;:::i;:::-;41695:139;;41422:419;;;:::o;41847:178::-;41987:30;41983:1;41975:6;41971:14;41964:54;41847:178;:::o;42031:366::-;42173:3;42194:67;42258:2;42253:3;42194:67;:::i;:::-;42187:74;;42270:93;42359:3;42270:93;:::i;:::-;42388:2;42383:3;42379:12;42372:19;;42031:366;;;:::o;42403:419::-;42569:4;42607:2;42596:9;42592:18;42584:26;;42656:9;42650:4;42646:20;42642:1;42631:9;42627:17;42620:47;42684:131;42810:4;42684:131;:::i;:::-;42676:139;;42403:419;;;:::o;42828:233::-;42968:34;42964:1;42956:6;42952:14;42945:58;43037:16;43032:2;43024:6;43020:15;43013:41;42828:233;:::o;43067:366::-;43209:3;43230:67;43294:2;43289:3;43230:67;:::i;:::-;43223:74;;43306:93;43395:3;43306:93;:::i;:::-;43424:2;43419:3;43415:12;43408:19;;43067:366;;;:::o;43439:419::-;43605:4;43643:2;43632:9;43628:18;43620:26;;43692:9;43686:4;43682:20;43678:1;43667:9;43663:17;43656:47;43720:131;43846:4;43720:131;:::i;:::-;43712:139;;43439:419;;;:::o;43864:93::-;43901:6;43948:2;43943;43936:5;43932:14;43928:23;43918:33;;43864:93;;;:::o;43963:107::-;44007:8;44057:5;44051:4;44047:16;44026:37;;43963:107;;;;:::o;44076:393::-;44145:6;44195:1;44183:10;44179:18;44218:97;44248:66;44237:9;44218:97;:::i;:::-;44336:39;44366:8;44355:9;44336:39;:::i;:::-;44324:51;;44408:4;44404:9;44397:5;44393:21;44384:30;;44457:4;44447:8;44443:19;44436:5;44433:30;44423:40;;44152:317;;44076:393;;;;;:::o;44475:60::-;44503:3;44524:5;44517:12;;44475:60;;;:::o;44541:142::-;44591:9;44624:53;44642:34;44651:24;44669:5;44651:24;:::i;:::-;44642:34;:::i;:::-;44624:53;:::i;:::-;44611:66;;44541:142;;;:::o;44689:75::-;44732:3;44753:5;44746:12;;44689:75;;;:::o;44770:269::-;44880:39;44911:7;44880:39;:::i;:::-;44941:91;44990:41;45014:16;44990:41;:::i;:::-;44982:6;44975:4;44969:11;44941:91;:::i;:::-;44935:4;44928:105;44846:193;44770:269;;;:::o;45045:73::-;45090:3;45045:73;:::o;45124:189::-;45201:32;;:::i;:::-;45242:65;45300:6;45292;45286:4;45242:65;:::i;:::-;45177:136;45124:189;;:::o;45319:186::-;45379:120;45396:3;45389:5;45386:14;45379:120;;;45450:39;45487:1;45480:5;45450:39;:::i;:::-;45423:1;45416:5;45412:13;45403:22;;45379:120;;;45319:186;;:::o;45511:543::-;45612:2;45607:3;45604:11;45601:446;;;45646:38;45678:5;45646:38;:::i;:::-;45730:29;45748:10;45730:29;:::i;:::-;45720:8;45716:44;45913:2;45901:10;45898:18;45895:49;;;45934:8;45919:23;;45895:49;45957:80;46013:22;46031:3;46013:22;:::i;:::-;46003:8;45999:37;45986:11;45957:80;:::i;:::-;45616:431;;45601:446;45511:543;;;:::o;46060:117::-;46114:8;46164:5;46158:4;46154:16;46133:37;;46060:117;;;;:::o;46183:169::-;46227:6;46260:51;46308:1;46304:6;46296:5;46293:1;46289:13;46260:51;:::i;:::-;46256:56;46341:4;46335;46331:15;46321:25;;46234:118;46183:169;;;;:::o;46357:295::-;46433:4;46579:29;46604:3;46598:4;46579:29;:::i;:::-;46571:37;;46641:3;46638:1;46634:11;46628:4;46625:21;46617:29;;46357:295;;;;:::o;46657:1395::-;46774:37;46807:3;46774:37;:::i;:::-;46876:18;46868:6;46865:30;46862:56;;;46898:18;;:::i;:::-;46862:56;46942:38;46974:4;46968:11;46942:38;:::i;:::-;47027:67;47087:6;47079;47073:4;47027:67;:::i;:::-;47121:1;47145:4;47132:17;;47177:2;47169:6;47166:14;47194:1;47189:618;;;;47851:1;47868:6;47865:77;;;47917:9;47912:3;47908:19;47902:26;47893:35;;47865:77;47968:67;48028:6;48021:5;47968:67;:::i;:::-;47962:4;47955:81;47824:222;47159:887;;47189:618;47241:4;47237:9;47229:6;47225:22;47275:37;47307:4;47275:37;:::i;:::-;47334:1;47348:208;47362:7;47359:1;47356:14;47348:208;;;47441:9;47436:3;47432:19;47426:26;47418:6;47411:42;47492:1;47484:6;47480:14;47470:24;;47539:2;47528:9;47524:18;47511:31;;47385:4;47382:1;47378:12;47373:17;;47348:208;;;47584:6;47575:7;47572:19;47569:179;;;47642:9;47637:3;47633:19;47627:26;47685:48;47727:4;47719:6;47715:17;47704:9;47685:48;:::i;:::-;47677:6;47670:64;47592:156;47569:179;47794:1;47790;47782:6;47778:14;47774:22;47768:4;47761:36;47196:611;;;47159:887;;46749:1303;;;46657:1395;;:::o;48058:98::-;48109:6;48143:5;48137:12;48127:22;;48058:98;;;:::o;48162:168::-;48245:11;48279:6;48274:3;48267:19;48319:4;48314:3;48310:14;48295:29;;48162:168;;;;:::o;48336:373::-;48422:3;48450:38;48482:5;48450:38;:::i;:::-;48504:70;48567:6;48562:3;48504:70;:::i;:::-;48497:77;;48583:65;48641:6;48636:3;48629:4;48622:5;48618:16;48583:65;:::i;:::-;48673:29;48695:6;48673:29;:::i;:::-;48668:3;48664:39;48657:46;;48426:283;48336:373;;;;:::o;48715:640::-;48910:4;48948:3;48937:9;48933:19;48925:27;;48962:71;49030:1;49019:9;49015:17;49006:6;48962:71;:::i;:::-;49043:72;49111:2;49100:9;49096:18;49087:6;49043:72;:::i;:::-;49125;49193:2;49182:9;49178:18;49169:6;49125:72;:::i;:::-;49244:9;49238:4;49234:20;49229:2;49218:9;49214:18;49207:48;49272:76;49343:4;49334:6;49272:76;:::i;:::-;49264:84;;48715:640;;;;;;;:::o;49361:141::-;49417:5;49448:6;49442:13;49433:22;;49464:32;49490:5;49464:32;:::i;:::-;49361:141;;;;:::o;49508:349::-;49577:6;49626:2;49614:9;49605:7;49601:23;49597:32;49594:119;;;49632:79;;:::i;:::-;49594:119;49752:1;49777:63;49832:7;49823:6;49812:9;49808:22;49777:63;:::i;:::-;49767:73;;49723:127;49508:349;;;;:::o

Swarm Source

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