ETH Price: $3,494.62 (+1.14%)

Token

Pocket with Love (Pocket with Love)
 

Overview

Max Total Supply

2,500 Pocket with Love

Holders

2,054

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 Pocket with Love
0xfd047bb5f223dc03f476f64a9674d6416ece3734
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
PocketWithLove

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 1000 runs

Other Settings:
paris EvmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-10-29
*/

/**
 *Submitted for verification at basescan.org on 2024-10-16
*/

pragma solidity ^0.8.20;


// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
/**
 * @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);
}

// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)
/**
 * @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);
}

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
/**
 * @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);
}

// ERC721A Contracts v3.3.0
// Creator: Chiru Labs
/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A is IERC721, IERC721Metadata {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     * 
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);
}

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)
/**
 * @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);
}

// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
/**
 * @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);
        }
    }
}

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
/**
 * @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;
    }
}

// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)
/**
 * @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);
        }
    }
}

// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)
/**
 * @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);
        }
    }
}

// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)
/**
 * @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));
    }
}

// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
/**
 * @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;
    }
}

contract ERC721A is Context, ERC165, IERC721A {
    using Address for address;
    using Strings for uint256;

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // 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;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr) if (curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        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 overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner) if(!isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 {
        _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 {
        _transfer(from, to, tokenId);
        if (to.isContract()) if(!_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

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;
    }
}

library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            unchecked {
                return hashes[totalHashes - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            unchecked {
                return hashes[totalHashes - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
/**
 * @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);
    }
}

// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
/**
 * @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);
}

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

// a16z Contracts v0.0.1 (ICantBeEvil.sol)
interface ICantBeEvil {
    function getLicenseURI() external view returns (string memory);
    function getLicenseName() external view returns (string memory);
}

enum LicenseVersion {
    PUBLIC,
    EXCLUSIVE,
    COMMERCIAL,
    COMMERCIAL_NO_HATE,
    PERSONAL,
    PERSONAL_NO_HATE
}

contract CantBeEvil is ERC165, ICantBeEvil {
    using Strings for uint;
    string internal constant _BASE_LICENSE_URI = "ar://zmc1WTspIhFyVY82bwfAIcIExLFH5lUcHHUN0wXg4W8/";
    LicenseVersion internal licenseVersion;
    constructor(LicenseVersion _licenseVersion) {
        licenseVersion = _licenseVersion;
    }

    function getLicenseURI() public view returns (string memory) {
        return string.concat(_BASE_LICENSE_URI, uint(licenseVersion).toString());
    }

    function getLicenseName() public view returns (string memory) {
        return _getLicenseVersionKeyByValue(licenseVersion);
    }

    // conflict with ERC721A
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165) returns (bool) {
        return
            interfaceId == type(ICantBeEvil).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function _getLicenseVersionKeyByValue(LicenseVersion _licenseVersion) internal pure returns (string memory) {
        require(uint8(_licenseVersion) <= 6);
        if (LicenseVersion.PUBLIC == _licenseVersion) return "PUBLIC";
        if (LicenseVersion.EXCLUSIVE == _licenseVersion) return "EXCLUSIVE";
        if (LicenseVersion.COMMERCIAL == _licenseVersion) return "COMMERCIAL";
        if (LicenseVersion.COMMERCIAL_NO_HATE == _licenseVersion) return "COMMERCIAL_NO_HATE";
        if (LicenseVersion.PERSONAL == _licenseVersion) return "PERSONAL";
        else return "PERSONAL_NO_HATE";
    }
}

interface IERC6551Registry {
    /**
     * @dev The registry MUST emit the ERC6551AccountCreated event upon successful account creation.
     */
    event ERC6551AccountCreated(
        address account,
        address indexed implementation,
        bytes32 salt,
        uint256 chainId,
        address indexed tokenContract,
        uint256 indexed tokenId
    );

    /**
     * @dev The registry MUST revert with AccountCreationFailed error if the create2 operation fails.
     */
    error AccountCreationFailed();

    /**
     * @dev Creates a token bound account for a non-fungible token.
     *
     * If account has already been created, returns the account address without calling create2.
     *
     * Emits ERC6551AccountCreated event.
     *
     * @return account The address of the token bound account
     */
    function createAccount(
        address implementation,
        bytes32 salt,
        uint256 chainId,
        address tokenContract,
        uint256 tokenId
    ) external returns (address account);

    /**
     * @dev Returns the computed token bound account address for a non-fungible token.
     *
     * @return account The address of the token bound account
     */
    function account(
        address implementation,
        bytes32 salt,
        uint256 chainId,
        address tokenContract,
        uint256 tokenId
    ) external view returns (address account);
}

interface IOperatorAccessControl {
    event RoleGranted(
        bytes32 indexed role,
        address indexed account,
        address indexed sender
    );

    event RoleRevoked(
        bytes32 indexed role,
        address indexed account,
        address indexed sender
    );

    function hasRole(
        bytes32 role,
        address account
    ) external view returns (bool);

    function isOperator(address account) external view returns (bool);

    function addOperator(address account) external;

    function revokeOperator(address account) external;
}

abstract contract OperatorAccessControl is IOperatorAccessControl, Ownable {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE");

    function hasRole(
        bytes32 role,
        address account
    ) public view override returns (bool) {
        return _roles[role].members[account];
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }

    modifier isOperatorOrOwner() {
        address _sender = _msgSender();
        require(
            isOperator(_sender) || owner() == _sender,
            "OperatorAccessControl: caller is not operator or owner"
        );
        _;
    }

    modifier onlyOperator() {
        require(
            isOperator(_msgSender()),
            "OperatorAccessControl: caller is not operator"
        );
        _;
    }

    function isOperator(address account) public view override returns (bool) {
        return hasRole(OPERATOR_ROLE, account);
    }

    function _addOperator(address account) internal virtual {
        _grantRole(OPERATOR_ROLE, account);
    }

    function addOperator(address account) public override onlyOperator {
        _grantRole(OPERATOR_ROLE, account);
    }

    function revokeOperator(address account) public override onlyOperator {
        _revokeRole(OPERATOR_ROLE, account);
    }
}

interface IAccountProxy {
    function initialize(address implementation) external;
}

