ETH Price: $3,237.50 (+2.10%)
Gas: 2 Gwei

Token

IOIA (IO)
 

Overview

Max Total Supply

18 IO

Holders

18

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 IO
0xcc0490d0072c46eee4cc26ac31efd47494b49b2c
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:
IOIA

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-03-14
*/

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides a set of functions to operate with Base64 strings.
 *
 * _Available since v4.5._
 */
library Base64 {
    /**
     * @dev Base64 Encoding/Decoding Table
     */
    string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /**
     * @dev Converts a `bytes` to its Bytes64 `string` representation.
     */
    function encode(bytes memory data) internal pure returns (string memory) {
        /**
         * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
         * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
         */
        if (data.length == 0) return "";

        // Loads the table into memory
        string memory table = _TABLE;

        // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter
        // and split into 4 numbers of 6 bits.
        // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up
        // - `data.length + 2`  -> Round up
        // - `/ 3`              -> Number of 3-bytes chunks
        // - `4 *`              -> 4 characters for each chunk
        string memory result = new string(4 * ((data.length + 2) / 3));

        /// @solidity memory-safe-assembly
        assembly {
            // Prepare the lookup table (skip the first "length" byte)
            let tablePtr := add(table, 1)

            // Prepare result pointer, jump over length
            let resultPtr := add(result, 32)

            // Run over the input, 3 bytes at a time
            for {
                let dataPtr := data
                let endPtr := add(data, mload(data))
            } lt(dataPtr, endPtr) {

            } {
                // Advance 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // To write each character, shift the 3 bytes (18 bits) chunk
                // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)
                // and apply logical AND with 0x3F which is the number of
                // the previous character in the ASCII table prior to the Base64 Table
                // The result is then added to the table to get the character to write,
                // and finally write it in the result pointer but with a left shift
                // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits

                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance
            }

            // When data `bytes` is not exactly 3 bytes long
            // it is padded with `=` characters at the end
            switch mod(mload(data), 3)
            case 1 {
                mstore8(sub(resultPtr, 1), 0x3d)
                mstore8(sub(resultPtr, 2), 0x3d)
            }
            case 2 {
                mstore8(sub(resultPtr, 1), 0x3d)
            }
        }

        return result;
    }
}

// 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/token/ERC20/ERC20.sol


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

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

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


