ETH Price: $3,482.05 (+2.64%)

Token

FUNANAS (NANA)
 

Overview

Max Total Supply

10,000 NANA

Holders

1,473

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
househippo.eth
Balance
3 NANA
0x20444030496cFaf886869D25139B13Ef2d95f418
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:
FUNANA

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡠⢴⠒⡖⢫⡙⣍⠫⢝⡒⡲⢤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
// ⠀⠀⠀⠀⠀⠀⠀⢀⣀⢤⠤⡤⢤⣀⠀⠀⠀⣠⠞⡍⡜⢢⡙⢌⠥⡒⢬⡘⢆⡱⢡⢣⠙⡶⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
// ⠀⠀⠀⠀⣀⡴⡚⢭⡘⢆⢓⡘⠆⣎⠳⣄⡞⠥⢋⠴⣨⣧⢾⣮⢶⣍⣦⡘⢢⡑⢎⣴⣩⣴⡽⢦⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
// ⠀⠀⠀⣾⣵⣢⡙⢤⠚⡌⠦⣉⠞⡠⢍⢻⣌⠣⣍⡾⠋⠴⠁⠀⠀⠀⠉⠉⠉⠉⠉⠉⠁⠀⠈⠛⠓⠿⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
// ⠀⠀⠀⠈⢧⠈⠙⣧⠾⣞⡓⠓⠺⣥⣊⠜⣧⢃⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⣙⠲⠦⣄⠀⠀⠀⠀⠀⠀
// ⠀⠀⠀⠀⡼⠀⠀⢻⠐⢤⡀⠰⠖⠂⠹⡜⣧⢻⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⠷⣮⠒⢭⡘⢧⠀⠀⠀⠀⠀
// ⠀⠀⠀⠈⣗⠦⣄⣿⠸⡄⢽⠀⡐⢧⠀⡟⣼⡙⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⡏⢰⢸⡝⣾⣃⠞⡇⠀⠀⠀⠀
// ⠀⠀⠀⢀⡇⠀⣸⣄⠳⣅⣈⣧⡀⠀⣾⡙⠼⣇⢿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠁⣠⡌⣿⢫⣧⠚⡇⠀⠀⠀⠀
// ⠀⠀⣤⠊⢀⡴⠛⢈⡟⢀⡏⢻⠈⠁⢹⡜⢢⣏⠾⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⡤⠒⣉⣱⢦⠤⢤⣼⣄⣴⢃⠆⢠⢿⢩⡇⠀⠀⠀⠀
// ⡠⠔⣁⡽⣏⠠⣆⠀⣇⠸⡄⡎⢀⡼⣰⡋⢆⠫⡜⢿⡀⠀⠀⠀⠀⠀⢀⡴⠋⡥⣶⣾⠟⠂⠛⢿⣶⣤⡈⠻⡏⣦⢈⣾⢡⡇⠀⠀⠀⠀
// ⢻⡚⢭⡘⢻⡠⡄⠘⠞⢦⡵⠁⠠⣴⢣⡙⠬⡑⡜⢌⠷⣄⣀⣀⣀⣤⣾⡀⢺⣸⠟⡏⠀⠀⠀⠀⠻⠷⠃⢰⣇⠀⣸⡟⣼⠇⠀⠀⠀⠀
// ⠘⣏⠆⡜⡩⢷⡙⠀⢤⠃⡇⠸⠄⣿⠰⢌⢣⠱⡘⣌⠚⡤⢋⣭⠟⠚⠉⠉⠓⢦⠀⠹⡄⠀⠀⠀⠉⠳⡤⠟⠚⠮⢼⣇⡿⠀⠀⠀⠀⠀
// ⠀⠹⣎⠴⢡⢋⢷⣄⢬⡀⠄⠂⢀⡟⡱⢊⢆⢣⡑⢢⠍⣶⠋⠀⠀⠀⠀⠀⠀⠈⢧⠀⡗⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠒⢤⡀⠀⠀
// ⠀⠀⠘⢷⣅⢎⠢⣍⠳⣭⢤⡼⢫⠱⣡⢃⠎⢆⡜⣡⢺⡇⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⠙⢦⠀
// ⠀⠀⠀⠀⠈⠓⠧⣬⡑⢆⠲⢌⢣⡑⠆⡎⢜⢢⠒⣤⢿⡇⠀⠀⠀⠀⠀⣠⣴⣖⠂⠀⠀⠀⠀⠀⠀⠀⠐⠉⢩⢶⣤⠀⢰⠋⠸⣇⢈⡇
// ⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠺⢬⡒⢬⠱⡘⡌⢆⡿⠁⠈⣧⠀⠀⠀⢀⡞⠁⠈⢻⣧⠀⠀⠀⠀⠀⠀⠀⠀⢠⠏⠈⣿⠀⢺⠀⠀⠙⠛⣧
// ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣦⠣⡱⢌⡿⠀⠀⠀⣿⠀⠀⠀⣾⠀⠀⠀⠀⣿⡆⠀⠀⠀⠀⢸⡄⠀⢸⠀⠀⢸⠀⠈⢧⠀⠀⠀⣿
// ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⠰⣑⢺⡇⠀⠀⠀⣿⠀⠀⠀⡇⠀⠀⠀⠀⣿⠀⠀⠀⠀⡄⢸⠇⠀⢸⠀⠀⠘⢆⣀⡼⠀⠀⢀⡟
// ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⡧⣸⠼⢷⡀⠀⠀⣿⠀⠀⠀⡇⠀⠀⠀⠀⡏⠀⠀⠀⠀⣏⡼⠀⢀⡞⠀⠀⠀⠀⠁⠀⠀⠀⣼⠁
// ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠁⠀⠈⠳⣄⠀⣿⠀⠀⠀⣷⠀⠀⠀⢸⡅⠀⠀⠀⠀⠉⢁⡴⠋⠀⠀⠀⠀⠀⠀⠀⢀⡾⠁⠀
// ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢷⣿⡀⠀⠀⣿⠀⠀⠀⢸⡄⠀⠀⠀⠀⣰⠋⠀⠀⠀⠀⠀⠀⠀⣀⡶⠋⠀⠀⠀
// ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⡇⠀⠀⢿⡀⠀⠀⠀⢣⡄⡆⠀⢀⡇⠀⠀⠀⢀⣀⣤⡶⠟⠉⠀⠀⠀⠀⠀
// ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⡄⠀⢸⠛⠓⠦⠦⠤⣼⡇⠀⢸⡷⠶⠿⠟⠛⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀
// ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠦⠞⠀⠀⠀⠀⠀⠀⡇⠀⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
// ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠳⣀⡸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀



// File: lib/Constants.sol


pragma solidity ^0.8.17;

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

// File: 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: 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: 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: banana.sol


