S Price: $0.491992 (-0.37%)

MIKULPACKS (MPACKS)

Overview

TokenID

315

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
MikulPacks

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at SonicScan.org on 2025-03-13
*/

/**
 *Submitted for verification at SonicScan.org on 2025-01-03
*/

// SPDX-License-Identifier: MIT

// File: @openzeppelin/[email protected]/security/ReentrancyGuard.sol


// OpenZeppelin Contracts (last updated v4.9.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;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

// File: jevents.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/[email protected]/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.9.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/[email protected]/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/[email protected]/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/[email protected]/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.9.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
     *
     * Furthermore, `isContract` will also return true if the target contract within
     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
     * which only has an effect at the end of a transaction.
     * ====
     *
     * [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://consensys.net/diligence/blog/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.8.0/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/[email protected]/utils/Context.sol


// OpenZeppelin Contracts (last updated v4.9.4) (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;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

// File: @openzeppelin/[email protected]/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.9.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) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1, "Math: mulDiv overflow");

            ///////////////////////////////////////////////
            // 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 256, 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 << 3) < value ? 1 : 0);
        }
    }
}

// File: @openzeppelin/[email protected]/utils/math/SignedMath.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Standard signed math utilities missing in the Solidity language.
 */
library SignedMath {
    /**
     * @dev Returns the largest of two signed numbers.
     */
    function max(int256 a, int256 b) internal pure returns (int256) {
        return a > b ? a : b;
    }

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

    /**
     * @dev Returns the average of two signed numbers without overflow.
     * The result is rounded towards zero.
     */
    function average(int256 a, int256 b) internal pure returns (int256) {
        // Formula from the book "Hacker's Delight"
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }

    /**
     * @dev Returns the absolute unsigned value of a signed value.
     */
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            // must be unchecked in order to support `n = type(int256).min`
            return uint256(n >= 0 ? n : -n);
        }
    }
}

// File: @openzeppelin/[email protected]/utils/Strings.sol


// OpenZeppelin Contracts (last updated v4.9.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 `int256` to its ASCII `string` decimal representation.
     */
    function toString(int256 value) internal pure returns (string memory) {
        return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value))));
    }

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

    /**
     * @dev Returns true if the two strings are equal.
     */
    function equal(string memory a, string memory b) internal pure returns (bool) {
        return keccak256(bytes(a)) == keccak256(bytes(b));
    }
}