pragma solidity 0.8.19;






 
contract IOIA is ERC721, Ownable, ReentrancyGuard {
   using Strings for uint;
   using Counters for Counters.Counter;
   enum SaleStatus{ PAUSED,  PRIVATE }
   Counters.Counter private _tokenIds;
   uint public maxSupply = 30;
   uint8 public TOKENS_PER_PERSON_PUB_LIMIT = 5;
   uint public MINT_PRICE = 0 ether;
   SaleStatus public saleStatus = SaleStatus.PAUSED;
   string private _baseURL = "https://black-traditional-tiger-884.mypinata.cloud/ipfs/QmcbayZTxX6YH8WAcVLvhcuXpjFnm248vdJZS3chvHNhG8/";
   bytes32 public root;
   mapping(address => uint) public mintedCount;
   mapping(uint256 => uint256) public allowList;
   bool public allowTransfer;
   uint256 public constant GOLDEN_Card_SUPPLY = 3;
   uint256 public goldenCardCount;
   string private websiteDomain = "ioinvestmentacademy.com";
   
   constructor() ReentrancyGuard() ERC721("IOIA", "IO") {}


    /// @notice Set base URL
   function setRoot(bytes32  rootVal) external onlyOwner {
       root = rootVal;
   }


   function setWebdomain(string calldata _uri) external onlyOwner {
       websiteDomain = _uri;
   }


     /// @notice allow to tranfer list
   function setAllowList(uint256[] memory tokens) external onlyOwner {
       for (uint256 i = 0; i < tokens.length; i++) {
           allowList[tokens[i]]++;
       }
   }


   function removeFromAllowList(uint256 tokenId) external onlyOwner {
        allowList[tokenId] = 0;
    }


    /// @notice Set base URL
   function setbaseUrl(string calldata url) external onlyOwner {
       _baseURL = url;
   }
 
   function totalSupply() external view returns (uint) {
       return _tokenIds.current();
   }
 
   /// @notice Update current sale stage
   function setSaleStatus(SaleStatus status) external onlyOwner {
       saleStatus = status;
   }


   function changeMintPrice(uint price) external onlyOwner {
       MINT_PRICE = price;
   }


 
   function changeTPP(uint8 val) external onlyOwner {
       TOKENS_PER_PERSON_PUB_LIMIT = val;
   }
   
   /// @notice Get token URI. In case of delayed reveal we give user the json of the placeholer metadata.
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
     
       require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
       string memory currentBaseURI = _baseURL;
       return string(abi.encodePacked(currentBaseURI, Strings.toString(tokenId), ".json"));
     
   }
 
   function calcTotal(uint count) public view returns(uint) {
       require(saleStatus != SaleStatus.PAUSED, "IOIA: Sales are off");
       uint price = MINT_PRICE;
       return count * price;
   }


   function getTokensOwnedByAddress(address wallet) external view returns (uint256[] memory) {
    uint256 numTokensOwned = balanceOf(wallet);
    uint256[] memory tokensOwned = new uint256[](numTokensOwned);
    uint256 index = 0;
    uint256 totalAll = _tokenIds.current();
    for (uint256 i = 1; i <= totalAll; i++) {
        if (_exists(i) && ownerOf(i) == wallet) {
            tokensOwned[index] = i;
            index++;
        }
    }


    return tokensOwned;
   }




    function mintGoldenCard(address receiver) external onlyOwner {
        require(goldenCardCount < GOLDEN_Card_SUPPLY, "All golden Cards have been minted");


        if (goldenCardCount == 0) {
            _safeMint(receiver, 899);
        } else if (goldenCardCount == 1) {
            _safeMint(receiver, 900);
        } else if (goldenCardCount == 2) {
            _safeMint(receiver, 901);
        }
        goldenCardCount++;
    }


    function setMaxSupply(uint supply) external onlyOwner {
        maxSupply = supply;
    }




    function privateMint(uint8 numberOfTokens, string calldata domain) nonReentrant external payable {
        require(keccak256(abi.encodePacked(domain)) == keccak256(abi.encodePacked(websiteDomain)), "Unauthorized website domain");
        require(saleStatus != SaleStatus.PAUSED, "IOIA: Sales are Paused");
        require(_tokenIds.current() + numberOfTokens <= maxSupply, "Purchase would exceed max tokens");
        require(mintedCount[msg.sender] + numberOfTokens <= TOKENS_PER_PERSON_PUB_LIMIT, "Exceeded max available to purchase per user");
        require(MINT_PRICE * numberOfTokens <= msg.value, "Ether value sent is not correct");


       
        uint256 totalPrice = MINT_PRICE * numberOfTokens;


         for (uint8 i = 0; i < numberOfTokens; i++) {
        _tokenIds.increment();
        mintedCount[msg.sender]++;
        _safeMint(msg.sender, _tokenIds.current());
        }
        payable(owner()).transfer(totalPrice);
    }




    // @notice Allows owner to mint tokens to a specified address
   function airdrop(address[] calldata addresses) external onlyOwner {
    require(_tokenIds.current() + addresses.length < maxSupply, "Request exceeds collection size");
    for (uint256 i = 0; i < addresses.length; i++) {
        uint256 newItemId = _tokenIds.current() + 1;
        _safeMint(addresses[i], newItemId);
        mintedCount[addresses[i]]++;
        _tokenIds.increment();
    }
   }




    function changeAllowTransfer(bool allow) external onlyOwner  {
       allowTransfer = allow;
    }


    /// @notice Withdraw contract balance
   function withdraw() external onlyOwner {
       uint balance = address(this).balance;
       require(balance == 0, "No balance");
       payable(owner()).transfer(balance);
   }




   function _beforeTokenTransfer(address from, address to, uint256 tokenId, uint256 batchSize) internal virtual override {
        if(from != address(0) && to != address(0)){
            if(allowTransfer){
                return super._beforeTokenTransfer(from, to, tokenId, batchSize);
            }else{
                require(allowList[tokenId]  != 0, "can not transfer if bid is below 0.3 ETH");
                super._beforeTokenTransfer(from, to, tokenId, batchSize);
                allowList[tokenId]--;
            }    
        }
    }  




    function contractURI() public pure returns (string memory) {
       return "https://ioinvestmentacademy.github.io/jsondata/contractUri.json";
   }


}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"GOLDEN_Card_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKENS_PER_PERSON_PUB_LIMIT","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allowList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"calcTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"allow","type":"bool"}],"name":"changeAllowTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"changeMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"val","type":"uint8"}],"name":"changeTPP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","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":"wallet","type":"address"}],"name":"getTokensOwnedByAddress","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"goldenCardCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"receiver","type":"address"}],"name":"mintGoldenCard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"numberOfTokens","type":"uint8"},{"internalType":"string","name":"domain","type":"string"}],"name":"privateMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"removeFromAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStatus","outputs":[{"internalType":"enum IOIA.SaleStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokens","type":"uint256[]"}],"name":"setAllowList","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":"uint256","name":"supply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"rootVal","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum IOIA.SaleStatus","name":"status","type":"uint8"}],"name":"setSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setWebdomain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"url","type":"string"}],"name":"setbaseUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052601e6009556005600a60006101000a81548160ff021916908360ff1602179055506000600b556000600c60006101000a81548160ff0219169083600181111562000053576200005262000266565b5b02179055506040518060a00160405280606781526020016200520760679139600d90816200008291906200050f565b506040518060400160405280601781526020017f696f696e766573746d656e7461636164656d792e636f6d00000000000000000081525060139081620000c991906200050f565b50348015620000d757600080fd5b506040518060400160405280600481526020017f494f4941000000000000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f494f00000000000000000000000000000000000000000000000000000000000081525081600090816200015591906200050f565b5080600190816200016791906200050f565b5050506200018a6200017e6200019860201b60201c565b620001a060201b60201c565b6001600781905550620005f6565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200031757607f821691505b6020821081036200032d576200032c620002cf565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000358565b620003a3868362000358565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003f0620003ea620003e484620003bb565b620003c5565b620003bb565b9050919050565b6000819050919050565b6200040c83620003cf565b620004246200041b82620003f7565b84845462000365565b825550505050565b600090565b6200043b6200042c565b6200044881848462000401565b505050565b5b8181101562000470576200046460008262000431565b6001810190506200044e565b5050565b601f821115620004bf57620004898162000333565b620004948462000348565b81016020851015620004a4578190505b620004bc620004b38562000348565b8301826200044d565b50505b505050565b600082821c905092915050565b6000620004e460001984600802620004c4565b1980831691505092915050565b6000620004ff8383620004d1565b9150826002028217905092915050565b6200051a8262000295565b67ffffffffffffffff811115620005365762000535620002a0565b5b620005428254620002fe565b6200054f82828562000474565b600060209050601f83116001811462000587576000841562000572578287015190505b6200057e8582620004f1565b865550620005ee565b601f198416620005978662000333565b60005b82811015620005c1578489015182556001820191506020850194506020810190506200059a565b86831015620005e15784890151620005dd601f891682620004d1565b8355505b6001600288020188555050505b505050505050565b614c0180620006066000396000f3fe6080604052600436106102675760003560e01c80637786269a11610144578063d8d46126116100b6578063ebc334471161007a578063ebc3344714610919578063ebf0c71714610944578063f2fde38b1461096f578063f9020e3314610998578063fc6c02e3146109c3578063fddcb5ea146109ec57610267565b8063d8d4612614610834578063dab5f3401461085f578063e8a3d48514610888578063e985e9c5146108b3578063e9b3c466146108f057610267565b8063af6128c211610108578063af6128c214610712578063b88d4fde1461074f578063c002d23d14610778578063c87b56dd146107a3578063cd0b8f0c146107e0578063d5abeb011461080957610267565b80637786269a1461064c5780638da5cb5b1461066857806395d89b41146106935780639b08a22f146106be578063a22cb465146106e957610267565b80633ccfd60b116101dd57806362a6d197116101a157806362a6d1971461052c5780636352211e146105695780636f8b44b0146105a657806370a08231146105cf578063715018a61461060c578063729ad39e1461062357610267565b80633ccfd60b1461045d5780633fd173661461047457806342842e0e1461049d57806348756c17146104c65780634891ad881461050357610267565b806321848c9a1161022f57806321848c9a1461036557806323b872dd1461038e5780632534e5b9146103b75780632ba7c04c146103e05780632eef3f7c146104095780633661edfa1461043257610267565b806301ffc9a71461026c57806306fdde03146102a9578063081812fc146102d4578063095ea7b31461031157806318160ddd1461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e9190612d2a565b610a29565b6040516102a09190612d72565b60405180910390f35b3480156102b557600080fd5b506102be610b0b565b6040516102cb9190612e1d565b60405180910390f35b3480156102e057600080fd5b506102fb60048036038101906102f69190612e75565b610b9d565b6040516103089190612ee3565b60405180910390f35b34801561031d57600080fd5b5061033860048036038101906103339190612f2a565b610be3565b005b34801561034657600080fd5b5061034f610cfa565b60405161035c9190612f79565b60405180910390f35b34801561037157600080fd5b5061038c60048036038101906103879190612fc0565b610d0b565b005b34801561039a57600080fd5b506103b560048036038101906103b09190612fed565b610d30565b005b3480156103c357600080fd5b506103de60048036038101906103d991906130a5565b610d90565b005b3480156103ec57600080fd5b50610407600480360381019061040291906130f2565b610dae565b005b34801561041557600080fd5b50610430600480360381019061042b9190613158565b610e65565b005b34801561043e57600080fd5b50610447610e8b565b6040516104549190613194565b60405180910390f35b34801561046957600080fd5b50610472610e9e565b005b34801561048057600080fd5b5061049b60048036038101906104969190612e75565b610f3f565b005b3480156104a957600080fd5b506104c460048036038101906104bf9190612fed565b610f51565b005b3480156104d257600080fd5b506104ed60048036038101906104e891906130f2565b610f71565b6040516104fa919061326d565b60405180910390f35b34801561050f57600080fd5b5061052a600480360381019061052591906132b4565b611086565b005b34801561053857600080fd5b50610553600480360381019061054e9190612e75565b6110bb565b6040516105609190612f79565b60405180910390f35b34801561057557600080fd5b50610590600480360381019061058b9190612e75565b6110d3565b60405161059d9190612ee3565b60405180910390f35b3480156105b257600080fd5b506105cd60048036038101906105c89190612e75565b611159565b005b3480156105db57600080fd5b506105f660048036038101906105f191906130f2565b61116b565b6040516106039190612f79565b60405180910390f35b34801561061857600080fd5b50610621611222565b005b34801561062f57600080fd5b5061064a60048036038101906106459190613337565b611236565b005b61066660048036038101906106619190613384565b611391565b005b34801561067457600080fd5b5061067d6116f9565b60405161068a9190612ee3565b60405180910390f35b34801561069f57600080fd5b506106a8611723565b6040516106b59190612e1d565b60405180910390f35b3480156106ca57600080fd5b506106d36117b5565b6040516106e09190612d72565b60405180910390f35b3480156106f557600080fd5b50610710600480360381019061070b91906133e4565b6117c8565b005b34801561071e57600080fd5b5061073960048036038101906107349190612e75565b6117de565b6040516107469190612f79565b60405180910390f35b34801561075b57600080fd5b5061077660048036038101906107719190613554565b611870565b005b34801561078457600080fd5b5061078d6118d2565b60405161079a9190612f79565b60405180910390f35b3480156107af57600080fd5b506107ca60048036038101906107c59190612e75565b6118d8565b6040516107d79190612e1d565b60405180910390f35b3480156107ec57600080fd5b506108076004803603810190610802919061369a565b6119e3565b005b34801561081557600080fd5b5061081e611a51565b60405161082b9190612f79565b60405180910390f35b34801561084057600080fd5b50610849611a57565b6040516108569190612f79565b60405180910390f35b34801561086b57600080fd5b5061088660048036038101906108819190613719565b611a5d565b005b34801561089457600080fd5b5061089d611a6f565b6040516108aa9190612e1d565b60405180910390f35b3480156108bf57600080fd5b506108da60048036038101906108d59190613746565b611a8f565b6040516108e79190612d72565b60405180910390f35b3480156108fc57600080fd5b50610917600480360381019061091291906130a5565b611b23565b005b34801561092557600080fd5b5061092e611b41565b60405161093b9190612f79565b60405180910390f35b34801561095057600080fd5b50610959611b46565b6040516109669190613795565b60405180910390f35b34801561097b57600080fd5b50610996600480360381019061099191906130f2565b611b4c565b005b3480156109a457600080fd5b506109ad611bcf565b6040516109ba9190613827565b60405180910390f35b3480156109cf57600080fd5b506109ea60048036038101906109e59190612e75565b611be2565b005b3480156109f857600080fd5b50610a136004803603810190610a0e91906130f2565b611c06565b604051610a209190612f79565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610af457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b045750610b0382611c1e565b5b9050919050565b606060008054610b1a90613871565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4690613871565b8015610b935780601f10610b6857610100808354040283529160200191610b93565b820191906000526020600020905b815481529060010190602001808311610b7657829003601f168201915b5050505050905090565b6000610ba882611c88565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bee826110d3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5590613914565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c7d611cd3565b73ffffffffffffffffffffffffffffffffffffffff161480610cac5750610cab81610ca6611cd3565b611a8f565b5b610ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce2906139a6565b60405180910390fd5b610cf58383611cdb565b505050565b6000610d066008611d94565b905090565b610d13611da2565b80601160006101000a81548160ff02191690831515021790555050565b610d41610d3b611cd3565b82611e20565b610d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7790613a38565b60405180910390fd5b610d8b838383611eb5565b505050565b610d98611da2565b8181600d9182610da9929190613c0f565b505050565b610db6611da2565b600360125410610dfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df290613d51565b60405180910390fd5b600060125403610e1657610e11816103836121ae565b610e4a565b600160125403610e3157610e2c816103846121ae565b610e49565b600260125403610e4857610e47816103856121ae565b5b5b5b60126000815480929190610e5d90613da0565b919050555050565b610e6d611da2565b80600a60006101000a81548160ff021916908360ff16021790555050565b600a60009054906101000a900460ff1681565b610ea6611da2565b600047905060008114610eee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee590613e34565b60405180910390fd5b610ef66116f9565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f3b573d6000803e3d6000fd5b5050565b610f47611da2565b80600b8190555050565b610f6c83838360405180602001604052806000815250611870565b505050565b60606000610f7e8361116b565b905060008167ffffffffffffffff811115610f9c57610f9b613429565b5b604051908082528060200260200182016040528015610fca5781602001602082028036833780820191505090505b509050600080610fda6008611d94565b90506000600190505b81811161107957610ff3816121cc565b801561103257508673ffffffffffffffffffffffffffffffffffffffff1661101a826110d3565b73ffffffffffffffffffffffffffffffffffffffff16145b15611066578084848151811061104b5761104a613e54565b5b602002602001018181525050828061106290613da0565b9350505b808061107190613da0565b915050610fe3565b5082945050505050919050565b61108e611da2565b80600c60006101000a81548160ff021916908360018111156110b3576110b26137b0565b5b021790555050565b60106020528060005260406000206000915090505481565b6000806110df8361220d565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611150576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114790613ecf565b60405180910390fd5b80915050919050565b611161611da2565b8060098190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d290613f61565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61122a611da2565b611234600061224a565b565b61123e611da2565b6009548282905061124f6008611d94565b6112599190613f81565b10611299576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129090614001565b60405180910390fd5b60005b8282905081101561138c57600060016112b56008611d94565b6112bf9190613f81565b90506112f28484848181106112d7576112d6613e54565b5b90506020020160208101906112ec91906130f2565b826121ae565b600f600085858581811061130957611308613e54565b5b905060200201602081019061131e91906130f2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061136990613da0565b91905055506113786008612310565b50808061138490613da0565b91505061129c565b505050565b611399612326565b60136040516020016113ab91906140af565b6040516020818303038152906040528051906020012082826040516020016113d49291906140eb565b604051602081830303815290604052805190602001201461142a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142190614150565b60405180910390fd5b6000600181111561143e5761143d6137b0565b5b600c60009054906101000a900460ff1660018111156114605761145f6137b0565b5b036114a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611497906141bc565b60405180910390fd5b6009548360ff166114b16008611d94565b6114bb9190613f81565b11156114fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f390614228565b60405180910390fd5b600a60009054906101000a900460ff1660ff168360ff16600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461155d9190613f81565b111561159e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611595906142ba565b60405180910390fd5b348360ff16600b546115b091906142da565b11156115f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e890614368565b60405180910390fd5b60008360ff16600b5461160491906142da565b905060005b8460ff168160ff16101561169c576116216008612310565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061167190613da0565b9190505550611689336116846008611d94565b6121ae565b808061169490614388565b915050611609565b506116a56116f9565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156116ea573d6000803e3d6000fd5b50506116f4612375565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461173290613871565b80601f016020809104026020016040519081016040528092919081815260200182805461175e90613871565b80156117ab5780601f10611780576101008083540402835291602001916117ab565b820191906000526020600020905b81548152906001019060200180831161178e57829003601f168201915b5050505050905090565b601160009054906101000a900460ff1681565b6117da6117d3611cd3565b838361237f565b5050565b60008060018111156117f3576117f26137b0565b5b600c60009054906101000a900460ff166001811115611815576118146137b0565b5b03611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184c906143fd565b60405180910390fd5b6000600b549050808361186891906142da565b915050919050565b61188161187b611cd3565b83611e20565b6118c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b790613a38565b60405180910390fd5b6118cc848484846124eb565b50505050565b600b5481565b60606118e3826121cc565b611922576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119199061448f565b60405180910390fd5b6000600d805461193190613871565b80601f016020809104026020016040519081016040528092919081815260200182805461195d90613871565b80156119aa5780601f1061197f576101008083540402835291602001916119aa565b820191906000526020600020905b81548152906001019060200180831161198d57829003601f168201915b50505050509050806119bb84612547565b6040516020016119cc92919061452c565b604051602081830303815290604052915050919050565b6119eb611da2565b60005b8151811015611a4d5760106000838381518110611a0e57611a0d613e54565b5b602002602001015181526020019081526020016000206000815480929190611a3590613da0565b91905055508080611a4590613da0565b9150506119ee565b5050565b60095481565b60125481565b611a65611da2565b80600e8190555050565b60606040518060600160405280603f8152602001614b8d603f9139905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b2b611da2565b818160139182611b3c929190613c0f565b505050565b600381565b600e5481565b611b54611da2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bba906145cd565b60405180910390fd5b611bcc8161224a565b50565b600c60009054906101000a900460ff1681565b611bea611da2565b6000601060008381526020019081526020016000208190555050565b600f6020528060005260406000206000915090505481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611c91816121cc565b611cd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc790613ecf565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d4e836110d3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b611daa611cd3565b73ffffffffffffffffffffffffffffffffffffffff16611dc86116f9565b73ffffffffffffffffffffffffffffffffffffffff1614611e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1590614639565b60405180910390fd5b565b600080611e2c836110d3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e6e5750611e6d8185611a8f565b5b80611eac57508373ffffffffffffffffffffffffffffffffffffffff16611e9484610b9d565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ed5826110d3565b73ffffffffffffffffffffffffffffffffffffffff1614611f2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f22906146cb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f919061475d565b60405180910390fd5b611fa78383836001612615565b8273ffffffffffffffffffffffffffffffffffffffff16611fc7826110d3565b73ffffffffffffffffffffffffffffffffffffffff161461201d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612014906146cb565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121a9838383600161273d565b505050565b6121c8828260405180602001604052806000815250612743565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166121ee8361220d565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b60026007540361236b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612362906147c9565b60405180910390fd5b6002600781905550565b6001600781905550565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e490614835565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124de9190612d72565b60405180910390a3505050565b6124f6848484611eb5565b6125028484848461279e565b612541576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612538906148c7565b60405180910390fd5b50505050565b60606000600161255684612925565b01905060008167ffffffffffffffff81111561257557612574613429565b5b6040519080825280601f01601f1916602001820160405280156125a75781602001600182028036833780820191505090505b509050600082602001820190505b60011561260a578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816125fe576125fd6148e7565b5b049450600085036125b5575b819350505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415801561267f5750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b1561273657601160009054906101000a900460ff16156126aa576126a584848484612a78565b612737565b6000601060008481526020019081526020016000205403612700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f790614988565b60405180910390fd5b61270c84848484612a78565b601060008381526020019081526020016000206000815480929190612730906149a8565b91905055505b5b50505050565b50505050565b61274d8383612a7e565b61275a600084848461279e565b612799576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612790906148c7565b60405180910390fd5b505050565b60006127bf8473ffffffffffffffffffffffffffffffffffffffff16612c9b565b15612918578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127e8611cd3565b8786866040518563ffffffff1660e01b815260040161280a9493929190614a26565b6020604051808303816000875af192505050801561284657506040513d601f19601f820116820180604052508101906128439190614a87565b60015b6128c8573d8060008114612876576040519150601f19603f3d011682016040523d82523d6000602084013e61287b565b606091505b5060008151036128c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b7906148c7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061291d565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612983577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612979576129786148e7565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106129c0576d04ee2d6d415b85acef810000000083816129b6576129b56148e7565b5b0492506020810190505b662386f26fc1000083106129ef57662386f26fc1000083816129e5576129e46148e7565b5b0492506010810190505b6305f5e1008310612a18576305f5e1008381612a0e57612a0d6148e7565b5b0492506008810190505b6127108310612a3d576127108381612a3357612a326148e7565b5b0492506004810190505b60648310612a605760648381612a5657612a556148e7565b5b0492506002810190505b600a8310612a6f576001810190505b80915050919050565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae490614b00565b60405180910390fd5b612af6816121cc565b15612b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2d90614b6c565b60405180910390fd5b612b44600083836001612615565b612b4d816121cc565b15612b8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8490614b6c565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c9760008383600161273d565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612d0781612cd2565b8114612d1257600080fd5b50565b600081359050612d2481612cfe565b92915050565b600060208284031215612d4057612d3f612cc8565b5b6000612d4e84828501612d15565b91505092915050565b60008115159050919050565b612d6c81612d57565b82525050565b6000602082019050612d876000830184612d63565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612dc7578082015181840152602081019050612dac565b60008484015250505050565b6000601f19601f8301169050919050565b6000612def82612d8d565b612df98185612d98565b9350612e09818560208601612da9565b612e1281612dd3565b840191505092915050565b60006020820190508181036000830152612e378184612de4565b905092915050565b6000819050919050565b612e5281612e3f565b8114612e5d57600080fd5b50565b600081359050612e6f81612e49565b92915050565b600060208284031215612e8b57612e8a612cc8565b5b6000612e9984828501612e60565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ecd82612ea2565b9050919050565b612edd81612ec2565b82525050565b6000602082019050612ef86000830184612ed4565b92915050565b612f0781612ec2565b8114612f1257600080fd5b50565b600081359050612f2481612efe565b92915050565b60008060408385031215612f4157612f40612cc8565b5b6000612f4f85828601612f15565b9250506020612f6085828601612e60565b9150509250929050565b612f7381612e3f565b82525050565b6000602082019050612f8e6000830184612f6a565b92915050565b612f9d81612d57565b8114612fa857600080fd5b50565b600081359050612fba81612f94565b92915050565b600060208284031215612fd657612fd5612cc8565b5b6000612fe484828501612fab565b91505092915050565b60008060006060848603121561300657613005612cc8565b5b600061301486828701612f15565b935050602061302586828701612f15565b925050604061303686828701612e60565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f84011261306557613064613040565b5b8235905067ffffffffffffffff81111561308257613081613045565b5b60208301915083600182028301111561309e5761309d61304a565b5b9250929050565b600080602083850312156130bc576130bb612cc8565b5b600083013567ffffffffffffffff8111156130da576130d9612ccd565b5b6130e68582860161304f565b92509250509250929050565b60006020828403121561310857613107612cc8565b5b600061311684828501612f15565b91505092915050565b600060ff82169050919050565b6131358161311f565b811461314057600080fd5b50565b6000813590506131528161312c565b92915050565b60006020828403121561316e5761316d612cc8565b5b600061317c84828501613143565b91505092915050565b61318e8161311f565b82525050565b60006020820190506131a96000830184613185565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6131e481612e3f565b82525050565b60006131f683836131db565b60208301905092915050565b6000602082019050919050565b600061321a826131af565b61322481856131ba565b935061322f836131cb565b8060005b8381101561326057815161324788826131ea565b975061325283613202565b925050600181019050613233565b5085935050505092915050565b60006020820190508181036000830152613287818461320f565b905092915050565b6002811061329c57600080fd5b50565b6000813590506132ae8161328f565b92915050565b6000602082840312156132ca576132c9612cc8565b5b60006132d88482850161329f565b91505092915050565b60008083601f8401126132f7576132f6613040565b5b8235905067ffffffffffffffff81111561331457613313613045565b5b6020830191508360208202830111156133305761332f61304a565b5b9250929050565b6000806020838503121561334e5761334d612cc8565b5b600083013567ffffffffffffffff81111561336c5761336b612ccd565b5b613378858286016132e1565b92509250509250929050565b60008060006040848603121561339d5761339c612cc8565b5b60006133ab86828701613143565b935050602084013567ffffffffffffffff8111156133cc576133cb612ccd565b5b6133d88682870161304f565b92509250509250925092565b600080604083850312156133fb576133fa612cc8565b5b600061340985828601612f15565b925050602061341a85828601612fab565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61346182612dd3565b810181811067ffffffffffffffff821117156134805761347f613429565b5b80604052505050565b6000613493612cbe565b905061349f8282613458565b919050565b600067ffffffffffffffff8211156134bf576134be613429565b5b6134c882612dd3565b9050602081019050919050565b82818337600083830152505050565b60006134f76134f2846134a4565b613489565b90508281526020810184848401111561351357613512613424565b5b61351e8482856134d5565b509392505050565b600082601f83011261353b5761353a613040565b5b813561354b8482602086016134e4565b91505092915050565b6000806000806080858703121561356e5761356d612cc8565b5b600061357c87828801612f15565b945050602061358d87828801612f15565b935050604061359e87828801612e60565b925050606085013567ffffffffffffffff8111156135bf576135be612ccd565b5b6135cb87828801613526565b91505092959194509250565b600067ffffffffffffffff8211156135f2576135f1613429565b5b602082029050602081019050919050565b6000613616613611846135d7565b613489565b905080838252602082019050602084028301858111156136395761363861304a565b5b835b81811015613662578061364e8882612e60565b84526020840193505060208101905061363b565b5050509392505050565b600082601f83011261368157613680613040565b5b8135613691848260208601613603565b91505092915050565b6000602082840312156136b0576136af612cc8565b5b600082013567ffffffffffffffff8111156136ce576136cd612ccd565b5b6136da8482850161366c565b91505092915050565b6000819050919050565b6136f6816136e3565b811461370157600080fd5b50565b600081359050613713816136ed565b92915050565b60006020828403121561372f5761372e612cc8565b5b600061373d84828501613704565b91505092915050565b6000806040838503121561375d5761375c612cc8565b5b600061376b85828601612f15565b925050602061377c85828601612f15565b9150509250929050565b61378f816136e3565b82525050565b60006020820190506137aa6000830184613786565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600281106137f0576137ef6137b0565b5b50565b6000819050613801826137df565b919050565b6000613811826137f3565b9050919050565b61382181613806565b82525050565b600060208201905061383c6000830184613818565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061388957607f821691505b60208210810361389c5761389b613842565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006138fe602183612d98565b9150613909826138a2565b604082019050919050565b6000602082019050818103600083015261392d816138f1565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613990603d83612d98565b915061399b82613934565b604082019050919050565b600060208201905081810360008301526139bf81613983565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613a22602d83612d98565b9150613a2d826139c6565b604082019050919050565b60006020820190508181036000830152613a5181613a15565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613ac57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613a88565b613acf8683613a88565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613b0c613b07613b0284612e3f565b613ae7565b612e3f565b9050919050565b6000819050919050565b613b2683613af1565b613b3a613b3282613b13565b848454613a95565b825550505050565b600090565b613b4f613b42565b613b5a818484613b1d565b505050565b5b81811015613b7e57613b73600082613b47565b600181019050613b60565b5050565b601f821115613bc357613b9481613a63565b613b9d84613a78565b81016020851015613bac578190505b613bc0613bb885613a78565b830182613b5f565b50505b505050565b600082821c905092915050565b6000613be660001984600802613bc8565b1980831691505092915050565b6000613bff8383613bd5565b9150826002028217905092915050565b613c198383613a58565b67ffffffffffffffff811115613c3257613c31613429565b5b613c3c8254613871565b613c47828285613b82565b6000601f831160018114613c765760008415613c64578287013590505b613c6e8582613bf3565b865550613cd6565b601f198416613c8486613a63565b60005b82811015613cac57848901358255600182019150602085019450602081019050613c87565b86831015613cc95784890135613cc5601f891682613bd5565b8355505b6001600288020188555050505b50505050505050565b7f416c6c20676f6c64656e2043617264732068617665206265656e206d696e746560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d3b602183612d98565b9150613d4682613cdf565b604082019050919050565b60006020820190508181036000830152613d6a81613d2e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613dab82612e3f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613ddd57613ddc613d71565b5b600182019050919050565b7f4e6f2062616c616e636500000000000000000000000000000000000000000000600082015250565b6000613e1e600a83612d98565b9150613e2982613de8565b602082019050919050565b60006020820190508181036000830152613e4d81613e11565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613eb9601883612d98565b9150613ec482613e83565b602082019050919050565b60006020820190508181036000830152613ee881613eac565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613f4b602983612d98565b9150613f5682613eef565b604082019050919050565b60006020820190508181036000830152613f7a81613f3e565b9050919050565b6000613f8c82612e3f565b9150613f9783612e3f565b9250828201905080821115613faf57613fae613d71565b5b92915050565b7f52657175657374206578636565647320636f6c6c656374696f6e2073697a6500600082015250565b6000613feb601f83612d98565b9150613ff682613fb5565b602082019050919050565b6000602082019050818103600083015261401a81613fde565b9050919050565b600081905092915050565b6000815461403981613871565b6140438186614021565b9450600182166000811461405e5760018114614073576140a6565b60ff19831686528115158202860193506140a6565b61407c85613a63565b60005b8381101561409e5781548189015260018201915060208101905061407f565b838801955050505b50505092915050565b60006140bb828461402c565b915081905092915050565b60006140d28385614021565b93506140df8385846134d5565b82840190509392505050565b60006140f88284866140c6565b91508190509392505050565b7f556e617574686f72697a6564207765627369746520646f6d61696e0000000000600082015250565b600061413a601b83612d98565b915061414582614104565b602082019050919050565b600060208201905081810360008301526141698161412d565b9050919050565b7f494f49413a2053616c6573206172652050617573656400000000000000000000600082015250565b60006141a6601683612d98565b91506141b182614170565b602082019050919050565b600060208201905081810360008301526141d581614199565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b6000614212602083612d98565b915061421d826141dc565b602082019050919050565b6000602082019050818103600083015261424181614205565b9050919050565b7f4578636565646564206d617820617661696c61626c6520746f2070757263686160008201527f7365207065722075736572000000000000000000000000000000000000000000602082015250565b60006142a4602b83612d98565b91506142af82614248565b604082019050919050565b600060208201905081810360008301526142d381614297565b9050919050565b60006142e582612e3f565b91506142f083612e3f565b92508282026142fe81612e3f565b9150828204841483151761431557614314613d71565b5b5092915050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b6000614352601f83612d98565b915061435d8261431c565b602082019050919050565b6000602082019050818103600083015261438181614345565b9050919050565b60006143938261311f565b915060ff82036143a6576143a5613d71565b5b600182019050919050565b7f494f49413a2053616c657320617265206f666600000000000000000000000000600082015250565b60006143e7601383612d98565b91506143f2826143b1565b602082019050919050565b60006020820190508181036000830152614416816143da565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614479602f83612d98565b91506144848261441d565b604082019050919050565b600060208201905081810360008301526144a88161446c565b9050919050565b60006144ba82612d8d565b6144c48185614021565b93506144d4818560208601612da9565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614516600583614021565b9150614521826144e0565b600582019050919050565b600061453882856144af565b915061454482846144af565b915061454f82614509565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006145b7602683612d98565b91506145c28261455b565b604082019050919050565b600060208201905081810360008301526145e6816145aa565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614623602083612d98565b915061462e826145ed565b602082019050919050565b6000602082019050818103600083015261465281614616565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006146b5602583612d98565b91506146c082614659565b604082019050919050565b600060208201905081810360008301526146e4816146a8565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614747602483612d98565b9150614752826146eb565b604082019050919050565b600060208201905081810360008301526147768161473a565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006147b3601f83612d98565b91506147be8261477d565b602082019050919050565b600060208201905081810360008301526147e2816147a6565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061481f601983612d98565b915061482a826147e9565b602082019050919050565b6000602082019050818103600083015261484e81614812565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006148b1603283612d98565b91506148bc82614855565b604082019050919050565b600060208201905081810360008301526148e0816148a4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f63616e206e6f74207472616e73666572206966206269642069732062656c6f7760008201527f20302e3320455448000000000000000000000000000000000000000000000000602082015250565b6000614972602883612d98565b915061497d82614916565b604082019050919050565b600060208201905081810360008301526149a181614965565b9050919050565b60006149b382612e3f565b9150600082036149c6576149c5613d71565b5b600182039050919050565b600081519050919050565b600082825260208201905092915050565b60006149f8826149d1565b614a0281856149dc565b9350614a12818560208601612da9565b614a1b81612dd3565b840191505092915050565b6000608082019050614a3b6000830187612ed4565b614a486020830186612ed4565b614a556040830185612f6a565b8181036060830152614a6781846149ed565b905095945050505050565b600081519050614a8181612cfe565b92915050565b600060208284031215614a9d57614a9c612cc8565b5b6000614aab84828501614a72565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614aea602083612d98565b9150614af582614ab4565b602082019050919050565b60006020820190508181036000830152614b1981614add565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614b56601c83612d98565b9150614b6182614b20565b602082019050919050565b60006020820190508181036000830152614b8581614b49565b905091905056fe68747470733a2f2f696f696e766573746d656e7461636164656d792e6769746875622e696f2f6a736f6e646174612f636f6e74726163745572692e6a736f6ea26469706673582212206c90bfd86d0943c9003eec03cf767c5000e5f6d23bc3fe55af8813b7f7b7e87e64736f6c6343000813003368747470733a2f2f626c61636b2d747261646974696f6e616c2d74696765722d3838342e6d7970696e6174612e636c6f75642f697066732f516d636261795a54785836594838574163564c7668637558706a466e6d32343876644a5a5333636876484e6847382f