// File: @openzeppelin/contracts/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.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
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 Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            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 (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must 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 Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/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: contracts/finalcontract.sol


pragma solidity ^0.8.0;










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

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

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal _currentIndex;

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

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        if (index >= totalSupply()) revert TokenIndexOutOfBounds();
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds();
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        // Execution should never reach this point.
        assert(false);
        return tokenIdsIdx;
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).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);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

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

        unchecked {
            for (uint256 curr = tokenId; curr >= 0; curr--) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
            }
        }

        revert UnableDetermineTokenOwner();
    }

    /**
     * @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 (!_checkOnERC721Received(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 tokenId < _currentIndex;
    }

    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 > 3.4e38 (2**128) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

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

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }

                updatedIndex++;
            }

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

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].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;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @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 address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) revert TransferToNonERC721ReceiverImplementer();
                else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * 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`.
     */
    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.
     *
     * 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` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}


contract FUNANA is DefaultOperatorFilterer, ERC721A, Ownable{
    using Strings for uint256;

    uint256 public constant MAX_SUPPLY = 10000;
    uint256 public constant MAX_PUBLIC_MINT = 10;
    uint256 public PUBLIC_SALE_PRICE = 0.0033 ether;
    uint256 public WL_SALE_PRICE = 0.0033 ether;

    string private baseTokenUri;
    string public placeholderTokenUri;

    bool public isRevealed;
    bool public publicSale = false;
    bool public whiteListSale = false;
    bool public pause;

    bytes32 public merkleRoot;

    mapping(address => uint256) public totalPublicMint;
    mapping(address=>uint256) public WL_MINTS;

    constructor() ERC721A("FUNANAS", "NANA"){

    }
    function mint(address to, uint256 _quantity) external payable{
        
        require(publicSale, "NOT_OPEN");
        require((totalSupply() + _quantity) <= MAX_SUPPLY, "MAX_SUPPLY");
        require((totalPublicMint[to] +_quantity) <= MAX_PUBLIC_MINT, "MAX_MINT");
        require(msg.value >= (PUBLIC_SALE_PRICE * _quantity), "INVALID_PRICE");

        totalPublicMint[to] += _quantity;
        _safeMint(to, _quantity);

    }

    function whitelistMint(uint256 _quantity, uint256 maxQuantity, bytes32[] calldata _merkleProof) external payable{
        require(whiteListSale, "NOT_OPEN");
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender, maxQuantity));
        require(
            MerkleProof.verify(_merkleProof, merkleRoot, leaf),
            "Invalid Merkle Proof."
        );
        require(WL_MINTS[msg.sender] + _quantity <= maxQuantity, "MAX WL MINTS");
        require((totalSupply() + _quantity) <= MAX_SUPPLY, "MAX_SUPPLY");
        require(msg.value >= (WL_SALE_PRICE * _quantity), "INVALID_PRICE");
        WL_MINTS[msg.sender] += _quantity;
        _safeMint(msg.sender, _quantity);
    }

        function setApprovalForAll(address operator, bool approved) public virtual override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId) public virtual override onlyAllowedOperatorApproval(operator) {
        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 virtual 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);
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return baseTokenUri;
    }

    //return uri for certain token
    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, _toString(tokenId))) : '';
    }

    function setTokenUri(string memory _baseTokenUri) external onlyOwner{
        baseTokenUri = _baseTokenUri;
    }

    function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner{
        merkleRoot = _merkleRoot;
    }

    function togglePause() external onlyOwner{
        pause = !pause;
    }

    function toggleWhiteListSale() external onlyOwner{
        whiteListSale = true;
        publicSale = false;
    }

    function togglePublicSale() external onlyOwner{
        whiteListSale = false;
        publicSale = true;
    }

     function update_public_price(uint price) external onlyOwner {
        PUBLIC_SALE_PRICE = price;
    }

function AirDrop(address[] memory _wallets, uint _count) public onlyOwner{
        require(_wallets.length > 0, "INVALID_WALLET");
        require(totalSupply() + _wallets.length <= MAX_SUPPLY, "MAX_SUPPLY");
        for (uint i = 0; i < _wallets.length; i++)
        {
            _safeMint(_wallets[i], _count);
        }
    }

      function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

            // Cache the end of the memory to calculate the length later.
            let end := str

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }

    function withdraw() external payable onlyOwner
    {
    uint _balance = address(this).balance;
    payable(owner()).transfer(_balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"UnableDetermineTokenOwner","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":[{"internalType":"address[]","name":"_wallets","type":"address[]"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"AirDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"MAX_PUBLIC_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"WL_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WL_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"pause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"placeholderTokenUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenUri","type":"string"}],"name":"setTokenUri","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":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhiteListSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalPublicMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"update_public_price","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whiteListSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"uint256","name":"maxQuantity","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052660bb9551fc24000600855660bb9551fc240006009556000600c60016101000a81548160ff0219169083151502179055506000600c60026101000a81548160ff0219169083151502179055503480156200005d57600080fd5b506040518060400160405280600781526020017f46554e414e4153000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4e414e4100000000000000000000000000000000000000000000000000000000815250733cc6cdda760b79bafa08df41ecfa224f810dceb6600160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620002d65780156200019c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200016292919062000437565b600060405180830381600087803b1580156200017d57600080fd5b505af115801562000192573d6000803e3d6000fd5b50505050620002d5565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000256576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200021c92919062000437565b600060405180830381600087803b1580156200023757600080fd5b505af11580156200024c573d6000803e3d6000fd5b50505050620002d4565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200029f919062000464565b600060405180830381600087803b158015620002ba57600080fd5b505af1158015620002cf573d6000803e3d6000fd5b505050505b5b5b50508160019081620002e99190620006fb565b508060029081620002fb9190620006fb565b5050506200031e620003126200032460201b60201c565b6200032c60201b60201c565b620007e2565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200041f82620003f2565b9050919050565b620004318162000412565b82525050565b60006040820190506200044e600083018562000426565b6200045d602083018462000426565b9392505050565b60006020820190506200047b600083018462000426565b92915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200050357607f821691505b602082108103620005195762000518620004bb565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000544565b6200058f868362000544565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005dc620005d6620005d084620005a7565b620005b1565b620005a7565b9050919050565b6000819050919050565b620005f883620005bb565b620006106200060782620005e3565b84845462000551565b825550505050565b600090565b6200062762000618565b62000634818484620005ed565b505050565b5b818110156200065c57620006506000826200061d565b6001810190506200063a565b5050565b601f821115620006ab5762000675816200051f565b620006808462000534565b8101602085101562000690578190505b620006a86200069f8562000534565b83018262000639565b50505b505050565b600082821c905092915050565b6000620006d060001984600802620006b0565b1980831691505092915050565b6000620006eb8383620006bd565b9150826002028217905092915050565b620007068262000481565b67ffffffffffffffff8111156200072257620007216200048c565b5b6200072e8254620004ea565b6200073b82828562000660565b600060209050601f8311600181146200077357600084156200075e578287015190505b6200076a8582620006dd565b865550620007da565b601f19841662000783866200051f565b60005b82811015620007ad5784890151825560018201915060208501945060208101905062000786565b86831015620007cd5784890151620007c9601f891682620006bd565b8355505b6001600288020188555050505b505050505050565b6146d380620007f26000396000f3fe6080604052600436106102515760003560e01c80636352211e11610139578063a22cb465116100b6578063c87b56dd1161007a578063c87b56dd14610869578063e222c7f9146108a6578063e2a70eaf146108bd578063e985e9c5146108e6578063eeb9052f14610923578063f2fde38b1461094c57610251565b8063a22cb465146107a7578063b88d4fde146107d0578063bf9c41cd146107f9578063c4ae316814610836578063c4be5b591461084d57610251565b80638456cb59116100fd5780638456cb59146106e457806386a173ee1461070f5780638bb64a8c1461073a5780638da5cb5b1461075157806395d89b411461077c57610251565b80636352211e146105ff57806365f130971461063c57806370a0823114610667578063715018a6146106a45780637cb64759146106bb57610251565b80632eb4a7ab116101d257806340c10f191161019657806340c10f19146104fc57806341f434341461051857806342842e0e146105435780634cf5f7a41461056c5780634f6ccce71461059757806354214f69146105d457610251565b80632eb4a7ab146104345780632f745c591461045f57806332cb6b0c1461049c57806333bc1c5c146104c75780633ccfd60b146104f257610251565b8063081812fc11610219578063081812fc1461033d578063095ea7b31461037a57806318160ddd146103a35780631c16521c146103ce57806323b872dd1461040b57610251565b806301ffc9a7146102565780630675b7c61461029357806306fdde03146102bc57806307ca9734146102e757806307e89ec014610312575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613317565b610975565b60405161028a919061335f565b60405180910390f35b34801561029f57600080fd5b506102ba60048036038101906102b591906134c0565b610abf565b005b3480156102c857600080fd5b506102d1610b4e565b6040516102de9190613588565b60405180910390f35b3480156102f357600080fd5b506102fc610be0565b60405161030991906135c3565b60405180910390f35b34801561031e57600080fd5b50610327610be6565b60405161033491906135c3565b60405180910390f35b34801561034957600080fd5b50610364600480360381019061035f919061360a565b610bec565b6040516103719190613678565b60405180910390f35b34801561038657600080fd5b506103a1600480360381019061039c91906136bf565b610c68565b005b3480156103af57600080fd5b506103b8610c81565b6040516103c591906135c3565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f091906136ff565b610c8a565b60405161040291906135c3565b60405180910390f35b34801561041757600080fd5b50610432600480360381019061042d919061372c565b610ca2565b005b34801561044057600080fd5b50610449610cf1565b6040516104569190613798565b60405180910390f35b34801561046b57600080fd5b50610486600480360381019061048191906136bf565b610cf7565b60405161049391906135c3565b60405180910390f35b3480156104a857600080fd5b506104b1610eb9565b6040516104be91906135c3565b60405180910390f35b3480156104d357600080fd5b506104dc610ebf565b6040516104e9919061335f565b60405180910390f35b6104fa610ed2565b005b610516600480360381019061051191906136bf565b610fa4565b005b34801561052457600080fd5b5061052d61118c565b60405161053a9190613812565b60405180910390f35b34801561054f57600080fd5b5061056a6004803603810190610565919061372c565b61119e565b005b34801561057857600080fd5b506105816111ed565b60405161058e9190613588565b60405180910390f35b3480156105a357600080fd5b506105be60048036038101906105b9919061360a565b61127b565b6040516105cb91906135c3565b60405180910390f35b3480156105e057600080fd5b506105e96112c5565b6040516105f6919061335f565b60405180910390f35b34801561060b57600080fd5b506106266004803603810190610621919061360a565b6112d8565b6040516106339190613678565b60405180910390f35b34801561064857600080fd5b506106516112ee565b60405161065e91906135c3565b60405180910390f35b34801561067357600080fd5b5061068e600480360381019061068991906136ff565b6112f3565b60405161069b91906135c3565b60405180910390f35b3480156106b057600080fd5b506106b96113d2565b005b3480156106c757600080fd5b506106e260048036038101906106dd9190613859565b61145a565b005b3480156106f057600080fd5b506106f96114e0565b604051610706919061335f565b60405180910390f35b34801561071b57600080fd5b506107246114f3565b604051610731919061335f565b60405180910390f35b34801561074657600080fd5b5061074f611506565b005b34801561075d57600080fd5b506107666115ba565b6040516107739190613678565b60405180910390f35b34801561078857600080fd5b506107916115e4565b60405161079e9190613588565b60405180910390f35b3480156107b357600080fd5b506107ce60048036038101906107c991906138b2565b611676565b005b3480156107dc57600080fd5b506107f760048036038101906107f29190613993565b61168f565b005b34801561080557600080fd5b50610820600480360381019061081b91906136ff565b6116e0565b60405161082d91906135c3565b60405180910390f35b34801561084257600080fd5b5061084b6116f8565b005b61086760048036038101906108629190613a76565b6117a0565b005b34801561087557600080fd5b50610890600480360381019061088b919061360a565b611a44565b60405161089d9190613588565b60405180910390f35b3480156108b257600080fd5b506108bb611ae2565b005b3480156108c957600080fd5b506108e460048036038101906108df919061360a565b611b96565b005b3480156108f257600080fd5b5061090d60048036038101906109089190613aea565b611c1c565b60405161091a919061335f565b60405180910390f35b34801561092f57600080fd5b5061094a60048036038101906109459190613bed565b611cb0565b005b34801561095857600080fd5b50610973600480360381019061096e91906136ff565b611e10565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a4057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aa857507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ab85750610ab782611f07565b5b9050919050565b610ac7611f71565b73ffffffffffffffffffffffffffffffffffffffff16610ae56115ba565b73ffffffffffffffffffffffffffffffffffffffff1614610b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3290613c95565b60405180910390fd5b80600a9081610b4a9190613eb7565b5050565b606060018054610b5d90613ce4565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8990613ce4565b8015610bd65780601f10610bab57610100808354040283529160200191610bd6565b820191906000526020600020905b815481529060010190602001808311610bb957829003601f168201915b5050505050905090565b60095481565b60085481565b6000610bf782611f79565b610c2d576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610c7281611f86565b610c7c8383612083565b505050565b60008054905090565b600e6020528060005260406000206000915090505481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ce057610cdf33611f86565b5b610ceb84848461218d565b50505050565b600d5481565b6000610d02836112f3565b8210610d3a576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610d44610c81565b905060008060005b83811015610e9c576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610e3e57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e8e57868403610e85578195505050505050610eb3565b83806001019450505b508080600101915050610d4c565b506000610eac57610eab613f89565b5b8193505050505b92915050565b61271081565b600c60019054906101000a900460ff1681565b610eda611f71565b73ffffffffffffffffffffffffffffffffffffffff16610ef86115ba565b73ffffffffffffffffffffffffffffffffffffffff1614610f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4590613c95565b60405180910390fd5b6000479050610f5b6115ba565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610fa0573d6000803e3d6000fd5b5050565b600c60019054906101000a900460ff16610ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fea90614004565b60405180910390fd5b61271081610fff610c81565b6110099190614053565b111561104a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611041906140d3565b60405180910390fd5b600a81600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110979190614053565b11156110d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cf9061413f565b60405180910390fd5b806008546110e6919061415f565b341015611128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111f906141ed565b60405180910390fd5b80600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111779190614053565b92505081905550611188828261219d565b5050565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146111dc576111db33611f86565b5b6111e78484846121bb565b50505050565b600b80546111fa90613ce4565b80601f016020809104026020016040519081016040528092919081815260200182805461122690613ce4565b80156112735780601f1061124857610100808354040283529160200191611273565b820191906000526020600020905b81548152906001019060200180831161125657829003601f168201915b505050505081565b6000611285610c81565b82106112bd576040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b819050919050565b600c60009054906101000a900460ff1681565b60006112e3826121db565b600001519050919050565b600a81565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361135a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6113da611f71565b73ffffffffffffffffffffffffffffffffffffffff166113f86115ba565b73ffffffffffffffffffffffffffffffffffffffff161461144e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144590613c95565b60405180910390fd5b6114586000612363565b565b611462611f71565b73ffffffffffffffffffffffffffffffffffffffff166114806115ba565b73ffffffffffffffffffffffffffffffffffffffff16146114d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cd90613c95565b60405180910390fd5b80600d8190555050565b600c60039054906101000a900460ff1681565b600c60029054906101000a900460ff1681565b61150e611f71565b73ffffffffffffffffffffffffffffffffffffffff1661152c6115ba565b73ffffffffffffffffffffffffffffffffffffffff1614611582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157990613c95565b60405180910390fd5b6001600c60026101000a81548160ff0219169083151502179055506000600c60016101000a81548160ff021916908315150217905550565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546115f390613ce4565b80601f016020809104026020016040519081016040528092919081815260200182805461161f90613ce4565b801561166c5780601f106116415761010080835404028352916020019161166c565b820191906000526020600020905b81548152906001019060200180831161164f57829003601f168201915b5050505050905090565b8161168081611f86565b61168a8383612429565b505050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116cd576116cc33611f86565b5b6116d9858585856125a0565b5050505050565b600f6020528060005260406000206000915090505481565b611700611f71565b73ffffffffffffffffffffffffffffffffffffffff1661171e6115ba565b73ffffffffffffffffffffffffffffffffffffffff1614611774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176b90613c95565b60405180910390fd5b600c60039054906101000a900460ff1615600c60036101000a81548160ff021916908315150217905550565b600c60029054906101000a900460ff166117ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e690614004565b60405180910390fd5b60003384604051602001611804929190614276565b60405160208183030381529060405280519060200120905061186a838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d54836125f3565b6118a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a0906142ee565b60405180910390fd5b8385600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118f59190614053565b1115611936576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192d9061435a565b60405180910390fd5b61271085611942610c81565b61194c9190614053565b111561198d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611984906140d3565b60405180910390fd5b8460095461199b919061415f565b3410156119dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d4906141ed565b60405180910390fd5b84600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a2c9190614053565b92505081905550611a3d338661219d565b5050505050565b6060611a4f82611f79565b611a85576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611a8f61260a565b90506000815103611aaf5760405180602001604052806000815250611ada565b80611ab98461269c565b604051602001611aca9291906143b6565b6040516020818303038152906040525b915050919050565b611aea611f71565b73ffffffffffffffffffffffffffffffffffffffff16611b086115ba565b73ffffffffffffffffffffffffffffffffffffffff1614611b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5590613c95565b60405180910390fd5b6000600c60026101000a81548160ff0219169083151502179055506001600c60016101000a81548160ff021916908315150217905550565b611b9e611f71565b73ffffffffffffffffffffffffffffffffffffffff16611bbc6115ba565b73ffffffffffffffffffffffffffffffffffffffff1614611c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0990613c95565b60405180910390fd5b8060088190555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611cb8611f71565b73ffffffffffffffffffffffffffffffffffffffff16611cd66115ba565b73ffffffffffffffffffffffffffffffffffffffff1614611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2390613c95565b60405180910390fd5b6000825111611d70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6790614426565b60405180910390fd5b6127108251611d7d610c81565b611d879190614053565b1115611dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbf906140d3565b60405180910390fd5b60005b8251811015611e0b57611df8838281518110611dea57611de9614446565b5b60200260200101518361219d565b8080611e0390614475565b915050611dcb565b505050565b611e18611f71565b73ffffffffffffffffffffffffffffffffffffffff16611e366115ba565b73ffffffffffffffffffffffffffffffffffffffff1614611e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8390613c95565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef29061452f565b60405180910390fd5b611f0481612363565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000805482109050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612080576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611ffd92919061454f565b602060405180830381865afa15801561201a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203e919061458d565b61207f57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016120769190613678565b60405180910390fd5b5b50565b600061208e826112d8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036120f5576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16612114611f71565b73ffffffffffffffffffffffffffffffffffffffff161415801561214657506121448161213f611f71565b611c1c565b155b1561217d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121888383836126ec565b505050565b61219883838361279e565b505050565b6121b7828260405180602001604052806000815250612cc1565b5050565b6121d68383836040518060200160405280600081525061168f565b505050565b6121e3613271565b6121ec82611f79565b612222576040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008290505b6000811061232b576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461231c57809250505061235e565b50808060019003915050612228565b506040517fe7c0edfb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612431611f71565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612495576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600660006124a2611f71565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661254f611f71565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612594919061335f565b60405180910390a35050565b6125ab84848461279e565b6125b784848484612cd3565b6125ed576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000826126008584612e51565b1490509392505050565b6060600a805461261990613ce4565b80601f016020809104026020016040519081016040528092919081815260200182805461264590613ce4565b80156126925780601f1061266757610100808354040283529160200191612692565b820191906000526020600020905b81548152906001019060200180831161267557829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b6001156126d757600184039350600a81066030018453600a81049050806126b5575b50828103602084039350808452505050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006127a9826121db565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166127d0611f71565b73ffffffffffffffffffffffffffffffffffffffff16148061282c57506127f5611f71565b73ffffffffffffffffffffffffffffffffffffffff1661281484610bec565b73ffffffffffffffffffffffffffffffffffffffff16145b8061284857506128478260000151612842611f71565b611c1c565b5b905080612881576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146128ea576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612950576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61295d8585856001612ec6565b61296d60008484600001516126ec565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612c5157612bb081611f79565b15612c505782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cba8585856001612ecc565b5050505050565b612cce8383836001612ed2565b505050565b6000612cf48473ffffffffffffffffffffffffffffffffffffffff16613237565b15612e44578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d1d611f71565b8786866040518563ffffffff1660e01b8152600401612d3f949392919061460f565b6020604051808303816000875af1925050508015612d7b57506040513d601f19601f82011682018060405250810190612d789190614670565b60015b612df4573d8060008114612dab576040519150601f19603f3d011682016040523d82523d6000602084013e612db0565b606091505b506000815103612dec576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e49565b600190505b949350505050565b60008082905060005b8451811015612ebb576000858281518110612e7857612e77614446565b5b60200260200101519050808311612e9a57612e93838261325a565b9250612ea7565b612ea4818461325a565b92505b508080612eb390614475565b915050612e5a565b508091505092915050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612f3e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403612f78576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f856000868387612ec6565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561321a57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48380156131ce57506131cc6000888488612cd3565b155b15613205576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050613153565b5080600081905550506132306000868387612ecc565b5050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132f4816132bf565b81146132ff57600080fd5b50565b600081359050613311816132eb565b92915050565b60006020828403121561332d5761332c6132b5565b5b600061333b84828501613302565b91505092915050565b60008115159050919050565b61335981613344565b82525050565b60006020820190506133746000830184613350565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6133cd82613384565b810181811067ffffffffffffffff821117156133ec576133eb613395565b5b80604052505050565b60006133ff6132ab565b905061340b82826133c4565b919050565b600067ffffffffffffffff82111561342b5761342a613395565b5b61343482613384565b9050602081019050919050565b82818337600083830152505050565b600061346361345e84613410565b6133f5565b90508281526020810184848401111561347f5761347e61337f565b5b61348a848285613441565b509392505050565b600082601f8301126134a7576134a661337a565b5b81356134b7848260208601613450565b91505092915050565b6000602082840312156134d6576134d56132b5565b5b600082013567ffffffffffffffff8111156134f4576134f36132ba565b5b61350084828501613492565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613543578082015181840152602081019050613528565b60008484015250505050565b600061355a82613509565b6135648185613514565b9350613574818560208601613525565b61357d81613384565b840191505092915050565b600060208201905081810360008301526135a2818461354f565b905092915050565b6000819050919050565b6135bd816135aa565b82525050565b60006020820190506135d860008301846135b4565b92915050565b6135e7816135aa565b81146135f257600080fd5b50565b600081359050613604816135de565b92915050565b6000602082840312156136205761361f6132b5565b5b600061362e848285016135f5565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061366282613637565b9050919050565b61367281613657565b82525050565b600060208201905061368d6000830184613669565b92915050565b61369c81613657565b81146136a757600080fd5b50565b6000813590506136b981613693565b92915050565b600080604083850312156136d6576136d56132b5565b5b60006136e4858286016136aa565b92505060206136f5858286016135f5565b9150509250929050565b600060208284031215613715576137146132b5565b5b6000613723848285016136aa565b91505092915050565b600080600060608486031215613745576137446132b5565b5b6000613753868287016136aa565b9350506020613764868287016136aa565b9250506040613775868287016135f5565b9150509250925092565b6000819050919050565b6137928161377f565b82525050565b60006020820190506137ad6000830184613789565b92915050565b6000819050919050565b60006137d86137d36137ce84613637565b6137b3565b613637565b9050919050565b60006137ea826137bd565b9050919050565b60006137fc826137df565b9050919050565b61380c816137f1565b82525050565b60006020820190506138276000830184613803565b92915050565b6138368161377f565b811461384157600080fd5b50565b6000813590506138538161382d565b92915050565b60006020828403121561386f5761386e6132b5565b5b600061387d84828501613844565b91505092915050565b61388f81613344565b811461389a57600080fd5b50565b6000813590506138ac81613886565b92915050565b600080604083850312156138c9576138c86132b5565b5b60006138d7858286016136aa565b92505060206138e88582860161389d565b9150509250929050565b600067ffffffffffffffff82111561390d5761390c613395565b5b61391682613384565b9050602081019050919050565b6000613936613931846138f2565b6133f5565b9050828152602081018484840111156139525761395161337f565b5b61395d848285613441565b509392505050565b600082601f83011261397a5761397961337a565b5b813561398a848260208601613923565b91505092915050565b600080600080608085870312156139ad576139ac6132b5565b5b60006139bb878288016136aa565b94505060206139cc878288016136aa565b93505060406139dd878288016135f5565b925050606085013567ffffffffffffffff8111156139fe576139fd6132ba565b5b613a0a87828801613965565b91505092959194509250565b600080fd5b600080fd5b60008083601f840112613a3657613a3561337a565b5b8235905067ffffffffffffffff811115613a5357613a52613a16565b5b602083019150836020820283011115613a6f57613a6e613a1b565b5b9250929050565b60008060008060608587031215613a9057613a8f6132b5565b5b6000613a9e878288016135f5565b9450506020613aaf878288016135f5565b935050604085013567ffffffffffffffff811115613ad057613acf6132ba565b5b613adc87828801613a20565b925092505092959194509250565b60008060408385031215613b0157613b006132b5565b5b6000613b0f858286016136aa565b9250506020613b20858286016136aa565b9150509250929050565b600067ffffffffffffffff821115613b4557613b44613395565b5b602082029050602081019050919050565b6000613b69613b6484613b2a565b6133f5565b90508083825260208201905060208402830185811115613b8c57613b8b613a1b565b5b835b81811015613bb55780613ba188826136aa565b845260208401935050602081019050613b8e565b5050509392505050565b600082601f830112613bd457613bd361337a565b5b8135613be4848260208601613b56565b91505092915050565b60008060408385031215613c0457613c036132b5565b5b600083013567ffffffffffffffff811115613c2257613c216132ba565b5b613c2e85828601613bbf565b9250506020613c3f858286016135f5565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613c7f602083613514565b9150613c8a82613c49565b602082019050919050565b60006020820190508181036000830152613cae81613c72565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613cfc57607f821691505b602082108103613d0f57613d0e613cb5565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613d777fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613d3a565b613d818683613d3a565b95508019841693508086168417925050509392505050565b6000613db4613daf613daa846135aa565b6137b3565b6135aa565b9050919050565b6000819050919050565b613dce83613d99565b613de2613dda82613dbb565b848454613d47565b825550505050565b600090565b613df7613dea565b613e02818484613dc5565b505050565b5b81811015613e2657613e1b600082613def565b600181019050613e08565b5050565b601f821115613e6b57613e3c81613d15565b613e4584613d2a565b81016020851015613e54578190505b613e68613e6085613d2a565b830182613e07565b50505b505050565b600082821c905092915050565b6000613e8e60001984600802613e70565b1980831691505092915050565b6000613ea78383613e7d565b9150826002028217905092915050565b613ec082613509565b67ffffffffffffffff811115613ed957613ed8613395565b5b613ee38254613ce4565b613eee828285613e2a565b600060209050601f831160018114613f215760008415613f0f578287015190505b613f198582613e9b565b865550613f81565b601f198416613f2f86613d15565b60005b82811015613f5757848901518255600182019150602085019450602081019050613f32565b86831015613f745784890151613f70601f891682613e7d565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b7f4e4f545f4f50454e000000000000000000000000000000000000000000000000600082015250565b6000613fee600883613514565b9150613ff982613fb8565b602082019050919050565b6000602082019050818103600083015261401d81613fe1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061405e826135aa565b9150614069836135aa565b925082820190508082111561408157614080614024565b5b92915050565b7f4d41585f535550504c5900000000000000000000000000000000000000000000600082015250565b60006140bd600a83613514565b91506140c882614087565b602082019050919050565b600060208201905081810360008301526140ec816140b0565b9050919050565b7f4d41585f4d494e54000000000000000000000000000000000000000000000000600082015250565b6000614129600883613514565b9150614134826140f3565b602082019050919050565b600060208201905081810360008301526141588161411c565b9050919050565b600061416a826135aa565b9150614175836135aa565b9250828202614183816135aa565b9150828204841483151761419a57614199614024565b5b5092915050565b7f494e56414c49445f505249434500000000000000000000000000000000000000600082015250565b60006141d7600d83613514565b91506141e2826141a1565b602082019050919050565b60006020820190508181036000830152614206816141ca565b9050919050565b60008160601b9050919050565b60006142258261420d565b9050919050565b60006142378261421a565b9050919050565b61424f61424a82613657565b61422c565b82525050565b6000819050919050565b61427061426b826135aa565b614255565b82525050565b6000614282828561423e565b601482019150614292828461425f565b6020820191508190509392505050565b7f496e76616c6964204d65726b6c652050726f6f662e0000000000000000000000600082015250565b60006142d8601583613514565b91506142e3826142a2565b602082019050919050565b60006020820190508181036000830152614307816142cb565b9050919050565b7f4d415820574c204d494e54530000000000000000000000000000000000000000600082015250565b6000614344600c83613514565b915061434f8261430e565b602082019050919050565b6000602082019050818103600083015261437381614337565b9050919050565b600081905092915050565b600061439082613509565b61439a818561437a565b93506143aa818560208601613525565b80840191505092915050565b60006143c28285614385565b91506143ce8284614385565b91508190509392505050565b7f494e56414c49445f57414c4c4554000000000000000000000000000000000000600082015250565b6000614410600e83613514565b915061441b826143da565b602082019050919050565b6000602082019050818103600083015261443f81614403565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614480826135aa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144b2576144b1614024565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614519602683613514565b9150614524826144bd565b604082019050919050565b600060208201905081810360008301526145488161450c565b9050919050565b60006040820190506145646000830185613669565b6145716020830184613669565b9392505050565b60008151905061458781613886565b92915050565b6000602082840312156145a3576145a26132b5565b5b60006145b184828501614578565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60006145e1826145ba565b6145eb81856145c5565b93506145fb818560208601613525565b61460481613384565b840191505092915050565b60006080820190506146246000830187613669565b6146316020830186613669565b61463e60408301856135b4565b818103606083015261465081846145d6565b905095945050505050565b60008151905061466a816132eb565b92915050565b600060208284031215614686576146856132b5565b5b60006146948482850161465b565b9150509291505056fea26469706673582212201e39997e7e76ee19c1e01d0098c1f795ef24057741ee11f7cb8b661002c0be6964736f6c63430008110033

Deployed Bytecode

0x6080604052600436106102515760003560e01c80636352211e11610139578063a22cb465116100b6578063c87b56dd1161007a578063c87b56dd14610869578063e222c7f9146108a6578063e2a70eaf146108bd578063e985e9c5146108e6578063eeb9052f14610923578063f2fde38b1461094c57610251565b8063a22cb465146107a7578063b88d4fde146107d0578063bf9c41cd146107f9578063c4ae316814610836578063c4be5b591461084d57610251565b80638456cb59116100fd5780638456cb59146106e457806386a173ee1461070f5780638bb64a8c1461073a5780638da5cb5b1461075157806395d89b411461077c57610251565b80636352211e146105ff57806365f130971461063c57806370a0823114610667578063715018a6146106a45780637cb64759146106bb57610251565b80632eb4a7ab116101d257806340c10f191161019657806340c10f19146104fc57806341f434341461051857806342842e0e146105435780634cf5f7a41461056c5780634f6ccce71461059757806354214f69146105d457610251565b80632eb4a7ab146104345780632f745c591461045f57806332cb6b0c1461049c57806333bc1c5c146104c75780633ccfd60b146104f257610251565b8063081812fc11610219578063081812fc1461033d578063095ea7b31461037a57806318160ddd146103a35780631c16521c146103ce57806323b872dd1461040b57610251565b806301ffc9a7146102565780630675b7c61461029357806306fdde03146102bc57806307ca9734146102e757806307e89ec014610312575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613317565b610975565b60405161028a919061335f565b60405180910390f35b34801561029f57600080fd5b506102ba60048036038101906102b591906134c0565b610abf565b005b3480156102c857600080fd5b506102d1610b4e565b6040516102de9190613588565b60405180910390f35b3480156102f357600080fd5b506102fc610be0565b60405161030991906135c3565b60405180910390f35b34801561031e57600080fd5b50610327610be6565b60405161033491906135c3565b60405180910390f35b34801561034957600080fd5b50610364600480360381019061035f919061360a565b610bec565b6040516103719190613678565b60405180910390f35b34801561038657600080fd5b506103a1600480360381019061039c91906136bf565b610c68565b005b3480156103af57600080fd5b506103b8610c81565b6040516103c591906135c3565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f091906136ff565b610c8a565b60405161040291906135c3565b60405180910390f35b34801561041757600080fd5b50610432600480360381019061042d919061372c565b610ca2565b005b34801561044057600080fd5b50610449610cf1565b6040516104569190613798565b60405180910390f35b34801561046b57600080fd5b50610486600480360381019061048191906136bf565b610cf7565b60405161049391906135c3565b60405180910390f35b3480156104a857600080fd5b506104b1610eb9565b6040516104be91906135c3565b60405180910390f35b3480156104d357600080fd5b506104dc610ebf565b6040516104e9919061335f565b60405180910390f35b6104fa610ed2565b005b610516600480360381019061051191906136bf565b610fa4565b005b34801561052457600080fd5b5061052d61118c565b60405161053a9190613812565b60405180910390f35b34801561054f57600080fd5b5061056a6004803603810190610565919061372c565b61119e565b005b34801561057857600080fd5b506105816111ed565b60405161058e9190613588565b60405180910390f35b3480156105a357600080fd5b506105be60048036038101906105b9919061360a565b61127b565b6040516105cb91906135c3565b60405180910390f35b3480156105e057600080fd5b506105e96112c5565b6040516105f6919061335f565b60405180910390f35b34801561060b57600080fd5b506106266004803603810190610621919061360a565b6112d8565b6040516106339190613678565b60405180910390f35b34801561064857600080fd5b506106516112ee565b60405161065e91906135c3565b60405180910390f35b34801561067357600080fd5b5061068e600480360381019061068991906136ff565b6112f3565b60405161069b91906135c3565b60405180910390f35b3480156106b057600080fd5b506106b96113d2565b005b3480156106c757600080fd5b506106e260048036038101906106dd9190613859565b61145a565b005b3480156106f057600080fd5b506106f96114e0565b604051610706919061335f565b60405180910390f35b34801561071b57600080fd5b506107246114f3565b604051610731919061335f565b60405180910390f35b34801561074657600080fd5b5061074f611506565b005b34801561075d57600080fd5b506107666115ba565b6040516107739190613678565b60405180910390f35b34801561078857600080fd5b506107916115e4565b60405161079e9190613588565b60405180910390f35b3480156107b357600080fd5b506107ce60048036038101906107c991906138b2565b611676565b005b3480156107dc57600080fd5b506107f760048036038101906107f29190613993565b61168f565b005b34801561080557600080fd5b50610820600480360381019061081b91906136ff565b6116e0565b60405161082d91906135c3565b60405180910390f35b34801561084257600080fd5b5061084b6116f8565b005b61086760048036038101906108629190613a76565b6117a0565b005b34801561087557600080fd5b50610890600480360381019061088b919061360a565b611a44565b60405161089d9190613588565b60405180910390f35b3480156108b257600080fd5b506108bb611ae2565b005b3480156108c957600080fd5b506108e460048036038101906108df919061360a565b611b96565b005b3480156108f257600080fd5b5061090d60048036038101906109089190613aea565b611c1c565b60405161091a919061335f565b60405180910390f35b34801561092f57600080fd5b5061094a60048036038101906109459190613bed565b611cb0565b005b34801561095857600080fd5b50610973600480360381019061096e91906136ff565b611e10565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a4057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aa857507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ab85750610ab782611f07565b5b9050919050565b610ac7611f71565b73ffffffffffffffffffffffffffffffffffffffff16610ae56115ba565b73ffffffffffffffffffffffffffffffffffffffff1614610b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3290613c95565b60405180910390fd5b80600a9081610b4a9190613eb7565b5050565b606060018054610b5d90613ce4565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8990613ce4565b8015610bd65780601f10610bab57610100808354040283529160200191610bd6565b820191906000526020600020905b815481529060010190602001808311610bb957829003601f168201915b5050505050905090565b60095481565b60085481565b6000610bf782611f79565b610c2d576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610c7281611f86565b610c7c8383612083565b505050565b60008054905090565b600e6020528060005260406000206000915090505481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ce057610cdf33611f86565b5b610ceb84848461218d565b50505050565b600d5481565b6000610d02836112f3565b8210610d3a576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610d44610c81565b905060008060005b83811015610e9c576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610e3e57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e8e57868403610e85578195505050505050610eb3565b83806001019450505b508080600101915050610d4c565b506000610eac57610eab613f89565b5b8193505050505b92915050565b61271081565b600c60019054906101000a900460ff1681565b610eda611f71565b73ffffffffffffffffffffffffffffffffffffffff16610ef86115ba565b73ffffffffffffffffffffffffffffffffffffffff1614610f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4590613c95565b60405180910390fd5b6000479050610f5b6115ba565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610fa0573d6000803e3d6000fd5b5050565b600c60019054906101000a900460ff16610ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fea90614004565b60405180910390fd5b61271081610fff610c81565b6110099190614053565b111561104a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611041906140d3565b60405180910390fd5b600a81600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110979190614053565b11156110d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cf9061413f565b60405180910390fd5b806008546110e6919061415f565b341015611128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111f906141ed565b60405180910390fd5b80600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111779190614053565b92505081905550611188828261219d565b5050565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146111dc576111db33611f86565b5b6111e78484846121bb565b50505050565b600b80546111fa90613ce4565b80601f016020809104026020016040519081016040528092919081815260200182805461122690613ce4565b80156112735780601f1061124857610100808354040283529160200191611273565b820191906000526020600020905b81548152906001019060200180831161125657829003601f168201915b505050505081565b6000611285610c81565b82106112bd576040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b819050919050565b600c60009054906101000a900460ff1681565b60006112e3826121db565b600001519050919050565b600a81565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361135a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6113da611f71565b73ffffffffffffffffffffffffffffffffffffffff166113f86115ba565b73ffffffffffffffffffffffffffffffffffffffff161461144e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144590613c95565b60405180910390fd5b6114586000612363565b565b611462611f71565b73ffffffffffffffffffffffffffffffffffffffff166114806115ba565b73ffffffffffffffffffffffffffffffffffffffff16146114d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cd90613c95565b60405180910390fd5b80600d8190555050565b600c60039054906101000a900460ff1681565b600c60029054906101000a900460ff1681565b61150e611f71565b73ffffffffffffffffffffffffffffffffffffffff1661152c6115ba565b73ffffffffffffffffffffffffffffffffffffffff1614611582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157990613c95565b60405180910390fd5b6001600c60026101000a81548160ff0219169083151502179055506000600c60016101000a81548160ff021916908315150217905550565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546115f390613ce4565b80601f016020809104026020016040519081016040528092919081815260200182805461161f90613ce4565b801561166c5780601f106116415761010080835404028352916020019161166c565b820191906000526020600020905b81548152906001019060200180831161164f57829003601f168201915b5050505050905090565b8161168081611f86565b61168a8383612429565b505050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116cd576116cc33611f86565b5b6116d9858585856125a0565b5050505050565b600f6020528060005260406000206000915090505481565b611700611f71565b73ffffffffffffffffffffffffffffffffffffffff1661171e6115ba565b73ffffffffffffffffffffffffffffffffffffffff1614611774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176b90613c95565b60405180910390fd5b600c60039054906101000a900460ff1615600c60036101000a81548160ff021916908315150217905550565b600c60029054906101000a900460ff166117ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e690614004565b60405180910390fd5b60003384604051602001611804929190614276565b60405160208183030381529060405280519060200120905061186a838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d54836125f3565b6118a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a0906142ee565b60405180910390fd5b8385600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118f59190614053565b1115611936576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192d9061435a565b60405180910390fd5b61271085611942610c81565b61194c9190614053565b111561198d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611984906140d3565b60405180910390fd5b8460095461199b919061415f565b3410156119dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d4906141ed565b60405180910390fd5b84600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a2c9190614053565b92505081905550611a3d338661219d565b5050505050565b6060611a4f82611f79565b611a85576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611a8f61260a565b90506000815103611aaf5760405180602001604052806000815250611ada565b80611ab98461269c565b604051602001611aca9291906143b6565b6040516020818303038152906040525b915050919050565b611aea611f71565b73ffffffffffffffffffffffffffffffffffffffff16611b086115ba565b73ffffffffffffffffffffffffffffffffffffffff1614611b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5590613c95565b60405180910390fd5b6000600c60026101000a81548160ff0219169083151502179055506001600c60016101000a81548160ff021916908315150217905550565b611b9e611f71565b73ffffffffffffffffffffffffffffffffffffffff16611bbc6115ba565b73ffffffffffffffffffffffffffffffffffffffff1614611c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0990613c95565b60405180910390fd5b8060088190555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611cb8611f71565b73ffffffffffffffffffffffffffffffffffffffff16611cd66115ba565b73ffffffffffffffffffffffffffffffffffffffff1614611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2390613c95565b60405180910390fd5b6000825111611d70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6790614426565b60405180910390fd5b6127108251611d7d610c81565b611d879190614053565b1115611dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbf906140d3565b60405180910390fd5b60005b8251811015611e0b57611df8838281518110611dea57611de9614446565b5b60200260200101518361219d565b8080611e0390614475565b915050611dcb565b505050565b611e18611f71565b73ffffffffffffffffffffffffffffffffffffffff16611e366115ba565b73ffffffffffffffffffffffffffffffffffffffff1614611e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8390613c95565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef29061452f565b60405180910390fd5b611f0481612363565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000805482109050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612080576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611ffd92919061454f565b602060405180830381865afa15801561201a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203e919061458d565b61207f57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016120769190613678565b60405180910390fd5b5b50565b600061208e826112d8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036120f5576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16612114611f71565b73ffffffffffffffffffffffffffffffffffffffff161415801561214657506121448161213f611f71565b611c1c565b155b1561217d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121888383836126ec565b505050565b61219883838361279e565b505050565b6121b7828260405180602001604052806000815250612cc1565b5050565b6121d68383836040518060200160405280600081525061168f565b505050565b6121e3613271565b6121ec82611f79565b612222576040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008290505b6000811061232b576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461231c57809250505061235e565b50808060019003915050612228565b506040517fe7c0edfb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612431611f71565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612495576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600660006124a2611f71565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661254f611f71565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612594919061335f565b60405180910390a35050565b6125ab84848461279e565b6125b784848484612cd3565b6125ed576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000826126008584612e51565b1490509392505050565b6060600a805461261990613ce4565b80601f016020809104026020016040519081016040528092919081815260200182805461264590613ce4565b80156126925780601f1061266757610100808354040283529160200191612692565b820191906000526020600020905b81548152906001019060200180831161267557829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b6001156126d757600184039350600a81066030018453600a81049050806126b5575b50828103602084039350808452505050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006127a9826121db565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166127d0611f71565b73ffffffffffffffffffffffffffffffffffffffff16148061282c57506127f5611f71565b73ffffffffffffffffffffffffffffffffffffffff1661281484610bec565b73ffffffffffffffffffffffffffffffffffffffff16145b8061284857506128478260000151612842611f71565b611c1c565b5b905080612881576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146128ea576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612950576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61295d8585856001612ec6565b61296d60008484600001516126ec565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612c5157612bb081611f79565b15612c505782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cba8585856001612ecc565b5050505050565b612cce8383836001612ed2565b505050565b6000612cf48473ffffffffffffffffffffffffffffffffffffffff16613237565b15612e44578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d1d611f71565b8786866040518563ffffffff1660e01b8152600401612d3f949392919061460f565b6020604051808303816000875af1925050508015612d7b57506040513d601f19601f82011682018060405250810190612d789190614670565b60015b612df4573d8060008114612dab576040519150601f19603f3d011682016040523d82523d6000602084013e612db0565b606091505b506000815103612dec576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e49565b600190505b949350505050565b60008082905060005b8451811015612ebb576000858281518110612e7857612e77614446565b5b60200260200101519050808311612e9a57612e93838261325a565b9250612ea7565b612ea4818461325a565b92505b508080612eb390614475565b915050612e5a565b508091505092915050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612f3e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403612f78576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f856000868387612ec6565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561321a57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48380156131ce57506131cc6000888488612cd3565b155b15613205576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050613153565b5080600081905550506132306000868387612ecc565b5050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132f4816132bf565b81146132ff57600080fd5b50565b600081359050613311816132eb565b92915050565b60006020828403121561332d5761332c6132b5565b5b600061333b84828501613302565b91505092915050565b60008115159050919050565b61335981613344565b82525050565b60006020820190506133746000830184613350565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6133cd82613384565b810181811067ffffffffffffffff821117156133ec576133eb613395565b5b80604052505050565b60006133ff6132ab565b905061340b82826133c4565b919050565b600067ffffffffffffffff82111561342b5761342a613395565b5b61343482613384565b9050602081019050919050565b82818337600083830152505050565b600061346361345e84613410565b6133f5565b90508281526020810184848401111561347f5761347e61337f565b5b61348a848285613441565b509392505050565b600082601f8301126134a7576134a661337a565b5b81356134b7848260208601613450565b91505092915050565b6000602082840312156134d6576134d56132b5565b5b600082013567ffffffffffffffff8111156134f4576134f36132ba565b5b61350084828501613492565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613543578082015181840152602081019050613528565b60008484015250505050565b600061355a82613509565b6135648185613514565b9350613574818560208601613525565b61357d81613384565b840191505092915050565b600060208201905081810360008301526135a2818461354f565b905092915050565b6000819050919050565b6135bd816135aa565b82525050565b60006020820190506135d860008301846135b4565b92915050565b6135e7816135aa565b81146135f257600080fd5b50565b600081359050613604816135de565b92915050565b6000602082840312156136205761361f6132b5565b5b600061362e848285016135f5565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061366282613637565b9050919050565b61367281613657565b82525050565b600060208201905061368d6000830184613669565b92915050565b61369c81613657565b81146136a757600080fd5b50565b6000813590506136b981613693565b92915050565b600080604083850312156136d6576136d56132b5565b5b60006136e4858286016136aa565b92505060206136f5858286016135f5565b9150509250929050565b600060208284031215613715576137146132b5565b5b6000613723848285016136aa565b91505092915050565b600080600060608486031215613745576137446132b5565b5b6000613753868287016136aa565b9350506020613764868287016136aa565b9250506040613775868287016135f5565b9150509250925092565b6000819050919050565b6137928161377f565b82525050565b60006020820190506137ad6000830184613789565b92915050565b6000819050919050565b60006137d86137d36137ce84613637565b6137b3565b613637565b9050919050565b60006137ea826137bd565b9050919050565b60006137fc826137df565b9050919050565b61380c816137f1565b82525050565b60006020820190506138276000830184613803565b92915050565b6138368161377f565b811461384157600080fd5b50565b6000813590506138538161382d565b92915050565b60006020828403121561386f5761386e6132b5565b5b600061387d84828501613844565b91505092915050565b61388f81613344565b811461389a57600080fd5b50565b6000813590506138ac81613886565b92915050565b600080604083850312156138c9576138c86132b5565b5b60006138d7858286016136aa565b92505060206138e88582860161389d565b9150509250929050565b600067ffffffffffffffff82111561390d5761390c613395565b5b61391682613384565b9050602081019050919050565b6000613936613931846138f2565b6133f5565b9050828152602081018484840111156139525761395161337f565b5b61395d848285613441565b509392505050565b600082601f83011261397a5761397961337a565b5b813561398a848260208601613923565b91505092915050565b600080600080608085870312156139ad576139ac6132b5565b5b60006139bb878288016136aa565b94505060206139cc878288016136aa565b93505060406139dd878288016135f5565b925050606085013567ffffffffffffffff8111156139fe576139fd6132ba565b5b613a0a87828801613965565b91505092959194509250565b600080fd5b600080fd5b60008083601f840112613a3657613a3561337a565b5b8235905067ffffffffffffffff811115613a5357613a52613a16565b5b602083019150836020820283011115613a6f57613a6e613a1b565b5b9250929050565b60008060008060608587031215613a9057613a8f6132b5565b5b6000613a9e878288016135f5565b9450506020613aaf878288016135f5565b935050604085013567ffffffffffffffff811115613ad057613acf6132ba565b5b613adc87828801613a20565b925092505092959194509250565b60008060408385031215613b0157613b006132b5565b5b6000613b0f858286016136aa565b9250506020613b20858286016136aa565b9150509250929050565b600067ffffffffffffffff821115613b4557613b44613395565b5b602082029050602081019050919050565b6000613b69613b6484613b2a565b6133f5565b90508083825260208201905060208402830185811115613b8c57613b8b613a1b565b5b835b81811015613bb55780613ba188826136aa565b845260208401935050602081019050613b8e565b5050509392505050565b600082601f830112613bd457613bd361337a565b5b8135613be4848260208601613b56565b91505092915050565b60008060408385031215613c0457613c036132b5565b5b600083013567ffffffffffffffff811115613c2257613c216132ba565b5b613c2e85828601613bbf565b9250506020613c3f858286016135f5565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613c7f602083613514565b9150613c8a82613c49565b602082019050919050565b60006020820190508181036000830152613cae81613c72565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613cfc57607f821691505b602082108103613d0f57613d0e613cb5565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613d777fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613d3a565b613d818683613d3a565b95508019841693508086168417925050509392505050565b6000613db4613daf613daa846135aa565b6137b3565b6135aa565b9050919050565b6000819050919050565b613dce83613d99565b613de2613dda82613dbb565b848454613d47565b825550505050565b600090565b613df7613dea565b613e02818484613dc5565b505050565b5b81811015613e2657613e1b600082613def565b600181019050613e08565b5050565b601f821115613e6b57613e3c81613d15565b613e4584613d2a565b81016020851015613e54578190505b613e68613e6085613d2a565b830182613e07565b50505b505050565b600082821c905092915050565b6000613e8e60001984600802613e70565b1980831691505092915050565b6000613ea78383613e7d565b9150826002028217905092915050565b613ec082613509565b67ffffffffffffffff811115613ed957613ed8613395565b5b613ee38254613ce4565b613eee828285613e2a565b600060209050601f831160018114613f215760008415613f0f578287015190505b613f198582613e9b565b865550613f81565b601f198416613f2f86613d15565b60005b82811015613f5757848901518255600182019150602085019450602081019050613f32565b86831015613f745784890151613f70601f891682613e7d565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b7f4e4f545f4f50454e000000000000000000000000000000000000000000000000600082015250565b6000613fee600883613514565b9150613ff982613fb8565b602082019050919050565b6000602082019050818103600083015261401d81613fe1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061405e826135aa565b9150614069836135aa565b925082820190508082111561408157614080614024565b5b92915050565b7f4d41585f535550504c5900000000000000000000000000000000000000000000600082015250565b60006140bd600a83613514565b91506140c882614087565b602082019050919050565b600060208201905081810360008301526140ec816140b0565b9050919050565b7f4d41585f4d494e54000000000000000000000000000000000000000000000000600082015250565b6000614129600883613514565b9150614134826140f3565b602082019050919050565b600060208201905081810360008301526141588161411c565b9050919050565b600061416a826135aa565b9150614175836135aa565b9250828202614183816135aa565b9150828204841483151761419a57614199614024565b5b5092915050565b7f494e56414c49445f505249434500000000000000000000000000000000000000600082015250565b60006141d7600d83613514565b91506141e2826141a1565b602082019050919050565b60006020820190508181036000830152614206816141ca565b9050919050565b60008160601b9050919050565b60006142258261420d565b9050919050565b60006142378261421a565b9050919050565b61424f61424a82613657565b61422c565b82525050565b6000819050919050565b61427061426b826135aa565b614255565b82525050565b6000614282828561423e565b601482019150614292828461425f565b6020820191508190509392505050565b7f496e76616c6964204d65726b6c652050726f6f662e0000000000000000000000600082015250565b60006142d8601583613514565b91506142e3826142a2565b602082019050919050565b60006020820190508181036000830152614307816142cb565b9050919050565b7f4d415820574c204d494e54530000000000000000000000000000000000000000600082015250565b6000614344600c83613514565b915061434f8261430e565b602082019050919050565b6000602082019050818103600083015261437381614337565b9050919050565b600081905092915050565b600061439082613509565b61439a818561437a565b93506143aa818560208601613525565b80840191505092915050565b60006143c28285614385565b91506143ce8284614385565b91508190509392505050565b7f494e56414c49445f57414c4c4554000000000000000000000000000000000000600082015250565b6000614410600e83613514565b915061441b826143da565b602082019050919050565b6000602082019050818103600083015261443f81614403565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614480826135aa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144b2576144b1614024565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614519602683613514565b9150614524826144bd565b604082019050919050565b600060208201905081810360008301526145488161450c565b9050919050565b60006040820190506145646000830185613669565b6145716020830184613669565b9392505050565b60008151905061458781613886565b92915050565b6000602082840312156145a3576145a26132b5565b5b60006145b184828501614578565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60006145e1826145ba565b6145eb81856145c5565b93506145fb818560208601613525565b61460481613384565b840191505092915050565b60006080820190506146246000830187613669565b6146316020830186613669565b61463e60408301856135b4565b818103606083015261465081846145d6565b905095945050505050565b60008151905061466a816132eb565b92915050565b600060208284031215614686576146856132b5565b5b60006146948482850161465b565b9150509291505056fea26469706673582212201e39997e7e76ee19c1e01d0098c1f795ef24057741ee11f7cb8b661002c0be6964736f6c63430008110033

Deployed Bytecode Sourcemap

58255:6235:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45506:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61568:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47322:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58510:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58456:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48807:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60318:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43744:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58804:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60491:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58770:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44398:1036;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58356:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58667:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64341:146;;;:::i;:::-;;58967:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11568:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60662:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58596:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43922:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58638:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47131:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58405:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45942:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22242:103;;;;;;;;;;;;;:::i;:::-;;61691:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58744:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58704:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61886:117;;;;;;;;;;;;;:::i;:::-;;21591:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47491:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60126:184;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60849:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58861:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61804:74;;;;;;;;;;;;;:::i;:::-;;59417:697;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61242:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62011:114;;;;;;;;;;;;;:::i;:::-;;62134:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49441:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62242:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22500:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45506:372;45608:4;45660:25;45645:40;;;:11;:40;;;;:105;;;;45717:33;45702:48;;;:11;:48;;;;45645:105;:172;;;;45782:35;45767:50;;;:11;:50;;;;45645:172;:225;;;;45834:36;45858:11;45834:23;:36::i;:::-;45645:225;45625:245;;45506:372;;;:::o;61568:115::-;21822:12;:10;:12::i;:::-;21811:23;;:7;:5;:7::i;:::-;:23;;;21803:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61662:13:::1;61647:12;:28;;;;;;:::i;:::-;;61568:115:::0;:::o;47322:100::-;47376:13;47409:5;47402:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47322:100;:::o;58510:43::-;;;;:::o;58456:47::-;;;;:::o;48807:204::-;48875:7;48900:16;48908:7;48900;:16::i;:::-;48895:64;;48925:34;;;;;;;;;;;;;;48895:64;48979:15;:24;48995:7;48979:24;;;;;;;;;;;;;;;;;;;;;48972:31;;48807:204;;;:::o;60318:165::-;60422:8;13350:30;13371:8;13350:20;:30::i;:::-;60443:32:::1;60457:8;60467:7;60443:13;:32::i;:::-;60318:165:::0;;;:::o;43744:101::-;43797:7;43824:13;;43817:20;;43744:101;:::o;58804:50::-;;;;;;;;;;;;;;;;;:::o;60491:163::-;60592:4;13084:10;13076:18;;:4;:18;;;13072:83;;13111:32;13132:10;13111:20;:32::i;:::-;13072:83;60609:37:::1;60628:4;60634:2;60638:7;60609:18;:37::i;:::-;60491:163:::0;;;;:::o;58770:25::-;;;;:::o;44398:1036::-;44487:7;44520:16;44530:5;44520:9;:16::i;:::-;44511:5;:25;44507:61;;44545:23;;;;;;;;;;;;;;44507:61;44579:22;44604:13;:11;:13::i;:::-;44579:38;;44628:19;44658:25;44847:9;44842:466;44862:14;44858:1;:18;44842:466;;;44902:31;44936:11;:14;44948:1;44936:14;;;;;;;;;;;44902:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44999:1;44973:28;;:9;:14;;;:28;;;44969:111;;45046:9;:14;;;45026:34;;44969:111;45123:5;45102:26;;:17;:26;;;45098:195;;45172:5;45157:11;:20;45153:85;;45213:1;45206:8;;;;;;;;;45153:85;45260:13;;;;;;;45098:195;44883:425;44878:3;;;;;;;44842:466;;;;45391:5;45384:13;;;;:::i;:::-;;45415:11;45408:18;;;;;44398:1036;;;;;:::o;58356:42::-;58393:5;58356:42;:::o;58667:30::-;;;;;;;;;;;;;:::o;64341:146::-;21822:12;:10;:12::i;:::-;21811:23;;:7;:5;:7::i;:::-;:23;;;21803:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64400:13:::1;64416:21;64400:37;;64452:7;:5;:7::i;:::-;64444:25;;:35;64470:8;64444:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;64393:94;64341:146::o:0;58967:442::-;59057:10;;;;;;;;;;;59049:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;58393:5;59116:9;59100:13;:11;:13::i;:::-;:25;;;;:::i;:::-;59099:41;;59091:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;58447:2;59196:9;59175:15;:19;59191:2;59175:19;;;;;;;;;;;;;;;;:30;;;;:::i;:::-;59174:51;;59166:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;59291:9;59271:17;;:29;;;;:::i;:::-;59257:9;:44;;59249:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;59355:9;59332:15;:19;59348:2;59332:19;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;59375:24;59385:2;59389:9;59375;:24::i;:::-;58967:442;;:::o;11568:143::-;4042:42;11568:143;:::o;60662:179::-;60775:4;13084:10;13076:18;;:4;:18;;;13072:83;;13111:32;13132:10;13111:20;:32::i;:::-;13072:83;60792:41:::1;60815:4;60821:2;60825:7;60792:22;:41::i;:::-;60662:179:::0;;;;:::o;58596:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43922:176::-;43989:7;44022:13;:11;:13::i;:::-;44013:5;:22;44009:58;;44044:23;;;;;;;;;;;;;;44009:58;44085:5;44078:12;;43922:176;;;:::o;58638:22::-;;;;;;;;;;;;;:::o;47131:124::-;47195:7;47222:20;47234:7;47222:11;:20::i;:::-;:25;;;47215:32;;47131:124;;;:::o;58405:44::-;58447:2;58405:44;:::o;45942:206::-;46006:7;46047:1;46030:19;;:5;:19;;;46026:60;;46058:28;;;;;;;;;;;;;;46026:60;46112:12;:19;46125:5;46112:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;46104:36;;46097:43;;45942:206;;;:::o;22242:103::-;21822:12;:10;:12::i;:::-;21811:23;;:7;:5;:7::i;:::-;:23;;;21803:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22307:30:::1;22334:1;22307:18;:30::i;:::-;22242:103::o:0;61691:105::-;21822:12;:10;:12::i;:::-;21811:23;;:7;:5;:7::i;:::-;:23;;;21803:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61777:11:::1;61764:10;:24;;;;61691:105:::0;:::o;58744:17::-;;;;;;;;;;;;;:::o;58704:33::-;;;;;;;;;;;;;:::o;61886:117::-;21822:12;:10;:12::i;:::-;21811:23;;:7;:5;:7::i;:::-;:23;;;21803:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61962:4:::1;61946:13;;:20;;;;;;;;;;;;;;;;;;61990:5;61977:10;;:18;;;;;;;;;;;;;;;;;;61886:117::o:0;21591:87::-;21637:7;21664:6;;;;;;;;;;;21657:13;;21591:87;:::o;47491:104::-;47547:13;47580:7;47573:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47491:104;:::o;60126:184::-;60238:8;13350:30;13371:8;13350:20;:30::i;:::-;60259:43:::1;60283:8;60293;60259:23;:43::i;:::-;60126:184:::0;;;:::o;60849:228::-;61000:4;13084:10;13076:18;;:4;:18;;;13072:83;;13111:32;13132:10;13111:20;:32::i;:::-;13072:83;61022:47:::1;61045:4;61051:2;61055:7;61064:4;61022:22;:47::i;:::-;60849:228:::0;;;;;:::o;58861:41::-;;;;;;;;;;;;;;;;;:::o;61804:74::-;21822:12;:10;:12::i;:::-;21811:23;;:7;:5;:7::i;:::-;:23;;;21803:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61865:5:::1;;;;;;;;;;;61864:6;61856:5;;:14;;;;;;;;;;;;;;;;;;61804:74::o:0;59417:697::-;59548:13;;;;;;;;;;;59540:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;59585:12;59627:10;59639:11;59610:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59600:52;;;;;;59585:67;;59685:50;59704:12;;59685:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59718:10;;59730:4;59685:18;:50::i;:::-;59663:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;59839:11;59826:9;59803:8;:20;59812:10;59803:20;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;:47;;59795:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;58393:5;59903:9;59887:13;:11;:13::i;:::-;:25;;;;:::i;:::-;59886:41;;59878:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;59991:9;59975:13;;:25;;;;:::i;:::-;59961:9;:40;;59953:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;60054:9;60030:8;:20;60039:10;60030:20;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;60074:32;60084:10;60096:9;60074;:32::i;:::-;59529:585;59417:697;;;;:::o;61242:318::-;61315:13;61346:16;61354:7;61346;:16::i;:::-;61341:59;;61371:29;;;;;;;;;;;;;;61341:59;61413:21;61437:10;:8;:10::i;:::-;61413:34;;61490:1;61471:7;61465:21;:26;:87;;;;;;;;;;;;;;;;;61518:7;61527:18;61537:7;61527:9;:18::i;:::-;61501:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61465:87;61458:94;;;61242:318;;;:::o;62011:114::-;21822:12;:10;:12::i;:::-;21811:23;;:7;:5;:7::i;:::-;:23;;;21803:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62084:5:::1;62068:13;;:21;;;;;;;;;;;;;;;;;;62113:4;62100:10;;:17;;;;;;;;;;;;;;;;;;62011:114::o:0;62134:104::-;21822:12;:10;:12::i;:::-;21811:23;;:7;:5;:7::i;:::-;:23;;;21803:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62225:5:::1;62205:17;:25;;;;62134:104:::0;:::o;49441:164::-;49538:4;49562:18;:25;49581:5;49562:25;;;;;;;;;;;;;;;:35;49588:8;49562:35;;;;;;;;;;;;;;;;;;;;;;;;;49555:42;;49441:164;;;;:::o;62242:336::-;21822:12;:10;:12::i;:::-;21811:23;;:7;:5;:7::i;:::-;:23;;;21803:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62352:1:::1;62334:8;:15;:19;62326:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;58393:5;62407:8;:15;62391:13;:11;:13::i;:::-;:31;;;;:::i;:::-;:45;;62383:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62467:6;62462:109;62483:8;:15;62479:1;:19;62462:109;;;62529:30;62539:8;62548:1;62539:11;;;;;;;;:::i;:::-;;;;;;;;62552:6;62529:9;:30::i;:::-;62500:3;;;;;:::i;:::-;;;;62462:109;;;;62242:336:::0;;:::o;22500:201::-;21822:12;:10;:12::i;:::-;21811:23;;:7;:5;:7::i;:::-;:23;;;21803:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22609:1:::1;22589:22;;:8;:22;;::::0;22581:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;22665:28;22684:8;22665:18;:28::i;:::-;22500:201:::0;:::o;34398:157::-;34483:4;34522:25;34507:40;;;:11;:40;;;;34500:47;;34398:157;;;:::o;20315:98::-;20368:7;20395:10;20388:17;;20315:98;:::o;50740:112::-;50797:4;50831:13;;50821:7;:23;50814:30;;50740:112;;;:::o;13493:647::-;13732:1;4042:42;13684:45;;;:49;13680:453;;;4042:42;13983;;;14034:4;14041:8;13983:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13978:144;;14097:8;14078:28;;;;;;;;;;;:::i;:::-;;;;;;;;13978:144;13680:453;13493:647;:::o;48388:353::-;48469:13;48485:24;48501:7;48485:15;:24::i;:::-;48469:40;;48530:5;48524:11;;:2;:11;;;48520:48;;48544:24;;;;;;;;;;;;;;48520:48;48601:5;48585:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;48611:37;48628:5;48635:12;:10;:12::i;:::-;48611:16;:37::i;:::-;48610:38;48585:63;48581:111;;;48657:35;;;;;;;;;;;;;;48581:111;48705:28;48714:2;48718:7;48727:5;48705:8;:28::i;:::-;48458:283;48388:353;;:::o;49672:170::-;49806:28;49816:4;49822:2;49826:7;49806:9;:28::i;:::-;49672:170;;;:::o;50860:104::-;50929:27;50939:2;50943:8;50929:27;;;;;;;;;;;;:9;:27::i;:::-;50860:104;;:::o;49913:185::-;50051:39;50068:4;50074:2;50078:7;50051:39;;;;;;;;;;;;:16;:39::i;:::-;49913:185;;;:::o;46565:504::-;46626:21;;:::i;:::-;46665:16;46673:7;46665;:16::i;:::-;46660:61;;46690:31;;;;;;;;;;;;;;46660:61;46764:12;46779:7;46764:22;;46759:245;46796:1;46788:4;:9;46759:245;;46826:31;46860:11;:17;46872:4;46860:17;;;;;;;;;;;46826:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46926:1;46900:28;;:9;:14;;;:28;;;46896:93;;46960:9;46953:16;;;;;;46896:93;46807:197;46799:6;;;;;;;;46759:245;;;;47034:27;;;;;;;;;;;;;;46565:504;;;;:::o;22861:191::-;22935:16;22954:6;;;;;;;;;;;22935:25;;22980:8;22971:6;;:17;;;;;;;;;;;;;;;;;;23035:8;23004:40;;23025:8;23004:40;;;;;;;;;;;;22924:128;22861:191;:::o;49083:287::-;49194:12;:10;:12::i;:::-;49182:24;;:8;:24;;;49178:54;;49215:17;;;;;;;;;;;;;;49178:54;49290:8;49245:18;:32;49264:12;:10;:12::i;:::-;49245:32;;;;;;;;;;;;;;;:42;49278:8;49245:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;49343:8;49314:48;;49329:12;:10;:12::i;:::-;49314:48;;;49353:8;49314:48;;;;;;:::i;:::-;;;;;;;;49083:287;;:::o;50169:316::-;50336:28;50346:4;50352:2;50356:7;50336:9;:28::i;:::-;50380:48;50403:4;50409:2;50413:7;50422:5;50380:22;:48::i;:::-;50375:102;;50437:40;;;;;;;;;;;;;;50375:102;50169:316;;;;:::o;16047:190::-;16172:4;16225;16196:25;16209:5;16216:4;16196:12;:25::i;:::-;:33;16189:40;;16047:190;;;;;:::o;61085:113::-;61145:13;61178:12;61171:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61085:113;:::o;62588:1745::-;62653:17;63087:4;63080;63074:11;63070:22;63179:1;63173:4;63166:15;63254:4;63251:1;63247:12;63240:19;;63336:1;63331:3;63324:14;63440:3;63679:5;63661:428;63687:1;63661:428;;;63727:1;63722:3;63718:11;63711:18;;63898:2;63892:4;63888:13;63884:2;63880:22;63875:3;63867:36;63992:2;63986:4;63982:13;63974:21;;64059:4;63661:428;64049:25;63661:428;63665:21;64128:3;64123;64119:13;64243:4;64238:3;64234:14;64227:21;;64308:6;64303:3;64296:19;62692:1634;;;62588:1745;;;:::o;55503:196::-;55645:2;55618:15;:24;55634:7;55618:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;55683:7;55679:2;55663:28;;55672:5;55663:28;;;;;;;;;;;;55503:196;;;:::o;53423:1962::-;53538:35;53576:20;53588:7;53576:11;:20::i;:::-;53538:58;;53609:22;53651:13;:18;;;53635:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;53710:12;:10;:12::i;:::-;53686:36;;:20;53698:7;53686:11;:20::i;:::-;:36;;;53635:87;:154;;;;53739:50;53756:13;:18;;;53776:12;:10;:12::i;:::-;53739:16;:50::i;:::-;53635:154;53609:181;;53808:17;53803:66;;53834:35;;;;;;;;;;;;;;53803:66;53906:4;53884:26;;:13;:18;;;:26;;;53880:67;;53919:28;;;;;;;;;;;;;;53880:67;53976:1;53962:16;;:2;:16;;;53958:52;;53987:23;;;;;;;;;;;;;;53958:52;54023:43;54045:4;54051:2;54055:7;54064:1;54023:21;:43::i;:::-;54131:49;54148:1;54152:7;54161:13;:18;;;54131:8;:49::i;:::-;54506:1;54476:12;:18;54489:4;54476:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54550:1;54522:12;:16;54535:2;54522:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54596:2;54568:11;:20;54580:7;54568:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;54658:15;54613:11;:20;54625:7;54613:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;54926:19;54958:1;54948:7;:11;54926:33;;55019:1;54978:43;;:11;:24;54990:11;54978:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;54974:295;;55046:20;55054:11;55046:7;:20::i;:::-;55042:212;;;55123:13;:18;;;55091:11;:24;55103:11;55091:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;55206:13;:28;;;55164:11;:24;55176:11;55164:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;55042:212;54974:295;54451:829;55316:7;55312:2;55297:27;;55306:4;55297:27;;;;;;;;;;;;55335:42;55356:4;55362:2;55366:7;55375:1;55335:20;:42::i;:::-;53527:1858;;53423:1962;;;:::o;51327:163::-;51450:32;51456:2;51460:8;51470:5;51477:4;51450:5;:32::i;:::-;51327:163;;;:::o;56264:765::-;56419:4;56440:15;:2;:13;;;:15::i;:::-;56436:586;;;56492:2;56476:36;;;56513:12;:10;:12::i;:::-;56527:4;56533:7;56542:5;56476:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;56472:495;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56739:1;56722:6;:13;:18;56718:234;;56749:40;;;;;;;;;;;;;;56718:234;56902:6;56896:13;56887:6;56883:2;56879:15;56872:38;56472:495;56609:45;;;56599:55;;;:6;:55;;;;56592:62;;;;;56436:586;57006:4;56999:11;;56264:765;;;;;;;:::o;16598:675::-;16681:7;16701:20;16724:4;16701:27;;16744:9;16739:497;16763:5;:12;16759:1;:16;16739:497;;;16797:20;16820:5;16826:1;16820:8;;;;;;;;:::i;:::-;;;;;;;;16797:31;;16863:12;16847;:28;16843:382;;16990:42;17005:12;17019;16990:14;:42::i;:::-;16975:57;;16843:382;;;17167:42;17182:12;17196;17167:14;:42::i;:::-;17152:57;;16843:382;16782:454;16777:3;;;;;:::i;:::-;;;;16739:497;;;;17253:12;17246:19;;;16598:675;;;;:::o;57517:159::-;;;;;:::o;58088:158::-;;;;;:::o;51749:1420::-;51888:20;51911:13;;51888:36;;51953:1;51939:16;;:2;:16;;;51935:48;;51964:19;;;;;;;;;;;;;;51935:48;52010:1;51998:8;:13;51994:44;;52020:18;;;;;;;;;;;;;;51994:44;52051:61;52081:1;52085:2;52089:12;52103:8;52051:21;:61::i;:::-;52427:8;52391:12;:16;52404:2;52391:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52492:8;52451:12;:16;52464:2;52451:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52551:2;52518:11;:25;52530:12;52518:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;52618:15;52568:11;:25;52580:12;52568:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;52651:20;52674:12;52651:35;;52708:9;52703:330;52723:8;52719:1;:12;52703:330;;;52787:12;52783:2;52762:38;;52779:1;52762:38;;;;;;;;;;;;52823:4;:68;;;;;52832:59;52863:1;52867:2;52871:12;52885:5;52832:22;:59::i;:::-;52831:60;52823:68;52819:164;;;52923:40;;;;;;;;;;;;;;52819:164;53003:14;;;;;;;52733:3;;;;;;;52703:330;;;;53065:12;53049:13;:28;;;;52366:723;53101:60;53130:1;53134:2;53138:12;53152:8;53101:20;:60::i;:::-;51877:1292;51749:1420;;;;:::o;24292:326::-;24352:4;24609:1;24587:7;:19;;;:23;24580:30;;24292:326;;;:::o;17281:224::-;17349:13;17412:1;17406:4;17399:15;17441:1;17435:4;17428:15;17482:4;17476;17466:21;17457:30;;17281: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:117::-;1627:1;1624;1617:12;1641:117;1750:1;1747;1740:12;1764:102;1805:6;1856:2;1852:7;1847:2;1840:5;1836:14;1832:28;1822:38;;1764:102;;;:::o;1872:180::-;1920:77;1917:1;1910:88;2017:4;2014:1;2007:15;2041:4;2038:1;2031:15;2058:281;2141:27;2163:4;2141:27;:::i;:::-;2133:6;2129:40;2271:6;2259:10;2256:22;2235:18;2223:10;2220:34;2217:62;2214:88;;;2282:18;;:::i;:::-;2214:88;2322:10;2318:2;2311:22;2101:238;2058:281;;:::o;2345:129::-;2379:6;2406:20;;:::i;:::-;2396:30;;2435:33;2463:4;2455:6;2435:33;:::i;:::-;2345:129;;;:::o;2480:308::-;2542:4;2632:18;2624:6;2621:30;2618:56;;;2654:18;;:::i;:::-;2618:56;2692:29;2714:6;2692:29;:::i;:::-;2684:37;;2776:4;2770;2766:15;2758:23;;2480:308;;;:::o;2794:146::-;2891:6;2886:3;2881;2868:30;2932:1;2923:6;2918:3;2914:16;2907:27;2794:146;;;:::o;2946:425::-;3024:5;3049:66;3065:49;3107:6;3065:49;:::i;:::-;3049:66;:::i;:::-;3040:75;;3138:6;3131:5;3124:21;3176:4;3169:5;3165:16;3214:3;3205:6;3200:3;3196:16;3193:25;3190:112;;;3221:79;;:::i;:::-;3190:112;3311:54;3358:6;3353:3;3348;3311:54;:::i;:::-;3030:341;2946:425;;;;;:::o;3391:340::-;3447:5;3496:3;3489:4;3481:6;3477:17;3473:27;3463:122;;3504:79;;:::i;:::-;3463:122;3621:6;3608:20;3646:79;3721:3;3713:6;3706:4;3698:6;3694:17;3646:79;:::i;:::-;3637:88;;3453:278;3391:340;;;;:::o;3737:509::-;3806:6;3855:2;3843:9;3834:7;3830:23;3826:32;3823:119;;;3861:79;;:::i;:::-;3823:119;4009:1;3998:9;3994:17;3981:31;4039:18;4031:6;4028:30;4025:117;;;4061:79;;:::i;:::-;4025:117;4166:63;4221:7;4212:6;4201:9;4197:22;4166:63;:::i;:::-;4156:73;;3952:287;3737:509;;;;:::o;4252:99::-;4304:6;4338:5;4332:12;4322:22;;4252:99;;;:::o;4357:169::-;4441:11;4475:6;4470:3;4463:19;4515:4;4510:3;4506:14;4491:29;;4357:169;;;;:::o;4532:246::-;4613:1;4623:113;4637:6;4634:1;4631:13;4623:113;;;4722:1;4717:3;4713:11;4707:18;4703:1;4698:3;4694:11;4687:39;4659:2;4656:1;4652:10;4647:15;;4623:113;;;4770:1;4761:6;4756:3;4752:16;4745:27;4594:184;4532:246;;;:::o;4784:377::-;4872:3;4900:39;4933:5;4900:39;:::i;:::-;4955:71;5019:6;5014:3;4955:71;:::i;:::-;4948:78;;5035:65;5093:6;5088:3;5081:4;5074:5;5070:16;5035:65;:::i;:::-;5125:29;5147:6;5125:29;:::i;:::-;5120:3;5116:39;5109:46;;4876:285;4784:377;;;;:::o;5167:313::-;5280:4;5318:2;5307:9;5303:18;5295:26;;5367:9;5361:4;5357:20;5353:1;5342:9;5338:17;5331:47;5395:78;5468:4;5459:6;5395:78;:::i;:::-;5387:86;;5167:313;;;;:::o;5486:77::-;5523:7;5552:5;5541:16;;5486:77;;;:::o;5569:118::-;5656:24;5674:5;5656:24;:::i;:::-;5651:3;5644:37;5569:118;;:::o;5693:222::-;5786:4;5824:2;5813:9;5809:18;5801:26;;5837:71;5905:1;5894:9;5890:17;5881:6;5837:71;:::i;:::-;5693:222;;;;:::o;5921:122::-;5994:24;6012:5;5994:24;:::i;:::-;5987:5;5984:35;5974:63;;6033:1;6030;6023:12;5974:63;5921:122;:::o;6049:139::-;6095:5;6133:6;6120:20;6111:29;;6149:33;6176:5;6149:33;:::i;:::-;6049:139;;;;:::o;6194:329::-;6253:6;6302:2;6290:9;6281:7;6277:23;6273:32;6270:119;;;6308:79;;:::i;:::-;6270:119;6428:1;6453:53;6498:7;6489:6;6478:9;6474:22;6453:53;:::i;:::-;6443:63;;6399:117;6194:329;;;;:::o;6529:126::-;6566:7;6606:42;6599:5;6595:54;6584:65;;6529:126;;;:::o;6661:96::-;6698:7;6727:24;6745:5;6727:24;:::i;:::-;6716:35;;6661:96;;;:::o;6763:118::-;6850:24;6868:5;6850:24;:::i;:::-;6845:3;6838:37;6763:118;;:::o;6887:222::-;6980:4;7018:2;7007:9;7003:18;6995:26;;7031:71;7099:1;7088:9;7084:17;7075:6;7031:71;:::i;:::-;6887:222;;;;:::o;7115:122::-;7188:24;7206:5;7188:24;:::i;:::-;7181:5;7178:35;7168:63;;7227:1;7224;7217:12;7168:63;7115:122;:::o;7243:139::-;7289:5;7327:6;7314:20;7305:29;;7343:33;7370:5;7343:33;:::i;:::-;7243:139;;;;:::o;7388:474::-;7456:6;7464;7513:2;7501:9;7492:7;7488:23;7484:32;7481:119;;;7519:79;;:::i;:::-;7481:119;7639:1;7664:53;7709:7;7700:6;7689:9;7685:22;7664:53;:::i;:::-;7654:63;;7610:117;7766:2;7792:53;7837:7;7828:6;7817:9;7813:22;7792:53;:::i;:::-;7782:63;;7737:118;7388:474;;;;;:::o;7868:329::-;7927:6;7976:2;7964:9;7955:7;7951:23;7947:32;7944:119;;;7982:79;;:::i;:::-;7944:119;8102:1;8127:53;8172:7;8163:6;8152:9;8148:22;8127:53;:::i;:::-;8117:63;;8073:117;7868:329;;;;:::o;8203:619::-;8280:6;8288;8296;8345:2;8333:9;8324:7;8320:23;8316:32;8313:119;;;8351:79;;:::i;:::-;8313:119;8471:1;8496:53;8541:7;8532:6;8521:9;8517:22;8496:53;:::i;:::-;8486:63;;8442:117;8598:2;8624:53;8669:7;8660:6;8649:9;8645:22;8624:53;:::i;:::-;8614:63;;8569:118;8726:2;8752:53;8797:7;8788:6;8777:9;8773:22;8752:53;:::i;:::-;8742:63;;8697:118;8203:619;;;;;:::o;8828:77::-;8865:7;8894:5;8883:16;;8828:77;;;:::o;8911:118::-;8998:24;9016:5;8998:24;:::i;:::-;8993:3;8986:37;8911:118;;:::o;9035:222::-;9128:4;9166:2;9155:9;9151:18;9143:26;;9179:71;9247:1;9236:9;9232:17;9223:6;9179:71;:::i;:::-;9035:222;;;;:::o;9263:60::-;9291:3;9312:5;9305:12;;9263:60;;;:::o;9329:142::-;9379:9;9412:53;9430:34;9439:24;9457:5;9439:24;:::i;:::-;9430:34;:::i;:::-;9412:53;:::i;:::-;9399:66;;9329:142;;;:::o;9477:126::-;9527:9;9560:37;9591:5;9560:37;:::i;:::-;9547:50;;9477:126;;;:::o;9609:157::-;9690:9;9723:37;9754:5;9723:37;:::i;:::-;9710:50;;9609:157;;;:::o;9772:193::-;9890:68;9952:5;9890:68;:::i;:::-;9885:3;9878:81;9772:193;;:::o;9971:284::-;10095:4;10133:2;10122:9;10118:18;10110:26;;10146:102;10245:1;10234:9;10230:17;10221:6;10146:102;:::i;:::-;9971:284;;;;:::o;10261:122::-;10334:24;10352:5;10334:24;:::i;:::-;10327:5;10324:35;10314:63;;10373:1;10370;10363:12;10314:63;10261:122;:::o;10389:139::-;10435:5;10473:6;10460:20;10451:29;;10489:33;10516:5;10489:33;:::i;:::-;10389:139;;;;:::o;10534:329::-;10593:6;10642:2;10630:9;10621:7;10617:23;10613:32;10610:119;;;10648:79;;:::i;:::-;10610:119;10768:1;10793:53;10838:7;10829:6;10818:9;10814:22;10793:53;:::i;:::-;10783:63;;10739:117;10534:329;;;;:::o;10869:116::-;10939:21;10954:5;10939:21;:::i;:::-;10932:5;10929:32;10919:60;;10975:1;10972;10965:12;10919:60;10869:116;:::o;10991:133::-;11034:5;11072:6;11059:20;11050:29;;11088:30;11112:5;11088:30;:::i;:::-;10991:133;;;;:::o;11130:468::-;11195:6;11203;11252:2;11240:9;11231:7;11227:23;11223:32;11220:119;;;11258:79;;:::i;:::-;11220:119;11378:1;11403:53;11448:7;11439:6;11428:9;11424:22;11403:53;:::i;:::-;11393:63;;11349:117;11505:2;11531:50;11573:7;11564:6;11553:9;11549:22;11531:50;:::i;:::-;11521:60;;11476:115;11130:468;;;;;:::o;11604:307::-;11665:4;11755:18;11747:6;11744:30;11741:56;;;11777:18;;:::i;:::-;11741:56;11815:29;11837:6;11815:29;:::i;:::-;11807:37;;11899:4;11893;11889:15;11881:23;;11604:307;;;:::o;11917:423::-;11994:5;12019:65;12035:48;12076:6;12035:48;:::i;:::-;12019:65;:::i;:::-;12010:74;;12107:6;12100:5;12093:21;12145:4;12138:5;12134:16;12183:3;12174:6;12169:3;12165:16;12162:25;12159:112;;;12190:79;;:::i;:::-;12159:112;12280:54;12327:6;12322:3;12317;12280:54;:::i;:::-;12000:340;11917:423;;;;;:::o;12359:338::-;12414:5;12463:3;12456:4;12448:6;12444:17;12440:27;12430:122;;12471:79;;:::i;:::-;12430:122;12588:6;12575:20;12613:78;12687:3;12679:6;12672:4;12664:6;12660:17;12613:78;:::i;:::-;12604:87;;12420:277;12359:338;;;;:::o;12703:943::-;12798:6;12806;12814;12822;12871:3;12859:9;12850:7;12846:23;12842:33;12839:120;;;12878:79;;:::i;:::-;12839:120;12998:1;13023:53;13068:7;13059:6;13048:9;13044:22;13023:53;:::i;:::-;13013:63;;12969:117;13125:2;13151:53;13196:7;13187:6;13176:9;13172:22;13151:53;:::i;:::-;13141:63;;13096:118;13253:2;13279:53;13324:7;13315:6;13304:9;13300:22;13279:53;:::i;:::-;13269:63;;13224:118;13409:2;13398:9;13394:18;13381:32;13440:18;13432:6;13429:30;13426:117;;;13462:79;;:::i;:::-;13426:117;13567:62;13621:7;13612:6;13601:9;13597:22;13567:62;:::i;:::-;13557:72;;13352:287;12703:943;;;;;;;:::o;13652:117::-;13761:1;13758;13751:12;13775:117;13884:1;13881;13874:12;13915:568;13988:8;13998:6;14048:3;14041:4;14033:6;14029:17;14025:27;14015:122;;14056:79;;:::i;:::-;14015:122;14169:6;14156:20;14146:30;;14199:18;14191:6;14188:30;14185:117;;;14221:79;;:::i;:::-;14185:117;14335:4;14327:6;14323:17;14311:29;;14389:3;14381:4;14373:6;14369:17;14359:8;14355:32;14352:41;14349:128;;;14396:79;;:::i;:::-;14349:128;13915:568;;;;;:::o;14489:849::-;14593:6;14601;14609;14617;14666:2;14654:9;14645:7;14641:23;14637:32;14634:119;;;14672:79;;:::i;:::-;14634:119;14792:1;14817:53;14862:7;14853:6;14842:9;14838:22;14817:53;:::i;:::-;14807:63;;14763:117;14919:2;14945:53;14990:7;14981:6;14970:9;14966:22;14945:53;:::i;:::-;14935:63;;14890:118;15075:2;15064:9;15060:18;15047:32;15106:18;15098:6;15095:30;15092:117;;;15128:79;;:::i;:::-;15092:117;15241:80;15313:7;15304:6;15293:9;15289:22;15241:80;:::i;:::-;15223:98;;;;15018:313;14489:849;;;;;;;:::o;15344:474::-;15412:6;15420;15469:2;15457:9;15448:7;15444:23;15440:32;15437:119;;;15475:79;;:::i;:::-;15437:119;15595:1;15620:53;15665:7;15656:6;15645:9;15641:22;15620:53;:::i;:::-;15610:63;;15566:117;15722:2;15748:53;15793:7;15784:6;15773:9;15769:22;15748:53;:::i;:::-;15738:63;;15693:118;15344:474;;;;;:::o;15824:311::-;15901:4;15991:18;15983:6;15980:30;15977:56;;;16013:18;;:::i;:::-;15977:56;16063:4;16055:6;16051:17;16043:25;;16123:4;16117;16113:15;16105:23;;15824:311;;;:::o;16158:710::-;16254:5;16279:81;16295:64;16352:6;16295:64;:::i;:::-;16279:81;:::i;:::-;16270:90;;16380:5;16409:6;16402:5;16395:21;16443:4;16436:5;16432:16;16425:23;;16496:4;16488:6;16484:17;16476:6;16472:30;16525:3;16517:6;16514:15;16511:122;;;16544:79;;:::i;:::-;16511:122;16659:6;16642:220;16676:6;16671:3;16668:15;16642:220;;;16751:3;16780:37;16813:3;16801:10;16780:37;:::i;:::-;16775:3;16768:50;16847:4;16842:3;16838:14;16831:21;;16718:144;16702:4;16697:3;16693:14;16686:21;;16642:220;;;16646:21;16260:608;;16158:710;;;;;:::o;16891:370::-;16962:5;17011:3;17004:4;16996:6;16992:17;16988:27;16978:122;;17019:79;;:::i;:::-;16978:122;17136:6;17123:20;17161:94;17251:3;17243:6;17236:4;17228:6;17224:17;17161:94;:::i;:::-;17152:103;;16968:293;16891:370;;;;:::o;17267:684::-;17360:6;17368;17417:2;17405:9;17396:7;17392:23;17388:32;17385:119;;;17423:79;;:::i;:::-;17385:119;17571:1;17560:9;17556:17;17543:31;17601:18;17593:6;17590:30;17587:117;;;17623:79;;:::i;:::-;17587:117;17728:78;17798:7;17789:6;17778:9;17774:22;17728:78;:::i;:::-;17718:88;;17514:302;17855:2;17881:53;17926:7;17917:6;17906:9;17902:22;17881:53;:::i;:::-;17871:63;;17826:118;17267:684;;;;;:::o;17957:182::-;18097:34;18093:1;18085:6;18081:14;18074:58;17957:182;:::o;18145:366::-;18287:3;18308:67;18372:2;18367:3;18308:67;:::i;:::-;18301:74;;18384:93;18473:3;18384:93;:::i;:::-;18502:2;18497:3;18493:12;18486:19;;18145:366;;;:::o;18517:419::-;18683:4;18721:2;18710:9;18706:18;18698:26;;18770:9;18764:4;18760:20;18756:1;18745:9;18741:17;18734:47;18798:131;18924:4;18798:131;:::i;:::-;18790:139;;18517:419;;;:::o;18942:180::-;18990:77;18987:1;18980:88;19087:4;19084:1;19077:15;19111:4;19108:1;19101:15;19128:320;19172:6;19209:1;19203:4;19199:12;19189:22;;19256:1;19250:4;19246:12;19277:18;19267:81;;19333:4;19325:6;19321:17;19311:27;;19267:81;19395:2;19387:6;19384:14;19364:18;19361:38;19358:84;;19414:18;;:::i;:::-;19358:84;19179:269;19128:320;;;:::o;19454:141::-;19503:4;19526:3;19518:11;;19549:3;19546:1;19539:14;19583:4;19580:1;19570:18;19562:26;;19454:141;;;:::o;19601:93::-;19638:6;19685:2;19680;19673:5;19669:14;19665:23;19655:33;;19601:93;;;:::o;19700:107::-;19744:8;19794:5;19788:4;19784:16;19763:37;;19700:107;;;;:::o;19813:393::-;19882:6;19932:1;19920:10;19916:18;19955:97;19985:66;19974:9;19955:97;:::i;:::-;20073:39;20103:8;20092:9;20073:39;:::i;:::-;20061:51;;20145:4;20141:9;20134:5;20130:21;20121:30;;20194:4;20184:8;20180:19;20173:5;20170:30;20160:40;;19889:317;;19813:393;;;;;:::o;20212:142::-;20262:9;20295:53;20313:34;20322:24;20340:5;20322:24;:::i;:::-;20313:34;:::i;:::-;20295:53;:::i;:::-;20282:66;;20212:142;;;:::o;20360:75::-;20403:3;20424:5;20417:12;;20360:75;;;:::o;20441:269::-;20551:39;20582:7;20551:39;:::i;:::-;20612:91;20661:41;20685:16;20661:41;:::i;:::-;20653:6;20646:4;20640:11;20612:91;:::i;:::-;20606:4;20599:105;20517:193;20441:269;;;:::o;20716:73::-;20761:3;20716:73;:::o;20795:189::-;20872:32;;:::i;:::-;20913:65;20971:6;20963;20957:4;20913:65;:::i;:::-;20848:136;20795:189;;:::o;20990:186::-;21050:120;21067:3;21060:5;21057:14;21050:120;;;21121:39;21158:1;21151:5;21121:39;:::i;:::-;21094:1;21087:5;21083:13;21074:22;;21050:120;;;20990:186;;:::o;21182:543::-;21283:2;21278:3;21275:11;21272:446;;;21317:38;21349:5;21317:38;:::i;:::-;21401:29;21419:10;21401:29;:::i;:::-;21391:8;21387:44;21584:2;21572:10;21569:18;21566:49;;;21605:8;21590:23;;21566:49;21628:80;21684:22;21702:3;21684:22;:::i;:::-;21674:8;21670:37;21657:11;21628:80;:::i;:::-;21287:431;;21272:446;21182:543;;;:::o;21731:117::-;21785:8;21835:5;21829:4;21825:16;21804:37;;21731:117;;;;:::o;21854:169::-;21898:6;21931:51;21979:1;21975:6;21967:5;21964:1;21960:13;21931:51;:::i;:::-;21927:56;22012:4;22006;22002:15;21992:25;;21905:118;21854:169;;;;:::o;22028:295::-;22104:4;22250:29;22275:3;22269:4;22250:29;:::i;:::-;22242:37;;22312:3;22309:1;22305:11;22299:4;22296:21;22288:29;;22028:295;;;;:::o;22328:1395::-;22445:37;22478:3;22445:37;:::i;:::-;22547:18;22539:6;22536:30;22533:56;;;22569:18;;:::i;:::-;22533:56;22613:38;22645:4;22639:11;22613:38;:::i;:::-;22698:67;22758:6;22750;22744:4;22698:67;:::i;:::-;22792:1;22816:4;22803:17;;22848:2;22840:6;22837:14;22865:1;22860:618;;;;23522:1;23539:6;23536:77;;;23588:9;23583:3;23579:19;23573:26;23564:35;;23536:77;23639:67;23699:6;23692:5;23639:67;:::i;:::-;23633:4;23626:81;23495:222;22830:887;;22860:618;22912:4;22908:9;22900:6;22896:22;22946:37;22978:4;22946:37;:::i;:::-;23005:1;23019:208;23033:7;23030:1;23027:14;23019:208;;;23112:9;23107:3;23103:19;23097:26;23089:6;23082:42;23163:1;23155:6;23151:14;23141:24;;23210:2;23199:9;23195:18;23182:31;;23056:4;23053:1;23049:12;23044:17;;23019:208;;;23255:6;23246:7;23243:19;23240:179;;;23313:9;23308:3;23304:19;23298:26;23356:48;23398:4;23390:6;23386:17;23375:9;23356:48;:::i;:::-;23348:6;23341:64;23263:156;23240:179;23465:1;23461;23453:6;23449:14;23445:22;23439:4;23432:36;22867:611;;;22830:887;;22420:1303;;;22328:1395;;:::o;23729:180::-;23777:77;23774:1;23767:88;23874:4;23871:1;23864:15;23898:4;23895:1;23888:15;23915:158;24055:10;24051:1;24043:6;24039:14;24032:34;23915:158;:::o;24079:365::-;24221:3;24242:66;24306:1;24301:3;24242:66;:::i;:::-;24235:73;;24317:93;24406:3;24317:93;:::i;:::-;24435:2;24430:3;24426:12;24419:19;;24079:365;;;:::o;24450:419::-;24616:4;24654:2;24643:9;24639:18;24631:26;;24703:9;24697:4;24693:20;24689:1;24678:9;24674:17;24667:47;24731:131;24857:4;24731:131;:::i;:::-;24723:139;;24450:419;;;:::o;24875:180::-;24923:77;24920:1;24913:88;25020:4;25017:1;25010:15;25044:4;25041:1;25034:15;25061:191;25101:3;25120:20;25138:1;25120:20;:::i;:::-;25115:25;;25154:20;25172:1;25154:20;:::i;:::-;25149:25;;25197:1;25194;25190:9;25183:16;;25218:3;25215:1;25212:10;25209:36;;;25225:18;;:::i;:::-;25209:36;25061:191;;;;:::o;25258:160::-;25398:12;25394:1;25386:6;25382:14;25375:36;25258:160;:::o;25424:366::-;25566:3;25587:67;25651:2;25646:3;25587:67;:::i;:::-;25580:74;;25663:93;25752:3;25663:93;:::i;:::-;25781:2;25776:3;25772:12;25765:19;;25424:366;;;:::o;25796:419::-;25962:4;26000:2;25989:9;25985:18;25977:26;;26049:9;26043:4;26039:20;26035:1;26024:9;26020:17;26013:47;26077:131;26203:4;26077:131;:::i;:::-;26069:139;;25796:419;;;:::o;26221:158::-;26361:10;26357:1;26349:6;26345:14;26338:34;26221:158;:::o;26385:365::-;26527:3;26548:66;26612:1;26607:3;26548:66;:::i;:::-;26541:73;;26623:93;26712:3;26623:93;:::i;:::-;26741:2;26736:3;26732:12;26725:19;;26385:365;;;:::o;26756:419::-;26922:4;26960:2;26949:9;26945:18;26937:26;;27009:9;27003:4;26999:20;26995:1;26984:9;26980:17;26973:47;27037:131;27163:4;27037:131;:::i;:::-;27029:139;;26756:419;;;:::o;27181:410::-;27221:7;27244:20;27262:1;27244:20;:::i;:::-;27239:25;;27278:20;27296:1;27278:20;:::i;:::-;27273:25;;27333:1;27330;27326:9;27355:30;27373:11;27355:30;:::i;:::-;27344:41;;27534:1;27525:7;27521:15;27518:1;27515:22;27495:1;27488:9;27468:83;27445:139;;27564:18;;:::i;:::-;27445:139;27229:362;27181:410;;;;:::o;27597:163::-;27737:15;27733:1;27725:6;27721:14;27714:39;27597:163;:::o;27766:366::-;27908:3;27929:67;27993:2;27988:3;27929:67;:::i;:::-;27922:74;;28005:93;28094:3;28005:93;:::i;:::-;28123:2;28118:3;28114:12;28107:19;;27766:366;;;:::o;28138:419::-;28304:4;28342:2;28331:9;28327:18;28319:26;;28391:9;28385:4;28381:20;28377:1;28366:9;28362:17;28355:47;28419:131;28545:4;28419:131;:::i;:::-;28411:139;;28138:419;;;:::o;28563:94::-;28596:8;28644:5;28640:2;28636:14;28615:35;;28563:94;;;:::o;28663:::-;28702:7;28731:20;28745:5;28731:20;:::i;:::-;28720:31;;28663:94;;;:::o;28763:100::-;28802:7;28831:26;28851:5;28831:26;:::i;:::-;28820:37;;28763:100;;;:::o;28869:157::-;28974:45;28994:24;29012:5;28994:24;:::i;:::-;28974:45;:::i;:::-;28969:3;28962:58;28869:157;;:::o;29032:79::-;29071:7;29100:5;29089:16;;29032:79;;;:::o;29117:157::-;29222:45;29242:24;29260:5;29242:24;:::i;:::-;29222:45;:::i;:::-;29217:3;29210:58;29117:157;;:::o;29280:397::-;29420:3;29435:75;29506:3;29497:6;29435:75;:::i;:::-;29535:2;29530:3;29526:12;29519:19;;29548:75;29619:3;29610:6;29548:75;:::i;:::-;29648:2;29643:3;29639:12;29632:19;;29668:3;29661:10;;29280:397;;;;;:::o;29683:171::-;29823:23;29819:1;29811:6;29807:14;29800:47;29683:171;:::o;29860:366::-;30002:3;30023:67;30087:2;30082:3;30023:67;:::i;:::-;30016:74;;30099:93;30188:3;30099:93;:::i;:::-;30217:2;30212:3;30208:12;30201:19;;29860:366;;;:::o;30232:419::-;30398:4;30436:2;30425:9;30421:18;30413:26;;30485:9;30479:4;30475:20;30471:1;30460:9;30456:17;30449:47;30513:131;30639:4;30513:131;:::i;:::-;30505:139;;30232:419;;;:::o;30657:162::-;30797:14;30793:1;30785:6;30781:14;30774:38;30657:162;:::o;30825:366::-;30967:3;30988:67;31052:2;31047:3;30988:67;:::i;:::-;30981:74;;31064:93;31153:3;31064:93;:::i;:::-;31182:2;31177:3;31173:12;31166:19;;30825:366;;;:::o;31197:419::-;31363:4;31401:2;31390:9;31386:18;31378:26;;31450:9;31444:4;31440:20;31436:1;31425:9;31421:17;31414:47;31478:131;31604:4;31478:131;:::i;:::-;31470:139;;31197:419;;;:::o;31622:148::-;31724:11;31761:3;31746:18;;31622:148;;;;:::o;31776:390::-;31882:3;31910:39;31943:5;31910:39;:::i;:::-;31965:89;32047:6;32042:3;31965:89;:::i;:::-;31958:96;;32063:65;32121:6;32116:3;32109:4;32102:5;32098:16;32063:65;:::i;:::-;32153:6;32148:3;32144:16;32137:23;;31886:280;31776:390;;;;:::o;32172:435::-;32352:3;32374:95;32465:3;32456:6;32374:95;:::i;:::-;32367:102;;32486:95;32577:3;32568:6;32486:95;:::i;:::-;32479:102;;32598:3;32591:10;;32172:435;;;;;:::o;32613:164::-;32753:16;32749:1;32741:6;32737:14;32730:40;32613:164;:::o;32783:366::-;32925:3;32946:67;33010:2;33005:3;32946:67;:::i;:::-;32939:74;;33022:93;33111:3;33022:93;:::i;:::-;33140:2;33135:3;33131:12;33124:19;;32783:366;;;:::o;33155:419::-;33321:4;33359:2;33348:9;33344:18;33336:26;;33408:9;33402:4;33398:20;33394:1;33383:9;33379:17;33372:47;33436:131;33562:4;33436:131;:::i;:::-;33428:139;;33155:419;;;:::o;33580:180::-;33628:77;33625:1;33618:88;33725:4;33722:1;33715:15;33749:4;33746:1;33739:15;33766:233;33805:3;33828:24;33846:5;33828:24;:::i;:::-;33819:33;;33874:66;33867:5;33864:77;33861:103;;33944:18;;:::i;:::-;33861:103;33991:1;33984:5;33980:13;33973:20;;33766:233;;;:::o;34005:225::-;34145:34;34141:1;34133:6;34129:14;34122:58;34214:8;34209:2;34201:6;34197:15;34190:33;34005:225;:::o;34236:366::-;34378:3;34399:67;34463:2;34458:3;34399:67;:::i;:::-;34392:74;;34475:93;34564:3;34475:93;:::i;:::-;34593:2;34588:3;34584:12;34577:19;;34236:366;;;:::o;34608:419::-;34774:4;34812:2;34801:9;34797:18;34789:26;;34861:9;34855:4;34851:20;34847:1;34836:9;34832:17;34825:47;34889:131;35015:4;34889:131;:::i;:::-;34881:139;;34608:419;;;:::o;35033:332::-;35154:4;35192:2;35181:9;35177:18;35169:26;;35205:71;35273:1;35262:9;35258:17;35249:6;35205:71;:::i;:::-;35286:72;35354:2;35343:9;35339:18;35330:6;35286:72;:::i;:::-;35033:332;;;;;:::o;35371:137::-;35425:5;35456:6;35450:13;35441:22;;35472:30;35496:5;35472:30;:::i;:::-;35371:137;;;;:::o;35514:345::-;35581:6;35630:2;35618:9;35609:7;35605:23;35601:32;35598:119;;;35636:79;;:::i;:::-;35598:119;35756:1;35781:61;35834:7;35825:6;35814:9;35810:22;35781:61;:::i;:::-;35771:71;;35727:125;35514:345;;;;:::o;35865:98::-;35916:6;35950:5;35944:12;35934:22;;35865:98;;;:::o;35969:168::-;36052:11;36086:6;36081:3;36074:19;36126:4;36121:3;36117:14;36102:29;;35969:168;;;;:::o;36143:373::-;36229:3;36257:38;36289:5;36257:38;:::i;:::-;36311:70;36374:6;36369:3;36311:70;:::i;:::-;36304:77;;36390:65;36448:6;36443:3;36436:4;36429:5;36425:16;36390:65;:::i;:::-;36480:29;36502:6;36480:29;:::i;:::-;36475:3;36471:39;36464:46;;36233:283;36143:373;;;;:::o;36522:640::-;36717:4;36755:3;36744:9;36740:19;36732:27;;36769:71;36837:1;36826:9;36822:17;36813:6;36769:71;:::i;:::-;36850:72;36918:2;36907:9;36903:18;36894:6;36850:72;:::i;:::-;36932;37000:2;36989:9;36985:18;36976:6;36932:72;:::i;:::-;37051:9;37045:4;37041:20;37036:2;37025:9;37021:18;37014:48;37079:76;37150:4;37141:6;37079:76;:::i;:::-;37071:84;;36522:640;;;;;;;:::o;37168:141::-;37224:5;37255:6;37249:13;37240:22;;37271:32;37297:5;37271:32;:::i;:::-;37168:141;;;;:::o;37315:349::-;37384:6;37433:2;37421:9;37412:7;37408:23;37404:32;37401:119;;;37439:79;;:::i;:::-;37401:119;37559:1;37584:63;37639:7;37630:6;37619:9;37615:22;37584:63;:::i;:::-;37574:73;;37530:127;37315:349;;;;:::o

Swarm Source

ipfs://1e39997e7e76ee19c1e01d0098c1f795ef24057741ee11f7cb8b661002c0be69
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.