ETH Price: $2,432.74 (+3.18%)

Token

Fuc (Fuc)
 

Overview

Max Total Supply

1,542 Fuc

Holders

635

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 Fuc
0x0b0A96bb90Bc46832AD5f85C7172A4407f67ACa2
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:
Fuc

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-05-01
*/

// File: operator-filter-registry/src/lib/Constants.sol


pragma solidity ^0.8.17;

address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E;
address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;

// File: operator-filter-registry/src/IOperatorFilterRegistry.sol


pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    /**
     * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns
     *         true if supplied registrant address is not registered.
     */
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);

    /**
     * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner.
     */
    function register(address registrant) external;

    /**
     * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes.
     */
    function registerAndSubscribe(address registrant, address subscription) external;

    /**
     * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another
     *         address without subscribing.
     */
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;

    /**
     * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner.
     *         Note that this does not remove any filtered addresses or codeHashes.
     *         Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes.
     */
    function unregister(address addr) external;

    /**
     * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered.
     */
    function updateOperator(address registrant, address operator, bool filtered) external;

    /**
     * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates.
     */
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;

    /**
     * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered.
     */
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;

    /**
     * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates.
     */
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;

    /**
     * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous
     *         subscription if present.
     *         Note that accounts with subscriptions may go on to subscribe to other accounts - in this case,
     *         subscriptions will not be forwarded. Instead the former subscription's existing entries will still be
     *         used.
     */
    function subscribe(address registrant, address registrantToSubscribe) external;

    /**
     * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes.
     */
    function unsubscribe(address registrant, bool copyExistingEntries) external;

    /**
     * @notice Get the subscription address of a given registrant, if any.
     */
    function subscriptionOf(address addr) external returns (address registrant);

    /**
     * @notice Get the set of addresses subscribed to a given registrant.
     *         Note that order is not guaranteed as updates are made.
     */
    function subscribers(address registrant) external returns (address[] memory);

    /**
     * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant.
     *         Note that order is not guaranteed as updates are made.
     */
    function subscriberAt(address registrant, uint256 index) external returns (address);

    /**
     * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr.
     */
    function copyEntriesOf(address registrant, address registrantToCopy) external;

    /**
     * @notice Returns true if operator is filtered by a given address or its subscription.
     */
    function isOperatorFiltered(address registrant, address operator) external returns (bool);

    /**
     * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription.
     */
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);

    /**
     * @notice Returns true if a codeHash is filtered by a given address or its subscription.
     */
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);

    /**
     * @notice Returns a list of filtered operators for a given address or its subscription.
     */
    function filteredOperators(address addr) external returns (address[] memory);

    /**
     * @notice Returns the set of filtered codeHashes for a given address or its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);

    /**
     * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or
     *         its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);

    /**
     * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or
     *         its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);

    /**
     * @notice Returns true if an address has registered
     */
    function isRegistered(address addr) external returns (bool);

    /**
     * @dev Convenience method to compute the code hash of an arbitrary contract
     */
    function codeHashOf(address addr) external returns (bytes32);
}

// File: operator-filter-registry/src/OperatorFilterer.sol


pragma solidity ^0.8.13;


/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 *         Please note that if your token contract does not provide an owner with EIP-173, it must provide
 *         administration methods on the contract itself to interact with the registry otherwise the subscription
 *         will be locked to the options set during construction.
 */

abstract contract OperatorFilterer {
    /// @dev Emitted when an operator is not allowed.
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS);

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

    /**
     * @dev A helper function to check if an operator is allowed.
     */
    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    /**
     * @dev A helper function to check if an operator approval is allowed.
     */
    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    /**
     * @dev A helper function to check if an operator is allowed.
     */
    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // under normal circumstances, this function will revert rather than return false, but inheriting contracts
            // may specify their own OperatorFilterRegistry implementations, which may behave differently
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}

// File: operator-filter-registry/src/DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;


/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 * @dev    Please note that if your token contract does not provide an owner with EIP-173, it must provide
 *         administration methods on the contract itself to interact with the registry otherwise the subscription
 *         will be locked to the options set during construction.
 */