Deployed Bytecode

0x6080604052600436106102675760003560e01c80637786269a11610144578063d8d46126116100b6578063ebc334471161007a578063ebc3344714610919578063ebf0c71714610944578063f2fde38b1461096f578063f9020e3314610998578063fc6c02e3146109c3578063fddcb5ea146109ec57610267565b8063d8d4612614610834578063dab5f3401461085f578063e8a3d48514610888578063e985e9c5146108b3578063e9b3c466146108f057610267565b8063af6128c211610108578063af6128c214610712578063b88d4fde1461074f578063c002d23d14610778578063c87b56dd146107a3578063cd0b8f0c146107e0578063d5abeb011461080957610267565b80637786269a1461064c5780638da5cb5b1461066857806395d89b41146106935780639b08a22f146106be578063a22cb465146106e957610267565b80633ccfd60b116101dd57806362a6d197116101a157806362a6d1971461052c5780636352211e146105695780636f8b44b0146105a657806370a08231146105cf578063715018a61461060c578063729ad39e1461062357610267565b80633ccfd60b1461045d5780633fd173661461047457806342842e0e1461049d57806348756c17146104c65780634891ad881461050357610267565b806321848c9a1161022f57806321848c9a1461036557806323b872dd1461038e5780632534e5b9146103b75780632ba7c04c146103e05780632eef3f7c146104095780633661edfa1461043257610267565b806301ffc9a71461026c57806306fdde03146102a9578063081812fc146102d4578063095ea7b31461031157806318160ddd1461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e9190612d2a565b610a29565b6040516102a09190612d72565b60405180910390f35b3480156102b557600080fd5b506102be610b0b565b6040516102cb9190612e1d565b60405180910390f35b3480156102e057600080fd5b506102fb60048036038101906102f69190612e75565b610b9d565b6040516103089190612ee3565b60405180910390f35b34801561031d57600080fd5b5061033860048036038101906103339190612f2a565b610be3565b005b34801561034657600080fd5b5061034f610cfa565b60405161035c9190612f79565b60405180910390f35b34801561037157600080fd5b5061038c60048036038101906103879190612fc0565b610d0b565b005b34801561039a57600080fd5b506103b560048036038101906103b09190612fed565b610d30565b005b3480156103c357600080fd5b506103de60048036038101906103d991906130a5565b610d90565b005b3480156103ec57600080fd5b50610407600480360381019061040291906130f2565b610dae565b005b34801561041557600080fd5b50610430600480360381019061042b9190613158565b610e65565b005b34801561043e57600080fd5b50610447610e8b565b6040516104549190613194565b60405180910390f35b34801561046957600080fd5b50610472610e9e565b005b34801561048057600080fd5b5061049b60048036038101906104969190612e75565b610f3f565b005b3480156104a957600080fd5b506104c460048036038101906104bf9190612fed565b610f51565b005b3480156104d257600080fd5b506104ed60048036038101906104e891906130f2565b610f71565b6040516104fa919061326d565b60405180910390f35b34801561050f57600080fd5b5061052a600480360381019061052591906132b4565b611086565b005b34801561053857600080fd5b50610553600480360381019061054e9190612e75565b6110bb565b6040516105609190612f79565b60405180910390f35b34801561057557600080fd5b50610590600480360381019061058b9190612e75565b6110d3565b60405161059d9190612ee3565b60405180910390f35b3480156105b257600080fd5b506105cd60048036038101906105c89190612e75565b611159565b005b3480156105db57600080fd5b506105f660048036038101906105f191906130f2565b61116b565b6040516106039190612f79565b60405180910390f35b34801561061857600080fd5b50610621611222565b005b34801561062f57600080fd5b5061064a60048036038101906106459190613337565b611236565b005b61066660048036038101906106619190613384565b611391565b005b34801561067457600080fd5b5061067d6116f9565b60405161068a9190612ee3565b60405180910390f35b34801561069f57600080fd5b506106a8611723565b6040516106b59190612e1d565b60405180910390f35b3480156106ca57600080fd5b506106d36117b5565b6040516106e09190612d72565b60405180910390f35b3480156106f557600080fd5b50610710600480360381019061070b91906133e4565b6117c8565b005b34801561071e57600080fd5b5061073960048036038101906107349190612e75565b6117de565b6040516107469190612f79565b60405180910390f35b34801561075b57600080fd5b5061077660048036038101906107719190613554565b611870565b005b34801561078457600080fd5b5061078d6118d2565b60405161079a9190612f79565b60405180910390f35b3480156107af57600080fd5b506107ca60048036038101906107c59190612e75565b6118d8565b6040516107d79190612e1d565b60405180910390f35b3480156107ec57600080fd5b506108076004803603810190610802919061369a565b6119e3565b005b34801561081557600080fd5b5061081e611a51565b60405161082b9190612f79565b60405180910390f35b34801561084057600080fd5b50610849611a57565b6040516108569190612f79565b60405180910390f35b34801561086b57600080fd5b5061088660048036038101906108819190613719565b611a5d565b005b34801561089457600080fd5b5061089d611a6f565b6040516108aa9190612e1d565b60405180910390f35b3480156108bf57600080fd5b506108da60048036038101906108d59190613746565b611a8f565b6040516108e79190612d72565b60405180910390f35b3480156108fc57600080fd5b50610917600480360381019061091291906130a5565b611b23565b005b34801561092557600080fd5b5061092e611b41565b60405161093b9190612f79565b60405180910390f35b34801561095057600080fd5b50610959611b46565b6040516109669190613795565b60405180910390f35b34801561097b57600080fd5b50610996600480360381019061099191906130f2565b611b4c565b005b3480156109a457600080fd5b506109ad611bcf565b6040516109ba9190613827565b60405180910390f35b3480156109cf57600080fd5b506109ea60048036038101906109e59190612e75565b611be2565b005b3480156109f857600080fd5b50610a136004803603810190610a0e91906130f2565b611c06565b604051610a209190612f79565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610af457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b045750610b0382611c1e565b5b9050919050565b606060008054610b1a90613871565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4690613871565b8015610b935780601f10610b6857610100808354040283529160200191610b93565b820191906000526020600020905b815481529060010190602001808311610b7657829003601f168201915b5050505050905090565b6000610ba882611c88565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bee826110d3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5590613914565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c7d611cd3565b73ffffffffffffffffffffffffffffffffffffffff161480610cac5750610cab81610ca6611cd3565b611a8f565b5b610ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce2906139a6565b60405180910390fd5b610cf58383611cdb565b505050565b6000610d066008611d94565b905090565b610d13611da2565b80601160006101000a81548160ff02191690831515021790555050565b610d41610d3b611cd3565b82611e20565b610d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7790613a38565b60405180910390fd5b610d8b838383611eb5565b505050565b610d98611da2565b8181600d9182610da9929190613c0f565b505050565b610db6611da2565b600360125410610dfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df290613d51565b60405180910390fd5b600060125403610e1657610e11816103836121ae565b610e4a565b600160125403610e3157610e2c816103846121ae565b610e49565b600260125403610e4857610e47816103856121ae565b5b5b5b60126000815480929190610e5d90613da0565b919050555050565b610e6d611da2565b80600a60006101000a81548160ff021916908360ff16021790555050565b600a60009054906101000a900460ff1681565b610ea6611da2565b600047905060008114610eee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee590613e34565b60405180910390fd5b610ef66116f9565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f3b573d6000803e3d6000fd5b5050565b610f47611da2565b80600b8190555050565b610f6c83838360405180602001604052806000815250611870565b505050565b60606000610f7e8361116b565b905060008167ffffffffffffffff811115610f9c57610f9b613429565b5b604051908082528060200260200182016040528015610fca5781602001602082028036833780820191505090505b509050600080610fda6008611d94565b90506000600190505b81811161107957610ff3816121cc565b801561103257508673ffffffffffffffffffffffffffffffffffffffff1661101a826110d3565b73ffffffffffffffffffffffffffffffffffffffff16145b15611066578084848151811061104b5761104a613e54565b5b602002602001018181525050828061106290613da0565b9350505b808061107190613da0565b915050610fe3565b5082945050505050919050565b61108e611da2565b80600c60006101000a81548160ff021916908360018111156110b3576110b26137b0565b5b021790555050565b60106020528060005260406000206000915090505481565b6000806110df8361220d565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611150576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114790613ecf565b60405180910390fd5b80915050919050565b611161611da2565b8060098190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d290613f61565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61122a611da2565b611234600061224a565b565b61123e611da2565b6009548282905061124f6008611d94565b6112599190613f81565b10611299576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129090614001565b60405180910390fd5b60005b8282905081101561138c57600060016112b56008611d94565b6112bf9190613f81565b90506112f28484848181106112d7576112d6613e54565b5b90506020020160208101906112ec91906130f2565b826121ae565b600f600085858581811061130957611308613e54565b5b905060200201602081019061131e91906130f2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061136990613da0565b91905055506113786008612310565b50808061138490613da0565b91505061129c565b505050565b611399612326565b60136040516020016113ab91906140af565b6040516020818303038152906040528051906020012082826040516020016113d49291906140eb565b604051602081830303815290604052805190602001201461142a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142190614150565b60405180910390fd5b6000600181111561143e5761143d6137b0565b5b600c60009054906101000a900460ff1660018111156114605761145f6137b0565b5b036114a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611497906141bc565b60405180910390fd5b6009548360ff166114b16008611d94565b6114bb9190613f81565b11156114fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f390614228565b60405180910390fd5b600a60009054906101000a900460ff1660ff168360ff16600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461155d9190613f81565b111561159e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611595906142ba565b60405180910390fd5b348360ff16600b546115b091906142da565b11156115f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e890614368565b60405180910390fd5b60008360ff16600b5461160491906142da565b905060005b8460ff168160ff16101561169c576116216008612310565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061167190613da0565b9190505550611689336116846008611d94565b6121ae565b808061169490614388565b915050611609565b506116a56116f9565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156116ea573d6000803e3d6000fd5b50506116f4612375565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461173290613871565b80601f016020809104026020016040519081016040528092919081815260200182805461175e90613871565b80156117ab5780601f10611780576101008083540402835291602001916117ab565b820191906000526020600020905b81548152906001019060200180831161178e57829003601f168201915b5050505050905090565b601160009054906101000a900460ff1681565b6117da6117d3611cd3565b838361237f565b5050565b60008060018111156117f3576117f26137b0565b5b600c60009054906101000a900460ff166001811115611815576118146137b0565b5b03611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184c906143fd565b60405180910390fd5b6000600b549050808361186891906142da565b915050919050565b61188161187b611cd3565b83611e20565b6118c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b790613a38565b60405180910390fd5b6118cc848484846124eb565b50505050565b600b5481565b60606118e3826121cc565b611922576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119199061448f565b60405180910390fd5b6000600d805461193190613871565b80601f016020809104026020016040519081016040528092919081815260200182805461195d90613871565b80156119aa5780601f1061197f576101008083540402835291602001916119aa565b820191906000526020600020905b81548152906001019060200180831161198d57829003601f168201915b50505050509050806119bb84612547565b6040516020016119cc92919061452c565b604051602081830303815290604052915050919050565b6119eb611da2565b60005b8151811015611a4d5760106000838381518110611a0e57611a0d613e54565b5b602002602001015181526020019081526020016000206000815480929190611a3590613da0565b91905055508080611a4590613da0565b9150506119ee565b5050565b60095481565b60125481565b611a65611da2565b80600e8190555050565b60606040518060600160405280603f8152602001614b8d603f9139905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b2b611da2565b818160139182611b3c929190613c0f565b505050565b600381565b600e5481565b611b54611da2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bba906145cd565b60405180910390fd5b611bcc8161224a565b50565b600c60009054906101000a900460ff1681565b611bea611da2565b6000601060008381526020019081526020016000208190555050565b600f6020528060005260406000206000915090505481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611c91816121cc565b611cd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc790613ecf565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d4e836110d3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b611daa611cd3565b73ffffffffffffffffffffffffffffffffffffffff16611dc86116f9565b73ffffffffffffffffffffffffffffffffffffffff1614611e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1590614639565b60405180910390fd5b565b600080611e2c836110d3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e6e5750611e6d8185611a8f565b5b80611eac57508373ffffffffffffffffffffffffffffffffffffffff16611e9484610b9d565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ed5826110d3565b73ffffffffffffffffffffffffffffffffffffffff1614611f2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f22906146cb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f919061475d565b60405180910390fd5b611fa78383836001612615565b8273ffffffffffffffffffffffffffffffffffffffff16611fc7826110d3565b73ffffffffffffffffffffffffffffffffffffffff161461201d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612014906146cb565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121a9838383600161273d565b505050565b6121c8828260405180602001604052806000815250612743565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166121ee8361220d565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b60026007540361236b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612362906147c9565b60405180910390fd5b6002600781905550565b6001600781905550565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e490614835565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124de9190612d72565b60405180910390a3505050565b6124f6848484611eb5565b6125028484848461279e565b612541576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612538906148c7565b60405180910390fd5b50505050565b60606000600161255684612925565b01905060008167ffffffffffffffff81111561257557612574613429565b5b6040519080825280601f01601f1916602001820160405280156125a75781602001600182028036833780820191505090505b509050600082602001820190505b60011561260a578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816125fe576125fd6148e7565b5b049450600085036125b5575b819350505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415801561267f5750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b1561273657601160009054906101000a900460ff16156126aa576126a584848484612a78565b612737565b6000601060008481526020019081526020016000205403612700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f790614988565b60405180910390fd5b61270c84848484612a78565b601060008381526020019081526020016000206000815480929190612730906149a8565b91905055505b5b50505050565b50505050565b61274d8383612a7e565b61275a600084848461279e565b612799576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612790906148c7565b60405180910390fd5b505050565b60006127bf8473ffffffffffffffffffffffffffffffffffffffff16612c9b565b15612918578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127e8611cd3565b8786866040518563ffffffff1660e01b815260040161280a9493929190614a26565b6020604051808303816000875af192505050801561284657506040513d601f19601f820116820180604052508101906128439190614a87565b60015b6128c8573d8060008114612876576040519150601f19603f3d011682016040523d82523d6000602084013e61287b565b606091505b5060008151036128c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b7906148c7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061291d565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612983577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612979576129786148e7565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106129c0576d04ee2d6d415b85acef810000000083816129b6576129b56148e7565b5b0492506020810190505b662386f26fc1000083106129ef57662386f26fc1000083816129e5576129e46148e7565b5b0492506010810190505b6305f5e1008310612a18576305f5e1008381612a0e57612a0d6148e7565b5b0492506008810190505b6127108310612a3d576127108381612a3357612a326148e7565b5b0492506004810190505b60648310612a605760648381612a5657612a556148e7565b5b0492506002810190505b600a8310612a6f576001810190505b80915050919050565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae490614b00565b60405180910390fd5b612af6816121cc565b15612b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2d90614b6c565b60405180910390fd5b612b44600083836001612615565b612b4d816121cc565b15612b8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8490614b6c565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c9760008383600161273d565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612d0781612cd2565b8114612d1257600080fd5b50565b600081359050612d2481612cfe565b92915050565b600060208284031215612d4057612d3f612cc8565b5b6000612d4e84828501612d15565b91505092915050565b60008115159050919050565b612d6c81612d57565b82525050565b6000602082019050612d876000830184612d63565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612dc7578082015181840152602081019050612dac565b60008484015250505050565b6000601f19601f8301169050919050565b6000612def82612d8d565b612df98185612d98565b9350612e09818560208601612da9565b612e1281612dd3565b840191505092915050565b60006020820190508181036000830152612e378184612de4565b905092915050565b6000819050919050565b612e5281612e3f565b8114612e5d57600080fd5b50565b600081359050612e6f81612e49565b92915050565b600060208284031215612e8b57612e8a612cc8565b5b6000612e9984828501612e60565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ecd82612ea2565b9050919050565b612edd81612ec2565b82525050565b6000602082019050612ef86000830184612ed4565b92915050565b612f0781612ec2565b8114612f1257600080fd5b50565b600081359050612f2481612efe565b92915050565b60008060408385031215612f4157612f40612cc8565b5b6000612f4f85828601612f15565b9250506020612f6085828601612e60565b9150509250929050565b612f7381612e3f565b82525050565b6000602082019050612f8e6000830184612f6a565b92915050565b612f9d81612d57565b8114612fa857600080fd5b50565b600081359050612fba81612f94565b92915050565b600060208284031215612fd657612fd5612cc8565b5b6000612fe484828501612fab565b91505092915050565b60008060006060848603121561300657613005612cc8565b5b600061301486828701612f15565b935050602061302586828701612f15565b925050604061303686828701612e60565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f84011261306557613064613040565b5b8235905067ffffffffffffffff81111561308257613081613045565b5b60208301915083600182028301111561309e5761309d61304a565b5b9250929050565b600080602083850312156130bc576130bb612cc8565b5b600083013567ffffffffffffffff8111156130da576130d9612ccd565b5b6130e68582860161304f565b92509250509250929050565b60006020828403121561310857613107612cc8565b5b600061311684828501612f15565b91505092915050565b600060ff82169050919050565b6131358161311f565b811461314057600080fd5b50565b6000813590506131528161312c565b92915050565b60006020828403121561316e5761316d612cc8565b5b600061317c84828501613143565b91505092915050565b61318e8161311f565b82525050565b60006020820190506131a96000830184613185565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6131e481612e3f565b82525050565b60006131f683836131db565b60208301905092915050565b6000602082019050919050565b600061321a826131af565b61322481856131ba565b935061322f836131cb565b8060005b8381101561326057815161324788826131ea565b975061325283613202565b925050600181019050613233565b5085935050505092915050565b60006020820190508181036000830152613287818461320f565b905092915050565b6002811061329c57600080fd5b50565b6000813590506132ae8161328f565b92915050565b6000602082840312156132ca576132c9612cc8565b5b60006132d88482850161329f565b91505092915050565b60008083601f8401126132f7576132f6613040565b5b8235905067ffffffffffffffff81111561331457613313613045565b5b6020830191508360208202830111156133305761332f61304a565b5b9250929050565b6000806020838503121561334e5761334d612cc8565b5b600083013567ffffffffffffffff81111561336c5761336b612ccd565b5b613378858286016132e1565b92509250509250929050565b60008060006040848603121561339d5761339c612cc8565b5b60006133ab86828701613143565b935050602084013567ffffffffffffffff8111156133cc576133cb612ccd565b5b6133d88682870161304f565b92509250509250925092565b600080604083850312156133fb576133fa612cc8565b5b600061340985828601612f15565b925050602061341a85828601612fab565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61346182612dd3565b810181811067ffffffffffffffff821117156134805761347f613429565b5b80604052505050565b6000613493612cbe565b905061349f8282613458565b919050565b600067ffffffffffffffff8211156134bf576134be613429565b5b6134c882612dd3565b9050602081019050919050565b82818337600083830152505050565b60006134f76134f2846134a4565b613489565b90508281526020810184848401111561351357613512613424565b5b61351e8482856134d5565b509392505050565b600082601f83011261353b5761353a613040565b5b813561354b8482602086016134e4565b91505092915050565b6000806000806080858703121561356e5761356d612cc8565b5b600061357c87828801612f15565b945050602061358d87828801612f15565b935050604061359e87828801612e60565b925050606085013567ffffffffffffffff8111156135bf576135be612ccd565b5b6135cb87828801613526565b91505092959194509250565b600067ffffffffffffffff8211156135f2576135f1613429565b5b602082029050602081019050919050565b6000613616613611846135d7565b613489565b905080838252602082019050602084028301858111156136395761363861304a565b5b835b81811015613662578061364e8882612e60565b84526020840193505060208101905061363b565b5050509392505050565b600082601f83011261368157613680613040565b5b8135613691848260208601613603565b91505092915050565b6000602082840312156136b0576136af612cc8565b5b600082013567ffffffffffffffff8111156136ce576136cd612ccd565b5b6136da8482850161366c565b91505092915050565b6000819050919050565b6136f6816136e3565b811461370157600080fd5b50565b600081359050613713816136ed565b92915050565b60006020828403121561372f5761372e612cc8565b5b600061373d84828501613704565b91505092915050565b6000806040838503121561375d5761375c612cc8565b5b600061376b85828601612f15565b925050602061377c85828601612f15565b9150509250929050565b61378f816136e3565b82525050565b60006020820190506137aa6000830184613786565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600281106137f0576137ef6137b0565b5b50565b6000819050613801826137df565b919050565b6000613811826137f3565b9050919050565b61382181613806565b82525050565b600060208201905061383c6000830184613818565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061388957607f821691505b60208210810361389c5761389b613842565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006138fe602183612d98565b9150613909826138a2565b604082019050919050565b6000602082019050818103600083015261392d816138f1565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613990603d83612d98565b915061399b82613934565b604082019050919050565b600060208201905081810360008301526139bf81613983565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613a22602d83612d98565b9150613a2d826139c6565b604082019050919050565b60006020820190508181036000830152613a5181613a15565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613ac57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613a88565b613acf8683613a88565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613b0c613b07613b0284612e3f565b613ae7565b612e3f565b9050919050565b6000819050919050565b613b2683613af1565b613b3a613b3282613b13565b848454613a95565b825550505050565b600090565b613b4f613b42565b613b5a818484613b1d565b505050565b5b81811015613b7e57613b73600082613b47565b600181019050613b60565b5050565b601f821115613bc357613b9481613a63565b613b9d84613a78565b81016020851015613bac578190505b613bc0613bb885613a78565b830182613b5f565b50505b505050565b600082821c905092915050565b6000613be660001984600802613bc8565b1980831691505092915050565b6000613bff8383613bd5565b9150826002028217905092915050565b613c198383613a58565b67ffffffffffffffff811115613c3257613c31613429565b5b613c3c8254613871565b613c47828285613b82565b6000601f831160018114613c765760008415613c64578287013590505b613c6e8582613bf3565b865550613cd6565b601f198416613c8486613a63565b60005b82811015613cac57848901358255600182019150602085019450602081019050613c87565b86831015613cc95784890135613cc5601f891682613bd5565b8355505b6001600288020188555050505b50505050505050565b7f416c6c20676f6c64656e2043617264732068617665206265656e206d696e746560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d3b602183612d98565b9150613d4682613cdf565b604082019050919050565b60006020820190508181036000830152613d6a81613d2e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613dab82612e3f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613ddd57613ddc613d71565b5b600182019050919050565b7f4e6f2062616c616e636500000000000000000000000000000000000000000000600082015250565b6000613e1e600a83612d98565b9150613e2982613de8565b602082019050919050565b60006020820190508181036000830152613e4d81613e11565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613eb9601883612d98565b9150613ec482613e83565b602082019050919050565b60006020820190508181036000830152613ee881613eac565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613f4b602983612d98565b9150613f5682613eef565b604082019050919050565b60006020820190508181036000830152613f7a81613f3e565b9050919050565b6000613f8c82612e3f565b9150613f9783612e3f565b9250828201905080821115613faf57613fae613d71565b5b92915050565b7f52657175657374206578636565647320636f6c6c656374696f6e2073697a6500600082015250565b6000613feb601f83612d98565b9150613ff682613fb5565b602082019050919050565b6000602082019050818103600083015261401a81613fde565b9050919050565b600081905092915050565b6000815461403981613871565b6140438186614021565b9450600182166000811461405e5760018114614073576140a6565b60ff19831686528115158202860193506140a6565b61407c85613a63565b60005b8381101561409e5781548189015260018201915060208101905061407f565b838801955050505b50505092915050565b60006140bb828461402c565b915081905092915050565b60006140d28385614021565b93506140df8385846134d5565b82840190509392505050565b60006140f88284866140c6565b91508190509392505050565b7f556e617574686f72697a6564207765627369746520646f6d61696e0000000000600082015250565b600061413a601b83612d98565b915061414582614104565b602082019050919050565b600060208201905081810360008301526141698161412d565b9050919050565b7f494f49413a2053616c6573206172652050617573656400000000000000000000600082015250565b60006141a6601683612d98565b91506141b182614170565b602082019050919050565b600060208201905081810360008301526141d581614199565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b6000614212602083612d98565b915061421d826141dc565b602082019050919050565b6000602082019050818103600083015261424181614205565b9050919050565b7f4578636565646564206d617820617661696c61626c6520746f2070757263686160008201527f7365207065722075736572000000000000000000000000000000000000000000602082015250565b60006142a4602b83612d98565b91506142af82614248565b604082019050919050565b600060208201905081810360008301526142d381614297565b9050919050565b60006142e582612e3f565b91506142f083612e3f565b92508282026142fe81612e3f565b9150828204841483151761431557614314613d71565b5b5092915050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b6000614352601f83612d98565b915061435d8261431c565b602082019050919050565b6000602082019050818103600083015261438181614345565b9050919050565b60006143938261311f565b915060ff82036143a6576143a5613d71565b5b600182019050919050565b7f494f49413a2053616c657320617265206f666600000000000000000000000000600082015250565b60006143e7601383612d98565b91506143f2826143b1565b602082019050919050565b60006020820190508181036000830152614416816143da565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614479602f83612d98565b91506144848261441d565b604082019050919050565b600060208201905081810360008301526144a88161446c565b9050919050565b60006144ba82612d8d565b6144c48185614021565b93506144d4818560208601612da9565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614516600583614021565b9150614521826144e0565b600582019050919050565b600061453882856144af565b915061454482846144af565b915061454f82614509565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006145b7602683612d98565b91506145c28261455b565b604082019050919050565b600060208201905081810360008301526145e6816145aa565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614623602083612d98565b915061462e826145ed565b602082019050919050565b6000602082019050818103600083015261465281614616565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006146b5602583612d98565b91506146c082614659565b604082019050919050565b600060208201905081810360008301526146e4816146a8565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614747602483612d98565b9150614752826146eb565b604082019050919050565b600060208201905081810360008301526147768161473a565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006147b3601f83612d98565b91506147be8261477d565b602082019050919050565b600060208201905081810360008301526147e2816147a6565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061481f601983612d98565b915061482a826147e9565b602082019050919050565b6000602082019050818103600083015261484e81614812565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006148b1603283612d98565b91506148bc82614855565b604082019050919050565b600060208201905081810360008301526148e0816148a4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f63616e206e6f74207472616e73666572206966206269642069732062656c6f7760008201527f20302e3320455448000000000000000000000000000000000000000000000000602082015250565b6000614972602883612d98565b915061497d82614916565b604082019050919050565b600060208201905081810360008301526149a181614965565b9050919050565b60006149b382612e3f565b9150600082036149c6576149c5613d71565b5b600182039050919050565b600081519050919050565b600082825260208201905092915050565b60006149f8826149d1565b614a0281856149dc565b9350614a12818560208601612da9565b614a1b81612dd3565b840191505092915050565b6000608082019050614a3b6000830187612ed4565b614a486020830186612ed4565b614a556040830185612f6a565b8181036060830152614a6781846149ed565b905095945050505050565b600081519050614a8181612cfe565b92915050565b600060208284031215614a9d57614a9c612cc8565b5b6000614aab84828501614a72565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614aea602083612d98565b9150614af582614ab4565b602082019050919050565b60006020820190508181036000830152614b1981614add565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614b56601c83612d98565b9150614b6182614b20565b602082019050919050565b60006020820190508181036000830152614b8581614b49565b905091905056fe68747470733a2f2f696f696e766573746d656e7461636164656d792e6769746875622e696f2f6a736f6e646174612f636f6e74726163745572692e6a736f6ea26469706673582212206c90bfd86d0943c9003eec03cf767c5000e5f6d23bc3fe55af8813b7f7b7e87e64736f6c63430008130033