contract PocketWithLove is
    ERC721A,
    OperatorAccessControl,
    ReentrancyGuard,
    CantBeEvil
{
    bytes32 public _kycMintMerkleRoot;
    bytes32 public _preMintMerkleRoot;

    mapping(uint256 => uint256) private stakeStarted;

    mapping(uint256 => uint256) private stakeTotal;

    mapping(address => uint256) private addressMintCount;

    uint256 private _kycMintLimit = 0;

    uint256 private _preMintLimit = 0;

    uint256 private _publicMintLimit = 0;

    uint256 private _superMintLimit = 0;

    uint256 private _addressMintLimit = 0;

    uint256 private _kycMintCount;

    uint256 private _preMintCount;

    uint256 private _publicMintCount;

    uint256 private _superMintCount;

    uint256 private _kycMintPrice = 0;

    uint256 private _preMintPrice = 0;

    uint256 private _publicMintPrice = 0;

    bool private _kycMintOpen = false;

    bool private _preMintOpen = false;

    bool private _publicMintOpen = false;

    bool private _superMintOpen = false;

    uint256 _totalSupply = 2500;

    uint256 _totalTokens;

    bool private _transferOpen = false;

    string private _nftName = "Pocket with Love";
    string private _baseUri =
        "https://s3.ap-southeast-1.amazonaws.com/traditionow-assets/traditionow-assets/PocketWithLove";

    address erc6551RegistryAddress;
    address erc6551AccountProxyAddress;
    address erc6551ImplementationAddress;
    uint256 erc6551ChainId;

    constructor()
        ERC721A(_nftName, _nftName)
        Ownable()
        CantBeEvil(LicenseVersion.PUBLIC)
    {
        _addOperator(_msgSender());
    }

    function setERC6551Config(
        address _erc6551RegistryAddress,
        address _erc6551AccountProxyAddress,
        address _erc6551ImplementationAddress,
        uint256 chainID
    ) public onlyOperator {
        erc6551RegistryAddress = _erc6551RegistryAddress;
        erc6551AccountProxyAddress = _erc6551AccountProxyAddress;
        erc6551ImplementationAddress = _erc6551ImplementationAddress;
        erc6551ChainId = chainID;
    }

    function createTBA(uint256 tokenId) public returns (address) {
        require(
            _ownershipOf(tokenId).addr == _msgSender(),
            "error:10005 Not owner"
        );
        address tba = IERC6551Registry(erc6551RegistryAddress).createAccount(
            erc6551AccountProxyAddress,
            0,
            erc6551ChainId,
            address(this),
            tokenId
        );
        IAccountProxy(tba).initialize(erc6551ImplementationAddress);
        return tba;
    }

    function getMintCount()
        public
        view
        returns (
            uint256 kycMintCount,
            uint256 preMintCount,
            uint256 publicMintCount,
            uint256 superMintCount
        )
    {
        kycMintCount = _kycMintCount;
        preMintCount = _preMintCount;
        publicMintCount = _publicMintCount;
        superMintCount = _superMintCount;
    }

    function setMerkleRoot(
        bytes32 kycMintMerkleRoot,
        bytes32 preMintMerkleRoot
    ) public onlyOperator {
        _kycMintMerkleRoot = kycMintMerkleRoot;
        _preMintMerkleRoot = preMintMerkleRoot;
    }

    function isWhitelist(
        bytes32[] calldata kycMerkleProof,
        bytes32[] calldata preMerkleProof
    ) public view returns (bool isKycWhitelist, bool isPreWhitelist) {
        isKycWhitelist = MerkleProof.verify(
            kycMerkleProof,
            _kycMintMerkleRoot,
            keccak256(abi.encodePacked(msg.sender))
        );

        isPreWhitelist = MerkleProof.verify(
            preMerkleProof,
            _preMintMerkleRoot,
            keccak256(abi.encodePacked(msg.sender))
        );
    }

    function setMintLimit(
        uint256 kycMintLimit,
        uint256 preMintLimit,
        uint256 publicMintLimit,
        uint256 addressMintLimit,
        uint256 superMintLimit
    ) public onlyOperator {
        _kycMintLimit = kycMintLimit;
        _preMintLimit = preMintLimit;
        _publicMintLimit = publicMintLimit;
        _addressMintLimit = addressMintLimit;
        _superMintLimit = superMintLimit;
    }

    function getMintLimit()
        public
        view
        returns (
            uint256 kycMintLimit,
            uint256 preMintLimit,
            uint256 publicMintLimit,
            uint256 addressMintLimit,
            uint256 superMintLimit
        )
    {
        kycMintLimit = _kycMintLimit;
        preMintLimit = _preMintLimit;
        publicMintLimit = _publicMintLimit;
        addressMintLimit = _addressMintLimit;
        superMintLimit = _superMintLimit;
    }

    function setMintPrice(
        uint256 kycMintPrice,
        uint256 preMintPrice,
        uint256 publicMintPrice
    ) public onlyOperator {
        _kycMintPrice = kycMintPrice;
        _preMintPrice = preMintPrice;
        _publicMintPrice = publicMintPrice;
    }

    function getMintPrice()
        public
        view
        returns (
            uint256 kycMintPrice,
            uint256 preMintPrice,
            uint256 publicMintPrice
        )
    {
        kycMintPrice = _kycMintPrice;
        preMintPrice = _preMintPrice;
        publicMintPrice = _publicMintPrice;
    }

    function setSwith(
        bool kycMintOpen,
        bool preMintOpen,
        bool publicMintOpen,
        bool transferOpen,
        bool superMintOpen
    ) public onlyOperator {
        _kycMintOpen = kycMintOpen;
        _preMintOpen = preMintOpen;
        _publicMintOpen = publicMintOpen;
        _transferOpen = transferOpen;
        _superMintOpen = superMintOpen;
    }

    function getSwith()
        public
        view
        returns (
            bool kycMintOpen,
            bool preMintOpen,
            bool publicMintOpen,
            bool transferOpen,
            bool superMintOpen
        )
    {
        kycMintOpen = _kycMintOpen;
        preMintOpen = _preMintOpen;
        publicMintOpen = _publicMintOpen;
        transferOpen = _transferOpen;
        superMintOpen = _superMintOpen;
    }

    function _handleMint(address to) internal {
        require(
            addressMintCount[to] < _addressMintLimit,
            "error:10003 already claimed"
        );
        require(
            _totalTokens < _totalSupply,
            "error:10010 Exceeding the total amount"
        );

        _safeMint(to, 1);

        addressMintCount[to] = addressMintCount[to] + 1;

        _totalTokens = _totalTokens + 1;
    }

    function kycMint(
        bytes32[] calldata merkleProof,
        uint256 count
    ) public payable nonReentrant {
        require(count >= 1, "error:10010 Must be greater than 1");

        require(
            msg.value == _kycMintPrice * count,
            "error:10000 msg.value is incorrect"
        );

        require(_kycMintOpen, "error:10001 switch off");

        require(
            MerkleProof.verify(
                merkleProof,
                _kycMintMerkleRoot,
                keccak256(abi.encodePacked(msg.sender))
            ),
            "error:10002 not in the whitelist"
        );

        for (uint256 i = 0; i < count; i++) {
            require(
                _kycMintCount < _kycMintLimit,
                "error:10004 Reach the limit"
            );

            _handleMint(_msgSender());

            _kycMintCount = _kycMintCount + 1;
        }
    }

    function preMint(
        bytes32[] calldata merkleProof,
        uint256 count
    ) public payable nonReentrant {
        require(count >= 1, "error:10010 Must be greater than 1");

        require(
            msg.value == _preMintPrice * count,
            "error:10000 msg.value is incorrect"
        );

        require(_preMintOpen, "error:10001 switch off");

        require(
            MerkleProof.verify(
                merkleProof,
                _preMintMerkleRoot,
                keccak256(abi.encodePacked(msg.sender))
            ),
            "error:10002 not in the whitelist"
        );

        for (uint256 i = 0; i < count; i++) {
            require(
                _preMintCount < _preMintLimit,
                "error:10004 Reach the limit"
            );

            _handleMint(_msgSender());

            _preMintCount = _preMintCount + 1;
        }
    }

    function publicMint(uint256 count) public payable nonReentrant {
        require(count >= 1, "error:10010 Must be greater than 1");

        require(
            msg.value == _publicMintPrice * count,
            "error:10000 msg.value is incorrect"
        );

        require(_publicMintOpen, "error:10001 switch off");

        for (uint256 i = 0; i < count; i++) {
            require(
                _publicMintCount < _publicMintLimit,
                "error:10004 Reach the limit"
            );

            _handleMint(_msgSender());

            _publicMintCount = _publicMintCount + 1;
        }
    }

    function operatorMint(
        address[] memory toAddresses,
        uint256[] memory amounts
    ) public onlyOperator {
        require(
            toAddresses.length == amounts.length,
            "error:10033 toAddresses length does not match amounts length"
        );

        uint256 _len = toAddresses.length;
        for (uint256 _i; _i < _len; _i++) {
            address to = toAddresses[_i];
            uint256 amount = amounts[_i];

            for (uint256 j = 0; j < amount; j++) {
                require(
                    _totalTokens < _totalSupply,
                    "error:10010 Exceeding the total amount"
                );

                _safeMint(to, 1);

                _totalTokens = _totalTokens + 1;
            }
        }
    }

    function getCanMintCount(address user) external view returns (uint256) {
        return _addressMintLimit - addressMintCount[user];
    }

    function stakePeriod(
        uint256 tokenId
    ) external view returns (bool isStake, uint256 current, uint256 total) {
        uint256 start = stakeStarted[tokenId];
        if (start != 0) {
            isStake = true;
            current = block.timestamp - start;
        }
        total = current + stakeTotal[tokenId];
    }

    function getStakeTime(uint256 tokenId) public view returns (uint256) {
        return stakeStarted[tokenId];
    }

    bool public stakeOpen = false;

    function setStakeOpen(bool open) external onlyOperator {
        stakeOpen = open;
    }

    event Staked(uint256 indexed tokenId, uint256 indexed time);

    event UnStaked(uint256 indexed tokenId, uint256 indexed time);

    function stake(uint256[] calldata tokenIds) external {
        require(stakeOpen, "error:10006 stake closed");

        uint256 n = tokenIds.length;
        for (uint256 i = 0; i < n; ++i) {
            uint256 tokenId = tokenIds[i];
            require(
                _ownershipOf(tokenId).addr == _msgSender(),
                "error:10005 Not owner"
            );

            uint256 start = stakeStarted[tokenId];
            if (start == 0) {
                stakeStarted[tokenId] = block.timestamp;
                emit Staked(tokenId, block.timestamp);
            }
        }
    }

    function unStake(uint256[] calldata tokenIds) external {
        uint256 n = tokenIds.length;
        for (uint256 i = 0; i < n; ++i) {
            uint256 tokenId = tokenIds[i];
            require(
                _ownershipOf(tokenId).addr == _msgSender(),
                "error:10005 Not owner"
            );

            uint256 start = stakeStarted[tokenId];
            if (start > 0) {
                stakeTotal[tokenId] += block.timestamp - start;
                stakeStarted[tokenId] = 0;
                emit UnStaked(tokenId, block.timestamp);
            }
        }
    }

    function operatorUnStake(
        uint256[] calldata tokenIds
    ) external onlyOperator {
        uint256 n = tokenIds.length;
        for (uint256 i = 0; i < n; ++i) {
            uint256 tokenId = tokenIds[i];
            uint256 start = stakeStarted[tokenId];
            if (start > 0) {
                stakeTotal[tokenId] += block.timestamp - start;
                stakeStarted[tokenId] = 0;
                emit UnStaked(tokenId, block.timestamp);
            }
        }
    }

    uint256 private stakeTransfer = 1;

    function safeTransferWhileStake(
        address from,
        address to,
        uint256 tokenId
    ) external {
        require(ownerOf(tokenId) == _msgSender(), "error:10005 Not owner");
        stakeTransfer = 2;
        safeTransferFrom(from, to, tokenId);
        stakeTransfer = 1;
    }

    function _beforeTokenTransfers(
        address,
        address,
        uint256 startTokenId,
        uint256 quantity
    ) internal view override {
        uint256 tokenId = startTokenId;
        for (uint256 end = tokenId + quantity; tokenId < end; ++tokenId) {
            require(
                stakeStarted[tokenId] == 0 ||
                    stakeTransfer == 2 ||
                    _transferOpen,
                "error:10007 Stake can't transfer"
            );
        }
    }

    function setBaseUri(string memory baseUri) public onlyOperator {
        _baseUri = baseUri;
    }

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

    function supply() public view returns (uint256) {
        return _totalSupply;
    }

    function totalMinted() public view returns (uint256) {
        return _totalTokens;
    }

    function withdraw(
        address[] memory tokens,
        address _to
    ) public onlyOperator {
        for (uint8 i; i < tokens.length; i++) {
            IERC20 token = IERC20(tokens[i]);
            uint256 b = token.balanceOf(address(this));
            if (b > 0) {
                token.transfer(_to, b);
            }
        }
        uint256 balance = address(this).balance;
        payable(_to).transfer(balance);
    }

    function toString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

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

    uint256 private _superMintPrice = 0;

    function setSuperMintPrice(uint256 superMintPrice) public onlyOperator {
        _superMintPrice = superMintPrice;
    }

    function getSuperMintPrice() public view returns (uint256) {
        return _superMintPrice;
    }

    mapping(address => uint256) private superAddress;

    function setSuperAddress(
        address contractAddress,
        uint256 count
    ) public onlyOperator {
        superAddress[contractAddress] = count;
    }

    function getSuperAddress(
        address contractAddress
    ) public view returns (uint256) {
        return superAddress[contractAddress];
    }

    function getTokenCanMintCount(
        address contractAddress,
        uint256 tokenId
    ) public view returns (uint256) {
        if (superAddress[contractAddress] == 0) {
            return 0;
        }
        return
            superAddress[contractAddress] -
            superAddressToken[contractAddress][tokenId];
    }

    function superMint(
        address[] memory contracts,
        uint256[] memory tokenIds,
        uint256[] memory counts
    ) public payable nonReentrant {
        require(
            contracts.length == tokenIds.length,
            "error: 10000 contracts length does not match tokenIds length"
        );

        require(
            tokenIds.length == counts.length,
            "error: 10001 tokenIds length does not match counts length"
        );

        require(_superMintOpen, "error:10002 switch off");

        uint256 totalMintCount = 0;
        for (uint256 i = 0; i < tokenIds.length; i++) {
            totalMintCount = totalMintCount + counts[i];
        }

        require(totalMintCount < 30, "error: 10003 Limit 30");

        require(
            msg.value == _superMintPrice * totalMintCount,
            "error:10004 msg.value is incorrect"
        );

        for (uint256 i = 0; i < tokenIds.length; i++) {
            address contractAddress = contracts[i];
            uint256 tokenId = tokenIds[i];
            uint256 mintCount = counts[i];

            require(
                IERC721(contractAddress).ownerOf(tokenId) == msg.sender,
                "error:10005 No owner"
            );

            require(
                superAddress[contractAddress] > 0,
                "error:10006 Contract cannot mint"
            );

            require(
                superAddressToken[contractAddress][tokenId] + mintCount <=
                    superAddress[contractAddress],
                "error:10007 Greater than maximum quantity"
            );

            require(
                _totalTokens + mintCount <= _totalSupply,
                "error:10008 Exceeding the total amount"
            );

            require(
                _superMintCount + mintCount <= _superMintLimit,
                "error:10009 Reach the limit"
            );

            for (uint256 j = 0; j < mintCount; j++) {
                _safeMint(msg.sender, 1);
            }

            _superMintCount = _superMintCount + mintCount;

            _totalTokens = _totalTokens + mintCount;

            superAddressToken[contractAddress][tokenId] =
                superAddressToken[contractAddress][tokenId] +
                mintCount;
        }
    }

    function supportsInterface(
        bytes4 interfaceId
    ) public view virtual override(CantBeEvil, ERC721A) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    function batchTransfer(
        address to,
        uint256[] memory tokenIds
    ) public virtual {
        for (uint256 i = 0; i < tokenIds.length; i++) {
            uint256 tokenId = tokenIds[i];
            transferFrom(msg.sender, to, tokenId);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"time","type":"uint256"}],"name":"Staked","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"time","type":"uint256"}],"name":"UnStaked","type":"event"},{"inputs":[],"name":"OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_kycMintMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_preMintMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addOperator","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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"createTBA","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getCanMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLicenseName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLicenseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintCount","outputs":[{"internalType":"uint256","name":"kycMintCount","type":"uint256"},{"internalType":"uint256","name":"preMintCount","type":"uint256"},{"internalType":"uint256","name":"publicMintCount","type":"uint256"},{"internalType":"uint256","name":"superMintCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintLimit","outputs":[{"internalType":"uint256","name":"kycMintLimit","type":"uint256"},{"internalType":"uint256","name":"preMintLimit","type":"uint256"},{"internalType":"uint256","name":"publicMintLimit","type":"uint256"},{"internalType":"uint256","name":"addressMintLimit","type":"uint256"},{"internalType":"uint256","name":"superMintLimit","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintPrice","outputs":[{"internalType":"uint256","name":"kycMintPrice","type":"uint256"},{"internalType":"uint256","name":"preMintPrice","type":"uint256"},{"internalType":"uint256","name":"publicMintPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getStakeTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"getSuperAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSuperMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSwith","outputs":[{"internalType":"bool","name":"kycMintOpen","type":"bool"},{"internalType":"bool","name":"preMintOpen","type":"bool"},{"internalType":"bool","name":"publicMintOpen","type":"bool"},{"internalType":"bool","name":"transferOpen","type":"bool"},{"internalType":"bool","name":"superMintOpen","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenCanMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"kycMerkleProof","type":"bytes32[]"},{"internalType":"bytes32[]","name":"preMerkleProof","type":"bytes32[]"}],"name":"isWhitelist","outputs":[{"internalType":"bool","name":"isKycWhitelist","type":"bool"},{"internalType":"bool","name":"isPreWhitelist","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"kycMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"toAddresses","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"operatorMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"operatorUnStake","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":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"preMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"revokeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferWhileStake","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":"baseUri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_erc6551RegistryAddress","type":"address"},{"internalType":"address","name":"_erc6551AccountProxyAddress","type":"address"},{"internalType":"address","name":"_erc6551ImplementationAddress","type":"address"},{"internalType":"uint256","name":"chainID","type":"uint256"}],"name":"setERC6551Config","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"kycMintMerkleRoot","type":"bytes32"},{"internalType":"bytes32","name":"preMintMerkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"kycMintLimit","type":"uint256"},{"internalType":"uint256","name":"preMintLimit","type":"uint256"},{"internalType":"uint256","name":"publicMintLimit","type":"uint256"},{"internalType":"uint256","name":"addressMintLimit","type":"uint256"},{"internalType":"uint256","name":"superMintLimit","type":"uint256"}],"name":"setMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"kycMintPrice","type":"uint256"},{"internalType":"uint256","name":"preMintPrice","type":"uint256"},{"internalType":"uint256","name":"publicMintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"open","type":"bool"}],"name":"setStakeOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setSuperAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"superMintPrice","type":"uint256"}],"name":"setSuperMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"kycMintOpen","type":"bool"},{"internalType":"bool","name":"preMintOpen","type":"bool"},{"internalType":"bool","name":"publicMintOpen","type":"bool"},{"internalType":"bool","name":"transferOpen","type":"bool"},{"internalType":"bool","name":"superMintOpen","type":"bool"}],"name":"setSwith","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"stakePeriod","outputs":[{"internalType":"bool","name":"isStake","type":"bool"},{"internalType":"uint256","name":"current","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"counts","type":"uint256[]"}],"name":"superMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"address","name":"_to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600060118190556012819055601381905560148190556015819055601a819055601b819055601c55601d805463ffffffff191690556109c4601e556020805460ff1916905560c0604052601060809081526f506f636b65742077697468204c6f766560801b60a05260219062000076908262000429565b506040518060800160405280605c815260200162005183605c9139602290620000a0908262000429565b506027805460ff1916905560016028556000602a55348015620000c257600080fd5b50600060218054620000d4906200039a565b80601f016020809104026020016040519081016040528092919081815260200182805462000102906200039a565b8015620001535780601f10620001275761010080835404028352916020019162000153565b820191906000526020600020905b8154815290600101906020018083116200013557829003601f168201915b50505050506021805462000167906200039a565b80601f016020809104026020016040519081016040528092919081815260200182805462000195906200039a565b8015620001e65780601f10620001ba57610100808354040283529160200191620001e6565b820191906000526020600020905b815481529060010190602001808311620001c857829003601f168201915b50505050508160029081620001fc919062000429565b5060036200020b828262000429565b505060008055506200021d336200025e565b6001600a819055600b8054839260ff1990911690836005811115620002465762000246620004f5565b021790555062000258905033620002b0565b6200050b565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620002dc7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92982620002df565b50565b60008281526009602090815260408083206001600160a01b038516845290915290205460ff16620003805760008281526009602090815260408083206001600160a01b03851684529091529020805460ff191660011790556200033f3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620003af57607f821691505b602082108103620003d057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200042457600081815260208120601f850160051c81016020861015620003ff5750805b601f850160051c820191505b8181101562000420578281556001016200040b565b5050505b505050565b81516001600160401b0381111562000445576200044562000384565b6200045d816200045684546200039a565b84620003d6565b602080601f8311600181146200049557600084156200047c5750858301515b600019600386901b1c1916600185901b17855562000420565b600085815260208120601f198616915b82811015620004c657888601518255948401946001909101908401620004a5565b5085821015620004e55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052602160045260246000fd5b614c68806200051b6000396000f3fe6080604052600436106103a25760003560e01c80638da5cb5b116101e7578063b4e78ea41161010d578063db6f2906116100a0578063f01288521161006f578063f012885214610ba3578063f2fde38b14610bb6578063f5b541a614610bd6578063fad8b32a14610c0a57600080fd5b8063db6f290614610b05578063e0e6389314610b25578063e985e9c514610b3a578063eeb86e7814610b8357600080fd5b8063c3e30196116100dc578063c3e3019614610a9d578063c7db289314610ab0578063c87b56dd14610ac5578063cf2bde3b14610ae557600080fd5b8063b4e78ea414610a06578063b824c19d14610a20578063b8323fc214610a40578063b88d4fde14610a7d57600080fd5b8063a22cb46511610185578063a89370e711610154578063a89370e714610942578063ab2cb8e9146109a6578063ac3c9952146109c6578063b10dcc93146109e657600080fd5b8063a22cb465146108c7578063a2309ff8146108e7578063a341793b146108fc578063a7f93ebd1461091157600080fd5b806395d89b41116101c157806395d89b41146108525780639870d7fe146108675780639ead7a1914610887578063a0bcfc7f146108a757600080fd5b80638da5cb5b146107b55780638fc3b549146107d357806391d148541461080c57600080fd5b80632db11544116102cc5780636352211e1161026a578063715018a611610239578063715018a61461071c57806375edcbe01461073157806381c8d149146107515780638ceb45a91461077e57600080fd5b80636352211e146106865780636d70f7ae146106a65780636dc25b93146106c657806370a08231146106fc57600080fd5b80634ad7b025116102a65780634ad7b025146105e25780634b3ed3721461060257806356bda4a2146106225780636102664a1461066657600080fd5b80632db115441461058f578063319948ba146105a257806342842e0e146105c257600080fd5b8063157620ab116103445780631d39191d116103135780631d39191d1461051957806323b872dd146105395780632a7ce051146105595780632bd19b771461056f57600080fd5b8063157620ab146104b75780631649698b146104d757806316504c0a146104ea57806318160ddd1461050057600080fd5b8063081812fc11610380578063081812fc1461041d578063095ea7b3146104555780630af2b562146104775780630fbf0a931461049757600080fd5b806301ffc9a7146103a7578063047fc9aa146103dc57806306fdde03146103fb575b600080fd5b3480156103b357600080fd5b506103c76103c2366004613fa3565b610c2a565b60405190151581526020015b60405180910390f35b3480156103e857600080fd5b50601e545b6040519081526020016103d3565b34801561040757600080fd5b50610410610c3b565b6040516103d39190614010565b34801561042957600080fd5b5061043d610438366004614023565b610ccd565b6040516001600160a01b0390911681526020016103d3565b34801561046157600080fd5b50610475610470366004614051565b610d2a565b005b34801561048357600080fd5b506103ed610492366004614051565b610de2565b3480156104a357600080fd5b506104756104b23660046140c9565b610e49565b3480156104c357600080fd5b506104756104d23660046141ea565b610fa0565b6104756104e536600461423c565b611195565b3480156104f657600080fd5b506103ed600c5481565b34801561050c57600080fd5b50600154600054036103ed565b34801561052557600080fd5b50610475610534366004614288565b611409565b34801561054557600080fd5b506104756105543660046142c3565b611479565b34801561056557600080fd5b506103ed600d5481565b34801561057b57600080fd5b5061047561058a366004614304565b611484565b61047561059d366004614023565b61152c565b3480156105ae57600080fd5b506104756105bd366004614355565b6116e7565b3480156105ce57600080fd5b506104756105dd3660046142c3565b61174e565b3480156105ee57600080fd5b506104756105fd366004614051565b611769565b34801561060e57600080fd5b5061047561061d3660046140c9565b6117de565b34801561062e57600080fd5b50601154601254601354601554601454604080519586526020860194909452928401919091526060830152608082015260a0016103d3565b34801561067257600080fd5b5061047561068136600461438f565b6118f7565b34801561069257600080fd5b5061043d6106a1366004614023565b6119b5565b3480156106b257600080fd5b506103c76106c1366004614400565b6119c7565b3480156106d257600080fd5b506103ed6106e1366004614400565b6001600160a01b03166000908152602b602052604090205490565b34801561070857600080fd5b506103ed610717366004614400565b611a07565b34801561072857600080fd5b50610475611a6f565b34801561073d57600080fd5b5061047561074c36600461441d565b611a83565b34801561075d57600080fd5b506103ed61076c366004614023565b6000908152600e602052604090205490565b34801561078a57600080fd5b5061079e61079936600461443f565b611ae7565b6040805192151583529015156020830152016103d3565b3480156107c157600080fd5b506008546001600160a01b031661043d565b3480156107df57600080fd5b506016546017546018546019546040805194855260208501939093529183015260608201526080016103d3565b34801561081857600080fd5b506103c76108273660046144ab565b60009182526009602090815260408084206001600160a01b0393909316845291905290205460ff1690565b34801561085e57600080fd5b50610410611bb5565b34801561087357600080fd5b50610475610882366004614400565b611bc4565b34801561089357600080fd5b506104756108a23660046142c3565b611c47565b3480156108b357600080fd5b506104756108c2366004614528565b611cb9565b3480156108d357600080fd5b506104756108e2366004614571565b611d22565b3480156108f357600080fd5b50601f546103ed565b34801561090857600080fd5b50610410611dd0565b34801561091d57600080fd5b50601a54601b54601c54604080519384526020840192909252908201526060016103d3565b34801561094e57600080fd5b50601d54602080546040805160ff80861615158252610100860481161515948201949094526201000085048416151591810191909152908216151560608201526301000000909204161515608082015260a0016103d3565b3480156109b257600080fd5b5061043d6109c1366004614023565b611de7565b3480156109d257600080fd5b506104756109e13660046145fa565b611f70565b3480156109f257600080fd5b50610475610a013660046140c9565b611fb8565b348015610a1257600080fd5b506027546103c79060ff1681565b348015610a2c57600080fd5b50610475610a3b366004614023565b6120da565b348015610a4c57600080fd5b50610a60610a5b366004614023565b612138565b6040805193151584526020840192909252908201526060016103d3565b348015610a8957600080fd5b50610475610a9836600461464a565b612184565b610475610aab36600461423c565b6121c8565b348015610abc57600080fd5b5061041061241f565b348015610ad157600080fd5b50610410610ae0366004614023565b61247f565b348015610af157600080fd5b50610475610b003660046146ca565b6124b3565b348015610b1157600080fd5b50610475610b20366004614724565b61267d565b348015610b3157600080fd5b50602a546103ed565b348015610b4657600080fd5b506103c7610b55366004614741565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610b8f57600080fd5b506103ed610b9e366004614400565b6126e9565b610475610bb136600461476f565b61270f565b348015610bc257600080fd5b50610475610bd1366004614400565b612d32565b348015610be257600080fd5b506103ed7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b348015610c1657600080fd5b50610475610c25366004614400565b612dbf565b6000610c3582612e42565b92915050565b606060028054610c4a906147f7565b80601f0160208091040260200160405190810160405280929190818152602001828054610c76906147f7565b8015610cc35780601f10610c9857610100808354040283529160200191610cc3565b820191906000526020600020905b815481529060010190602001808311610ca657829003601f168201915b5050505050905090565b6000610cd882612e80565b610d0e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610d35826119b5565b9050806001600160a01b0316836001600160a01b031603610d82576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03821614610dd257610d9c8133610b55565b610dd2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ddd838383612eab565b505050565b6001600160a01b0382166000908152602b60205260408120548103610e0957506000610c35565b6001600160a01b0383166000818152602960209081526040808320868452825280832054938352602b909152902054610e429190614847565b9392505050565b60275460ff16610ea05760405162461bcd60e51b815260206004820152601860248201527f6572726f723a3130303036207374616b6520636c6f736564000000000000000060448201526064015b60405180910390fd5b8060005b81811015610f9a576000848483818110610ec057610ec061485a565b905060200201359050610ed03390565b6001600160a01b0316610ee282612f14565b516001600160a01b031614610f315760405162461bcd60e51b815260206004820152601560248201527432b93937b91d189818181a902737ba1037bbb732b960591b6044820152606401610e97565b6000818152600e602052604081205490819003610f87576000828152600e602052604080822042908190559051909184917f925435fa7e37e5d9555bb18ce0d62bb9627d0846942e58e5291e9a2dded462ed9190a35b505080610f9390614870565b9050610ea4565b50505050565b610fa9336119c7565b610ff95760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b60005b82518160ff16101561115c576000838260ff168151811061101f5761101f61485a565b60209081029190910101516040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa15801561108d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b19190614889565b90508015611147576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301526024820183905283169063a9059cbb906044016020604051808303816000875af1158015611121573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114591906148a2565b505b50508080611154906148bf565b915050610ffc565b5060405147906001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610f9a573d6000803e3d6000fd5b61119d613049565b60018110156111f95760405162461bcd60e51b815260206004820152602260248201527f6572726f723a3130303130204d7573742062652067726561746572207468616e604482015261203160f01b6064820152608401610e97565b80601a5461120791906148de565b34146112605760405162461bcd60e51b815260206004820152602260248201527f6572726f723a3130303030206d73672e76616c756520697320696e636f72726560448201526118dd60f21b6064820152608401610e97565b601d5460ff166112b25760405162461bcd60e51b815260206004820152601660248201527f6572726f723a313030303120737769746368206f6666000000000000000000006044820152606401610e97565b61132883838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c546040516bffffffffffffffffffffffff193360601b16602082015290925060340190505b604051602081830303815290604052805190602001206130a2565b6113745760405162461bcd60e51b815260206004820181905260248201527f6572726f723a3130303032206e6f7420696e207468652077686974656c6973746044820152606401610e97565b60005b818110156113fe57601154601654106113d25760405162461bcd60e51b815260206004820152601b60248201527f6572726f723a313030303420526561636820746865206c696d697400000000006044820152606401610e97565b6113db336130b8565b6016546113e99060016148f5565b601655806113f681614870565b915050611377565b50610ddd6001600a55565b611412336119c7565b6114625760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b601194909455601292909255601355601555601455565b610ddd8383836131df565b61148d336119c7565b6114dd5760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b6023805473ffffffffffffffffffffffffffffffffffffffff199081166001600160a01b0396871617909155602480548216948616949094179093556025805490931691909316179055602655565b611534613049565b60018110156115905760405162461bcd60e51b815260206004820152602260248201527f6572726f723a3130303130204d7573742062652067726561746572207468616e604482015261203160f01b6064820152608401610e97565b80601c5461159e91906148de565b34146115f75760405162461bcd60e51b815260206004820152602260248201527f6572726f723a3130303030206d73672e76616c756520697320696e636f72726560448201526118dd60f21b6064820152608401610e97565b601d5462010000900460ff1661164f5760405162461bcd60e51b815260206004820152601660248201527f6572726f723a313030303120737769746368206f6666000000000000000000006044820152606401610e97565b60005b818110156116d957601354601854106116ad5760405162461bcd60e51b815260206004820152601b60248201527f6572726f723a313030303420526561636820746865206c696d697400000000006044820152606401610e97565b6116b6336130b8565b6018546116c49060016148f5565b601855806116d181614870565b915050611652565b506116e46001600a55565b50565b6116f0336119c7565b6117405760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b601a92909255601b55601c55565b610ddd83838360405180602001604052806000815250612184565b611772336119c7565b6117c25760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b6001600160a01b039091166000908152602b6020526040902055565b6117e7336119c7565b6118375760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b8060005b81811015610f9a5760008484838181106118575761185761485a565b602090810292909201356000818152600e9093526040909220549192505080156118e4576118858142614847565b6000838152600f6020526040812080549091906118a39084906148f5565b90915550506000828152600e602052604080822082905551429184917f69f6d6e6926b6914c628cca5ab19879a4099facaba2b44626e07d8e38ebd189b9190a35b5050806118f090614870565b905061183b565b611900336119c7565b6119505760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b601d80546020805460ff19169415159490941790935561ffff1990921694151561ff00191694909417610100931515939093029290921763ffff00001916620100009115159190910263ff000000191617630100000092151592909202919091179055565b60006119c082612f14565b5192915050565b6001600160a01b03811660009081527f84e70a45dc3cad9f831e8a7d9f4327701c9df1c790bfeaa7b6cb95e200be6733602052604081205460ff16610c35565b60006001600160a01b038216611a49576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b611a77613427565b611a816000613481565b565b611a8c336119c7565b611adc5760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b600c91909155600d55565b600080611b4986868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c546040516bffffffffffffffffffffffff193360601b166020820152909250603401905061130d565b9150611baa84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600d546040516bffffffffffffffffffffffff193360601b166020820152909250603401905061130d565b905094509492505050565b606060038054610c4a906147f7565b611bcd336119c7565b611c1d5760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b6116e47f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929826134e0565b33611c51826119b5565b6001600160a01b031614611c9f5760405162461bcd60e51b815260206004820152601560248201527432b93937b91d189818181a902737ba1037bbb732b960591b6044820152606401610e97565b6002602855611caf83838361174e565b5050600160285550565b611cc2336119c7565b611d125760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b6022611d1e828261494e565b5050565b336001600160a01b03831603611d64576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600b54606090611de29060ff16613582565b905090565b600033611df383612f14565b516001600160a01b031614611e425760405162461bcd60e51b815260206004820152601560248201527432b93937b91d189818181a902737ba1037bbb732b960591b6044820152606401610e97565b602354602480546026546040517f8a54c52f0000000000000000000000000000000000000000000000000000000081526001600160a01b039283166004820152600093810184905260448101919091523060648201526084810186905291921690638a54c52f9060a4016020604051808303816000875af1158015611ecb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eef9190614a0e565b6025546040517fc4d66de80000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015291925082169063c4d66de890602401600060405180830381600087803b158015611f5157600080fd5b505af1158015611f65573d6000803e3d6000fd5b509295945050505050565b60005b8151811015610ddd576000828281518110611f9057611f9061485a565b60200260200101519050611fa5338583611479565b5080611fb081614870565b915050611f73565b8060005b81811015610f9a576000848483818110611fd857611fd861485a565b905060200201359050611fe83390565b6001600160a01b0316611ffa82612f14565b516001600160a01b0316146120495760405162461bcd60e51b815260206004820152601560248201527432b93937b91d189818181a902737ba1037bbb732b960591b6044820152606401610e97565b6000818152600e602052604090205480156120c7576120688142614847565b6000838152600f6020526040812080549091906120869084906148f5565b90915550506000828152600e602052604080822082905551429184917f69f6d6e6926b6914c628cca5ab19879a4099facaba2b44626e07d8e38ebd189b9190a35b5050806120d390614870565b9050611fbc565b6120e3336119c7565b6121335760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b602a55565b6000818152600e6020526040812054819081908015612162576001935061215f8142614847565b92505b6000858152600f602052604090205461217b90846148f5565b93959294505050565b61218f8484846131df565b6001600160a01b0383163b15610f9a576121ab84848484613779565b610f9a576040516368d2bf6b60e11b815260040160405180910390fd5b6121d0613049565b600181101561222c5760405162461bcd60e51b815260206004820152602260248201527f6572726f723a3130303130204d7573742062652067726561746572207468616e604482015261203160f01b6064820152608401610e97565b80601b5461223a91906148de565b34146122935760405162461bcd60e51b815260206004820152602260248201527f6572726f723a3130303030206d73672e76616c756520697320696e636f72726560448201526118dd60f21b6064820152608401610e97565b601d54610100900460ff166122ea5760405162461bcd60e51b815260206004820152601660248201527f6572726f723a313030303120737769746368206f6666000000000000000000006044820152606401610e97565b61234983838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600d546040516bffffffffffffffffffffffff193360601b166020820152909250603401905061130d565b6123955760405162461bcd60e51b815260206004820181905260248201527f6572726f723a3130303032206e6f7420696e207468652077686974656c6973746044820152606401610e97565b60005b818110156113fe57601254601754106123f35760405162461bcd60e51b815260206004820152601b60248201527f6572726f723a313030303420526561636820746865206c696d697400000000006044820152606401610e97565b6123fc336130b8565b60175461240a9060016148f5565b6017558061241781614870565b915050612398565b6060604051806060016040528060318152602001614be260319139600b5461245a9060ff16600581111561245557612455614a2b565b613865565b60405160200161246b929190614a41565b604051602081830303815290604052905090565b6060602261248c83613905565b60405160200161249d929190614a70565b6040516020818303038152906040529050919050565b6124bc336119c7565b61250c5760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b80518251146125835760405162461bcd60e51b815260206004820152603c60248201527f6572726f723a313030333320746f416464726573736573206c656e677468206460448201527f6f6573206e6f74206d6174636820616d6f756e7473206c656e677468000000006064820152608401610e97565b815160005b81811015610f9a5760008482815181106125a4576125a461485a565b6020026020010151905060008483815181106125c2576125c261485a565b6020026020010151905060005b8181101561266757601e54601f54106126395760405162461bcd60e51b815260206004820152602660248201527f6572726f723a313030313020457863656564696e672074686520746f74616c20604482015265185b5bdd5b9d60d21b6064820152608401610e97565b612644836001613a3a565b601f546126529060016148f5565b601f558061265f81614870565b9150506125cf565b505050808061267590614870565b915050612588565b612686336119c7565b6126d65760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b6027805460ff1916911515919091179055565b6001600160a01b038116600090815260106020526040812054601554610c359190614847565b612717613049565b815183511461278e5760405162461bcd60e51b815260206004820152603c60248201527f6572726f723a20313030303020636f6e747261637473206c656e67746820646f60448201527f6573206e6f74206d6174636820746f6b656e496473206c656e677468000000006064820152608401610e97565b80518251146128055760405162461bcd60e51b815260206004820152603960248201527f6572726f723a20313030303120746f6b656e496473206c656e67746820646f6560448201527f73206e6f74206d6174636820636f756e7473206c656e677468000000000000006064820152608401610e97565b601d546301000000900460ff1661285e5760405162461bcd60e51b815260206004820152601660248201527f6572726f723a313030303220737769746368206f6666000000000000000000006044820152606401610e97565b6000805b83518110156128a45782818151811061287d5761287d61485a565b60200260200101518261289091906148f5565b91508061289c81614870565b915050612862565b50601e81106128f55760405162461bcd60e51b815260206004820152601560248201527f6572726f723a203130303033204c696d697420333000000000000000000000006044820152606401610e97565b80602a5461290391906148de565b341461295c5760405162461bcd60e51b815260206004820152602260248201527f6572726f723a3130303034206d73672e76616c756520697320696e636f72726560448201526118dd60f21b6064820152608401610e97565b60005b8351811015612d2657600085828151811061297c5761297c61485a565b60200260200101519050600085838151811061299a5761299a61485a565b6020026020010151905060008584815181106129b8576129b861485a565b60200260200101519050336001600160a01b0316836001600160a01b0316636352211e846040518263ffffffff1660e01b81526004016129fa91815260200190565b602060405180830381865afa158015612a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a3b9190614a0e565b6001600160a01b031614612a915760405162461bcd60e51b815260206004820152601460248201527f6572726f723a3130303035204e6f206f776e65720000000000000000000000006044820152606401610e97565b6001600160a01b0383166000908152602b6020526040902054612af65760405162461bcd60e51b815260206004820181905260248201527f6572726f723a313030303620436f6e74726163742063616e6e6f74206d696e746044820152606401610e97565b6001600160a01b0383166000908152602b60209081526040808320546029835281842086855290925290912054612b2e9083906148f5565b1115612ba25760405162461bcd60e51b815260206004820152602960248201527f6572726f723a31303030372047726561746572207468616e206d6178696d756d60448201527f207175616e7469747900000000000000000000000000000000000000000000006064820152608401610e97565b601e5481601f54612bb391906148f5565b1115612c105760405162461bcd60e51b815260206004820152602660248201527f6572726f723a313030303820457863656564696e672074686520746f74616c20604482015265185b5bdd5b9d60d21b6064820152608401610e97565b60145481601954612c2191906148f5565b1115612c6f5760405162461bcd60e51b815260206004820152601b60248201527f6572726f723a313030303920526561636820746865206c696d697400000000006044820152606401610e97565b60005b81811015612c9757612c85336001613a3a565b80612c8f81614870565b915050612c72565b5080601954612ca691906148f5565b601955601f54612cb79082906148f5565b601f556001600160a01b0383166000908152602960209081526040808320858452909152902054612ce99082906148f5565b6001600160a01b03909316600090815260296020908152604080832094835293905291909120919091555080612d1e81614870565b91505061295f565b5050610ddd6001600a55565b612d3a613427565b6001600160a01b038116612db65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610e97565b6116e481613481565b612dc8336119c7565b612e185760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b6116e47f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92982613a54565b60006001600160e01b031982167f649a51a8000000000000000000000000000000000000000000000000000000001480610c355750610c3582613ad7565b6000805482108015610c35575050600090815260046020526040902054600160e01b900460ff161590565b600082815260066020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60408051606081018252600080825260208201819052918101919091528160005481101561301757600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff161515918101829052906130155780516001600160a01b031615612fab579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215613010579392505050565b612fab565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600a540361309b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610e97565b6002600a55565b6000826130af8584613b72565b14949350505050565b6015546001600160a01b038216600090815260106020526040902054106131215760405162461bcd60e51b815260206004820152601b60248201527f6572726f723a313030303320616c726561647920636c61696d656400000000006044820152606401610e97565b601e54601f54106131835760405162461bcd60e51b815260206004820152602660248201527f6572726f723a313030313020457863656564696e672074686520746f74616c20604482015265185b5bdd5b9d60d21b6064820152608401610e97565b61318e816001613a3a565b6001600160a01b0381166000908152601060205260409020546131b29060016148f5565b6001600160a01b038216600090815260106020526040902055601f546131d99060016148f5565b601f5550565b60006131ea82612f14565b9050836001600160a01b031681600001516001600160a01b03161461323b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000336001600160a01b038616148061325957506132598533610b55565b8061327457503361326984610ccd565b6001600160a01b0316145b9050806132ad576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166132ed576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132fa8585856001613bbf565b61330660008487612eab565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b429092169190910217835587018084529220805491939091166133dc5760005482146133dc578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b6008546001600160a01b03163314611a815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e97565b600880546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008281526009602090815260408083206001600160a01b038516845290915290205460ff16611d1e5760008281526009602090815260408083206001600160a01b03851684529091529020805460ff1916600117905561353e3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6060600682600581111561359857613598614a2b565b60ff1611156135a657600080fd5b8160058111156135b8576135b8614a2b565b6000036135f857505060408051808201909152600681527f5055424c49430000000000000000000000000000000000000000000000000000602082015290565b81600581111561360a5761360a614a2b565b60010361364a57505060408051808201909152600981527f4558434c55534956450000000000000000000000000000000000000000000000602082015290565b81600581111561365c5761365c614a2b565b60020361369c57505060408051808201909152600a81527f434f4d4d45524349414c00000000000000000000000000000000000000000000602082015290565b8160058111156136ae576136ae614a2b565b6003036136ee57505060408051808201909152601281527f434f4d4d45524349414c5f4e4f5f484154450000000000000000000000000000602082015290565b81600581111561370057613700614a2b565b60040361374057505060408051808201909152600881527f504552534f4e414c000000000000000000000000000000000000000000000000602082015290565b505060408051808201909152601081527f504552534f4e414c5f4e4f5f4841544500000000000000000000000000000000602082015290565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906137ae903390899088908890600401614b4a565b6020604051808303816000875af19250505080156137e9575060408051601f3d908101601f191682019092526137e691810190614b86565b60015b613847573d808015613817576040519150601f19603f3d011682016040523d82523d6000602084013e61381c565b606091505b50805160000361383f576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600061387283613c65565b600101905060008167ffffffffffffffff8111156138925761389261410b565b6040519080825280601f01601f1916602001820160405280156138bc576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85049450846138c657509392505050565b60608160000361394857505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115613972578061395c81614870565b915061396b9050600a83614bb9565b915061394c565b60008167ffffffffffffffff81111561398d5761398d61410b565b6040519080825280601f01601f1916602001820160405280156139b7576020820181803683370190505b5090505b841561385d576139cc600183614847565b91506139d9600a86614bcd565b6139e49060306148f5565b60f81b8183815181106139f9576139f961485a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613a33600a86614bb9565b94506139bb565b611d1e828260405180602001604052806000815250613d47565b60008281526009602090815260408083206001600160a01b038516845290915290205460ff1615611d1e5760008281526009602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480613b3a57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610c3557507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610c35565b600081815b8451811015613bb757613ba382868381518110613b9657613b9661485a565b6020026020010151613f5e565b915080613baf81614870565b915050613b77565b509392505050565b816000613bcc83836148f5565b90505b80821015613c5d576000828152600e60205260409020541580613bf457506028546002145b80613c01575060205460ff165b613c4d5760405162461bcd60e51b815260206004820181905260248201527f6572726f723a3130303037205374616b652063616e2774207472616e736665726044820152606401610e97565b613c5682614870565b9150613bcf565b505050505050565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613cae577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310613cda576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310613cf857662386f26fc10000830492506010015b6305f5e1008310613d10576305f5e100830492506008015b6127108310613d2457612710830492506004015b60648310613d36576064830492506002015b600a8310610c355760010192915050565b6000546001600160a01b038416613d8a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600003613dc4576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613dd16000858386613bbf565b6001600160a01b038416600081815260056020908152604080832080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000811667ffffffffffffffff8083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600490925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15613f09575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4613ed26000878480600101955087613779565b613eef576040516368d2bf6b60e11b815260040160405180910390fd5b808210613e87578260005414613f0457600080fd5b613f4e565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210613f0a575b506000908155610f9a9085838684565b6000818310613f7a576000828152602084905260409020610e42565b6000838152602083905260409020610e42565b6001600160e01b0319811681146116e457600080fd5b600060208284031215613fb557600080fd5b8135610e4281613f8d565b60005b83811015613fdb578181015183820152602001613fc3565b50506000910152565b60008151808452613ffc816020860160208601613fc0565b601f01601f19169290920160200192915050565b602081526000610e426020830184613fe4565b60006020828403121561403557600080fd5b5035919050565b6001600160a01b03811681146116e457600080fd5b6000806040838503121561406457600080fd5b823561406f8161403c565b946020939093013593505050565b60008083601f84011261408f57600080fd5b50813567ffffffffffffffff8111156140a757600080fd5b6020830191508360208260051b85010111156140c257600080fd5b9250929050565b600080602083850312156140dc57600080fd5b823567ffffffffffffffff8111156140f357600080fd5b6140ff8582860161407d565b90969095509350505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561414a5761414a61410b565b604052919050565b600067ffffffffffffffff82111561416c5761416c61410b565b5060051b60200190565b600082601f83011261418757600080fd5b8135602061419c61419783614152565b614121565b82815260059290921b840181019181810190868411156141bb57600080fd5b8286015b848110156141df5780356141d28161403c565b83529183019183016141bf565b509695505050505050565b600080604083850312156141fd57600080fd5b823567ffffffffffffffff81111561421457600080fd5b61422085828601614176565b92505060208301356142318161403c565b809150509250929050565b60008060006040848603121561425157600080fd5b833567ffffffffffffffff81111561426857600080fd5b6142748682870161407d565b909790965060209590950135949350505050565b600080600080600060a086880312156142a057600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6000806000606084860312156142d857600080fd5b83356142e38161403c565b925060208401356142f38161403c565b929592945050506040919091013590565b6000806000806080858703121561431a57600080fd5b84356143258161403c565b935060208501356143358161403c565b925060408501356143458161403c565b9396929550929360600135925050565b60008060006060848603121561436a57600080fd5b505081359360208301359350604090920135919050565b80151581146116e457600080fd5b600080600080600060a086880312156143a757600080fd5b85356143b281614381565b945060208601356143c281614381565b935060408601356143d281614381565b925060608601356143e281614381565b915060808601356143f281614381565b809150509295509295909350565b60006020828403121561441257600080fd5b8135610e428161403c565b6000806040838503121561443057600080fd5b50508035926020909101359150565b6000806000806040858703121561445557600080fd5b843567ffffffffffffffff8082111561446d57600080fd5b6144798883890161407d565b9096509450602087013591508082111561449257600080fd5b5061449f8782880161407d565b95989497509550505050565b600080604083850312156144be57600080fd5b8235915060208301356142318161403c565b600067ffffffffffffffff8311156144ea576144ea61410b565b6144fd601f8401601f1916602001614121565b905082815283838301111561451157600080fd5b828260208301376000602084830101529392505050565b60006020828403121561453a57600080fd5b813567ffffffffffffffff81111561455157600080fd5b8201601f8101841361456257600080fd5b61385d848235602084016144d0565b6000806040838503121561458457600080fd5b823561458f8161403c565b9150602083013561423181614381565b600082601f8301126145b057600080fd5b813560206145c061419783614152565b82815260059290921b840181019181810190868411156145df57600080fd5b8286015b848110156141df57803583529183019183016145e3565b6000806040838503121561460d57600080fd5b82356146188161403c565b9150602083013567ffffffffffffffff81111561463457600080fd5b6146408582860161459f565b9150509250929050565b6000806000806080858703121561466057600080fd5b843561466b8161403c565b9350602085013561467b8161403c565b925060408501359150606085013567ffffffffffffffff81111561469e57600080fd5b8501601f810187136146af57600080fd5b6146be878235602084016144d0565b91505092959194509250565b600080604083850312156146dd57600080fd5b823567ffffffffffffffff808211156146f557600080fd5b61470186838701614176565b9350602085013591508082111561471757600080fd5b506146408582860161459f565b60006020828403121561473657600080fd5b8135610e4281614381565b6000806040838503121561475457600080fd5b823561475f8161403c565b915060208301356142318161403c565b60008060006060848603121561478457600080fd5b833567ffffffffffffffff8082111561479c57600080fd5b6147a887838801614176565b945060208601359150808211156147be57600080fd5b6147ca8783880161459f565b935060408601359150808211156147e057600080fd5b506147ed8682870161459f565b9150509250925092565b600181811c9082168061480b57607f821691505b60208210810361482b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610c3557610c35614831565b634e487b7160e01b600052603260045260246000fd5b60006001820161488257614882614831565b5060010190565b60006020828403121561489b57600080fd5b5051919050565b6000602082840312156148b457600080fd5b8151610e4281614381565b600060ff821660ff81036148d5576148d5614831565b60010192915050565b8082028115828204841417610c3557610c35614831565b80820180821115610c3557610c35614831565b601f821115610ddd57600081815260208120601f850160051c8101602086101561492f5750805b601f850160051c820191505b81811015613c5d5782815560010161493b565b815167ffffffffffffffff8111156149685761496861410b565b61497c8161497684546147f7565b84614908565b602080601f8311600181146149b157600084156149995750858301515b600019600386901b1c1916600185901b178555613c5d565b600085815260208120601f198616915b828110156149e0578886015182559484019460019091019084016149c1565b50858210156149fe5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215614a2057600080fd5b8151610e428161403c565b634e487b7160e01b600052602160045260246000fd5b60008351614a53818460208801613fc0565b835190830190614a67818360208801613fc0565b01949350505050565b6000808454614a7e816147f7565b60018281168015614a965760018114614aab57614ada565b60ff1984168752821515830287019450614ada565b8860005260208060002060005b85811015614ad15781548a820152908401908201614ab8565b50505082870194505b507f2f00000000000000000000000000000000000000000000000000000000000000845286519250614b128382860160208a01613fc0565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000939092019182019290925260060195945050505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152614b7c6080830184613fe4565b9695505050505050565b600060208284031215614b9857600080fd5b8151610e4281613f8d565b634e487b7160e01b600052601260045260246000fd5b600082614bc857614bc8614ba3565b500490565b600082614bdc57614bdc614ba3565b50069056fe61723a2f2f7a6d63315754737049684679565938326277664149634945784c4648356c55634848554e307758673457382f4f70657261746f72416363657373436f6e74726f6c3a2063616c6c6572206973a2646970667358221220cee70ac57e621b75181506f217f9b9cdcabb3bf0cbae8b9c80d270d67adf1efa64736f6c6343000814003368747470733a2f2f73332e61702d736f757468656173742d312e616d617a6f6e6177732e636f6d2f747261646974696f6e6f772d6173736574732f747261646974696f6e6f772d6173736574732f506f636b6574576974684c6f7665

Deployed Bytecode

0x6080604052600436106103a25760003560e01c80638da5cb5b116101e7578063b4e78ea41161010d578063db6f2906116100a0578063f01288521161006f578063f012885214610ba3578063f2fde38b14610bb6578063f5b541a614610bd6578063fad8b32a14610c0a57600080fd5b8063db6f290614610b05578063e0e6389314610b25578063e985e9c514610b3a578063eeb86e7814610b8357600080fd5b8063c3e30196116100dc578063c3e3019614610a9d578063c7db289314610ab0578063c87b56dd14610ac5578063cf2bde3b14610ae557600080fd5b8063b4e78ea414610a06578063b824c19d14610a20578063b8323fc214610a40578063b88d4fde14610a7d57600080fd5b8063a22cb46511610185578063a89370e711610154578063a89370e714610942578063ab2cb8e9146109a6578063ac3c9952146109c6578063b10dcc93146109e657600080fd5b8063a22cb465146108c7578063a2309ff8146108e7578063a341793b146108fc578063a7f93ebd1461091157600080fd5b806395d89b41116101c157806395d89b41146108525780639870d7fe146108675780639ead7a1914610887578063a0bcfc7f146108a757600080fd5b80638da5cb5b146107b55780638fc3b549146107d357806391d148541461080c57600080fd5b80632db11544116102cc5780636352211e1161026a578063715018a611610239578063715018a61461071c57806375edcbe01461073157806381c8d149146107515780638ceb45a91461077e57600080fd5b80636352211e146106865780636d70f7ae146106a65780636dc25b93146106c657806370a08231146106fc57600080fd5b80634ad7b025116102a65780634ad7b025146105e25780634b3ed3721461060257806356bda4a2146106225780636102664a1461066657600080fd5b80632db115441461058f578063319948ba146105a257806342842e0e146105c257600080fd5b8063157620ab116103445780631d39191d116103135780631d39191d1461051957806323b872dd146105395780632a7ce051146105595780632bd19b771461056f57600080fd5b8063157620ab146104b75780631649698b146104d757806316504c0a146104ea57806318160ddd1461050057600080fd5b8063081812fc11610380578063081812fc1461041d578063095ea7b3146104555780630af2b562146104775780630fbf0a931461049757600080fd5b806301ffc9a7146103a7578063047fc9aa146103dc57806306fdde03146103fb575b600080fd5b3480156103b357600080fd5b506103c76103c2366004613fa3565b610c2a565b60405190151581526020015b60405180910390f35b3480156103e857600080fd5b50601e545b6040519081526020016103d3565b34801561040757600080fd5b50610410610c3b565b6040516103d39190614010565b34801561042957600080fd5b5061043d610438366004614023565b610ccd565b6040516001600160a01b0390911681526020016103d3565b34801561046157600080fd5b50610475610470366004614051565b610d2a565b005b34801561048357600080fd5b506103ed610492366004614051565b610de2565b3480156104a357600080fd5b506104756104b23660046140c9565b610e49565b3480156104c357600080fd5b506104756104d23660046141ea565b610fa0565b6104756104e536600461423c565b611195565b3480156104f657600080fd5b506103ed600c5481565b34801561050c57600080fd5b50600154600054036103ed565b34801561052557600080fd5b50610475610534366004614288565b611409565b34801561054557600080fd5b506104756105543660046142c3565b611479565b34801561056557600080fd5b506103ed600d5481565b34801561057b57600080fd5b5061047561058a366004614304565b611484565b61047561059d366004614023565b61152c565b3480156105ae57600080fd5b506104756105bd366004614355565b6116e7565b3480156105ce57600080fd5b506104756105dd3660046142c3565b61174e565b3480156105ee57600080fd5b506104756105fd366004614051565b611769565b34801561060e57600080fd5b5061047561061d3660046140c9565b6117de565b34801561062e57600080fd5b50601154601254601354601554601454604080519586526020860194909452928401919091526060830152608082015260a0016103d3565b34801561067257600080fd5b5061047561068136600461438f565b6118f7565b34801561069257600080fd5b5061043d6106a1366004614023565b6119b5565b3480156106b257600080fd5b506103c76106c1366004614400565b6119c7565b3480156106d257600080fd5b506103ed6106e1366004614400565b6001600160a01b03166000908152602b602052604090205490565b34801561070857600080fd5b506103ed610717366004614400565b611a07565b34801561072857600080fd5b50610475611a6f565b34801561073d57600080fd5b5061047561074c36600461441d565b611a83565b34801561075d57600080fd5b506103ed61076c366004614023565b6000908152600e602052604090205490565b34801561078a57600080fd5b5061079e61079936600461443f565b611ae7565b6040805192151583529015156020830152016103d3565b3480156107c157600080fd5b506008546001600160a01b031661043d565b3480156107df57600080fd5b506016546017546018546019546040805194855260208501939093529183015260608201526080016103d3565b34801561081857600080fd5b506103c76108273660046144ab565b60009182526009602090815260408084206001600160a01b0393909316845291905290205460ff1690565b34801561085e57600080fd5b50610410611bb5565b34801561087357600080fd5b50610475610882366004614400565b611bc4565b34801561089357600080fd5b506104756108a23660046142c3565b611c47565b3480156108b357600080fd5b506104756108c2366004614528565b611cb9565b3480156108d357600080fd5b506104756108e2366004614571565b611d22565b3480156108f357600080fd5b50601f546103ed565b34801561090857600080fd5b50610410611dd0565b34801561091d57600080fd5b50601a54601b54601c54604080519384526020840192909252908201526060016103d3565b34801561094e57600080fd5b50601d54602080546040805160ff80861615158252610100860481161515948201949094526201000085048416151591810191909152908216151560608201526301000000909204161515608082015260a0016103d3565b3480156109b257600080fd5b5061043d6109c1366004614023565b611de7565b3480156109d257600080fd5b506104756109e13660046145fa565b611f70565b3480156109f257600080fd5b50610475610a013660046140c9565b611fb8565b348015610a1257600080fd5b506027546103c79060ff1681565b348015610a2c57600080fd5b50610475610a3b366004614023565b6120da565b348015610a4c57600080fd5b50610a60610a5b366004614023565b612138565b6040805193151584526020840192909252908201526060016103d3565b348015610a8957600080fd5b50610475610a9836600461464a565b612184565b610475610aab36600461423c565b6121c8565b348015610abc57600080fd5b5061041061241f565b348015610ad157600080fd5b50610410610ae0366004614023565b61247f565b348015610af157600080fd5b50610475610b003660046146ca565b6124b3565b348015610b1157600080fd5b50610475610b20366004614724565b61267d565b348015610b3157600080fd5b50602a546103ed565b348015610b4657600080fd5b506103c7610b55366004614741565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610b8f57600080fd5b506103ed610b9e366004614400565b6126e9565b610475610bb136600461476f565b61270f565b348015610bc257600080fd5b50610475610bd1366004614400565b612d32565b348015610be257600080fd5b506103ed7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b348015610c1657600080fd5b50610475610c25366004614400565b612dbf565b6000610c3582612e42565b92915050565b606060028054610c4a906147f7565b80601f0160208091040260200160405190810160405280929190818152602001828054610c76906147f7565b8015610cc35780601f10610c9857610100808354040283529160200191610cc3565b820191906000526020600020905b815481529060010190602001808311610ca657829003601f168201915b5050505050905090565b6000610cd882612e80565b610d0e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610d35826119b5565b9050806001600160a01b0316836001600160a01b031603610d82576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03821614610dd257610d9c8133610b55565b610dd2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ddd838383612eab565b505050565b6001600160a01b0382166000908152602b60205260408120548103610e0957506000610c35565b6001600160a01b0383166000818152602960209081526040808320868452825280832054938352602b909152902054610e429190614847565b9392505050565b60275460ff16610ea05760405162461bcd60e51b815260206004820152601860248201527f6572726f723a3130303036207374616b6520636c6f736564000000000000000060448201526064015b60405180910390fd5b8060005b81811015610f9a576000848483818110610ec057610ec061485a565b905060200201359050610ed03390565b6001600160a01b0316610ee282612f14565b516001600160a01b031614610f315760405162461bcd60e51b815260206004820152601560248201527432b93937b91d189818181a902737ba1037bbb732b960591b6044820152606401610e97565b6000818152600e602052604081205490819003610f87576000828152600e602052604080822042908190559051909184917f925435fa7e37e5d9555bb18ce0d62bb9627d0846942e58e5291e9a2dded462ed9190a35b505080610f9390614870565b9050610ea4565b50505050565b610fa9336119c7565b610ff95760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b60005b82518160ff16101561115c576000838260ff168151811061101f5761101f61485a565b60209081029190910101516040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa15801561108d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b19190614889565b90508015611147576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301526024820183905283169063a9059cbb906044016020604051808303816000875af1158015611121573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114591906148a2565b505b50508080611154906148bf565b915050610ffc565b5060405147906001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610f9a573d6000803e3d6000fd5b61119d613049565b60018110156111f95760405162461bcd60e51b815260206004820152602260248201527f6572726f723a3130303130204d7573742062652067726561746572207468616e604482015261203160f01b6064820152608401610e97565b80601a5461120791906148de565b34146112605760405162461bcd60e51b815260206004820152602260248201527f6572726f723a3130303030206d73672e76616c756520697320696e636f72726560448201526118dd60f21b6064820152608401610e97565b601d5460ff166112b25760405162461bcd60e51b815260206004820152601660248201527f6572726f723a313030303120737769746368206f6666000000000000000000006044820152606401610e97565b61132883838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c546040516bffffffffffffffffffffffff193360601b16602082015290925060340190505b604051602081830303815290604052805190602001206130a2565b6113745760405162461bcd60e51b815260206004820181905260248201527f6572726f723a3130303032206e6f7420696e207468652077686974656c6973746044820152606401610e97565b60005b818110156113fe57601154601654106113d25760405162461bcd60e51b815260206004820152601b60248201527f6572726f723a313030303420526561636820746865206c696d697400000000006044820152606401610e97565b6113db336130b8565b6016546113e99060016148f5565b601655806113f681614870565b915050611377565b50610ddd6001600a55565b611412336119c7565b6114625760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b601194909455601292909255601355601555601455565b610ddd8383836131df565b61148d336119c7565b6114dd5760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b6023805473ffffffffffffffffffffffffffffffffffffffff199081166001600160a01b0396871617909155602480548216948616949094179093556025805490931691909316179055602655565b611534613049565b60018110156115905760405162461bcd60e51b815260206004820152602260248201527f6572726f723a3130303130204d7573742062652067726561746572207468616e604482015261203160f01b6064820152608401610e97565b80601c5461159e91906148de565b34146115f75760405162461bcd60e51b815260206004820152602260248201527f6572726f723a3130303030206d73672e76616c756520697320696e636f72726560448201526118dd60f21b6064820152608401610e97565b601d5462010000900460ff1661164f5760405162461bcd60e51b815260206004820152601660248201527f6572726f723a313030303120737769746368206f6666000000000000000000006044820152606401610e97565b60005b818110156116d957601354601854106116ad5760405162461bcd60e51b815260206004820152601b60248201527f6572726f723a313030303420526561636820746865206c696d697400000000006044820152606401610e97565b6116b6336130b8565b6018546116c49060016148f5565b601855806116d181614870565b915050611652565b506116e46001600a55565b50565b6116f0336119c7565b6117405760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b601a92909255601b55601c55565b610ddd83838360405180602001604052806000815250612184565b611772336119c7565b6117c25760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b6001600160a01b039091166000908152602b6020526040902055565b6117e7336119c7565b6118375760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b8060005b81811015610f9a5760008484838181106118575761185761485a565b602090810292909201356000818152600e9093526040909220549192505080156118e4576118858142614847565b6000838152600f6020526040812080549091906118a39084906148f5565b90915550506000828152600e602052604080822082905551429184917f69f6d6e6926b6914c628cca5ab19879a4099facaba2b44626e07d8e38ebd189b9190a35b5050806118f090614870565b905061183b565b611900336119c7565b6119505760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b601d80546020805460ff19169415159490941790935561ffff1990921694151561ff00191694909417610100931515939093029290921763ffff00001916620100009115159190910263ff000000191617630100000092151592909202919091179055565b60006119c082612f14565b5192915050565b6001600160a01b03811660009081527f84e70a45dc3cad9f831e8a7d9f4327701c9df1c790bfeaa7b6cb95e200be6733602052604081205460ff16610c35565b60006001600160a01b038216611a49576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b611a77613427565b611a816000613481565b565b611a8c336119c7565b611adc5760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b600c91909155600d55565b600080611b4986868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c546040516bffffffffffffffffffffffff193360601b166020820152909250603401905061130d565b9150611baa84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600d546040516bffffffffffffffffffffffff193360601b166020820152909250603401905061130d565b905094509492505050565b606060038054610c4a906147f7565b611bcd336119c7565b611c1d5760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b6116e47f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929826134e0565b33611c51826119b5565b6001600160a01b031614611c9f5760405162461bcd60e51b815260206004820152601560248201527432b93937b91d189818181a902737ba1037bbb732b960591b6044820152606401610e97565b6002602855611caf83838361174e565b5050600160285550565b611cc2336119c7565b611d125760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b6022611d1e828261494e565b5050565b336001600160a01b03831603611d64576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600b54606090611de29060ff16613582565b905090565b600033611df383612f14565b516001600160a01b031614611e425760405162461bcd60e51b815260206004820152601560248201527432b93937b91d189818181a902737ba1037bbb732b960591b6044820152606401610e97565b602354602480546026546040517f8a54c52f0000000000000000000000000000000000000000000000000000000081526001600160a01b039283166004820152600093810184905260448101919091523060648201526084810186905291921690638a54c52f9060a4016020604051808303816000875af1158015611ecb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eef9190614a0e565b6025546040517fc4d66de80000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015291925082169063c4d66de890602401600060405180830381600087803b158015611f5157600080fd5b505af1158015611f65573d6000803e3d6000fd5b509295945050505050565b60005b8151811015610ddd576000828281518110611f9057611f9061485a565b60200260200101519050611fa5338583611479565b5080611fb081614870565b915050611f73565b8060005b81811015610f9a576000848483818110611fd857611fd861485a565b905060200201359050611fe83390565b6001600160a01b0316611ffa82612f14565b516001600160a01b0316146120495760405162461bcd60e51b815260206004820152601560248201527432b93937b91d189818181a902737ba1037bbb732b960591b6044820152606401610e97565b6000818152600e602052604090205480156120c7576120688142614847565b6000838152600f6020526040812080549091906120869084906148f5565b90915550506000828152600e602052604080822082905551429184917f69f6d6e6926b6914c628cca5ab19879a4099facaba2b44626e07d8e38ebd189b9190a35b5050806120d390614870565b9050611fbc565b6120e3336119c7565b6121335760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b602a55565b6000818152600e6020526040812054819081908015612162576001935061215f8142614847565b92505b6000858152600f602052604090205461217b90846148f5565b93959294505050565b61218f8484846131df565b6001600160a01b0383163b15610f9a576121ab84848484613779565b610f9a576040516368d2bf6b60e11b815260040160405180910390fd5b6121d0613049565b600181101561222c5760405162461bcd60e51b815260206004820152602260248201527f6572726f723a3130303130204d7573742062652067726561746572207468616e604482015261203160f01b6064820152608401610e97565b80601b5461223a91906148de565b34146122935760405162461bcd60e51b815260206004820152602260248201527f6572726f723a3130303030206d73672e76616c756520697320696e636f72726560448201526118dd60f21b6064820152608401610e97565b601d54610100900460ff166122ea5760405162461bcd60e51b815260206004820152601660248201527f6572726f723a313030303120737769746368206f6666000000000000000000006044820152606401610e97565b61234983838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600d546040516bffffffffffffffffffffffff193360601b166020820152909250603401905061130d565b6123955760405162461bcd60e51b815260206004820181905260248201527f6572726f723a3130303032206e6f7420696e207468652077686974656c6973746044820152606401610e97565b60005b818110156113fe57601254601754106123f35760405162461bcd60e51b815260206004820152601b60248201527f6572726f723a313030303420526561636820746865206c696d697400000000006044820152606401610e97565b6123fc336130b8565b60175461240a9060016148f5565b6017558061241781614870565b915050612398565b6060604051806060016040528060318152602001614be260319139600b5461245a9060ff16600581111561245557612455614a2b565b613865565b60405160200161246b929190614a41565b604051602081830303815290604052905090565b6060602261248c83613905565b60405160200161249d929190614a70565b6040516020818303038152906040529050919050565b6124bc336119c7565b61250c5760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b80518251146125835760405162461bcd60e51b815260206004820152603c60248201527f6572726f723a313030333320746f416464726573736573206c656e677468206460448201527f6f6573206e6f74206d6174636820616d6f756e7473206c656e677468000000006064820152608401610e97565b815160005b81811015610f9a5760008482815181106125a4576125a461485a565b6020026020010151905060008483815181106125c2576125c261485a565b6020026020010151905060005b8181101561266757601e54601f54106126395760405162461bcd60e51b815260206004820152602660248201527f6572726f723a313030313020457863656564696e672074686520746f74616c20604482015265185b5bdd5b9d60d21b6064820152608401610e97565b612644836001613a3a565b601f546126529060016148f5565b601f558061265f81614870565b9150506125cf565b505050808061267590614870565b915050612588565b612686336119c7565b6126d65760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b6027805460ff1916911515919091179055565b6001600160a01b038116600090815260106020526040812054601554610c359190614847565b612717613049565b815183511461278e5760405162461bcd60e51b815260206004820152603c60248201527f6572726f723a20313030303020636f6e747261637473206c656e67746820646f60448201527f6573206e6f74206d6174636820746f6b656e496473206c656e677468000000006064820152608401610e97565b80518251146128055760405162461bcd60e51b815260206004820152603960248201527f6572726f723a20313030303120746f6b656e496473206c656e67746820646f6560448201527f73206e6f74206d6174636820636f756e7473206c656e677468000000000000006064820152608401610e97565b601d546301000000900460ff1661285e5760405162461bcd60e51b815260206004820152601660248201527f6572726f723a313030303220737769746368206f6666000000000000000000006044820152606401610e97565b6000805b83518110156128a45782818151811061287d5761287d61485a565b60200260200101518261289091906148f5565b91508061289c81614870565b915050612862565b50601e81106128f55760405162461bcd60e51b815260206004820152601560248201527f6572726f723a203130303033204c696d697420333000000000000000000000006044820152606401610e97565b80602a5461290391906148de565b341461295c5760405162461bcd60e51b815260206004820152602260248201527f6572726f723a3130303034206d73672e76616c756520697320696e636f72726560448201526118dd60f21b6064820152608401610e97565b60005b8351811015612d2657600085828151811061297c5761297c61485a565b60200260200101519050600085838151811061299a5761299a61485a565b6020026020010151905060008584815181106129b8576129b861485a565b60200260200101519050336001600160a01b0316836001600160a01b0316636352211e846040518263ffffffff1660e01b81526004016129fa91815260200190565b602060405180830381865afa158015612a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a3b9190614a0e565b6001600160a01b031614612a915760405162461bcd60e51b815260206004820152601460248201527f6572726f723a3130303035204e6f206f776e65720000000000000000000000006044820152606401610e97565b6001600160a01b0383166000908152602b6020526040902054612af65760405162461bcd60e51b815260206004820181905260248201527f6572726f723a313030303620436f6e74726163742063616e6e6f74206d696e746044820152606401610e97565b6001600160a01b0383166000908152602b60209081526040808320546029835281842086855290925290912054612b2e9083906148f5565b1115612ba25760405162461bcd60e51b815260206004820152602960248201527f6572726f723a31303030372047726561746572207468616e206d6178696d756d60448201527f207175616e7469747900000000000000000000000000000000000000000000006064820152608401610e97565b601e5481601f54612bb391906148f5565b1115612c105760405162461bcd60e51b815260206004820152602660248201527f6572726f723a313030303820457863656564696e672074686520746f74616c20604482015265185b5bdd5b9d60d21b6064820152608401610e97565b60145481601954612c2191906148f5565b1115612c6f5760405162461bcd60e51b815260206004820152601b60248201527f6572726f723a313030303920526561636820746865206c696d697400000000006044820152606401610e97565b60005b81811015612c9757612c85336001613a3a565b80612c8f81614870565b915050612c72565b5080601954612ca691906148f5565b601955601f54612cb79082906148f5565b601f556001600160a01b0383166000908152602960209081526040808320858452909152902054612ce99082906148f5565b6001600160a01b03909316600090815260296020908152604080832094835293905291909120919091555080612d1e81614870565b91505061295f565b5050610ddd6001600a55565b612d3a613427565b6001600160a01b038116612db65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610e97565b6116e481613481565b612dc8336119c7565b612e185760405162461bcd60e51b815260206004820152602d6024820152600080516020614c1383398151915260448201526c103737ba1037b832b930ba37b960991b6064820152608401610e97565b6116e47f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92982613a54565b60006001600160e01b031982167f649a51a8000000000000000000000000000000000000000000000000000000001480610c355750610c3582613ad7565b6000805482108015610c35575050600090815260046020526040902054600160e01b900460ff161590565b600082815260066020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60408051606081018252600080825260208201819052918101919091528160005481101561301757600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff161515918101829052906130155780516001600160a01b031615612fab579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215613010579392505050565b612fab565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600a540361309b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610e97565b6002600a55565b6000826130af8584613b72565b14949350505050565b6015546001600160a01b038216600090815260106020526040902054106131215760405162461bcd60e51b815260206004820152601b60248201527f6572726f723a313030303320616c726561647920636c61696d656400000000006044820152606401610e97565b601e54601f54106131835760405162461bcd60e51b815260206004820152602660248201527f6572726f723a313030313020457863656564696e672074686520746f74616c20604482015265185b5bdd5b9d60d21b6064820152608401610e97565b61318e816001613a3a565b6001600160a01b0381166000908152601060205260409020546131b29060016148f5565b6001600160a01b038216600090815260106020526040902055601f546131d99060016148f5565b601f5550565b60006131ea82612f14565b9050836001600160a01b031681600001516001600160a01b03161461323b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000336001600160a01b038616148061325957506132598533610b55565b8061327457503361326984610ccd565b6001600160a01b0316145b9050806132ad576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166132ed576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132fa8585856001613bbf565b61330660008487612eab565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b429092169190910217835587018084529220805491939091166133dc5760005482146133dc578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b6008546001600160a01b03163314611a815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e97565b600880546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008281526009602090815260408083206001600160a01b038516845290915290205460ff16611d1e5760008281526009602090815260408083206001600160a01b03851684529091529020805460ff1916600117905561353e3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6060600682600581111561359857613598614a2b565b60ff1611156135a657600080fd5b8160058111156135b8576135b8614a2b565b6000036135f857505060408051808201909152600681527f5055424c49430000000000000000000000000000000000000000000000000000602082015290565b81600581111561360a5761360a614a2b565b60010361364a57505060408051808201909152600981527f4558434c55534956450000000000000000000000000000000000000000000000602082015290565b81600581111561365c5761365c614a2b565b60020361369c57505060408051808201909152600a81527f434f4d4d45524349414c00000000000000000000000000000000000000000000602082015290565b8160058111156136ae576136ae614a2b565b6003036136ee57505060408051808201909152601281527f434f4d4d45524349414c5f4e4f5f484154450000000000000000000000000000602082015290565b81600581111561370057613700614a2b565b60040361374057505060408051808201909152600881527f504552534f4e414c000000000000000000000000000000000000000000000000602082015290565b505060408051808201909152601081527f504552534f4e414c5f4e4f5f4841544500000000000000000000000000000000602082015290565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906137ae903390899088908890600401614b4a565b6020604051808303816000875af19250505080156137e9575060408051601f3d908101601f191682019092526137e691810190614b86565b60015b613847573d808015613817576040519150601f19603f3d011682016040523d82523d6000602084013e61381c565b606091505b50805160000361383f576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600061387283613c65565b600101905060008167ffffffffffffffff8111156138925761389261410b565b6040519080825280601f01601f1916602001820160405280156138bc576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85049450846138c657509392505050565b60608160000361394857505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115613972578061395c81614870565b915061396b9050600a83614bb9565b915061394c565b60008167ffffffffffffffff81111561398d5761398d61410b565b6040519080825280601f01601f1916602001820160405280156139b7576020820181803683370190505b5090505b841561385d576139cc600183614847565b91506139d9600a86614bcd565b6139e49060306148f5565b60f81b8183815181106139f9576139f961485a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613a33600a86614bb9565b94506139bb565b611d1e828260405180602001604052806000815250613d47565b60008281526009602090815260408083206001600160a01b038516845290915290205460ff1615611d1e5760008281526009602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480613b3a57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610c3557507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610c35565b600081815b8451811015613bb757613ba382868381518110613b9657613b9661485a565b6020026020010151613f5e565b915080613baf81614870565b915050613b77565b509392505050565b816000613bcc83836148f5565b90505b80821015613c5d576000828152600e60205260409020541580613bf457506028546002145b80613c01575060205460ff165b613c4d5760405162461bcd60e51b815260206004820181905260248201527f6572726f723a3130303037205374616b652063616e2774207472616e736665726044820152606401610e97565b613c5682614870565b9150613bcf565b505050505050565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613cae577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310613cda576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310613cf857662386f26fc10000830492506010015b6305f5e1008310613d10576305f5e100830492506008015b6127108310613d2457612710830492506004015b60648310613d36576064830492506002015b600a8310610c355760010192915050565b6000546001600160a01b038416613d8a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600003613dc4576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613dd16000858386613bbf565b6001600160a01b038416600081815260056020908152604080832080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000811667ffffffffffffffff8083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600490925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15613f09575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4613ed26000878480600101955087613779565b613eef576040516368d2bf6b60e11b815260040160405180910390fd5b808210613e87578260005414613f0457600080fd5b613f4e565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210613f0a575b506000908155610f9a9085838684565b6000818310613f7a576000828152602084905260409020610e42565b6000838152602083905260409020610e42565b6001600160e01b0319811681146116e457600080fd5b600060208284031215613fb557600080fd5b8135610e4281613f8d565b60005b83811015613fdb578181015183820152602001613fc3565b50506000910152565b60008151808452613ffc816020860160208601613fc0565b601f01601f19169290920160200192915050565b602081526000610e426020830184613fe4565b60006020828403121561403557600080fd5b5035919050565b6001600160a01b03811681146116e457600080fd5b6000806040838503121561406457600080fd5b823561406f8161403c565b946020939093013593505050565b60008083601f84011261408f57600080fd5b50813567ffffffffffffffff8111156140a757600080fd5b6020830191508360208260051b85010111156140c257600080fd5b9250929050565b600080602083850312156140dc57600080fd5b823567ffffffffffffffff8111156140f357600080fd5b6140ff8582860161407d565b90969095509350505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561414a5761414a61410b565b604052919050565b600067ffffffffffffffff82111561416c5761416c61410b565b5060051b60200190565b600082601f83011261418757600080fd5b8135602061419c61419783614152565b614121565b82815260059290921b840181019181810190868411156141bb57600080fd5b8286015b848110156141df5780356141d28161403c565b83529183019183016141bf565b509695505050505050565b600080604083850312156141fd57600080fd5b823567ffffffffffffffff81111561421457600080fd5b61422085828601614176565b92505060208301356142318161403c565b809150509250929050565b60008060006040848603121561425157600080fd5b833567ffffffffffffffff81111561426857600080fd5b6142748682870161407d565b909790965060209590950135949350505050565b600080600080600060a086880312156142a057600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6000806000606084860312156142d857600080fd5b83356142e38161403c565b925060208401356142f38161403c565b929592945050506040919091013590565b6000806000806080858703121561431a57600080fd5b84356143258161403c565b935060208501356143358161403c565b925060408501356143458161403c565b9396929550929360600135925050565b60008060006060848603121561436a57600080fd5b505081359360208301359350604090920135919050565b80151581146116e457600080fd5b600080600080600060a086880312156143a757600080fd5b85356143b281614381565b945060208601356143c281614381565b935060408601356143d281614381565b925060608601356143e281614381565b915060808601356143f281614381565b809150509295509295909350565b60006020828403121561441257600080fd5b8135610e428161403c565b6000806040838503121561443057600080fd5b50508035926020909101359150565b6000806000806040858703121561445557600080fd5b843567ffffffffffffffff8082111561446d57600080fd5b6144798883890161407d565b9096509450602087013591508082111561449257600080fd5b5061449f8782880161407d565b95989497509550505050565b600080604083850312156144be57600080fd5b8235915060208301356142318161403c565b600067ffffffffffffffff8311156144ea576144ea61410b565b6144fd601f8401601f1916602001614121565b905082815283838301111561451157600080fd5b828260208301376000602084830101529392505050565b60006020828403121561453a57600080fd5b813567ffffffffffffffff81111561455157600080fd5b8201601f8101841361456257600080fd5b61385d848235602084016144d0565b6000806040838503121561458457600080fd5b823561458f8161403c565b9150602083013561423181614381565b600082601f8301126145b057600080fd5b813560206145c061419783614152565b82815260059290921b840181019181810190868411156145df57600080fd5b8286015b848110156141df57803583529183019183016145e3565b6000806040838503121561460d57600080fd5b82356146188161403c565b9150602083013567ffffffffffffffff81111561463457600080fd5b6146408582860161459f565b9150509250929050565b6000806000806080858703121561466057600080fd5b843561466b8161403c565b9350602085013561467b8161403c565b925060408501359150606085013567ffffffffffffffff81111561469e57600080fd5b8501601f810187136146af57600080fd5b6146be878235602084016144d0565b91505092959194509250565b600080604083850312156146dd57600080fd5b823567ffffffffffffffff808211156146f557600080fd5b61470186838701614176565b9350602085013591508082111561471757600080fd5b506146408582860161459f565b60006020828403121561473657600080fd5b8135610e4281614381565b6000806040838503121561475457600080fd5b823561475f8161403c565b915060208301356142318161403c565b60008060006060848603121561478457600080fd5b833567ffffffffffffffff8082111561479c57600080fd5b6147a887838801614176565b945060208601359150808211156147be57600080fd5b6147ca8783880161459f565b935060408601359150808211156147e057600080fd5b506147ed8682870161459f565b9150509250925092565b600181811c9082168061480b57607f821691505b60208210810361482b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610c3557610c35614831565b634e487b7160e01b600052603260045260246000fd5b60006001820161488257614882614831565b5060010190565b60006020828403121561489b57600080fd5b5051919050565b6000602082840312156148b457600080fd5b8151610e4281614381565b600060ff821660ff81036148d5576148d5614831565b60010192915050565b8082028115828204841417610c3557610c35614831565b80820180821115610c3557610c35614831565b601f821115610ddd57600081815260208120601f850160051c8101602086101561492f5750805b601f850160051c820191505b81811015613c5d5782815560010161493b565b815167ffffffffffffffff8111156149685761496861410b565b61497c8161497684546147f7565b84614908565b602080601f8311600181146149b157600084156149995750858301515b600019600386901b1c1916600185901b178555613c5d565b600085815260208120601f198616915b828110156149e0578886015182559484019460019091019084016149c1565b50858210156149fe5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215614a2057600080fd5b8151610e428161403c565b634e487b7160e01b600052602160045260246000fd5b60008351614a53818460208801613fc0565b835190830190614a67818360208801613fc0565b01949350505050565b6000808454614a7e816147f7565b60018281168015614a965760018114614aab57614ada565b60ff1984168752821515830287019450614ada565b8860005260208060002060005b85811015614ad15781548a820152908401908201614ab8565b50505082870194505b507f2f00000000000000000000000000000000000000000000000000000000000000845286519250614b128382860160208a01613fc0565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000939092019182019290925260060195945050505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152614b7c6080830184613fe4565b9695505050505050565b600060208284031215614b9857600080fd5b8151610e4281613f8d565b634e487b7160e01b600052601260045260246000fd5b600082614bc857614bc8614ba3565b500490565b600082614bdc57614bdc614ba3565b50069056fe61723a2f2f7a6d63315754737049684679565938326277664149634945784c4648356c55634848554e307758673457382f4f70657261746f72416363657373436f6e74726f6c3a2063616c6c6572206973a2646970667358221220cee70ac57e621b75181506f217f9b9cdcabb3bf0cbae8b9c80d270d67adf1efa64736f6c63430008140033

Deployed Bytecode Sourcemap

82302:18945:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;100772:190;;;;;;;;;;-1:-1:-1;100772:190:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;100772:190:0;;;;;;;;96132:86;;;;;;;;;;-1:-1:-1;96198:12:0;;96132:86;;;784:25:1;;;772:2;757:18;96132:86:0;638:177:1;44045:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;45549:204::-;;;;;;;;;;-1:-1:-1;45549:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1925:55:1;;;1907:74;;1895:2;1880:18;45549:204:0;1761:226:1;45111:372:0;;;;;;;;;;-1:-1:-1;45111:372:0;;;;;:::i;:::-;;:::i;:::-;;98073:339;;;;;;;;;;-1:-1:-1;98073:339:0;;;;;:::i;:::-;;:::i;93205:610::-;;;;;;;;;;-1:-1:-1;93205:610:0;;;;;:::i;:::-;;:::i;96325:446::-;;;;;;;;;;-1:-1:-1;96325:446:0;;;;;:::i;:::-;;:::i;89009:922::-;;;;;;:::i;:::-;;:::i;82417:33::-;;;;;;;;;;;;;;;;40170:312;;;;;;;;;;-1:-1:-1;40433:12:0;;40223:7;40417:13;:28;40170:312;;86145:434;;;;;;;;;;-1:-1:-1;86145:434:0;;;;;:::i;:::-;;:::i;46414:170::-;;;;;;;;;;-1:-1:-1;46414:170:0;;;;;:::i;:::-;;:::i;82457:33::-;;;;;;;;;;;;;;;;83970:455;;;;;;;;;;-1:-1:-1;83970:455:0;;;;;:::i;:::-;;:::i;90869:633::-;;;;;;:::i;:::-;;:::i;87088:276::-;;;;;;;;;;-1:-1:-1;87088:276:0;;;;;:::i;:::-;;:::i;46655:185::-;;;;;;;;;;-1:-1:-1;46655:185:0;;;;;:::i;:::-;;:::i;97740:166::-;;;;;;;;;;-1:-1:-1;97740:166:0;;;;;:::i;:::-;;:::i;94436:500::-;;;;;;;;;;-1:-1:-1;94436:500:0;;;;;:::i;:::-;;:::i;86587:493::-;;;;;;;;;;-1:-1:-1;86885:13:0;;86924;;86966:16;;87012:17;;87057:15;;86587:493;;;7967:25:1;;;8023:2;8008:18;;8001:34;;;;8051:18;;;8044:34;;;;8109:2;8094:18;;8087:34;8152:3;8137:19;;8130:35;7954:3;7939:19;86587:493:0;7708:463:1;87707:391:0;;;;;;;;;;-1:-1:-1;87707:391:0;;;;;:::i;:::-;;:::i;43853:125::-;;;;;;;;;;-1:-1:-1;43853:125:0;;;;;:::i;:::-;;:::i;81697:130::-;;;;;;;;;;-1:-1:-1;81697:130:0;;;;;:::i;:::-;;:::i;97914:151::-;;;;;;;;;;-1:-1:-1;97914:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;98028:29:0;98001:7;98028:29;;;:12;:29;;;;;;;97914:151;41299:206;;;;;;;;;;-1:-1:-1;41299:206:0;;;;;:::i;:::-;;:::i;72625:103::-;;;;;;;;;;;;;:::i;85366:228::-;;;;;;;;;;-1:-1:-1;85366:228:0;;;;;:::i;:::-;;:::i;92807:116::-;;;;;;;;;;-1:-1:-1;92807:116:0;;;;;:::i;:::-;92867:7;92894:21;;;:12;:21;;;;;;;92807:116;85602:535;;;;;;;;;;-1:-1:-1;85602:535:0;;;;;:::i;:::-;;:::i;:::-;;;;10557:14:1;;10550:22;10532:41;;10616:14;;10609:22;10604:2;10589:18;;10582:50;10505:18;85602:535:0;10370:268:1;71984:87:0;;;;;;;;;;-1:-1:-1;72057:6:0;;-1:-1:-1;;;;;72057:6:0;71984:87;;84951:407;;;;;;;;;;-1:-1:-1;85210:13:0;;85249;;85291:16;;85335:15;;84951:407;;;10874:25:1;;;10930:2;10915:18;;10908:34;;;;10958:18;;;10951:34;11016:2;11001:18;;10994:34;10861:3;10846:19;84951:407:0;10643:391:1;80494:164:0;;;;;;;;;;-1:-1:-1;80494:164:0;;;;;:::i;:::-;80597:4;80621:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;80621:29:0;;;;;;;;;;;;;;;80494:164;44214:104;;;;;;;;;;;;;:::i;81952:120::-;;;;;;;;;;-1:-1:-1;81952:120:0;;;;;:::i;:::-;;:::i;94986:305::-;;;;;;;;;;-1:-1:-1;94986:305:0;;;;;:::i;:::-;;:::i;95814:100::-;;;;;;;;;;-1:-1:-1;95814:100:0;;;;;:::i;:::-;;:::i;45825:287::-;;;;;;;;;;-1:-1:-1;45825:287:0;;;;;:::i;:::-;;:::i;96226:91::-;;;;;;;;;;-1:-1:-1;96297:12:0;;96226:91;;77096:132;;;;;;;;;;;;;:::i;87372:327::-;;;;;;;;;;-1:-1:-1;87594:13:0;;87633;;87675:16;;87372:327;;;12816:25:1;;;12872:2;12857:18;;12850:34;;;;12900:18;;;12893:34;12804:2;12789:18;87372:327:0;12614:319:1;88106:450:0;;;;;;;;;;-1:-1:-1;88376:12:0;;88494:13;;;88106:450;;;88376:12;;;;13192:14:1;13185:22;13167:41;;88376:12:0;88413;;;;13251:14:1;13244:22;13224:18;;;13217:50;;;;88453:15:0;;;;;13310:14:1;13303:22;13283:18;;;13276:50;;;;88494:13:0;;;13369:14:1;13362:22;13357:2;13342:18;;13335:50;88534:14:0;;;;;13429::1;13422:22;13416:3;13401:19;;13394:51;13154:3;13139:19;88106:450:0;12938:513:1;84433:510:0;;;;;;;;;;-1:-1:-1;84433:510:0;;;;;:::i;:::-;;:::i;100970:274::-;;;;;;;;;;-1:-1:-1;100970:274:0;;;;;:::i;:::-;;:::i;93823:605::-;;;;;;;;;;-1:-1:-1;93823:605:0;;;;;:::i;:::-;;:::i;92931:29::-;;;;;;;;;;-1:-1:-1;92931:29:0;;;;;;;;97445:122;;;;;;;;;;-1:-1:-1;97445:122:0;;;;;:::i;:::-;;:::i;92457:342::-;;;;;;;;;;-1:-1:-1;92457:342:0;;;;;:::i;:::-;;:::i;:::-;;;;14832:14:1;;14825:22;14807:41;;14879:2;14864:18;;14857:34;;;;14907:18;;;14900:34;14795:2;14780:18;92457:342:0;14611:329:1;46911:370:0;;;;;;;;;;-1:-1:-1;46911:370:0;;;;;:::i;:::-;;:::i;89939:922::-;;;;;;:::i;:::-;;:::i;76936:152::-;;;;;;;;;;;;;:::i;95922:202::-;;;;;;;;;;-1:-1:-1;95922:202:0;;;;;:::i;:::-;;:::i;91510:792::-;;;;;;;;;;-1:-1:-1;91510:792:0;;;;;:::i;:::-;;:::i;92969:90::-;;;;;;;;;;-1:-1:-1;92969:90:0;;;;;:::i;:::-;;:::i;97575:100::-;;;;;;;;;;-1:-1:-1;97652:15:0;;97575:100;;46183:164;;;;;;;;;;-1:-1:-1;46183:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;46304:25:0;;;46280:4;46304:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;46183:164;92310:139;;;;;;;;;;-1:-1:-1;92310:139:0;;;;;:::i;:::-;;:::i;98420:2344::-;;;;;;:::i;:::-;;:::i;72883:201::-;;;;;;;;;;-1:-1:-1;72883:201:0;;;;;:::i;:::-;;:::i;80419:66::-;;;;;;;;;;;;80459:26;80419:66;;82080:124;;;;;;;;;;-1:-1:-1;82080:124:0;;;;;:::i;:::-;;:::i;100772:190::-;100894:4;100918:36;100942:11;100918:23;:36::i;:::-;100911:43;100772:190;-1:-1:-1;;100772:190:0:o;44045:100::-;44099:13;44132:5;44125:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44045:100;:::o;45549:204::-;45617:7;45642:16;45650:7;45642;:16::i;:::-;45637:64;;45667:34;;;;;;;;;;;;;;45637:64;-1:-1:-1;45721:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;45721:24:0;;45549:204::o;45111:372::-;45184:13;45200:24;45216:7;45200:15;:24::i;:::-;45184:40;;45245:5;-1:-1:-1;;;;;45239:11:0;:2;-1:-1:-1;;;;;45239:11:0;;45235:48;;45259:24;;;;;;;;;;;;;;45235:48;20604:10;-1:-1:-1;;;;;45300:21:0;;;45296:139;;45327:37;45344:5;20604:10;46183:164;:::i;45327:37::-;45323:112;;45388:35;;;;;;;;;;;;;;45323:112;45447:28;45456:2;45460:7;45469:5;45447:8;:28::i;:::-;45173:310;45111:372;;:::o;98073:339::-;-1:-1:-1;;;;;98215:29:0;;98191:7;98215:29;;;:12;:29;;;;;;:34;;98211:75;;-1:-1:-1;98273:1:0;98266:8;;98211:75;-1:-1:-1;;;;;98361:34:0;;;;;;:17;:34;;;;;;;;:43;;;;;;;;;98316:29;;;:12;:29;;;;;;:88;;98361:43;98316:88;:::i;:::-;98296:108;98073:339;-1:-1:-1;;;98073:339:0:o;93205:610::-;93277:9;;;;93269:46;;;;-1:-1:-1;;;93269:46:0;;18776:2:1;93269:46:0;;;18758:21:1;18815:2;18795:18;;;18788:30;18854:26;18834:18;;;18827:54;18898:18;;93269:46:0;;;;;;;;;93340:8;93328:9;93366:442;93390:1;93386;:5;93366:442;;;93413:15;93431:8;;93440:1;93431:11;;;;;;;:::i;:::-;;;;;;;93413:29;;93513:12;20604:10;;20524:98;93513:12;-1:-1:-1;;;;;93483:42:0;:21;93496:7;93483:12;:21::i;:::-;:26;-1:-1:-1;;;;;93483:42:0;;93457:125;;;;-1:-1:-1;;;93457:125:0;;19318:2:1;93457:125:0;;;19300:21:1;19357:2;19337:18;;;19330:30;-1:-1:-1;;;19376:18:1;;;19369:51;19437:18;;93457:125:0;19116:345:1;93457:125:0;93599:13;93615:21;;;:12;:21;;;;;;;93655:10;;;93651:146;;93686:21;;;;:12;:21;;;;;;93710:15;93686:39;;;;93749:32;;93710:15;;93699:7;;93749:32;;93686:21;93749:32;93651:146;93398:410;;93393:3;;;;:::i;:::-;;;93366:442;;;;93258:557;93205:610;;:::o;96325:446::-;81572:24;20604:10;81697:130;:::i;81572:24::-;81550:119;;;;-1:-1:-1;;;81550:119:0;;19808:2:1;81550:119:0;;;19790:21:1;19847:2;19827:18;;;19820:30;-1:-1:-1;;;;;;;;;;;19866:18:1;;;19859:62;-1:-1:-1;;;19937:18:1;;;19930:43;19990:19;;81550:119:0;19606:409:1;81550:119:0;96442:7:::1;96437:236;96455:6;:13;96451:1;:17;;;96437:236;;;96490:12;96512:6;96519:1;96512:9;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;96549:30:::1;::::0;;;;96573:4:::1;96549:30;::::0;::::1;1907:74:1::0;96512:9:0;;-1:-1:-1;96537:9:0::1;::::0;-1:-1:-1;;;;;96549:15:0;::::1;::::0;::::1;::::0;1880:18:1;;96549:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;96537:42:::0;-1:-1:-1;96598:5:0;;96594:68:::1;;96624:22;::::0;;;;-1:-1:-1;;;;;20401:55:1;;;96624:22:0::1;::::0;::::1;20383:74:1::0;20473:18;;;20466:34;;;96624:14:0;::::1;::::0;::::1;::::0;20356:18:1;;96624:22:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;96594:68;96475:198;;96470:3;;;;;:::i;:::-;;;;96437:236;;;-1:-1:-1::0;96733:30:0::1;::::0;96701:21:::1;::::0;-1:-1:-1;;;;;96733:21:0;::::1;::::0;:30;::::1;;;::::0;96701:21;;96683:15:::1;96733:30:::0;96683:15;96733:30;96701:21;96733;:30;::::1;;;;;;;;;;;;;::::0;::::1;;;;89009:922:::0;61146:21;:19;:21::i;:::-;89154:1:::1;89145:5;:10;;89137:57;;;::::0;-1:-1:-1;;;89137:57:0;;21143:2:1;89137:57:0::1;::::0;::::1;21125:21:1::0;21182:2;21162:18;;;21155:30;21221:34;21201:18;;;21194:62;-1:-1:-1;;;21272:18:1;;;21265:32;21314:19;;89137:57:0::1;20941:398:1::0;89137:57:0::1;89258:5;89242:13;;:21;;;;:::i;:::-;89229:9;:34;89207:118;;;::::0;-1:-1:-1;;;89207:118:0;;21719:2:1;89207:118:0::1;::::0;::::1;21701:21:1::0;21758:2;21738:18;;;21731:30;21797:34;21777:18;;;21770:62;-1:-1:-1;;;21848:18:1;;;21841:32;21890:19;;89207:118:0::1;21517:398:1::0;89207:118:0::1;89346:12;::::0;::::1;;89338:47;;;::::0;-1:-1:-1;;;89338:47:0;;22122:2:1;89338:47:0::1;::::0;::::1;22104:21:1::0;22161:2;22141:18;;;22134:30;22200:24;22180:18;;;22173:52;22242:18;;89338:47:0::1;21920:346:1::0;89338:47:0::1;89420:158;89457:11;;89420:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;89487:18:0::1;::::0;89534:28:::1;::::0;-1:-1:-1;;89551:10:0::1;22420:2:1::0;22416:15;22412:53;89534:28:0::1;::::0;::::1;22400:66:1::0;89487:18:0;;-1:-1:-1;22482:12:1;;;-1:-1:-1;89534:28:0::1;;;;;;;;;;;;;89524:39;;;;;;89420:18;:158::i;:::-;89398:240;;;::::0;-1:-1:-1;;;89398:240:0;;22707:2:1;89398:240:0::1;::::0;::::1;22689:21:1::0;;;22726:18;;;22719:30;22785:34;22765:18;;;22758:62;22837:18;;89398:240:0::1;22505:356:1::0;89398:240:0::1;89656:9;89651:273;89675:5;89671:1;:9;89651:273;;;89744:13;;89728;;:29;89702:118;;;::::0;-1:-1:-1;;;89702:118:0;;23068:2:1;89702:118:0::1;::::0;::::1;23050:21:1::0;23107:2;23087:18;;;23080:30;23146:29;23126:18;;;23119:57;23193:18;;89702:118:0::1;22866:351:1::0;89702:118:0::1;89837:25;20604:10:::0;89837:11:::1;:25::i;:::-;89895:13;::::0;:17:::1;::::0;89911:1:::1;89895:17;:::i;:::-;89879:13;:33:::0;89682:3;::::1;::::0;::::1;:::i;:::-;;;;89651:273;;;;61190:20:::0;60584:1;61710:7;:22;61527:213;86145:434;81572:24;20604:10;81697:130;:::i;81572:24::-;81550:119;;;;-1:-1:-1;;;81550:119:0;;19808:2:1;81550:119:0;;;19790:21:1;19847:2;19827:18;;;19820:30;-1:-1:-1;;;;;;;;;;;19866:18:1;;;19859:62;-1:-1:-1;;;19937:18:1;;;19930:43;19990:19;;81550:119:0;19606:409:1;81550:119:0;86369:13:::1;:28:::0;;;;86408:13:::1;:28:::0;;;;86447:16:::1;:34:::0;86492:17:::1;:36:::0;86539:15:::1;:32:::0;86145:434::o;46414:170::-;46548:28;46558:4;46564:2;46568:7;46548:9;:28::i;83970:455::-;81572:24;20604:10;81697:130;:::i;81572:24::-;81550:119;;;;-1:-1:-1;;;81550:119:0;;19808:2:1;81550:119:0;;;19790:21:1;19847:2;19827:18;;;19820:30;-1:-1:-1;;;;;;;;;;;19866:18:1;;;19859:62;-1:-1:-1;;;19937:18:1;;;19930:43;19990:19;;81550:119:0;19606:409:1;81550:119:0;84196:22:::1;:48:::0;;-1:-1:-1;;84196:48:0;;::::1;-1:-1:-1::0;;;;;84196:48:0;;::::1;;::::0;;;84255:26:::1;:56:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;84322:28:::1;:60:::0;;;;::::1;::::0;;;::::1;;::::0;;84393:14:::1;:24:::0;83970:455::o;90869:633::-;61146:21;:19;:21::i;:::-;90960:1:::1;90951:5;:10;;90943:57;;;::::0;-1:-1:-1;;;90943:57:0;;21143:2:1;90943:57:0::1;::::0;::::1;21125:21:1::0;21182:2;21162:18;;;21155:30;21221:34;21201:18;;;21194:62;-1:-1:-1;;;21272:18:1;;;21265:32;21314:19;;90943:57:0::1;20941:398:1::0;90943:57:0::1;91067:5;91048:16;;:24;;;;:::i;:::-;91035:9;:37;91013:121;;;::::0;-1:-1:-1;;;91013:121:0;;21719:2:1;91013:121:0::1;::::0;::::1;21701:21:1::0;21758:2;21738:18;;;21731:30;21797:34;21777:18;;;21770:62;-1:-1:-1;;;21848:18:1;;;21841:32;21890:19;;91013:121:0::1;21517:398:1::0;91013:121:0::1;91155:15;::::0;;;::::1;;;91147:50;;;::::0;-1:-1:-1;;;91147:50:0;;22122:2:1;91147:50:0::1;::::0;::::1;22104:21:1::0;22161:2;22141:18;;;22134:30;22200:24;22180:18;;;22173:52;22242:18;;91147:50:0::1;21920:346:1::0;91147:50:0::1;91215:9;91210:285;91234:5;91230:1;:9;91210:285;;;91306:16;;91287;;:35;91261:124;;;::::0;-1:-1:-1;;;91261:124:0;;23068:2:1;91261:124:0::1;::::0;::::1;23050:21:1::0;23107:2;23087:18;;;23080:30;23146:29;23126:18;;;23119:57;23193:18;;91261:124:0::1;22866:351:1::0;91261:124:0::1;91402:25;20604:10:::0;89837:11:::1;:25::i;91402:::-;91463:16;::::0;:20:::1;::::0;91482:1:::1;91463:20;:::i;:::-;91444:16;:39:::0;91241:3;::::1;::::0;::::1;:::i;:::-;;;;91210:285;;;;61190:20:::0;60584:1;61710:7;:22;61527:213;61190:20;90869:633;:::o;87088:276::-;81572:24;20604:10;81697:130;:::i;81572:24::-;81550:119;;;;-1:-1:-1;;;81550:119:0;;19808:2:1;81550:119:0;;;19790:21:1;19847:2;19827:18;;;19820:30;-1:-1:-1;;;;;;;;;;;19866:18:1;;;19859:62;-1:-1:-1;;;19937:18:1;;;19930:43;19990:19;;81550:119:0;19606:409:1;81550:119:0;87244:13:::1;:28:::0;;;;87283:13:::1;:28:::0;87322:16:::1;:34:::0;87088:276::o;46655:185::-;46793:39;46810:4;46816:2;46820:7;46793:39;;;;;;;;;;;;:16;:39::i;97740:166::-;81572:24;20604:10;81697:130;:::i;81572:24::-;81550:119;;;;-1:-1:-1;;;81550:119:0;;19808:2:1;81550:119:0;;;19790:21:1;19847:2;19827:18;;;19820:30;-1:-1:-1;;;;;;;;;;;19866:18:1;;;19859:62;-1:-1:-1;;;19937:18:1;;;19930:43;19990:19;;81550:119:0;19606:409:1;81550:119:0;-1:-1:-1;;;;;97861:29:0;;::::1;;::::0;;;:12:::1;:29;::::0;;;;:37;97740:166::o;94436:500::-;81572:24;20604:10;81697:130;:::i;81572:24::-;81550:119;;;;-1:-1:-1;;;81550:119:0;;19808:2:1;81550:119:0;;;19790:21:1;19847:2;19827:18;;;19820:30;-1:-1:-1;;;;;;;;;;;19866:18:1;;;19859:62;-1:-1:-1;;;19937:18:1;;;19930:43;19990:19;;81550:119:0;19606:409:1;81550:119:0;94551:8;94539:9:::1;94577:352;94601:1;94597;:5;94577:352;;;94624:15;94642:8;;94651:1;94642:11;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;94668:13;94684:21:::0;;;:12:::1;:21:::0;;;;;;;;94642:11;;-1:-1:-1;;94724:9:0;;94720:198:::1;;94777:23;94795:5:::0;94777:15:::1;:23;:::i;:::-;94754:19;::::0;;;:10:::1;:19;::::0;;;;:46;;:19;;;:46:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;;94843:1:0::1;94819:21:::0;;;:12:::1;:21;::::0;;;;;:25;;;94868:34;94886:15:::1;::::0;94832:7;;94868:34:::1;::::0;94843:1;94868:34:::1;94720:198;94609:320;;94604:3;;;;:::i;:::-;;;94577:352;;87707:391:::0;81572:24;20604:10;81697:130;:::i;81572:24::-;81550:119;;;;-1:-1:-1;;;81550:119:0;;19808:2:1;81550:119:0;;;19790:21:1;19847:2;19827:18;;;19820:30;-1:-1:-1;;;;;;;;;;;19866:18:1;;;19859:62;-1:-1:-1;;;19937:18:1;;;19930:43;19990:19;;81550:119:0;19606:409:1;81550:119:0;87904:12:::1;:26:::0;;88021:13:::1;:28:::0;;-1:-1:-1;;88021:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;;87941:26:0;;;87904;::::1;;-1:-1:-1::0;;87941:26:0;;;;;87904::::1;87941::::0;::::1;;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;88060:30:0;87978:32;;::::1;;::::0;;;::::1;-1:-1:-1::0;;88060:30:0;;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;87707:391::o;43853:125::-;43917:7;43944:21;43957:7;43944:12;:21::i;:::-;:26;;43853:125;-1:-1:-1;;43853:125:0:o;81697:130::-;-1:-1:-1;;;;;80621:29:0;;81764:4;80621:29;;;:12;;:29;:12;:29;;;;;81788:31;80494:164;41299:206;41363:7;-1:-1:-1;;;;;41387:19:0;;41383:60;;41415:28;;;;;;;;;;;;;;41383:60;-1:-1:-1;;;;;;41469:19:0;;;;;:12;:19;;;;;:27;;;;41299:206::o;72625:103::-;71870:13;:11;:13::i;:::-;72690:30:::1;72717:1;72690:18;:30::i;:::-;72625:103::o:0;85366:228::-;81572:24;20604:10;81697:130;:::i;81572:24::-;81550:119;;;;-1:-1:-1;;;81550:119:0;;19808:2:1;81550:119:0;;;19790:21:1;19847:2;19827:18;;;19820:30;-1:-1:-1;;;;;;;;;;;19866:18:1;;;19859:62;-1:-1:-1;;;19937:18:1;;;19930:43;19990:19;;81550:119:0;19606:409:1;81550:119:0;85499:18:::1;:38:::0;;;;85548:18:::1;:38:::0;85366:228::o;85602:535::-;85739:19;85760;85809:145;85842:14;;85809:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;85871:18:0;;85914:28;;-1:-1:-1;;85931:10:0;22420:2:1;22416:15;22412:53;85914:28:0;;;22400:66:1;85871:18:0;;-1:-1:-1;22482:12:1;;;-1:-1:-1;85914:28:0;22271:229:1;85809:145:0;85792:162;;85984:145;86017:14;;85984:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;86046:18:0;;86089:28;;-1:-1:-1;;86106:10:0;22420:2:1;22416:15;22412:53;86089:28:0;;;22400:66:1;86046:18:0;;-1:-1:-1;22482:12:1;;;-1:-1:-1;86089:28:0;22271:229:1;85984:145:0;85967:162;;85602:535;;;;;;;:::o;44214:104::-;44270:13;44303:7;44296:14;;;;;:::i;81952:120::-;81572:24;20604:10;81697:130;:::i;81572:24::-;81550:119;;;;-1:-1:-1;;;81550:119:0;;19808:2:1;81550:119:0;;;19790:21:1;19847:2;19827:18;;;19820:30;-1:-1:-1;;;;;;;;;;;19866:18:1;;;19859:62;-1:-1:-1;;;19937:18:1;;;19930:43;19990:19;;81550:119:0;19606:409:1;81550:119:0;82030:34:::1;80459:26;82056:7;82030:10;:34::i;94986:305::-:0;20604:10;95123:16;95131:7;95123;:16::i;:::-;-1:-1:-1;;;;;95123:32:0;;95115:66;;;;-1:-1:-1;;;95115:66:0;;19318:2:1;95115:66:0;;;19300:21:1;19357:2;19337:18;;;19330:30;-1:-1:-1;;;19376:18:1;;;19369:51;19437:18;;95115:66:0;19116:345:1;95115:66:0;95208:1;95192:13;:17;95220:35;95237:4;95243:2;95247:7;95220:16;:35::i;:::-;-1:-1:-1;;95282:1:0;95266:13;:17;-1:-1:-1;94986:305:0:o;95814:100::-;81572:24;20604:10;81697:130;:::i;81572:24::-;81550:119;;;;-1:-1:-1;;;81550:119:0;;19808:2:1;81550:119:0;;;19790:21:1;19847:2;19827:18;;;19820:30;-1:-1:-1;;;;;;;;;;;19866:18:1;;;19859:62;-1:-1:-1;;;19937:18:1;;;19930:43;19990:19;;81550:119:0;19606:409:1;81550:119:0;95888:8:::1;:18;95899:7:::0;95888:8;:18:::1;:::i;:::-;;95814:100:::0;:::o;45825:287::-;20604:10;-1:-1:-1;;;;;45924:24:0;;;45920:54;;45957:17;;;;;;;;;;;;;;45920:54;20604:10;45987:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;45987:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;45987:53:0;;;;;;;;;;46056:48;;586:41:1;;;45987:42:0;;20604:10;46056:48;;559:18:1;46056:48:0;;;;;;;45825:287;;:::o;77096:132::-;77205:14;;77143:13;;77176:44;;77205:14;;77176:28;:44::i;:::-;77169:51;;77096:132;:::o;84433:510::-;84485:7;20604:10;84527:21;84540:7;84527:12;:21::i;:::-;:26;-1:-1:-1;;;;;84527:42:0;;84505:113;;;;-1:-1:-1;;;84505:113:0;;19318:2:1;84505:113:0;;;19300:21:1;19357:2;19337:18;;;19330:30;-1:-1:-1;;;19376:18:1;;;19369:51;19437:18;;84505:113:0;19116:345:1;84505:113:0;84660:22;;84712:26;;;84769:14;;84643:201;;;;;-1:-1:-1;;;;;84712:26:0;;;84643:201;;;25884:34:1;84629:11:0;25934:18:1;;;25927:34;;;25977:18;;;25970:34;;;;84806:4:0;26020:18:1;;;26013:43;26072:19;;;26065:35;;;84629:11:0;;84660:22;;84643:54;;25795:19:1;;84643:201:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;84885:28;;84855:59;;;;;-1:-1:-1;;;;;84885:28:0;;;84855:59;;;1907:74:1;84629:215:0;;-1:-1:-1;84855:29:0;;;;;1880:18:1;;84855:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;84932:3:0;;84433:510;-1:-1:-1;;;;;84433:510:0:o;100970:274::-;101088:9;101083:154;101107:8;:15;101103:1;:19;101083:154;;;101144:15;101162:8;101171:1;101162:11;;;;;;;;:::i;:::-;;;;;;;101144:29;;101188:37;101201:10;101213:2;101217:7;101188:12;:37::i;:::-;-1:-1:-1;101124:3:0;;;;:::i;:::-;;;;101083:154;;93823:605;93901:8;93889:9;93927:494;93951:1;93947;:5;93927:494;;;93974:15;93992:8;;94001:1;93992:11;;;;;;;:::i;:::-;;;;;;;93974:29;;94074:12;20604:10;;20524:98;94074:12;-1:-1:-1;;;;;94044:42:0;:21;94057:7;94044:12;:21::i;:::-;:26;-1:-1:-1;;;;;94044:42:0;;94018:125;;;;-1:-1:-1;;;94018:125:0;;19318:2:1;94018:125:0;;;19300:21:1;19357:2;19337:18;;;19330:30;-1:-1:-1;;;19376:18:1;;;19369:51;19437:18;;94018:125:0;19116:345:1;94018:125:0;94160:13;94176:21;;;:12;:21;;;;;;94216:9;;94212:198;;94269:23;94287:5;94269:15;:23;:::i;:::-;94246:19;;;;:10;:19;;;;;:46;;:19;;;:46;;;;;:::i;:::-;;;;-1:-1:-1;;94335:1:0;94311:21;;;:12;:21;;;;;;:25;;;94360:34;94378:15;;94324:7;;94360:34;;94335:1;94360:34;94212:198;93959:462;;93954:3;;;;:::i;:::-;;;93927:494;;97445:122;81572:24;20604:10;81697:130;:::i;81572:24::-;81550:119;;;;-1:-1:-1;;;81550:119:0;;19808:2:1;81550:119:0;;;19790:21:1;19847:2;19827:18;;;19820:30;-1:-1:-1;;;;;;;;;;;19866:18:1;;;19859:62;-1:-1:-1;;;19937:18:1;;;19930:43;19990:19;;81550:119:0;19606:409:1;81550:119:0;97527:15:::1;:32:::0;97445:122::o;92457:342::-;92534:12;92607:21;;;:12;:21;;;;;;92534:12;;;;92643:10;;92639:105;;92680:4;;-1:-1:-1;92709:23:0;92727:5;92709:15;:23;:::i;:::-;92699:33;;92639:105;92772:19;;;;:10;:19;;;;;;92762:29;;:7;:29;:::i;:::-;92457:342;;;;-1:-1:-1;;;92457:342:0:o;46911:370::-;47078:28;47088:4;47094:2;47098:7;47078:9;:28::i;:::-;-1:-1:-1;;;;;47121:13:0;;12066:19;:23;47117:157;;47142:56;47173:4;47179:2;47183:7;47192:5;47142:30;:56::i;:::-;47138:136;;47222:40;;-1:-1:-1;;;47222:40:0;;;;;;;;;;;89939:922;61146:21;:19;:21::i;:::-;90084:1:::1;90075:5;:10;;90067:57;;;::::0;-1:-1:-1;;;90067:57:0;;21143:2:1;90067:57:0::1;::::0;::::1;21125:21:1::0;21182:2;21162:18;;;21155:30;21221:34;21201:18;;;21194:62;-1:-1:-1;;;21272:18:1;;;21265:32;21314:19;;90067:57:0::1;20941:398:1::0;90067:57:0::1;90188:5;90172:13;;:21;;;;:::i;:::-;90159:9;:34;90137:118;;;::::0;-1:-1:-1;;;90137:118:0;;21719:2:1;90137:118:0::1;::::0;::::1;21701:21:1::0;21758:2;21738:18;;;21731:30;21797:34;21777:18;;;21770:62;-1:-1:-1;;;21848:18:1;;;21841:32;21890:19;;90137:118:0::1;21517:398:1::0;90137:118:0::1;90276:12;::::0;::::1;::::0;::::1;;;90268:47;;;::::0;-1:-1:-1;;;90268:47:0;;22122:2:1;90268:47:0::1;::::0;::::1;22104:21:1::0;22161:2;22141:18;;;22134:30;22200:24;22180:18;;;22173:52;22242:18;;90268:47:0::1;21920:346:1::0;90268:47:0::1;90350:158;90387:11;;90350:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;90417:18:0::1;::::0;90464:28:::1;::::0;-1:-1:-1;;90481:10:0::1;22420:2:1::0;22416:15;22412:53;90464:28:0::1;::::0;::::1;22400:66:1::0;90417:18:0;;-1:-1:-1;22482:12:1;;;-1:-1:-1;90464:28:0::1;22271:229:1::0;90350:158:0::1;90328:240;;;::::0;-1:-1:-1;;;90328:240:0;;22707:2:1;90328:240:0::1;::::0;::::1;22689:21:1::0;;;22726:18;;;22719:30;22785:34;22765:18;;;22758:62;22837:18;;90328:240:0::1;22505:356:1::0;90328:240:0::1;90586:9;90581:273;90605:5;90601:1;:9;90581:273;;;90674:13;;90658;;:29;90632:118;;;::::0;-1:-1:-1;;;90632:118:0;;23068:2:1;90632:118:0::1;::::0;::::1;23050:21:1::0;23107:2;23087:18;;;23080:30;23146:29;23126:18;;;23119:57;23193:18;;90632:118:0::1;22866:351:1::0;90632:118:0::1;90767:25;20604:10:::0;89837:11:::1;:25::i;90767:::-;90825:13;::::0;:17:::1;::::0;90841:1:::1;90825:17;:::i;:::-;90809:13;:33:::0;90612:3;::::1;::::0;::::1;:::i;:::-;;;;90581:273;;76936:152:::0;76982:13;77029:17;;;;;;;;;;;;;;;;;77053:14;;77048:31;;77053:14;;77048:20;;;;;;;;:::i;:::-;:29;:31::i;:::-;77015:65;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77008:72;;76936:152;:::o;95922:202::-;96003:13;96073:8;96088:17;96097:7;96088:8;:17::i;:::-;96056:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;96029:87;;95922:202;;;:::o;91510:792::-;81572:24;20604:10;81697:130;:::i;81572:24::-;81550:119;;;;-1:-1:-1;;;81550:119:0;;19808:2:1;81550:119:0;;;19790:21:1;19847:2;19827:18;;;19820:30;-1:-1:-1;;;;;;;;;;;19866:18:1;;;19859:62;-1:-1:-1;;;19937:18:1;;;19930:43;19990:19;;81550:119:0;19606:409:1;81550:119:0;91688:7:::1;:14;91666:11;:18;:36;91644:146;;;::::0;-1:-1:-1;;;91644:146:0;;28586:2:1;91644:146:0::1;::::0;::::1;28568:21:1::0;28625:2;28605:18;;;28598:30;28664:34;28644:18;;;28637:62;28735:30;28715:18;;;28708:58;28783:19;;91644:146:0::1;28384:424:1::0;91644:146:0::1;91818:18:::0;;91803:12:::1;91847:448;91869:4;91864:2;:9;91847:448;;;91896:10;91909:11;91921:2;91909:15;;;;;;;;:::i;:::-;;;;;;;91896:28;;91939:14;91956:7;91964:2;91956:11;;;;;;;;:::i;:::-;;;;;;;91939:28;;91989:9;91984:300;92008:6;92004:1;:10;91984:300;;;92085:12;;92070;;:27;92040:139;;;::::0;-1:-1:-1;;;92040:139:0;;29015:2:1;92040:139:0::1;::::0;::::1;28997:21:1::0;29054:2;29034:18;;;29027:30;29093:34;29073:18;;;29066:62;-1:-1:-1;;;29144:18:1;;;29137:36;29190:19;;92040:139:0::1;28813:402:1::0;92040:139:0::1;92200:16;92210:2;92214:1;92200:9;:16::i;:::-;92252:12;::::0;:16:::1;::::0;92267:1:::1;92252:16;:::i;:::-;92237:12;:31:::0;92016:3;::::1;::::0;::::1;:::i;:::-;;;;91984:300;;;;91881:414;;91875:4;;;;;:::i;:::-;;;;91847:448;;92969:90:::0;81572:24;20604:10;81697:130;:::i;81572:24::-;81550:119;;;;-1:-1:-1;;;81550:119:0;;19808:2:1;81550:119:0;;;19790:21:1;19847:2;19827:18;;;19820:30;-1:-1:-1;;;;;;;;;;;19866:18:1;;;19859:62;-1:-1:-1;;;19937:18:1;;;19930:43;19990:19;;81550:119:0;19606:409:1;81550:119:0;93035:9:::1;:16:::0;;-1:-1:-1;;93035:16:0::1;::::0;::::1;;::::0;;;::::1;::::0;;92969:90::o;92310:139::-;-1:-1:-1;;;;;92419:22:0;;92372:7;92419:22;;;:16;:22;;;;;;92399:17;;:42;;92419:22;92399:42;:::i;98420:2344::-;61146:21;:19;:21::i;:::-;98634:8:::1;:15;98614:9;:16;:35;98592:145;;;::::0;-1:-1:-1;;;98592:145:0;;29422:2:1;98592:145:0::1;::::0;::::1;29404:21:1::0;29461:2;29441:18;;;29434:30;29500:34;29480:18;;;29473:62;29571:30;29551:18;;;29544:58;29619:19;;98592:145:0::1;29220:424:1::0;98592:145:0::1;98791:6;:13;98772:8;:15;:32;98750:139;;;::::0;-1:-1:-1;;;98750:139:0;;29851:2:1;98750:139:0::1;::::0;::::1;29833:21:1::0;29890:2;29870:18;;;29863:30;29929:34;29909:18;;;29902:62;30000:27;29980:18;;;29973:55;30045:19;;98750:139:0::1;29649:421:1::0;98750:139:0::1;98910:14;::::0;;;::::1;;;98902:49;;;::::0;-1:-1:-1;;;98902:49:0;;30277:2:1;98902:49:0::1;::::0;::::1;30259:21:1::0;30316:2;30296:18;;;30289:30;30355:24;30335:18;;;30328:52;30397:18;;98902:49:0::1;30075:346:1::0;98902:49:0::1;98964:22;99006:9:::0;99001:116:::1;99025:8;:15;99021:1;:19;99001:116;;;99096:6;99103:1;99096:9;;;;;;;;:::i;:::-;;;;;;;99079:14;:26;;;;:::i;:::-;99062:43:::0;-1:-1:-1;99042:3:0;::::1;::::0;::::1;:::i;:::-;;;;99001:116;;;;99154:2;99137:14;:19;99129:53;;;::::0;-1:-1:-1;;;99129:53:0;;30628:2:1;99129:53:0::1;::::0;::::1;30610:21:1::0;30667:2;30647:18;;;30640:30;30706:23;30686:18;;;30679:51;30747:18;;99129:53:0::1;30426:345:1::0;99129:53:0::1;99248:14;99230:15;;:32;;;;:::i;:::-;99217:9;:45;99195:129;;;::::0;-1:-1:-1;;;99195:129:0;;30978:2:1;99195:129:0::1;::::0;::::1;30960:21:1::0;31017:2;30997:18;;;30990:30;31056:34;31036:18;;;31029:62;-1:-1:-1;;;31107:18:1;;;31100:32;31149:19;;99195:129:0::1;30776:398:1::0;99195:129:0::1;99342:9;99337:1420;99361:8;:15;99357:1;:19;99337:1420;;;99398:23;99424:9;99434:1;99424:12;;;;;;;;:::i;:::-;;;;;;;99398:38;;99451:15;99469:8;99478:1;99469:11;;;;;;;;:::i;:::-;;;;;;;99451:29;;99495:17;99515:6;99522:1;99515:9;;;;;;;;:::i;:::-;;;;;;;99495:29;;99612:10;-1:-1:-1::0;;;;;99567:55:0::1;99575:15;-1:-1:-1::0;;;;;99567:32:0::1;;99600:7;99567:41;;;;;;;;;;;;;784:25:1::0;;772:2;757:18;;638:177;99567:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;99567:55:0::1;;99541:137;;;::::0;-1:-1:-1;;;99541:137:0;;31381:2:1;99541:137:0::1;::::0;::::1;31363:21:1::0;31420:2;31400:18;;;31393:30;31459:22;31439:18;;;31432:50;31499:18;;99541:137:0::1;31179:344:1::0;99541:137:0::1;-1:-1:-1::0;;;;;99721:29:0;::::1;99753:1;99721:29:::0;;;:12:::1;:29;::::0;;;;;99695:127:::1;;;::::0;-1:-1:-1;;;99695:127:0;;31730:2:1;99695:127:0::1;::::0;::::1;31712:21:1::0;;;31749:18;;;31742:30;31808:34;31788:18;;;31781:62;31860:18;;99695:127:0::1;31528:356:1::0;99695:127:0::1;-1:-1:-1::0;;;;;99945:29:0;::::1;;::::0;;;:12:::1;:29;::::0;;;;;;;;99865:17:::1;:34:::0;;;;;:43;;;;;;;;;;:55:::1;::::0;99911:9;;99865:55:::1;:::i;:::-;:109;;99839:212;;;::::0;-1:-1:-1;;;99839:212:0;;32091:2:1;99839:212:0::1;::::0;::::1;32073:21:1::0;32130:2;32110:18;;;32103:30;32169:34;32149:18;;;32142:62;32240:11;32220:18;;;32213:39;32269:19;;99839:212:0::1;31889:405:1::0;99839:212:0::1;100122:12;;100109:9;100094:12;;:24;;;;:::i;:::-;:40;;100068:140;;;::::0;-1:-1:-1;;;100068:140:0;;32501:2:1;100068:140:0::1;::::0;::::1;32483:21:1::0;32540:2;32520:18;;;32513:30;32579:34;32559:18;;;32552:62;-1:-1:-1;;;32630:18:1;;;32623:36;32676:19;;100068:140:0::1;32299:402:1::0;100068:140:0::1;100282:15;;100269:9;100251:15;;:27;;;;:::i;:::-;:46;;100225:135;;;::::0;-1:-1:-1;;;100225:135:0;;32908:2:1;100225:135:0::1;::::0;::::1;32890:21:1::0;32947:2;32927:18;;;32920:30;32986:29;32966:18;;;32959:57;33033:18;;100225:135:0::1;32706:351:1::0;100225:135:0::1;100382:9;100377:99;100401:9;100397:1;:13;100377:99;;;100436:24;100446:10;100458:1;100436:9;:24::i;:::-;100412:3:::0;::::1;::::0;::::1;:::i;:::-;;;;100377:99;;;;100528:9;100510:15;;:27;;;;:::i;:::-;100492:15;:45:::0;100569:12:::1;::::0;:24:::1;::::0;100584:9;;100569:24:::1;:::i;:::-;100554:12;:39:::0;-1:-1:-1;;;;;100673:34:0;::::1;;::::0;;;:17:::1;:34;::::0;;;;;;;:43;;;;;;;;;:72:::1;::::0;100736:9;;100673:72:::1;:::i;:::-;-1:-1:-1::0;;;;;100610:34:0;;::::1;;::::0;;;:17:::1;:34;::::0;;;;;;;:43;;;;;;;;;;:135;;;;-1:-1:-1;99378:3:0;::::1;::::0;::::1;:::i;:::-;;;;99337:1420;;;;98581:2183;61190:20:::0;60584:1;61710:7;:22;61527:213;72883:201;71870:13;:11;:13::i;:::-;-1:-1:-1;;;;;72972:22:0;::::1;72964:73;;;::::0;-1:-1:-1;;;72964:73:0;;33264:2:1;72964:73:0::1;::::0;::::1;33246:21:1::0;33303:2;33283:18;;;33276:30;33342:34;33322:18;;;33315:62;33413:8;33393:18;;;33386:36;33439:19;;72964:73:0::1;33062:402:1::0;72964:73:0::1;73048:28;73067:8;73048:18;:28::i;82080:124::-:0;81572:24;20604:10;81697:130;:::i;81572:24::-;81550:119;;;;-1:-1:-1;;;81550:119:0;;19808:2:1;81550:119:0;;;19790:21:1;19847:2;19827:18;;;19820:30;-1:-1:-1;;;;;;;;;;;19866:18:1;;;19859:62;-1:-1:-1;;;19937:18:1;;;19930:43;19990:19;;81550:119:0;19606:409:1;81550:119:0;82161:35:::1;80459:26;82188:7;82161:11;:35::i;77266:235::-:0;77359:4;-1:-1:-1;;;;;;77396:44:0;;77411:29;77396:44;;:97;;;77457:36;77481:11;77457:23;:36::i;47536:174::-;47593:4;47657:13;;47647:7;:23;47617:85;;;;-1:-1:-1;;47675:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;47675:27:0;;;;47674:28;;47536:174::o;56758:196::-;56873:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;56873:29:0;-1:-1:-1;;;;;56873:29:0;;;;;;;;;56918:28;;56873:24;;56918:28;;;;;;;56758:196;;;:::o;42680:1111::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;42791:7:0;42876:13;;42869:4;:20;42865:859;;;42910:31;42944:17;;;:11;:17;;;;;;;;;42910:51;;;;;;;;;-1:-1:-1;;;;;42910:51:0;;;;-1:-1:-1;;;42910:51:0;;;;;;;;;;;-1:-1:-1;;;42910:51:0;;;;;;;;;;;;;;42980:729;;43030:14;;-1:-1:-1;;;;;43030:28:0;;43026:101;;43094:9;42680:1111;-1:-1:-1;;;42680:1111:0:o;43026:101::-;-1:-1:-1;;;43469:6:0;43514:17;;;;:11;:17;;;;;;;;;43502:29;;;;;;;;;-1:-1:-1;;;;;43502:29:0;;;;;-1:-1:-1;;;43502:29:0;;;;;;;;;;;-1:-1:-1;;;43502:29:0;;;;;;;;;;;;;43562:28;43558:109;;43630:9;42680:1111;-1:-1:-1;;;42680:1111:0:o;43558:109::-;43429:261;;;42891:833;42865:859;43752:31;;;;;;;;;;;;;;61226:293;60628:1;61360:7;;:19;61352:63;;;;-1:-1:-1;;;61352:63:0;;33671:2:1;61352:63:0;;;33653:21:1;33710:2;33690:18;;;33683:30;33749:33;33729:18;;;33722:61;33800:18;;61352:63:0;33469:355:1;61352:63:0;60628:1;61493:7;:18;61226:293::o;62402:156::-;62493:4;62546;62517:25;62530:5;62537:4;62517:12;:25::i;:::-;:33;;62402:156;-1:-1:-1;;;;62402:156:0:o;88564:437::-;88662:17;;-1:-1:-1;;;;;88639:20:0;;;;;;:16;:20;;;;;;:40;88617:117;;;;-1:-1:-1;;;88617:117:0;;34031:2:1;88617:117:0;;;34013:21:1;34070:2;34050:18;;;34043:30;34109:29;34089:18;;;34082:57;34156:18;;88617:117:0;33829:351:1;88617:117:0;88782:12;;88767;;:27;88745:115;;;;-1:-1:-1;;;88745:115:0;;29015:2:1;88745:115:0;;;28997:21:1;29054:2;29034:18;;;29027:30;29093:34;29073:18;;;29066:62;-1:-1:-1;;;29144:18:1;;;29137:36;29190:19;;88745:115:0;28813:402:1;88745:115:0;88873:16;88883:2;88887:1;88873:9;:16::i;:::-;-1:-1:-1;;;;;88925:20:0;;;;;;:16;:20;;;;;;:24;;88948:1;88925:24;:::i;:::-;-1:-1:-1;;;;;88902:20:0;;;;;;:16;:20;;;;;:47;88977:12;;:16;;88992:1;88977:16;:::i;:::-;88962:12;:31;-1:-1:-1;88564:437:0:o;51706:2130::-;51821:35;51859:21;51872:7;51859:12;:21::i;:::-;51821:59;;51919:4;-1:-1:-1;;;;;51897:26:0;:13;:18;;;-1:-1:-1;;;;;51897:26:0;;51893:67;;51932:28;;;;;;;;;;;;;;51893:67;51973:22;20604:10;-1:-1:-1;;;;;51999:20:0;;;;:73;;-1:-1:-1;52036:36:0;52053:4;20604:10;46183:164;:::i;52036:36::-;51999:126;;;-1:-1:-1;20604:10:0;52089:20;52101:7;52089:11;:20::i;:::-;-1:-1:-1;;;;;52089:36:0;;51999:126;51973:153;;52144:17;52139:66;;52170:35;;;;;;;;;;;;;;52139:66;-1:-1:-1;;;;;52220:16:0;;52216:52;;52245:23;;;;;;;;;;;;;;52216:52;52281:43;52303:4;52309:2;52313:7;52322:1;52281:21;:43::i;:::-;52389:35;52406:1;52410:7;52419:4;52389:8;:35::i;:::-;-1:-1:-1;;;;;52720:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;52720:31:0;;;;;;;-1:-1:-1;;52720:31:0;;;;;;;52766:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;52766:29:0;;;;;;;;;;;52846:20;;;:11;:20;;;;;;52881:18;;-1:-1:-1;;;;;;52914:49:0;;;;-1:-1:-1;;;52947:15:0;52914:49;;;;;;;;;;53237:11;;53297:24;;;;;53340:13;;52846:20;;53297:24;;53340:13;53336:384;;53550:13;;53535:11;:28;53531:174;;53588:20;;53657:28;;;;53631:54;;-1:-1:-1;;;53631:54:0;-1:-1:-1;;;;;;53631:54:0;;;-1:-1:-1;;;;;53588:20:0;;53631:54;;;;53531:174;52695:1036;;;53767:7;53763:2;-1:-1:-1;;;;;53748:27:0;53757:4;-1:-1:-1;;;;;53748:27:0;;;;;;;;;;;51810:2026;;51706:2130;;;:::o;72149:132::-;72057:6;;-1:-1:-1;;;;;72057:6:0;20604:10;72213:23;72205:68;;;;-1:-1:-1;;;72205:68:0;;34387:2:1;72205:68:0;;;34369:21:1;;;34406:18;;;34399:30;34465:34;34445:18;;;34438:62;34517:18;;72205:68:0;34185:356:1;73244:191:0;73337:6;;;-1:-1:-1;;;;;73354:17:0;;;-1:-1:-1;;73354:17:0;;;;;;;73387:40;;73337:6;;;73354:17;73337:6;;73387:40;;73318:16;;73387:40;73307:128;73244:191;:::o;80666:229::-;80597:4;80621:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;80621:29:0;;;;;;;;;;;;80736:152;;80780:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;80780:29:0;;;;;;;;;:36;;-1:-1:-1;;80780:36:0;80812:4;80780:36;;;80863:12;20604:10;;20524:98;80863:12;-1:-1:-1;;;;;80836:40:0;80854:7;-1:-1:-1;;;;;80836:40:0;80848:4;80836:40;;;;;;;;;;80666:229;;:::o;77509:606::-;77602:13;77662:1;77642:15;77636:22;;;;;;;;:::i;:::-;:27;;;;77628:36;;;;;;77704:15;77679:40;;;;;;;;:::i;:::-;:21;:40;77675:61;;-1:-1:-1;;77721:15:0;;;;;;;;;;;;;;;;;;77509:606::o;77675:61::-;77779:15;77751:43;;;;;;;;:::i;:::-;:24;:43;77747:67;;-1:-1:-1;;77796:18:0;;;;;;;;;;;;;;;;;;77509:606::o;77747:67::-;77858:15;77829:44;;;;;;;;:::i;:::-;:25;:44;77825:69;;-1:-1:-1;;77875:19:0;;;;;;;;;;;;;;;;;;77509:606::o;77825:69::-;77946:15;77909:52;;;;;;;;:::i;:::-;:33;:52;77905:85;;-1:-1:-1;;77963:27:0;;;;;;;;;;;;;;;;;;77509:606::o;77905:85::-;78032:15;78005:42;;;;;;;;:::i;:::-;:23;:42;78001:106;;-1:-1:-1;;78049:17:0;;;;;;;;;;;;;;;;;;77509:606::o;78001:106::-;-1:-1:-1;;78082:25:0;;;;;;;;;;;;;;;;;;77509:606::o;57446:667::-;57630:72;;-1:-1:-1;;;57630:72:0;;57609:4;;-1:-1:-1;;;;;57630:36:0;;;;;:72;;20604:10;;57681:4;;57687:7;;57696:5;;57630:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57630:72:0;;;;;;;;-1:-1:-1;;57630:72:0;;;;;;;;;;;;:::i;:::-;;;57626:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57864:6;:13;57881:1;57864:18;57860:235;;57910:40;;-1:-1:-1;;;57910:40:0;;;;;;;;;;;57860:235;58053:6;58047:13;58038:6;58034:2;58030:15;58023:38;57626:480;-1:-1:-1;;;;;;57749:55:0;-1:-1:-1;;;57749:55:0;;-1:-1:-1;57626:480:0;57446:667;;;;;;:::o;35389:716::-;35445:13;35496:14;35513:17;35524:5;35513:10;:17::i;:::-;35533:1;35513:21;35496:38;;35549:20;35583:6;35572:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35572:18:0;-1:-1:-1;35549:41:0;-1:-1:-1;35714:28:0;;;35730:2;35714:28;35771:288;-1:-1:-1;;35803:5:0;35945:8;35940:2;35929:14;;35924:30;35803:5;35911:44;36001:2;35992:11;;;-1:-1:-1;36022:21:0;35771:288;36022:21;-1:-1:-1;36080:6:0;35389:716;-1:-1:-1;;;35389:716:0:o;96779:532::-;96835:13;96865:5;96874:1;96865:10;96861:53;;-1:-1:-1;;96892:10:0;;;;;;;;;;;;;;;;;;96779:532::o;96861:53::-;96939:5;96924:12;96980:78;96987:9;;96980:78;;97013:8;;;;:::i;:::-;;-1:-1:-1;97036:10:0;;-1:-1:-1;97044:2:0;97036:10;;:::i;:::-;;;96980:78;;;97068:19;97100:6;97090:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;97090:17:0;;97068:39;;97118:154;97125:10;;97118:154;;97152:11;97162:1;97152:11;;:::i;:::-;;-1:-1:-1;97221:10:0;97229:2;97221:5;:10;:::i;:::-;97208:24;;:2;:24;:::i;:::-;97195:39;;97178:6;97185;97178:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;97249:11:0;97258:2;97249:11;;:::i;:::-;;;97118:154;;47794:104;47863:27;47873:2;47877:8;47863:27;;;;;;;;;;;;:9;:27::i;81023:230::-;80597:4;80621:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;80621:29:0;;;;;;;;;;;;81094:152;;;81169:5;81137:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;81137:29:0;;;;;;;;;;:37;;-1:-1:-1;;81137:37:0;;;81194:40;20604:10;;81137:12;;81194:40;;81169:5;81194:40;81023:230;;:::o;40930:305::-;41032:4;-1:-1:-1;;;;;;41069:40:0;;41084:25;41069:40;;:105;;-1:-1:-1;;;;;;;41126:48:0;;41141:33;41126:48;41069:105;:158;;;-1:-1:-1;38680:25:0;-1:-1:-1;;;;;;38665:40:0;;;41191:36;38556:157;63201:296;63284:7;63327:4;63284:7;63342:118;63366:5;:12;63362:1;:16;63342:118;;;63415:33;63425:12;63439:5;63445:1;63439:8;;;;;;;;:::i;:::-;;;;;;;63415:9;:33::i;:::-;63400:48;-1:-1:-1;63380:3:0;;;;:::i;:::-;;;;63342:118;;;-1:-1:-1;63477:12:0;63201:296;-1:-1:-1;;;63201:296:0:o;95299:507::-;95483:12;95465:15;95525:18;95535:8;95483:12;95525:18;:::i;:::-;95511:32;;95506:293;95555:3;95545:7;:13;95506:293;;;95612:21;;;;:12;:21;;;;;;:26;;:69;;;95663:13;;95680:1;95663:18;95612:69;:107;;;-1:-1:-1;95706:13:0;;;;95612:107;95586:201;;;;-1:-1:-1;;;95586:201:0;;35950:2:1;95586:201:0;;;35932:21:1;;;35969:18;;;35962:30;36028:34;36008:18;;;36001:62;36080:18;;95586:201:0;35748:356:1;95586:201:0;95560:9;;;:::i;:::-;;;95506:293;;;;95454:352;95299:507;;;;:::o;31066:948::-;31119:7;;31206:8;31197:17;;31193:106;;31244:8;31235:17;;;-1:-1:-1;31281:2:0;31271:12;31193:106;31326:8;31317:5;:17;31313:106;;31364:8;31355:17;;;-1:-1:-1;31401:2:0;31391:12;31313:106;31446:8;31437:5;:17;31433:106;;31484:8;31475:17;;;-1:-1:-1;31521:2:0;31511:12;31433:106;31566:7;31557:5;:16;31553:103;;31603:7;31594:16;;;-1:-1:-1;31639:1:0;31629:11;31553:103;31683:7;31674:5;:16;31670:103;;31720:7;31711:16;;;-1:-1:-1;31756:1:0;31746:11;31670:103;31800:7;31791:5;:16;31787:103;;31837:7;31828:16;;;-1:-1:-1;31873:1:0;31863:11;31787:103;31917:7;31908:5;:16;31904:68;;31955:1;31945:11;32000:6;31066:948;-1:-1:-1;;31066:948:0:o;48271:1749::-;48394:20;48417:13;-1:-1:-1;;;;;48445:16:0;;48441:48;;48470:19;;;;;;;;;;;;;;48441:48;48504:8;48516:1;48504:13;48500:44;;48526:18;;;;;;;;;;;;;;48500:44;48557:61;48587:1;48591:2;48595:12;48609:8;48557:21;:61::i;:::-;-1:-1:-1;;;;;48895:16:0;;;;;;:12;:16;;;;;;;;:44;;48954:49;;;48895:44;;;;;;;;48954:49;;;;-1:-1:-1;;48895:44:0;;;;;;48954:49;;;;;;;;;;;;;;;;49020:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;49070:66:0;;;-1:-1:-1;;;49120:15:0;49070:66;;;;;;;;;;;;;49020:25;;49217:23;;;;12066:19;:23;49257:631;;49297:313;49328:38;;49353:12;;-1:-1:-1;;;;;49328:38:0;;;49345:1;;49328:38;;49345:1;;49328:38;49394:69;49433:1;49437:2;49441:14;;;;;;49457:5;49394:30;:69::i;:::-;49389:174;;49499:40;;-1:-1:-1;;;49499:40:0;;;;;;;;;;;49389:174;49605:3;49590:12;:18;49297:313;;49691:12;49674:13;;:29;49670:43;;49705:8;;;49670:43;49257:631;;;49754:119;49785:40;;49810:14;;;;;-1:-1:-1;;;;;49785:40:0;;;49802:1;;49785:40;;49802:1;;49785:40;49868:3;49853:12;:18;49754:119;;49257:631;-1:-1:-1;49902:13:0;:28;;;49952:60;;49985:2;49989:12;50003:8;49952:60;:::i;70405:149::-;70468:7;70499:1;70495;:5;:51;;70630:13;70724:15;;;70760:4;70753:15;;;70807:4;70791:21;;70495:51;;;70630:13;70724:15;;;70760:4;70753:15;;;70807:4;70791:21;;70503:20;70562:268;14:177:1;-1:-1:-1;;;;;;92:5:1;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;820:250::-;905:1;915:113;929:6;926:1;923:13;915:113;;;1005:11;;;999:18;986:11;;;979:39;951:2;944:10;915:113;;;-1:-1:-1;;1062:1:1;1044:16;;1037:27;820:250::o;1075:271::-;1117:3;1155:5;1149:12;1182:6;1177:3;1170:19;1198:76;1267:6;1260:4;1255:3;1251:14;1244:4;1237:5;1233:16;1198:76;:::i;:::-;1328:2;1307:15;-1:-1:-1;;1303:29:1;1294:39;;;;1335:4;1290:50;;1075:271;-1:-1:-1;;1075:271:1:o;1351:220::-;1500:2;1489:9;1482:21;1463:4;1520:45;1561:2;1550:9;1546:18;1538:6;1520:45;:::i;1576:180::-;1635:6;1688:2;1676:9;1667:7;1663:23;1659:32;1656:52;;;1704:1;1701;1694:12;1656:52;-1:-1:-1;1727:23:1;;1576:180;-1:-1:-1;1576:180:1:o;1992:154::-;-1:-1:-1;;;;;2071:5:1;2067:54;2060:5;2057:65;2047:93;;2136:1;2133;2126:12;2151:315;2219:6;2227;2280:2;2268:9;2259:7;2255:23;2251:32;2248:52;;;2296:1;2293;2286:12;2248:52;2335:9;2322:23;2354:31;2379:5;2354:31;:::i;:::-;2404:5;2456:2;2441:18;;;;2428:32;;-1:-1:-1;;;2151:315:1:o;2471:367::-;2534:8;2544:6;2598:3;2591:4;2583:6;2579:17;2575:27;2565:55;;2616:1;2613;2606:12;2565:55;-1:-1:-1;2639:20:1;;2682:18;2671:30;;2668:50;;;2714:1;2711;2704:12;2668:50;2751:4;2743:6;2739:17;2727:29;;2811:3;2804:4;2794:6;2791:1;2787:14;2779:6;2775:27;2771:38;2768:47;2765:67;;;2828:1;2825;2818:12;2765:67;2471:367;;;;;:::o;2843:437::-;2929:6;2937;2990:2;2978:9;2969:7;2965:23;2961:32;2958:52;;;3006:1;3003;2996:12;2958:52;3046:9;3033:23;3079:18;3071:6;3068:30;3065:50;;;3111:1;3108;3101:12;3065:50;3150:70;3212:7;3203:6;3192:9;3188:22;3150:70;:::i;:::-;3239:8;;3124:96;;-1:-1:-1;2843:437:1;-1:-1:-1;;;;2843:437:1:o;3285:184::-;-1:-1:-1;;;3334:1:1;3327:88;3434:4;3431:1;3424:15;3458:4;3455:1;3448:15;3474:275;3545:2;3539:9;3610:2;3591:13;;-1:-1:-1;;3587:27:1;3575:40;;3645:18;3630:34;;3666:22;;;3627:62;3624:88;;;3692:18;;:::i;:::-;3728:2;3721:22;3474:275;;-1:-1:-1;3474:275:1:o;3754:183::-;3814:4;3847:18;3839:6;3836:30;3833:56;;;3869:18;;:::i;:::-;-1:-1:-1;3914:1:1;3910:14;3926:4;3906:25;;3754:183::o;3942:737::-;3996:5;4049:3;4042:4;4034:6;4030:17;4026:27;4016:55;;4067:1;4064;4057:12;4016:55;4103:6;4090:20;4129:4;4153:60;4169:43;4209:2;4169:43;:::i;:::-;4153:60;:::i;:::-;4247:15;;;4333:1;4329:10;;;;4317:23;;4313:32;;;4278:12;;;;4357:15;;;4354:35;;;4385:1;4382;4375:12;4354:35;4421:2;4413:6;4409:15;4433:217;4449:6;4444:3;4441:15;4433:217;;;4529:3;4516:17;4546:31;4571:5;4546:31;:::i;:::-;4590:18;;4628:12;;;;4466;;4433:217;;;-1:-1:-1;4668:5:1;3942:737;-1:-1:-1;;;;;;3942:737:1:o;4684:483::-;4777:6;4785;4838:2;4826:9;4817:7;4813:23;4809:32;4806:52;;;4854:1;4851;4844:12;4806:52;4894:9;4881:23;4927:18;4919:6;4916:30;4913:50;;;4959:1;4956;4949:12;4913:50;4982:61;5035:7;5026:6;5015:9;5011:22;4982:61;:::i;:::-;4972:71;;;5093:2;5082:9;5078:18;5065:32;5106:31;5131:5;5106:31;:::i;:::-;5156:5;5146:15;;;4684:483;;;;;:::o;5172:505::-;5267:6;5275;5283;5336:2;5324:9;5315:7;5311:23;5307:32;5304:52;;;5352:1;5349;5342:12;5304:52;5392:9;5379:23;5425:18;5417:6;5414:30;5411:50;;;5457:1;5454;5447:12;5411:50;5496:70;5558:7;5549:6;5538:9;5534:22;5496:70;:::i;:::-;5585:8;;5470:96;;-1:-1:-1;5667:2:1;5652:18;;;;5639:32;;5172:505;-1:-1:-1;;;;5172:505:1:o;5864:454::-;5959:6;5967;5975;5983;5991;6044:3;6032:9;6023:7;6019:23;6015:33;6012:53;;;6061:1;6058;6051:12;6012:53;-1:-1:-1;;6084:23:1;;;6154:2;6139:18;;6126:32;;-1:-1:-1;6205:2:1;6190:18;;6177:32;;6256:2;6241:18;;6228:32;;-1:-1:-1;6307:3:1;6292:19;6279:33;;-1:-1:-1;5864:454:1;-1:-1:-1;5864:454:1:o;6323:456::-;6400:6;6408;6416;6469:2;6457:9;6448:7;6444:23;6440:32;6437:52;;;6485:1;6482;6475:12;6437:52;6524:9;6511:23;6543:31;6568:5;6543:31;:::i;:::-;6593:5;-1:-1:-1;6650:2:1;6635:18;;6622:32;6663:33;6622:32;6663:33;:::i;:::-;6323:456;;6715:7;;-1:-1:-1;;;6769:2:1;6754:18;;;;6741:32;;6323:456::o;6784:598::-;6870:6;6878;6886;6894;6947:3;6935:9;6926:7;6922:23;6918:33;6915:53;;;6964:1;6961;6954:12;6915:53;7003:9;6990:23;7022:31;7047:5;7022:31;:::i;:::-;7072:5;-1:-1:-1;7129:2:1;7114:18;;7101:32;7142:33;7101:32;7142:33;:::i;:::-;7194:7;-1:-1:-1;7253:2:1;7238:18;;7225:32;7266:33;7225:32;7266:33;:::i;:::-;6784:598;;;;-1:-1:-1;7318:7:1;;7372:2;7357:18;7344:32;;-1:-1:-1;;6784:598:1:o;7387:316::-;7464:6;7472;7480;7533:2;7521:9;7512:7;7508:23;7504:32;7501:52;;;7549:1;7546;7539:12;7501:52;-1:-1:-1;;7572:23:1;;;7642:2;7627:18;;7614:32;;-1:-1:-1;7693:2:1;7678:18;;;7665:32;;7387:316;-1:-1:-1;7387:316:1:o;8176:118::-;8262:5;8255:13;8248:21;8241:5;8238:32;8228:60;;8284:1;8281;8274:12;8299:783;8379:6;8387;8395;8403;8411;8464:3;8452:9;8443:7;8439:23;8435:33;8432:53;;;8481:1;8478;8471:12;8432:53;8520:9;8507:23;8539:28;8561:5;8539:28;:::i;:::-;8586:5;-1:-1:-1;8643:2:1;8628:18;;8615:32;8656:30;8615:32;8656:30;:::i;:::-;8705:7;-1:-1:-1;8764:2:1;8749:18;;8736:32;8777:30;8736:32;8777:30;:::i;:::-;8826:7;-1:-1:-1;8885:2:1;8870:18;;8857:32;8898:30;8857:32;8898:30;:::i;:::-;8947:7;-1:-1:-1;9006:3:1;8991:19;;8978:33;9020:30;8978:33;9020:30;:::i;:::-;9069:7;9059:17;;;8299:783;;;;;;;;:::o;9087:247::-;9146:6;9199:2;9187:9;9178:7;9174:23;9170:32;9167:52;;;9215:1;9212;9205:12;9167:52;9254:9;9241:23;9273:31;9298:5;9273:31;:::i;9339:248::-;9407:6;9415;9468:2;9456:9;9447:7;9443:23;9439:32;9436:52;;;9484:1;9481;9474:12;9436:52;-1:-1:-1;;9507:23:1;;;9577:2;9562:18;;;9549:32;;-1:-1:-1;9339:248:1:o;9592:773::-;9714:6;9722;9730;9738;9791:2;9779:9;9770:7;9766:23;9762:32;9759:52;;;9807:1;9804;9797:12;9759:52;9847:9;9834:23;9876:18;9917:2;9909:6;9906:14;9903:34;;;9933:1;9930;9923:12;9903:34;9972:70;10034:7;10025:6;10014:9;10010:22;9972:70;:::i;:::-;10061:8;;-1:-1:-1;9946:96:1;-1:-1:-1;10149:2:1;10134:18;;10121:32;;-1:-1:-1;10165:16:1;;;10162:36;;;10194:1;10191;10184:12;10162:36;;10233:72;10297:7;10286:8;10275:9;10271:24;10233:72;:::i;:::-;9592:773;;;;-1:-1:-1;10324:8:1;-1:-1:-1;;;;9592:773:1:o;11039:315::-;11107:6;11115;11168:2;11156:9;11147:7;11143:23;11139:32;11136:52;;;11184:1;11181;11174:12;11136:52;11220:9;11207:23;11197:33;;11280:2;11269:9;11265:18;11252:32;11293:31;11318:5;11293:31;:::i;11359:407::-;11424:5;11458:18;11450:6;11447:30;11444:56;;;11480:18;;:::i;:::-;11518:57;11563:2;11542:15;;-1:-1:-1;;11538:29:1;11569:4;11534:40;11518:57;:::i;:::-;11509:66;;11598:6;11591:5;11584:21;11638:3;11629:6;11624:3;11620:16;11617:25;11614:45;;;11655:1;11652;11645:12;11614:45;11704:6;11699:3;11692:4;11685:5;11681:16;11668:43;11758:1;11751:4;11742:6;11735:5;11731:18;11727:29;11720:40;11359:407;;;;;:::o;11771:451::-;11840:6;11893:2;11881:9;11872:7;11868:23;11864:32;11861:52;;;11909:1;11906;11899:12;11861:52;11949:9;11936:23;11982:18;11974:6;11971:30;11968:50;;;12014:1;12011;12004:12;11968:50;12037:22;;12090:4;12082:13;;12078:27;-1:-1:-1;12068:55:1;;12119:1;12116;12109:12;12068:55;12142:74;12208:7;12203:2;12190:16;12185:2;12181;12177:11;12142:74;:::i;12227:382::-;12292:6;12300;12353:2;12341:9;12332:7;12328:23;12324:32;12321:52;;;12369:1;12366;12359:12;12321:52;12408:9;12395:23;12427:31;12452:5;12427:31;:::i;:::-;12477:5;-1:-1:-1;12534:2:1;12519:18;;12506:32;12547:30;12506:32;12547:30;:::i;13456:662::-;13510:5;13563:3;13556:4;13548:6;13544:17;13540:27;13530:55;;13581:1;13578;13571:12;13530:55;13617:6;13604:20;13643:4;13667:60;13683:43;13723:2;13683:43;:::i;13667:60::-;13761:15;;;13847:1;13843:10;;;;13831:23;;13827:32;;;13792:12;;;;13871:15;;;13868:35;;;13899:1;13896;13889:12;13868:35;13935:2;13927:6;13923:15;13947:142;13963:6;13958:3;13955:15;13947:142;;;14029:17;;14017:30;;14067:12;;;;13980;;13947:142;;14123:483;14216:6;14224;14277:2;14265:9;14256:7;14252:23;14248:32;14245:52;;;14293:1;14290;14283:12;14245:52;14332:9;14319:23;14351:31;14376:5;14351:31;:::i;:::-;14401:5;-1:-1:-1;14457:2:1;14442:18;;14429:32;14484:18;14473:30;;14470:50;;;14516:1;14513;14506:12;14470:50;14539:61;14592:7;14583:6;14572:9;14568:22;14539:61;:::i;:::-;14529:71;;;14123:483;;;;;:::o;14945:795::-;15040:6;15048;15056;15064;15117:3;15105:9;15096:7;15092:23;15088:33;15085:53;;;15134:1;15131;15124:12;15085:53;15173:9;15160:23;15192:31;15217:5;15192:31;:::i;:::-;15242:5;-1:-1:-1;15299:2:1;15284:18;;15271:32;15312:33;15271:32;15312:33;:::i;:::-;15364:7;-1:-1:-1;15418:2:1;15403:18;;15390:32;;-1:-1:-1;15473:2:1;15458:18;;15445:32;15500:18;15489:30;;15486:50;;;15532:1;15529;15522:12;15486:50;15555:22;;15608:4;15600:13;;15596:27;-1:-1:-1;15586:55:1;;15637:1;15634;15627:12;15586:55;15660:74;15726:7;15721:2;15708:16;15703:2;15699;15695:11;15660:74;:::i;:::-;15650:84;;;14945:795;;;;;;;:::o;15745:595::-;15863:6;15871;15924:2;15912:9;15903:7;15899:23;15895:32;15892:52;;;15940:1;15937;15930:12;15892:52;15980:9;15967:23;16009:18;16050:2;16042:6;16039:14;16036:34;;;16066:1;16063;16056:12;16036:34;16089:61;16142:7;16133:6;16122:9;16118:22;16089:61;:::i;:::-;16079:71;;16203:2;16192:9;16188:18;16175:32;16159:48;;16232:2;16222:8;16219:16;16216:36;;;16248:1;16245;16238:12;16216:36;;16271:63;16326:7;16315:8;16304:9;16300:24;16271:63;:::i;16345:241::-;16401:6;16454:2;16442:9;16433:7;16429:23;16425:32;16422:52;;;16470:1;16467;16460:12;16422:52;16509:9;16496:23;16528:28;16550:5;16528:28;:::i;16591:388::-;16659:6;16667;16720:2;16708:9;16699:7;16695:23;16691:32;16688:52;;;16736:1;16733;16726:12;16688:52;16775:9;16762:23;16794:31;16819:5;16794:31;:::i;:::-;16844:5;-1:-1:-1;16901:2:1;16886:18;;16873:32;16914:33;16873:32;16914:33;:::i;16984:821::-;17136:6;17144;17152;17205:2;17193:9;17184:7;17180:23;17176:32;17173:52;;;17221:1;17218;17211:12;17173:52;17261:9;17248:23;17290:18;17331:2;17323:6;17320:14;17317:34;;;17347:1;17344;17337:12;17317:34;17370:61;17423:7;17414:6;17403:9;17399:22;17370:61;:::i;:::-;17360:71;;17484:2;17473:9;17469:18;17456:32;17440:48;;17513:2;17503:8;17500:16;17497:36;;;17529:1;17526;17519:12;17497:36;17552:63;17607:7;17596:8;17585:9;17581:24;17552:63;:::i;:::-;17542:73;;17668:2;17657:9;17653:18;17640:32;17624:48;;17697:2;17687:8;17684:16;17681:36;;;17713:1;17710;17703:12;17681:36;;17736:63;17791:7;17780:8;17769:9;17765:24;17736:63;:::i;:::-;17726:73;;;16984:821;;;;;:::o;17810:437::-;17889:1;17885:12;;;;17932;;;17953:61;;18007:4;17999:6;17995:17;17985:27;;17953:61;18060:2;18052:6;18049:14;18029:18;18026:38;18023:218;;-1:-1:-1;;;18094:1:1;18087:88;18198:4;18195:1;18188:15;18226:4;18223:1;18216:15;18023:218;;17810:437;;;:::o;18252:184::-;-1:-1:-1;;;18301:1:1;18294:88;18401:4;18398:1;18391:15;18425:4;18422:1;18415:15;18441:128;18508:9;;;18529:11;;;18526:37;;;18543:18;;:::i;18927:184::-;-1:-1:-1;;;18976:1:1;18969:88;19076:4;19073:1;19066:15;19100:4;19097:1;19090:15;19466:135;19505:3;19526:17;;;19523:43;;19546:18;;:::i;:::-;-1:-1:-1;19593:1:1;19582:13;;19466:135::o;20020:184::-;20090:6;20143:2;20131:9;20122:7;20118:23;20114:32;20111:52;;;20159:1;20156;20149:12;20111:52;-1:-1:-1;20182:16:1;;20020:184;-1:-1:-1;20020:184:1:o;20511:245::-;20578:6;20631:2;20619:9;20610:7;20606:23;20602:32;20599:52;;;20647:1;20644;20637:12;20599:52;20679:9;20673:16;20698:28;20720:5;20698:28;:::i;20761:175::-;20798:3;20842:4;20835:5;20831:16;20871:4;20862:7;20859:17;20856:43;;20879:18;;:::i;:::-;20928:1;20915:15;;20761:175;-1:-1:-1;;20761:175:1:o;21344:168::-;21417:9;;;21448;;21465:15;;;21459:22;;21445:37;21435:71;;21486:18;;:::i;23222:125::-;23287:9;;;23308:10;;;23305:36;;;23321:18;;:::i;23478:545::-;23580:2;23575:3;23572:11;23569:448;;;23616:1;23641:5;23637:2;23630:17;23686:4;23682:2;23672:19;23756:2;23744:10;23740:19;23737:1;23733:27;23727:4;23723:38;23792:4;23780:10;23777:20;23774:47;;;-1:-1:-1;23815:4:1;23774:47;23870:2;23865:3;23861:12;23858:1;23854:20;23848:4;23844:31;23834:41;;23925:82;23943:2;23936:5;23933:13;23925:82;;;23988:17;;;23969:1;23958:13;23925:82;;24199:1352;24325:3;24319:10;24352:18;24344:6;24341:30;24338:56;;;24374:18;;:::i;:::-;24403:97;24493:6;24453:38;24485:4;24479:11;24453:38;:::i;:::-;24447:4;24403:97;:::i;:::-;24555:4;;24619:2;24608:14;;24636:1;24631:663;;;;25338:1;25355:6;25352:89;;;-1:-1:-1;25407:19:1;;;25401:26;25352:89;-1:-1:-1;;24156:1:1;24152:11;;;24148:24;24144:29;24134:40;24180:1;24176:11;;;24131:57;25454:81;;24601:944;;24631:663;23425:1;23418:14;;;23462:4;23449:18;;-1:-1:-1;;24667:20:1;;;24785:236;24799:7;24796:1;24793:14;24785:236;;;24888:19;;;24882:26;24867:42;;24980:27;;;;24948:1;24936:14;;;;24815:19;;24785:236;;;24789:3;25049:6;25040:7;25037:19;25034:201;;;25110:19;;;25104:26;-1:-1:-1;;25193:1:1;25189:14;;;25205:3;25185:24;25181:37;25177:42;25162:58;25147:74;;25034:201;-1:-1:-1;;;;;25281:1:1;25265:14;;;25261:22;25248:36;;-1:-1:-1;24199:1352:1:o;26111:251::-;26181:6;26234:2;26222:9;26213:7;26209:23;26205:32;26202:52;;;26250:1;26247;26240:12;26202:52;26282:9;26276:16;26301:31;26326:5;26301:31;:::i;26367:184::-;-1:-1:-1;;;26416:1:1;26409:88;26516:4;26513:1;26506:15;26540:4;26537:1;26530:15;26556:496;26735:3;26773:6;26767:13;26789:66;26848:6;26843:3;26836:4;26828:6;26824:17;26789:66;:::i;:::-;26918:13;;26877:16;;;;26940:70;26918:13;26877:16;26987:4;26975:17;;26940:70;:::i;:::-;27026:20;;26556:496;-1:-1:-1;;;;26556:496:1:o;27057:1322::-;27435:3;27464:1;27497:6;27491:13;27527:36;27553:9;27527:36;:::i;:::-;27582:1;27599:18;;;27626:133;;;;27773:1;27768:356;;;;27592:532;;27626:133;-1:-1:-1;;27659:24:1;;27647:37;;27732:14;;27725:22;27713:35;;27704:45;;;-1:-1:-1;27626:133:1;;27768:356;27799:6;27796:1;27789:17;27829:4;27874:2;27871:1;27861:16;27899:1;27913:165;27927:6;27924:1;27921:13;27913:165;;;28005:14;;27992:11;;;27985:35;28048:16;;;;27942:10;;27913:165;;;27917:3;;;28107:6;28102:3;28098:16;28091:23;;27592:532;;28145:3;28140;28133:16;28180:6;28174:13;28158:29;;28196:77;28264:8;28259:2;28254:3;28250:12;28243:4;28235:6;28231:17;28196:77;:::i;:::-;28339:7;28292:18;;;;28326:11;;;28319:28;;;;28371:1;28363:10;;27057:1322;-1:-1:-1;;;;;27057:1322:1:o;34546:512::-;34740:4;-1:-1:-1;;;;;34850:2:1;34842:6;34838:15;34827:9;34820:34;34902:2;34894:6;34890:15;34885:2;34874:9;34870:18;34863:43;;34942:6;34937:2;34926:9;34922:18;34915:34;34985:3;34980:2;34969:9;34965:18;34958:31;35006:46;35047:3;35036:9;35032:19;35024:6;35006:46;:::i;:::-;34998:54;34546:512;-1:-1:-1;;;;;;34546:512:1:o;35063:249::-;35132:6;35185:2;35173:9;35164:7;35160:23;35156:32;35153:52;;;35201:1;35198;35191:12;35153:52;35233:9;35227:16;35252:30;35276:5;35252:30;:::i;35317:184::-;-1:-1:-1;;;35366:1:1;35359:88;35466:4;35463:1;35456:15;35490:4;35487:1;35480:15;35506:120;35546:1;35572;35562:35;;35577:18;;:::i;:::-;-1:-1:-1;35611:9:1;;35506:120::o;35631:112::-;35663:1;35689;35679:35;;35694:18;;:::i;:::-;-1:-1:-1;35728:9:1;;35631:112::o

Swarm Source

ipfs://cee70ac57e621b75181506f217f9b9cdcabb3bf0cbae8b9c80d270d67adf1efa
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.