abstract contract DefaultOperatorFilterer is OperatorFilterer {
    /// @dev The constructor that is called when the contract is being deployed.
    constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {}
}

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


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

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

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
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 Returns the rebuilt hash obtained by traversing a Merklee 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++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @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] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(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) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(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) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason 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 {
            // 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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, 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 be 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: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * 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 Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: erc721a/contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

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

    // 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 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 && 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 virtual override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !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() && !_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;
    }

    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 {
        _mint(to, quantity, _data, true);
    }

    /**
     * @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,
        bytes memory _data,
        bool safe
    ) 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 (safe && 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 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 This is 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 {}
}

// File: contracts/FucContract/fuc.sol



pragma solidity ^0.8.17;






/////////////////////////////////////////////////////////////////////////////
//                                                                         //
//                                                                         //
//    ░░░░░░░░░█████████░░░░░░░░░██░░░░░░██░░░░░░░░░░░░░█████████░░░░░░    //
//    ░░░░░░░░░██░░░░░░░░░░░░░░░░██░░░░░░██░░░░░░░░░░░██░░░░░░░░░░░░░░░    //
//    ░░░░░░░░░█████████░░░░░░░░░██░░░░░░██░░░░░░░░░░░██░░░░░░░░░░░░░░░    //
//    ░░░░░░░░░██░░░░░░░░░░░░░░░░██░░░░░░██░░░░░░░░░░░██░░░░░░░░░░░░░░░    //
//    ░░░░░░░░░██░░░░░░░░░░░░░░░░██░░░░░░██░░░░░░░░░░░██░░░░░░░░░░░░░░░    //
//    ░░░░░░░░░██░░░░░░░░░░░░░░░░██████████░░░░░░░░░░░░░█████████░░░░░░    //
//                                                                         //
//                                                                         //
/////////////////////////////////////////////////////////////////////////////

contract Fuc is ERC721A, Ownable, ReentrancyGuard ,DefaultOperatorFilterer{

    string public baseUri;

    bool public paused = false;

    string public contractURI;

    uint64 public count = 7777;

    mapping(uint8 => uint8) public tokenLimit;

    mapping(uint8 => uint256) public priceType;

    mapping(uint8 => bytes32) public rootType;

    mapping(uint8 => bool) public levelStatu;

    mapping(address => bool)  public marketPlace;

    address private withdrawAddress;

    TimeConfig public timeConfig;

    constructor(
        string memory _tokenName,
        string memory _tokenSymbol,
        string memory _baseUri,
        string memory _contractURI,
        address _address
    ) ERC721A(_tokenName, _tokenSymbol) {
        baseUri = _baseUri;
        contractURI = _contractURI;
        withdrawAddress = _address;
    }

    struct TimeConfig {
        uint256 partnerStartTime;
        uint256 partnerEndTime;
        uint256 fucthelistStartTime;
        uint256 fucthelistEndTime;
        uint256 whitelistStartTime;
        uint256 whitelistEndTime;
    }
    //--------add--------
    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        require(marketPlace[operator] == true, "Not allowed");
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) {
        require(marketPlace[operator] == true, "Not allowed");
        super.approve(operator, tokenId);
    }

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

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

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }
    //--------add--------
    function setAllowMarket(address market) public onlyOwner{
        marketPlace[market] = true;
    }

    modifier onlyAccounts() {
        require(msg.sender == tx.origin, "Not allowed origin");
        _;
    }

    modifier fucStatus() {
        require(paused == true, "Sale not started");
        _;
    }

    function setLevelStatu(uint8 ltype , bool status) public onlyOwner{
        require(ltype <= 3,"Type error");
        for (uint8 i = 0; i <= 3; i++) {
            levelStatu[i] = false;
        }
        levelStatu[ltype-1] = status;
    }

    function setPausedStatu() public onlyOwner{
        paused = !paused;
    }
    /**
     * method setTokenLimit
     * param detail
     * ttype == 1 set partner token limit 
     * ttype == 2 set fucthelist token limit 
     * ttype == 3 set whitelist token limit 
     * ttype == 4 set open token limit
     */
    function setTokenLimit(uint8 _account , uint8 ttype) public onlyOwner fucStatus{
        require(ttype <= 4 && _account < 10,"Param error");
        // require(_account < 10,"Upper limit exceeded");
        tokenLimit[ttype-1] = _account;
    }

    /**
     * method setTime
     * param detail
     * timeType == 1 set partner time
     * timeType == 2 set fucthelist time 
     * timeType == 3 set whitelist time
     */
    function setTime(uint256 startTime , uint256 endTime ,int8 timeType) public onlyOwner fucStatus{
        // require(timeType <= 3,"Type error");
        if(timeType == 1){
            timeConfig.partnerStartTime = startTime;
            timeConfig.partnerEndTime = endTime;
        }
        if(timeType == 2) {
            timeConfig.fucthelistStartTime = startTime;
            timeConfig.fucthelistEndTime = endTime;
        }

        if(timeType == 3) {
            timeConfig.whitelistStartTime = startTime;
            timeConfig.whitelistEndTime = endTime;
        }
    }
    /**
     * method setPrice
     * param detail
     * ptype == 1 set partner token price 
     * ptype == 2 set fucthelist token price 
     * ptype == 3 set whitelist token price 
     * ptype == 4 set open token price 
     */
    function setPrice(uint256 price , uint8 ptype) public onlyOwner fucStatus{
        require(ptype <= 4,"Type error");
        priceType[ptype - 1] = price;
    }

    /**
     * method setRoot
     * param detail
     * rtype == 1 set partner merkleRoot
     * rtype == 2 set fucthelist merkleRoot 
     * rtype == 3 set whitelist merkleRoot
     */
    function setRoot(bytes32 _root , uint8 rtype) public onlyOwner {
        require(rtype <= 3,"Type error");
        rootType[rtype - 1] = _root;
    }

    function isValid(bytes32[] memory proof ,bytes32 _root) internal view returns (bool) {
        return MerkleProof.verify(proof, _root ,keccak256(abi.encodePacked(msg.sender)));
    }

    function SafeMint(uint8 amount , bytes32[] memory proof) external payable fucStatus onlyAccounts {
        require(amount > 0 && amount <= 6, "Amount must in 0-6");
        uint64 aux = _getAux(msg.sender);
        if(levelStatu[0] == true) {
            require(block.timestamp >= timeConfig.partnerStartTime && block.timestamp <= timeConfig.partnerEndTime && priceType[0] > 0,"sale not started");
            require(msg.value >= priceType[0] * amount, "Insufficient funds!");
            require(isValid(proof ,rootType[0]), "Not Allowlist");
            require(amount + _numberMinted(msg.sender) <= tokenLimit[0], "Upper limit exceeded");
            _setAux(msg.sender, aux + amount);
        } else if(levelStatu[1] == true) {
            require(block.timestamp >= timeConfig.fucthelistStartTime && block.timestamp <= timeConfig.fucthelistEndTime && priceType[1] > 0  ,"sale not started");
            require(msg.value >= priceType[1] * amount, "Insufficient funds!");
            if(aux < 10) {
                aux = 10;
            }
            require(aux + amount - 10 <= tokenLimit[1], "Upper limit exceeded");
            require(isValid(proof ,rootType[1]), "Not Allowlist");
            setAux(1,msg.sender, amount , aux);
        } else if(levelStatu[2] == true) {
            require(block.timestamp >= timeConfig.whitelistStartTime && block.timestamp <= timeConfig.whitelistEndTime && priceType[2] > 0  ,"sale not started");
            require(msg.value >= priceType[2] * amount, "Insufficient funds!");
            if(aux < 20) {
                aux = 20;
            }
            require(aux + amount - 20 <= tokenLimit[2], "Upper limit exceeded");
            require(isValid(proof ,rootType[2]), "Not Allowlist");
            setAux(2,msg.sender, amount, aux);
        } else {
            require(block.timestamp > timeConfig.whitelistEndTime && timeConfig.whitelistEndTime != 0 ,"sale not started") ;
            if(aux < 30) {
                aux = 30;
            }
            require(aux + amount - 30 <= tokenLimit[3], "Upper limit exceeded");
            require(priceType[3] > 0 && msg.value >= priceType[3] * amount , "Insufficient funds!");
            setAux(3,msg.sender, amount, aux);
        }
        count = count - amount;
        require(count >= 0, "count out of range");
        
        _safeMint(msg.sender, amount);
    }

    //  function geTime() public view returns(uint256){
    //     return block.timestamp;
    // }

    function setAux(uint8 ctype , address ads , uint8 amount ,uint64 aux) private {
        if(ctype == aux/10){
            _setAux(ads, aux + amount);
        }
    }

    function getAux(address owner) public view returns(uint64){
        return _getAux(owner);
    }

    function getPrice() public view returns(uint256, uint8){
        uint256 _price;
        uint8 _type;
        if(levelStatu[0] == true) {
            _price = priceType[0];
            _type = 1;
        } else if(levelStatu[1] == true) {
            _price = priceType[1];
            _type = 2;
        } else if(levelStatu[2] == true) {
            _price = priceType[2];
            _type = 3;
        } else {
            _price = priceType[3];
            _type = 4;
        }
        return (_price , _type);
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId) && bytes(baseUri).length > 0, "Metadata: nonexistent token");
        // require(bytes(baseUri).length > 0, "no set baseUri");
        return string(abi.encodePacked(baseUri, Strings.toString(tokenId), ".json"));
    }

    function changeBaseURI(string memory baseURI_) public onlyOwner fucStatus {
        baseUri = baseURI_;
    }
    
    function walletOfOwner(address _owner) public view returns (uint256[] memory) {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
        uint256 currentTokenId = _startTokenId();
        uint256 ownedTokenIndex = 0;
        address latestOwnerAddress;

        while (ownedTokenIndex < ownerTokenCount) {
            TokenOwnership memory ownership = _ownerships[currentTokenId];

            if (!ownership.burned && ownership.addr != address(0)) {
                latestOwnerAddress = ownership.addr; 
            }

            if (latestOwnerAddress == _owner) {
                ownedTokenIds[ownedTokenIndex] = currentTokenId;

                ownedTokenIndex++;
            }

            currentTokenId++;
        }

        return ownedTokenIds;
    }
    
    function withdrawMoney() external nonReentrant onlyAccounts {
        require(msg.sender == withdrawAddress, "Not allowed origin");
        (bool success, ) = withdrawAddress.call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"string","name":"_baseUri","type":"string"},{"internalType":"string","name":"_contractURI","type":"string"},{"internalType":"address","name":"_address","type":"address"}],"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":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"amount","type":"uint8"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"SafeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"changeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"count","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getAux","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint8","name":"","type":"uint8"}],"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":"uint8","name":"","type":"uint8"}],"name":"levelStatu","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"marketPlace","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"priceType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"rootType","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"market","type":"address"}],"name":"setAllowMarket","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":"uint8","name":"ltype","type":"uint8"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setLevelStatu","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPausedStatu","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint8","name":"ptype","type":"uint8"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"},{"internalType":"uint8","name":"rtype","type":"uint8"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"int8","name":"timeType","type":"int8"}],"name":"setTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_account","type":"uint8"},{"internalType":"uint8","name":"ttype","type":"uint8"}],"name":"setTokenLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeConfig","outputs":[{"internalType":"uint256","name":"partnerStartTime","type":"uint256"},{"internalType":"uint256","name":"partnerEndTime","type":"uint256"},{"internalType":"uint256","name":"fucthelistStartTime","type":"uint256"},{"internalType":"uint256","name":"fucthelistEndTime","type":"uint256"},{"internalType":"uint256","name":"whitelistStartTime","type":"uint256"},{"internalType":"uint256","name":"whitelistEndTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"tokenLimit","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600b60006101000a81548160ff021916908315150217905550611e61600d60006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055503480156200005757600080fd5b5060405162006a9538038062006a9583398181016040528101906200007d91906200062c565b733cc6cdda760b79bafa08df41ecfa224f810dceb6600186868160029081620000a791906200097b565b508060039081620000b991906200097b565b50620000ca6200036160201b60201c565b6000819055505050620000f2620000e66200036660201b60201c565b6200036e60201b60201c565b600160098190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620002ef578015620001b5576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200017b92919062000a73565b600060405180830381600087803b1580156200019657600080fd5b505af1158015620001ab573d6000803e3d6000fd5b50505050620002ee565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200026f576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200023592919062000a73565b600060405180830381600087803b1580156200025057600080fd5b505af115801562000265573d6000803e3d6000fd5b50505050620002ed565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620002b8919062000aa0565b600060405180830381600087803b158015620002d357600080fd5b505af1158015620002e8573d6000803e3d6000fd5b505050505b5b5b505082600a90816200030291906200097b565b5081600c90816200031491906200097b565b5080601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050505062000abd565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200049d8262000452565b810181811067ffffffffffffffff82111715620004bf57620004be62000463565b5b80604052505050565b6000620004d462000434565b9050620004e2828262000492565b919050565b600067ffffffffffffffff82111562000505576200050462000463565b5b620005108262000452565b9050602081019050919050565b60005b838110156200053d57808201518184015260208101905062000520565b60008484015250505050565b6000620005606200055a84620004e7565b620004c8565b9050828152602081018484840111156200057f576200057e6200044d565b5b6200058c8482856200051d565b509392505050565b600082601f830112620005ac57620005ab62000448565b5b8151620005be84826020860162000549565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005f482620005c7565b9050919050565b6200060681620005e7565b81146200061257600080fd5b50565b6000815190506200062681620005fb565b92915050565b600080600080600060a086880312156200064b576200064a6200043e565b5b600086015167ffffffffffffffff8111156200066c576200066b62000443565b5b6200067a8882890162000594565b955050602086015167ffffffffffffffff8111156200069e576200069d62000443565b5b620006ac8882890162000594565b945050604086015167ffffffffffffffff811115620006d057620006cf62000443565b5b620006de8882890162000594565b935050606086015167ffffffffffffffff81111562000702576200070162000443565b5b620007108882890162000594565b9250506080620007238882890162000615565b9150509295509295909350565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200078357607f821691505b6020821081036200079957620007986200073b565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620008037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620007c4565b6200080f8683620007c4565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200085c62000856620008508462000827565b62000831565b62000827565b9050919050565b6000819050919050565b62000878836200083b565b62000890620008878262000863565b848454620007d1565b825550505050565b600090565b620008a762000898565b620008b48184846200086d565b505050565b5b81811015620008dc57620008d06000826200089d565b600181019050620008ba565b5050565b601f8211156200092b57620008f5816200079f565b6200090084620007b4565b8101602085101562000910578190505b620009286200091f85620007b4565b830182620008b9565b50505b505050565b600082821c905092915050565b6000620009506000198460080262000930565b1980831691505092915050565b60006200096b83836200093d565b9150826002028217905092915050565b620009868262000730565b67ffffffffffffffff811115620009a257620009a162000463565b5b620009ae82546200076a565b620009bb828285620008e0565b600060209050601f831160018114620009f35760008415620009de578287015190505b620009ea85826200095d565b86555062000a5a565b601f19841662000a03866200079f565b60005b8281101562000a2d5784890151825560018201915060208501945060208101905062000a06565b8683101562000a4d578489015162000a49601f8916826200093d565b8355505b6001600288020188555050505b505050505050565b62000a6d81620005e7565b82525050565b600060408201905062000a8a600083018562000a62565b62000a99602083018462000a62565b9392505050565b600060208201905062000ab7600083018462000a62565b92915050565b615fc88062000acd6000396000f3fe6080604052600436106102465760003560e01c806370a0823111610139578063a22cb465116100b6578063d3d5f34a1161007a578063d3d5f34a146108ba578063e75ddaf2146108d6578063e8a3d485146108ff578063e985e9c51461092a578063ea5ab64514610967578063f2fde38b1461099057610246565b8063a22cb465146107d7578063ac44600214610800578063b88d4fde14610817578063bf0b175e14610840578063c87b56dd1461087d57610246565b806395d89b41116100fd57806395d89b411461070357806396383c041461072e57806398d5fdca146107575780639abc8320146107835780639d0a4f93146107ae57610246565b806370a082311461062b578063715018a6146106685780637fe87e871461067f57806389bfe549146106a85780638da5cb5b146106d857610246565b806327508654116101c757806341f434341161018b57806341f434341461053257806342842e0e1461055d578063438b6300146105865780635c975abb146105c35780636352211e146105ee57610246565b806327508654146104295780632d85640714610466578063373e722b146104a3578063383cce32146104e057806339a0c6f91461050957610246565b8063095ea7b31161020e578063095ea7b3146103325780630f79c7f71461035b57806318160ddd1461039857806322be1a89146103c357806323b872dd1461040057610246565b806301ffc9a71461024b5780630592ae531461028857806306661abd1461029f57806306fdde03146102ca578063081812fc146102f5575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d91906143c5565b6109b9565b60405161027f919061440d565b60405180910390f35b34801561029457600080fd5b5061029d610a9b565b005b3480156102ab57600080fd5b506102b4610b43565b6040516102c1919061444b565b60405180910390f35b3480156102d657600080fd5b506102df610b5d565b6040516102ec91906144f6565b60405180910390f35b34801561030157600080fd5b5061031c6004803603810190610317919061454e565b610bef565b60405161032991906145bc565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190614603565b610c6b565b005b34801561036757600080fd5b50610382600480360381019061037d9190614643565b610d17565b60405161038f919061440d565b60405180910390f35b3480156103a457600080fd5b506103ad610d37565b6040516103ba919061467f565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e591906146d3565b610d4e565b6040516103f7919061440d565b60405180910390f35b34801561040c57600080fd5b5061042760048036038101906104229190614700565b610d6e565b005b34801561043557600080fd5b50610450600480360381019061044b91906146d3565b610dbd565b60405161045d919061467f565b60405180910390f35b34801561047257600080fd5b5061048d600480360381019061048891906146d3565b610dd5565b60405161049a919061476c565b60405180910390f35b3480156104af57600080fd5b506104ca60048036038101906104c591906146d3565b610ded565b6040516104d79190614796565b60405180910390f35b3480156104ec57600080fd5b50610507600480360381019061050291906147dd565b610e0d565b005b34801561051557600080fd5b50610530600480360381019061052b9190614952565b610efe565b005b34801561053e57600080fd5b50610547610fe3565b60405161055491906149fa565b60405180910390f35b34801561056957600080fd5b50610584600480360381019061057f9190614700565b610ff5565b005b34801561059257600080fd5b506105ad60048036038101906105a89190614643565b611044565b6040516105ba9190614ad3565b60405180910390f35b3480156105cf57600080fd5b506105d8611250565b6040516105e5919061440d565b60405180910390f35b3480156105fa57600080fd5b506106156004803603810190610610919061454e565b611263565b60405161062291906145bc565b60405180910390f35b34801561063757600080fd5b50610652600480360381019061064d9190614643565b611279565b60405161065f919061467f565b60405180910390f35b34801561067457600080fd5b5061067d611348565b005b34801561068b57600080fd5b506106a660048036038101906106a19190614b2e565b6113d0565b005b3480156106b457600080fd5b506106bd611507565b6040516106cf96959493929190614b81565b60405180910390f35b3480156106e457600080fd5b506106ed611531565b6040516106fa91906145bc565b60405180910390f35b34801561070f57600080fd5b5061071861155b565b60405161072591906144f6565b60405180910390f35b34801561073a57600080fd5b5061075560048036038101906107509190614be2565b6115ed565b005b34801561076357600080fd5b5061076c611734565b60405161077a929190614c22565b60405180910390f35b34801561078f57600080fd5b5061079861185e565b6040516107a591906144f6565b60405180910390f35b3480156107ba57600080fd5b506107d560048036038101906107d09190614c77565b6118ec565b005b3480156107e357600080fd5b506107fe60048036038101906107f99190614cb7565b611a44565b005b34801561080c57600080fd5b50610815611af0565b005b34801561082357600080fd5b5061083e60048036038101906108399190614d98565b611d14565b005b34801561084c57600080fd5b5061086760048036038101906108629190614643565b611d65565b604051610874919061444b565b60405180910390f35b34801561088957600080fd5b506108a4600480360381019061089f919061454e565b611d77565b6040516108b191906144f6565b60405180910390f35b6108d460048036038101906108cf9190614ee3565b611e0d565b005b3480156108e257600080fd5b506108fd60048036038101906108f89190614643565b6127f5565b005b34801561090b57600080fd5b506109146128cc565b60405161092191906144f6565b60405180910390f35b34801561093657600080fd5b50610951600480360381019061094c9190614f3f565b61295a565b60405161095e919061440d565b60405180910390f35b34801561097357600080fd5b5061098e60048036038101906109899190614f7f565b6129ee565b005b34801561099c57600080fd5b506109b760048036038101906109b29190614643565b612b58565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a945750610a9382612c4f565b5b9050919050565b610aa3612cb9565b73ffffffffffffffffffffffffffffffffffffffff16610ac1611531565b73ffffffffffffffffffffffffffffffffffffffff1614610b17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0e9061500b565b60405180910390fd5b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b600d60009054906101000a900467ffffffffffffffff1681565b606060028054610b6c9061505a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b989061505a565b8015610be55780601f10610bba57610100808354040283529160200191610be5565b820191906000526020600020905b815481529060010190602001808311610bc857829003601f168201915b5050505050905090565b6000610bfa82612cc1565b610c30576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610c7581612d0f565b60011515601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610d08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cff906150d7565b60405180910390fd5b610d128383612e0c565b505050565b60126020528060005260406000206000915054906101000a900460ff1681565b6000610d41612f16565b6001546000540303905090565b60116020528060005260406000206000915054906101000a900460ff1681565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610dac57610dab33612d0f565b5b610db7848484612f1b565b50505050565b600f6020528060005260406000206000915090505481565b60106020528060005260406000206000915090505481565b600e6020528060005260406000206000915054906101000a900460ff1681565b610e15612cb9565b73ffffffffffffffffffffffffffffffffffffffff16610e33611531565b73ffffffffffffffffffffffffffffffffffffffff1614610e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e809061500b565b60405180910390fd5b60038160ff161115610ed0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec790615143565b60405180910390fd5b8160106000600184610ee29190615192565b60ff1660ff168152602001908152602001600020819055505050565b610f06612cb9565b73ffffffffffffffffffffffffffffffffffffffff16610f24611531565b73ffffffffffffffffffffffffffffffffffffffff1614610f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f719061500b565b60405180910390fd5b60011515600b60009054906101000a900460ff16151514610fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc790615213565b60405180910390fd5b80600a9081610fdf91906153d5565b5050565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110335761103233612d0f565b5b61103e848484612f2b565b50505050565b6060600061105183611279565b905060008167ffffffffffffffff81111561106f5761106e614827565b5b60405190808252806020026020018201604052801561109d5781602001602082028036833780820191505090505b50905060006110aa612f16565b90506000805b84821015611243576000600460008581526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001511580156111c05750600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614155b156111cd57806000015191505b8773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361122f5783858481518110611214576112136154a7565b5b602002602001018181525050828061122b906154d6565b9350505b838061123a906154d6565b945050506110b0565b8395505050505050919050565b600b60009054906101000a900460ff1681565b600061126e82612f4b565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112e0576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611350612cb9565b73ffffffffffffffffffffffffffffffffffffffff1661136e611531565b73ffffffffffffffffffffffffffffffffffffffff16146113c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bb9061500b565b60405180910390fd5b6113ce60006131da565b565b6113d8612cb9565b73ffffffffffffffffffffffffffffffffffffffff166113f6611531565b73ffffffffffffffffffffffffffffffffffffffff161461144c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114439061500b565b60405180910390fd5b60011515600b60009054906101000a900460ff161515146114a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149990615213565b60405180910390fd5b60018160000b036114c25782601460000181905550816014600101819055505b60028160000b036114e25782601460020181905550816014600301819055505b60038160000b036115025782601460040181905550816014600501819055505b505050565b60148060000154908060010154908060020154908060030154908060040154908060050154905086565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461156a9061505a565b80601f01602080910402602001604051908101604052809291908181526020018280546115969061505a565b80156115e35780601f106115b8576101008083540402835291602001916115e3565b820191906000526020600020905b8154815290600101906020018083116115c657829003601f168201915b5050505050905090565b6115f5612cb9565b73ffffffffffffffffffffffffffffffffffffffff16611613611531565b73ffffffffffffffffffffffffffffffffffffffff1614611669576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116609061500b565b60405180910390fd5b60011515600b60009054906101000a900460ff161515146116bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b690615213565b60405180910390fd5b60048160ff161115611706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fd90615143565b60405180910390fd5b81600f60006001846117189190615192565b60ff1660ff168152602001908152602001600020819055505050565b60008060008060011515601160008060ff16815260200190815260200160002060009054906101000a900460ff1615150361178b57600f60008060ff16815260200190815260200160002054915060019050611852565b6001151560116000600160ff16815260200190815260200160002060009054906101000a900460ff161515036117de57600f6000600160ff16815260200190815260200160002054915060029050611851565b6001151560116000600260ff16815260200190815260200160002060009054906101000a900460ff1615150361183157600f6000600260ff16815260200190815260200160002054915060039050611850565b600f6000600360ff168152602001908152602001600020549150600490505b5b5b81819350935050509091565b600a805461186b9061505a565b80601f01602080910402602001604051908101604052809291908181526020018280546118979061505a565b80156118e45780601f106118b9576101008083540402835291602001916118e4565b820191906000526020600020905b8154815290600101906020018083116118c757829003601f168201915b505050505081565b6118f4612cb9565b73ffffffffffffffffffffffffffffffffffffffff16611912611531565b73ffffffffffffffffffffffffffffffffffffffff1614611968576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195f9061500b565b60405180910390fd5b60038260ff1611156119af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a690615143565b60405180910390fd5b60005b60038160ff1611611a02576000601160008360ff1660ff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806119fa9061551e565b9150506119b2565b508060116000600185611a159190615192565b60ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b81611a4e81612d0f565b60011515601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611ae1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad8906150d7565b60405180910390fd5b611aeb83836132a0565b505050565b600260095403611b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2c90615593565b60405180910390fd5b60026009819055503273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba2906155ff565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c32906155ff565b60405180910390fd5b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051611c8390615650565b60006040518083038185875af1925050503d8060008114611cc0576040519150601f19603f3d011682016040523d82523d6000602084013e611cc5565b606091505b5050905080611d09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d00906156b1565b60405180910390fd5b506001600981905550565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611d5257611d5133612d0f565b5b611d5e85858585613417565b5050505050565b6000611d7082613493565b9050919050565b6060611d8282612cc1565b8015611d9c57506000600a8054611d989061505a565b9050115b611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd29061571d565b60405180910390fd5b600a611de6836134f3565b604051602001611df7929190615848565b6040516020818303038152906040529050919050565b60011515600b60009054906101000a900460ff16151514611e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5a90615213565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec8906155ff565b60405180910390fd5b60008260ff16118015611ee8575060068260ff1611155b611f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1e906158c3565b60405180910390fd5b6000611f3233613493565b905060011515601160008060ff16815260200190815260200160002060009054906101000a900460ff16151503612140576014600001544210158015611f7d57506014600101544211155b8015611f9f57506000600f60008060ff16815260200190815260200160002054115b611fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd59061592f565b60405180910390fd5b8260ff16600f60008060ff16815260200190815260200160002054612003919061594f565b341015612045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203c906159dd565b60405180910390fd5b61206582601060008060ff16815260200190815260200160002054613653565b6120a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209b90615a49565b60405180910390fd5b600e60008060ff16815260200190815260200160002060009054906101000a900460ff1660ff166120d43361368e565b8460ff166120e29190615a69565b1115612123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211a90615ae9565b60405180910390fd5b61213b338460ff16836121369190615b09565b6136f8565b612732565b6001151560116000600160ff16815260200190815260200160002060009054906101000a900460ff1615150361236c57601460020154421015801561218a57506014600301544211155b80156121ad57506000600f6000600160ff16815260200190815260200160002054115b6121ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e39061592f565b60405180910390fd5b8260ff16600f6000600160ff16815260200190815260200160002054612212919061594f565b341015612254576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224b906159dd565b60405180910390fd5b600a8167ffffffffffffffff16101561226c57600a90505b600e6000600160ff16815260200190815260200160002060009054906101000a900460ff1660ff16600a8460ff16836122a59190615b09565b6122af9190615b45565b67ffffffffffffffff1611156122fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f190615ae9565b60405180910390fd5b61231b8260106000600160ff16815260200190815260200160002054613653565b61235a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235190615a49565b60405180910390fd5b6123676001338584613765565b612731565b6001151560116000600260ff16815260200190815260200160002060009054906101000a900460ff161515036125985760146004015442101580156123b657506014600501544211155b80156123d957506000600f6000600260ff16815260200190815260200160002054115b612418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240f9061592f565b60405180910390fd5b8260ff16600f6000600260ff1681526020019081526020016000205461243e919061594f565b341015612480576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612477906159dd565b60405180910390fd5b60148167ffffffffffffffff16101561249857601490505b600e6000600260ff16815260200190815260200160002060009054906101000a900460ff1660ff1660148460ff16836124d19190615b09565b6124db9190615b45565b67ffffffffffffffff161115612526576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251d90615ae9565b60405180910390fd5b6125478260106000600260ff16815260200190815260200160002054613653565b612586576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257d90615a49565b60405180910390fd5b6125936002338584613765565b612730565b601460050154421180156125b25750600060146005015414155b6125f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e89061592f565b60405180910390fd5b601e8167ffffffffffffffff16101561260957601e90505b600e6000600360ff16815260200190815260200160002060009054906101000a900460ff1660ff16601e8460ff16836126429190615b09565b61264c9190615b45565b67ffffffffffffffff161115612697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268e90615ae9565b60405180910390fd5b6000600f6000600360ff168152602001908152602001600020541180156126e357508260ff16600f6000600360ff168152602001908152602001600020546126df919061594f565b3410155b612722576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612719906159dd565b60405180910390fd5b61272f6003338584613765565b5b5b5b8260ff16600d60009054906101000a900467ffffffffffffffff166127579190615b45565b600d60006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600d60009054906101000a900467ffffffffffffffff1667ffffffffffffffff1610156127e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127da90615bcd565b60405180910390fd5b6127f0338460ff166137a4565b505050565b6127fd612cb9565b73ffffffffffffffffffffffffffffffffffffffff1661281b611531565b73ffffffffffffffffffffffffffffffffffffffff1614612871576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128689061500b565b60405180910390fd5b6001601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600c80546128d99061505a565b80601f01602080910402602001604051908101604052809291908181526020018280546129059061505a565b80156129525780601f1061292757610100808354040283529160200191612952565b820191906000526020600020905b81548152906001019060200180831161293557829003601f168201915b505050505081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6129f6612cb9565b73ffffffffffffffffffffffffffffffffffffffff16612a14611531565b73ffffffffffffffffffffffffffffffffffffffff1614612a6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a619061500b565b60405180910390fd5b60011515600b60009054906101000a900460ff16151514612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790615213565b60405180910390fd5b60048160ff1611158015612ad75750600a8260ff16105b612b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0d90615c39565b60405180910390fd5b81600e6000600184612b289190615192565b60ff1660ff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505050565b612b60612cb9565b73ffffffffffffffffffffffffffffffffffffffff16612b7e611531565b73ffffffffffffffffffffffffffffffffffffffff1614612bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bcb9061500b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3a90615ccb565b60405180910390fd5b612c4c816131da565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081612ccc612f16565b11158015612cdb575060005482105b8015612d08575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612e09576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401612d86929190615ceb565b602060405180830381865afa158015612da3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dc79190615d29565b612e0857806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401612dff91906145bc565b60405180910390fd5b5b50565b6000612e1782611263565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612e7e576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16612e9d612cb9565b73ffffffffffffffffffffffffffffffffffffffff1614158015612ecf5750612ecd81612ec8612cb9565b61295a565b155b15612f06576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f118383836137c2565b505050565b600090565b612f26838383613874565b505050565b612f4683838360405180602001604052806000815250611d14565b505050565b612f53614316565b600082905080612f61612f16565b11158015612f70575060005481105b156131a3576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516131a157600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146130855780925050506131d5565b5b6001156131a057818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461319b5780925050506131d5565b613086565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6132a8612cb9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361330c576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000613319612cb9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166133c6612cb9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161340b919061440d565b60405180910390a35050565b613422848484613874565b6134418373ffffffffffffffffffffffffffffffffffffffff16613d28565b8015613456575061345484848484613d3b565b155b1561348d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff169050919050565b60606000820361353a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061364e565b600082905060005b6000821461356c578080613555906154d6565b915050600a826135659190615d85565b9150613542565b60008167ffffffffffffffff81111561358857613587614827565b5b6040519080825280601f01601f1916602001820160405280156135ba5781602001600182028036833780820191505090505b5090505b60008514613647576001826135d39190615db6565b9150600a856135e29190615dea565b60306135ee9190615a69565b60f81b818381518110613604576136036154a7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856136409190615d85565b94506135be565b8093505050505b919050565b600061368683833360405160200161366b9190615e63565b60405160208183030381529060405280519060200120613e8b565b905092915050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b600a816137729190615e7e565b67ffffffffffffffff168460ff160361379e5761379d838360ff16836137989190615b09565b6136f8565b5b50505050565b6137be828260405180602001604052806000815250613ea2565b5050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061387f82612f4b565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146138ea576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661390b612cb9565b73ffffffffffffffffffffffffffffffffffffffff16148061393a575061393985613934612cb9565b61295a565b5b8061397f5750613948612cb9565b73ffffffffffffffffffffffffffffffffffffffff1661396784610bef565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806139b8576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613a1e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613a2b8585856001613eb4565b613a37600084876137c2565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603613cb6576000548214613cb557878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613d218585856001613eba565b5050505050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613d61612cb9565b8786866040518563ffffffff1660e01b8152600401613d839493929190615f04565b6020604051808303816000875af1925050508015613dbf57506040513d601f19601f82011682018060405250810190613dbc9190615f65565b60015b613e38573d8060008114613def576040519150601f19603f3d011682016040523d82523d6000602084013e613df4565b606091505b506000815103613e30576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600082613e988584613ec0565b1490509392505050565b613eaf8383836001613f35565b505050565b50505050565b50505050565b60008082905060005b8451811015613f2a576000858281518110613ee757613ee66154a7565b5b60200260200101519050808311613f0957613f0283826142ff565b9250613f16565b613f1381846142ff565b92505b508080613f22906154d6565b915050613ec9565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613fa1576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403613fdb576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613fe86000868387613eb4565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156141b257506141b18773ffffffffffffffffffffffffffffffffffffffff16613d28565b5b15614277575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46142276000888480600101955088613d3b565b61425d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036141b857826000541461427257600080fd5b6142e2565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203614278575b8160008190555050506142f86000868387613eba565b5050505050565b600082600052816020526040600020905092915050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6143a28161436d565b81146143ad57600080fd5b50565b6000813590506143bf81614399565b92915050565b6000602082840312156143db576143da614363565b5b60006143e9848285016143b0565b91505092915050565b60008115159050919050565b614407816143f2565b82525050565b600060208201905061442260008301846143fe565b92915050565b600067ffffffffffffffff82169050919050565b61444581614428565b82525050565b6000602082019050614460600083018461443c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156144a0578082015181840152602081019050614485565b60008484015250505050565b6000601f19601f8301169050919050565b60006144c882614466565b6144d28185614471565b93506144e2818560208601614482565b6144eb816144ac565b840191505092915050565b6000602082019050818103600083015261451081846144bd565b905092915050565b6000819050919050565b61452b81614518565b811461453657600080fd5b50565b60008135905061454881614522565b92915050565b60006020828403121561456457614563614363565b5b600061457284828501614539565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006145a68261457b565b9050919050565b6145b68161459b565b82525050565b60006020820190506145d160008301846145ad565b92915050565b6145e08161459b565b81146145eb57600080fd5b50565b6000813590506145fd816145d7565b92915050565b6000806040838503121561461a57614619614363565b5b6000614628858286016145ee565b925050602061463985828601614539565b9150509250929050565b60006020828403121561465957614658614363565b5b6000614667848285016145ee565b91505092915050565b61467981614518565b82525050565b60006020820190506146946000830184614670565b92915050565b600060ff82169050919050565b6146b08161469a565b81146146bb57600080fd5b50565b6000813590506146cd816146a7565b92915050565b6000602082840312156146e9576146e8614363565b5b60006146f7848285016146be565b91505092915050565b60008060006060848603121561471957614718614363565b5b6000614727868287016145ee565b9350506020614738868287016145ee565b925050604061474986828701614539565b9150509250925092565b6000819050919050565b61476681614753565b82525050565b6000602082019050614781600083018461475d565b92915050565b6147908161469a565b82525050565b60006020820190506147ab6000830184614787565b92915050565b6147ba81614753565b81146147c557600080fd5b50565b6000813590506147d7816147b1565b92915050565b600080604083850312156147f4576147f3614363565b5b6000614802858286016147c8565b9250506020614813858286016146be565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61485f826144ac565b810181811067ffffffffffffffff8211171561487e5761487d614827565b5b80604052505050565b6000614891614359565b905061489d8282614856565b919050565b600067ffffffffffffffff8211156148bd576148bc614827565b5b6148c6826144ac565b9050602081019050919050565b82818337600083830152505050565b60006148f56148f0846148a2565b614887565b90508281526020810184848401111561491157614910614822565b5b61491c8482856148d3565b509392505050565b600082601f8301126149395761493861481d565b5b81356149498482602086016148e2565b91505092915050565b60006020828403121561496857614967614363565b5b600082013567ffffffffffffffff81111561498657614985614368565b5b61499284828501614924565b91505092915050565b6000819050919050565b60006149c06149bb6149b68461457b565b61499b565b61457b565b9050919050565b60006149d2826149a5565b9050919050565b60006149e4826149c7565b9050919050565b6149f4816149d9565b82525050565b6000602082019050614a0f60008301846149eb565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614a4a81614518565b82525050565b6000614a5c8383614a41565b60208301905092915050565b6000602082019050919050565b6000614a8082614a15565b614a8a8185614a20565b9350614a9583614a31565b8060005b83811015614ac6578151614aad8882614a50565b9750614ab883614a68565b925050600181019050614a99565b5085935050505092915050565b60006020820190508181036000830152614aed8184614a75565b905092915050565b60008160000b9050919050565b614b0b81614af5565b8114614b1657600080fd5b50565b600081359050614b2881614b02565b92915050565b600080600060608486031215614b4757614b46614363565b5b6000614b5586828701614539565b9350506020614b6686828701614539565b9250506040614b7786828701614b19565b9150509250925092565b600060c082019050614b966000830189614670565b614ba36020830188614670565b614bb06040830187614670565b614bbd6060830186614670565b614bca6080830185614670565b614bd760a0830184614670565b979650505050505050565b60008060408385031215614bf957614bf8614363565b5b6000614c0785828601614539565b9250506020614c18858286016146be565b9150509250929050565b6000604082019050614c376000830185614670565b614c446020830184614787565b9392505050565b614c54816143f2565b8114614c5f57600080fd5b50565b600081359050614c7181614c4b565b92915050565b60008060408385031215614c8e57614c8d614363565b5b6000614c9c858286016146be565b9250506020614cad85828601614c62565b9150509250929050565b60008060408385031215614cce57614ccd614363565b5b6000614cdc858286016145ee565b9250506020614ced85828601614c62565b9150509250929050565b600067ffffffffffffffff821115614d1257614d11614827565b5b614d1b826144ac565b9050602081019050919050565b6000614d3b614d3684614cf7565b614887565b905082815260208101848484011115614d5757614d56614822565b5b614d628482856148d3565b509392505050565b600082601f830112614d7f57614d7e61481d565b5b8135614d8f848260208601614d28565b91505092915050565b60008060008060808587031215614db257614db1614363565b5b6000614dc0878288016145ee565b9450506020614dd1878288016145ee565b9350506040614de287828801614539565b925050606085013567ffffffffffffffff811115614e0357614e02614368565b5b614e0f87828801614d6a565b91505092959194509250565b600067ffffffffffffffff821115614e3657614e35614827565b5b602082029050602081019050919050565b600080fd5b6000614e5f614e5a84614e1b565b614887565b90508083825260208201905060208402830185811115614e8257614e81614e47565b5b835b81811015614eab5780614e9788826147c8565b845260208401935050602081019050614e84565b5050509392505050565b600082601f830112614eca57614ec961481d565b5b8135614eda848260208601614e4c565b91505092915050565b60008060408385031215614efa57614ef9614363565b5b6000614f08858286016146be565b925050602083013567ffffffffffffffff811115614f2957614f28614368565b5b614f3585828601614eb5565b9150509250929050565b60008060408385031215614f5657614f55614363565b5b6000614f64858286016145ee565b9250506020614f75858286016145ee565b9150509250929050565b60008060408385031215614f9657614f95614363565b5b6000614fa4858286016146be565b9250506020614fb5858286016146be565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614ff5602083614471565b915061500082614fbf565b602082019050919050565b6000602082019050818103600083015261502481614fe8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061507257607f821691505b6020821081036150855761508461502b565b5b50919050565b7f4e6f7420616c6c6f776564000000000000000000000000000000000000000000600082015250565b60006150c1600b83614471565b91506150cc8261508b565b602082019050919050565b600060208201905081810360008301526150f0816150b4565b9050919050565b7f54797065206572726f7200000000000000000000000000000000000000000000600082015250565b600061512d600a83614471565b9150615138826150f7565b602082019050919050565b6000602082019050818103600083015261515c81615120565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061519d8261469a565b91506151a88361469a565b9250828203905060ff8111156151c1576151c0615163565b5b92915050565b7f53616c65206e6f74207374617274656400000000000000000000000000000000600082015250565b60006151fd601083614471565b9150615208826151c7565b602082019050919050565b6000602082019050818103600083015261522c816151f0565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026152957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615258565b61529f8683615258565b95508019841693508086168417925050509392505050565b60006152d26152cd6152c884614518565b61499b565b614518565b9050919050565b6000819050919050565b6152ec836152b7565b6153006152f8826152d9565b848454615265565b825550505050565b600090565b615315615308565b6153208184846152e3565b505050565b5b818110156153445761533960008261530d565b600181019050615326565b5050565b601f8211156153895761535a81615233565b61536384615248565b81016020851015615372578190505b61538661537e85615248565b830182615325565b50505b505050565b600082821c905092915050565b60006153ac6000198460080261538e565b1980831691505092915050565b60006153c5838361539b565b9150826002028217905092915050565b6153de82614466565b67ffffffffffffffff8111156153f7576153f6614827565b5b615401825461505a565b61540c828285615348565b600060209050601f83116001811461543f576000841561542d578287015190505b61543785826153b9565b86555061549f565b601f19841661544d86615233565b60005b8281101561547557848901518255600182019150602085019450602081019050615450565b86831015615492578489015161548e601f89168261539b565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006154e182614518565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361551357615512615163565b5b600182019050919050565b60006155298261469a565b915060ff820361553c5761553b615163565b5b600182019050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061557d601f83614471565b915061558882615547565b602082019050919050565b600060208201905081810360008301526155ac81615570565b9050919050565b7f4e6f7420616c6c6f776564206f726967696e0000000000000000000000000000600082015250565b60006155e9601283614471565b91506155f4826155b3565b602082019050919050565b60006020820190508181036000830152615618816155dc565b9050919050565b600081905092915050565b50565b600061563a60008361561f565b91506156458261562a565b600082019050919050565b600061565b8261562d565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061569b601083614471565b91506156a682615665565b602082019050919050565b600060208201905081810360008301526156ca8161568e565b9050919050565b7f4d657461646174613a206e6f6e6578697374656e7420746f6b656e0000000000600082015250565b6000615707601b83614471565b9150615712826156d1565b602082019050919050565b60006020820190508181036000830152615736816156fa565b9050919050565b600081905092915050565b600081546157558161505a565b61575f818661573d565b9450600182166000811461577a576001811461578f576157c2565b60ff19831686528115158202860193506157c2565b61579885615233565b60005b838110156157ba5781548189015260018201915060208101905061579b565b838801955050505b50505092915050565b60006157d682614466565b6157e0818561573d565b93506157f0818560208601614482565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061583260058361573d565b915061583d826157fc565b600582019050919050565b60006158548285615748565b915061586082846157cb565b915061586b82615825565b91508190509392505050565b7f416d6f756e74206d75737420696e20302d360000000000000000000000000000600082015250565b60006158ad601283614471565b91506158b882615877565b602082019050919050565b600060208201905081810360008301526158dc816158a0565b9050919050565b7f73616c65206e6f74207374617274656400000000000000000000000000000000600082015250565b6000615919601083614471565b9150615924826158e3565b602082019050919050565b600060208201905081810360008301526159488161590c565b9050919050565b600061595a82614518565b915061596583614518565b925082820261597381614518565b9150828204841483151761598a57615989615163565b5b5092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b60006159c7601383614471565b91506159d282615991565b602082019050919050565b600060208201905081810360008301526159f6816159ba565b9050919050565b7f4e6f7420416c6c6f776c69737400000000000000000000000000000000000000600082015250565b6000615a33600d83614471565b9150615a3e826159fd565b602082019050919050565b60006020820190508181036000830152615a6281615a26565b9050919050565b6000615a7482614518565b9150615a7f83614518565b9250828201905080821115615a9757615a96615163565b5b92915050565b7f5570706572206c696d6974206578636565646564000000000000000000000000600082015250565b6000615ad3601483614471565b9150615ade82615a9d565b602082019050919050565b60006020820190508181036000830152615b0281615ac6565b9050919050565b6000615b1482614428565b9150615b1f83614428565b9250828201905067ffffffffffffffff811115615b3f57615b3e615163565b5b92915050565b6000615b5082614428565b9150615b5b83614428565b9250828203905067ffffffffffffffff811115615b7b57615b7a615163565b5b92915050565b7f636f756e74206f7574206f662072616e67650000000000000000000000000000600082015250565b6000615bb7601283614471565b9150615bc282615b81565b602082019050919050565b60006020820190508181036000830152615be681615baa565b9050919050565b7f506172616d206572726f72000000000000000000000000000000000000000000600082015250565b6000615c23600b83614471565b9150615c2e82615bed565b602082019050919050565b60006020820190508181036000830152615c5281615c16565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615cb5602683614471565b9150615cc082615c59565b604082019050919050565b60006020820190508181036000830152615ce481615ca8565b9050919050565b6000604082019050615d0060008301856145ad565b615d0d60208301846145ad565b9392505050565b600081519050615d2381614c4b565b92915050565b600060208284031215615d3f57615d3e614363565b5b6000615d4d84828501615d14565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615d9082614518565b9150615d9b83614518565b925082615dab57615daa615d56565b5b828204905092915050565b6000615dc182614518565b9150615dcc83614518565b9250828203905081811115615de457615de3615163565b5b92915050565b6000615df582614518565b9150615e0083614518565b925082615e1057615e0f615d56565b5b828206905092915050565b60008160601b9050919050565b6000615e3382615e1b565b9050919050565b6000615e4582615e28565b9050919050565b615e5d615e588261459b565b615e3a565b82525050565b6000615e6f8284615e4c565b60148201915081905092915050565b6000615e8982614428565b9150615e9483614428565b925082615ea457615ea3615d56565b5b828204905092915050565b600081519050919050565b600082825260208201905092915050565b6000615ed682615eaf565b615ee08185615eba565b9350615ef0818560208601614482565b615ef9816144ac565b840191505092915050565b6000608082019050615f1960008301876145ad565b615f2660208301866145ad565b615f336040830185614670565b8181036060830152615f458184615ecb565b905095945050505050565b600081519050615f5f81614399565b92915050565b600060208284031215615f7b57615f7a614363565b5b6000615f8984828501615f50565b9150509291505056fea264697066735822122084df4a1946548bb95721cb1db5192c969cd1c6b6cf6e32007274bd1efca1ef3e64736f6c6343000811003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000006b2ccadf2d20c76a07e6f496cd1cf89fcdc7c6200000000000000000000000000000000000000000000000000000000000000003467563000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034675630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005968747470733a2f2f666f7274756e65756e69636f726e2e6d7970696e6174612e636c6f75642f697066732f516d66324d436e66513252597978635043644a4a59526b486d3431757234367953534d77414143647a327872744800000000000000000000000000000000000000000000000000000000000000000000000000005968747470733a2f2f666f7274756e65756e69636f726e2e6d7970696e6174612e636c6f75642f697066732f516d66324d436e66513252597978635043644a4a59526b486d3431757234367953534d77414143647a327872744800000000000000

Deployed Bytecode

0x6080604052600436106102465760003560e01c806370a0823111610139578063a22cb465116100b6578063d3d5f34a1161007a578063d3d5f34a146108ba578063e75ddaf2146108d6578063e8a3d485146108ff578063e985e9c51461092a578063ea5ab64514610967578063f2fde38b1461099057610246565b8063a22cb465146107d7578063ac44600214610800578063b88d4fde14610817578063bf0b175e14610840578063c87b56dd1461087d57610246565b806395d89b41116100fd57806395d89b411461070357806396383c041461072e57806398d5fdca146107575780639abc8320146107835780639d0a4f93146107ae57610246565b806370a082311461062b578063715018a6146106685780637fe87e871461067f57806389bfe549146106a85780638da5cb5b146106d857610246565b806327508654116101c757806341f434341161018b57806341f434341461053257806342842e0e1461055d578063438b6300146105865780635c975abb146105c35780636352211e146105ee57610246565b806327508654146104295780632d85640714610466578063373e722b146104a3578063383cce32146104e057806339a0c6f91461050957610246565b8063095ea7b31161020e578063095ea7b3146103325780630f79c7f71461035b57806318160ddd1461039857806322be1a89146103c357806323b872dd1461040057610246565b806301ffc9a71461024b5780630592ae531461028857806306661abd1461029f57806306fdde03146102ca578063081812fc146102f5575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d91906143c5565b6109b9565b60405161027f919061440d565b60405180910390f35b34801561029457600080fd5b5061029d610a9b565b005b3480156102ab57600080fd5b506102b4610b43565b6040516102c1919061444b565b60405180910390f35b3480156102d657600080fd5b506102df610b5d565b6040516102ec91906144f6565b60405180910390f35b34801561030157600080fd5b5061031c6004803603810190610317919061454e565b610bef565b60405161032991906145bc565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190614603565b610c6b565b005b34801561036757600080fd5b50610382600480360381019061037d9190614643565b610d17565b60405161038f919061440d565b60405180910390f35b3480156103a457600080fd5b506103ad610d37565b6040516103ba919061467f565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e591906146d3565b610d4e565b6040516103f7919061440d565b60405180910390f35b34801561040c57600080fd5b5061042760048036038101906104229190614700565b610d6e565b005b34801561043557600080fd5b50610450600480360381019061044b91906146d3565b610dbd565b60405161045d919061467f565b60405180910390f35b34801561047257600080fd5b5061048d600480360381019061048891906146d3565b610dd5565b60405161049a919061476c565b60405180910390f35b3480156104af57600080fd5b506104ca60048036038101906104c591906146d3565b610ded565b6040516104d79190614796565b60405180910390f35b3480156104ec57600080fd5b50610507600480360381019061050291906147dd565b610e0d565b005b34801561051557600080fd5b50610530600480360381019061052b9190614952565b610efe565b005b34801561053e57600080fd5b50610547610fe3565b60405161055491906149fa565b60405180910390f35b34801561056957600080fd5b50610584600480360381019061057f9190614700565b610ff5565b005b34801561059257600080fd5b506105ad60048036038101906105a89190614643565b611044565b6040516105ba9190614ad3565b60405180910390f35b3480156105cf57600080fd5b506105d8611250565b6040516105e5919061440d565b60405180910390f35b3480156105fa57600080fd5b506106156004803603810190610610919061454e565b611263565b60405161062291906145bc565b60405180910390f35b34801561063757600080fd5b50610652600480360381019061064d9190614643565b611279565b60405161065f919061467f565b60405180910390f35b34801561067457600080fd5b5061067d611348565b005b34801561068b57600080fd5b506106a660048036038101906106a19190614b2e565b6113d0565b005b3480156106b457600080fd5b506106bd611507565b6040516106cf96959493929190614b81565b60405180910390f35b3480156106e457600080fd5b506106ed611531565b6040516106fa91906145bc565b60405180910390f35b34801561070f57600080fd5b5061071861155b565b60405161072591906144f6565b60405180910390f35b34801561073a57600080fd5b5061075560048036038101906107509190614be2565b6115ed565b005b34801561076357600080fd5b5061076c611734565b60405161077a929190614c22565b60405180910390f35b34801561078f57600080fd5b5061079861185e565b6040516107a591906144f6565b60405180910390f35b3480156107ba57600080fd5b506107d560048036038101906107d09190614c77565b6118ec565b005b3480156107e357600080fd5b506107fe60048036038101906107f99190614cb7565b611a44565b005b34801561080c57600080fd5b50610815611af0565b005b34801561082357600080fd5b5061083e60048036038101906108399190614d98565b611d14565b005b34801561084c57600080fd5b5061086760048036038101906108629190614643565b611d65565b604051610874919061444b565b60405180910390f35b34801561088957600080fd5b506108a4600480360381019061089f919061454e565b611d77565b6040516108b191906144f6565b60405180910390f35b6108d460048036038101906108cf9190614ee3565b611e0d565b005b3480156108e257600080fd5b506108fd60048036038101906108f89190614643565b6127f5565b005b34801561090b57600080fd5b506109146128cc565b60405161092191906144f6565b60405180910390f35b34801561093657600080fd5b50610951600480360381019061094c9190614f3f565b61295a565b60405161095e919061440d565b60405180910390f35b34801561097357600080fd5b5061098e60048036038101906109899190614f7f565b6129ee565b005b34801561099c57600080fd5b506109b760048036038101906109b29190614643565b612b58565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a945750610a9382612c4f565b5b9050919050565b610aa3612cb9565b73ffffffffffffffffffffffffffffffffffffffff16610ac1611531565b73ffffffffffffffffffffffffffffffffffffffff1614610b17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0e9061500b565b60405180910390fd5b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b600d60009054906101000a900467ffffffffffffffff1681565b606060028054610b6c9061505a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b989061505a565b8015610be55780601f10610bba57610100808354040283529160200191610be5565b820191906000526020600020905b815481529060010190602001808311610bc857829003601f168201915b5050505050905090565b6000610bfa82612cc1565b610c30576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610c7581612d0f565b60011515601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610d08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cff906150d7565b60405180910390fd5b610d128383612e0c565b505050565b60126020528060005260406000206000915054906101000a900460ff1681565b6000610d41612f16565b6001546000540303905090565b60116020528060005260406000206000915054906101000a900460ff1681565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610dac57610dab33612d0f565b5b610db7848484612f1b565b50505050565b600f6020528060005260406000206000915090505481565b60106020528060005260406000206000915090505481565b600e6020528060005260406000206000915054906101000a900460ff1681565b610e15612cb9565b73ffffffffffffffffffffffffffffffffffffffff16610e33611531565b73ffffffffffffffffffffffffffffffffffffffff1614610e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e809061500b565b60405180910390fd5b60038160ff161115610ed0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec790615143565b60405180910390fd5b8160106000600184610ee29190615192565b60ff1660ff168152602001908152602001600020819055505050565b610f06612cb9565b73ffffffffffffffffffffffffffffffffffffffff16610f24611531565b73ffffffffffffffffffffffffffffffffffffffff1614610f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f719061500b565b60405180910390fd5b60011515600b60009054906101000a900460ff16151514610fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc790615213565b60405180910390fd5b80600a9081610fdf91906153d5565b5050565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110335761103233612d0f565b5b61103e848484612f2b565b50505050565b6060600061105183611279565b905060008167ffffffffffffffff81111561106f5761106e614827565b5b60405190808252806020026020018201604052801561109d5781602001602082028036833780820191505090505b50905060006110aa612f16565b90506000805b84821015611243576000600460008581526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001511580156111c05750600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614155b156111cd57806000015191505b8773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361122f5783858481518110611214576112136154a7565b5b602002602001018181525050828061122b906154d6565b9350505b838061123a906154d6565b945050506110b0565b8395505050505050919050565b600b60009054906101000a900460ff1681565b600061126e82612f4b565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112e0576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611350612cb9565b73ffffffffffffffffffffffffffffffffffffffff1661136e611531565b73ffffffffffffffffffffffffffffffffffffffff16146113c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bb9061500b565b60405180910390fd5b6113ce60006131da565b565b6113d8612cb9565b73ffffffffffffffffffffffffffffffffffffffff166113f6611531565b73ffffffffffffffffffffffffffffffffffffffff161461144c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114439061500b565b60405180910390fd5b60011515600b60009054906101000a900460ff161515146114a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149990615213565b60405180910390fd5b60018160000b036114c25782601460000181905550816014600101819055505b60028160000b036114e25782601460020181905550816014600301819055505b60038160000b036115025782601460040181905550816014600501819055505b505050565b60148060000154908060010154908060020154908060030154908060040154908060050154905086565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461156a9061505a565b80601f01602080910402602001604051908101604052809291908181526020018280546115969061505a565b80156115e35780601f106115b8576101008083540402835291602001916115e3565b820191906000526020600020905b8154815290600101906020018083116115c657829003601f168201915b5050505050905090565b6115f5612cb9565b73ffffffffffffffffffffffffffffffffffffffff16611613611531565b73ffffffffffffffffffffffffffffffffffffffff1614611669576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116609061500b565b60405180910390fd5b60011515600b60009054906101000a900460ff161515146116bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b690615213565b60405180910390fd5b60048160ff161115611706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fd90615143565b60405180910390fd5b81600f60006001846117189190615192565b60ff1660ff168152602001908152602001600020819055505050565b60008060008060011515601160008060ff16815260200190815260200160002060009054906101000a900460ff1615150361178b57600f60008060ff16815260200190815260200160002054915060019050611852565b6001151560116000600160ff16815260200190815260200160002060009054906101000a900460ff161515036117de57600f6000600160ff16815260200190815260200160002054915060029050611851565b6001151560116000600260ff16815260200190815260200160002060009054906101000a900460ff1615150361183157600f6000600260ff16815260200190815260200160002054915060039050611850565b600f6000600360ff168152602001908152602001600020549150600490505b5b5b81819350935050509091565b600a805461186b9061505a565b80601f01602080910402602001604051908101604052809291908181526020018280546118979061505a565b80156118e45780601f106118b9576101008083540402835291602001916118e4565b820191906000526020600020905b8154815290600101906020018083116118c757829003601f168201915b505050505081565b6118f4612cb9565b73ffffffffffffffffffffffffffffffffffffffff16611912611531565b73ffffffffffffffffffffffffffffffffffffffff1614611968576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195f9061500b565b60405180910390fd5b60038260ff1611156119af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a690615143565b60405180910390fd5b60005b60038160ff1611611a02576000601160008360ff1660ff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806119fa9061551e565b9150506119b2565b508060116000600185611a159190615192565b60ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b81611a4e81612d0f565b60011515601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611ae1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad8906150d7565b60405180910390fd5b611aeb83836132a0565b505050565b600260095403611b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2c90615593565b60405180910390fd5b60026009819055503273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba2906155ff565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c32906155ff565b60405180910390fd5b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051611c8390615650565b60006040518083038185875af1925050503d8060008114611cc0576040519150601f19603f3d011682016040523d82523d6000602084013e611cc5565b606091505b5050905080611d09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d00906156b1565b60405180910390fd5b506001600981905550565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611d5257611d5133612d0f565b5b611d5e85858585613417565b5050505050565b6000611d7082613493565b9050919050565b6060611d8282612cc1565b8015611d9c57506000600a8054611d989061505a565b9050115b611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd29061571d565b60405180910390fd5b600a611de6836134f3565b604051602001611df7929190615848565b6040516020818303038152906040529050919050565b60011515600b60009054906101000a900460ff16151514611e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5a90615213565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec8906155ff565b60405180910390fd5b60008260ff16118015611ee8575060068260ff1611155b611f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1e906158c3565b60405180910390fd5b6000611f3233613493565b905060011515601160008060ff16815260200190815260200160002060009054906101000a900460ff16151503612140576014600001544210158015611f7d57506014600101544211155b8015611f9f57506000600f60008060ff16815260200190815260200160002054115b611fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd59061592f565b60405180910390fd5b8260ff16600f60008060ff16815260200190815260200160002054612003919061594f565b341015612045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203c906159dd565b60405180910390fd5b61206582601060008060ff16815260200190815260200160002054613653565b6120a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209b90615a49565b60405180910390fd5b600e60008060ff16815260200190815260200160002060009054906101000a900460ff1660ff166120d43361368e565b8460ff166120e29190615a69565b1115612123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211a90615ae9565b60405180910390fd5b61213b338460ff16836121369190615b09565b6136f8565b612732565b6001151560116000600160ff16815260200190815260200160002060009054906101000a900460ff1615150361236c57601460020154421015801561218a57506014600301544211155b80156121ad57506000600f6000600160ff16815260200190815260200160002054115b6121ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e39061592f565b60405180910390fd5b8260ff16600f6000600160ff16815260200190815260200160002054612212919061594f565b341015612254576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224b906159dd565b60405180910390fd5b600a8167ffffffffffffffff16101561226c57600a90505b600e6000600160ff16815260200190815260200160002060009054906101000a900460ff1660ff16600a8460ff16836122a59190615b09565b6122af9190615b45565b67ffffffffffffffff1611156122fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f190615ae9565b60405180910390fd5b61231b8260106000600160ff16815260200190815260200160002054613653565b61235a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235190615a49565b60405180910390fd5b6123676001338584613765565b612731565b6001151560116000600260ff16815260200190815260200160002060009054906101000a900460ff161515036125985760146004015442101580156123b657506014600501544211155b80156123d957506000600f6000600260ff16815260200190815260200160002054115b612418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240f9061592f565b60405180910390fd5b8260ff16600f6000600260ff1681526020019081526020016000205461243e919061594f565b341015612480576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612477906159dd565b60405180910390fd5b60148167ffffffffffffffff16101561249857601490505b600e6000600260ff16815260200190815260200160002060009054906101000a900460ff1660ff1660148460ff16836124d19190615b09565b6124db9190615b45565b67ffffffffffffffff161115612526576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251d90615ae9565b60405180910390fd5b6125478260106000600260ff16815260200190815260200160002054613653565b612586576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257d90615a49565b60405180910390fd5b6125936002338584613765565b612730565b601460050154421180156125b25750600060146005015414155b6125f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e89061592f565b60405180910390fd5b601e8167ffffffffffffffff16101561260957601e90505b600e6000600360ff16815260200190815260200160002060009054906101000a900460ff1660ff16601e8460ff16836126429190615b09565b61264c9190615b45565b67ffffffffffffffff161115612697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268e90615ae9565b60405180910390fd5b6000600f6000600360ff168152602001908152602001600020541180156126e357508260ff16600f6000600360ff168152602001908152602001600020546126df919061594f565b3410155b612722576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612719906159dd565b60405180910390fd5b61272f6003338584613765565b5b5b5b8260ff16600d60009054906101000a900467ffffffffffffffff166127579190615b45565b600d60006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600d60009054906101000a900467ffffffffffffffff1667ffffffffffffffff1610156127e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127da90615bcd565b60405180910390fd5b6127f0338460ff166137a4565b505050565b6127fd612cb9565b73ffffffffffffffffffffffffffffffffffffffff1661281b611531565b73ffffffffffffffffffffffffffffffffffffffff1614612871576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128689061500b565b60405180910390fd5b6001601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600c80546128d99061505a565b80601f01602080910402602001604051908101604052809291908181526020018280546129059061505a565b80156129525780601f1061292757610100808354040283529160200191612952565b820191906000526020600020905b81548152906001019060200180831161293557829003601f168201915b505050505081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6129f6612cb9565b73ffffffffffffffffffffffffffffffffffffffff16612a14611531565b73ffffffffffffffffffffffffffffffffffffffff1614612a6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a619061500b565b60405180910390fd5b60011515600b60009054906101000a900460ff16151514612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790615213565b60405180910390fd5b60048160ff1611158015612ad75750600a8260ff16105b612b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0d90615c39565b60405180910390fd5b81600e6000600184612b289190615192565b60ff1660ff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505050565b612b60612cb9565b73ffffffffffffffffffffffffffffffffffffffff16612b7e611531565b73ffffffffffffffffffffffffffffffffffffffff1614612bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bcb9061500b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3a90615ccb565b60405180910390fd5b612c4c816131da565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081612ccc612f16565b11158015612cdb575060005482105b8015612d08575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612e09576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401612d86929190615ceb565b602060405180830381865afa158015612da3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dc79190615d29565b612e0857806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401612dff91906145bc565b60405180910390fd5b5b50565b6000612e1782611263565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612e7e576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16612e9d612cb9565b73ffffffffffffffffffffffffffffffffffffffff1614158015612ecf5750612ecd81612ec8612cb9565b61295a565b155b15612f06576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f118383836137c2565b505050565b600090565b612f26838383613874565b505050565b612f4683838360405180602001604052806000815250611d14565b505050565b612f53614316565b600082905080612f61612f16565b11158015612f70575060005481105b156131a3576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516131a157600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146130855780925050506131d5565b5b6001156131a057818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461319b5780925050506131d5565b613086565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6132a8612cb9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361330c576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000613319612cb9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166133c6612cb9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161340b919061440d565b60405180910390a35050565b613422848484613874565b6134418373ffffffffffffffffffffffffffffffffffffffff16613d28565b8015613456575061345484848484613d3b565b155b1561348d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff169050919050565b60606000820361353a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061364e565b600082905060005b6000821461356c578080613555906154d6565b915050600a826135659190615d85565b9150613542565b60008167ffffffffffffffff81111561358857613587614827565b5b6040519080825280601f01601f1916602001820160405280156135ba5781602001600182028036833780820191505090505b5090505b60008514613647576001826135d39190615db6565b9150600a856135e29190615dea565b60306135ee9190615a69565b60f81b818381518110613604576136036154a7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856136409190615d85565b94506135be565b8093505050505b919050565b600061368683833360405160200161366b9190615e63565b60405160208183030381529060405280519060200120613e8b565b905092915050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b600a816137729190615e7e565b67ffffffffffffffff168460ff160361379e5761379d838360ff16836137989190615b09565b6136f8565b5b50505050565b6137be828260405180602001604052806000815250613ea2565b5050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061387f82612f4b565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146138ea576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661390b612cb9565b73ffffffffffffffffffffffffffffffffffffffff16148061393a575061393985613934612cb9565b61295a565b5b8061397f5750613948612cb9565b73ffffffffffffffffffffffffffffffffffffffff1661396784610bef565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806139b8576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613a1e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613a2b8585856001613eb4565b613a37600084876137c2565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603613cb6576000548214613cb557878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613d218585856001613eba565b5050505050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613d61612cb9565b8786866040518563ffffffff1660e01b8152600401613d839493929190615f04565b6020604051808303816000875af1925050508015613dbf57506040513d601f19601f82011682018060405250810190613dbc9190615f65565b60015b613e38573d8060008114613def576040519150601f19603f3d011682016040523d82523d6000602084013e613df4565b606091505b506000815103613e30576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600082613e988584613ec0565b1490509392505050565b613eaf8383836001613f35565b505050565b50505050565b50505050565b60008082905060005b8451811015613f2a576000858281518110613ee757613ee66154a7565b5b60200260200101519050808311613f0957613f0283826142ff565b9250613f16565b613f1381846142ff565b92505b508080613f22906154d6565b915050613ec9565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613fa1576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403613fdb576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613fe86000868387613eb4565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156141b257506141b18773ffffffffffffffffffffffffffffffffffffffff16613d28565b5b15614277575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46142276000888480600101955088613d3b565b61425d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036141b857826000541461427257600080fd5b6142e2565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203614278575b8160008190555050506142f86000868387613eba565b5050505050565b600082600052816020526040600020905092915050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6143a28161436d565b81146143ad57600080fd5b50565b6000813590506143bf81614399565b92915050565b6000602082840312156143db576143da614363565b5b60006143e9848285016143b0565b91505092915050565b60008115159050919050565b614407816143f2565b82525050565b600060208201905061442260008301846143fe565b92915050565b600067ffffffffffffffff82169050919050565b61444581614428565b82525050565b6000602082019050614460600083018461443c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156144a0578082015181840152602081019050614485565b60008484015250505050565b6000601f19601f8301169050919050565b60006144c882614466565b6144d28185614471565b93506144e2818560208601614482565b6144eb816144ac565b840191505092915050565b6000602082019050818103600083015261451081846144bd565b905092915050565b6000819050919050565b61452b81614518565b811461453657600080fd5b50565b60008135905061454881614522565b92915050565b60006020828403121561456457614563614363565b5b600061457284828501614539565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006145a68261457b565b9050919050565b6145b68161459b565b82525050565b60006020820190506145d160008301846145ad565b92915050565b6145e08161459b565b81146145eb57600080fd5b50565b6000813590506145fd816145d7565b92915050565b6000806040838503121561461a57614619614363565b5b6000614628858286016145ee565b925050602061463985828601614539565b9150509250929050565b60006020828403121561465957614658614363565b5b6000614667848285016145ee565b91505092915050565b61467981614518565b82525050565b60006020820190506146946000830184614670565b92915050565b600060ff82169050919050565b6146b08161469a565b81146146bb57600080fd5b50565b6000813590506146cd816146a7565b92915050565b6000602082840312156146e9576146e8614363565b5b60006146f7848285016146be565b91505092915050565b60008060006060848603121561471957614718614363565b5b6000614727868287016145ee565b9350506020614738868287016145ee565b925050604061474986828701614539565b9150509250925092565b6000819050919050565b61476681614753565b82525050565b6000602082019050614781600083018461475d565b92915050565b6147908161469a565b82525050565b60006020820190506147ab6000830184614787565b92915050565b6147ba81614753565b81146147c557600080fd5b50565b6000813590506147d7816147b1565b92915050565b600080604083850312156147f4576147f3614363565b5b6000614802858286016147c8565b9250506020614813858286016146be565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61485f826144ac565b810181811067ffffffffffffffff8211171561487e5761487d614827565b5b80604052505050565b6000614891614359565b905061489d8282614856565b919050565b600067ffffffffffffffff8211156148bd576148bc614827565b5b6148c6826144ac565b9050602081019050919050565b82818337600083830152505050565b60006148f56148f0846148a2565b614887565b90508281526020810184848401111561491157614910614822565b5b61491c8482856148d3565b509392505050565b600082601f8301126149395761493861481d565b5b81356149498482602086016148e2565b91505092915050565b60006020828403121561496857614967614363565b5b600082013567ffffffffffffffff81111561498657614985614368565b5b61499284828501614924565b91505092915050565b6000819050919050565b60006149c06149bb6149b68461457b565b61499b565b61457b565b9050919050565b60006149d2826149a5565b9050919050565b60006149e4826149c7565b9050919050565b6149f4816149d9565b82525050565b6000602082019050614a0f60008301846149eb565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614a4a81614518565b82525050565b6000614a5c8383614a41565b60208301905092915050565b6000602082019050919050565b6000614a8082614a15565b614a8a8185614a20565b9350614a9583614a31565b8060005b83811015614ac6578151614aad8882614a50565b9750614ab883614a68565b925050600181019050614a99565b5085935050505092915050565b60006020820190508181036000830152614aed8184614a75565b905092915050565b60008160000b9050919050565b614b0b81614af5565b8114614b1657600080fd5b50565b600081359050614b2881614b02565b92915050565b600080600060608486031215614b4757614b46614363565b5b6000614b5586828701614539565b9350506020614b6686828701614539565b9250506040614b7786828701614b19565b9150509250925092565b600060c082019050614b966000830189614670565b614ba36020830188614670565b614bb06040830187614670565b614bbd6060830186614670565b614bca6080830185614670565b614bd760a0830184614670565b979650505050505050565b60008060408385031215614bf957614bf8614363565b5b6000614c0785828601614539565b9250506020614c18858286016146be565b9150509250929050565b6000604082019050614c376000830185614670565b614c446020830184614787565b9392505050565b614c54816143f2565b8114614c5f57600080fd5b50565b600081359050614c7181614c4b565b92915050565b60008060408385031215614c8e57614c8d614363565b5b6000614c9c858286016146be565b9250506020614cad85828601614c62565b9150509250929050565b60008060408385031215614cce57614ccd614363565b5b6000614cdc858286016145ee565b9250506020614ced85828601614c62565b9150509250929050565b600067ffffffffffffffff821115614d1257614d11614827565b5b614d1b826144ac565b9050602081019050919050565b6000614d3b614d3684614cf7565b614887565b905082815260208101848484011115614d5757614d56614822565b5b614d628482856148d3565b509392505050565b600082601f830112614d7f57614d7e61481d565b5b8135614d8f848260208601614d28565b91505092915050565b60008060008060808587031215614db257614db1614363565b5b6000614dc0878288016145ee565b9450506020614dd1878288016145ee565b9350506040614de287828801614539565b925050606085013567ffffffffffffffff811115614e0357614e02614368565b5b614e0f87828801614d6a565b91505092959194509250565b600067ffffffffffffffff821115614e3657614e35614827565b5b602082029050602081019050919050565b600080fd5b6000614e5f614e5a84614e1b565b614887565b90508083825260208201905060208402830185811115614e8257614e81614e47565b5b835b81811015614eab5780614e9788826147c8565b845260208401935050602081019050614e84565b5050509392505050565b600082601f830112614eca57614ec961481d565b5b8135614eda848260208601614e4c565b91505092915050565b60008060408385031215614efa57614ef9614363565b5b6000614f08858286016146be565b925050602083013567ffffffffffffffff811115614f2957614f28614368565b5b614f3585828601614eb5565b9150509250929050565b60008060408385031215614f5657614f55614363565b5b6000614f64858286016145ee565b9250506020614f75858286016145ee565b9150509250929050565b60008060408385031215614f9657614f95614363565b5b6000614fa4858286016146be565b9250506020614fb5858286016146be565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614ff5602083614471565b915061500082614fbf565b602082019050919050565b6000602082019050818103600083015261502481614fe8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061507257607f821691505b6020821081036150855761508461502b565b5b50919050565b7f4e6f7420616c6c6f776564000000000000000000000000000000000000000000600082015250565b60006150c1600b83614471565b91506150cc8261508b565b602082019050919050565b600060208201905081810360008301526150f0816150b4565b9050919050565b7f54797065206572726f7200000000000000000000000000000000000000000000600082015250565b600061512d600a83614471565b9150615138826150f7565b602082019050919050565b6000602082019050818103600083015261515c81615120565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061519d8261469a565b91506151a88361469a565b9250828203905060ff8111156151c1576151c0615163565b5b92915050565b7f53616c65206e6f74207374617274656400000000000000000000000000000000600082015250565b60006151fd601083614471565b9150615208826151c7565b602082019050919050565b6000602082019050818103600083015261522c816151f0565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026152957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615258565b61529f8683615258565b95508019841693508086168417925050509392505050565b60006152d26152cd6152c884614518565b61499b565b614518565b9050919050565b6000819050919050565b6152ec836152b7565b6153006152f8826152d9565b848454615265565b825550505050565b600090565b615315615308565b6153208184846152e3565b505050565b5b818110156153445761533960008261530d565b600181019050615326565b5050565b601f8211156153895761535a81615233565b61536384615248565b81016020851015615372578190505b61538661537e85615248565b830182615325565b50505b505050565b600082821c905092915050565b60006153ac6000198460080261538e565b1980831691505092915050565b60006153c5838361539b565b9150826002028217905092915050565b6153de82614466565b67ffffffffffffffff8111156153f7576153f6614827565b5b615401825461505a565b61540c828285615348565b600060209050601f83116001811461543f576000841561542d578287015190505b61543785826153b9565b86555061549f565b601f19841661544d86615233565b60005b8281101561547557848901518255600182019150602085019450602081019050615450565b86831015615492578489015161548e601f89168261539b565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006154e182614518565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361551357615512615163565b5b600182019050919050565b60006155298261469a565b915060ff820361553c5761553b615163565b5b600182019050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061557d601f83614471565b915061558882615547565b602082019050919050565b600060208201905081810360008301526155ac81615570565b9050919050565b7f4e6f7420616c6c6f776564206f726967696e0000000000000000000000000000600082015250565b60006155e9601283614471565b91506155f4826155b3565b602082019050919050565b60006020820190508181036000830152615618816155dc565b9050919050565b600081905092915050565b50565b600061563a60008361561f565b91506156458261562a565b600082019050919050565b600061565b8261562d565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061569b601083614471565b91506156a682615665565b602082019050919050565b600060208201905081810360008301526156ca8161568e565b9050919050565b7f4d657461646174613a206e6f6e6578697374656e7420746f6b656e0000000000600082015250565b6000615707601b83614471565b9150615712826156d1565b602082019050919050565b60006020820190508181036000830152615736816156fa565b9050919050565b600081905092915050565b600081546157558161505a565b61575f818661573d565b9450600182166000811461577a576001811461578f576157c2565b60ff19831686528115158202860193506157c2565b61579885615233565b60005b838110156157ba5781548189015260018201915060208101905061579b565b838801955050505b50505092915050565b60006157d682614466565b6157e0818561573d565b93506157f0818560208601614482565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061583260058361573d565b915061583d826157fc565b600582019050919050565b60006158548285615748565b915061586082846157cb565b915061586b82615825565b91508190509392505050565b7f416d6f756e74206d75737420696e20302d360000000000000000000000000000600082015250565b60006158ad601283614471565b91506158b882615877565b602082019050919050565b600060208201905081810360008301526158dc816158a0565b9050919050565b7f73616c65206e6f74207374617274656400000000000000000000000000000000600082015250565b6000615919601083614471565b9150615924826158e3565b602082019050919050565b600060208201905081810360008301526159488161590c565b9050919050565b600061595a82614518565b915061596583614518565b925082820261597381614518565b9150828204841483151761598a57615989615163565b5b5092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b60006159c7601383614471565b91506159d282615991565b602082019050919050565b600060208201905081810360008301526159f6816159ba565b9050919050565b7f4e6f7420416c6c6f776c69737400000000000000000000000000000000000000600082015250565b6000615a33600d83614471565b9150615a3e826159fd565b602082019050919050565b60006020820190508181036000830152615a6281615a26565b9050919050565b6000615a7482614518565b9150615a7f83614518565b9250828201905080821115615a9757615a96615163565b5b92915050565b7f5570706572206c696d6974206578636565646564000000000000000000000000600082015250565b6000615ad3601483614471565b9150615ade82615a9d565b602082019050919050565b60006020820190508181036000830152615b0281615ac6565b9050919050565b6000615b1482614428565b9150615b1f83614428565b9250828201905067ffffffffffffffff811115615b3f57615b3e615163565b5b92915050565b6000615b5082614428565b9150615b5b83614428565b9250828203905067ffffffffffffffff811115615b7b57615b7a615163565b5b92915050565b7f636f756e74206f7574206f662072616e67650000000000000000000000000000600082015250565b6000615bb7601283614471565b9150615bc282615b81565b602082019050919050565b60006020820190508181036000830152615be681615baa565b9050919050565b7f506172616d206572726f72000000000000000000000000000000000000000000600082015250565b6000615c23600b83614471565b9150615c2e82615bed565b602082019050919050565b60006020820190508181036000830152615c5281615c16565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615cb5602683614471565b9150615cc082615c59565b604082019050919050565b60006020820190508181036000830152615ce481615ca8565b9050919050565b6000604082019050615d0060008301856145ad565b615d0d60208301846145ad565b9392505050565b600081519050615d2381614c4b565b92915050565b600060208284031215615d3f57615d3e614363565b5b6000615d4d84828501615d14565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615d9082614518565b9150615d9b83614518565b925082615dab57615daa615d56565b5b828204905092915050565b6000615dc182614518565b9150615dcc83614518565b9250828203905081811115615de457615de3615163565b5b92915050565b6000615df582614518565b9150615e0083614518565b925082615e1057615e0f615d56565b5b828206905092915050565b60008160601b9050919050565b6000615e3382615e1b565b9050919050565b6000615e4582615e28565b9050919050565b615e5d615e588261459b565b615e3a565b82525050565b6000615e6f8284615e4c565b60148201915081905092915050565b6000615e8982614428565b9150615e9483614428565b925082615ea457615ea3615d56565b5b828204905092915050565b600081519050919050565b600082825260208201905092915050565b6000615ed682615eaf565b615ee08185615eba565b9350615ef0818560208601614482565b615ef9816144ac565b840191505092915050565b6000608082019050615f1960008301876145ad565b615f2660208301866145ad565b615f336040830185614670565b8181036060830152615f458184615ecb565b905095945050505050565b600081519050615f5f81614399565b92915050565b600060208284031215615f7b57615f7a614363565b5b6000615f8984828501615f50565b9150509291505056fea264697066735822122084df4a1946548bb95721cb1db5192c969cd1c6b6cf6e32007274bd1efca1ef3e64736f6c63430008110033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000006b2ccadf2d20c76a07e6f496cd1cf89fcdc7c6200000000000000000000000000000000000000000000000000000000000000003467563000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034675630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005968747470733a2f2f666f7274756e65756e69636f726e2e6d7970696e6174612e636c6f75642f697066732f516d66324d436e66513252597978635043644a4a59526b486d3431757234367953534d77414143647a327872744800000000000000000000000000000000000000000000000000000000000000000000000000005968747470733a2f2f666f7274756e65756e69636f726e2e6d7970696e6174612e636c6f75642f697066732f516d66324d436e66513252597978635043644a4a59526b486d3431757234367953534d77414143647a327872744800000000000000

-----Decoded View---------------
Arg [0] : _tokenName (string): Fuc
Arg [1] : _tokenSymbol (string): Fuc
Arg [2] : _baseUri (string): https://fortuneunicorn.mypinata.cloud/ipfs/Qmf2MCnfQ2RYyxcPCdJJYRkHm41ur46ySSMwAACdz2xrtH
Arg [3] : _contractURI (string): https://fortuneunicorn.mypinata.cloud/ipfs/Qmf2MCnfQ2RYyxcPCdJJYRkHm41ur46ySSMwAACdz2xrtH
Arg [4] : _address (address): 0x6B2cCAdf2D20c76A07E6f496Cd1cF89fCDc7C620

-----Encoded View---------------
17 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [4] : 0000000000000000000000006b2ccadf2d20c76a07e6f496cd1cf89fcdc7c620
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 4675630000000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [8] : 4675630000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000059
Arg [10] : 68747470733a2f2f666f7274756e65756e69636f726e2e6d7970696e6174612e
Arg [11] : 636c6f75642f697066732f516d66324d436e66513252597978635043644a4a59
Arg [12] : 526b486d3431757234367953534d77414143647a327872744800000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000059
Arg [14] : 68747470733a2f2f666f7274756e65756e69636f726e2e6d7970696e6174612e
Arg [15] : 636c6f75642f697066732f516d66324d436e66513252597978635043644a4a59
Arg [16] : 526b486d3431757234367953534d77414143647a327872744800000000000000


Deployed Bytecode Sourcemap

62423:10127:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42856:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65254:77;;;;;;;;;;;;;:::i;:::-;;62605:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45969:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47480:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63832:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62840:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42105:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62791:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64061:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62690:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62741:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62640;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67230:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71280:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7735:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64232:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71403:860;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62536:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45777:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43225:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20966:103;;;;;;;;;;;;;:::i;:::-;;66023:595;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62933:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;20315:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46138:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66865:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70389:538;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;62506:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65001:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63584:240;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72275:270;;;;;;;;;;;;;:::i;:::-;;64411:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70283:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70935:337;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67582:2412;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64672:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62571:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48114:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65582:248;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21224:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42856:305;42958:4;43010:25;42995:40;;;:11;:40;;;;:105;;;;43067:33;43052:48;;;:11;:48;;;;42995:105;:158;;;;43117:36;43141:11;43117:23;:36::i;:::-;42995:158;42975:178;;42856:305;;;:::o;65254:77::-;20546:12;:10;:12::i;:::-;20535:23;;:7;:5;:7::i;:::-;:23;;;20527:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65317:6:::1;;;;;;;;;;;65316:7;65307:6;;:16;;;;;;;;;;;;;;;;;;65254:77::o:0;62605:26::-;;;;;;;;;;;;;:::o;45969:100::-;46023:13;46056:5;46049:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45969:100;:::o;47480:204::-;47548:7;47573:16;47581:7;47573;:16::i;:::-;47568:64;;47598:34;;;;;;;;;;;;;;47568:64;47652:15;:24;47668:7;47652:24;;;;;;;;;;;;;;;;;;;;;47645:31;;47480:204;;;:::o;63832:221::-;63928:8;9517:30;9538:8;9517:20;:30::i;:::-;63982:4:::1;63957:29;;:11;:21;63969:8;63957:21;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;63949:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;64013:32;64027:8;64037:7;64013:13;:32::i;:::-;63832:221:::0;;;:::o;62840:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;42105:303::-;42149:7;42374:15;:13;:15::i;:::-;42359:12;;42343:13;;:28;:46;42336:53;;42105:303;:::o;62791:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;64061:163::-;64162:4;9251:10;9243:18;;:4;:18;;;9239:83;;9278:32;9299:10;9278:20;:32::i;:::-;9239:83;64179:37:::1;64198:4;64204:2;64208:7;64179:18;:37::i;:::-;64061:163:::0;;;;:::o;62690:42::-;;;;;;;;;;;;;;;;;:::o;62741:41::-;;;;;;;;;;;;;;;;;:::o;62640:::-;;;;;;;;;;;;;;;;;;;;;;:::o;67230:152::-;20546:12;:10;:12::i;:::-;20535:23;;:7;:5;:7::i;:::-;:23;;;20527:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67321:1:::1;67312:5;:10;;;;67304:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;67369:5;67347:8;:19;67364:1;67356:5;:9;;;;:::i;:::-;67347:19;;;;;;;;;;;;;;;:27;;;;67230:152:::0;;:::o;71280:111::-;20546:12;:10;:12::i;:::-;20535:23;;:7;:5;:7::i;:::-;:23;;;20527:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64948:4:::1;64938:14;;:6;;;;;;;;;;;:14;;;64930:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;71375:8:::2;71365:7;:18;;;;;;:::i;:::-;;71280:111:::0;:::o;7735:143::-;151:42;7735:143;:::o;64232:171::-;64337:4;9251:10;9243:18;;:4;:18;;;9239:83;;9278:32;9299:10;9278:20;:32::i;:::-;9239:83;64354:41:::1;64377:4;64383:2;64387:7;64354:22;:41::i;:::-;64232:171:::0;;;;:::o;71403:860::-;71463:16;71492:23;71518:17;71528:6;71518:9;:17::i;:::-;71492:43;;71546:30;71593:15;71579:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71546:63;;71620:22;71645:15;:13;:15::i;:::-;71620:40;;71671:23;71709:26;71748:475;71773:15;71755;:33;71748:475;;;71805:31;71839:11;:27;71851:14;71839:27;;;;;;;;;;;71805:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71888:9;:16;;;71887:17;:49;;;;;71934:1;71908:28;;:9;:14;;;:28;;;;71887:49;71883:126;;;71978:9;:14;;;71957:35;;71883:126;72051:6;72029:28;;:18;:28;;;72025:154;;72111:14;72078:13;72092:15;72078:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;72146:17;;;;;:::i;:::-;;;;72025:154;72195:16;;;;;:::i;:::-;;;;71790:433;71748:475;;;72242:13;72235:20;;;;;;;71403:860;;;:::o;62536:26::-;;;;;;;;;;;;;:::o;45777:125::-;45841:7;45868:21;45881:7;45868:12;:21::i;:::-;:26;;;45861:33;;45777:125;;;:::o;43225:206::-;43289:7;43330:1;43313:19;;:5;:19;;;43309:60;;43341:28;;;;;;;;;;;;;;43309:60;43395:12;:19;43408:5;43395:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;43387:36;;43380:43;;43225:206;;;:::o;20966:103::-;20546:12;:10;:12::i;:::-;20535:23;;:7;:5;:7::i;:::-;:23;;;20527:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21031:30:::1;21058:1;21031:18;:30::i;:::-;20966:103::o:0;66023:595::-;20546:12;:10;:12::i;:::-;20535:23;;:7;:5;:7::i;:::-;:23;;;20527:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64948:4:::1;64938:14;;:6;;;;;;;;;;;:14;;;64930:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;66193:1:::2;66181:8;:13;;::::0;66178:133:::2;;66240:9;66210:10;:27;;:39;;;;66292:7;66264:10;:25;;:35;;;;66178:133;66336:1;66324:8;:13;;::::0;66321:140:::2;;66387:9;66354:10;:30;;:42;;;;66442:7;66411:10;:28;;:38;;;;66321:140;66488:1;66476:8;:13;;::::0;66473:138:::2;;66538:9;66506:10;:29;;:41;;;;66592:7;66562:10;:27;;:37;;;;66473:138;66023:595:::0;;;:::o;62933:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20315:87::-;20361:7;20388:6;;;;;;;;;;;20381:13;;20315:87;:::o;46138:104::-;46194:13;46227:7;46220:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46138:104;:::o;66865:163::-;20546:12;:10;:12::i;:::-;20535:23;;:7;:5;:7::i;:::-;:23;;;20527:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64948:4:::1;64938:14;;:6;;;;;;;;;;;:14;;;64930:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;66966:1:::2;66957:5;:10;;;;66949:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;67015:5;66992:9;:20;67010:1;67002:5;:9;;;;:::i;:::-;66992:20;;;;;;;;;;;;;;;:28;;;;66865:163:::0;;:::o;70389:538::-;70429:7;70438:5;70455:14;70480:11;70522:4;70505:21;;:10;:13;70516:1;70505:13;;;;;;;;;;;;;;;;;;;;;;;:21;;;70502:384;;70552:9;:12;70562:1;70552:12;;;;;;;;;;;;;;70543:21;;70587:1;70579:9;;70502:384;;;70626:4;70609:21;;:10;:13;70620:1;70609:13;;;;;;;;;;;;;;;;;;;;;;;:21;;;70606:280;;70656:9;:12;70666:1;70656:12;;;;;;;;;;;;;;70647:21;;70691:1;70683:9;;70606:280;;;70730:4;70713:21;;:10;:13;70724:1;70713:13;;;;;;;;;;;;;;;;;;;;;;;:21;;;70710:176;;70760:9;:12;70770:1;70760:12;;;;;;;;;;;;;;70751:21;;70795:1;70787:9;;70710:176;;;70838:9;:12;70848:1;70838:12;;;;;;;;;;;;;;70829:21;;70873:1;70865:9;;70710:176;70606:280;70502:384;70904:6;70913:5;70896:23;;;;;;70389:538;;:::o;62506:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;65001:245::-;20546:12;:10;:12::i;:::-;20535:23;;:7;:5;:7::i;:::-;:23;;;20527:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65095:1:::1;65086:5;:10;;;;65078:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;65126:7;65121:79;65144:1;65139;:6;;;65121:79;;65183:5;65167:10;:13;65178:1;65167:13;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;65147:3;;;;;:::i;:::-;;;;65121:79;;;;65232:6;65210:10;:19;65227:1;65221:5;:7;;;;:::i;:::-;65210:19;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;65001:245:::0;;:::o;63584:240::-;63688:8;9517:30;9538:8;9517:20;:30::i;:::-;63742:4:::1;63717:29;;:11;:21;63729:8;63717:21;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;63709:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;63773:43;63797:8;63807;63773:23;:43::i;:::-;63584:240:::0;;;:::o;72275:270::-;12900:1;13498:7;;:19;13490:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12900:1;13631:7;:18;;;;64838:9:::1;64824:23;;:10;:23;;;64816:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;72368:15:::2;;;;;;;;;;;72354:29;;:10;:29;;;72346:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;72418:12;72436:15;;;;;;;;;;;:20;;72464:21;72436:54;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72417:73;;;72509:7;72501:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;72335:210;12856:1:::0;13810:7;:22;;;;72275:270::o;64411:228::-;64562:4;9251:10;9243:18;;:4;:18;;;9239:83;;9278:32;9299:10;9278:20;:32::i;:::-;9239:83;64584:47:::1;64607:4;64613:2;64617:7;64626:4;64584:22;:47::i;:::-;64411:228:::0;;;;;:::o;70283:98::-;70334:6;70359:14;70367:5;70359:7;:14::i;:::-;70352:21;;70283:98;;;:::o;70935:337::-;71000:13;71034:16;71042:7;71034;:16::i;:::-;:45;;;;;71078:1;71060:7;71054:21;;;;;:::i;:::-;;;:25;71034:45;71026:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;71219:7;71228:25;71245:7;71228:16;:25::i;:::-;71202:61;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71188:76;;70935:337;;;:::o;67582:2412::-;64948:4;64938:14;;:6;;;;;;;;;;;:14;;;64930:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;64838:9:::1;64824:23;;:10;:23;;;64816:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;67707:1:::2;67698:6;:10;;;:25;;;;;67722:1;67712:6;:11;;;;67698:25;67690:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;67757:10;67770:19;67778:10;67770:7;:19::i;:::-;67757:32;;67820:4;67803:21;;:10;:13;67814:1:::0;67803:13:::2;;;;;;;;;;;;;;;;;;;;;;;:21;;::::0;67800:2052:::2;;67868:10;:27;;;67849:15;:46;;:94;;;;;67918:10;:25;;;67899:15;:44;;67849:94;:114;;;;;67962:1;67947:9;:12;67957:1:::0;67947:12:::2;;;;;;;;;;;;;;:16;67849:114;67841:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;68034:6;68019:21;;:9;:12;68029:1:::0;68019:12:::2;;;;;;;;;;;;;;:21;;;;:::i;:::-;68006:9;:34;;67998:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;68087:27;68095:5;68102:8;:11;68111:1:::0;68102:11:::2;;;;;;;;;;;;;;68087:7;:27::i;:::-;68079:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;68193:10;:13;68204:1:::0;68193:13:::2;;;;;;;;;;;;;;;;;;;;;;;68155:51;;68164:25;68178:10;68164:13;:25::i;:::-;68155:6;:34;;;;;;:::i;:::-;:51;;68147:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;68246:33;68254:10;68272:6;68266:12;;:3;:12;;;;:::i;:::-;68246:7;:33::i;:::-;67800:2052;;;68317:4;68300:21;;:10;:13;68311:1;68300:13;;;;;;;;;;;;;;;;;;;;;;;:21;;::::0;68297:1555:::2;;68365:10;:30;;;68346:15;:49;;:100;;;;;68418:10;:28;;;68399:15;:47;;68346:100;:120;;;;;68465:1;68450:9;:12;68460:1;68450:12;;;;;;;;;;;;;;:16;68346:120;68338:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;68539:6;68524:21;;:9;:12;68534:1;68524:12;;;;;;;;;;;;;;:21;;;;:::i;:::-;68511:9;:34;;68503:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;68593:2;68587:3;:8;;;68584:56;;;68622:2;68616:8;;68584:56;68683:10;:13;68694:1;68683:13;;;;;;;;;;;;;;;;;;;;;;;68662:34;;68677:2;68668:6;68662:12;;:3;:12;;;;:::i;:::-;:17;;;;:::i;:::-;:34;;;;68654:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;68744:27;68752:5;68759:8;:11;68768:1;68759:11;;;;;;;;;;;;;;68744:7;:27::i;:::-;68736:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;68804:34;68811:1;68813:10;68825:6;68834:3;68804:6;:34::i;:::-;68297:1555;;;68876:4;68859:21;;:10;:13;68870:1;68859:13;;;;;;;;;;;;;;;;;;;;;;;:21;;::::0;68856:996:::2;;68924:10;:29;;;68905:15;:48;;:98;;;;;68976:10;:27;;;68957:15;:46;;68905:98;:118;;;;;69022:1;69007:9;:12;69017:1;69007:12;;;;;;;;;;;;;;:16;68905:118;68897:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;69096:6;69081:21;;:9;:12;69091:1;69081:12;;;;;;;;;;;;;;:21;;;;:::i;:::-;69068:9;:34;;69060:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;69150:2;69144:3;:8;;;69141:56;;;69179:2;69173:8;;69141:56;69240:10;:13;69251:1;69240:13;;;;;;;;;;;;;;;;;;;;;;;69219:34;;69234:2;69225:6;69219:12;;:3;:12;;;;:::i;:::-;:17;;;;:::i;:::-;:34;;;;69211:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;69301:27;69309:5;69316:8;:11;69325:1;69316:11;;;;;;;;;;;;;;69301:7;:27::i;:::-;69293:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;69361:33;69368:1;69370:10;69382:6;69390:3;69361:6;:33::i;:::-;68856:996;;;69453:10;:27;;;69435:15;:45;:81;;;;;69515:1;69484:10;:27;;;:32;;69435:81;69427:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;69562:2;69556:3;:8;;;69553:56;;;69591:2;69585:8;;69553:56;69652:10;:13;69663:1;69652:13;;;;;;;;;;;;;;;;;;;;;;;69631:34;;69646:2;69637:6;69631:12;;:3;:12;;;;:::i;:::-;:17;;;;:::i;:::-;:34;;;;69623:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;69728:1;69713:9;:12;69723:1;69713:12;;;;;;;;;;;;;;:16;:54;;;;;69761:6;69746:21;;:9;:12;69756:1;69746:12;;;;;;;;;;;;;;:21;;;;:::i;:::-;69733:9;:34;;69713:54;69705:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;69807:33;69814:1;69816:10;69828:6;69836:3;69807:6;:33::i;:::-;68856:996;68297:1555;67800:2052;69878:6;69870:14;;:5;;;;;;;;;;;:14;;;;:::i;:::-;69862:5;;:22;;;;;;;;;;;;;;;;;;69912:1;69903:5;;;;;;;;;;;:10;;;;69895:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;69957:29;69967:10;69979:6;69957:29;;:9;:29::i;:::-;67679:2315;67582:2412:::0;;:::o;64672:101::-;20546:12;:10;:12::i;:::-;20535:23;;:7;:5;:7::i;:::-;:23;;;20527:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64761:4:::1;64739:11;:19;64751:6;64739:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;64672:101:::0;:::o;62571:25::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48114:164::-;48211:4;48235:18;:25;48254:5;48235:25;;;;;;;;;;;;;;;:35;48261:8;48235:35;;;;;;;;;;;;;;;;;;;;;;;;;48228:42;;48114:164;;;;:::o;65582:248::-;20546:12;:10;:12::i;:::-;20535:23;;:7;:5;:7::i;:::-;:23;;;20527:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64948:4:::1;64938:14;;:6;;;;;;;;;;;:14;;;64930:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;65689:1:::2;65680:5;:10;;;;:27;;;;;65705:2;65694:8;:13;;;65680:27;65672:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;65814:8;65792:10;:19;65809:1;65803:5;:7;;;;:::i;:::-;65792:19;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;65582:248:::0;;:::o;21224:201::-;20546:12;:10;:12::i;:::-;20535:23;;:7;:5;:7::i;:::-;:23;;;20527:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21333:1:::1;21313:22;;:8;:22;;::::0;21305:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;21389:28;21408:8;21389:18;:28::i;:::-;21224:201:::0;:::o;32747:157::-;32832:4;32871:25;32856:40;;;:11;:40;;;;32849:47;;32747:157;;;:::o;19039:98::-;19092:7;19119:10;19112:17;;19039:98;:::o;49466:174::-;49523:4;49566:7;49547:15;:13;:15::i;:::-;:26;;:53;;;;;49587:13;;49577:7;:23;49547:53;:85;;;;;49605:11;:20;49617:7;49605:20;;;;;;;;;;;:27;;;;;;;;;;;;49604:28;49547:85;49540:92;;49466:174;;;:::o;9660:647::-;9899:1;151:42;9851:45;;;:49;9847:453;;;151:42;10150;;;10201:4;10208:8;10150:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10145:144;;10264:8;10245:28;;;;;;;;;;;:::i;:::-;;;;;;;;10145:144;9847:453;9660:647;:::o;47035:379::-;47116:13;47132:24;47148:7;47132:15;:24::i;:::-;47116:40;;47177:5;47171:11;;:2;:11;;;47167:48;;47191:24;;;;;;;;;;;;;;47167:48;47248:5;47232:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;47258:37;47275:5;47282:12;:10;:12::i;:::-;47258:16;:37::i;:::-;47257:38;47232:63;47228:138;;;47319:35;;;;;;;;;;;;;;47228:138;47378:28;47387:2;47391:7;47400:5;47378:8;:28::i;:::-;47105:309;47035:379;;:::o;41879:92::-;41935:7;41879:92;:::o;48345:170::-;48479:28;48489:4;48495:2;48499:7;48479:9;:28::i;:::-;48345:170;;;:::o;48586:185::-;48724:39;48741:4;48747:2;48751:7;48724:39;;;;;;;;;;;;:16;:39::i;:::-;48586:185;;;:::o;44606:1109::-;44668:21;;:::i;:::-;44702:12;44717:7;44702:22;;44785:4;44766:15;:13;:15::i;:::-;:23;;:47;;;;;44800:13;;44793:4;:20;44766:47;44762:886;;;44834:31;44868:11;:17;44880:4;44868:17;;;;;;;;;;;44834:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44909:9;:16;;;44904:729;;44980:1;44954:28;;:9;:14;;;:28;;;44950:101;;45018:9;45011:16;;;;;;44950:101;45353:261;45360:4;45353:261;;;45393:6;;;;;;;;45438:11;:17;45450:4;45438:17;;;;;;;;;;;45426:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45512:1;45486:28;;:9;:14;;;:28;;;45482:109;;45554:9;45547:16;;;;;;45482:109;45353:261;;;44904:729;44815:833;44762:886;45676:31;;;;;;;;;;;;;;44606:1109;;;;:::o;21585:191::-;21659:16;21678:6;;;;;;;;;;;21659:25;;21704:8;21695:6;;:17;;;;;;;;;;;;;;;;;;21759:8;21728:40;;21749:8;21728:40;;;;;;;;;;;;21648:128;21585:191;:::o;47756:287::-;47867:12;:10;:12::i;:::-;47855:24;;:8;:24;;;47851:54;;47888:17;;;;;;;;;;;;;;47851:54;47963:8;47918:18;:32;47937:12;:10;:12::i;:::-;47918:32;;;;;;;;;;;;;;;:42;47951:8;47918:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;48016:8;47987:48;;48002:12;:10;:12::i;:::-;47987:48;;;48026:8;47987:48;;;;;;:::i;:::-;;;;;;;;47756:287;;:::o;48842:369::-;49009:28;49019:4;49025:2;49029:7;49009:9;:28::i;:::-;49052:15;:2;:13;;;:15::i;:::-;:76;;;;;49072:56;49103:4;49109:2;49113:7;49122:5;49072:30;:56::i;:::-;49071:57;49052:76;49048:156;;;49152:40;;;;;;;;;;;;;;49048:156;48842:369;;;;:::o;44003:112::-;44058:6;44084:12;:19;44097:5;44084:19;;;;;;;;;;;;;;;:23;;;;;;;;;;;;44077:30;;44003:112;;;:::o;16601:723::-;16657:13;16887:1;16878:5;:10;16874:53;;16905:10;;;;;;;;;;;;;;;;;;;;;16874:53;16937:12;16952:5;16937:20;;16968:14;16993:78;17008:1;17000:4;:9;16993:78;;17026:8;;;;;:::i;:::-;;;;17057:2;17049:10;;;;;:::i;:::-;;;16993:78;;;17081:19;17113:6;17103:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17081:39;;17131:154;17147:1;17138:5;:10;17131:154;;17175:1;17165:11;;;;;:::i;:::-;;;17242:2;17234:5;:10;;;;:::i;:::-;17221:2;:24;;;;:::i;:::-;17208:39;;17191:6;17198;17191:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17271:2;17262:11;;;;;:::i;:::-;;;17131:154;;;17309:6;17295:21;;;;;16601:723;;;;:::o;67390:184::-;67469:4;67493:73;67512:5;67519;67553:10;67536:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;67526:39;;;;;;67493:18;:73::i;:::-;67486:80;;67390:184;;;;:::o;43513:137::-;43574:7;43609:12;:19;43622:5;43609:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;43601:41;;43594:48;;43513:137;;;:::o;44303:101::-;44393:3;44367:12;:19;44380:5;44367:19;;;;;;;;;;;;;;;:23;;;:29;;;;;;;;;;;;;;;;;;44303:101;;:::o;70107:168::-;70212:2;70208:3;:6;;;;:::i;:::-;70199:15;;:5;:15;;;70196:72;;70230:26;70238:3;70249:6;70243:12;;:3;:12;;;;:::i;:::-;70230:7;:26::i;:::-;70196:72;70107:168;;;;:::o;49648:104::-;49717:27;49727:2;49731:8;49717:27;;;;;;;;;;;;:9;:27::i;:::-;49648:104;;:::o;57623:196::-;57765:2;57738:15;:24;57754:7;57738:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;57803:7;57799:2;57783:28;;57792:5;57783:28;;;;;;;;;;;;57623:196;;;:::o;52566:2130::-;52681:35;52719:21;52732:7;52719:12;:21::i;:::-;52681:59;;52779:4;52757:26;;:13;:18;;;:26;;;52753:67;;52792:28;;;;;;;;;;;;;;52753:67;52833:22;52875:4;52859:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;52896:36;52913:4;52919:12;:10;:12::i;:::-;52896:16;:36::i;:::-;52859:73;:126;;;;52973:12;:10;:12::i;:::-;52949:36;;:20;52961:7;52949:11;:20::i;:::-;:36;;;52859:126;52833:153;;53004:17;52999:66;;53030:35;;;;;;;;;;;;;;52999:66;53094:1;53080:16;;:2;:16;;;53076:52;;53105:23;;;;;;;;;;;;;;53076:52;53141:43;53163:4;53169:2;53173:7;53182:1;53141:21;:43::i;:::-;53249:35;53266:1;53270:7;53279:4;53249:8;:35::i;:::-;53610:1;53580:12;:18;53593:4;53580:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53654:1;53626:12;:16;53639:2;53626:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53672:31;53706:11;:20;53718:7;53706:20;;;;;;;;;;;53672:54;;53757:2;53741:8;:13;;;:18;;;;;;;;;;;;;;;;;;53807:15;53774:8;:23;;;:49;;;;;;;;;;;;;;;;;;54075:19;54107:1;54097:7;:11;54075:33;;54123:31;54157:11;:24;54169:11;54157:24;;;;;;;;;;;54123:58;;54225:1;54200:27;;:8;:13;;;;;;;;;;;;:27;;;54196:384;;54410:13;;54395:11;:28;54391:174;;54464:4;54448:8;:13;;;:20;;;;;;;;;;;;;;;;;;54517:13;:28;;;54491:8;:23;;;:54;;;;;;;;;;;;;;;;;;54391:174;54196:384;53555:1036;;;54627:7;54623:2;54608:27;;54617:4;54608:27;;;;;;;;;;;;54646:42;54667:4;54673:2;54677:7;54686:1;54646:20;:42::i;:::-;52670:2026;;52566:2130;;;:::o;22603:387::-;22663:4;22871:12;22938:7;22926:20;22918:28;;22981:1;22974:4;:8;22967:15;;;22603:387;;;:::o;58311:667::-;58474:4;58511:2;58495:36;;;58532:12;:10;:12::i;:::-;58546:4;58552:7;58561:5;58495:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;58491:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58746:1;58729:6;:13;:18;58725:235;;58775:40;;;;;;;;;;;;;;58725:235;58918:6;58912:13;58903:6;58899:2;58895:15;58888:38;58491:480;58624:45;;;58614:55;;;:6;:55;;;;58607:62;;;58311:667;;;;;;:::o;14770:190::-;14895:4;14948;14919:25;14932:5;14939:4;14919:12;:25::i;:::-;:33;14912:40;;14770:190;;;;;:::o;50115:163::-;50238:32;50244:2;50248:8;50258:5;50265:4;50238:5;:32::i;:::-;50115:163;;;:::o;59626:159::-;;;;;:::o;60444:158::-;;;;;:::o;15322:675::-;15405:7;15425:20;15448:4;15425:27;;15468:9;15463:497;15487:5;:12;15483:1;:16;15463:497;;;15521:20;15544:5;15550:1;15544:8;;;;;;;;:::i;:::-;;;;;;;;15521:31;;15587:12;15571;:28;15567:382;;15714:42;15729:12;15743;15714:14;:42::i;:::-;15699:57;;15567:382;;;15891:42;15906:12;15920;15891:14;:42::i;:::-;15876:57;;15567:382;15506:454;15501:3;;;;;:::i;:::-;;;;15463:497;;;;15977:12;15970:19;;;15322:675;;;;:::o;50537:1775::-;50676:20;50699:13;;50676:36;;50741:1;50727:16;;:2;:16;;;50723:48;;50752:19;;;;;;;;;;;;;;50723:48;50798:1;50786:8;:13;50782:44;;50808:18;;;;;;;;;;;;;;50782:44;50839:61;50869:1;50873:2;50877:12;50891:8;50839:21;:61::i;:::-;51212:8;51177:12;:16;51190:2;51177:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51276:8;51236:12;:16;51249:2;51236:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51335:2;51302:11;:25;51314:12;51302:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;51402:15;51352:11;:25;51364:12;51352:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;51435:20;51458:12;51435:35;;51485:11;51514:8;51499:12;:23;51485:37;;51543:4;:23;;;;;51551:15;:2;:13;;;:15::i;:::-;51543:23;51539:641;;;51587:314;51643:12;51639:2;51618:38;;51635:1;51618:38;;;;;;;;;;;;51684:69;51723:1;51727:2;51731:14;;;;;;51747:5;51684:30;:69::i;:::-;51679:174;;51789:40;;;;;;;;;;;;;;51679:174;51896:3;51880:12;:19;51587:314;;51982:12;51965:13;;:29;51961:43;;51996:8;;;51961:43;51539:641;;;52045:120;52101:14;;;;;;52097:2;52076:40;;52093:1;52076:40;;;;;;;;;;;;52160:3;52144:12;:19;52045:120;;51539:641;52210:12;52194:13;:28;;;;51152:1082;;52244:60;52273:1;52277:2;52281:12;52295:8;52244:20;:60::i;:::-;50665:1647;50537:1775;;;;:::o;16005:224::-;16073:13;16136:1;16130:4;16123:15;16165:1;16159:4;16152:15;16206:4;16200;16190:21;16181:30;;16005:224;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:101::-;1554:7;1594:18;1587:5;1583:30;1572:41;;1518:101;;;:::o;1625:115::-;1710:23;1727:5;1710:23;:::i;:::-;1705:3;1698:36;1625:115;;:::o;1746:218::-;1837:4;1875:2;1864:9;1860:18;1852:26;;1888:69;1954:1;1943:9;1939:17;1930:6;1888:69;:::i;:::-;1746:218;;;;:::o;1970:99::-;2022:6;2056:5;2050:12;2040:22;;1970:99;;;:::o;2075:169::-;2159:11;2193:6;2188:3;2181:19;2233:4;2228:3;2224:14;2209:29;;2075:169;;;;:::o;2250:246::-;2331:1;2341:113;2355:6;2352:1;2349:13;2341:113;;;2440:1;2435:3;2431:11;2425:18;2421:1;2416:3;2412:11;2405:39;2377:2;2374:1;2370:10;2365:15;;2341:113;;;2488:1;2479:6;2474:3;2470:16;2463:27;2312:184;2250:246;;;:::o;2502:102::-;2543:6;2594:2;2590:7;2585:2;2578:5;2574:14;2570:28;2560:38;;2502:102;;;:::o;2610:377::-;2698:3;2726:39;2759:5;2726:39;:::i;:::-;2781:71;2845:6;2840:3;2781:71;:::i;:::-;2774:78;;2861:65;2919:6;2914:3;2907:4;2900:5;2896:16;2861:65;:::i;:::-;2951:29;2973:6;2951:29;:::i;:::-;2946:3;2942:39;2935:46;;2702:285;2610:377;;;;:::o;2993:313::-;3106:4;3144:2;3133:9;3129:18;3121:26;;3193:9;3187:4;3183:20;3179:1;3168:9;3164:17;3157:47;3221:78;3294:4;3285:6;3221:78;:::i;:::-;3213:86;;2993:313;;;;:::o;3312:77::-;3349:7;3378:5;3367:16;;3312:77;;;:::o;3395:122::-;3468:24;3486:5;3468:24;:::i;:::-;3461:5;3458:35;3448:63;;3507:1;3504;3497:12;3448:63;3395:122;:::o;3523:139::-;3569:5;3607:6;3594:20;3585:29;;3623:33;3650:5;3623:33;:::i;:::-;3523:139;;;;:::o;3668:329::-;3727:6;3776:2;3764:9;3755:7;3751:23;3747:32;3744:119;;;3782:79;;:::i;:::-;3744:119;3902:1;3927:53;3972:7;3963:6;3952:9;3948:22;3927:53;:::i;:::-;3917:63;;3873:117;3668:329;;;;:::o;4003:126::-;4040:7;4080:42;4073:5;4069:54;4058:65;;4003:126;;;:::o;4135:96::-;4172:7;4201:24;4219:5;4201:24;:::i;:::-;4190:35;;4135:96;;;:::o;4237:118::-;4324:24;4342:5;4324:24;:::i;:::-;4319:3;4312:37;4237:118;;:::o;4361:222::-;4454:4;4492:2;4481:9;4477:18;4469:26;;4505:71;4573:1;4562:9;4558:17;4549:6;4505:71;:::i;:::-;4361:222;;;;:::o;4589:122::-;4662:24;4680:5;4662:24;:::i;:::-;4655:5;4652:35;4642:63;;4701:1;4698;4691:12;4642:63;4589:122;:::o;4717:139::-;4763:5;4801:6;4788:20;4779:29;;4817:33;4844:5;4817:33;:::i;:::-;4717:139;;;;:::o;4862:474::-;4930:6;4938;4987:2;4975:9;4966:7;4962:23;4958:32;4955:119;;;4993:79;;:::i;:::-;4955:119;5113:1;5138:53;5183:7;5174:6;5163:9;5159:22;5138:53;:::i;:::-;5128:63;;5084:117;5240:2;5266:53;5311:7;5302:6;5291:9;5287:22;5266:53;:::i;:::-;5256:63;;5211:118;4862:474;;;;;:::o;5342:329::-;5401:6;5450:2;5438:9;5429:7;5425:23;5421:32;5418:119;;;5456:79;;:::i;:::-;5418:119;5576:1;5601:53;5646:7;5637:6;5626:9;5622:22;5601:53;:::i;:::-;5591:63;;5547:117;5342:329;;;;:::o;5677:118::-;5764:24;5782:5;5764:24;:::i;:::-;5759:3;5752:37;5677:118;;:::o;5801:222::-;5894:4;5932:2;5921:9;5917:18;5909:26;;5945:71;6013:1;6002:9;5998:17;5989:6;5945:71;:::i;:::-;5801:222;;;;:::o;6029:86::-;6064:7;6104:4;6097:5;6093:16;6082:27;;6029:86;;;:::o;6121:118::-;6192:22;6208:5;6192:22;:::i;:::-;6185:5;6182:33;6172:61;;6229:1;6226;6219:12;6172:61;6121:118;:::o;6245:135::-;6289:5;6327:6;6314:20;6305:29;;6343:31;6368:5;6343:31;:::i;:::-;6245:135;;;;:::o;6386:325::-;6443:6;6492:2;6480:9;6471:7;6467:23;6463:32;6460:119;;;6498:79;;:::i;:::-;6460:119;6618:1;6643:51;6686:7;6677:6;6666:9;6662:22;6643:51;:::i;:::-;6633:61;;6589:115;6386:325;;;;:::o;6717:619::-;6794:6;6802;6810;6859:2;6847:9;6838:7;6834:23;6830:32;6827:119;;;6865:79;;:::i;:::-;6827:119;6985:1;7010:53;7055:7;7046:6;7035:9;7031:22;7010:53;:::i;:::-;7000:63;;6956:117;7112:2;7138:53;7183:7;7174:6;7163:9;7159:22;7138:53;:::i;:::-;7128:63;;7083:118;7240:2;7266:53;7311:7;7302:6;7291:9;7287:22;7266:53;:::i;:::-;7256:63;;7211:118;6717:619;;;;;:::o;7342:77::-;7379:7;7408:5;7397:16;;7342:77;;;:::o;7425:118::-;7512:24;7530:5;7512:24;:::i;:::-;7507:3;7500:37;7425:118;;:::o;7549:222::-;7642:4;7680:2;7669:9;7665:18;7657:26;;7693:71;7761:1;7750:9;7746:17;7737:6;7693:71;:::i;:::-;7549:222;;;;:::o;7777:112::-;7860:22;7876:5;7860:22;:::i;:::-;7855:3;7848:35;7777:112;;:::o;7895:214::-;7984:4;8022:2;8011:9;8007:18;7999:26;;8035:67;8099:1;8088:9;8084:17;8075:6;8035:67;:::i;:::-;7895:214;;;;:::o;8115:122::-;8188:24;8206:5;8188:24;:::i;:::-;8181:5;8178:35;8168:63;;8227:1;8224;8217:12;8168:63;8115:122;:::o;8243:139::-;8289:5;8327:6;8314:20;8305:29;;8343:33;8370:5;8343:33;:::i;:::-;8243:139;;;;:::o;8388:470::-;8454:6;8462;8511:2;8499:9;8490:7;8486:23;8482:32;8479:119;;;8517:79;;:::i;:::-;8479:119;8637:1;8662:53;8707:7;8698:6;8687:9;8683:22;8662:53;:::i;:::-;8652:63;;8608:117;8764:2;8790:51;8833:7;8824:6;8813:9;8809:22;8790:51;:::i;:::-;8780:61;;8735:116;8388:470;;;;;:::o;8864:117::-;8973:1;8970;8963:12;8987:117;9096:1;9093;9086:12;9110:180;9158:77;9155:1;9148:88;9255:4;9252:1;9245:15;9279:4;9276:1;9269:15;9296:281;9379:27;9401:4;9379:27;:::i;:::-;9371:6;9367:40;9509:6;9497:10;9494:22;9473:18;9461:10;9458:34;9455:62;9452:88;;;9520:18;;:::i;:::-;9452:88;9560:10;9556:2;9549:22;9339:238;9296:281;;:::o;9583:129::-;9617:6;9644:20;;:::i;:::-;9634:30;;9673:33;9701:4;9693:6;9673:33;:::i;:::-;9583:129;;;:::o;9718:308::-;9780:4;9870:18;9862:6;9859:30;9856:56;;;9892:18;;:::i;:::-;9856:56;9930:29;9952:6;9930:29;:::i;:::-;9922:37;;10014:4;10008;10004:15;9996:23;;9718:308;;;:::o;10032:146::-;10129:6;10124:3;10119;10106:30;10170:1;10161:6;10156:3;10152:16;10145:27;10032:146;;;:::o;10184:425::-;10262:5;10287:66;10303:49;10345:6;10303:49;:::i;:::-;10287:66;:::i;:::-;10278:75;;10376:6;10369:5;10362:21;10414:4;10407:5;10403:16;10452:3;10443:6;10438:3;10434:16;10431:25;10428:112;;;10459:79;;:::i;:::-;10428:112;10549:54;10596:6;10591:3;10586;10549:54;:::i;:::-;10268:341;10184:425;;;;;:::o;10629:340::-;10685:5;10734:3;10727:4;10719:6;10715:17;10711:27;10701:122;;10742:79;;:::i;:::-;10701:122;10859:6;10846:20;10884:79;10959:3;10951:6;10944:4;10936:6;10932:17;10884:79;:::i;:::-;10875:88;;10691:278;10629:340;;;;:::o;10975:509::-;11044:6;11093:2;11081:9;11072:7;11068:23;11064:32;11061:119;;;11099:79;;:::i;:::-;11061:119;11247:1;11236:9;11232:17;11219:31;11277:18;11269:6;11266:30;11263:117;;;11299:79;;:::i;:::-;11263:117;11404:63;11459:7;11450:6;11439:9;11435:22;11404:63;:::i;:::-;11394:73;;11190:287;10975:509;;;;:::o;11490:60::-;11518:3;11539:5;11532:12;;11490:60;;;:::o;11556:142::-;11606:9;11639:53;11657:34;11666:24;11684:5;11666:24;:::i;:::-;11657:34;:::i;:::-;11639:53;:::i;:::-;11626:66;;11556:142;;;:::o;11704:126::-;11754:9;11787:37;11818:5;11787:37;:::i;:::-;11774:50;;11704:126;;;:::o;11836:157::-;11917:9;11950:37;11981:5;11950:37;:::i;:::-;11937:50;;11836:157;;;:::o;11999:193::-;12117:68;12179:5;12117:68;:::i;:::-;12112:3;12105:81;11999:193;;:::o;12198:284::-;12322:4;12360:2;12349:9;12345:18;12337:26;;12373:102;12472:1;12461:9;12457:17;12448:6;12373:102;:::i;:::-;12198:284;;;;:::o;12488:114::-;12555:6;12589:5;12583:12;12573:22;;12488:114;;;:::o;12608:184::-;12707:11;12741:6;12736:3;12729:19;12781:4;12776:3;12772:14;12757:29;;12608:184;;;;:::o;12798:132::-;12865:4;12888:3;12880:11;;12918:4;12913:3;12909:14;12901:22;;12798:132;;;:::o;12936:108::-;13013:24;13031:5;13013:24;:::i;:::-;13008:3;13001:37;12936:108;;:::o;13050:179::-;13119:10;13140:46;13182:3;13174:6;13140:46;:::i;:::-;13218:4;13213:3;13209:14;13195:28;;13050:179;;;;:::o;13235:113::-;13305:4;13337;13332:3;13328:14;13320:22;;13235:113;;;:::o;13384:732::-;13503:3;13532:54;13580:5;13532:54;:::i;:::-;13602:86;13681:6;13676:3;13602:86;:::i;:::-;13595:93;;13712:56;13762:5;13712:56;:::i;:::-;13791:7;13822:1;13807:284;13832:6;13829:1;13826:13;13807:284;;;13908:6;13902:13;13935:63;13994:3;13979:13;13935:63;:::i;:::-;13928:70;;14021:60;14074:6;14021:60;:::i;:::-;14011:70;;13867:224;13854:1;13851;13847:9;13842:14;;13807:284;;;13811:14;14107:3;14100:10;;13508:608;;;13384:732;;;;:::o;14122:373::-;14265:4;14303:2;14292:9;14288:18;14280:26;;14352:9;14346:4;14342:20;14338:1;14327:9;14323:17;14316:47;14380:108;14483:4;14474:6;14380:108;:::i;:::-;14372:116;;14122:373;;;;:::o;14501:89::-;14535:7;14578:5;14575:1;14564:20;14553:31;;14501:89;;;:::o;14596:116::-;14666:21;14681:5;14666:21;:::i;:::-;14659:5;14656:32;14646:60;;14702:1;14699;14692:12;14646:60;14596:116;:::o;14718:133::-;14761:5;14799:6;14786:20;14777:29;;14815:30;14839:5;14815:30;:::i;:::-;14718:133;;;;:::o;14857:613::-;14931:6;14939;14947;14996:2;14984:9;14975:7;14971:23;14967:32;14964:119;;;15002:79;;:::i;:::-;14964:119;15122:1;15147:53;15192:7;15183:6;15172:9;15168:22;15147:53;:::i;:::-;15137:63;;15093:117;15249:2;15275:53;15320:7;15311:6;15300:9;15296:22;15275:53;:::i;:::-;15265:63;;15220:118;15377:2;15403:50;15445:7;15436:6;15425:9;15421:22;15403:50;:::i;:::-;15393:60;;15348:115;14857:613;;;;;:::o;15476:775::-;15709:4;15747:3;15736:9;15732:19;15724:27;;15761:71;15829:1;15818:9;15814:17;15805:6;15761:71;:::i;:::-;15842:72;15910:2;15899:9;15895:18;15886:6;15842:72;:::i;:::-;15924;15992:2;15981:9;15977:18;15968:6;15924:72;:::i;:::-;16006;16074:2;16063:9;16059:18;16050:6;16006:72;:::i;:::-;16088:73;16156:3;16145:9;16141:19;16132:6;16088:73;:::i;:::-;16171;16239:3;16228:9;16224:19;16215:6;16171:73;:::i;:::-;15476:775;;;;;;;;;:::o;16257:470::-;16323:6;16331;16380:2;16368:9;16359:7;16355:23;16351:32;16348:119;;;16386:79;;:::i;:::-;16348:119;16506:1;16531:53;16576:7;16567:6;16556:9;16552:22;16531:53;:::i;:::-;16521:63;;16477:117;16633:2;16659:51;16702:7;16693:6;16682:9;16678:22;16659:51;:::i;:::-;16649:61;;16604:116;16257:470;;;;;:::o;16733:324::-;16850:4;16888:2;16877:9;16873:18;16865:26;;16901:71;16969:1;16958:9;16954:17;16945:6;16901:71;:::i;:::-;16982:68;17046:2;17035:9;17031:18;17022:6;16982:68;:::i;:::-;16733:324;;;;;:::o;17063:116::-;17133:21;17148:5;17133:21;:::i;:::-;17126:5;17123:32;17113:60;;17169:1;17166;17159:12;17113:60;17063:116;:::o;17185:133::-;17228:5;17266:6;17253:20;17244:29;;17282:30;17306:5;17282:30;:::i;:::-;17185:133;;;;:::o;17324:464::-;17387:6;17395;17444:2;17432:9;17423:7;17419:23;17415:32;17412:119;;;17450:79;;:::i;:::-;17412:119;17570:1;17595:51;17638:7;17629:6;17618:9;17614:22;17595:51;:::i;:::-;17585:61;;17541:115;17695:2;17721:50;17763:7;17754:6;17743:9;17739:22;17721:50;:::i;:::-;17711:60;;17666:115;17324:464;;;;;:::o;17794:468::-;17859:6;17867;17916:2;17904:9;17895:7;17891:23;17887:32;17884:119;;;17922:79;;:::i;:::-;17884:119;18042:1;18067:53;18112:7;18103:6;18092:9;18088:22;18067:53;:::i;:::-;18057:63;;18013:117;18169:2;18195:50;18237:7;18228:6;18217:9;18213:22;18195:50;:::i;:::-;18185:60;;18140:115;17794:468;;;;;:::o;18268:307::-;18329:4;18419:18;18411:6;18408:30;18405:56;;;18441:18;;:::i;:::-;18405:56;18479:29;18501:6;18479:29;:::i;:::-;18471:37;;18563:4;18557;18553:15;18545:23;;18268:307;;;:::o;18581:423::-;18658:5;18683:65;18699:48;18740:6;18699:48;:::i;:::-;18683:65;:::i;:::-;18674:74;;18771:6;18764:5;18757:21;18809:4;18802:5;18798:16;18847:3;18838:6;18833:3;18829:16;18826:25;18823:112;;;18854:79;;:::i;:::-;18823:112;18944:54;18991:6;18986:3;18981;18944:54;:::i;:::-;18664:340;18581:423;;;;;:::o;19023:338::-;19078:5;19127:3;19120:4;19112:6;19108:17;19104:27;19094:122;;19135:79;;:::i;:::-;19094:122;19252:6;19239:20;19277:78;19351:3;19343:6;19336:4;19328:6;19324:17;19277:78;:::i;:::-;19268:87;;19084:277;19023:338;;;;:::o;19367:943::-;19462:6;19470;19478;19486;19535:3;19523:9;19514:7;19510:23;19506:33;19503:120;;;19542:79;;:::i;:::-;19503:120;19662:1;19687:53;19732:7;19723:6;19712:9;19708:22;19687:53;:::i;:::-;19677:63;;19633:117;19789:2;19815:53;19860:7;19851:6;19840:9;19836:22;19815:53;:::i;:::-;19805:63;;19760:118;19917:2;19943:53;19988:7;19979:6;19968:9;19964:22;19943:53;:::i;:::-;19933:63;;19888:118;20073:2;20062:9;20058:18;20045:32;20104:18;20096:6;20093:30;20090:117;;;20126:79;;:::i;:::-;20090:117;20231:62;20285:7;20276:6;20265:9;20261:22;20231:62;:::i;:::-;20221:72;;20016:287;19367:943;;;;;;;:::o;20316:311::-;20393:4;20483:18;20475:6;20472:30;20469:56;;;20505:18;;:::i;:::-;20469:56;20555:4;20547:6;20543:17;20535:25;;20615:4;20609;20605:15;20597:23;;20316:311;;;:::o;20633:117::-;20742:1;20739;20732:12;20773:710;20869:5;20894:81;20910:64;20967:6;20910:64;:::i;:::-;20894:81;:::i;:::-;20885:90;;20995:5;21024:6;21017:5;21010:21;21058:4;21051:5;21047:16;21040:23;;21111:4;21103:6;21099:17;21091:6;21087:30;21140:3;21132:6;21129:15;21126:122;;;21159:79;;:::i;:::-;21126:122;21274:6;21257:220;21291:6;21286:3;21283:15;21257:220;;;21366:3;21395:37;21428:3;21416:10;21395:37;:::i;:::-;21390:3;21383:50;21462:4;21457:3;21453:14;21446:21;;21333:144;21317:4;21312:3;21308:14;21301:21;;21257:220;;;21261:21;20875:608;;20773:710;;;;;:::o;21506:370::-;21577:5;21626:3;21619:4;21611:6;21607:17;21603:27;21593:122;;21634:79;;:::i;:::-;21593:122;21751:6;21738:20;21776:94;21866:3;21858:6;21851:4;21843:6;21839:17;21776:94;:::i;:::-;21767:103;;21583:293;21506:370;;;;:::o;21882:680::-;21973:6;21981;22030:2;22018:9;22009:7;22005:23;22001:32;21998:119;;;22036:79;;:::i;:::-;21998:119;22156:1;22181:51;22224:7;22215:6;22204:9;22200:22;22181:51;:::i;:::-;22171:61;;22127:115;22309:2;22298:9;22294:18;22281:32;22340:18;22332:6;22329:30;22326:117;;;22362:79;;:::i;:::-;22326:117;22467:78;22537:7;22528:6;22517:9;22513:22;22467:78;:::i;:::-;22457:88;;22252:303;21882:680;;;;;:::o;22568:474::-;22636:6;22644;22693:2;22681:9;22672:7;22668:23;22664:32;22661:119;;;22699:79;;:::i;:::-;22661:119;22819:1;22844:53;22889:7;22880:6;22869:9;22865:22;22844:53;:::i;:::-;22834:63;;22790:117;22946:2;22972:53;23017:7;23008:6;22997:9;22993:22;22972:53;:::i;:::-;22962:63;;22917:118;22568:474;;;;;:::o;23048:466::-;23112:6;23120;23169:2;23157:9;23148:7;23144:23;23140:32;23137:119;;;23175:79;;:::i;:::-;23137:119;23295:1;23320:51;23363:7;23354:6;23343:9;23339:22;23320:51;:::i;:::-;23310:61;;23266:115;23420:2;23446:51;23489:7;23480:6;23469:9;23465:22;23446:51;:::i;:::-;23436:61;;23391:116;23048:466;;;;;:::o;23520:182::-;23660:34;23656:1;23648:6;23644:14;23637:58;23520:182;:::o;23708:366::-;23850:3;23871:67;23935:2;23930:3;23871:67;:::i;:::-;23864:74;;23947:93;24036:3;23947:93;:::i;:::-;24065:2;24060:3;24056:12;24049:19;;23708:366;;;:::o;24080:419::-;24246:4;24284:2;24273:9;24269:18;24261:26;;24333:9;24327:4;24323:20;24319:1;24308:9;24304:17;24297:47;24361:131;24487:4;24361:131;:::i;:::-;24353:139;;24080:419;;;:::o;24505:180::-;24553:77;24550:1;24543:88;24650:4;24647:1;24640:15;24674:4;24671:1;24664:15;24691:320;24735:6;24772:1;24766:4;24762:12;24752:22;;24819:1;24813:4;24809:12;24840:18;24830:81;;24896:4;24888:6;24884:17;24874:27;;24830:81;24958:2;24950:6;24947:14;24927:18;24924:38;24921:84;;24977:18;;:::i;:::-;24921:84;24742:269;24691:320;;;:::o;25017:161::-;25157:13;25153:1;25145:6;25141:14;25134:37;25017:161;:::o;25184:366::-;25326:3;25347:67;25411:2;25406:3;25347:67;:::i;:::-;25340:74;;25423:93;25512:3;25423:93;:::i;:::-;25541:2;25536:3;25532:12;25525:19;;25184:366;;;:::o;25556:419::-;25722:4;25760:2;25749:9;25745:18;25737:26;;25809:9;25803:4;25799:20;25795:1;25784:9;25780:17;25773:47;25837:131;25963:4;25837:131;:::i;:::-;25829:139;;25556:419;;;:::o;25981:160::-;26121:12;26117:1;26109:6;26105:14;26098:36;25981:160;:::o;26147:366::-;26289:3;26310:67;26374:2;26369:3;26310:67;:::i;:::-;26303:74;;26386:93;26475:3;26386:93;:::i;:::-;26504:2;26499:3;26495:12;26488:19;;26147:366;;;:::o;26519:419::-;26685:4;26723:2;26712:9;26708:18;26700:26;;26772:9;26766:4;26762:20;26758:1;26747:9;26743:17;26736:47;26800:131;26926:4;26800:131;:::i;:::-;26792:139;;26519:419;;;:::o;26944:180::-;26992:77;26989:1;26982:88;27089:4;27086:1;27079:15;27113:4;27110:1;27103:15;27130:191;27168:4;27188:18;27204:1;27188:18;:::i;:::-;27183:23;;27220:18;27236:1;27220:18;:::i;:::-;27215:23;;27262:1;27259;27255:9;27247:17;;27286:4;27280;27277:14;27274:40;;;27294:18;;:::i;:::-;27274:40;27130:191;;;;:::o;27327:166::-;27467:18;27463:1;27455:6;27451:14;27444:42;27327:166;:::o;27499:366::-;27641:3;27662:67;27726:2;27721:3;27662:67;:::i;:::-;27655:74;;27738:93;27827:3;27738:93;:::i;:::-;27856:2;27851:3;27847:12;27840:19;;27499:366;;;:::o;27871:419::-;28037:4;28075:2;28064:9;28060:18;28052:26;;28124:9;28118:4;28114:20;28110:1;28099:9;28095:17;28088:47;28152:131;28278:4;28152:131;:::i;:::-;28144:139;;27871:419;;;:::o;28296:141::-;28345:4;28368:3;28360:11;;28391:3;28388:1;28381:14;28425:4;28422:1;28412:18;28404:26;;28296:141;;;:::o;28443:93::-;28480:6;28527:2;28522;28515:5;28511:14;28507:23;28497:33;;28443:93;;;:::o;28542:107::-;28586:8;28636:5;28630:4;28626:16;28605:37;;28542:107;;;;:::o;28655:393::-;28724:6;28774:1;28762:10;28758:18;28797:97;28827:66;28816:9;28797:97;:::i;:::-;28915:39;28945:8;28934:9;28915:39;:::i;:::-;28903:51;;28987:4;28983:9;28976:5;28972:21;28963:30;;29036:4;29026:8;29022:19;29015:5;29012:30;29002:40;;28731:317;;28655:393;;;;;:::o;29054:142::-;29104:9;29137:53;29155:34;29164:24;29182:5;29164:24;:::i;:::-;29155:34;:::i;:::-;29137:53;:::i;:::-;29124:66;;29054:142;;;:::o;29202:75::-;29245:3;29266:5;29259:12;;29202:75;;;:::o;29283:269::-;29393:39;29424:7;29393:39;:::i;:::-;29454:91;29503:41;29527:16;29503:41;:::i;:::-;29495:6;29488:4;29482:11;29454:91;:::i;:::-;29448:4;29441:105;29359:193;29283:269;;;:::o;29558:73::-;29603:3;29558:73;:::o;29637:189::-;29714:32;;:::i;:::-;29755:65;29813:6;29805;29799:4;29755:65;:::i;:::-;29690:136;29637:189;;:::o;29832:186::-;29892:120;29909:3;29902:5;29899:14;29892:120;;;29963:39;30000:1;29993:5;29963:39;:::i;:::-;29936:1;29929:5;29925:13;29916:22;;29892:120;;;29832:186;;:::o;30024:543::-;30125:2;30120:3;30117:11;30114:446;;;30159:38;30191:5;30159:38;:::i;:::-;30243:29;30261:10;30243:29;:::i;:::-;30233:8;30229:44;30426:2;30414:10;30411:18;30408:49;;;30447:8;30432:23;;30408:49;30470:80;30526:22;30544:3;30526:22;:::i;:::-;30516:8;30512:37;30499:11;30470:80;:::i;:::-;30129:431;;30114:446;30024:543;;;:::o;30573:117::-;30627:8;30677:5;30671:4;30667:16;30646:37;;30573:117;;;;:::o;30696:169::-;30740:6;30773:51;30821:1;30817:6;30809:5;30806:1;30802:13;30773:51;:::i;:::-;30769:56;30854:4;30848;30844:15;30834:25;;30747:118;30696:169;;;;:::o;30870:295::-;30946:4;31092:29;31117:3;31111:4;31092:29;:::i;:::-;31084:37;;31154:3;31151:1;31147:11;31141:4;31138:21;31130:29;;30870:295;;;;:::o;31170:1395::-;31287:37;31320:3;31287:37;:::i;:::-;31389:18;31381:6;31378:30;31375:56;;;31411:18;;:::i;:::-;31375:56;31455:38;31487:4;31481:11;31455:38;:::i;:::-;31540:67;31600:6;31592;31586:4;31540:67;:::i;:::-;31634:1;31658:4;31645:17;;31690:2;31682:6;31679:14;31707:1;31702:618;;;;32364:1;32381:6;32378:77;;;32430:9;32425:3;32421:19;32415:26;32406:35;;32378:77;32481:67;32541:6;32534:5;32481:67;:::i;:::-;32475:4;32468:81;32337:222;31672:887;;31702:618;31754:4;31750:9;31742:6;31738:22;31788:37;31820:4;31788:37;:::i;:::-;31847:1;31861:208;31875:7;31872:1;31869:14;31861:208;;;31954:9;31949:3;31945:19;31939:26;31931:6;31924:42;32005:1;31997:6;31993:14;31983:24;;32052:2;32041:9;32037:18;32024:31;;31898:4;31895:1;31891:12;31886:17;;31861:208;;;32097:6;32088:7;32085:19;32082:179;;;32155:9;32150:3;32146:19;32140:26;32198:48;32240:4;32232:6;32228:17;32217:9;32198:48;:::i;:::-;32190:6;32183:64;32105:156;32082:179;32307:1;32303;32295:6;32291:14;32287:22;32281:4;32274:36;31709:611;;;31672:887;;31262:1303;;;31170:1395;;:::o;32571:180::-;32619:77;32616:1;32609:88;32716:4;32713:1;32706:15;32740:4;32737:1;32730:15;32757:233;32796:3;32819:24;32837:5;32819:24;:::i;:::-;32810:33;;32865:66;32858:5;32855:77;32852:103;;32935:18;;:::i;:::-;32852:103;32982:1;32975:5;32971:13;32964:20;;32757:233;;;:::o;32996:167::-;33033:3;33056:22;33072:5;33056:22;:::i;:::-;33047:31;;33100:4;33093:5;33090:15;33087:41;;33108:18;;:::i;:::-;33087:41;33155:1;33148:5;33144:13;33137:20;;32996:167;;;:::o;33169:181::-;33309:33;33305:1;33297:6;33293:14;33286:57;33169:181;:::o;33356:366::-;33498:3;33519:67;33583:2;33578:3;33519:67;:::i;:::-;33512:74;;33595:93;33684:3;33595:93;:::i;:::-;33713:2;33708:3;33704:12;33697:19;;33356:366;;;:::o;33728:419::-;33894:4;33932:2;33921:9;33917:18;33909:26;;33981:9;33975:4;33971:20;33967:1;33956:9;33952:17;33945:47;34009:131;34135:4;34009:131;:::i;:::-;34001:139;;33728:419;;;:::o;34153:168::-;34293:20;34289:1;34281:6;34277:14;34270:44;34153:168;:::o;34327:366::-;34469:3;34490:67;34554:2;34549:3;34490:67;:::i;:::-;34483:74;;34566:93;34655:3;34566:93;:::i;:::-;34684:2;34679:3;34675:12;34668:19;;34327:366;;;:::o;34699:419::-;34865:4;34903:2;34892:9;34888:18;34880:26;;34952:9;34946:4;34942:20;34938:1;34927:9;34923:17;34916:47;34980:131;35106:4;34980:131;:::i;:::-;34972:139;;34699:419;;;:::o;35124:147::-;35225:11;35262:3;35247:18;;35124:147;;;;:::o;35277:114::-;;:::o;35397:398::-;35556:3;35577:83;35658:1;35653:3;35577:83;:::i;:::-;35570:90;;35669:93;35758:3;35669:93;:::i;:::-;35787:1;35782:3;35778:11;35771:18;;35397:398;;;:::o;35801:379::-;35985:3;36007:147;36150:3;36007:147;:::i;:::-;36000:154;;36171:3;36164:10;;35801:379;;;:::o;36186:166::-;36326:18;36322:1;36314:6;36310:14;36303:42;36186:166;:::o;36358:366::-;36500:3;36521:67;36585:2;36580:3;36521:67;:::i;:::-;36514:74;;36597:93;36686:3;36597:93;:::i;:::-;36715:2;36710:3;36706:12;36699:19;;36358:366;;;:::o;36730:419::-;36896:4;36934:2;36923:9;36919:18;36911:26;;36983:9;36977:4;36973:20;36969:1;36958:9;36954:17;36947:47;37011:131;37137:4;37011:131;:::i;:::-;37003:139;;36730:419;;;:::o;37155:177::-;37295:29;37291:1;37283:6;37279:14;37272:53;37155:177;:::o;37338:366::-;37480:3;37501:67;37565:2;37560:3;37501:67;:::i;:::-;37494:74;;37577:93;37666:3;37577:93;:::i;:::-;37695:2;37690:3;37686:12;37679:19;;37338:366;;;:::o;37710:419::-;37876:4;37914:2;37903:9;37899:18;37891:26;;37963:9;37957:4;37953:20;37949:1;37938:9;37934:17;37927:47;37991:131;38117:4;37991:131;:::i;:::-;37983:139;;37710:419;;;:::o;38135:148::-;38237:11;38274:3;38259:18;;38135:148;;;;:::o;38313:874::-;38416:3;38453:5;38447:12;38482:36;38508:9;38482:36;:::i;:::-;38534:89;38616:6;38611:3;38534:89;:::i;:::-;38527:96;;38654:1;38643:9;38639:17;38670:1;38665:166;;;;38845:1;38840:341;;;;38632:549;;38665:166;38749:4;38745:9;38734;38730:25;38725:3;38718:38;38811:6;38804:14;38797:22;38789:6;38785:35;38780:3;38776:45;38769:52;;38665:166;;38840:341;38907:38;38939:5;38907:38;:::i;:::-;38967:1;38981:154;38995:6;38992:1;38989:13;38981:154;;;39069:7;39063:14;39059:1;39054:3;39050:11;39043:35;39119:1;39110:7;39106:15;39095:26;;39017:4;39014:1;39010:12;39005:17;;38981:154;;;39164:6;39159:3;39155:16;39148:23;;38847:334;;38632:549;;38420:767;;38313:874;;;;:::o;39193:390::-;39299:3;39327:39;39360:5;39327:39;:::i;:::-;39382:89;39464:6;39459:3;39382:89;:::i;:::-;39375:96;;39480:65;39538:6;39533:3;39526:4;39519:5;39515:16;39480:65;:::i;:::-;39570:6;39565:3;39561:16;39554:23;;39303:280;39193:390;;;;:::o;39589:155::-;39729:7;39725:1;39717:6;39713:14;39706:31;39589:155;:::o;39750:400::-;39910:3;39931:84;40013:1;40008:3;39931:84;:::i;:::-;39924:91;;40024:93;40113:3;40024:93;:::i;:::-;40142:1;40137:3;40133:11;40126:18;;39750:400;;;:::o;40156:695::-;40434:3;40456:92;40544:3;40535:6;40456:92;:::i;:::-;40449:99;;40565:95;40656:3;40647:6;40565:95;:::i;:::-;40558:102;;40677:148;40821:3;40677:148;:::i;:::-;40670:155;;40842:3;40835:10;;40156:695;;;;;:::o;40857:168::-;40997:20;40993:1;40985:6;40981:14;40974:44;40857:168;:::o;41031:366::-;41173:3;41194:67;41258:2;41253:3;41194:67;:::i;:::-;41187:74;;41270:93;41359:3;41270:93;:::i;:::-;41388:2;41383:3;41379:12;41372:19;;41031:366;;;:::o;41403:419::-;41569:4;41607:2;41596:9;41592:18;41584:26;;41656:9;41650:4;41646:20;41642:1;41631:9;41627:17;41620:47;41684:131;41810:4;41684:131;:::i;:::-;41676:139;;41403:419;;;:::o;41828:166::-;41968:18;41964:1;41956:6;41952:14;41945:42;41828:166;:::o;42000:366::-;42142:3;42163:67;42227:2;42222:3;42163:67;:::i;:::-;42156:74;;42239:93;42328:3;42239:93;:::i;:::-;42357:2;42352:3;42348:12;42341:19;;42000:366;;;:::o;42372:419::-;42538:4;42576:2;42565:9;42561:18;42553:26;;42625:9;42619:4;42615:20;42611:1;42600:9;42596:17;42589:47;42653:131;42779:4;42653:131;:::i;:::-;42645:139;;42372:419;;;:::o;42797:410::-;42837:7;42860:20;42878:1;42860:20;:::i;:::-;42855:25;;42894:20;42912:1;42894:20;:::i;:::-;42889:25;;42949:1;42946;42942:9;42971:30;42989:11;42971:30;:::i;:::-;42960:41;;43150:1;43141:7;43137:15;43134:1;43131:22;43111:1;43104:9;43084:83;43061:139;;43180:18;;:::i;:::-;43061:139;42845:362;42797:410;;;;:::o;43213:169::-;43353:21;43349:1;43341:6;43337:14;43330:45;43213:169;:::o;43388:366::-;43530:3;43551:67;43615:2;43610:3;43551:67;:::i;:::-;43544:74;;43627:93;43716:3;43627:93;:::i;:::-;43745:2;43740:3;43736:12;43729:19;;43388:366;;;:::o;43760:419::-;43926:4;43964:2;43953:9;43949:18;43941:26;;44013:9;44007:4;44003:20;43999:1;43988:9;43984:17;43977:47;44041:131;44167:4;44041:131;:::i;:::-;44033:139;;43760:419;;;:::o;44185:163::-;44325:15;44321:1;44313:6;44309:14;44302:39;44185:163;:::o;44354:366::-;44496:3;44517:67;44581:2;44576:3;44517:67;:::i;:::-;44510:74;;44593:93;44682:3;44593:93;:::i;:::-;44711:2;44706:3;44702:12;44695:19;;44354:366;;;:::o;44726:419::-;44892:4;44930:2;44919:9;44915:18;44907:26;;44979:9;44973:4;44969:20;44965:1;44954:9;44950:17;44943:47;45007:131;45133:4;45007:131;:::i;:::-;44999:139;;44726:419;;;:::o;45151:191::-;45191:3;45210:20;45228:1;45210:20;:::i;:::-;45205:25;;45244:20;45262:1;45244:20;:::i;:::-;45239:25;;45287:1;45284;45280:9;45273:16;;45308:3;45305:1;45302:10;45299:36;;;45315:18;;:::i;:::-;45299:36;45151:191;;;;:::o;45348:170::-;45488:22;45484:1;45476:6;45472:14;45465:46;45348:170;:::o;45524:366::-;45666:3;45687:67;45751:2;45746:3;45687:67;:::i;:::-;45680:74;;45763:93;45852:3;45763:93;:::i;:::-;45881:2;45876:3;45872:12;45865:19;;45524:366;;;:::o;45896:419::-;46062:4;46100:2;46089:9;46085:18;46077:26;;46149:9;46143:4;46139:20;46135:1;46124:9;46120:17;46113:47;46177:131;46303:4;46177:131;:::i;:::-;46169:139;;45896:419;;;:::o;46321:205::-;46360:3;46379:19;46396:1;46379:19;:::i;:::-;46374:24;;46412:19;46429:1;46412:19;:::i;:::-;46407:24;;46454:1;46451;46447:9;46440:16;;46477:18;46472:3;46469:27;46466:53;;;46499:18;;:::i;:::-;46466:53;46321:205;;;;:::o;46532:208::-;46571:4;46591:19;46608:1;46591:19;:::i;:::-;46586:24;;46624:19;46641:1;46624:19;:::i;:::-;46619:24;;46667:1;46664;46660:9;46652:17;;46691:18;46685:4;46682:28;46679:54;;;46713:18;;:::i;:::-;46679:54;46532:208;;;;:::o;46746:168::-;46886:20;46882:1;46874:6;46870:14;46863:44;46746:168;:::o;46920:366::-;47062:3;47083:67;47147:2;47142:3;47083:67;:::i;:::-;47076:74;;47159:93;47248:3;47159:93;:::i;:::-;47277:2;47272:3;47268:12;47261:19;;46920:366;;;:::o;47292:419::-;47458:4;47496:2;47485:9;47481:18;47473:26;;47545:9;47539:4;47535:20;47531:1;47520:9;47516:17;47509:47;47573:131;47699:4;47573:131;:::i;:::-;47565:139;;47292:419;;;:::o;47717:161::-;47857:13;47853:1;47845:6;47841:14;47834:37;47717:161;:::o;47884:366::-;48026:3;48047:67;48111:2;48106:3;48047:67;:::i;:::-;48040:74;;48123:93;48212:3;48123:93;:::i;:::-;48241:2;48236:3;48232:12;48225:19;;47884:366;;;:::o;48256:419::-;48422:4;48460:2;48449:9;48445:18;48437:26;;48509:9;48503:4;48499:20;48495:1;48484:9;48480:17;48473:47;48537:131;48663:4;48537:131;:::i;:::-;48529:139;;48256:419;;;:::o;48681:225::-;48821:34;48817:1;48809:6;48805:14;48798:58;48890:8;48885:2;48877:6;48873:15;48866:33;48681:225;:::o;48912:366::-;49054:3;49075:67;49139:2;49134:3;49075:67;:::i;:::-;49068:74;;49151:93;49240:3;49151:93;:::i;:::-;49269:2;49264:3;49260:12;49253:19;;48912:366;;;:::o;49284:419::-;49450:4;49488:2;49477:9;49473:18;49465:26;;49537:9;49531:4;49527:20;49523:1;49512:9;49508:17;49501:47;49565:131;49691:4;49565:131;:::i;:::-;49557:139;;49284:419;;;:::o;49709:332::-;49830:4;49868:2;49857:9;49853:18;49845:26;;49881:71;49949:1;49938:9;49934:17;49925:6;49881:71;:::i;:::-;49962:72;50030:2;50019:9;50015:18;50006:6;49962:72;:::i;:::-;49709:332;;;;;:::o;50047:137::-;50101:5;50132:6;50126:13;50117:22;;50148:30;50172:5;50148:30;:::i;:::-;50047:137;;;;:::o;50190:345::-;50257:6;50306:2;50294:9;50285:7;50281:23;50277:32;50274:119;;;50312:79;;:::i;:::-;50274:119;50432:1;50457:61;50510:7;50501:6;50490:9;50486:22;50457:61;:::i;:::-;50447:71;;50403:125;50190:345;;;;:::o;50541:180::-;50589:77;50586:1;50579:88;50686:4;50683:1;50676:15;50710:4;50707:1;50700:15;50727:185;50767:1;50784:20;50802:1;50784:20;:::i;:::-;50779:25;;50818:20;50836:1;50818:20;:::i;:::-;50813:25;;50857:1;50847:35;;50862:18;;:::i;:::-;50847:35;50904:1;50901;50897:9;50892:14;;50727:185;;;;:::o;50918:194::-;50958:4;50978:20;50996:1;50978:20;:::i;:::-;50973:25;;51012:20;51030:1;51012:20;:::i;:::-;51007:25;;51056:1;51053;51049:9;51041:17;;51080:1;51074:4;51071:11;51068:37;;;51085:18;;:::i;:::-;51068:37;50918:194;;;;:::o;51118:176::-;51150:1;51167:20;51185:1;51167:20;:::i;:::-;51162:25;;51201:20;51219:1;51201:20;:::i;:::-;51196:25;;51240:1;51230:35;;51245:18;;:::i;:::-;51230:35;51286:1;51283;51279:9;51274:14;;51118:176;;;;:::o;51300:94::-;51333:8;51381:5;51377:2;51373:14;51352:35;;51300:94;;;:::o;51400:::-;51439:7;51468:20;51482:5;51468:20;:::i;:::-;51457:31;;51400:94;;;:::o;51500:100::-;51539:7;51568:26;51588:5;51568:26;:::i;:::-;51557:37;;51500:100;;;:::o;51606:157::-;51711:45;51731:24;51749:5;51731:24;:::i;:::-;51711:45;:::i;:::-;51706:3;51699:58;51606:157;;:::o;51769:256::-;51881:3;51896:75;51967:3;51958:6;51896:75;:::i;:::-;51996:2;51991:3;51987:12;51980:19;;52016:3;52009:10;;51769:256;;;;:::o;52031:182::-;52070:1;52087:19;52104:1;52087:19;:::i;:::-;52082:24;;52120:19;52137:1;52120:19;:::i;:::-;52115:24;;52158:1;52148:35;;52163:18;;:::i;:::-;52148:35;52205:1;52202;52198:9;52193:14;;52031:182;;;;:::o;52219:98::-;52270:6;52304:5;52298:12;52288:22;;52219:98;;;:::o;52323:168::-;52406:11;52440:6;52435:3;52428:19;52480:4;52475:3;52471:14;52456:29;;52323:168;;;;:::o;52497:373::-;52583:3;52611:38;52643:5;52611:38;:::i;:::-;52665:70;52728:6;52723:3;52665:70;:::i;:::-;52658:77;;52744:65;52802:6;52797:3;52790:4;52783:5;52779:16;52744:65;:::i;:::-;52834:29;52856:6;52834:29;:::i;:::-;52829:3;52825:39;52818:46;;52587:283;52497:373;;;;:::o;52876:640::-;53071:4;53109:3;53098:9;53094:19;53086:27;;53123:71;53191:1;53180:9;53176:17;53167:6;53123:71;:::i;:::-;53204:72;53272:2;53261:9;53257:18;53248:6;53204:72;:::i;:::-;53286;53354:2;53343:9;53339:18;53330:6;53286:72;:::i;:::-;53405:9;53399:4;53395:20;53390:2;53379:9;53375:18;53368:48;53433:76;53504:4;53495:6;53433:76;:::i;:::-;53425:84;;52876:640;;;;;;;:::o;53522:141::-;53578:5;53609:6;53603:13;53594:22;;53625:32;53651:5;53625:32;:::i;:::-;53522:141;;;;:::o;53669:349::-;53738:6;53787:2;53775:9;53766:7;53762:23;53758:32;53755:119;;;53793:79;;:::i;:::-;53755:119;53913:1;53938:63;53993:7;53984:6;53973:9;53969:22;53938:63;:::i;:::-;53928:73;;53884:127;53669:349;;;;:::o

Swarm Source

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