Deployed Bytecode Sourcemap

79828:6307:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59386:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60314:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61826:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61344:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81417:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85065:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62526:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81318:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83042:447;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81771:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80065:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85217:181;;;;;;;;;;;;;:::i;:::-;;81668:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62932:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82542:486;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81562:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80418:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60024:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83499:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59755:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77464:103;;;;;;;;;;;;;:::i;:::-;;84647:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83604:963;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76816:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60483:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80468:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62069:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82333:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63188:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80115:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81988:337;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80991:173;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80033:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80551:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80748:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85980:148;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62295:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80842:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80499:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80344:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77722:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80153:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81173:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80369:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59386:305;59488:4;59540:25;59525:40;;;:11;:40;;;;:105;;;;59597:33;59582:48;;;:11;:48;;;;59525:105;:158;;;;59647:36;59671:11;59647:23;:36::i;:::-;59525:158;59505:178;;59386:305;;;:::o;60314:100::-;60368:13;60401:5;60394:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60314:100;:::o;61826:171::-;61902:7;61922:23;61937:7;61922:14;:23::i;:::-;61965:15;:24;61981:7;61965:24;;;;;;;;;;;;;;;;;;;;;61958:31;;61826:171;;;:::o;61344:416::-;61425:13;61441:23;61456:7;61441:14;:23::i;:::-;61425:39;;61489:5;61483:11;;:2;:11;;;61475:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;61583:5;61567:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;61592:37;61609:5;61616:12;:10;:12::i;:::-;61592:16;:37::i;:::-;61567:62;61545:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;61731:21;61740:2;61744:7;61731:8;:21::i;:::-;61414:346;61344:416;;:::o;81417:95::-;81463:4;81486:19;:9;:17;:19::i;:::-;81479:26;;81417:95;:::o;85065:100::-;76702:13;:11;:13::i;:::-;85152:5:::1;85136:13;;:21;;;;;;;;;;;;;;;;;;85065:100:::0;:::o;62526:335::-;62721:41;62740:12;:10;:12::i;:::-;62754:7;62721:18;:41::i;:::-;62713:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;62825:28;62835:4;62841:2;62845:7;62825:9;:28::i;:::-;62526:335;;;:::o;81318:91::-;76702:13;:11;:13::i;:::-;81399:3:::1;;81388:8;:14;;;;;;;:::i;:::-;;81318:91:::0;;:::o;83042:447::-;76702:13;:11;:13::i;:::-;80544:1:::1;83122:15;;:36;83114:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;83234:1;83215:15;;:20:::0;83211:243:::1;;83252:24;83262:8;83272:3;83252:9;:24::i;:::-;83211:243;;;83317:1;83298:15;;:20:::0;83294:160:::1;;83335:24;83345:8;83355:3;83335:9;:24::i;:::-;83294:160;;;83400:1;83381:15;;:20:::0;83377:77:::1;;83418:24;83428:8;83438:3;83418:9;:24::i;:::-;83377:77;83294:160;83211:243;83464:15;;:17;;;;;;;;;:::i;:::-;;;;;;83042:447:::0;:::o;81771:99::-;76702:13;:11;:13::i;:::-;81860:3:::1;81830:27;;:33;;;;;;;;;;;;;;;;;;81771:99:::0;:::o;80065:44::-;;;;;;;;;;;;;:::o;85217:181::-;76702:13;:11;:13::i;:::-;85266:12:::1;85281:21;85266:36;;85331:1;85320:7;:12;85312:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;85365:7;:5;:7::i;:::-;85357:25;;:34;85383:7;85357:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;85256:142;85217:181::o:0;81668:91::-;76702:13;:11;:13::i;:::-;81747:5:::1;81734:10;:18;;;;81668:91:::0;:::o;62932:185::-;63070:39;63087:4;63093:2;63097:7;63070:39;;;;;;;;;;;;:16;:39::i;:::-;62932:185;;;:::o;82542:486::-;82614:16;82639:22;82664:17;82674:6;82664:9;:17::i;:::-;82639:42;;82688:28;82733:14;82719:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82688:60;;82755:13;82779:16;82798:19;:9;:17;:19::i;:::-;82779:38;;82829:9;82841:1;82829:13;;82824:169;82849:8;82844:1;:13;82824:169;;82879:10;82887:1;82879:7;:10::i;:::-;:34;;;;;82907:6;82893:20;;:10;82901:1;82893:7;:10::i;:::-;:20;;;82879:34;82875:111;;;82951:1;82930:11;82942:5;82930:18;;;;;;;;:::i;:::-;;;;;;;:22;;;;;82967:7;;;;;:::i;:::-;;;;82875:111;82859:3;;;;;:::i;:::-;;;;82824:169;;;;83010:11;83003:18;;;;;;82542:486;;;:::o;81562:97::-;76702:13;:11;:13::i;:::-;81646:6:::1;81633:10;;:19;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;81562:97:::0;:::o;80418:44::-;;;;;;;;;;;;;;;;;:::o;60024:223::-;60096:7;60116:13;60132:17;60141:7;60132:8;:17::i;:::-;60116:33;;60185:1;60168:19;;:5;:19;;;60160:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;60234:5;60227:12;;;60024:223;;;:::o;83499:91::-;76702:13;:11;:13::i;:::-;83576:6:::1;83564:9;:18;;;;83499:91:::0;:::o;59755:207::-;59827:7;59872:1;59855:19;;:5;:19;;;59847:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;59938:9;:16;59948:5;59938:16;;;;;;;;;;;;;;;;59931:23;;59755:207;;;:::o;77464:103::-;76702:13;:11;:13::i;:::-;77529:30:::1;77556:1;77529:18;:30::i;:::-;77464:103::o:0;84647:404::-;76702:13;:11;:13::i;:::-;84769:9:::1;;84750;;:16;;84728:19;:9;:17;:19::i;:::-;:38;;;;:::i;:::-;:50;84720:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;84826:9;84821:224;84845:9;;:16;;84841:1;:20;84821:224;;;84879:17;84921:1;84899:19;:9;:17;:19::i;:::-;:23;;;;:::i;:::-;84879:43;;84933:34;84943:9;;84953:1;84943:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;84957:9;84933;:34::i;:::-;84978:11;:25;84990:9;;85000:1;84990:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;84978:25;;;;;;;;;;;;;;;;:27;;;;;;;;;:::i;:::-;;;;;;85016:21;:9;:19;:21::i;:::-;84868:177;84863:3;;;;;:::i;:::-;;;;84821:224;;;;84647:404:::0;;:::o;83604:963::-;5959:21;:19;:21::i;:::-;83786:13:::1;83769:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;83759:42;;;;;;83747:6;;83730:24;;;;;;;;;:::i;:::-;;;;;;;;;;;;;83720:35;;;;;;:81;83712:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;83866:17;83852:31;;;;;;;;:::i;:::-;;:10;;;;;;;;;;;:31;;;;;;;;:::i;:::-;;::::0;83844:66:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;83969:9;;83951:14;83929:36;;:19;:9;:17;:19::i;:::-;:36;;;;:::i;:::-;:49;;83921:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;84078:27;;;;;;;;;;;84034:71;;84060:14;84034:40;;:11;:23;84046:10;84034:23;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;:71;;84026:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;84203:9;84185:14;84172:27;;:10;;:27;;;;:::i;:::-;:40;;84164:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;84272:18;84306:14;84293:27;;:10;;:27;;;;:::i;:::-;84272:48;;84341:7;84336:176;84358:14;84354:18;;:1;:18;;;84336:176;;;84390:21;:9;:19;:21::i;:::-;84422:11;:23;84434:10;84422:23;;;;;;;;;;;;;;;;:25;;;;;;;;;:::i;:::-;;;;;;84458:42;84468:10;84480:19;:9;:17;:19::i;:::-;84458:9;:42::i;:::-;84374:3;;;;;:::i;:::-;;;;84336:176;;;;84530:7;:5;:7::i;:::-;84522:25;;:37;84548:10;84522:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;83701:866;6003:20:::0;:18;:20::i;:::-;83604:963;;;:::o;76816:87::-;76862:7;76889:6;;;;;;;;;;;76882:13;;76816:87;:::o;60483:104::-;60539:13;60572:7;60565:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60483:104;:::o;80468:25::-;;;;;;;;;;;;;:::o;62069:155::-;62164:52;62183:12;:10;:12::i;:::-;62197:8;62207;62164:18;:52::i;:::-;62069:155;;:::o;82333:200::-;82384:4;82422:17;82408:31;;;;;;;;:::i;:::-;;:10;;;;;;;;;;;:31;;;;;;;;:::i;:::-;;;82400:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;82473:10;82486;;82473:23;;82521:5;82513;:13;;;;:::i;:::-;82506:20;;;82333:200;;;:::o;63188:322::-;63362:41;63381:12;:10;:12::i;:::-;63395:7;63362:18;:41::i;:::-;63354:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;63464:38;63478:4;63484:2;63488:7;63497:4;63464:13;:38::i;:::-;63188:322;;;;:::o;80115:32::-;;;;:::o;81988:337::-;82061:13;82101:16;82109:7;82101;:16::i;:::-;82093:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;82179:28;82210:8;82179:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82259:14;82275:25;82292:7;82275:16;:25::i;:::-;82242:68;;;;;;;;;:::i;:::-;;;;;;;;;;;;;82228:83;;;81988:337;;;:::o;80991:173::-;76702:13;:11;:13::i;:::-;81072:9:::1;81067:91;81091:6;:13;81087:1;:17;81067:91;;;81125:9;:20;81135:6;81142:1;81135:9;;;;;;;;:::i;:::-;;;;;;;;81125:20;;;;;;;;;;;;:22;;;;;;;;;:::i;:::-;;;;;;81106:3;;;;;:::i;:::-;;;;81067:91;;;;80991:173:::0;:::o;80033:26::-;;;;:::o;80551:30::-;;;;:::o;80748:85::-;76702:13;:11;:13::i;:::-;80819:7:::1;80812:4;:14;;;;80748:85:::0;:::o;85980:148::-;86024:13;86049:72;;;;;;;;;;;;;;;;;;;85980:148;:::o;62295:164::-;62392:4;62416:18;:25;62435:5;62416:25;;;;;;;;;;;;;;;:35;62442:8;62416:35;;;;;;;;;;;;;;;;;;;;;;;;;62409:42;;62295:164;;;;:::o;80842:100::-;76702:13;:11;:13::i;:::-;80931:4:::1;;80915:13;:20;;;;;;;:::i;:::-;;80842:100:::0;;:::o;80499:46::-;80544:1;80499:46;:::o;80344:19::-;;;;:::o;77722:201::-;76702:13;:11;:13::i;:::-;77831:1:::1;77811:22;;:8;:22;;::::0;77803:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;77887:28;77906:8;77887:18;:28::i;:::-;77722:201:::0;:::o;80153:48::-;;;;;;;;;;;;;:::o;81173:106::-;76702:13;:11;:13::i;:::-;81270:1:::1;81249:9;:18;81259:7;81249:18;;;;;;;;;;;:22;;;;81173:106:::0;:::o;80369:43::-;;;;;;;;;;;;;;;;;:::o;34023:157::-;34108:4;34147:25;34132:40;;;:11;:40;;;;34125:47;;34023:157;;;:::o;71645:135::-;71727:16;71735:7;71727;:16::i;:::-;71719:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;71645:135;:::o;44433:98::-;44486:7;44513:10;44506:17;;44433:98;:::o;70924:174::-;71026:2;70999:15;:24;71015:7;70999:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;71082:7;71078:2;71044:46;;71053:23;71068:7;71053:14;:23::i;:::-;71044:46;;;;;;;;;;;;70924:174;;:::o;79153:114::-;79218:7;79245;:14;;;79238:21;;79153:114;;;:::o;76981:132::-;77056:12;:10;:12::i;:::-;77045:23;;:7;:5;:7::i;:::-;:23;;;77037:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76981:132::o;65543:264::-;65636:4;65653:13;65669:23;65684:7;65669:14;:23::i;:::-;65653:39;;65722:5;65711:16;;:7;:16;;;:52;;;;65731:32;65748:5;65755:7;65731:16;:32::i;:::-;65711:52;:87;;;;65791:7;65767:31;;:20;65779:7;65767:11;:20::i;:::-;:31;;;65711:87;65703:96;;;65543:264;;;;:::o;69542:1263::-;69701:4;69674:31;;:23;69689:7;69674:14;:23::i;:::-;:31;;;69666:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;69780:1;69766:16;;:2;:16;;;69758:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;69836:42;69857:4;69863:2;69867:7;69876:1;69836:20;:42::i;:::-;70008:4;69981:31;;:23;69996:7;69981:14;:23::i;:::-;:31;;;69973:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;70126:15;:24;70142:7;70126:24;;;;;;;;;;;;70119:31;;;;;;;;;;;70621:1;70602:9;:15;70612:4;70602:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;70654:1;70637:9;:13;70647:2;70637:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;70696:2;70677:7;:16;70685:7;70677:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;70735:7;70731:2;70716:27;;70725:4;70716:27;;;;;;;;;;;;70756:41;70776:4;70782:2;70786:7;70795:1;70756:19;:41::i;:::-;69542:1263;;;:::o;66149:110::-;66225:26;66235:2;66239:7;66225:26;;;;;;;;;;;;:9;:26::i;:::-;66149:110;;:::o;65248:128::-;65313:4;65366:1;65337:31;;:17;65346:7;65337:8;:17::i;:::-;:31;;;;65330:38;;65248:128;;;:::o;64818:117::-;64884:7;64911;:16;64919:7;64911:16;;;;;;;;;;;;;;;;;;;;;64904:23;;64818:117;;;:::o;78083:191::-;78157:16;78176:6;;;;;;;;;;;78157:25;;78202:8;78193:6;;:17;;;;;;;;;;;;;;;;;;78257:8;78226:40;;78247:8;78226:40;;;;;;;;;;;;78146:128;78083:191;:::o;79275:127::-;79382:1;79364:7;:14;;;:19;;;;;;;;;;;79275:127;:::o;6039:293::-;5441:1;6173:7;;:19;6165:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5441:1;6306:7;:18;;;;6039:293::o;6340:213::-;5397:1;6523:7;:22;;;;6340:213::o;71241:315::-;71396:8;71387:17;;:5;:17;;;71379:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;71483:8;71445:18;:25;71464:5;71445:25;;;;;;;;;;;;;;;:35;71471:8;71445:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;71529:8;71507:41;;71522:5;71507:41;;;71539:8;71507:41;;;;;;:::i;:::-;;;;;;;;71241:315;;;:::o;64391:313::-;64547:28;64557:4;64563:2;64567:7;64547:9;:28::i;:::-;64594:47;64617:4;64623:2;64627:7;64636:4;64594:22;:47::i;:::-;64586:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;64391:313;;;;:::o;19865:716::-;19921:13;19972:14;20009:1;19989:17;20000:5;19989:10;:17::i;:::-;:21;19972:38;;20025:20;20059:6;20048:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20025:41;;20081:11;20210:6;20206:2;20202:15;20194:6;20190:28;20183:35;;20247:288;20254:4;20247:288;;;20279:5;;;;;;;;20421:8;20416:2;20409:5;20405:14;20400:30;20395:3;20387:44;20477:2;20468:11;;;;;;:::i;:::-;;;;;20511:1;20502:5;:10;20247:288;20498:21;20247:288;20556:6;20549:13;;;;;19865:716;;;:::o;85411:553::-;85559:1;85543:18;;:4;:18;;;;:38;;;;;85579:1;85565:16;;:2;:16;;;;85543:38;85540:417;;;85600:13;;;;;;;;;;;85597:345;;;85640:56;85667:4;85673:2;85677:7;85686:9;85640:26;:56::i;:::-;85633:63;;85597:345;85766:1;85743:9;:18;85753:7;85743:18;;;;;;;;;;;;:24;85735:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;85831:56;85858:4;85864:2;85868:7;85877:9;85831:26;:56::i;:::-;85906:9;:18;85916:7;85906:18;;;;;;;;;;;;:20;;;;;;;;;:::i;:::-;;;;;;85540:417;85411:553;;;;;:::o;74810:158::-;;;;;:::o;66486:319::-;66615:18;66621:2;66625:7;66615:5;:18::i;:::-;66666:53;66697:1;66701:2;66705:7;66714:4;66666:22;:53::i;:::-;66644:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;66486:319;;;:::o;72344:853::-;72498:4;72519:15;:2;:13;;;:15::i;:::-;72515:675;;;72571:2;72555:36;;;72592:12;:10;:12::i;:::-;72606:4;72612:7;72621:4;72555:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;72551:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72813:1;72796:6;:13;:18;72792:328;;72839:60;;;;;;;;;;:::i;:::-;;;;;;;;72792:328;73070:6;73064:13;73055:6;73051:2;73047:15;73040:38;72551:584;72687:41;;;72677:51;;;:6;:51;;;;72670:58;;;;;72515:675;73174:4;73167:11;;72344:853;;;;;;;:::o;16731:922::-;16784:7;16804:14;16821:1;16804:18;;16871:6;16862:5;:15;16858:102;;16907:6;16898:15;;;;;;:::i;:::-;;;;;16942:2;16932:12;;;;16858:102;16987:6;16978:5;:15;16974:102;;17023:6;17014:15;;;;;;:::i;:::-;;;;;17058:2;17048:12;;;;16974:102;17103:6;17094:5;:15;17090:102;;17139:6;17130:15;;;;;;:::i;:::-;;;;;17174:2;17164:12;;;;17090:102;17219:5;17210;:14;17206:99;;17254:5;17245:14;;;;;;:::i;:::-;;;;;17288:1;17278:11;;;;17206:99;17332:5;17323;:14;17319:99;;17367:5;17358:14;;;;;;:::i;:::-;;;;;17401:1;17391:11;;;;17319:99;17445:5;17436;:14;17432:99;;17480:5;17471:14;;;;;;:::i;:::-;;;;;17514:1;17504:11;;;;17432:99;17558:5;17549;:14;17545:66;;17594:1;17584:11;;;;17545:66;17639:6;17632:13;;;16731:922;;;:::o;73929:159::-;;;;;:::o;67141:942::-;67235:1;67221:16;;:2;:16;;;67213:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;67294:16;67302:7;67294;:16::i;:::-;67293:17;67285:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;67356:48;67385:1;67389:2;67393:7;67402:1;67356:20;:48::i;:::-;67503:16;67511:7;67503;:16::i;:::-;67502:17;67494:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;67918:1;67901:9;:13;67911:2;67901:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;67962:2;67943:7;:16;67951:7;67943:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;68007:7;68003:2;67982:33;;67999:1;67982:33;;;;;;;;;;;;68028:47;68056:1;68060:2;68064:7;68073:1;68028:19;:47::i;:::-;67141:942;;:::o;22992:326::-;23052:4;23309:1;23287:7;:19;;;:23;23280:30;;22992: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:116::-;5312:21;5327:5;5312:21;:::i;:::-;5305:5;5302:32;5292:60;;5348:1;5345;5338:12;5292:60;5242:116;:::o;5364:133::-;5407:5;5445:6;5432:20;5423:29;;5461:30;5485:5;5461:30;:::i;:::-;5364:133;;;;:::o;5503:323::-;5559:6;5608:2;5596:9;5587:7;5583:23;5579:32;5576:119;;;5614:79;;:::i;:::-;5576:119;5734:1;5759:50;5801:7;5792:6;5781:9;5777:22;5759:50;:::i;:::-;5749:60;;5705:114;5503:323;;;;:::o;5832:619::-;5909:6;5917;5925;5974:2;5962:9;5953:7;5949:23;5945:32;5942:119;;;5980:79;;:::i;:::-;5942:119;6100:1;6125:53;6170:7;6161:6;6150:9;6146:22;6125:53;:::i;:::-;6115:63;;6071:117;6227:2;6253:53;6298:7;6289:6;6278:9;6274:22;6253:53;:::i;:::-;6243:63;;6198:118;6355:2;6381:53;6426:7;6417:6;6406:9;6402:22;6381:53;:::i;:::-;6371:63;;6326:118;5832:619;;;;;:::o;6457:117::-;6566:1;6563;6556:12;6580:117;6689:1;6686;6679:12;6703:117;6812:1;6809;6802:12;6840:553;6898:8;6908:6;6958:3;6951:4;6943:6;6939:17;6935:27;6925:122;;6966:79;;:::i;:::-;6925:122;7079:6;7066:20;7056:30;;7109:18;7101:6;7098:30;7095:117;;;7131:79;;:::i;:::-;7095:117;7245:4;7237:6;7233:17;7221:29;;7299:3;7291:4;7283:6;7279:17;7269:8;7265:32;7262:41;7259:128;;;7306:79;;:::i;:::-;7259:128;6840:553;;;;;:::o;7399:529::-;7470:6;7478;7527:2;7515:9;7506:7;7502:23;7498:32;7495:119;;;7533:79;;:::i;:::-;7495:119;7681:1;7670:9;7666:17;7653:31;7711:18;7703:6;7700:30;7697:117;;;7733:79;;:::i;:::-;7697:117;7846:65;7903:7;7894:6;7883:9;7879:22;7846:65;:::i;:::-;7828:83;;;;7624:297;7399:529;;;;;:::o;7934:329::-;7993:6;8042:2;8030:9;8021:7;8017:23;8013:32;8010:119;;;8048:79;;:::i;:::-;8010:119;8168:1;8193:53;8238:7;8229:6;8218:9;8214:22;8193:53;:::i;:::-;8183:63;;8139:117;7934:329;;;;:::o;8269:86::-;8304:7;8344:4;8337:5;8333:16;8322:27;;8269:86;;;:::o;8361:118::-;8432:22;8448:5;8432:22;:::i;:::-;8425:5;8422:33;8412:61;;8469:1;8466;8459:12;8412:61;8361:118;:::o;8485:135::-;8529:5;8567:6;8554:20;8545:29;;8583:31;8608:5;8583:31;:::i;:::-;8485:135;;;;:::o;8626:325::-;8683:6;8732:2;8720:9;8711:7;8707:23;8703:32;8700:119;;;8738:79;;:::i;:::-;8700:119;8858:1;8883:51;8926:7;8917:6;8906:9;8902:22;8883:51;:::i;:::-;8873:61;;8829:115;8626:325;;;;:::o;8957:112::-;9040:22;9056:5;9040:22;:::i;:::-;9035:3;9028:35;8957:112;;:::o;9075:214::-;9164:4;9202:2;9191:9;9187:18;9179:26;;9215:67;9279:1;9268:9;9264:17;9255:6;9215:67;:::i;:::-;9075:214;;;;:::o;9295:114::-;9362:6;9396:5;9390:12;9380:22;;9295:114;;;:::o;9415:184::-;9514:11;9548:6;9543:3;9536:19;9588:4;9583:3;9579:14;9564:29;;9415:184;;;;:::o;9605:132::-;9672:4;9695:3;9687:11;;9725:4;9720:3;9716:14;9708:22;;9605:132;;;:::o;9743:108::-;9820:24;9838:5;9820:24;:::i;:::-;9815:3;9808:37;9743:108;;:::o;9857:179::-;9926:10;9947:46;9989:3;9981:6;9947:46;:::i;:::-;10025:4;10020:3;10016:14;10002:28;;9857:179;;;;:::o;10042:113::-;10112:4;10144;10139:3;10135:14;10127:22;;10042:113;;;:::o;10191:732::-;10310:3;10339:54;10387:5;10339:54;:::i;:::-;10409:86;10488:6;10483:3;10409:86;:::i;:::-;10402:93;;10519:56;10569:5;10519:56;:::i;:::-;10598:7;10629:1;10614:284;10639:6;10636:1;10633:13;10614:284;;;10715:6;10709:13;10742:63;10801:3;10786:13;10742:63;:::i;:::-;10735:70;;10828:60;10881:6;10828:60;:::i;:::-;10818:70;;10674:224;10661:1;10658;10654:9;10649:14;;10614:284;;;10618:14;10914:3;10907:10;;10315:608;;;10191:732;;;;:::o;10929:373::-;11072:4;11110:2;11099:9;11095:18;11087:26;;11159:9;11153:4;11149:20;11145:1;11134:9;11130:17;11123:47;11187:108;11290:4;11281:6;11187:108;:::i;:::-;11179:116;;10929:373;;;;:::o;11308:114::-;11396:1;11389:5;11386:12;11376:40;;11412:1;11409;11402:12;11376:40;11308:114;:::o;11428:169::-;11489:5;11527:6;11514:20;11505:29;;11543:48;11585:5;11543:48;:::i;:::-;11428:169;;;;:::o;11603:359::-;11677:6;11726:2;11714:9;11705:7;11701:23;11697:32;11694:119;;;11732:79;;:::i;:::-;11694:119;11852:1;11877:68;11937:7;11928:6;11917:9;11913:22;11877:68;:::i;:::-;11867:78;;11823:132;11603:359;;;;:::o;11985:568::-;12058:8;12068:6;12118:3;12111:4;12103:6;12099:17;12095:27;12085:122;;12126:79;;:::i;:::-;12085:122;12239:6;12226:20;12216:30;;12269:18;12261:6;12258:30;12255:117;;;12291:79;;:::i;:::-;12255:117;12405:4;12397:6;12393:17;12381:29;;12459:3;12451:4;12443:6;12439:17;12429:8;12425:32;12422:41;12419:128;;;12466:79;;:::i;:::-;12419:128;11985:568;;;;;:::o;12559:559::-;12645:6;12653;12702:2;12690:9;12681:7;12677:23;12673:32;12670:119;;;12708:79;;:::i;:::-;12670:119;12856:1;12845:9;12841:17;12828:31;12886:18;12878:6;12875:30;12872:117;;;12908:79;;:::i;:::-;12872:117;13021:80;13093:7;13084:6;13073:9;13069:22;13021:80;:::i;:::-;13003:98;;;;12799:312;12559:559;;;;;:::o;13124:670::-;13202:6;13210;13218;13267:2;13255:9;13246:7;13242:23;13238:32;13235:119;;;13273:79;;:::i;:::-;13235:119;13393:1;13418:51;13461:7;13452:6;13441:9;13437:22;13418:51;:::i;:::-;13408:61;;13364:115;13546:2;13535:9;13531:18;13518:32;13577:18;13569:6;13566:30;13563:117;;;13599:79;;:::i;:::-;13563:117;13712:65;13769:7;13760:6;13749:9;13745:22;13712:65;:::i;:::-;13694:83;;;;13489:298;13124:670;;;;;:::o;13800:468::-;13865:6;13873;13922:2;13910:9;13901:7;13897:23;13893:32;13890:119;;;13928:79;;:::i;:::-;13890:119;14048:1;14073:53;14118:7;14109:6;14098:9;14094:22;14073:53;:::i;:::-;14063:63;;14019:117;14175:2;14201:50;14243:7;14234:6;14223:9;14219:22;14201:50;:::i;:::-;14191:60;;14146:115;13800:468;;;;;:::o;14274:117::-;14383:1;14380;14373:12;14397:180;14445:77;14442:1;14435:88;14542:4;14539:1;14532:15;14566:4;14563:1;14556:15;14583:281;14666:27;14688:4;14666:27;:::i;:::-;14658:6;14654:40;14796:6;14784:10;14781:22;14760:18;14748:10;14745:34;14742:62;14739:88;;;14807:18;;:::i;:::-;14739:88;14847:10;14843:2;14836:22;14626:238;14583:281;;:::o;14870:129::-;14904:6;14931:20;;:::i;:::-;14921:30;;14960:33;14988:4;14980:6;14960:33;:::i;:::-;14870:129;;;:::o;15005:307::-;15066:4;15156:18;15148:6;15145:30;15142:56;;;15178:18;;:::i;:::-;15142:56;15216:29;15238:6;15216:29;:::i;:::-;15208:37;;15300:4;15294;15290:15;15282:23;;15005:307;;;:::o;15318:146::-;15415:6;15410:3;15405;15392:30;15456:1;15447:6;15442:3;15438:16;15431:27;15318:146;;;:::o;15470:423::-;15547:5;15572:65;15588:48;15629:6;15588:48;:::i;:::-;15572:65;:::i;:::-;15563:74;;15660:6;15653:5;15646:21;15698:4;15691:5;15687:16;15736:3;15727:6;15722:3;15718:16;15715:25;15712:112;;;15743:79;;:::i;:::-;15712:112;15833:54;15880:6;15875:3;15870;15833:54;:::i;:::-;15553:340;15470:423;;;;;:::o;15912:338::-;15967:5;16016:3;16009:4;16001:6;15997:17;15993:27;15983:122;;16024:79;;:::i;:::-;15983:122;16141:6;16128:20;16166:78;16240:3;16232:6;16225:4;16217:6;16213:17;16166:78;:::i;:::-;16157:87;;15973:277;15912:338;;;;:::o;16256:943::-;16351:6;16359;16367;16375;16424:3;16412:9;16403:7;16399:23;16395:33;16392:120;;;16431:79;;:::i;:::-;16392:120;16551:1;16576:53;16621:7;16612:6;16601:9;16597:22;16576:53;:::i;:::-;16566:63;;16522:117;16678:2;16704:53;16749:7;16740:6;16729:9;16725:22;16704:53;:::i;:::-;16694:63;;16649:118;16806:2;16832:53;16877:7;16868:6;16857:9;16853:22;16832:53;:::i;:::-;16822:63;;16777:118;16962:2;16951:9;16947:18;16934:32;16993:18;16985:6;16982:30;16979:117;;;17015:79;;:::i;:::-;16979:117;17120:62;17174:7;17165:6;17154:9;17150:22;17120:62;:::i;:::-;17110:72;;16905:287;16256:943;;;;;;;:::o;17205:311::-;17282:4;17372:18;17364:6;17361:30;17358:56;;;17394:18;;:::i;:::-;17358:56;17444:4;17436:6;17432:17;17424:25;;17504:4;17498;17494:15;17486:23;;17205:311;;;:::o;17539:710::-;17635:5;17660:81;17676:64;17733:6;17676:64;:::i;:::-;17660:81;:::i;:::-;17651:90;;17761:5;17790:6;17783:5;17776:21;17824:4;17817:5;17813:16;17806:23;;17877:4;17869:6;17865:17;17857:6;17853:30;17906:3;17898:6;17895:15;17892:122;;;17925:79;;:::i;:::-;17892:122;18040:6;18023:220;18057:6;18052:3;18049:15;18023:220;;;18132:3;18161:37;18194:3;18182:10;18161:37;:::i;:::-;18156:3;18149:50;18228:4;18223:3;18219:14;18212:21;;18099:144;18083:4;18078:3;18074:14;18067:21;;18023:220;;;18027:21;17641:608;;17539:710;;;;;:::o;18272:370::-;18343:5;18392:3;18385:4;18377:6;18373:17;18369:27;18359:122;;18400:79;;:::i;:::-;18359:122;18517:6;18504:20;18542:94;18632:3;18624:6;18617:4;18609:6;18605:17;18542:94;:::i;:::-;18533:103;;18349:293;18272:370;;;;:::o;18648:539::-;18732:6;18781:2;18769:9;18760:7;18756:23;18752:32;18749:119;;;18787:79;;:::i;:::-;18749:119;18935:1;18924:9;18920:17;18907:31;18965:18;18957:6;18954:30;18951:117;;;18987:79;;:::i;:::-;18951:117;19092:78;19162:7;19153:6;19142:9;19138:22;19092:78;:::i;:::-;19082:88;;18878:302;18648:539;;;;:::o;19193:77::-;19230:7;19259:5;19248:16;;19193:77;;;:::o;19276:122::-;19349:24;19367:5;19349:24;:::i;:::-;19342:5;19339:35;19329:63;;19388:1;19385;19378:12;19329:63;19276:122;:::o;19404:139::-;19450:5;19488:6;19475:20;19466:29;;19504:33;19531:5;19504:33;:::i;:::-;19404:139;;;;:::o;19549:329::-;19608:6;19657:2;19645:9;19636:7;19632:23;19628:32;19625:119;;;19663:79;;:::i;:::-;19625:119;19783:1;19808:53;19853:7;19844:6;19833:9;19829:22;19808:53;:::i;:::-;19798:63;;19754:117;19549:329;;;;:::o;19884:474::-;19952:6;19960;20009:2;19997:9;19988:7;19984:23;19980:32;19977:119;;;20015:79;;:::i;:::-;19977:119;20135:1;20160:53;20205:7;20196:6;20185:9;20181:22;20160:53;:::i;:::-;20150:63;;20106:117;20262:2;20288:53;20333:7;20324:6;20313:9;20309:22;20288:53;:::i;:::-;20278:63;;20233:118;19884:474;;;;;:::o;20364:118::-;20451:24;20469:5;20451:24;:::i;:::-;20446:3;20439:37;20364:118;;:::o;20488:222::-;20581:4;20619:2;20608:9;20604:18;20596:26;;20632:71;20700:1;20689:9;20685:17;20676:6;20632:71;:::i;:::-;20488:222;;;;:::o;20716:180::-;20764:77;20761:1;20754:88;20861:4;20858:1;20851:15;20885:4;20882:1;20875:15;20902:120;20990:1;20983:5;20980:12;20970:46;;20996:18;;:::i;:::-;20970:46;20902:120;:::o;21028:141::-;21080:7;21109:5;21098:16;;21115:48;21157:5;21115:48;:::i;:::-;21028:141;;;:::o;21175:::-;21238:9;21271:39;21304:5;21271:39;:::i;:::-;21258:52;;21175:141;;;:::o;21322:157::-;21422:50;21466:5;21422:50;:::i;:::-;21417:3;21410:63;21322:157;;:::o;21485:248::-;21591:4;21629:2;21618:9;21614:18;21606:26;;21642:84;21723:1;21712:9;21708:17;21699:6;21642:84;:::i;:::-;21485:248;;;;:::o;21739:180::-;21787:77;21784:1;21777:88;21884:4;21881:1;21874:15;21908:4;21905:1;21898:15;21925:320;21969:6;22006:1;22000:4;21996:12;21986:22;;22053:1;22047:4;22043:12;22074:18;22064:81;;22130:4;22122:6;22118:17;22108:27;;22064:81;22192:2;22184:6;22181:14;22161:18;22158:38;22155:84;;22211:18;;:::i;:::-;22155:84;21976:269;21925:320;;;:::o;22251:220::-;22391:34;22387:1;22379:6;22375:14;22368:58;22460:3;22455:2;22447:6;22443:15;22436:28;22251:220;:::o;22477:366::-;22619:3;22640:67;22704:2;22699:3;22640:67;:::i;:::-;22633:74;;22716:93;22805:3;22716:93;:::i;:::-;22834:2;22829:3;22825:12;22818:19;;22477:366;;;:::o;22849:419::-;23015:4;23053:2;23042:9;23038:18;23030:26;;23102:9;23096:4;23092:20;23088:1;23077:9;23073:17;23066:47;23130:131;23256:4;23130:131;:::i;:::-;23122:139;;22849:419;;;:::o;23274:248::-;23414:34;23410:1;23402:6;23398:14;23391:58;23483:31;23478:2;23470:6;23466:15;23459:56;23274:248;:::o;23528:366::-;23670:3;23691:67;23755:2;23750:3;23691:67;:::i;:::-;23684:74;;23767:93;23856:3;23767:93;:::i;:::-;23885:2;23880:3;23876:12;23869:19;;23528:366;;;:::o;23900:419::-;24066:4;24104:2;24093:9;24089:18;24081:26;;24153:9;24147:4;24143:20;24139:1;24128:9;24124:17;24117:47;24181:131;24307:4;24181:131;:::i;:::-;24173:139;;23900:419;;;:::o;24325:232::-;24465:34;24461:1;24453:6;24449:14;24442:58;24534:15;24529:2;24521:6;24517:15;24510:40;24325:232;:::o;24563:366::-;24705:3;24726:67;24790:2;24785:3;24726:67;:::i;:::-;24719:74;;24802:93;24891:3;24802:93;:::i;:::-;24920:2;24915:3;24911:12;24904:19;;24563:366;;;:::o;24935:419::-;25101:4;25139:2;25128:9;25124:18;25116:26;;25188:9;25182:4;25178:20;25174:1;25163:9;25159:17;25152:47;25216:131;25342:4;25216:131;:::i;:::-;25208:139;;24935:419;;;:::o;25360:97::-;25419:6;25447:3;25437:13;;25360:97;;;;:::o;25463:141::-;25512:4;25535:3;25527:11;;25558:3;25555:1;25548:14;25592:4;25589:1;25579:18;25571:26;;25463:141;;;:::o;25610:93::-;25647:6;25694:2;25689;25682:5;25678:14;25674:23;25664:33;;25610:93;;;:::o;25709:107::-;25753:8;25803:5;25797:4;25793:16;25772:37;;25709:107;;;;:::o;25822:393::-;25891:6;25941:1;25929:10;25925:18;25964:97;25994:66;25983:9;25964:97;:::i;:::-;26082:39;26112:8;26101:9;26082:39;:::i;:::-;26070:51;;26154:4;26150:9;26143:5;26139:21;26130:30;;26203:4;26193:8;26189:19;26182:5;26179:30;26169:40;;25898:317;;25822:393;;;;;:::o;26221:60::-;26249:3;26270:5;26263:12;;26221:60;;;:::o;26287:142::-;26337:9;26370:53;26388:34;26397:24;26415:5;26397:24;:::i;:::-;26388:34;:::i;:::-;26370:53;:::i;:::-;26357:66;;26287:142;;;:::o;26435:75::-;26478:3;26499:5;26492:12;;26435:75;;;:::o;26516:269::-;26626:39;26657:7;26626:39;:::i;:::-;26687:91;26736:41;26760:16;26736:41;:::i;:::-;26728:6;26721:4;26715:11;26687:91;:::i;:::-;26681:4;26674:105;26592:193;26516:269;;;:::o;26791:73::-;26836:3;26791:73;:::o;26870:189::-;26947:32;;:::i;:::-;26988:65;27046:6;27038;27032:4;26988:65;:::i;:::-;26923:136;26870:189;;:::o;27065:186::-;27125:120;27142:3;27135:5;27132:14;27125:120;;;27196:39;27233:1;27226:5;27196:39;:::i;:::-;27169:1;27162:5;27158:13;27149:22;;27125:120;;;27065:186;;:::o;27257:543::-;27358:2;27353:3;27350:11;27347:446;;;27392:38;27424:5;27392:38;:::i;:::-;27476:29;27494:10;27476:29;:::i;:::-;27466:8;27462:44;27659:2;27647:10;27644:18;27641:49;;;27680:8;27665:23;;27641:49;27703:80;27759:22;27777:3;27759:22;:::i;:::-;27749:8;27745:37;27732:11;27703:80;:::i;:::-;27362:431;;27347:446;27257:543;;;:::o;27806:117::-;27860:8;27910:5;27904:4;27900:16;27879:37;;27806:117;;;;:::o;27929:169::-;27973:6;28006:51;28054:1;28050:6;28042:5;28039:1;28035:13;28006:51;:::i;:::-;28002:56;28087:4;28081;28077:15;28067:25;;27980:118;27929:169;;;;:::o;28103:295::-;28179:4;28325:29;28350:3;28344:4;28325:29;:::i;:::-;28317:37;;28387:3;28384:1;28380:11;28374:4;28371:21;28363:29;;28103:295;;;;:::o;28403:1403::-;28527:44;28567:3;28562;28527:44;:::i;:::-;28636:18;28628:6;28625:30;28622:56;;;28658:18;;:::i;:::-;28622:56;28702:38;28734:4;28728:11;28702:38;:::i;:::-;28787:67;28847:6;28839;28833:4;28787:67;:::i;:::-;28881:1;28910:2;28902:6;28899:14;28927:1;28922:632;;;;29598:1;29615:6;29612:84;;;29671:9;29666:3;29662:19;29649:33;29640:42;;29612:84;29722:67;29782:6;29775:5;29722:67;:::i;:::-;29716:4;29709:81;29571:229;28892:908;;28922:632;28974:4;28970:9;28962:6;28958:22;29008:37;29040:4;29008:37;:::i;:::-;29067:1;29081:215;29095:7;29092:1;29089:14;29081:215;;;29181:9;29176:3;29172:19;29159:33;29151:6;29144:49;29232:1;29224:6;29220:14;29210:24;;29279:2;29268:9;29264:18;29251:31;;29118:4;29115:1;29111:12;29106:17;;29081:215;;;29324:6;29315:7;29312:19;29309:186;;;29389:9;29384:3;29380:19;29367:33;29432:48;29474:4;29466:6;29462:17;29451:9;29432:48;:::i;:::-;29424:6;29417:64;29332:163;29309:186;29541:1;29537;29529:6;29525:14;29521:22;29515:4;29508:36;28929:625;;;28892:908;;28502:1304;;;28403:1403;;;:::o;29812:220::-;29952:34;29948:1;29940:6;29936:14;29929:58;30021:3;30016:2;30008:6;30004:15;29997:28;29812:220;:::o;30038:366::-;30180:3;30201:67;30265:2;30260:3;30201:67;:::i;:::-;30194:74;;30277:93;30366:3;30277:93;:::i;:::-;30395:2;30390:3;30386:12;30379:19;;30038:366;;;:::o;30410:419::-;30576:4;30614:2;30603:9;30599:18;30591:26;;30663:9;30657:4;30653:20;30649:1;30638:9;30634:17;30627:47;30691:131;30817:4;30691:131;:::i;:::-;30683:139;;30410:419;;;:::o;30835:180::-;30883:77;30880:1;30873:88;30980:4;30977:1;30970:15;31004:4;31001:1;30994:15;31021:233;31060:3;31083:24;31101:5;31083:24;:::i;:::-;31074:33;;31129:66;31122:5;31119:77;31116:103;;31199:18;;:::i;:::-;31116:103;31246:1;31239:5;31235:13;31228:20;;31021:233;;;:::o;31260:160::-;31400:12;31396:1;31388:6;31384:14;31377:36;31260:160;:::o;31426:366::-;31568:3;31589:67;31653:2;31648:3;31589:67;:::i;:::-;31582:74;;31665:93;31754:3;31665:93;:::i;:::-;31783:2;31778:3;31774:12;31767:19;;31426:366;;;:::o;31798:419::-;31964:4;32002:2;31991:9;31987:18;31979:26;;32051:9;32045:4;32041:20;32037:1;32026:9;32022:17;32015:47;32079:131;32205:4;32079:131;:::i;:::-;32071:139;;31798:419;;;:::o;32223:180::-;32271:77;32268:1;32261:88;32368:4;32365:1;32358:15;32392:4;32389:1;32382:15;32409:174;32549:26;32545:1;32537:6;32533:14;32526:50;32409:174;:::o;32589:366::-;32731:3;32752:67;32816:2;32811:3;32752:67;:::i;:::-;32745:74;;32828:93;32917:3;32828:93;:::i;:::-;32946:2;32941:3;32937:12;32930:19;;32589:366;;;:::o;32961:419::-;33127:4;33165:2;33154:9;33150:18;33142:26;;33214:9;33208:4;33204:20;33200:1;33189:9;33185:17;33178:47;33242:131;33368:4;33242:131;:::i;:::-;33234:139;;32961:419;;;:::o;33386:228::-;33526:34;33522:1;33514:6;33510:14;33503:58;33595:11;33590:2;33582:6;33578:15;33571:36;33386:228;:::o;33620:366::-;33762:3;33783:67;33847:2;33842:3;33783:67;:::i;:::-;33776:74;;33859:93;33948:3;33859:93;:::i;:::-;33977:2;33972:3;33968:12;33961:19;;33620:366;;;:::o;33992:419::-;34158:4;34196:2;34185:9;34181:18;34173:26;;34245:9;34239:4;34235:20;34231:1;34220:9;34216:17;34209:47;34273:131;34399:4;34273:131;:::i;:::-;34265:139;;33992:419;;;:::o;34417:191::-;34457:3;34476:20;34494:1;34476:20;:::i;:::-;34471:25;;34510:20;34528:1;34510:20;:::i;:::-;34505:25;;34553:1;34550;34546:9;34539:16;;34574:3;34571:1;34568:10;34565:36;;;34581:18;;:::i;:::-;34565:36;34417:191;;;;:::o;34614:181::-;34754:33;34750:1;34742:6;34738:14;34731:57;34614:181;:::o;34801:366::-;34943:3;34964:67;35028:2;35023:3;34964:67;:::i;:::-;34957:74;;35040:93;35129:3;35040:93;:::i;:::-;35158:2;35153:3;35149:12;35142:19;;34801:366;;;:::o;35173:419::-;35339:4;35377:2;35366:9;35362:18;35354:26;;35426:9;35420:4;35416:20;35412:1;35401:9;35397:17;35390:47;35454:131;35580:4;35454:131;:::i;:::-;35446:139;;35173:419;;;:::o;35598:148::-;35700:11;35737:3;35722:18;;35598:148;;;;:::o;35776:874::-;35879:3;35916:5;35910:12;35945:36;35971:9;35945:36;:::i;:::-;35997:89;36079:6;36074:3;35997:89;:::i;:::-;35990:96;;36117:1;36106:9;36102:17;36133:1;36128:166;;;;36308:1;36303:341;;;;36095:549;;36128:166;36212:4;36208:9;36197;36193:25;36188:3;36181:38;36274:6;36267:14;36260:22;36252:6;36248:35;36243:3;36239:45;36232:52;;36128:166;;36303:341;36370:38;36402:5;36370:38;:::i;:::-;36430:1;36444:154;36458:6;36455:1;36452:13;36444:154;;;36532:7;36526:14;36522:1;36517:3;36513:11;36506:35;36582:1;36573:7;36569:15;36558:26;;36480:4;36477:1;36473:12;36468:17;;36444:154;;;36627:6;36622:3;36618:16;36611:23;;36310:334;;36095:549;;35883:767;;35776:874;;;;:::o;36656:269::-;36785:3;36807:92;36895:3;36886:6;36807:92;:::i;:::-;36800:99;;36916:3;36909:10;;36656:269;;;;:::o;36955:330::-;37071:3;37092:89;37174:6;37169:3;37092:89;:::i;:::-;37085:96;;37191:56;37240:6;37235:3;37228:5;37191:56;:::i;:::-;37272:6;37267:3;37263:16;37256:23;;36955:330;;;;;:::o;37291:295::-;37433:3;37455:105;37556:3;37547:6;37539;37455:105;:::i;:::-;37448:112;;37577:3;37570:10;;37291:295;;;;;:::o;37592:177::-;37732:29;37728:1;37720:6;37716:14;37709:53;37592:177;:::o;37775:366::-;37917:3;37938:67;38002:2;37997:3;37938:67;:::i;:::-;37931:74;;38014:93;38103:3;38014:93;:::i;:::-;38132:2;38127:3;38123:12;38116:19;;37775:366;;;:::o;38147:419::-;38313:4;38351:2;38340:9;38336:18;38328:26;;38400:9;38394:4;38390:20;38386:1;38375:9;38371:17;38364:47;38428:131;38554:4;38428:131;:::i;:::-;38420:139;;38147:419;;;:::o;38572:172::-;38712:24;38708:1;38700:6;38696:14;38689:48;38572:172;:::o;38750:366::-;38892:3;38913:67;38977:2;38972:3;38913:67;:::i;:::-;38906:74;;38989:93;39078:3;38989:93;:::i;:::-;39107:2;39102:3;39098:12;39091:19;;38750:366;;;:::o;39122:419::-;39288:4;39326:2;39315:9;39311:18;39303:26;;39375:9;39369:4;39365:20;39361:1;39350:9;39346:17;39339:47;39403:131;39529:4;39403:131;:::i;:::-;39395:139;;39122:419;;;:::o;39547:182::-;39687:34;39683:1;39675:6;39671:14;39664:58;39547:182;:::o;39735:366::-;39877:3;39898:67;39962:2;39957:3;39898:67;:::i;:::-;39891:74;;39974:93;40063:3;39974:93;:::i;:::-;40092:2;40087:3;40083:12;40076:19;;39735:366;;;:::o;40107:419::-;40273:4;40311:2;40300:9;40296:18;40288:26;;40360:9;40354:4;40350:20;40346:1;40335:9;40331:17;40324:47;40388:131;40514:4;40388:131;:::i;:::-;40380:139;;40107:419;;;:::o;40532:230::-;40672:34;40668:1;40660:6;40656:14;40649:58;40741:13;40736:2;40728:6;40724:15;40717:38;40532:230;:::o;40768:366::-;40910:3;40931:67;40995:2;40990:3;40931:67;:::i;:::-;40924:74;;41007:93;41096:3;41007:93;:::i;:::-;41125:2;41120:3;41116:12;41109:19;;40768:366;;;:::o;41140:419::-;41306:4;41344:2;41333:9;41329:18;41321:26;;41393:9;41387:4;41383:20;41379:1;41368:9;41364:17;41357:47;41421:131;41547:4;41421:131;:::i;:::-;41413:139;;41140:419;;;:::o;41565:410::-;41605:7;41628:20;41646:1;41628:20;:::i;:::-;41623:25;;41662:20;41680:1;41662:20;:::i;:::-;41657:25;;41717:1;41714;41710:9;41739:30;41757:11;41739:30;:::i;:::-;41728:41;;41918:1;41909:7;41905:15;41902:1;41899:22;41879:1;41872:9;41852:83;41829:139;;41948:18;;:::i;:::-;41829:139;41613:362;41565:410;;;;:::o;41981:181::-;42121:33;42117:1;42109:6;42105:14;42098:57;41981:181;:::o;42168:366::-;42310:3;42331:67;42395:2;42390:3;42331:67;:::i;:::-;42324:74;;42407:93;42496:3;42407:93;:::i;:::-;42525:2;42520:3;42516:12;42509:19;;42168:366;;;:::o;42540:419::-;42706:4;42744:2;42733:9;42729:18;42721:26;;42793:9;42787:4;42783:20;42779:1;42768:9;42764:17;42757:47;42821:131;42947:4;42821:131;:::i;:::-;42813:139;;42540:419;;;:::o;42965:167::-;43002:3;43025:22;43041:5;43025:22;:::i;:::-;43016:31;;43069:4;43062:5;43059:15;43056:41;;43077:18;;:::i;:::-;43056:41;43124:1;43117:5;43113:13;43106:20;;42965:167;;;:::o;43138:169::-;43278:21;43274:1;43266:6;43262:14;43255:45;43138:169;:::o;43313:366::-;43455:3;43476:67;43540:2;43535:3;43476:67;:::i;:::-;43469:74;;43552:93;43641:3;43552:93;:::i;:::-;43670:2;43665:3;43661:12;43654:19;;43313:366;;;:::o;43685:419::-;43851:4;43889:2;43878:9;43874:18;43866:26;;43938:9;43932:4;43928:20;43924:1;43913:9;43909:17;43902:47;43966:131;44092:4;43966:131;:::i;:::-;43958:139;;43685:419;;;:::o;44110:234::-;44250:34;44246:1;44238:6;44234:14;44227:58;44319:17;44314:2;44306:6;44302:15;44295:42;44110:234;:::o;44350:366::-;44492:3;44513:67;44577:2;44572:3;44513:67;:::i;:::-;44506:74;;44589:93;44678:3;44589:93;:::i;:::-;44707:2;44702:3;44698:12;44691:19;;44350:366;;;:::o;44722:419::-;44888:4;44926:2;44915:9;44911:18;44903:26;;44975:9;44969:4;44965:20;44961:1;44950:9;44946:17;44939:47;45003:131;45129:4;45003:131;:::i;:::-;44995:139;;44722:419;;;:::o;45147:390::-;45253:3;45281:39;45314:5;45281:39;:::i;:::-;45336:89;45418:6;45413:3;45336:89;:::i;:::-;45329:96;;45434:65;45492:6;45487:3;45480:4;45473:5;45469:16;45434:65;:::i;:::-;45524:6;45519:3;45515:16;45508:23;;45257:280;45147:390;;;;:::o;45543:155::-;45683:7;45679:1;45671:6;45667:14;45660:31;45543:155;:::o;45704:400::-;45864:3;45885:84;45967:1;45962:3;45885:84;:::i;:::-;45878:91;;45978:93;46067:3;45978:93;:::i;:::-;46096:1;46091:3;46087:11;46080:18;;45704:400;;;:::o;46110:701::-;46391:3;46413:95;46504:3;46495:6;46413:95;:::i;:::-;46406:102;;46525:95;46616:3;46607:6;46525:95;:::i;:::-;46518:102;;46637:148;46781:3;46637:148;:::i;:::-;46630:155;;46802:3;46795:10;;46110:701;;;;;:::o;46817:225::-;46957:34;46953:1;46945:6;46941:14;46934:58;47026:8;47021:2;47013:6;47009:15;47002:33;46817:225;:::o;47048:366::-;47190:3;47211:67;47275:2;47270:3;47211:67;:::i;:::-;47204:74;;47287:93;47376:3;47287:93;:::i;:::-;47405:2;47400:3;47396:12;47389:19;;47048:366;;;:::o;47420:419::-;47586:4;47624:2;47613:9;47609:18;47601:26;;47673:9;47667:4;47663:20;47659:1;47648:9;47644:17;47637:47;47701:131;47827:4;47701:131;:::i;:::-;47693:139;;47420:419;;;:::o;47845:182::-;47985:34;47981:1;47973:6;47969:14;47962:58;47845:182;:::o;48033:366::-;48175:3;48196:67;48260:2;48255:3;48196:67;:::i;:::-;48189:74;;48272:93;48361:3;48272:93;:::i;:::-;48390:2;48385:3;48381:12;48374:19;;48033:366;;;:::o;48405:419::-;48571:4;48609:2;48598:9;48594:18;48586:26;;48658:9;48652:4;48648:20;48644:1;48633:9;48629:17;48622:47;48686:131;48812:4;48686:131;:::i;:::-;48678:139;;48405:419;;;:::o;48830:224::-;48970:34;48966:1;48958:6;48954:14;48947:58;49039:7;49034:2;49026:6;49022:15;49015:32;48830:224;:::o;49060:366::-;49202:3;49223:67;49287:2;49282:3;49223:67;:::i;:::-;49216:74;;49299:93;49388:3;49299:93;:::i;:::-;49417:2;49412:3;49408:12;49401:19;;49060:366;;;:::o;49432:419::-;49598:4;49636:2;49625:9;49621:18;49613:26;;49685:9;49679:4;49675:20;49671:1;49660:9;49656:17;49649:47;49713:131;49839:4;49713:131;:::i;:::-;49705:139;;49432:419;;;:::o;49857:223::-;49997:34;49993:1;49985:6;49981:14;49974:58;50066:6;50061:2;50053:6;50049:15;50042:31;49857:223;:::o;50086:366::-;50228:3;50249:67;50313:2;50308:3;50249:67;:::i;:::-;50242:74;;50325:93;50414:3;50325:93;:::i;:::-;50443:2;50438:3;50434:12;50427:19;;50086:366;;;:::o;50458:419::-;50624:4;50662:2;50651:9;50647:18;50639:26;;50711:9;50705:4;50701:20;50697:1;50686:9;50682:17;50675:47;50739:131;50865:4;50739:131;:::i;:::-;50731:139;;50458:419;;;:::o;50883:181::-;51023:33;51019:1;51011:6;51007:14;51000:57;50883:181;:::o;51070:366::-;51212:3;51233:67;51297:2;51292:3;51233:67;:::i;:::-;51226:74;;51309:93;51398:3;51309:93;:::i;:::-;51427:2;51422:3;51418:12;51411:19;;51070:366;;;:::o;51442:419::-;51608:4;51646:2;51635:9;51631:18;51623:26;;51695:9;51689:4;51685:20;51681:1;51670:9;51666:17;51659:47;51723:131;51849:4;51723:131;:::i;:::-;51715:139;;51442:419;;;:::o;51867:175::-;52007:27;52003:1;51995:6;51991:14;51984:51;51867:175;:::o;52048:366::-;52190:3;52211:67;52275:2;52270:3;52211:67;:::i;:::-;52204:74;;52287:93;52376:3;52287:93;:::i;:::-;52405:2;52400:3;52396:12;52389:19;;52048:366;;;:::o;52420:419::-;52586:4;52624:2;52613:9;52609:18;52601:26;;52673:9;52667:4;52663:20;52659:1;52648:9;52644:17;52637:47;52701:131;52827:4;52701:131;:::i;:::-;52693:139;;52420:419;;;:::o;52845:237::-;52985:34;52981:1;52973:6;52969:14;52962:58;53054:20;53049:2;53041:6;53037:15;53030:45;52845:237;:::o;53088:366::-;53230:3;53251:67;53315:2;53310:3;53251:67;:::i;:::-;53244:74;;53327:93;53416:3;53327:93;:::i;:::-;53445:2;53440:3;53436:12;53429:19;;53088:366;;;:::o;53460:419::-;53626:4;53664:2;53653:9;53649:18;53641:26;;53713:9;53707:4;53703:20;53699:1;53688:9;53684:17;53677:47;53741:131;53867:4;53741:131;:::i;:::-;53733:139;;53460:419;;;:::o;53885:180::-;53933:77;53930:1;53923:88;54030:4;54027:1;54020:15;54054:4;54051:1;54044:15;54071:227;54211:34;54207:1;54199:6;54195:14;54188:58;54280:10;54275:2;54267:6;54263:15;54256:35;54071:227;:::o;54304:366::-;54446:3;54467:67;54531:2;54526:3;54467:67;:::i;:::-;54460:74;;54543:93;54632:3;54543:93;:::i;:::-;54661:2;54656:3;54652:12;54645:19;;54304:366;;;:::o;54676:419::-;54842:4;54880:2;54869:9;54865:18;54857:26;;54929:9;54923:4;54919:20;54915:1;54904:9;54900:17;54893:47;54957:131;55083:4;54957:131;:::i;:::-;54949:139;;54676:419;;;:::o;55101:171::-;55140:3;55163:24;55181:5;55163:24;:::i;:::-;55154:33;;55209:4;55202:5;55199:15;55196:41;;55217:18;;:::i;:::-;55196:41;55264:1;55257:5;55253:13;55246:20;;55101:171;;;:::o;55278:98::-;55329:6;55363:5;55357:12;55347:22;;55278:98;;;:::o;55382:168::-;55465:11;55499:6;55494:3;55487:19;55539:4;55534:3;55530:14;55515:29;;55382:168;;;;:::o;55556:373::-;55642:3;55670:38;55702:5;55670:38;:::i;:::-;55724:70;55787:6;55782:3;55724:70;:::i;:::-;55717:77;;55803:65;55861:6;55856:3;55849:4;55842:5;55838:16;55803:65;:::i;:::-;55893:29;55915:6;55893:29;:::i;:::-;55888:3;55884:39;55877:46;;55646:283;55556:373;;;;:::o;55935:640::-;56130:4;56168:3;56157:9;56153:19;56145:27;;56182:71;56250:1;56239:9;56235:17;56226:6;56182:71;:::i;:::-;56263:72;56331:2;56320:9;56316:18;56307:6;56263:72;:::i;:::-;56345;56413:2;56402:9;56398:18;56389:6;56345:72;:::i;:::-;56464:9;56458:4;56454:20;56449:2;56438:9;56434:18;56427:48;56492:76;56563:4;56554:6;56492:76;:::i;:::-;56484:84;;55935:640;;;;;;;:::o;56581:141::-;56637:5;56668:6;56662:13;56653:22;;56684:32;56710:5;56684:32;:::i;:::-;56581:141;;;;:::o;56728:349::-;56797:6;56846:2;56834:9;56825:7;56821:23;56817:32;56814:119;;;56852:79;;:::i;:::-;56814:119;56972:1;56997:63;57052:7;57043:6;57032:9;57028:22;56997:63;:::i;:::-;56987:73;;56943:127;56728:349;;;;:::o;57083:182::-;57223:34;57219:1;57211:6;57207:14;57200:58;57083:182;:::o;57271:366::-;57413:3;57434:67;57498:2;57493:3;57434:67;:::i;:::-;57427:74;;57510:93;57599:3;57510:93;:::i;:::-;57628:2;57623:3;57619:12;57612:19;;57271:366;;;:::o;57643:419::-;57809:4;57847:2;57836:9;57832:18;57824:26;;57896:9;57890:4;57886:20;57882:1;57871:9;57867:17;57860:47;57924:131;58050:4;57924:131;:::i;:::-;57916:139;;57643:419;;;:::o;58068:178::-;58208:30;58204:1;58196:6;58192:14;58185:54;58068:178;:::o;58252:366::-;58394:3;58415:67;58479:2;58474:3;58415:67;:::i;:::-;58408:74;;58491:93;58580:3;58491:93;:::i;:::-;58609:2;58604:3;58600:12;58593:19;;58252:366;;;:::o;58624:419::-;58790:4;58828:2;58817:9;58813:18;58805:26;;58877:9;58871:4;58867:20;58863:1;58852:9;58848:17;58841:47;58905:131;59031:4;58905:131;:::i;:::-;58897:139;;58624:419;;;:::o

Swarm Source

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