// File: @openzeppelin/[email protected]/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/[email protected]/token/ERC721/ERC721.sol


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

        _owners[tokenId] = to;

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

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

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

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

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

        // Clear approvals
        delete _tokenApprovals[tokenId];

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId, 1);

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

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

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

        emit Transfer(from, to, tokenId);

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

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

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

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

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

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

    /**
     * @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/[email protected]/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.9.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/[email protected]/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.9.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. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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/[email protected]/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721Enumerable.sol


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

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, firstTokenId, batchSize);

        if (batchSize > 1) {
            // Will only trigger during construction. Batch transferring (minting) is not available afterwards.
            revert("ERC721Enumerable: consecutive transfers not supported");
        }

        uint256 tokenId = firstTokenId;

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: contracts/MikulPacks.sol

pragma solidity ^0.8.0;

contract MikulPacks is ERC721Enumerable, Ownable, ReentrancyGuard {
    using Strings for uint256;

    // Contract variables
    string public baseURI;
    string public baseExtension = ".json";
    uint256 public cost = 0 ether;
    uint256 public maxSupply = 1000000;
    uint8 public maxMintAmount = 100;
    uint16 public nftPerAddressLimit = 10000;
    bool public paused = false;

    mapping(address => uint256) private addressMintedBalance;
    mapping(address => bool) public whitelist;

    IERC20 public rewardToken;
    uint256 private nextTokenId = 1;

    // Events
    event LootBoxOpened(address indexed user, uint256 indexed tokenId, uint256 randomValue);
    event RewardClaimed(address indexed user, uint256 amount, uint256 indexed tokenId);

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _initBaseURI,
        address _rewardToken
    ) ERC721(_name, _symbol) {
        setBaseURI(_initBaseURI);
        rewardToken = IERC20(_rewardToken);
    }

    // Internal function to return base URI
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    // Public mint function with whitelist check
    function mint(uint256 _mintAmount) public payable {
        require(!paused, "Paused");
        require(_mintAmount > 0 && _mintAmount <= maxMintAmount, "Invalid mint amount");
        require(nextTokenId + _mintAmount - 1 <= maxSupply, "Max supply reached");

        // If not the owner, require that the caller is whitelisted
        if (msg.sender != owner()) {
            require(whitelist[msg.sender], "Address not whitelisted");
            uint256 ownerMintedCount = addressMintedBalance[msg.sender];
            require(ownerMintedCount + _mintAmount <= nftPerAddressLimit, "Limit exceeded");
            require(msg.value >= cost * _mintAmount, "Insufficient funds");
        }

        for (uint256 i = 0; i < _mintAmount; i++) {
            addressMintedBalance[msg.sender]++;
            _safeMint(msg.sender, nextTokenId++);
        }
    }

    // Function to open a loot box
    function openLootBox(uint256 tokenId) public nonReentrant {
        require(ownerOf(tokenId) == msg.sender, "Not owner");

        // Generate randomness using block data and user input
        uint256 randomValue = uint256(
            keccak256(
                abi.encodePacked(block.number, block.timestamp, blockhash(block.number - 1), msg.sender, tokenId)
            )
        ) % 100;

        uint256 rewardAmount = calculateReward(randomValue);
        uint256 contractBalance = rewardToken.balanceOf(address(this));
        if (rewardAmount > contractBalance) {
            rewardAmount = contractBalance;
        }

        rewardToken.transfer(msg.sender, rewardAmount);
        _burn(tokenId);

        emit LootBoxOpened(msg.sender, tokenId, randomValue);
        emit RewardClaimed(msg.sender, rewardAmount, tokenId);
    }

    // Function to calculate the reward based on randomness
function calculateReward(uint256 rand) private pure returns (uint256) {
    if (rand < 25) {                   // 25% chance
        return 10000e18;               // 10,000 tokens
    } else if (rand < 55) {            // next 30%
        return 22250e18;               // 22,250 tokens
    } else if (rand < 80) {            // next 25%
        return 48000e18;               // 48,000 tokens
    } else if (rand < 95) {            // next 15%
        return 73000e18;               // 73,000 tokens
    } else if (rand < 98) {            // next 3%
        return 116000e18;              // 116,000 tokens
    } else if (rand == 98) {           // next 1%
        return 220000e18;              // 220,000 tokens
    } else {                           // remaining 1%
        return 420000e18;              // 420,000 tokens
    }
}

    // Function to return the token URI
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

    // Whitelist management functions

    // Add a single address to the whitelist
    function addToWhitelist(address _address) external onlyOwner {
        whitelist[_address] = true;
    }

    // Remove a single address from the whitelist
    function removeFromWhitelist(address _address) external onlyOwner {
        whitelist[_address] = false;
    }

    // Add multiple addresses to the whitelist
    function addManyToWhitelist(address[] calldata _addresses) external onlyOwner {
        for (uint256 i = 0; i < _addresses.length; i++) {
            whitelist[_addresses[i]] = true;
        }
    }

    // Only owner functions
    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
        baseExtension = _newBaseExtension;
    }

    function setCost(uint256 _newCost) external onlyOwner {
        cost = _newCost;
    }

    function setNftPerAddressLimit(uint16 _limit) external onlyOwner {
        nftPerAddressLimit = _limit;
    }

    function pause(bool _state) external onlyOwner {
        paused = _state;
    }

    // Function to withdraw reward tokens
    function withdrawTokens() external onlyOwner {
        uint256 balance = rewardToken.balanceOf(address(this));
        require(balance > 0, "No tokens to withdraw");
        rewardToken.transfer(owner(), balance);
    }

    // Function to withdraw Ether
    function withdraw() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"address","name":"_rewardToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"randomValue","type":"uint256"}],"name":"LootBoxOpened","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":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"RewardClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addManyToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"openLootBox","outputs":[],"stateMutability":"nonpayable","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":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_limit","type":"uint16"}],"name":"setNftPerAddressLimit","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d90816200004a9190620005b9565b506000600e55620f4240600f556064601060006101000a81548160ff021916908360ff160217905550612710601060016101000a81548161ffff021916908361ffff1602179055506000601060036101000a81548160ff0219169083151502179055506001601455348015620000bf57600080fd5b5060405162005c3838038062005c388339818101604052810190620000e5919062000869565b83838160009081620000f89190620005b9565b5080600190816200010a9190620005b9565b5050506200012d620001216200019160201b60201c565b6200019960201b60201c565b6001600b8190555062000146826200025f60201b60201c565b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050620009bb565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200026f6200028460201b60201c565b80600c9081620002809190620005b9565b5050565b620002946200019160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002ba6200031560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000313576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200030a9062000999565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003c157607f821691505b602082108103620003d757620003d662000379565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004417fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000402565b6200044d868362000402565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200049a620004946200048e8462000465565b6200046f565b62000465565b9050919050565b6000819050919050565b620004b68362000479565b620004ce620004c582620004a1565b8484546200040f565b825550505050565b600090565b620004e5620004d6565b620004f2818484620004ab565b505050565b5b818110156200051a576200050e600082620004db565b600181019050620004f8565b5050565b601f82111562000569576200053381620003dd565b6200053e84620003f2565b810160208510156200054e578190505b620005666200055d85620003f2565b830182620004f7565b50505b505050565b600082821c905092915050565b60006200058e600019846008026200056e565b1980831691505092915050565b6000620005a983836200057b565b9150826002028217905092915050565b620005c4826200033f565b67ffffffffffffffff811115620005e057620005df6200034a565b5b620005ec8254620003a8565b620005f98282856200051e565b600060209050601f8311600181146200063157600084156200061c578287015190505b6200062885826200059b565b86555062000698565b601f1984166200064186620003dd565b60005b828110156200066b5784890151825560018201915060208501945060208101905062000644565b868310156200068b578489015162000687601f8916826200057b565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b620006da82620006be565b810181811067ffffffffffffffff82111715620006fc57620006fb6200034a565b5b80604052505050565b600062000711620006a0565b90506200071f8282620006cf565b919050565b600067ffffffffffffffff8211156200074257620007416200034a565b5b6200074d82620006be565b9050602081019050919050565b60005b838110156200077a5780820151818401526020810190506200075d565b60008484015250505050565b60006200079d620007978462000724565b62000705565b905082815260208101848484011115620007bc57620007bb620006b9565b5b620007c98482856200075a565b509392505050565b600082601f830112620007e957620007e8620006b4565b5b8151620007fb84826020860162000786565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008318262000804565b9050919050565b620008438162000824565b81146200084f57600080fd5b50565b600081519050620008638162000838565b92915050565b60008060008060808587031215620008865762000885620006aa565b5b600085015167ffffffffffffffff811115620008a757620008a6620006af565b5b620008b587828801620007d1565b945050602085015167ffffffffffffffff811115620008d957620008d8620006af565b5b620008e787828801620007d1565b935050604085015167ffffffffffffffff8111156200090b576200090a620006af565b5b6200091987828801620007d1565b92505060606200092c8782880162000852565b91505092959194509250565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200098160208362000938565b91506200098e8262000949565b602082019050919050565b60006020820190508181036000830152620009b48162000972565b9050919050565b61526d80620009cb6000396000f3fe60806040526004361061023b5760003560e01c8063715018a61161012e578063b88d4fde116100ab578063da3ef23f1161006f578063da3ef23f1461084e578063e43252d714610877578063e985e9c5146108a0578063f2fde38b146108dd578063f7c618c1146109065761023b565b8063b88d4fde14610767578063ba7d2c7614610790578063c6682862146107bb578063c87b56dd146107e6578063d5abeb01146108235761023b565b806395d89b41116100f257806395d89b41146106915780639b19251a146106bc578063a0712d68146106f9578063a22cb46514610715578063b3fa69791461073e5761023b565b8063715018a6146105e65780638ab1d681146105fd5780638c10671c146106265780638d8f2adb1461064f5780638da5cb5b146106665761023b565b80633ccfd60b116101bc57806355f804b31161018057806355f804b3146104ed5780635c975abb146105165780636352211e146105415780636c0360eb1461057e57806370a08231146105a95761023b565b80633ccfd60b1461041e57806342842e0e1461043557806344a0d68a1461045e5780634f6ccce71461048757806355a02c2d146104c45761023b565b806313faede61161020357806313faede61461033757806318160ddd14610362578063239c70ae1461038d57806323b872dd146103b85780632f745c59146103e15761023b565b806301ffc9a71461024057806302329a291461027d57806306fdde03146102a6578063081812fc146102d1578063095ea7b31461030e575b600080fd5b34801561024c57600080fd5b50610267600480360381019061026291906134fd565b610931565b6040516102749190613545565b60405180910390f35b34801561028957600080fd5b506102a4600480360381019061029f919061358c565b6109ab565b005b3480156102b257600080fd5b506102bb6109d0565b6040516102c89190613649565b60405180910390f35b3480156102dd57600080fd5b506102f860048036038101906102f391906136a1565b610a62565b604051610305919061370f565b60405180910390f35b34801561031a57600080fd5b5061033560048036038101906103309190613756565b610aa8565b005b34801561034357600080fd5b5061034c610bbf565b60405161035991906137a5565b60405180910390f35b34801561036e57600080fd5b50610377610bc5565b60405161038491906137a5565b60405180910390f35b34801561039957600080fd5b506103a2610bd2565b6040516103af91906137dc565b60405180910390f35b3480156103c457600080fd5b506103df60048036038101906103da91906137f7565b610be5565b005b3480156103ed57600080fd5b5061040860048036038101906104039190613756565b610c45565b60405161041591906137a5565b60405180910390f35b34801561042a57600080fd5b50610433610cea565b005b34801561044157600080fd5b5061045c600480360381019061045791906137f7565b610d42565b005b34801561046a57600080fd5b50610485600480360381019061048091906136a1565b610d62565b005b34801561049357600080fd5b506104ae60048036038101906104a991906136a1565b610d74565b6040516104bb91906137a5565b60405180910390f35b3480156104d057600080fd5b506104eb60048036038101906104e691906136a1565b610de5565b005b3480156104f957600080fd5b50610514600480360381019061050f919061397f565b6110c1565b005b34801561052257600080fd5b5061052b6110dc565b6040516105389190613545565b60405180910390f35b34801561054d57600080fd5b50610568600480360381019061056391906136a1565b6110ef565b604051610575919061370f565b60405180910390f35b34801561058a57600080fd5b50610593611175565b6040516105a09190613649565b60405180910390f35b3480156105b557600080fd5b506105d060048036038101906105cb91906139c8565b611203565b6040516105dd91906137a5565b60405180910390f35b3480156105f257600080fd5b506105fb6112ba565b005b34801561060957600080fd5b50610624600480360381019061061f91906139c8565b6112ce565b005b34801561063257600080fd5b5061064d60048036038101906106489190613a55565b611331565b005b34801561065b57600080fd5b506106646113de565b005b34801561067257600080fd5b5061067b611574565b604051610688919061370f565b60405180910390f35b34801561069d57600080fd5b506106a661159e565b6040516106b39190613649565b60405180910390f35b3480156106c857600080fd5b506106e360048036038101906106de91906139c8565b611630565b6040516106f09190613545565b60405180910390f35b610713600480360381019061070e91906136a1565b611650565b005b34801561072157600080fd5b5061073c60048036038101906107379190613aa2565b6119b4565b005b34801561074a57600080fd5b5061076560048036038101906107609190613b1c565b6119ca565b005b34801561077357600080fd5b5061078e60048036038101906107899190613bea565b6119f2565b005b34801561079c57600080fd5b506107a5611a54565b6040516107b29190613c7c565b60405180910390f35b3480156107c757600080fd5b506107d0611a68565b6040516107dd9190613649565b60405180910390f35b3480156107f257600080fd5b5061080d600480360381019061080891906136a1565b611af6565b60405161081a9190613649565b60405180910390f35b34801561082f57600080fd5b50610838611ba0565b60405161084591906137a5565b60405180910390f35b34801561085a57600080fd5b506108756004803603810190610870919061397f565b611ba6565b005b34801561088357600080fd5b5061089e600480360381019061089991906139c8565b611bc1565b005b3480156108ac57600080fd5b506108c760048036038101906108c29190613c97565b611c24565b6040516108d49190613545565b60405180910390f35b3480156108e957600080fd5b5061090460048036038101906108ff91906139c8565b611cb8565b005b34801561091257600080fd5b5061091b611d3b565b6040516109289190613d36565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109a457506109a382611d61565b5b9050919050565b6109b3611e43565b80601060036101000a81548160ff02191690831515021790555050565b6060600080546109df90613d80565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0b90613d80565b8015610a585780601f10610a2d57610100808354040283529160200191610a58565b820191906000526020600020905b815481529060010190602001808311610a3b57829003601f168201915b5050505050905090565b6000610a6d82611ec1565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ab3826110ef565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1a90613e23565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b42611f0c565b73ffffffffffffffffffffffffffffffffffffffff161480610b715750610b7081610b6b611f0c565b611c24565b5b610bb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba790613eb5565b60405180910390fd5b610bba8383611f14565b505050565b600e5481565b6000600880549050905090565b601060009054906101000a900460ff1681565b610bf6610bf0611f0c565b82611fcd565b610c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2c90613f47565b60405180910390fd5b610c40838383612062565b505050565b6000610c5083611203565b8210610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8890613fd9565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610cf2611e43565b610cfa611574565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610d3f573d6000803e3d6000fd5b50565b610d5d838383604051806020016040528060008152506119f2565b505050565b610d6a611e43565b80600e8190555050565b6000610d7e610bc5565b8210610dbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db69061406b565b60405180910390fd5b60088281548110610dd357610dd261408b565b5b90600052602060002001549050919050565b610ded61235b565b3373ffffffffffffffffffffffffffffffffffffffff16610e0d826110ef565b73ffffffffffffffffffffffffffffffffffffffff1614610e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5a90614106565b60405180910390fd5b600060644342600143610e769190614155565b403386604051602001610e8d95949392919061421d565b6040516020818303038152906040528051906020012060001c610eb091906142ab565b90506000610ebd826123aa565b90506000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610f1c919061370f565b602060405180830381865afa158015610f39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5d91906142f1565b905080821115610f6b578091505b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401610fc892919061431e565b6020604051808303816000875af1158015610fe7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100b919061435c565b5061101584612460565b833373ffffffffffffffffffffffffffffffffffffffff167ffae87b2acfbc83e493c8f553212d10ea70b7b18404ea413993407942efcdc9078560405161105c91906137a5565b60405180910390a3833373ffffffffffffffffffffffffffffffffffffffff167ff01da32686223933d8a18a391060918c7f11a3648639edd87ae013e2e2731743846040516110ab91906137a5565b60405180910390a35050506110be6125ae565b50565b6110c9611e43565b80600c90816110d8919061452b565b5050565b601060039054906101000a900460ff1681565b6000806110fb836125b8565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361116c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116390614649565b60405180910390fd5b80915050919050565b600c805461118290613d80565b80601f01602080910402602001604051908101604052809291908181526020018280546111ae90613d80565b80156111fb5780601f106111d0576101008083540402835291602001916111fb565b820191906000526020600020905b8154815290600101906020018083116111de57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a906146db565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112c2611e43565b6112cc60006125f5565b565b6112d6611e43565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b611339611e43565b60005b828290508110156113d9576001601260008585858181106113605761135f61408b565b5b905060200201602081019061137591906139c8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806113d1906146fb565b91505061133c565b505050565b6113e6611e43565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611443919061370f565b602060405180830381865afa158015611460573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148491906142f1565b9050600081116114c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c09061478f565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61150f611574565b836040518363ffffffff1660e01b815260040161152d92919061431e565b6020604051808303816000875af115801561154c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611570919061435c565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546115ad90613d80565b80601f01602080910402602001604051908101604052809291908181526020018280546115d990613d80565b80156116265780601f106115fb57610100808354040283529160200191611626565b820191906000526020600020905b81548152906001019060200180831161160957829003601f168201915b5050505050905090565b60126020528060005260406000206000915054906101000a900460ff1681565b601060039054906101000a900460ff16156116a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611697906147fb565b60405180910390fd5b6000811180156116c25750601060009054906101000a900460ff1660ff168111155b611701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f890614867565b60405180910390fd5b600f546001826014546117149190614887565b61171e9190614155565b111561175f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175690614907565b60405180910390fd5b611767611574565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461191d57601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181c90614973565b60405180910390fd5b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050601060019054906101000a900461ffff1661ffff16828261188a9190614887565b11156118cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c2906149df565b60405180910390fd5b81600e546118d991906149ff565b34101561191b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191290614a8d565b60405180910390fd5b505b60005b818110156119b057601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611978906146fb565b919050555061199d3360146000815480929190611994906146fb565b919050556126bb565b80806119a8906146fb565b915050611920565b5050565b6119c66119bf611f0c565b83836126d9565b5050565b6119d2611e43565b80601060016101000a81548161ffff021916908361ffff16021790555050565b611a036119fd611f0c565b83611fcd565b611a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3990613f47565b60405180910390fd5b611a4e84848484612845565b50505050565b601060019054906101000a900461ffff1681565b600d8054611a7590613d80565b80601f0160208091040260200160405190810160405280929190818152602001828054611aa190613d80565b8015611aee5780601f10611ac357610100808354040283529160200191611aee565b820191906000526020600020905b815481529060010190602001808311611ad157829003601f168201915b505050505081565b6060611b01826128a1565b611b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3790614b1f565b60405180910390fd5b6000611b4a6128e2565b90506000815111611b6a5760405180602001604052806000815250611b98565b80611b7484612974565b600d604051602001611b8893929190614bfe565b6040516020818303038152906040525b915050919050565b600f5481565b611bae611e43565b80600d9081611bbd919061452b565b5050565b611bc9611e43565b6001601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611cc0611e43565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2690614ca1565b60405180910390fd5b611d38816125f5565b50565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e2c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e3c5750611e3b82612a42565b5b9050919050565b611e4b611f0c565b73ffffffffffffffffffffffffffffffffffffffff16611e69611574565b73ffffffffffffffffffffffffffffffffffffffff1614611ebf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb690614d0d565b60405180910390fd5b565b611eca816128a1565b611f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0090614649565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f87836110ef565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611fd9836110ef565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061201b575061201a8185611c24565b5b8061205957508373ffffffffffffffffffffffffffffffffffffffff1661204184610a62565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612082826110ef565b73ffffffffffffffffffffffffffffffffffffffff16146120d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cf90614d9f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213e90614e31565b60405180910390fd5b6121548383836001612aac565b8273ffffffffffffffffffffffffffffffffffffffff16612174826110ef565b73ffffffffffffffffffffffffffffffffffffffff16146121ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c190614d9f565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123568383836001612c0a565b505050565b6002600b54036123a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239790614e9d565b60405180910390fd5b6002600b81905550565b600060198210156123c75769021e19e0c9bab2400000905061245b565b60378210156123e2576904b62cc75a7299680000905061245b565b60508210156123fd57690a2a15d09519be000000905061245b565b605f82101561241857690f7556828d6c7ba00000905061245b565b6062821015612433576918905f62bda8e0800000905061245b565b6062820361244d57692e963951560b51800000905061245b565b6958f03ee118a13e80000090505b919050565b600061246b826110ef565b905061247b816000846001612aac565b612484826110ef565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125aa816000846001612c0a565b5050565b6001600b81905550565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6126d5828260405180602001604052806000815250612c10565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273e90614f09565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128389190613545565b60405180910390a3505050565b612850848484612062565b61285c84848484612c6b565b61289b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289290614f9b565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166128c3836125b8565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600c80546128f190613d80565b80601f016020809104026020016040519081016040528092919081815260200182805461291d90613d80565b801561296a5780601f1061293f5761010080835404028352916020019161296a565b820191906000526020600020905b81548152906001019060200180831161294d57829003601f168201915b5050505050905090565b60606000600161298384612df2565b01905060008167ffffffffffffffff8111156129a2576129a1613854565b5b6040519080825280601f01601f1916602001820160405280156129d45781602001600182028036833780820191505090505b509050600082602001820190505b600115612a37578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612a2b57612a2a61427c565b5b049450600085036129e2575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612ab884848484612f45565b6001811115612afc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af39061502d565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612b4357612b3e81612f4b565b612b82565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612b8157612b808582612f94565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612bc457612bbf81613101565b612c03565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612c0257612c0184826131d2565b5b5b5050505050565b50505050565b612c1a8383613251565b612c276000848484612c6b565b612c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5d90614f9b565b60405180910390fd5b505050565b6000612c8c8473ffffffffffffffffffffffffffffffffffffffff1661346e565b15612de5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612cb5611f0c565b8786866040518563ffffffff1660e01b8152600401612cd794939291906150a2565b6020604051808303816000875af1925050508015612d1357506040513d601f19601f82011682018060405250810190612d109190615103565b60015b612d95573d8060008114612d43576040519150601f19603f3d011682016040523d82523d6000602084013e612d48565b606091505b506000815103612d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8490614f9b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612dea565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612e50577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612e4657612e4561427c565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612e8d576d04ee2d6d415b85acef81000000008381612e8357612e8261427c565b5b0492506020810190505b662386f26fc100008310612ebc57662386f26fc100008381612eb257612eb161427c565b5b0492506010810190505b6305f5e1008310612ee5576305f5e1008381612edb57612eda61427c565b5b0492506008810190505b6127108310612f0a576127108381612f0057612eff61427c565b5b0492506004810190505b60648310612f2d5760648381612f2357612f2261427c565b5b0492506002810190505b600a8310612f3c576001810190505b80915050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612fa184611203565b612fab9190614155565b9050600060076000848152602001908152602001600020549050818114613090576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506131159190614155565b90506000600960008481526020019081526020016000205490506000600883815481106131455761314461408b565b5b9060005260206000200154905080600883815481106131675761316661408b565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806131b6576131b5615130565b5b6001900381819060005260206000200160009055905550505050565b60006131dd83611203565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036132c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b7906151ab565b60405180910390fd5b6132c9816128a1565b15613309576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330090615217565b60405180910390fd5b613317600083836001612aac565b613320816128a1565b15613360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335790615217565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461346a600083836001612c0a565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6134da816134a5565b81146134e557600080fd5b50565b6000813590506134f7816134d1565b92915050565b6000602082840312156135135761351261349b565b5b6000613521848285016134e8565b91505092915050565b60008115159050919050565b61353f8161352a565b82525050565b600060208201905061355a6000830184613536565b92915050565b6135698161352a565b811461357457600080fd5b50565b60008135905061358681613560565b92915050565b6000602082840312156135a2576135a161349b565b5b60006135b084828501613577565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156135f35780820151818401526020810190506135d8565b60008484015250505050565b6000601f19601f8301169050919050565b600061361b826135b9565b61362581856135c4565b93506136358185602086016135d5565b61363e816135ff565b840191505092915050565b600060208201905081810360008301526136638184613610565b905092915050565b6000819050919050565b61367e8161366b565b811461368957600080fd5b50565b60008135905061369b81613675565b92915050565b6000602082840312156136b7576136b661349b565b5b60006136c58482850161368c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006136f9826136ce565b9050919050565b613709816136ee565b82525050565b60006020820190506137246000830184613700565b92915050565b613733816136ee565b811461373e57600080fd5b50565b6000813590506137508161372a565b92915050565b6000806040838503121561376d5761376c61349b565b5b600061377b85828601613741565b925050602061378c8582860161368c565b9150509250929050565b61379f8161366b565b82525050565b60006020820190506137ba6000830184613796565b92915050565b600060ff82169050919050565b6137d6816137c0565b82525050565b60006020820190506137f160008301846137cd565b92915050565b6000806000606084860312156138105761380f61349b565b5b600061381e86828701613741565b935050602061382f86828701613741565b92505060406138408682870161368c565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61388c826135ff565b810181811067ffffffffffffffff821117156138ab576138aa613854565b5b80604052505050565b60006138be613491565b90506138ca8282613883565b919050565b600067ffffffffffffffff8211156138ea576138e9613854565b5b6138f3826135ff565b9050602081019050919050565b82818337600083830152505050565b600061392261391d846138cf565b6138b4565b90508281526020810184848401111561393e5761393d61384f565b5b613949848285613900565b509392505050565b600082601f8301126139665761396561384a565b5b813561397684826020860161390f565b91505092915050565b6000602082840312156139955761399461349b565b5b600082013567ffffffffffffffff8111156139b3576139b26134a0565b5b6139bf84828501613951565b91505092915050565b6000602082840312156139de576139dd61349b565b5b60006139ec84828501613741565b91505092915050565b600080fd5b600080fd5b60008083601f840112613a1557613a1461384a565b5b8235905067ffffffffffffffff811115613a3257613a316139f5565b5b602083019150836020820283011115613a4e57613a4d6139fa565b5b9250929050565b60008060208385031215613a6c57613a6b61349b565b5b600083013567ffffffffffffffff811115613a8a57613a896134a0565b5b613a96858286016139ff565b92509250509250929050565b60008060408385031215613ab957613ab861349b565b5b6000613ac785828601613741565b9250506020613ad885828601613577565b9150509250929050565b600061ffff82169050919050565b613af981613ae2565b8114613b0457600080fd5b50565b600081359050613b1681613af0565b92915050565b600060208284031215613b3257613b3161349b565b5b6000613b4084828501613b07565b91505092915050565b600067ffffffffffffffff821115613b6457613b63613854565b5b613b6d826135ff565b9050602081019050919050565b6000613b8d613b8884613b49565b6138b4565b905082815260208101848484011115613ba957613ba861384f565b5b613bb4848285613900565b509392505050565b600082601f830112613bd157613bd061384a565b5b8135613be1848260208601613b7a565b91505092915050565b60008060008060808587031215613c0457613c0361349b565b5b6000613c1287828801613741565b9450506020613c2387828801613741565b9350506040613c348782880161368c565b925050606085013567ffffffffffffffff811115613c5557613c546134a0565b5b613c6187828801613bbc565b91505092959194509250565b613c7681613ae2565b82525050565b6000602082019050613c916000830184613c6d565b92915050565b60008060408385031215613cae57613cad61349b565b5b6000613cbc85828601613741565b9250506020613ccd85828601613741565b9150509250929050565b6000819050919050565b6000613cfc613cf7613cf2846136ce565b613cd7565b6136ce565b9050919050565b6000613d0e82613ce1565b9050919050565b6000613d2082613d03565b9050919050565b613d3081613d15565b82525050565b6000602082019050613d4b6000830184613d27565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613d9857607f821691505b602082108103613dab57613daa613d51565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e0d6021836135c4565b9150613e1882613db1565b604082019050919050565b60006020820190508181036000830152613e3c81613e00565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613e9f603d836135c4565b9150613eaa82613e43565b604082019050919050565b60006020820190508181036000830152613ece81613e92565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613f31602d836135c4565b9150613f3c82613ed5565b604082019050919050565b60006020820190508181036000830152613f6081613f24565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613fc3602b836135c4565b9150613fce82613f67565b604082019050919050565b60006020820190508181036000830152613ff281613fb6565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614055602c836135c4565b915061406082613ff9565b604082019050919050565b6000602082019050818103600083015261408481614048565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e6f74206f776e65720000000000000000000000000000000000000000000000600082015250565b60006140f06009836135c4565b91506140fb826140ba565b602082019050919050565b6000602082019050818103600083015261411f816140e3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141608261366b565b915061416b8361366b565b925082820390508181111561418357614182614126565b5b92915050565b6000819050919050565b6141a461419f8261366b565b614189565b82525050565b6000819050919050565b6000819050919050565b6141cf6141ca826141aa565b6141b4565b82525050565b60008160601b9050919050565b60006141ed826141d5565b9050919050565b60006141ff826141e2565b9050919050565b614217614212826136ee565b6141f4565b82525050565b60006142298288614193565b6020820191506142398287614193565b60208201915061424982866141be565b6020820191506142598285614206565b6014820191506142698284614193565b6020820191508190509695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006142b68261366b565b91506142c18361366b565b9250826142d1576142d061427c565b5b828206905092915050565b6000815190506142eb81613675565b92915050565b6000602082840312156143075761430661349b565b5b6000614315848285016142dc565b91505092915050565b60006040820190506143336000830185613700565b6143406020830184613796565b9392505050565b60008151905061435681613560565b92915050565b6000602082840312156143725761437161349b565b5b600061438084828501614347565b91505092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026143eb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826143ae565b6143f586836143ae565b95508019841693508086168417925050509392505050565b600061442861442361441e8461366b565b613cd7565b61366b565b9050919050565b6000819050919050565b6144428361440d565b61445661444e8261442f565b8484546143bb565b825550505050565b600090565b61446b61445e565b614476818484614439565b505050565b5b8181101561449a5761448f600082614463565b60018101905061447c565b5050565b601f8211156144df576144b081614389565b6144b98461439e565b810160208510156144c8578190505b6144dc6144d48561439e565b83018261447b565b50505b505050565b600082821c905092915050565b6000614502600019846008026144e4565b1980831691505092915050565b600061451b83836144f1565b9150826002028217905092915050565b614534826135b9565b67ffffffffffffffff81111561454d5761454c613854565b5b6145578254613d80565b61456282828561449e565b600060209050601f8311600181146145955760008415614583578287015190505b61458d858261450f565b8655506145f5565b601f1984166145a386614389565b60005b828110156145cb578489015182556001820191506020850194506020810190506145a6565b868310156145e857848901516145e4601f8916826144f1565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006146336018836135c4565b915061463e826145fd565b602082019050919050565b6000602082019050818103600083015261466281614626565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006146c56029836135c4565b91506146d082614669565b604082019050919050565b600060208201905081810360008301526146f4816146b8565b9050919050565b60006147068261366b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361473857614737614126565b5b600182019050919050565b7f4e6f20746f6b656e7320746f2077697468647261770000000000000000000000600082015250565b60006147796015836135c4565b915061478482614743565b602082019050919050565b600060208201905081810360008301526147a88161476c565b9050919050565b7f5061757365640000000000000000000000000000000000000000000000000000600082015250565b60006147e56006836135c4565b91506147f0826147af565b602082019050919050565b60006020820190508181036000830152614814816147d8565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7400000000000000000000000000600082015250565b60006148516013836135c4565b915061485c8261481b565b602082019050919050565b6000602082019050818103600083015261488081614844565b9050919050565b60006148928261366b565b915061489d8361366b565b92508282019050808211156148b5576148b4614126565b5b92915050565b7f4d617820737570706c7920726561636865640000000000000000000000000000600082015250565b60006148f16012836135c4565b91506148fc826148bb565b602082019050919050565b60006020820190508181036000830152614920816148e4565b9050919050565b7f41646472657373206e6f742077686974656c6973746564000000000000000000600082015250565b600061495d6017836135c4565b915061496882614927565b602082019050919050565b6000602082019050818103600083015261498c81614950565b9050919050565b7f4c696d6974206578636565646564000000000000000000000000000000000000600082015250565b60006149c9600e836135c4565b91506149d482614993565b602082019050919050565b600060208201905081810360008301526149f8816149bc565b9050919050565b6000614a0a8261366b565b9150614a158361366b565b9250828202614a238161366b565b91508282048414831517614a3a57614a39614126565b5b5092915050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b6000614a776012836135c4565b9150614a8282614a41565b602082019050919050565b60006020820190508181036000830152614aa681614a6a565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614b09602f836135c4565b9150614b1482614aad565b604082019050919050565b60006020820190508181036000830152614b3881614afc565b9050919050565b600081905092915050565b6000614b55826135b9565b614b5f8185614b3f565b9350614b6f8185602086016135d5565b80840191505092915050565b60008154614b8881613d80565b614b928186614b3f565b94506001821660008114614bad5760018114614bc257614bf5565b60ff1983168652811515820286019350614bf5565b614bcb85614389565b60005b83811015614bed57815481890152600182019150602081019050614bce565b838801955050505b50505092915050565b6000614c0a8286614b4a565b9150614c168285614b4a565b9150614c228284614b7b565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614c8b6026836135c4565b9150614c9682614c2f565b604082019050919050565b60006020820190508181036000830152614cba81614c7e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614cf76020836135c4565b9150614d0282614cc1565b602082019050919050565b60006020820190508181036000830152614d2681614cea565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614d896025836135c4565b9150614d9482614d2d565b604082019050919050565b60006020820190508181036000830152614db881614d7c565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614e1b6024836135c4565b9150614e2682614dbf565b604082019050919050565b60006020820190508181036000830152614e4a81614e0e565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614e87601f836135c4565b9150614e9282614e51565b602082019050919050565b60006020820190508181036000830152614eb681614e7a565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614ef36019836135c4565b9150614efe82614ebd565b602082019050919050565b60006020820190508181036000830152614f2281614ee6565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614f856032836135c4565b9150614f9082614f29565b604082019050919050565b60006020820190508181036000830152614fb481614f78565b9050919050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b60006150176035836135c4565b915061502282614fbb565b604082019050919050565b600060208201905081810360008301526150468161500a565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006150748261504d565b61507e8185615058565b935061508e8185602086016135d5565b615097816135ff565b840191505092915050565b60006080820190506150b76000830187613700565b6150c46020830186613700565b6150d16040830185613796565b81810360608301526150e38184615069565b905095945050505050565b6000815190506150fd816134d1565b92915050565b6000602082840312156151195761511861349b565b5b6000615127848285016150ee565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006151956020836135c4565b91506151a08261515f565b602082019050919050565b600060208201905081810360008301526151c481615188565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615201601c836135c4565b915061520c826151cb565b602082019050919050565b60006020820190508181036000830152615230816151f4565b905091905056fea2646970667358221220f1ea47e47758f9da1f3b23bf29cbed724301eb5430269ece6302bf96f8ed712564736f6c63430008130033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000cfae6e44e44dffd0179a942046ac8869c2eb43a4000000000000000000000000000000000000000000000000000000000000000a4d494b554c5041434b530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064d5041434b5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d544b356b48597a53774875336b5763477059727833524e73476a7879737a787a704c7a744e6d4334566b45432f00000000000000000000

Deployed Bytecode

0x60806040526004361061023b5760003560e01c8063715018a61161012e578063b88d4fde116100ab578063da3ef23f1161006f578063da3ef23f1461084e578063e43252d714610877578063e985e9c5146108a0578063f2fde38b146108dd578063f7c618c1146109065761023b565b8063b88d4fde14610767578063ba7d2c7614610790578063c6682862146107bb578063c87b56dd146107e6578063d5abeb01146108235761023b565b806395d89b41116100f257806395d89b41146106915780639b19251a146106bc578063a0712d68146106f9578063a22cb46514610715578063b3fa69791461073e5761023b565b8063715018a6146105e65780638ab1d681146105fd5780638c10671c146106265780638d8f2adb1461064f5780638da5cb5b146106665761023b565b80633ccfd60b116101bc57806355f804b31161018057806355f804b3146104ed5780635c975abb146105165780636352211e146105415780636c0360eb1461057e57806370a08231146105a95761023b565b80633ccfd60b1461041e57806342842e0e1461043557806344a0d68a1461045e5780634f6ccce71461048757806355a02c2d146104c45761023b565b806313faede61161020357806313faede61461033757806318160ddd14610362578063239c70ae1461038d57806323b872dd146103b85780632f745c59146103e15761023b565b806301ffc9a71461024057806302329a291461027d57806306fdde03146102a6578063081812fc146102d1578063095ea7b31461030e575b600080fd5b34801561024c57600080fd5b50610267600480360381019061026291906134fd565b610931565b6040516102749190613545565b60405180910390f35b34801561028957600080fd5b506102a4600480360381019061029f919061358c565b6109ab565b005b3480156102b257600080fd5b506102bb6109d0565b6040516102c89190613649565b60405180910390f35b3480156102dd57600080fd5b506102f860048036038101906102f391906136a1565b610a62565b604051610305919061370f565b60405180910390f35b34801561031a57600080fd5b5061033560048036038101906103309190613756565b610aa8565b005b34801561034357600080fd5b5061034c610bbf565b60405161035991906137a5565b60405180910390f35b34801561036e57600080fd5b50610377610bc5565b60405161038491906137a5565b60405180910390f35b34801561039957600080fd5b506103a2610bd2565b6040516103af91906137dc565b60405180910390f35b3480156103c457600080fd5b506103df60048036038101906103da91906137f7565b610be5565b005b3480156103ed57600080fd5b5061040860048036038101906104039190613756565b610c45565b60405161041591906137a5565b60405180910390f35b34801561042a57600080fd5b50610433610cea565b005b34801561044157600080fd5b5061045c600480360381019061045791906137f7565b610d42565b005b34801561046a57600080fd5b50610485600480360381019061048091906136a1565b610d62565b005b34801561049357600080fd5b506104ae60048036038101906104a991906136a1565b610d74565b6040516104bb91906137a5565b60405180910390f35b3480156104d057600080fd5b506104eb60048036038101906104e691906136a1565b610de5565b005b3480156104f957600080fd5b50610514600480360381019061050f919061397f565b6110c1565b005b34801561052257600080fd5b5061052b6110dc565b6040516105389190613545565b60405180910390f35b34801561054d57600080fd5b50610568600480360381019061056391906136a1565b6110ef565b604051610575919061370f565b60405180910390f35b34801561058a57600080fd5b50610593611175565b6040516105a09190613649565b60405180910390f35b3480156105b557600080fd5b506105d060048036038101906105cb91906139c8565b611203565b6040516105dd91906137a5565b60405180910390f35b3480156105f257600080fd5b506105fb6112ba565b005b34801561060957600080fd5b50610624600480360381019061061f91906139c8565b6112ce565b005b34801561063257600080fd5b5061064d60048036038101906106489190613a55565b611331565b005b34801561065b57600080fd5b506106646113de565b005b34801561067257600080fd5b5061067b611574565b604051610688919061370f565b60405180910390f35b34801561069d57600080fd5b506106a661159e565b6040516106b39190613649565b60405180910390f35b3480156106c857600080fd5b506106e360048036038101906106de91906139c8565b611630565b6040516106f09190613545565b60405180910390f35b610713600480360381019061070e91906136a1565b611650565b005b34801561072157600080fd5b5061073c60048036038101906107379190613aa2565b6119b4565b005b34801561074a57600080fd5b5061076560048036038101906107609190613b1c565b6119ca565b005b34801561077357600080fd5b5061078e60048036038101906107899190613bea565b6119f2565b005b34801561079c57600080fd5b506107a5611a54565b6040516107b29190613c7c565b60405180910390f35b3480156107c757600080fd5b506107d0611a68565b6040516107dd9190613649565b60405180910390f35b3480156107f257600080fd5b5061080d600480360381019061080891906136a1565b611af6565b60405161081a9190613649565b60405180910390f35b34801561082f57600080fd5b50610838611ba0565b60405161084591906137a5565b60405180910390f35b34801561085a57600080fd5b506108756004803603810190610870919061397f565b611ba6565b005b34801561088357600080fd5b5061089e600480360381019061089991906139c8565b611bc1565b005b3480156108ac57600080fd5b506108c760048036038101906108c29190613c97565b611c24565b6040516108d49190613545565b60405180910390f35b3480156108e957600080fd5b5061090460048036038101906108ff91906139c8565b611cb8565b005b34801561091257600080fd5b5061091b611d3b565b6040516109289190613d36565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109a457506109a382611d61565b5b9050919050565b6109b3611e43565b80601060036101000a81548160ff02191690831515021790555050565b6060600080546109df90613d80565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0b90613d80565b8015610a585780601f10610a2d57610100808354040283529160200191610a58565b820191906000526020600020905b815481529060010190602001808311610a3b57829003601f168201915b5050505050905090565b6000610a6d82611ec1565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ab3826110ef565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1a90613e23565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b42611f0c565b73ffffffffffffffffffffffffffffffffffffffff161480610b715750610b7081610b6b611f0c565b611c24565b5b610bb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba790613eb5565b60405180910390fd5b610bba8383611f14565b505050565b600e5481565b6000600880549050905090565b601060009054906101000a900460ff1681565b610bf6610bf0611f0c565b82611fcd565b610c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2c90613f47565b60405180910390fd5b610c40838383612062565b505050565b6000610c5083611203565b8210610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8890613fd9565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610cf2611e43565b610cfa611574565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610d3f573d6000803e3d6000fd5b50565b610d5d838383604051806020016040528060008152506119f2565b505050565b610d6a611e43565b80600e8190555050565b6000610d7e610bc5565b8210610dbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db69061406b565b60405180910390fd5b60088281548110610dd357610dd261408b565b5b90600052602060002001549050919050565b610ded61235b565b3373ffffffffffffffffffffffffffffffffffffffff16610e0d826110ef565b73ffffffffffffffffffffffffffffffffffffffff1614610e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5a90614106565b60405180910390fd5b600060644342600143610e769190614155565b403386604051602001610e8d95949392919061421d565b6040516020818303038152906040528051906020012060001c610eb091906142ab565b90506000610ebd826123aa565b90506000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610f1c919061370f565b602060405180830381865afa158015610f39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5d91906142f1565b905080821115610f6b578091505b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401610fc892919061431e565b6020604051808303816000875af1158015610fe7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100b919061435c565b5061101584612460565b833373ffffffffffffffffffffffffffffffffffffffff167ffae87b2acfbc83e493c8f553212d10ea70b7b18404ea413993407942efcdc9078560405161105c91906137a5565b60405180910390a3833373ffffffffffffffffffffffffffffffffffffffff167ff01da32686223933d8a18a391060918c7f11a3648639edd87ae013e2e2731743846040516110ab91906137a5565b60405180910390a35050506110be6125ae565b50565b6110c9611e43565b80600c90816110d8919061452b565b5050565b601060039054906101000a900460ff1681565b6000806110fb836125b8565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361116c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116390614649565b60405180910390fd5b80915050919050565b600c805461118290613d80565b80601f01602080910402602001604051908101604052809291908181526020018280546111ae90613d80565b80156111fb5780601f106111d0576101008083540402835291602001916111fb565b820191906000526020600020905b8154815290600101906020018083116111de57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a906146db565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112c2611e43565b6112cc60006125f5565b565b6112d6611e43565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b611339611e43565b60005b828290508110156113d9576001601260008585858181106113605761135f61408b565b5b905060200201602081019061137591906139c8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806113d1906146fb565b91505061133c565b505050565b6113e6611e43565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611443919061370f565b602060405180830381865afa158015611460573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148491906142f1565b9050600081116114c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c09061478f565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61150f611574565b836040518363ffffffff1660e01b815260040161152d92919061431e565b6020604051808303816000875af115801561154c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611570919061435c565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546115ad90613d80565b80601f01602080910402602001604051908101604052809291908181526020018280546115d990613d80565b80156116265780601f106115fb57610100808354040283529160200191611626565b820191906000526020600020905b81548152906001019060200180831161160957829003601f168201915b5050505050905090565b60126020528060005260406000206000915054906101000a900460ff1681565b601060039054906101000a900460ff16156116a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611697906147fb565b60405180910390fd5b6000811180156116c25750601060009054906101000a900460ff1660ff168111155b611701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f890614867565b60405180910390fd5b600f546001826014546117149190614887565b61171e9190614155565b111561175f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175690614907565b60405180910390fd5b611767611574565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461191d57601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181c90614973565b60405180910390fd5b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050601060019054906101000a900461ffff1661ffff16828261188a9190614887565b11156118cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c2906149df565b60405180910390fd5b81600e546118d991906149ff565b34101561191b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191290614a8d565b60405180910390fd5b505b60005b818110156119b057601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611978906146fb565b919050555061199d3360146000815480929190611994906146fb565b919050556126bb565b80806119a8906146fb565b915050611920565b5050565b6119c66119bf611f0c565b83836126d9565b5050565b6119d2611e43565b80601060016101000a81548161ffff021916908361ffff16021790555050565b611a036119fd611f0c565b83611fcd565b611a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3990613f47565b60405180910390fd5b611a4e84848484612845565b50505050565b601060019054906101000a900461ffff1681565b600d8054611a7590613d80565b80601f0160208091040260200160405190810160405280929190818152602001828054611aa190613d80565b8015611aee5780601f10611ac357610100808354040283529160200191611aee565b820191906000526020600020905b815481529060010190602001808311611ad157829003601f168201915b505050505081565b6060611b01826128a1565b611b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3790614b1f565b60405180910390fd5b6000611b4a6128e2565b90506000815111611b6a5760405180602001604052806000815250611b98565b80611b7484612974565b600d604051602001611b8893929190614bfe565b6040516020818303038152906040525b915050919050565b600f5481565b611bae611e43565b80600d9081611bbd919061452b565b5050565b611bc9611e43565b6001601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611cc0611e43565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2690614ca1565b60405180910390fd5b611d38816125f5565b50565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e2c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e3c5750611e3b82612a42565b5b9050919050565b611e4b611f0c565b73ffffffffffffffffffffffffffffffffffffffff16611e69611574565b73ffffffffffffffffffffffffffffffffffffffff1614611ebf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb690614d0d565b60405180910390fd5b565b611eca816128a1565b611f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0090614649565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f87836110ef565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611fd9836110ef565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061201b575061201a8185611c24565b5b8061205957508373ffffffffffffffffffffffffffffffffffffffff1661204184610a62565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612082826110ef565b73ffffffffffffffffffffffffffffffffffffffff16146120d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cf90614d9f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213e90614e31565b60405180910390fd5b6121548383836001612aac565b8273ffffffffffffffffffffffffffffffffffffffff16612174826110ef565b73ffffffffffffffffffffffffffffffffffffffff16146121ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c190614d9f565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123568383836001612c0a565b505050565b6002600b54036123a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239790614e9d565b60405180910390fd5b6002600b81905550565b600060198210156123c75769021e19e0c9bab2400000905061245b565b60378210156123e2576904b62cc75a7299680000905061245b565b60508210156123fd57690a2a15d09519be000000905061245b565b605f82101561241857690f7556828d6c7ba00000905061245b565b6062821015612433576918905f62bda8e0800000905061245b565b6062820361244d57692e963951560b51800000905061245b565b6958f03ee118a13e80000090505b919050565b600061246b826110ef565b905061247b816000846001612aac565b612484826110ef565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125aa816000846001612c0a565b5050565b6001600b81905550565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6126d5828260405180602001604052806000815250612c10565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273e90614f09565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128389190613545565b60405180910390a3505050565b612850848484612062565b61285c84848484612c6b565b61289b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289290614f9b565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166128c3836125b8565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600c80546128f190613d80565b80601f016020809104026020016040519081016040528092919081815260200182805461291d90613d80565b801561296a5780601f1061293f5761010080835404028352916020019161296a565b820191906000526020600020905b81548152906001019060200180831161294d57829003601f168201915b5050505050905090565b60606000600161298384612df2565b01905060008167ffffffffffffffff8111156129a2576129a1613854565b5b6040519080825280601f01601f1916602001820160405280156129d45781602001600182028036833780820191505090505b509050600082602001820190505b600115612a37578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612a2b57612a2a61427c565b5b049450600085036129e2575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612ab884848484612f45565b6001811115612afc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af39061502d565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612b4357612b3e81612f4b565b612b82565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612b8157612b808582612f94565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612bc457612bbf81613101565b612c03565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612c0257612c0184826131d2565b5b5b5050505050565b50505050565b612c1a8383613251565b612c276000848484612c6b565b612c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5d90614f9b565b60405180910390fd5b505050565b6000612c8c8473ffffffffffffffffffffffffffffffffffffffff1661346e565b15612de5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612cb5611f0c565b8786866040518563ffffffff1660e01b8152600401612cd794939291906150a2565b6020604051808303816000875af1925050508015612d1357506040513d601f19601f82011682018060405250810190612d109190615103565b60015b612d95573d8060008114612d43576040519150601f19603f3d011682016040523d82523d6000602084013e612d48565b606091505b506000815103612d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8490614f9b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612dea565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612e50577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612e4657612e4561427c565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612e8d576d04ee2d6d415b85acef81000000008381612e8357612e8261427c565b5b0492506020810190505b662386f26fc100008310612ebc57662386f26fc100008381612eb257612eb161427c565b5b0492506010810190505b6305f5e1008310612ee5576305f5e1008381612edb57612eda61427c565b5b0492506008810190505b6127108310612f0a576127108381612f0057612eff61427c565b5b0492506004810190505b60648310612f2d5760648381612f2357612f2261427c565b5b0492506002810190505b600a8310612f3c576001810190505b80915050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612fa184611203565b612fab9190614155565b9050600060076000848152602001908152602001600020549050818114613090576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506131159190614155565b90506000600960008481526020019081526020016000205490506000600883815481106131455761314461408b565b5b9060005260206000200154905080600883815481106131675761316661408b565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806131b6576131b5615130565b5b6001900381819060005260206000200160009055905550505050565b60006131dd83611203565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036132c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b7906151ab565b60405180910390fd5b6132c9816128a1565b15613309576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330090615217565b60405180910390fd5b613317600083836001612aac565b613320816128a1565b15613360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335790615217565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461346a600083836001612c0a565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6134da816134a5565b81146134e557600080fd5b50565b6000813590506134f7816134d1565b92915050565b6000602082840312156135135761351261349b565b5b6000613521848285016134e8565b91505092915050565b60008115159050919050565b61353f8161352a565b82525050565b600060208201905061355a6000830184613536565b92915050565b6135698161352a565b811461357457600080fd5b50565b60008135905061358681613560565b92915050565b6000602082840312156135a2576135a161349b565b5b60006135b084828501613577565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156135f35780820151818401526020810190506135d8565b60008484015250505050565b6000601f19601f8301169050919050565b600061361b826135b9565b61362581856135c4565b93506136358185602086016135d5565b61363e816135ff565b840191505092915050565b600060208201905081810360008301526136638184613610565b905092915050565b6000819050919050565b61367e8161366b565b811461368957600080fd5b50565b60008135905061369b81613675565b92915050565b6000602082840312156136b7576136b661349b565b5b60006136c58482850161368c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006136f9826136ce565b9050919050565b613709816136ee565b82525050565b60006020820190506137246000830184613700565b92915050565b613733816136ee565b811461373e57600080fd5b50565b6000813590506137508161372a565b92915050565b6000806040838503121561376d5761376c61349b565b5b600061377b85828601613741565b925050602061378c8582860161368c565b9150509250929050565b61379f8161366b565b82525050565b60006020820190506137ba6000830184613796565b92915050565b600060ff82169050919050565b6137d6816137c0565b82525050565b60006020820190506137f160008301846137cd565b92915050565b6000806000606084860312156138105761380f61349b565b5b600061381e86828701613741565b935050602061382f86828701613741565b92505060406138408682870161368c565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61388c826135ff565b810181811067ffffffffffffffff821117156138ab576138aa613854565b5b80604052505050565b60006138be613491565b90506138ca8282613883565b919050565b600067ffffffffffffffff8211156138ea576138e9613854565b5b6138f3826135ff565b9050602081019050919050565b82818337600083830152505050565b600061392261391d846138cf565b6138b4565b90508281526020810184848401111561393e5761393d61384f565b5b613949848285613900565b509392505050565b600082601f8301126139665761396561384a565b5b813561397684826020860161390f565b91505092915050565b6000602082840312156139955761399461349b565b5b600082013567ffffffffffffffff8111156139b3576139b26134a0565b5b6139bf84828501613951565b91505092915050565b6000602082840312156139de576139dd61349b565b5b60006139ec84828501613741565b91505092915050565b600080fd5b600080fd5b60008083601f840112613a1557613a1461384a565b5b8235905067ffffffffffffffff811115613a3257613a316139f5565b5b602083019150836020820283011115613a4e57613a4d6139fa565b5b9250929050565b60008060208385031215613a6c57613a6b61349b565b5b600083013567ffffffffffffffff811115613a8a57613a896134a0565b5b613a96858286016139ff565b92509250509250929050565b60008060408385031215613ab957613ab861349b565b5b6000613ac785828601613741565b9250506020613ad885828601613577565b9150509250929050565b600061ffff82169050919050565b613af981613ae2565b8114613b0457600080fd5b50565b600081359050613b1681613af0565b92915050565b600060208284031215613b3257613b3161349b565b5b6000613b4084828501613b07565b91505092915050565b600067ffffffffffffffff821115613b6457613b63613854565b5b613b6d826135ff565b9050602081019050919050565b6000613b8d613b8884613b49565b6138b4565b905082815260208101848484011115613ba957613ba861384f565b5b613bb4848285613900565b509392505050565b600082601f830112613bd157613bd061384a565b5b8135613be1848260208601613b7a565b91505092915050565b60008060008060808587031215613c0457613c0361349b565b5b6000613c1287828801613741565b9450506020613c2387828801613741565b9350506040613c348782880161368c565b925050606085013567ffffffffffffffff811115613c5557613c546134a0565b5b613c6187828801613bbc565b91505092959194509250565b613c7681613ae2565b82525050565b6000602082019050613c916000830184613c6d565b92915050565b60008060408385031215613cae57613cad61349b565b5b6000613cbc85828601613741565b9250506020613ccd85828601613741565b9150509250929050565b6000819050919050565b6000613cfc613cf7613cf2846136ce565b613cd7565b6136ce565b9050919050565b6000613d0e82613ce1565b9050919050565b6000613d2082613d03565b9050919050565b613d3081613d15565b82525050565b6000602082019050613d4b6000830184613d27565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613d9857607f821691505b602082108103613dab57613daa613d51565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e0d6021836135c4565b9150613e1882613db1565b604082019050919050565b60006020820190508181036000830152613e3c81613e00565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613e9f603d836135c4565b9150613eaa82613e43565b604082019050919050565b60006020820190508181036000830152613ece81613e92565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613f31602d836135c4565b9150613f3c82613ed5565b604082019050919050565b60006020820190508181036000830152613f6081613f24565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613fc3602b836135c4565b9150613fce82613f67565b604082019050919050565b60006020820190508181036000830152613ff281613fb6565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614055602c836135c4565b915061406082613ff9565b604082019050919050565b6000602082019050818103600083015261408481614048565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e6f74206f776e65720000000000000000000000000000000000000000000000600082015250565b60006140f06009836135c4565b91506140fb826140ba565b602082019050919050565b6000602082019050818103600083015261411f816140e3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141608261366b565b915061416b8361366b565b925082820390508181111561418357614182614126565b5b92915050565b6000819050919050565b6141a461419f8261366b565b614189565b82525050565b6000819050919050565b6000819050919050565b6141cf6141ca826141aa565b6141b4565b82525050565b60008160601b9050919050565b60006141ed826141d5565b9050919050565b60006141ff826141e2565b9050919050565b614217614212826136ee565b6141f4565b82525050565b60006142298288614193565b6020820191506142398287614193565b60208201915061424982866141be565b6020820191506142598285614206565b6014820191506142698284614193565b6020820191508190509695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006142b68261366b565b91506142c18361366b565b9250826142d1576142d061427c565b5b828206905092915050565b6000815190506142eb81613675565b92915050565b6000602082840312156143075761430661349b565b5b6000614315848285016142dc565b91505092915050565b60006040820190506143336000830185613700565b6143406020830184613796565b9392505050565b60008151905061435681613560565b92915050565b6000602082840312156143725761437161349b565b5b600061438084828501614347565b91505092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026143eb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826143ae565b6143f586836143ae565b95508019841693508086168417925050509392505050565b600061442861442361441e8461366b565b613cd7565b61366b565b9050919050565b6000819050919050565b6144428361440d565b61445661444e8261442f565b8484546143bb565b825550505050565b600090565b61446b61445e565b614476818484614439565b505050565b5b8181101561449a5761448f600082614463565b60018101905061447c565b5050565b601f8211156144df576144b081614389565b6144b98461439e565b810160208510156144c8578190505b6144dc6144d48561439e565b83018261447b565b50505b505050565b600082821c905092915050565b6000614502600019846008026144e4565b1980831691505092915050565b600061451b83836144f1565b9150826002028217905092915050565b614534826135b9565b67ffffffffffffffff81111561454d5761454c613854565b5b6145578254613d80565b61456282828561449e565b600060209050601f8311600181146145955760008415614583578287015190505b61458d858261450f565b8655506145f5565b601f1984166145a386614389565b60005b828110156145cb578489015182556001820191506020850194506020810190506145a6565b868310156145e857848901516145e4601f8916826144f1565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006146336018836135c4565b915061463e826145fd565b602082019050919050565b6000602082019050818103600083015261466281614626565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006146c56029836135c4565b91506146d082614669565b604082019050919050565b600060208201905081810360008301526146f4816146b8565b9050919050565b60006147068261366b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361473857614737614126565b5b600182019050919050565b7f4e6f20746f6b656e7320746f2077697468647261770000000000000000000000600082015250565b60006147796015836135c4565b915061478482614743565b602082019050919050565b600060208201905081810360008301526147a88161476c565b9050919050565b7f5061757365640000000000000000000000000000000000000000000000000000600082015250565b60006147e56006836135c4565b91506147f0826147af565b602082019050919050565b60006020820190508181036000830152614814816147d8565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7400000000000000000000000000600082015250565b60006148516013836135c4565b915061485c8261481b565b602082019050919050565b6000602082019050818103600083015261488081614844565b9050919050565b60006148928261366b565b915061489d8361366b565b92508282019050808211156148b5576148b4614126565b5b92915050565b7f4d617820737570706c7920726561636865640000000000000000000000000000600082015250565b60006148f16012836135c4565b91506148fc826148bb565b602082019050919050565b60006020820190508181036000830152614920816148e4565b9050919050565b7f41646472657373206e6f742077686974656c6973746564000000000000000000600082015250565b600061495d6017836135c4565b915061496882614927565b602082019050919050565b6000602082019050818103600083015261498c81614950565b9050919050565b7f4c696d6974206578636565646564000000000000000000000000000000000000600082015250565b60006149c9600e836135c4565b91506149d482614993565b602082019050919050565b600060208201905081810360008301526149f8816149bc565b9050919050565b6000614a0a8261366b565b9150614a158361366b565b9250828202614a238161366b565b91508282048414831517614a3a57614a39614126565b5b5092915050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b6000614a776012836135c4565b9150614a8282614a41565b602082019050919050565b60006020820190508181036000830152614aa681614a6a565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614b09602f836135c4565b9150614b1482614aad565b604082019050919050565b60006020820190508181036000830152614b3881614afc565b9050919050565b600081905092915050565b6000614b55826135b9565b614b5f8185614b3f565b9350614b6f8185602086016135d5565b80840191505092915050565b60008154614b8881613d80565b614b928186614b3f565b94506001821660008114614bad5760018114614bc257614bf5565b60ff1983168652811515820286019350614bf5565b614bcb85614389565b60005b83811015614bed57815481890152600182019150602081019050614bce565b838801955050505b50505092915050565b6000614c0a8286614b4a565b9150614c168285614b4a565b9150614c228284614b7b565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614c8b6026836135c4565b9150614c9682614c2f565b604082019050919050565b60006020820190508181036000830152614cba81614c7e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614cf76020836135c4565b9150614d0282614cc1565b602082019050919050565b60006020820190508181036000830152614d2681614cea565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614d896025836135c4565b9150614d9482614d2d565b604082019050919050565b60006020820190508181036000830152614db881614d7c565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614e1b6024836135c4565b9150614e2682614dbf565b604082019050919050565b60006020820190508181036000830152614e4a81614e0e565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614e87601f836135c4565b9150614e9282614e51565b602082019050919050565b60006020820190508181036000830152614eb681614e7a565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614ef36019836135c4565b9150614efe82614ebd565b602082019050919050565b60006020820190508181036000830152614f2281614ee6565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614f856032836135c4565b9150614f9082614f29565b604082019050919050565b60006020820190508181036000830152614fb481614f78565b9050919050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b60006150176035836135c4565b915061502282614fbb565b604082019050919050565b600060208201905081810360008301526150468161500a565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006150748261504d565b61507e8185615058565b935061508e8185602086016135d5565b615097816135ff565b840191505092915050565b60006080820190506150b76000830187613700565b6150c46020830186613700565b6150d16040830185613796565b81810360608301526150e38184615069565b905095945050505050565b6000815190506150fd816134d1565b92915050565b6000602082840312156151195761511861349b565b5b6000615127848285016150ee565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006151956020836135c4565b91506151a08261515f565b602082019050919050565b600060208201905081810360008301526151c481615188565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615201601c836135c4565b915061520c826151cb565b602082019050919050565b60006020820190508181036000830152615230816151f4565b905091905056fea2646970667358221220f1ea47e47758f9da1f3b23bf29cbed724301eb5430269ece6302bf96f8ed712564736f6c63430008130033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000cfae6e44e44dffd0179a942046ac8869c2eb43a4000000000000000000000000000000000000000000000000000000000000000a4d494b554c5041434b530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064d5041434b5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d544b356b48597a53774875336b5763477059727833524e73476a7879737a787a704c7a744e6d4334566b45432f00000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): MIKULPACKS
Arg [1] : _symbol (string): MPACKS
Arg [2] : _initBaseURI (string): ipfs://QmTK5kHYzSwHu3kWcGpYrx3RNsGjxyszxzpLztNmC4VkEC/
Arg [3] : _rewardToken (address): 0xcfaE6E44e44dffd0179a942046AC8869C2eb43A4

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 000000000000000000000000cfae6e44e44dffd0179a942046ac8869c2eb43a4
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [5] : 4d494b554c5041434b5300000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [7] : 4d5041434b530000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [9] : 697066733a2f2f516d544b356b48597a53774875336b5763477059727833524e
Arg [10] : 73476a7879737a787a704c7a744e6d4334566b45432f00000000000000000000


Deployed Bytecode Sourcemap

71001:6042:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65002:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76536:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42409:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43921:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43439:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71207:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65642:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71284:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44621:301;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65310:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76934:106;;;;;;;;;;;;;:::i;:::-;;44993:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76321:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65832:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73185:860;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76073:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71370:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42119:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71135:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41850:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62067:103;;;;;;;;;;;;;:::i;:::-;;75666:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75834:202;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76668:223;;;;;;;;;;;;;:::i;:::-;;61426:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42578:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71468:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72269:872;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44164:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76417:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45215:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71323:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71163:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75010:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71243:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76185:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75501:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44390:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62325:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71518:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65002:224;65104:4;65143:35;65128:50;;;:11;:50;;;;:90;;;;65182:36;65206:11;65182:23;:36::i;:::-;65128:90;65121:97;;65002:224;;;:::o;76536:81::-;61312:13;:11;:13::i;:::-;76603:6:::1;76594;;:15;;;;;;;;;;;;;;;;;;76536:81:::0;:::o;42409:100::-;42463:13;42496:5;42489:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42409:100;:::o;43921:171::-;43997:7;44017:23;44032:7;44017:14;:23::i;:::-;44060:15;:24;44076:7;44060:24;;;;;;;;;;;;;;;;;;;;;44053:31;;43921:171;;;:::o;43439:416::-;43520:13;43536:23;43551:7;43536:14;:23::i;:::-;43520:39;;43584:5;43578:11;;:2;:11;;;43570:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;43678:5;43662:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;43687:37;43704:5;43711:12;:10;:12::i;:::-;43687:16;:37::i;:::-;43662:62;43640:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;43826:21;43835:2;43839:7;43826:8;:21::i;:::-;43509:346;43439:416;;:::o;71207:29::-;;;;:::o;65642:113::-;65703:7;65730:10;:17;;;;65723:24;;65642:113;:::o;71284:32::-;;;;;;;;;;;;;:::o;44621:301::-;44782:41;44801:12;:10;:12::i;:::-;44815:7;44782:18;:41::i;:::-;44774:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;44886:28;44896:4;44902:2;44906:7;44886:9;:28::i;:::-;44621:301;;;:::o;65310:256::-;65407:7;65443:23;65460:5;65443:16;:23::i;:::-;65435:5;:31;65427:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;65532:12;:19;65545:5;65532:19;;;;;;;;;;;;;;;:26;65552:5;65532:26;;;;;;;;;;;;65525:33;;65310:256;;;;:::o;76934:106::-;61312:13;:11;:13::i;:::-;76992:7:::1;:5;:7::i;:::-;76984:25;;:48;77010:21;76984:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;76934:106::o:0;44993:151::-;45097:39;45114:4;45120:2;45124:7;45097:39;;;;;;;;;;;;:16;:39::i;:::-;44993:151;;;:::o;76321:88::-;61312:13;:11;:13::i;:::-;76393:8:::1;76386:4;:15;;;;76321:88:::0;:::o;65832:233::-;65907:7;65943:30;:28;:30::i;:::-;65935:5;:38;65927:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;66040:10;66051:5;66040:17;;;;;;;;:::i;:::-;;;;;;;;;;66033:24;;65832:233;;;:::o;73185:860::-;2458:21;:19;:21::i;:::-;73282:10:::1;73262:30;;:16;73270:7;73262;:16::i;:::-;:30;;;73254:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;73383:19;73581:3;73472:12;73486:15;73528:1;73513:12;:16;;;;:::i;:::-;73503:27;73532:10;73544:7;73455:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;73427:140;;;;;;73405:173;;:179;;;;:::i;:::-;73383:201;;73597:20;73620:28;73636:11;73620:15;:28::i;:::-;73597:51;;73659:23;73685:11;;;;;;;;;;;:21;;;73715:4;73685:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73659:62;;73751:15;73736:12;:30;73732:93;;;73798:15;73783:30;;73732:93;73837:11;;;;;;;;;;;:20;;;73858:10;73870:12;73837:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;73894:14;73900:7;73894:5;:14::i;:::-;73952:7;73940:10;73926:47;;;73961:11;73926:47;;;;;;:::i;:::-;;;;;;;;74029:7;74003:10;73989:48;;;74015:12;73989:48;;;;;;:::i;:::-;;;;;;;;73243:802;;;2502:20:::0;:18;:20::i;:::-;73185:860;:::o;76073:104::-;61312:13;:11;:13::i;:::-;76158:11:::1;76148:7;:21;;;;;;:::i;:::-;;76073:104:::0;:::o;71370:26::-;;;;;;;;;;;;;:::o;42119:223::-;42191:7;42211:13;42227:17;42236:7;42227:8;:17::i;:::-;42211:33;;42280:1;42263:19;;:5;:19;;;42255:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;42329:5;42322:12;;;42119:223;;;:::o;71135:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41850:207::-;41922:7;41967:1;41950:19;;:5;:19;;;41942:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42033:9;:16;42043:5;42033:16;;;;;;;;;;;;;;;;42026:23;;41850:207;;;:::o;62067:103::-;61312:13;:11;:13::i;:::-;62132:30:::1;62159:1;62132:18;:30::i;:::-;62067:103::o:0;75666:112::-;61312:13;:11;:13::i;:::-;75765:5:::1;75743:9;:19;75753:8;75743:19;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;75666:112:::0;:::o;75834:202::-;61312:13;:11;:13::i;:::-;75928:9:::1;75923:106;75947:10;;:17;;75943:1;:21;75923:106;;;76013:4;75986:9;:24;75996:10;;76007:1;75996:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;75986:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;75966:3;;;;;:::i;:::-;;;;75923:106;;;;75834:202:::0;;:::o;76668:223::-;61312:13;:11;:13::i;:::-;76724:15:::1;76742:11;;;;;;;;;;;:21;;;76772:4;76742:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76724:54;;76807:1;76797:7;:11;76789:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;76845:11;;;;;;;;;;;:20;;;76866:7;:5;:7::i;:::-;76875;76845:38;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;76713:178;76668:223::o:0;61426:87::-;61472:7;61499:6;;;;;;;;;;;61492:13;;61426:87;:::o;42578:104::-;42634:13;42667:7;42660:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42578:104;:::o;71468:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;72269:872::-;72339:6;;;;;;;;;;;72338:7;72330:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;72389:1;72375:11;:15;:47;;;;;72409:13;;;;;;;;;;;72394:28;;:11;:28;;72375:47;72367:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;72498:9;;72493:1;72479:11;72465;;:25;;;;:::i;:::-;:29;;;;:::i;:::-;:42;;72457:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;72630:7;:5;:7::i;:::-;72616:21;;:10;:21;;;72612:356;;72662:9;:21;72672:10;72662:21;;;;;;;;;;;;;;;;;;;;;;;;;72654:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;72726:24;72753:20;:32;72774:10;72753:32;;;;;;;;;;;;;;;;72726:59;;72842:18;;;;;;;;;;;72808:52;;72827:11;72808:16;:30;;;;:::i;:::-;:52;;72800:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;72922:11;72915:4;;:18;;;;:::i;:::-;72902:9;:31;;72894:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;72639:329;72612:356;72985:9;72980:154;73004:11;73000:1;:15;72980:154;;;73037:20;:32;73058:10;73037:32;;;;;;;;;;;;;;;;:34;;;;;;;;;:::i;:::-;;;;;;73086:36;73096:10;73108:11;;:13;;;;;;;;;:::i;:::-;;;;;73086:9;:36::i;:::-;73017:3;;;;;:::i;:::-;;;;72980:154;;;;72269:872;:::o;44164:155::-;44259:52;44278:12;:10;:12::i;:::-;44292:8;44302;44259:18;:52::i;:::-;44164:155;;:::o;76417:111::-;61312:13;:11;:13::i;:::-;76514:6:::1;76493:18;;:27;;;;;;;;;;;;;;;;;;76417:111:::0;:::o;45215:279::-;45346:41;45365:12;:10;:12::i;:::-;45379:7;45346:18;:41::i;:::-;45338:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;45448:38;45462:4;45468:2;45472:7;45481:4;45448:13;:38::i;:::-;45215:279;;;;:::o;71323:40::-;;;;;;;;;;;;;:::o;71163:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;75010:396::-;75083:13;75117:16;75125:7;75117;:16::i;:::-;75109:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;75198:28;75229:10;:8;:10::i;:::-;75198:41;;75288:1;75263:14;75257:28;:32;:141;;;;;;;;;;;;;;;;;75329:14;75345:18;:7;:16;:18::i;:::-;75365:13;75312:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75257:141;75250:148;;;75010:396;;;:::o;71243:34::-;;;;:::o;76185:128::-;61312:13;:11;:13::i;:::-;76288:17:::1;76272:13;:33;;;;;;:::i;:::-;;76185:128:::0;:::o;75501:106::-;61312:13;:11;:13::i;:::-;75595:4:::1;75573:9;:19;75583:8;75573:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;75501:106:::0;:::o;44390:164::-;44487:4;44511:18;:25;44530:5;44511:25;;;;;;;;;;;;;;;:35;44537:8;44511:35;;;;;;;;;;;;;;;;;;;;;;;;;44504:42;;44390:164;;;;:::o;62325:201::-;61312:13;:11;:13::i;:::-;62434:1:::1;62414:22;;:8;:22;;::::0;62406:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;62490:28;62509:8;62490:18;:28::i;:::-;62325:201:::0;:::o;71518:25::-;;;;;;;;;;;;;:::o;41481:305::-;41583:4;41635:25;41620:40;;;:11;:40;;;;:105;;;;41692:33;41677:48;;;:11;:48;;;;41620:105;:158;;;;41742:36;41766:11;41742:23;:36::i;:::-;41620:158;41600:178;;41481:305;;;:::o;61591:132::-;61666:12;:10;:12::i;:::-;61655:23;;:7;:5;:7::i;:::-;:23;;;61647:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61591:132::o;53484:135::-;53566:16;53574:7;53566;:16::i;:::-;53558:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;53484:135;:::o;21372:98::-;21425:7;21452:10;21445:17;;21372:98;:::o;52797:174::-;52899:2;52872:15;:24;52888:7;52872:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;52955:7;52951:2;52917:46;;52926:23;52941:7;52926:14;:23::i;:::-;52917:46;;;;;;;;;;;;52797:174;;:::o;47484:264::-;47577:4;47594:13;47610:23;47625:7;47610:14;:23::i;:::-;47594:39;;47663:5;47652:16;;:7;:16;;;:52;;;;47672:32;47689:5;47696:7;47672:16;:32::i;:::-;47652:52;:87;;;;47732:7;47708:31;;:20;47720:7;47708:11;:20::i;:::-;:31;;;47652:87;47644:96;;;47484:264;;;;:::o;51449:1229::-;51574:4;51547:31;;:23;51562:7;51547:14;:23::i;:::-;:31;;;51539:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;51653:1;51639:16;;:2;:16;;;51631:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;51709:42;51730:4;51736:2;51740:7;51749:1;51709:20;:42::i;:::-;51881:4;51854:31;;:23;51869:7;51854:14;:23::i;:::-;:31;;;51846:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;51999:15;:24;52015:7;51999:24;;;;;;;;;;;;51992:31;;;;;;;;;;;52494:1;52475:9;:15;52485:4;52475:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;52527:1;52510:9;:13;52520:2;52510:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;52569:2;52550:7;:16;52558:7;52550:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;52608:7;52604:2;52589:27;;52598:4;52589:27;;;;;;;;;;;;52629:41;52649:4;52655:2;52659:7;52668:1;52629:19;:41::i;:::-;51449:1229;;;:::o;2538:293::-;1940:1;2672:7;;:19;2664:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1940:1;2805:7;:18;;;;2538:293::o;74110:851::-;74171:7;74198:2;74191:4;:9;74187:771;;;74252:8;74245:15;;;;74187:771;74316:2;74309:4;:9;74305:653;;;74361:8;74354:15;;;;74305:653;74425:2;74418:4;:9;74414:544;;;74470:8;74463:15;;;;74414:544;74534:2;74527:4;:9;74523:435;;;74579:8;74572:15;;;;74523:435;74643:2;74636:4;:9;74632:326;;;74687:9;74680:16;;;;74632:326;74753:2;74745:4;:10;74741:217;;74796:9;74789:16;;;;74741:217;74910:9;74903:16;;74110:851;;;;:::o;50329:783::-;50389:13;50405:23;50420:7;50405:14;:23::i;:::-;50389:39;;50441:51;50462:5;50477:1;50481:7;50490:1;50441:20;:51::i;:::-;50605:23;50620:7;50605:14;:23::i;:::-;50597:31;;50676:15;:24;50692:7;50676:24;;;;;;;;;;;;50669:31;;;;;;;;;;;50941:1;50921:9;:16;50931:5;50921:16;;;;;;;;;;;;;;;;:21;;;;;;;;;;;50971:7;:16;50979:7;50971:16;;;;;;;;;;;;50964:23;;;;;;;;;;;51033:7;51029:1;51005:36;;51014:5;51005:36;;;;;;;;;;;;51054:50;51074:5;51089:1;51093:7;51102:1;51054:19;:50::i;:::-;50378:734;50329:783;:::o;2839:213::-;1896:1;3022:7;:22;;;;2839:213::o;46759:117::-;46825:7;46852;:16;46860:7;46852:16;;;;;;;;;;;;;;;;;;;;;46845:23;;46759:117;;;:::o;62686:191::-;62760:16;62779:6;;;;;;;;;;;62760:25;;62805:8;62796:6;;:17;;;;;;;;;;;;;;;;;;62860:8;62829:40;;62850:8;62829:40;;;;;;;;;;;;62749:128;62686:191;:::o;48090:110::-;48166:26;48176:2;48180:7;48166:26;;;;;;;;;;;;:9;:26::i;:::-;48090:110;;:::o;53114:281::-;53235:8;53226:17;;:5;:17;;;53218:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;53322:8;53284:18;:25;53303:5;53284:25;;;;;;;;;;;;;;;:35;53310:8;53284:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;53368:8;53346:41;;53361:5;53346:41;;;53378:8;53346:41;;;;;;:::i;:::-;;;;;;;;53114:281;;;:::o;46375:270::-;46488:28;46498:4;46504:2;46508:7;46488:9;:28::i;:::-;46535:47;46558:4;46564:2;46568:7;46577:4;46535:22;:47::i;:::-;46527:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;46375:270;;;;:::o;47189:128::-;47254:4;47307:1;47278:31;;:17;47287:7;47278:8;:17::i;:::-;:31;;;;47271:38;;47189:128;;;:::o;72103:108::-;72163:13;72196:7;72189:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72103:108;:::o;36631:716::-;36687:13;36738:14;36775:1;36755:17;36766:5;36755:10;:17::i;:::-;:21;36738:38;;36791:20;36825:6;36814:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36791:41;;36847:11;36976:6;36972:2;36968:15;36960:6;36956:28;36949:35;;37013:288;37020:4;37013:288;;;37045:5;;;;;;;;37187:8;37182:2;37175:5;37171:14;37166:30;37161:3;37153:44;37243:2;37234:11;;;;;;:::i;:::-;;;;;37277:1;37268:5;:10;37013:288;37264:21;37013:288;37322:6;37315:13;;;;;36631:716;;;:::o;39904:157::-;39989:4;40028:25;40013:40;;;:11;:40;;;;40006:47;;39904:157;;;:::o;66139:915::-;66316:61;66343:4;66349:2;66353:12;66367:9;66316:26;:61::i;:::-;66406:1;66394:9;:13;66390:222;;;66537:63;;;;;;;;;;:::i;:::-;;;;;;;;66390:222;66624:15;66642:12;66624:30;;66687:1;66671:18;;:4;:18;;;66667:187;;66706:40;66738:7;66706:31;:40::i;:::-;66667:187;;;66776:2;66768:10;;:4;:10;;;66764:90;;66795:47;66828:4;66834:7;66795:32;:47::i;:::-;66764:90;66667:187;66882:1;66868:16;;:2;:16;;;66864:183;;66901:45;66938:7;66901:36;:45::i;:::-;66864:183;;;66974:4;66968:10;;:2;:10;;;66964:83;;66995:40;67023:2;67027:7;66995:27;:40::i;:::-;66964:83;66864:183;66305:749;66139:915;;;;:::o;56606:115::-;;;;;:::o;48427:285::-;48522:18;48528:2;48532:7;48522:5;:18::i;:::-;48573:53;48604:1;48608:2;48612:7;48621:4;48573:22;:53::i;:::-;48551:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;48427:285;;;:::o;54183:853::-;54337:4;54358:15;:2;:13;;;:15::i;:::-;54354:675;;;54410:2;54394:36;;;54431:12;:10;:12::i;:::-;54445:4;54451:7;54460:4;54394:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;54390:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54652:1;54635:6;:13;:18;54631:328;;54678:60;;;;;;;;;;:::i;:::-;;;;;;;;54631:328;54909:6;54903:13;54894:6;54890:2;54886:15;54879:38;54390:584;54526:41;;;54516:51;;;:6;:51;;;;54509:58;;;;;54354:675;55013:4;55006:11;;54183:853;;;;;;;:::o;32114:948::-;32167:7;32187:14;32204:1;32187:18;;32254:8;32245:5;:17;32241:106;;32292:8;32283:17;;;;;;:::i;:::-;;;;;32329:2;32319:12;;;;32241:106;32374:8;32365:5;:17;32361:106;;32412:8;32403:17;;;;;;:::i;:::-;;;;;32449:2;32439:12;;;;32361:106;32494:8;32485:5;:17;32481:106;;32532:8;32523:17;;;;;;:::i;:::-;;;;;32569:2;32559:12;;;;32481:106;32614:7;32605:5;:16;32601:103;;32651:7;32642:16;;;;;;:::i;:::-;;;;;32687:1;32677:11;;;;32601:103;32731:7;32722:5;:16;32718:103;;32768:7;32759:16;;;;;;:::i;:::-;;;;;32804:1;32794:11;;;;32718:103;32848:7;32839:5;:16;32835:103;;32885:7;32876:16;;;;;;:::i;:::-;;;;;32921:1;32911:11;;;;32835:103;32965:7;32956:5;:16;32952:68;;33003:1;32993:11;;;;32952:68;33048:6;33041:13;;;32114:948;;;:::o;55768:116::-;;;;;:::o;67777:164::-;67881:10;:17;;;;67854:15;:24;67870:7;67854:24;;;;;;;;;;;:44;;;;67909:10;67925:7;67909:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67777:164;:::o;68568:988::-;68834:22;68884:1;68859:22;68876:4;68859:16;:22::i;:::-;:26;;;;:::i;:::-;68834:51;;68896:18;68917:17;:26;68935:7;68917:26;;;;;;;;;;;;68896:47;;69064:14;69050:10;:28;69046:328;;69095:19;69117:12;:18;69130:4;69117:18;;;;;;;;;;;;;;;:34;69136:14;69117:34;;;;;;;;;;;;69095:56;;69201:11;69168:12;:18;69181:4;69168:18;;;;;;;;;;;;;;;:30;69187:10;69168:30;;;;;;;;;;;:44;;;;69318:10;69285:17;:30;69303:11;69285:30;;;;;;;;;;;:43;;;;69080:294;69046:328;69470:17;:26;69488:7;69470:26;;;;;;;;;;;69463:33;;;69514:12;:18;69527:4;69514:18;;;;;;;;;;;;;;;:34;69533:14;69514:34;;;;;;;;;;;69507:41;;;68649:907;;68568:988;;:::o;69851:1079::-;70104:22;70149:1;70129:10;:17;;;;:21;;;;:::i;:::-;70104:46;;70161:18;70182:15;:24;70198:7;70182:24;;;;;;;;;;;;70161:45;;70533:19;70555:10;70566:14;70555:26;;;;;;;;:::i;:::-;;;;;;;;;;70533:48;;70619:11;70594:10;70605;70594:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;70730:10;70699:15;:28;70715:11;70699:28;;;;;;;;;;;:41;;;;70871:15;:24;70887:7;70871:24;;;;;;;;;;;70864:31;;;70906:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;69922:1008;;;69851:1079;:::o;67355:221::-;67440:14;67457:20;67474:2;67457:16;:20::i;:::-;67440:37;;67515:7;67488:12;:16;67501:2;67488:16;;;;;;;;;;;;;;;:24;67505:6;67488:24;;;;;;;;;;;:34;;;;67562:6;67533:17;:26;67551:7;67533:26;;;;;;;;;;;:35;;;;67429:147;67355:221;;:::o;49048:942::-;49142:1;49128:16;;:2;:16;;;49120:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;49201:16;49209:7;49201;:16::i;:::-;49200:17;49192:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;49263:48;49292:1;49296:2;49300:7;49309:1;49263:20;:48::i;:::-;49410:16;49418:7;49410;:16::i;:::-;49409:17;49401:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;49825:1;49808:9;:13;49818:2;49808:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;49869:2;49850:7;:16;49858:7;49850:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;49914:7;49910:2;49889:33;;49906:1;49889:33;;;;;;;;;;;;49935:47;49963:1;49967:2;49971:7;49980:1;49935:19;:47::i;:::-;49048:942;;:::o;12513:326::-;12573:4;12830:1;12808:7;:19;;;:23;12801:30;;12513: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:116::-;1588:21;1603:5;1588:21;:::i;:::-;1581:5;1578:32;1568:60;;1624:1;1621;1614:12;1568:60;1518:116;:::o;1640:133::-;1683:5;1721:6;1708:20;1699:29;;1737:30;1761:5;1737:30;:::i;:::-;1640:133;;;;:::o;1779:323::-;1835:6;1884:2;1872:9;1863:7;1859:23;1855:32;1852:119;;;1890:79;;:::i;:::-;1852:119;2010:1;2035:50;2077:7;2068:6;2057:9;2053:22;2035:50;:::i;:::-;2025:60;;1981:114;1779:323;;;;:::o;2108:99::-;2160:6;2194:5;2188:12;2178:22;;2108:99;;;:::o;2213:169::-;2297:11;2331:6;2326:3;2319:19;2371:4;2366:3;2362:14;2347:29;;2213:169;;;;:::o;2388:246::-;2469:1;2479:113;2493:6;2490:1;2487:13;2479:113;;;2578:1;2573:3;2569:11;2563:18;2559:1;2554:3;2550:11;2543:39;2515:2;2512:1;2508:10;2503:15;;2479:113;;;2626:1;2617:6;2612:3;2608:16;2601:27;2450:184;2388:246;;;:::o;2640:102::-;2681:6;2732:2;2728:7;2723:2;2716:5;2712:14;2708:28;2698:38;;2640:102;;;:::o;2748:377::-;2836:3;2864:39;2897:5;2864:39;:::i;:::-;2919:71;2983:6;2978:3;2919:71;:::i;:::-;2912:78;;2999:65;3057:6;3052:3;3045:4;3038:5;3034:16;2999:65;:::i;:::-;3089:29;3111:6;3089:29;:::i;:::-;3084:3;3080:39;3073:46;;2840:285;2748:377;;;;:::o;3131:313::-;3244:4;3282:2;3271:9;3267:18;3259:26;;3331:9;3325:4;3321:20;3317:1;3306:9;3302:17;3295:47;3359:78;3432:4;3423:6;3359:78;:::i;:::-;3351:86;;3131:313;;;;:::o;3450:77::-;3487:7;3516:5;3505:16;;3450:77;;;:::o;3533:122::-;3606:24;3624:5;3606:24;:::i;:::-;3599:5;3596:35;3586:63;;3645:1;3642;3635:12;3586:63;3533:122;:::o;3661:139::-;3707:5;3745:6;3732:20;3723:29;;3761:33;3788:5;3761:33;:::i;:::-;3661:139;;;;:::o;3806:329::-;3865:6;3914:2;3902:9;3893:7;3889:23;3885:32;3882:119;;;3920:79;;:::i;:::-;3882:119;4040:1;4065:53;4110:7;4101:6;4090:9;4086:22;4065:53;:::i;:::-;4055:63;;4011:117;3806:329;;;;:::o;4141:126::-;4178:7;4218:42;4211:5;4207:54;4196:65;;4141:126;;;:::o;4273:96::-;4310:7;4339:24;4357:5;4339:24;:::i;:::-;4328:35;;4273:96;;;:::o;4375:118::-;4462:24;4480:5;4462:24;:::i;:::-;4457:3;4450:37;4375:118;;:::o;4499:222::-;4592:4;4630:2;4619:9;4615:18;4607:26;;4643:71;4711:1;4700:9;4696:17;4687:6;4643:71;:::i;:::-;4499:222;;;;:::o;4727:122::-;4800:24;4818:5;4800:24;:::i;:::-;4793:5;4790:35;4780:63;;4839:1;4836;4829:12;4780:63;4727:122;:::o;4855:139::-;4901:5;4939:6;4926:20;4917:29;;4955:33;4982:5;4955:33;:::i;:::-;4855:139;;;;:::o;5000:474::-;5068:6;5076;5125:2;5113:9;5104:7;5100:23;5096:32;5093:119;;;5131:79;;:::i;:::-;5093:119;5251:1;5276:53;5321:7;5312:6;5301:9;5297:22;5276:53;:::i;:::-;5266:63;;5222:117;5378:2;5404:53;5449:7;5440:6;5429:9;5425:22;5404:53;:::i;:::-;5394:63;;5349:118;5000:474;;;;;:::o;5480:118::-;5567:24;5585:5;5567:24;:::i;:::-;5562:3;5555:37;5480:118;;:::o;5604:222::-;5697:4;5735:2;5724:9;5720:18;5712:26;;5748:71;5816:1;5805:9;5801:17;5792:6;5748:71;:::i;:::-;5604:222;;;;:::o;5832:86::-;5867:7;5907:4;5900:5;5896:16;5885:27;;5832:86;;;:::o;5924:112::-;6007:22;6023:5;6007:22;:::i;:::-;6002:3;5995:35;5924:112;;:::o;6042:214::-;6131:4;6169:2;6158:9;6154:18;6146:26;;6182:67;6246:1;6235:9;6231:17;6222:6;6182:67;:::i;:::-;6042:214;;;;:::o;6262:619::-;6339:6;6347;6355;6404:2;6392:9;6383:7;6379:23;6375:32;6372:119;;;6410:79;;:::i;:::-;6372:119;6530:1;6555:53;6600:7;6591:6;6580:9;6576:22;6555:53;:::i;:::-;6545:63;;6501:117;6657:2;6683:53;6728:7;6719:6;6708:9;6704:22;6683:53;:::i;:::-;6673:63;;6628:118;6785:2;6811:53;6856:7;6847:6;6836:9;6832:22;6811:53;:::i;:::-;6801:63;;6756:118;6262:619;;;;;:::o;6887:117::-;6996:1;6993;6986:12;7010:117;7119:1;7116;7109:12;7133:180;7181:77;7178:1;7171:88;7278:4;7275:1;7268:15;7302:4;7299:1;7292:15;7319:281;7402:27;7424:4;7402:27;:::i;:::-;7394:6;7390:40;7532:6;7520:10;7517:22;7496:18;7484:10;7481:34;7478:62;7475:88;;;7543:18;;:::i;:::-;7475:88;7583:10;7579:2;7572:22;7362:238;7319:281;;:::o;7606:129::-;7640:6;7667:20;;:::i;:::-;7657:30;;7696:33;7724:4;7716:6;7696:33;:::i;:::-;7606:129;;;:::o;7741:308::-;7803:4;7893:18;7885:6;7882:30;7879:56;;;7915:18;;:::i;:::-;7879:56;7953:29;7975:6;7953:29;:::i;:::-;7945:37;;8037:4;8031;8027:15;8019:23;;7741:308;;;:::o;8055:146::-;8152:6;8147:3;8142;8129:30;8193:1;8184:6;8179:3;8175:16;8168:27;8055:146;;;:::o;8207:425::-;8285:5;8310:66;8326:49;8368:6;8326:49;:::i;:::-;8310:66;:::i;:::-;8301:75;;8399:6;8392:5;8385:21;8437:4;8430:5;8426:16;8475:3;8466:6;8461:3;8457:16;8454:25;8451:112;;;8482:79;;:::i;:::-;8451:112;8572:54;8619:6;8614:3;8609;8572:54;:::i;:::-;8291:341;8207:425;;;;;:::o;8652:340::-;8708:5;8757:3;8750:4;8742:6;8738:17;8734:27;8724:122;;8765:79;;:::i;:::-;8724:122;8882:6;8869:20;8907:79;8982:3;8974:6;8967:4;8959:6;8955:17;8907:79;:::i;:::-;8898:88;;8714:278;8652:340;;;;:::o;8998:509::-;9067:6;9116:2;9104:9;9095:7;9091:23;9087:32;9084:119;;;9122:79;;:::i;:::-;9084:119;9270:1;9259:9;9255:17;9242:31;9300:18;9292:6;9289:30;9286:117;;;9322:79;;:::i;:::-;9286:117;9427:63;9482:7;9473:6;9462:9;9458:22;9427:63;:::i;:::-;9417:73;;9213:287;8998:509;;;;:::o;9513:329::-;9572:6;9621:2;9609:9;9600:7;9596:23;9592:32;9589:119;;;9627:79;;:::i;:::-;9589:119;9747:1;9772:53;9817:7;9808:6;9797:9;9793:22;9772:53;:::i;:::-;9762:63;;9718:117;9513:329;;;;:::o;9848:117::-;9957:1;9954;9947:12;9971:117;10080:1;10077;10070:12;10111:568;10184:8;10194:6;10244:3;10237:4;10229:6;10225:17;10221:27;10211:122;;10252:79;;:::i;:::-;10211:122;10365:6;10352:20;10342:30;;10395:18;10387:6;10384:30;10381:117;;;10417:79;;:::i;:::-;10381:117;10531:4;10523:6;10519:17;10507:29;;10585:3;10577:4;10569:6;10565:17;10555:8;10551:32;10548:41;10545:128;;;10592:79;;:::i;:::-;10545:128;10111:568;;;;;:::o;10685:559::-;10771:6;10779;10828:2;10816:9;10807:7;10803:23;10799:32;10796:119;;;10834:79;;:::i;:::-;10796:119;10982:1;10971:9;10967:17;10954:31;11012:18;11004:6;11001:30;10998:117;;;11034:79;;:::i;:::-;10998:117;11147:80;11219:7;11210:6;11199:9;11195:22;11147:80;:::i;:::-;11129:98;;;;10925:312;10685:559;;;;;:::o;11250:468::-;11315:6;11323;11372:2;11360:9;11351:7;11347:23;11343:32;11340:119;;;11378:79;;:::i;:::-;11340:119;11498:1;11523:53;11568:7;11559:6;11548:9;11544:22;11523:53;:::i;:::-;11513:63;;11469:117;11625:2;11651:50;11693:7;11684:6;11673:9;11669:22;11651:50;:::i;:::-;11641:60;;11596:115;11250:468;;;;;:::o;11724:89::-;11760:7;11800:6;11793:5;11789:18;11778:29;;11724:89;;;:::o;11819:120::-;11891:23;11908:5;11891:23;:::i;:::-;11884:5;11881:34;11871:62;;11929:1;11926;11919:12;11871:62;11819:120;:::o;11945:137::-;11990:5;12028:6;12015:20;12006:29;;12044:32;12070:5;12044:32;:::i;:::-;11945:137;;;;:::o;12088:327::-;12146:6;12195:2;12183:9;12174:7;12170:23;12166:32;12163:119;;;12201:79;;:::i;:::-;12163:119;12321:1;12346:52;12390:7;12381:6;12370:9;12366:22;12346:52;:::i;:::-;12336:62;;12292:116;12088:327;;;;:::o;12421:307::-;12482:4;12572:18;12564:6;12561:30;12558:56;;;12594:18;;:::i;:::-;12558:56;12632:29;12654:6;12632:29;:::i;:::-;12624:37;;12716:4;12710;12706:15;12698:23;;12421:307;;;:::o;12734:423::-;12811:5;12836:65;12852:48;12893:6;12852:48;:::i;:::-;12836:65;:::i;:::-;12827:74;;12924:6;12917:5;12910:21;12962:4;12955:5;12951:16;13000:3;12991:6;12986:3;12982:16;12979:25;12976:112;;;13007:79;;:::i;:::-;12976:112;13097:54;13144:6;13139:3;13134;13097:54;:::i;:::-;12817:340;12734:423;;;;;:::o;13176:338::-;13231:5;13280:3;13273:4;13265:6;13261:17;13257:27;13247:122;;13288:79;;:::i;:::-;13247:122;13405:6;13392:20;13430:78;13504:3;13496:6;13489:4;13481:6;13477:17;13430:78;:::i;:::-;13421:87;;13237:277;13176:338;;;;:::o;13520:943::-;13615:6;13623;13631;13639;13688:3;13676:9;13667:7;13663:23;13659:33;13656:120;;;13695:79;;:::i;:::-;13656:120;13815:1;13840:53;13885:7;13876:6;13865:9;13861:22;13840:53;:::i;:::-;13830:63;;13786:117;13942:2;13968:53;14013:7;14004:6;13993:9;13989:22;13968:53;:::i;:::-;13958:63;;13913:118;14070:2;14096:53;14141:7;14132:6;14121:9;14117:22;14096:53;:::i;:::-;14086:63;;14041:118;14226:2;14215:9;14211:18;14198:32;14257:18;14249:6;14246:30;14243:117;;;14279:79;;:::i;:::-;14243:117;14384:62;14438:7;14429:6;14418:9;14414:22;14384:62;:::i;:::-;14374:72;;14169:287;13520:943;;;;;;;:::o;14469:115::-;14554:23;14571:5;14554:23;:::i;:::-;14549:3;14542:36;14469:115;;:::o;14590:218::-;14681:4;14719:2;14708:9;14704:18;14696:26;;14732:69;14798:1;14787:9;14783:17;14774:6;14732:69;:::i;:::-;14590:218;;;;:::o;14814:474::-;14882:6;14890;14939:2;14927:9;14918:7;14914:23;14910:32;14907:119;;;14945:79;;:::i;:::-;14907:119;15065:1;15090:53;15135:7;15126:6;15115:9;15111:22;15090:53;:::i;:::-;15080:63;;15036:117;15192:2;15218:53;15263:7;15254:6;15243:9;15239:22;15218:53;:::i;:::-;15208:63;;15163:118;14814:474;;;;;:::o;15294:60::-;15322:3;15343:5;15336:12;;15294:60;;;:::o;15360:142::-;15410:9;15443:53;15461:34;15470:24;15488:5;15470:24;:::i;:::-;15461:34;:::i;:::-;15443:53;:::i;:::-;15430:66;;15360:142;;;:::o;15508:126::-;15558:9;15591:37;15622:5;15591:37;:::i;:::-;15578:50;;15508:126;;;:::o;15640:141::-;15705:9;15738:37;15769:5;15738:37;:::i;:::-;15725:50;;15640:141;;;:::o;15787:161::-;15889:52;15935:5;15889:52;:::i;:::-;15884:3;15877:65;15787:161;;:::o;15954:252::-;16062:4;16100:2;16089:9;16085:18;16077:26;;16113:86;16196:1;16185:9;16181:17;16172:6;16113:86;:::i;:::-;15954:252;;;;:::o;16212:180::-;16260:77;16257:1;16250:88;16357:4;16354:1;16347:15;16381:4;16378:1;16371:15;16398:320;16442:6;16479:1;16473:4;16469:12;16459:22;;16526:1;16520:4;16516:12;16547:18;16537:81;;16603:4;16595:6;16591:17;16581:27;;16537:81;16665:2;16657:6;16654:14;16634:18;16631:38;16628:84;;16684:18;;:::i;:::-;16628:84;16449:269;16398:320;;;:::o;16724:220::-;16864:34;16860:1;16852:6;16848:14;16841:58;16933:3;16928:2;16920:6;16916:15;16909:28;16724:220;:::o;16950:366::-;17092:3;17113:67;17177:2;17172:3;17113:67;:::i;:::-;17106:74;;17189:93;17278:3;17189:93;:::i;:::-;17307:2;17302:3;17298:12;17291:19;;16950:366;;;:::o;17322:419::-;17488:4;17526:2;17515:9;17511:18;17503:26;;17575:9;17569:4;17565:20;17561:1;17550:9;17546:17;17539:47;17603:131;17729:4;17603:131;:::i;:::-;17595:139;;17322:419;;;:::o;17747:248::-;17887:34;17883:1;17875:6;17871:14;17864:58;17956:31;17951:2;17943:6;17939:15;17932:56;17747:248;:::o;18001:366::-;18143:3;18164:67;18228:2;18223:3;18164:67;:::i;:::-;18157:74;;18240:93;18329:3;18240:93;:::i;:::-;18358:2;18353:3;18349:12;18342:19;;18001:366;;;:::o;18373:419::-;18539:4;18577:2;18566:9;18562:18;18554:26;;18626:9;18620:4;18616:20;18612:1;18601:9;18597:17;18590:47;18654:131;18780:4;18654:131;:::i;:::-;18646:139;;18373:419;;;:::o;18798:232::-;18938:34;18934:1;18926:6;18922:14;18915:58;19007:15;19002:2;18994:6;18990:15;18983:40;18798:232;:::o;19036:366::-;19178:3;19199:67;19263:2;19258:3;19199:67;:::i;:::-;19192:74;;19275:93;19364:3;19275:93;:::i;:::-;19393:2;19388:3;19384:12;19377:19;;19036:366;;;:::o;19408:419::-;19574:4;19612:2;19601:9;19597:18;19589:26;;19661:9;19655:4;19651:20;19647:1;19636:9;19632:17;19625:47;19689:131;19815:4;19689:131;:::i;:::-;19681:139;;19408:419;;;:::o;19833:230::-;19973:34;19969:1;19961:6;19957:14;19950:58;20042:13;20037:2;20029:6;20025:15;20018:38;19833:230;:::o;20069:366::-;20211:3;20232:67;20296:2;20291:3;20232:67;:::i;:::-;20225:74;;20308:93;20397:3;20308:93;:::i;:::-;20426:2;20421:3;20417:12;20410:19;;20069:366;;;:::o;20441:419::-;20607:4;20645:2;20634:9;20630:18;20622:26;;20694:9;20688:4;20684:20;20680:1;20669:9;20665:17;20658:47;20722:131;20848:4;20722:131;:::i;:::-;20714:139;;20441:419;;;:::o;20866:231::-;21006:34;21002:1;20994:6;20990:14;20983:58;21075:14;21070:2;21062:6;21058:15;21051:39;20866:231;:::o;21103:366::-;21245:3;21266:67;21330:2;21325:3;21266:67;:::i;:::-;21259:74;;21342:93;21431:3;21342:93;:::i;:::-;21460:2;21455:3;21451:12;21444:19;;21103:366;;;:::o;21475:419::-;21641:4;21679:2;21668:9;21664:18;21656:26;;21728:9;21722:4;21718:20;21714:1;21703:9;21699:17;21692:47;21756:131;21882:4;21756:131;:::i;:::-;21748:139;;21475:419;;;:::o;21900:180::-;21948:77;21945:1;21938:88;22045:4;22042:1;22035:15;22069:4;22066:1;22059:15;22086:159;22226:11;22222:1;22214:6;22210:14;22203:35;22086:159;:::o;22251:365::-;22393:3;22414:66;22478:1;22473:3;22414:66;:::i;:::-;22407:73;;22489:93;22578:3;22489:93;:::i;:::-;22607:2;22602:3;22598:12;22591:19;;22251:365;;;:::o;22622:419::-;22788:4;22826:2;22815:9;22811:18;22803:26;;22875:9;22869:4;22865:20;22861:1;22850:9;22846:17;22839:47;22903:131;23029:4;22903:131;:::i;:::-;22895:139;;22622:419;;;:::o;23047:180::-;23095:77;23092:1;23085:88;23192:4;23189:1;23182:15;23216:4;23213:1;23206:15;23233:194;23273:4;23293:20;23311:1;23293:20;:::i;:::-;23288:25;;23327:20;23345:1;23327:20;:::i;:::-;23322:25;;23371:1;23368;23364:9;23356:17;;23395:1;23389:4;23386:11;23383:37;;;23400:18;;:::i;:::-;23383:37;23233:194;;;;:::o;23433:79::-;23472:7;23501:5;23490:16;;23433:79;;;:::o;23518:157::-;23623:45;23643:24;23661:5;23643:24;:::i;:::-;23623:45;:::i;:::-;23618:3;23611:58;23518:157;;:::o;23681:77::-;23718:7;23747:5;23736:16;;23681:77;;;:::o;23764:79::-;23803:7;23832:5;23821:16;;23764:79;;;:::o;23849:157::-;23954:45;23974:24;23992:5;23974:24;:::i;:::-;23954:45;:::i;:::-;23949:3;23942:58;23849:157;;:::o;24012:94::-;24045:8;24093:5;24089:2;24085:14;24064:35;;24012:94;;;:::o;24112:::-;24151:7;24180:20;24194:5;24180:20;:::i;:::-;24169:31;;24112:94;;;:::o;24212:100::-;24251:7;24280:26;24300:5;24280:26;:::i;:::-;24269:37;;24212:100;;;:::o;24318:157::-;24423:45;24443:24;24461:5;24443:24;:::i;:::-;24423:45;:::i;:::-;24418:3;24411:58;24318:157;;:::o;24481:820::-;24705:3;24720:75;24791:3;24782:6;24720:75;:::i;:::-;24820:2;24815:3;24811:12;24804:19;;24833:75;24904:3;24895:6;24833:75;:::i;:::-;24933:2;24928:3;24924:12;24917:19;;24946:75;25017:3;25008:6;24946:75;:::i;:::-;25046:2;25041:3;25037:12;25030:19;;25059:75;25130:3;25121:6;25059:75;:::i;:::-;25159:2;25154:3;25150:12;25143:19;;25172:75;25243:3;25234:6;25172:75;:::i;:::-;25272:2;25267:3;25263:12;25256:19;;25292:3;25285:10;;24481:820;;;;;;;;:::o;25307:180::-;25355:77;25352:1;25345:88;25452:4;25449:1;25442:15;25476:4;25473:1;25466:15;25493:176;25525:1;25542:20;25560:1;25542:20;:::i;:::-;25537:25;;25576:20;25594:1;25576:20;:::i;:::-;25571:25;;25615:1;25605:35;;25620:18;;:::i;:::-;25605:35;25661:1;25658;25654:9;25649:14;;25493:176;;;;:::o;25675:143::-;25732:5;25763:6;25757:13;25748:22;;25779:33;25806:5;25779:33;:::i;:::-;25675:143;;;;:::o;25824:351::-;25894:6;25943:2;25931:9;25922:7;25918:23;25914:32;25911:119;;;25949:79;;:::i;:::-;25911:119;26069:1;26094:64;26150:7;26141:6;26130:9;26126:22;26094:64;:::i;:::-;26084:74;;26040:128;25824:351;;;;:::o;26181:332::-;26302:4;26340:2;26329:9;26325:18;26317:26;;26353:71;26421:1;26410:9;26406:17;26397:6;26353:71;:::i;:::-;26434:72;26502:2;26491:9;26487:18;26478:6;26434:72;:::i;:::-;26181:332;;;;;:::o;26519:137::-;26573:5;26604:6;26598:13;26589:22;;26620:30;26644:5;26620:30;:::i;:::-;26519:137;;;;:::o;26662:345::-;26729:6;26778:2;26766:9;26757:7;26753:23;26749:32;26746:119;;;26784:79;;:::i;:::-;26746:119;26904:1;26929:61;26982:7;26973:6;26962:9;26958:22;26929:61;:::i;:::-;26919:71;;26875:125;26662:345;;;;:::o;27013:141::-;27062:4;27085:3;27077:11;;27108:3;27105:1;27098:14;27142:4;27139:1;27129:18;27121:26;;27013:141;;;:::o;27160:93::-;27197:6;27244:2;27239;27232:5;27228:14;27224:23;27214:33;;27160:93;;;:::o;27259:107::-;27303:8;27353:5;27347:4;27343:16;27322:37;;27259:107;;;;:::o;27372:393::-;27441:6;27491:1;27479:10;27475:18;27514:97;27544:66;27533:9;27514:97;:::i;:::-;27632:39;27662:8;27651:9;27632:39;:::i;:::-;27620:51;;27704:4;27700:9;27693:5;27689:21;27680:30;;27753:4;27743:8;27739:19;27732:5;27729:30;27719:40;;27448:317;;27372:393;;;;;:::o;27771:142::-;27821:9;27854:53;27872:34;27881:24;27899:5;27881:24;:::i;:::-;27872:34;:::i;:::-;27854:53;:::i;:::-;27841:66;;27771:142;;;:::o;27919:75::-;27962:3;27983:5;27976:12;;27919:75;;;:::o;28000:269::-;28110:39;28141:7;28110:39;:::i;:::-;28171:91;28220:41;28244:16;28220:41;:::i;:::-;28212:6;28205:4;28199:11;28171:91;:::i;:::-;28165:4;28158:105;28076:193;28000:269;;;:::o;28275:73::-;28320:3;28275:73;:::o;28354:189::-;28431:32;;:::i;:::-;28472:65;28530:6;28522;28516:4;28472:65;:::i;:::-;28407:136;28354:189;;:::o;28549:186::-;28609:120;28626:3;28619:5;28616:14;28609:120;;;28680:39;28717:1;28710:5;28680:39;:::i;:::-;28653:1;28646:5;28642:13;28633:22;;28609:120;;;28549:186;;:::o;28741:543::-;28842:2;28837:3;28834:11;28831:446;;;28876:38;28908:5;28876:38;:::i;:::-;28960:29;28978:10;28960:29;:::i;:::-;28950:8;28946:44;29143:2;29131:10;29128:18;29125:49;;;29164:8;29149:23;;29125:49;29187:80;29243:22;29261:3;29243:22;:::i;:::-;29233:8;29229:37;29216:11;29187:80;:::i;:::-;28846:431;;28831:446;28741:543;;;:::o;29290:117::-;29344:8;29394:5;29388:4;29384:16;29363:37;;29290:117;;;;:::o;29413:169::-;29457:6;29490:51;29538:1;29534:6;29526:5;29523:1;29519:13;29490:51;:::i;:::-;29486:56;29571:4;29565;29561:15;29551:25;;29464:118;29413:169;;;;:::o;29587:295::-;29663:4;29809:29;29834:3;29828:4;29809:29;:::i;:::-;29801:37;;29871:3;29868:1;29864:11;29858:4;29855:21;29847:29;;29587:295;;;;:::o;29887:1395::-;30004:37;30037:3;30004:37;:::i;:::-;30106:18;30098:6;30095:30;30092:56;;;30128:18;;:::i;:::-;30092:56;30172:38;30204:4;30198:11;30172:38;:::i;:::-;30257:67;30317:6;30309;30303:4;30257:67;:::i;:::-;30351:1;30375:4;30362:17;;30407:2;30399:6;30396:14;30424:1;30419:618;;;;31081:1;31098:6;31095:77;;;31147:9;31142:3;31138:19;31132:26;31123:35;;31095:77;31198:67;31258:6;31251:5;31198:67;:::i;:::-;31192:4;31185:81;31054:222;30389:887;;30419:618;30471:4;30467:9;30459:6;30455:22;30505:37;30537:4;30505:37;:::i;:::-;30564:1;30578:208;30592:7;30589:1;30586:14;30578:208;;;30671:9;30666:3;30662:19;30656:26;30648:6;30641:42;30722:1;30714:6;30710:14;30700:24;;30769:2;30758:9;30754:18;30741:31;;30615:4;30612:1;30608:12;30603:17;;30578:208;;;30814:6;30805:7;30802:19;30799:179;;;30872:9;30867:3;30863:19;30857:26;30915:48;30957:4;30949:6;30945:17;30934:9;30915:48;:::i;:::-;30907:6;30900:64;30822:156;30799:179;31024:1;31020;31012:6;31008:14;31004:22;30998:4;30991:36;30426:611;;;30389:887;;29979:1303;;;29887:1395;;:::o;31288:174::-;31428:26;31424:1;31416:6;31412:14;31405:50;31288:174;:::o;31468:366::-;31610:3;31631:67;31695:2;31690:3;31631:67;:::i;:::-;31624:74;;31707:93;31796:3;31707:93;:::i;:::-;31825:2;31820:3;31816:12;31809:19;;31468:366;;;:::o;31840:419::-;32006:4;32044:2;32033:9;32029:18;32021:26;;32093:9;32087:4;32083:20;32079:1;32068:9;32064:17;32057:47;32121:131;32247:4;32121:131;:::i;:::-;32113:139;;31840:419;;;:::o;32265:228::-;32405:34;32401:1;32393:6;32389:14;32382:58;32474:11;32469:2;32461:6;32457:15;32450:36;32265:228;:::o;32499:366::-;32641:3;32662:67;32726:2;32721:3;32662:67;:::i;:::-;32655:74;;32738:93;32827:3;32738:93;:::i;:::-;32856:2;32851:3;32847:12;32840:19;;32499:366;;;:::o;32871:419::-;33037:4;33075:2;33064:9;33060:18;33052:26;;33124:9;33118:4;33114:20;33110:1;33099:9;33095:17;33088:47;33152:131;33278:4;33152:131;:::i;:::-;33144:139;;32871:419;;;:::o;33296:233::-;33335:3;33358:24;33376:5;33358:24;:::i;:::-;33349:33;;33404:66;33397:5;33394:77;33391:103;;33474:18;;:::i;:::-;33391:103;33521:1;33514:5;33510:13;33503:20;;33296:233;;;:::o;33535:171::-;33675:23;33671:1;33663:6;33659:14;33652:47;33535:171;:::o;33712:366::-;33854:3;33875:67;33939:2;33934:3;33875:67;:::i;:::-;33868:74;;33951:93;34040:3;33951:93;:::i;:::-;34069:2;34064:3;34060:12;34053:19;;33712:366;;;:::o;34084:419::-;34250:4;34288:2;34277:9;34273:18;34265:26;;34337:9;34331:4;34327:20;34323:1;34312:9;34308:17;34301:47;34365:131;34491:4;34365:131;:::i;:::-;34357:139;;34084:419;;;:::o;34509:156::-;34649:8;34645:1;34637:6;34633:14;34626:32;34509:156;:::o;34671:365::-;34813:3;34834:66;34898:1;34893:3;34834:66;:::i;:::-;34827:73;;34909:93;34998:3;34909:93;:::i;:::-;35027:2;35022:3;35018:12;35011:19;;34671:365;;;:::o;35042:419::-;35208:4;35246:2;35235:9;35231:18;35223:26;;35295:9;35289:4;35285:20;35281:1;35270:9;35266:17;35259:47;35323:131;35449:4;35323:131;:::i;:::-;35315:139;;35042:419;;;:::o;35467:169::-;35607:21;35603:1;35595:6;35591:14;35584:45;35467:169;:::o;35642:366::-;35784:3;35805:67;35869:2;35864:3;35805:67;:::i;:::-;35798:74;;35881:93;35970:3;35881:93;:::i;:::-;35999:2;35994:3;35990:12;35983:19;;35642:366;;;:::o;36014:419::-;36180:4;36218:2;36207:9;36203:18;36195:26;;36267:9;36261:4;36257:20;36253:1;36242:9;36238:17;36231:47;36295:131;36421:4;36295:131;:::i;:::-;36287:139;;36014:419;;;:::o;36439:191::-;36479:3;36498:20;36516:1;36498:20;:::i;:::-;36493:25;;36532:20;36550:1;36532:20;:::i;:::-;36527:25;;36575:1;36572;36568:9;36561:16;;36596:3;36593:1;36590:10;36587:36;;;36603:18;;:::i;:::-;36587:36;36439:191;;;;:::o;36636:168::-;36776:20;36772:1;36764:6;36760:14;36753:44;36636:168;:::o;36810:366::-;36952:3;36973:67;37037:2;37032:3;36973:67;:::i;:::-;36966:74;;37049:93;37138:3;37049:93;:::i;:::-;37167:2;37162:3;37158:12;37151:19;;36810:366;;;:::o;37182:419::-;37348:4;37386:2;37375:9;37371:18;37363:26;;37435:9;37429:4;37425:20;37421:1;37410:9;37406:17;37399:47;37463:131;37589:4;37463:131;:::i;:::-;37455:139;;37182:419;;;:::o;37607:173::-;37747:25;37743:1;37735:6;37731:14;37724:49;37607:173;:::o;37786:366::-;37928:3;37949:67;38013:2;38008:3;37949:67;:::i;:::-;37942:74;;38025:93;38114:3;38025:93;:::i;:::-;38143:2;38138:3;38134:12;38127:19;;37786:366;;;:::o;38158:419::-;38324:4;38362:2;38351:9;38347:18;38339:26;;38411:9;38405:4;38401:20;38397:1;38386:9;38382:17;38375:47;38439:131;38565:4;38439:131;:::i;:::-;38431:139;;38158:419;;;:::o;38583:164::-;38723:16;38719:1;38711:6;38707:14;38700:40;38583:164;:::o;38753:366::-;38895:3;38916:67;38980:2;38975:3;38916:67;:::i;:::-;38909:74;;38992:93;39081:3;38992:93;:::i;:::-;39110:2;39105:3;39101:12;39094:19;;38753:366;;;:::o;39125:419::-;39291:4;39329:2;39318:9;39314:18;39306:26;;39378:9;39372:4;39368:20;39364:1;39353:9;39349:17;39342:47;39406:131;39532:4;39406:131;:::i;:::-;39398:139;;39125:419;;;:::o;39550:410::-;39590:7;39613:20;39631:1;39613:20;:::i;:::-;39608:25;;39647:20;39665:1;39647:20;:::i;:::-;39642:25;;39702:1;39699;39695:9;39724:30;39742:11;39724:30;:::i;:::-;39713:41;;39903:1;39894:7;39890:15;39887:1;39884:22;39864:1;39857:9;39837:83;39814:139;;39933:18;;:::i;:::-;39814:139;39598:362;39550:410;;;;:::o;39966:168::-;40106:20;40102:1;40094:6;40090:14;40083:44;39966:168;:::o;40140:366::-;40282:3;40303:67;40367:2;40362:3;40303:67;:::i;:::-;40296:74;;40379:93;40468:3;40379:93;:::i;:::-;40497:2;40492:3;40488:12;40481:19;;40140:366;;;:::o;40512:419::-;40678:4;40716:2;40705:9;40701:18;40693:26;;40765:9;40759:4;40755:20;40751:1;40740:9;40736:17;40729:47;40793:131;40919:4;40793:131;:::i;:::-;40785:139;;40512:419;;;:::o;40937:234::-;41077:34;41073:1;41065:6;41061:14;41054:58;41146:17;41141:2;41133:6;41129:15;41122:42;40937:234;:::o;41177:366::-;41319:3;41340:67;41404:2;41399:3;41340:67;:::i;:::-;41333:74;;41416:93;41505:3;41416:93;:::i;:::-;41534:2;41529:3;41525:12;41518:19;;41177:366;;;:::o;41549:419::-;41715:4;41753:2;41742:9;41738:18;41730:26;;41802:9;41796:4;41792:20;41788:1;41777:9;41773:17;41766:47;41830:131;41956:4;41830:131;:::i;:::-;41822:139;;41549:419;;;:::o;41974:148::-;42076:11;42113:3;42098:18;;41974:148;;;;:::o;42128:390::-;42234:3;42262:39;42295:5;42262:39;:::i;:::-;42317:89;42399:6;42394:3;42317:89;:::i;:::-;42310:96;;42415:65;42473:6;42468:3;42461:4;42454:5;42450:16;42415:65;:::i;:::-;42505:6;42500:3;42496:16;42489:23;;42238:280;42128:390;;;;:::o;42548:874::-;42651:3;42688:5;42682:12;42717:36;42743:9;42717:36;:::i;:::-;42769:89;42851:6;42846:3;42769:89;:::i;:::-;42762:96;;42889:1;42878:9;42874:17;42905:1;42900:166;;;;43080:1;43075:341;;;;42867:549;;42900:166;42984:4;42980:9;42969;42965:25;42960:3;42953:38;43046:6;43039:14;43032:22;43024:6;43020:35;43015:3;43011:45;43004:52;;42900:166;;43075:341;43142:38;43174:5;43142:38;:::i;:::-;43202:1;43216:154;43230:6;43227:1;43224:13;43216:154;;;43304:7;43298:14;43294:1;43289:3;43285:11;43278:35;43354:1;43345:7;43341:15;43330:26;;43252:4;43249:1;43245:12;43240:17;;43216:154;;;43399:6;43394:3;43390:16;43383:23;;43082:334;;42867:549;;42655:767;;42548:874;;;;:::o;43428:589::-;43653:3;43675:95;43766:3;43757:6;43675:95;:::i;:::-;43668:102;;43787:95;43878:3;43869:6;43787:95;:::i;:::-;43780:102;;43899:92;43987:3;43978:6;43899:92;:::i;:::-;43892:99;;44008:3;44001:10;;43428:589;;;;;;:::o;44023:225::-;44163:34;44159:1;44151:6;44147:14;44140:58;44232:8;44227:2;44219:6;44215:15;44208:33;44023:225;:::o;44254:366::-;44396:3;44417:67;44481:2;44476:3;44417:67;:::i;:::-;44410:74;;44493:93;44582:3;44493:93;:::i;:::-;44611:2;44606:3;44602:12;44595:19;;44254:366;;;:::o;44626:419::-;44792:4;44830:2;44819:9;44815:18;44807:26;;44879:9;44873:4;44869:20;44865:1;44854:9;44850:17;44843:47;44907:131;45033:4;44907:131;:::i;:::-;44899:139;;44626:419;;;:::o;45051:182::-;45191:34;45187:1;45179:6;45175:14;45168:58;45051:182;:::o;45239:366::-;45381:3;45402:67;45466:2;45461:3;45402:67;:::i;:::-;45395:74;;45478:93;45567:3;45478:93;:::i;:::-;45596:2;45591:3;45587:12;45580:19;;45239:366;;;:::o;45611:419::-;45777:4;45815:2;45804:9;45800:18;45792:26;;45864:9;45858:4;45854:20;45850:1;45839:9;45835:17;45828:47;45892:131;46018:4;45892:131;:::i;:::-;45884:139;;45611:419;;;:::o;46036:224::-;46176:34;46172:1;46164:6;46160:14;46153:58;46245:7;46240:2;46232:6;46228:15;46221:32;46036:224;:::o;46266:366::-;46408:3;46429:67;46493:2;46488:3;46429:67;:::i;:::-;46422:74;;46505:93;46594:3;46505:93;:::i;:::-;46623:2;46618:3;46614:12;46607:19;;46266:366;;;:::o;46638:419::-;46804:4;46842:2;46831:9;46827:18;46819:26;;46891:9;46885:4;46881:20;46877:1;46866:9;46862:17;46855:47;46919:131;47045:4;46919:131;:::i;:::-;46911:139;;46638:419;;;:::o;47063:223::-;47203:34;47199:1;47191:6;47187:14;47180:58;47272:6;47267:2;47259:6;47255:15;47248:31;47063:223;:::o;47292:366::-;47434:3;47455:67;47519:2;47514:3;47455:67;:::i;:::-;47448:74;;47531:93;47620:3;47531:93;:::i;:::-;47649:2;47644:3;47640:12;47633:19;;47292:366;;;:::o;47664:419::-;47830:4;47868:2;47857:9;47853:18;47845:26;;47917:9;47911:4;47907:20;47903:1;47892:9;47888:17;47881:47;47945:131;48071:4;47945:131;:::i;:::-;47937:139;;47664:419;;;:::o;48089:181::-;48229:33;48225:1;48217:6;48213:14;48206:57;48089:181;:::o;48276:366::-;48418:3;48439:67;48503:2;48498:3;48439:67;:::i;:::-;48432:74;;48515:93;48604:3;48515:93;:::i;:::-;48633:2;48628:3;48624:12;48617:19;;48276:366;;;:::o;48648:419::-;48814:4;48852:2;48841:9;48837:18;48829:26;;48901:9;48895:4;48891:20;48887:1;48876:9;48872:17;48865:47;48929:131;49055:4;48929:131;:::i;:::-;48921:139;;48648:419;;;:::o;49073:175::-;49213:27;49209:1;49201:6;49197:14;49190:51;49073:175;:::o;49254:366::-;49396:3;49417:67;49481:2;49476:3;49417:67;:::i;:::-;49410:74;;49493:93;49582:3;49493:93;:::i;:::-;49611:2;49606:3;49602:12;49595:19;;49254:366;;;:::o;49626:419::-;49792:4;49830:2;49819:9;49815:18;49807:26;;49879:9;49873:4;49869:20;49865:1;49854:9;49850:17;49843:47;49907:131;50033:4;49907:131;:::i;:::-;49899:139;;49626:419;;;:::o;50051:237::-;50191:34;50187:1;50179:6;50175:14;50168:58;50260:20;50255:2;50247:6;50243:15;50236:45;50051:237;:::o;50294:366::-;50436:3;50457:67;50521:2;50516:3;50457:67;:::i;:::-;50450:74;;50533:93;50622:3;50533:93;:::i;:::-;50651:2;50646:3;50642:12;50635:19;;50294:366;;;:::o;50666:419::-;50832:4;50870:2;50859:9;50855:18;50847:26;;50919:9;50913:4;50909:20;50905:1;50894:9;50890:17;50883:47;50947:131;51073:4;50947:131;:::i;:::-;50939:139;;50666:419;;;:::o;51091:240::-;51231:34;51227:1;51219:6;51215:14;51208:58;51300:23;51295:2;51287:6;51283:15;51276:48;51091:240;:::o;51337:366::-;51479:3;51500:67;51564:2;51559:3;51500:67;:::i;:::-;51493:74;;51576:93;51665:3;51576:93;:::i;:::-;51694:2;51689:3;51685:12;51678:19;;51337:366;;;:::o;51709:419::-;51875:4;51913:2;51902:9;51898:18;51890:26;;51962:9;51956:4;51952:20;51948:1;51937:9;51933:17;51926:47;51990:131;52116:4;51990:131;:::i;:::-;51982:139;;51709:419;;;:::o;52134:98::-;52185:6;52219:5;52213:12;52203:22;;52134:98;;;:::o;52238:168::-;52321:11;52355:6;52350:3;52343:19;52395:4;52390:3;52386:14;52371:29;;52238:168;;;;:::o;52412:373::-;52498:3;52526:38;52558:5;52526:38;:::i;:::-;52580:70;52643:6;52638:3;52580:70;:::i;:::-;52573:77;;52659:65;52717:6;52712:3;52705:4;52698:5;52694:16;52659:65;:::i;:::-;52749:29;52771:6;52749:29;:::i;:::-;52744:3;52740:39;52733:46;;52502:283;52412:373;;;;:::o;52791:640::-;52986:4;53024:3;53013:9;53009:19;53001:27;;53038:71;53106:1;53095:9;53091:17;53082:6;53038:71;:::i;:::-;53119:72;53187:2;53176:9;53172:18;53163:6;53119:72;:::i;:::-;53201;53269:2;53258:9;53254:18;53245:6;53201:72;:::i;:::-;53320:9;53314:4;53310:20;53305:2;53294:9;53290:18;53283:48;53348:76;53419:4;53410:6;53348:76;:::i;:::-;53340:84;;52791:640;;;;;;;:::o;53437:141::-;53493:5;53524:6;53518:13;53509:22;;53540:32;53566:5;53540:32;:::i;:::-;53437:141;;;;:::o;53584:349::-;53653:6;53702:2;53690:9;53681:7;53677:23;53673:32;53670:119;;;53708:79;;:::i;:::-;53670:119;53828:1;53853:63;53908:7;53899:6;53888:9;53884:22;53853:63;:::i;:::-;53843:73;;53799:127;53584:349;;;;:::o;53939:180::-;53987:77;53984:1;53977:88;54084:4;54081:1;54074:15;54108:4;54105:1;54098:15;54125:182;54265:34;54261:1;54253:6;54249:14;54242:58;54125:182;:::o;54313:366::-;54455:3;54476:67;54540:2;54535:3;54476:67;:::i;:::-;54469:74;;54552:93;54641:3;54552:93;:::i;:::-;54670:2;54665:3;54661:12;54654:19;;54313:366;;;:::o;54685:419::-;54851:4;54889:2;54878:9;54874:18;54866:26;;54938:9;54932:4;54928:20;54924:1;54913:9;54909:17;54902:47;54966:131;55092:4;54966:131;:::i;:::-;54958:139;;54685:419;;;:::o;55110:178::-;55250:30;55246:1;55238:6;55234:14;55227:54;55110:178;:::o;55294:366::-;55436:3;55457:67;55521:2;55516:3;55457:67;:::i;:::-;55450:74;;55533:93;55622:3;55533:93;:::i;:::-;55651:2;55646:3;55642:12;55635:19;;55294:366;;;:::o;55666:419::-;55832:4;55870:2;55859:9;55855:18;55847:26;;55919:9;55913:4;55909:20;55905:1;55894:9;55890:17;55883:47;55947:131;56073:4;55947:131;:::i;:::-;55939:139;;55666:419;;;:::o

Swarm Source

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