ETH Price: $2,512.89 (+1.63%)

Token

Blocks (BBH)
 

Overview

Max Total Supply

124 BBH

Holders

73

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
whattothink.eth
Balance
1 BBH
0x43c9aad773daed9719cda78645887e7661e9e264
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:
Blocks

Compiler Version
v0.8.13+commit.abaa5c0e

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-09
*/

// File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 *
 * [WARNING]
 * ====
 * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
 * unusable.
 * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
 *
 * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
 * array of EnumerableSet.
 * ====
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        bytes32[] memory store = _values(set._inner);
        bytes32[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}

// File: contracts/IOperatorFilterRegistry.sol


pragma solidity ^0.8.13;


interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}
// File: contracts/OperatorFilterer.sol


pragma solidity ^0.8.13;


contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    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(operatorFilterRegistry).code.length > 0) {
            if (subscribe) {
                operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    operatorFilterRegistry.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator() virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(operatorFilterRegistry).code.length > 0) {
            if (!operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }
}
// File: contracts/DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;


contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}
// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.0 (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/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.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 `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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


// OpenZeppelin Contracts v4.4.0 (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.0 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

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


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

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.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 tokenId);

    /**
     * @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.0 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts v4.4.0 (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.0 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev 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/security/Pausable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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


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

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

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

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

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

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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


// OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        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 = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

        _balances[to] += 1;
        _owners[tokenId] = to;

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

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


// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;



/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
        _burn(tokenId);
    }
}

// File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol


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

pragma solidity ^0.8.0;




/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File: contracts/BlocksNew.sol


pragma solidity 0.8.13;

// ██████╗░██╗░░░░░░█████╗░░█████╗░██╗░░██╗░██████╗
// ██╔══██╗██║░░░░░██╔══██╗██╔══██╗██║░██╔╝██╔════╝
// ██████╦╝██║░░░░░██║░░██║██║░░╚═╝█████═╝░╚█████╗░
// ██╔══██╗██║░░░░░██║░░██║██║░░██╗██╔═██╗░░╚═══██╗
// ██████╦╝███████╗╚█████╔╝╚█████╔╝██║░╚██╗██████╔╝
// ╚═════╝░╚══════╝░╚════╝░░╚════╝░╚═╝░░╚═╝╚═════╝░








contract Blocks is ERC721Enumerable, Ownable, DefaultOperatorFilterer {
    using SafeERC20 for IERC20;


    string private _tokenBaseURI;

    uint256 public constant MAX_Supply = 125;
    uint256 private scopeIndex = 0;
    uint256 public price = 27000000000000000; // 0.027 Eth
    uint256 public reservedTokens = 0; // reserve tokens go here
    uint256 public mintedPresaleTokens = 0;
    bool public flagreserve = false;

    bool public hasSaleStarted = false;
    bool public hasPresaleStarted = false;

    mapping(uint256 => uint256) swappedIDs;
    
    mapping(address => uint256) userCredit;
   
   // Whitelisting
    
    mapping(address => bool) private _allowList;
    mapping(address => uint256) private _allowListClaimed;


    event MetadataHashSet(bytes32 metadataHash);
    

    constructor() ERC721("Blocks","BBH")  {
    }

    //   WHITELIST FNS
    
    function addToAllowList(address[] calldata addresses) external  onlyOwner {
      for (uint256 i = 0; i < addresses.length; i++) {
      require(addresses[i] != address(0), "Can't add the null address");

      _allowList[addresses[i]] = true;
      /**
      * @dev We don't want to reset _allowListClaimed count
      * if we try to add someone more than once.
      */
      _allowListClaimed[addresses[i]] > 0 ? _allowListClaimed[addresses[i]] : 0;
    }
  }

  function onAllowList(address addr) external view  returns (bool) {
    return _allowList[addr];
  }

  function removeFromAllowList(address[] calldata addresses) external  onlyOwner {
    for (uint256 i = 0; i < addresses.length; i++) {
      require(addresses[i] != address(0), "Can't add the null address");

      /// @dev We don't want to reset possible _allowListClaimed numbers.
      _allowList[addresses[i]] = false;
    }
  }

  /**
  * @dev We want to be able to distinguish tokens bought during isAllowListActive
  * and tokens bought outside of isAllowListActive
  */
  function allowListClaimedBy(address owner) external view  returns (uint256){
    require(owner != address(0), 'Zero address not on Allow List');

    return _allowListClaimed[owner];
  }



    function genID() private returns(uint256) {
        uint256 scope = MAX_Supply-scopeIndex;
        uint256 swap;
        uint256 result;

        uint256 i = randomNumber() % scope;

        //Setup the value to swap in for the selected ID
        if (swappedIDs[scope-1] == 0){
            swap = scope-1;
        } else {
            swap = swappedIDs[scope-1];
        }

        //Select a random ID, swap it out with an unselected one then shorten the selection range by 1
        if (swappedIDs[i] == 0){
            result = i;
            swappedIDs[i] = swap;
        } else {
            result = swappedIDs[i];
            swappedIDs[i] = swap;
        }
        return result+1;
    }

    
    function randomNumber() private view returns(uint256){
        return uint256(keccak256(abi.encodePacked(block.difficulty, block.timestamp)));
    }

    function mint() public payable  {
        require(hasSaleStarted == true, "Sale hasn't started");
        require(totalSupply() + 1 < MAX_Supply, "Exceeds MAX_Supply");
        require(price <= msg.value, "Ether value sent is not correct");
        
        
        _safeMint(msg.sender, genID());
        scopeIndex++;
    }
    
    // whitelist Mint function
    
    function mintWhitelist() public payable {
        require(hasPresaleStarted == true, "Presale hasn't started");
         require(totalSupply() + 1 < MAX_Supply, "Exceeds MAX_Supply");
        require(price <= msg.value, "Ether value sent is not correct");
        require(_allowList[msg.sender], 'You are not on the White List');
        //require(mintedPresaleTokens + numberOfTokens <= 4000, 'Total Purchase exceeds max allowed');
        
        _allowListClaimed[msg.sender] += 1;
        _safeMint(msg.sender, genID());
        scopeIndex++;
        mintedPresaleTokens++;
    }
    
    // Mint Reserved tokens
    
    function mintReservedTokens(address user) external  onlyOwner  {
      
        require(flagreserve == false, 'Reserved Allocated tokens');
        
        for (uint i = 0; i < 5; i++) {
            _safeMint(user, genID());
            scopeIndex++;
           
        }
        flagreserve =true;
    }
    
    function getScopeIndex() public view returns(uint256) {
        return scopeIndex;
    }
    
    function mintCredit() public {
        require(hasSaleStarted == true, "Sale hasn't started");
        require(totalSupply() + 1 <= MAX_Supply, "Exceeds MAX_Supply");
        require(userCredit[msg.sender] >= 1, "No Credits");

        _safeMint(msg.sender, genID());
        scopeIndex++;
        userCredit[msg.sender] -= 1;
    }

    function balanceOfCredit(address owner) public view virtual returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return userCredit[owner];
    }

  // A withdraw function to avoid locking ERC20 tokens in the contract forever.
  // Tokens can only be withdrawn by the owner, to the owner.
  function transferERC20Token(IERC20 token, uint256 amount) external onlyOwner {
    token.safeTransfer(owner(), amount);
  }

 

  function setTokenBaseURI(string calldata tokenBaseURI_) external onlyOwner {
    _tokenBaseURI = tokenBaseURI_;
  }

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


    function startSale() public onlyOwner {
        hasSaleStarted = true;
    }
    
    function pauseSale() public onlyOwner {
        hasSaleStarted = false;
    }
    
    function startPresale() public onlyOwner {
        hasPresaleStarted = true;
    }
    
    function pausePresale() public onlyOwner {
        hasPresaleStarted = false;
    }

    function withdrawAll() public onlyOwner {
        address payable owner_add = payable( msg.sender);
        owner_add.transfer(address(this).balance);
    }

    function addCredit(address owner, uint256 credits) public onlyOwner {
        userCredit[owner] += credits;
    }




  function _beforeTokenTransfer(
    address from,
    address to,
    uint256 tokenId
  ) internal override(ERC721Enumerable) {
    super._beforeTokenTransfer(from, to, tokenId);
  }

    function tokensOfOwner(address _owner) external view returns(uint256[] memory ) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }

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

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

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        override(ERC721,IERC721 )
        onlyAllowedOperator
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }



}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":false,"internalType":"bytes32","name":"metadataHash","type":"bytes32"}],"name":"MetadataHashSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_Supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"credits","type":"uint256"}],"name":"addCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"allowListClaimedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOfCredit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flagreserve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getScopeIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasPresaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"mintReservedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintedPresaleTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"onAllowList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"pausePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"removeFromAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedTokens","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenBaseURI_","type":"string"}],"name":"setTokenBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","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":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferERC20Token","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":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600c55665fec5b60ef8000600d556000600e556000600f556000601060006101000a81548160ff0219169083151502179055506000601060016101000a81548160ff0219169083151502179055506000601060026101000a81548160ff0219169083151502179055503480156200007c57600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600681526020017f426c6f636b7300000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f42424800000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001189291906200041f565b508060019080519060200190620001319291906200041f565b50505062000154620001486200035160201b60201c565b6200035960201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003495780156200020f576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620001d592919062000514565b600060405180830381600087803b158015620001f057600080fd5b505af115801562000205573d6000803e3d6000fd5b5050505062000348565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620002c9576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200028f92919062000514565b600060405180830381600087803b158015620002aa57600080fd5b505af1158015620002bf573d6000803e3d6000fd5b5050505062000347565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000312919062000541565b600060405180830381600087803b1580156200032d57600080fd5b505af115801562000342573d6000803e3d6000fd5b505050505b5b5b5050620005c2565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200042d906200058d565b90600052602060002090601f0160209004810192826200045157600085556200049d565b82601f106200046c57805160ff19168380011785556200049d565b828001600101855582156200049d579182015b828111156200049c5782518255916020019190600101906200047f565b5b509050620004ac9190620004b0565b5090565b5b80821115620004cb576000816000905550600101620004b1565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620004fc82620004cf565b9050919050565b6200050e81620004ef565b82525050565b60006040820190506200052b600083018562000503565b6200053a602083018462000503565b9392505050565b600060208201905062000558600083018462000503565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620005a657607f821691505b602082108103620005bc57620005bb6200055e565b5b50919050565b615d0f80620005d26000396000f3fe6080604052600436106102715760003560e01c80634f6ccce71161014f57806395d89b41116100c1578063b88d4fde1161007a578063b88d4fde146108eb578063bcba693914610914578063c87b56dd1461093d578063e985e9c51461097a578063f2fde38b146109b7578063f3234a67146109e057610271565b806395d89b4114610801578063a035b1fe1461082c578063a22cb46514610857578063a51312c814610880578063b0220015146108a9578063b66a0e5d146108d457610271565b80637263cfe2116101135780637263cfe2146107075780637d27d66c146107305780638462151c14610759578063853828b6146107965780638da5cb5b146107ad5780638ef79e91146107d857610271565b80634f6ccce71461062257806355367ba91461065f5780636352211e1461067657806370a08231146106b3578063715018a6146106f057610271565b806315a55347116101e85780632d3df31f116101ac5780632d3df31f1461051f5780632f745c59146105295780633a065892146105665780634034968f146105a357806342842e0e146105ce5780634f30c879146105f757610271565b806315a553471461044c57806318160ddd146104775780631c8b232d146104a257806323b872dd146104cd57806327af0503146104f657610271565b8063081812fc1161023a578063081812fc14610349578063095ea7b3146103865780630a00918d146103af5780630b191314146103da5780631249c58b1461040557806314a1fc351461040f57610271565b806208ffdd1461027657806301ffc9a7146102b357806304c98b2b146102f057806306fdde0314610307578063070f5c0914610332575b600080fd5b34801561028257600080fd5b5061029d6004803603810190610298919061410b565b6109f7565b6040516102aa9190614151565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d591906141c4565b610aae565b6040516102e7919061420c565b60405180910390f35b3480156102fc57600080fd5b50610305610b28565b005b34801561031357600080fd5b5061031c610bc1565b60405161032991906142c0565b60405180910390f35b34801561033e57600080fd5b50610347610c53565b005b34801561035557600080fd5b50610370600480360381019061036b919061430e565b610cec565b60405161037d919061434a565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a89190614365565b610d71565b005b3480156103bb57600080fd5b506103c4610e88565b6040516103d19190614151565b60405180910390f35b3480156103e657600080fd5b506103ef610e8e565b6040516103fc9190614151565b60405180910390f35b61040d610e93565b005b34801561041b57600080fd5b506104366004803603810190610431919061410b565b610faf565b6040516104439190614151565b60405180910390f35b34801561045857600080fd5b50610461611066565b60405161046e9190614151565b60405180910390f35b34801561048357600080fd5b5061048c61106c565b6040516104999190614151565b60405180910390f35b3480156104ae57600080fd5b506104b7611079565b6040516104c4919061420c565b60405180910390f35b3480156104d957600080fd5b506104f460048036038101906104ef91906143a5565b61108c565b005b34801561050257600080fd5b5061051d6004803603810190610518919061410b565b611198565b005b6105276112d1565b005b34801561053557600080fd5b50610550600480360381019061054b9190614365565b6114e8565b60405161055d9190614151565b60405180910390f35b34801561057257600080fd5b5061058d6004803603810190610588919061410b565b61158d565b60405161059a919061420c565b60405180910390f35b3480156105af57600080fd5b506105b86115e3565b6040516105c59190614151565b60405180910390f35b3480156105da57600080fd5b506105f560048036038101906105f091906143a5565b6115ed565b005b34801561060357600080fd5b5061060c6116f9565b604051610619919061420c565b60405180910390f35b34801561062e57600080fd5b506106496004803603810190610644919061430e565b61170c565b6040516106569190614151565b60405180910390f35b34801561066b57600080fd5b5061067461177d565b005b34801561068257600080fd5b5061069d6004803603810190610698919061430e565b611816565b6040516106aa919061434a565b60405180910390f35b3480156106bf57600080fd5b506106da60048036038101906106d5919061410b565b6118c7565b6040516106e79190614151565b60405180910390f35b3480156106fc57600080fd5b5061070561197e565b005b34801561071357600080fd5b5061072e6004803603810190610729919061445d565b611a06565b005b34801561073c57600080fd5b5061075760048036038101906107529190614365565b611c9b565b005b34801561076557600080fd5b50610780600480360381019061077b919061410b565b611d71565b60405161078d9190614568565b60405180910390f35b3480156107a257600080fd5b506107ab611e7a565b005b3480156107b957600080fd5b506107c2611f45565b6040516107cf919061434a565b60405180910390f35b3480156107e457600080fd5b506107ff60048036038101906107fa91906145e0565b611f6f565b005b34801561080d57600080fd5b50610816612001565b60405161082391906142c0565b60405180910390f35b34801561083857600080fd5b50610841612093565b60405161084e9190614151565b60405180910390f35b34801561086357600080fd5b5061087e60048036038101906108799190614659565b612099565b005b34801561088c57600080fd5b506108a760048036038101906108a2919061445d565b6120af565b005b3480156108b557600080fd5b506108be612266565b6040516108cb919061420c565b60405180910390f35b3480156108e057600080fd5b506108e9612279565b005b3480156108f757600080fd5b50610912600480360381019061090d91906147c9565b612312565b005b34801561092057600080fd5b5061093b6004803603810190610936919061488a565b612420565b005b34801561094957600080fd5b50610964600480360381019061095f919061430e565b6124d2565b60405161097191906142c0565b60405180910390f35b34801561098657600080fd5b506109a1600480360381019061099c91906148ca565b612579565b6040516109ae919061420c565b60405180910390f35b3480156109c357600080fd5b506109de60048036038101906109d9919061410b565b61260d565b005b3480156109ec57600080fd5b506109f5612704565b005b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5e90614956565b60405180910390fd5b601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b215750610b20826128b6565b5b9050919050565b610b30612998565b73ffffffffffffffffffffffffffffffffffffffff16610b4e611f45565b73ffffffffffffffffffffffffffffffffffffffff1614610ba4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9b906149c2565b60405180910390fd5b6001601060026101000a81548160ff021916908315150217905550565b606060008054610bd090614a11565b80601f0160208091040260200160405190810160405280929190818152602001828054610bfc90614a11565b8015610c495780601f10610c1e57610100808354040283529160200191610c49565b820191906000526020600020905b815481529060010190602001808311610c2c57829003601f168201915b5050505050905090565b610c5b612998565b73ffffffffffffffffffffffffffffffffffffffff16610c79611f45565b73ffffffffffffffffffffffffffffffffffffffff1614610ccf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc6906149c2565b60405180910390fd5b6000601060026101000a81548160ff021916908315150217905550565b6000610cf7826129a0565b610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614ab4565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d7c82611816565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de390614b46565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e0b612998565b73ffffffffffffffffffffffffffffffffffffffff161480610e3a5750610e3981610e34612998565b612579565b5b610e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7090614bd8565b60405180910390fd5b610e838383612a0c565b505050565b600f5481565b607d81565b60011515601060019054906101000a900460ff16151514610ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee090614c44565b60405180910390fd5b607d6001610ef561106c565b610eff9190614c93565b10610f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3690614d35565b60405180910390fd5b34600d541115610f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7b90614da1565b60405180910390fd5b610f9533610f90612ac5565b612bd1565b600c6000815480929190610fa890614dc1565b9190505550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361101f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101690614e7b565b60405180910390fd5b601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600e5481565b6000600880549050905090565b601060019054906101000a900460ff1681565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611188576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611103929190614e9b565b6020604051808303816000875af1158015611122573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111469190614ed9565b61118757336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161117e919061434a565b60405180910390fd5b5b611193838383612bef565b505050565b6111a0612998565b73ffffffffffffffffffffffffffffffffffffffff166111be611f45565b73ffffffffffffffffffffffffffffffffffffffff1614611214576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120b906149c2565b60405180910390fd5b60001515601060009054906101000a900460ff1615151461126a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126190614f52565b60405180910390fd5b60005b60058110156112b25761128782611282612ac5565b612bd1565b600c600081548092919061129a90614dc1565b919050555080806112aa90614dc1565b91505061126d565b506001601060006101000a81548160ff02191690831515021790555050565b60011515601060029054906101000a900460ff16151514611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131e90614fbe565b60405180910390fd5b607d600161133361106c565b61133d9190614c93565b1061137d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137490614d35565b60405180910390fd5b34600d5411156113c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b990614da1565b60405180910390fd5b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661144e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114459061502a565b60405180910390fd5b6001601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461149e9190614c93565b925050819055506114b6336114b1612ac5565b612bd1565b600c60008154809291906114c990614dc1565b9190505550600f60008154809291906114e190614dc1565b9190505550565b60006114f3836118c7565b8210611534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152b906150bc565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600c54905090565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156116e9576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611664929190614e9b565b6020604051808303816000875af1158015611683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a79190614ed9565b6116e857336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016116df919061434a565b60405180910390fd5b5b6116f4838383612c4f565b505050565b601060009054906101000a900460ff1681565b600061171661106c565b8210611757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174e9061514e565b60405180910390fd5b6008828154811061176b5761176a61516e565b5b90600052602060002001549050919050565b611785612998565b73ffffffffffffffffffffffffffffffffffffffff166117a3611f45565b73ffffffffffffffffffffffffffffffffffffffff16146117f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f0906149c2565b60405180910390fd5b6000601060016101000a81548160ff021916908315150217905550565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b59061520f565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192e90614e7b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611986612998565b73ffffffffffffffffffffffffffffffffffffffff166119a4611f45565b73ffffffffffffffffffffffffffffffffffffffff16146119fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f1906149c2565b60405180910390fd5b611a046000612c6f565b565b611a0e612998565b73ffffffffffffffffffffffffffffffffffffffff16611a2c611f45565b73ffffffffffffffffffffffffffffffffffffffff1614611a82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a79906149c2565b60405180910390fd5b60005b82829050811015611c9657600073ffffffffffffffffffffffffffffffffffffffff16838383818110611abb57611aba61516e565b5b9050602002016020810190611ad0919061410b565b73ffffffffffffffffffffffffffffffffffffffff1603611b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1d9061527b565b60405180910390fd5b600160136000858585818110611b3f57611b3e61516e565b5b9050602002016020810190611b54919061410b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600060146000858585818110611bbe57611bbd61516e565b5b9050602002016020810190611bd3919061410b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611c1a576000611c82565b60146000848484818110611c3157611c3061516e565b5b9050602002016020810190611c46919061410b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020545b508080611c8e90614dc1565b915050611a85565b505050565b611ca3612998565b73ffffffffffffffffffffffffffffffffffffffff16611cc1611f45565b73ffffffffffffffffffffffffffffffffffffffff1614611d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0e906149c2565b60405180910390fd5b80601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d669190614c93565b925050819055505050565b60606000611d7e836118c7565b905060008103611dda57600067ffffffffffffffff811115611da357611da261469e565b5b604051908082528060200260200182016040528015611dd15781602001602082028036833780820191505090505b50915050611e75565b60008167ffffffffffffffff811115611df657611df561469e565b5b604051908082528060200260200182016040528015611e245781602001602082028036833780820191505090505b50905060005b82811015611e6e57611e3c85826114e8565b828281518110611e4f57611e4e61516e565b5b6020026020010181815250508080611e6690614dc1565b915050611e2a565b8193505050505b919050565b611e82612998565b73ffffffffffffffffffffffffffffffffffffffff16611ea0611f45565b73ffffffffffffffffffffffffffffffffffffffff1614611ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eed906149c2565b60405180910390fd5b60003390508073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611f41573d6000803e3d6000fd5b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611f77612998565b73ffffffffffffffffffffffffffffffffffffffff16611f95611f45565b73ffffffffffffffffffffffffffffffffffffffff1614611feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe2906149c2565b60405180910390fd5b8181600b9190611ffc929190613ff6565b505050565b60606001805461201090614a11565b80601f016020809104026020016040519081016040528092919081815260200182805461203c90614a11565b80156120895780601f1061205e57610100808354040283529160200191612089565b820191906000526020600020905b81548152906001019060200180831161206c57829003601f168201915b5050505050905090565b600d5481565b6120ab6120a4612998565b8383612d35565b5050565b6120b7612998565b73ffffffffffffffffffffffffffffffffffffffff166120d5611f45565b73ffffffffffffffffffffffffffffffffffffffff161461212b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612122906149c2565b60405180910390fd5b60005b8282905081101561226157600073ffffffffffffffffffffffffffffffffffffffff168383838181106121645761216361516e565b5b9050602002016020810190612179919061410b565b73ffffffffffffffffffffffffffffffffffffffff16036121cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c69061527b565b60405180910390fd5b6000601360008585858181106121e8576121e761516e565b5b90506020020160208101906121fd919061410b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061225990614dc1565b91505061212e565b505050565b601060029054906101000a900460ff1681565b612281612998565b73ffffffffffffffffffffffffffffffffffffffff1661229f611f45565b73ffffffffffffffffffffffffffffffffffffffff16146122f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ec906149c2565b60405180910390fd5b6001601060016101000a81548160ff021916908315150217905550565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561240e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401612389929190614e9b565b6020604051808303816000875af11580156123a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123cc9190614ed9565b61240d57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401612404919061434a565b60405180910390fd5b5b61241a84848484612ea1565b50505050565b612428612998565b73ffffffffffffffffffffffffffffffffffffffff16612446611f45565b73ffffffffffffffffffffffffffffffffffffffff161461249c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612493906149c2565b60405180910390fd5b6124ce6124a7611f45565b828473ffffffffffffffffffffffffffffffffffffffff16612f039092919063ffffffff16565b5050565b60606124dd826129a0565b61251c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125139061530d565b60405180910390fd5b6000612526612f89565b905060008151116125465760405180602001604052806000815250612571565b806125508461301b565b604051602001612561929190615369565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612615612998565b73ffffffffffffffffffffffffffffffffffffffff16612633611f45565b73ffffffffffffffffffffffffffffffffffffffff1614612689576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612680906149c2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036126f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ef906153ff565b60405180910390fd5b61270181612c6f565b50565b60011515601060019054906101000a900460ff1615151461275a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275190614c44565b60405180910390fd5b607d600161276661106c565b6127709190614c93565b11156127b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a890614d35565b60405180910390fd5b6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015612834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282b9061546b565b60405180910390fd5b61284533612840612ac5565b612bd1565b600c600081548092919061285890614dc1565b91905055506001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128ad919061548b565b92505081905550565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061298157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061299157506129908261317b565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612a7f83611816565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080600c54607d612ad7919061548b565b9050600080600083612ae76131e5565b612af191906154ee565b9050600060116000600187612b06919061548b565b81526020019081526020016000205403612b2e57600184612b27919061548b565b9250612b51565b60116000600186612b3f919061548b565b81526020019081526020016000205492505b6000601160008381526020019081526020016000205403612b8c57809150826011600083815260200190815260200160002081905550612bbb565b601160008281526020019081526020016000205491508260116000838152602001908152602001600020819055505b600182612bc89190614c93565b94505050505090565b612beb828260405180602001604052806000815250613218565b5050565b612c00612bfa612998565b82613273565b612c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3690615591565b60405180910390fd5b612c4a838383613351565b505050565b612c6a83838360405180602001604052806000815250612312565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612da3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9a906155fd565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612e94919061420c565b60405180910390a3505050565b612eb2612eac612998565b83613273565b612ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee890615591565b60405180910390fd5b612efd848484846135ac565b50505050565b612f848363a9059cbb60e01b8484604051602401612f2292919061561d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613608565b505050565b6060600b8054612f9890614a11565b80601f0160208091040260200160405190810160405280929190818152602001828054612fc490614a11565b80156130115780601f10612fe657610100808354040283529160200191613011565b820191906000526020600020905b815481529060010190602001808311612ff457829003601f168201915b5050505050905090565b606060008203613062576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613176565b600082905060005b6000821461309457808061307d90614dc1565b915050600a8261308d9190615646565b915061306a565b60008167ffffffffffffffff8111156130b0576130af61469e565b5b6040519080825280601f01601f1916602001820160405280156130e25781602001600182028036833780820191505090505b5090505b6000851461316f576001826130fb919061548b565b9150600a8561310a91906154ee565b60306131169190614c93565b60f81b81838151811061312c5761312b61516e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131689190615646565b94506130e6565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600044426040516020016131fa929190615698565b6040516020818303038152906040528051906020012060001c905090565b61322283836136cf565b61322f600084848461389c565b61326e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326590615736565b60405180910390fd5b505050565b600061327e826129a0565b6132bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b4906157c8565b60405180910390fd5b60006132c883611816565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061333757508373ffffffffffffffffffffffffffffffffffffffff1661331f84610cec565b73ffffffffffffffffffffffffffffffffffffffff16145b8061334857506133478185612579565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661337182611816565b73ffffffffffffffffffffffffffffffffffffffff16146133c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133be9061585a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613436576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342d906158ec565b60405180910390fd5b613441838383613a23565b61344c600082612a0c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461349c919061548b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134f39190614c93565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6135b7848484613351565b6135c38484848461389c565b613602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135f990615736565b60405180910390fd5b50505050565b600061366a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613a339092919063ffffffff16565b90506000815111156136ca578080602001905181019061368a9190614ed9565b6136c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136c09061597e565b60405180910390fd5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361373e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613735906159ea565b60405180910390fd5b613747816129a0565b15613787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161377e90615a56565b60405180910390fd5b61379360008383613a23565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137e39190614c93565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006138bd8473ffffffffffffffffffffffffffffffffffffffff16613a4b565b15613a16578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026138e6612998565b8786866040518563ffffffff1660e01b81526004016139089493929190615acb565b6020604051808303816000875af192505050801561394457506040513d601f19601f820116820180604052508101906139419190615b2c565b60015b6139c6573d8060008114613974576040519150601f19603f3d011682016040523d82523d6000602084013e613979565b606091505b5060008151036139be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139b590615736565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613a1b565b600190505b949350505050565b613a2e838383613a5e565b505050565b6060613a428484600085613b70565b90509392505050565b600080823b905060008111915050919050565b613a69838383613c84565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613aab57613aa681613c89565b613aea565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613ae957613ae88382613cd2565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613b2c57613b2781613e3f565b613b6b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613b6a57613b698282613f10565b5b5b505050565b606082471015613bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bac90615bcb565b60405180910390fd5b613bbe85613a4b565b613bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bf490615c37565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613c269190615c93565b60006040518083038185875af1925050503d8060008114613c63576040519150601f19603f3d011682016040523d82523d6000602084013e613c68565b606091505b5091509150613c78828286613f8f565b92505050949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613cdf846118c7565b613ce9919061548b565b9050600060076000848152602001908152602001600020549050818114613dce576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613e53919061548b565b9050600060096000848152602001908152602001600020549050600060088381548110613e8357613e8261516e565b5b906000526020600020015490508060088381548110613ea557613ea461516e565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613ef457613ef3615caa565b5b6001900381819060005260206000200160009055905550505050565b6000613f1b836118c7565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60608315613f9f57829050613fef565b600083511115613fb25782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fe691906142c0565b60405180910390fd5b9392505050565b82805461400290614a11565b90600052602060002090601f016020900481019282614024576000855561406b565b82601f1061403d57803560ff191683800117855561406b565b8280016001018555821561406b579182015b8281111561406a57823582559160200191906001019061404f565b5b509050614078919061407c565b5090565b5b8082111561409557600081600090555060010161407d565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006140d8826140ad565b9050919050565b6140e8816140cd565b81146140f357600080fd5b50565b600081359050614105816140df565b92915050565b600060208284031215614121576141206140a3565b5b600061412f848285016140f6565b91505092915050565b6000819050919050565b61414b81614138565b82525050565b60006020820190506141666000830184614142565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6141a18161416c565b81146141ac57600080fd5b50565b6000813590506141be81614198565b92915050565b6000602082840312156141da576141d96140a3565b5b60006141e8848285016141af565b91505092915050565b60008115159050919050565b614206816141f1565b82525050565b600060208201905061422160008301846141fd565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614261578082015181840152602081019050614246565b83811115614270576000848401525b50505050565b6000601f19601f8301169050919050565b600061429282614227565b61429c8185614232565b93506142ac818560208601614243565b6142b581614276565b840191505092915050565b600060208201905081810360008301526142da8184614287565b905092915050565b6142eb81614138565b81146142f657600080fd5b50565b600081359050614308816142e2565b92915050565b600060208284031215614324576143236140a3565b5b6000614332848285016142f9565b91505092915050565b614344816140cd565b82525050565b600060208201905061435f600083018461433b565b92915050565b6000806040838503121561437c5761437b6140a3565b5b600061438a858286016140f6565b925050602061439b858286016142f9565b9150509250929050565b6000806000606084860312156143be576143bd6140a3565b5b60006143cc868287016140f6565b93505060206143dd868287016140f6565b92505060406143ee868287016142f9565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f84011261441d5761441c6143f8565b5b8235905067ffffffffffffffff81111561443a576144396143fd565b5b60208301915083602082028301111561445657614455614402565b5b9250929050565b60008060208385031215614474576144736140a3565b5b600083013567ffffffffffffffff811115614492576144916140a8565b5b61449e85828601614407565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6144df81614138565b82525050565b60006144f183836144d6565b60208301905092915050565b6000602082019050919050565b6000614515826144aa565b61451f81856144b5565b935061452a836144c6565b8060005b8381101561455b57815161454288826144e5565b975061454d836144fd565b92505060018101905061452e565b5085935050505092915050565b60006020820190508181036000830152614582818461450a565b905092915050565b60008083601f8401126145a05761459f6143f8565b5b8235905067ffffffffffffffff8111156145bd576145bc6143fd565b5b6020830191508360018202830111156145d9576145d8614402565b5b9250929050565b600080602083850312156145f7576145f66140a3565b5b600083013567ffffffffffffffff811115614615576146146140a8565b5b6146218582860161458a565b92509250509250929050565b614636816141f1565b811461464157600080fd5b50565b6000813590506146538161462d565b92915050565b600080604083850312156146705761466f6140a3565b5b600061467e858286016140f6565b925050602061468f85828601614644565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6146d682614276565b810181811067ffffffffffffffff821117156146f5576146f461469e565b5b80604052505050565b6000614708614099565b905061471482826146cd565b919050565b600067ffffffffffffffff8211156147345761473361469e565b5b61473d82614276565b9050602081019050919050565b82818337600083830152505050565b600061476c61476784614719565b6146fe565b90508281526020810184848401111561478857614787614699565b5b61479384828561474a565b509392505050565b600082601f8301126147b0576147af6143f8565b5b81356147c0848260208601614759565b91505092915050565b600080600080608085870312156147e3576147e26140a3565b5b60006147f1878288016140f6565b9450506020614802878288016140f6565b9350506040614813878288016142f9565b925050606085013567ffffffffffffffff811115614834576148336140a8565b5b6148408782880161479b565b91505092959194509250565b6000614857826140cd565b9050919050565b6148678161484c565b811461487257600080fd5b50565b6000813590506148848161485e565b92915050565b600080604083850312156148a1576148a06140a3565b5b60006148af85828601614875565b92505060206148c0858286016142f9565b9150509250929050565b600080604083850312156148e1576148e06140a3565b5b60006148ef858286016140f6565b9250506020614900858286016140f6565b9150509250929050565b7f5a65726f2061646472657373206e6f74206f6e20416c6c6f77204c6973740000600082015250565b6000614940601e83614232565b915061494b8261490a565b602082019050919050565b6000602082019050818103600083015261496f81614933565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006149ac602083614232565b91506149b782614976565b602082019050919050565b600060208201905081810360008301526149db8161499f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614a2957607f821691505b602082108103614a3c57614a3b6149e2565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614a9e602c83614232565b9150614aa982614a42565b604082019050919050565b60006020820190508181036000830152614acd81614a91565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b30602183614232565b9150614b3b82614ad4565b604082019050919050565b60006020820190508181036000830152614b5f81614b23565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614bc2603883614232565b9150614bcd82614b66565b604082019050919050565b60006020820190508181036000830152614bf181614bb5565b9050919050565b7f53616c65206861736e2774207374617274656400000000000000000000000000600082015250565b6000614c2e601383614232565b9150614c3982614bf8565b602082019050919050565b60006020820190508181036000830152614c5d81614c21565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614c9e82614138565b9150614ca983614138565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614cde57614cdd614c64565b5b828201905092915050565b7f45786365656473204d41585f537570706c790000000000000000000000000000600082015250565b6000614d1f601283614232565b9150614d2a82614ce9565b602082019050919050565b60006020820190508181036000830152614d4e81614d12565b9050919050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b6000614d8b601f83614232565b9150614d9682614d55565b602082019050919050565b60006020820190508181036000830152614dba81614d7e565b9050919050565b6000614dcc82614138565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614dfe57614dfd614c64565b5b600182019050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614e65602a83614232565b9150614e7082614e09565b604082019050919050565b60006020820190508181036000830152614e9481614e58565b9050919050565b6000604082019050614eb0600083018561433b565b614ebd602083018461433b565b9392505050565b600081519050614ed38161462d565b92915050565b600060208284031215614eef57614eee6140a3565b5b6000614efd84828501614ec4565b91505092915050565b7f526573657276656420416c6c6f636174656420746f6b656e7300000000000000600082015250565b6000614f3c601983614232565b9150614f4782614f06565b602082019050919050565b60006020820190508181036000830152614f6b81614f2f565b9050919050565b7f50726573616c65206861736e2774207374617274656400000000000000000000600082015250565b6000614fa8601683614232565b9150614fb382614f72565b602082019050919050565b60006020820190508181036000830152614fd781614f9b565b9050919050565b7f596f7520617265206e6f74206f6e20746865205768697465204c697374000000600082015250565b6000615014601d83614232565b915061501f82614fde565b602082019050919050565b6000602082019050818103600083015261504381615007565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006150a6602b83614232565b91506150b18261504a565b604082019050919050565b600060208201905081810360008301526150d581615099565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000615138602c83614232565b9150615143826150dc565b604082019050919050565b600060208201905081810360008301526151678161512b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006151f9602983614232565b91506152048261519d565b604082019050919050565b60006020820190508181036000830152615228816151ec565b9050919050565b7f43616e27742061646420746865206e756c6c2061646472657373000000000000600082015250565b6000615265601a83614232565b91506152708261522f565b602082019050919050565b6000602082019050818103600083015261529481615258565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006152f7602f83614232565b91506153028261529b565b604082019050919050565b60006020820190508181036000830152615326816152ea565b9050919050565b600081905092915050565b600061534382614227565b61534d818561532d565b935061535d818560208601614243565b80840191505092915050565b60006153758285615338565b91506153818284615338565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006153e9602683614232565b91506153f48261538d565b604082019050919050565b60006020820190508181036000830152615418816153dc565b9050919050565b7f4e6f204372656469747300000000000000000000000000000000000000000000600082015250565b6000615455600a83614232565b91506154608261541f565b602082019050919050565b6000602082019050818103600083015261548481615448565b9050919050565b600061549682614138565b91506154a183614138565b9250828210156154b4576154b3614c64565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006154f982614138565b915061550483614138565b925082615514576155136154bf565b5b828206905092915050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061557b603183614232565b91506155868261551f565b604082019050919050565b600060208201905081810360008301526155aa8161556e565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006155e7601983614232565b91506155f2826155b1565b602082019050919050565b60006020820190508181036000830152615616816155da565b9050919050565b6000604082019050615632600083018561433b565b61563f6020830184614142565b9392505050565b600061565182614138565b915061565c83614138565b92508261566c5761566b6154bf565b5b828204905092915050565b6000819050919050565b61569261568d82614138565b615677565b82525050565b60006156a48285615681565b6020820191506156b48284615681565b6020820191508190509392505050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615720603283614232565b915061572b826156c4565b604082019050919050565b6000602082019050818103600083015261574f81615713565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006157b2602c83614232565b91506157bd82615756565b604082019050919050565b600060208201905081810360008301526157e1816157a5565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000615844602983614232565b915061584f826157e8565b604082019050919050565b6000602082019050818103600083015261587381615837565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006158d6602483614232565b91506158e18261587a565b604082019050919050565b60006020820190508181036000830152615905816158c9565b9050919050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000615968602a83614232565b91506159738261590c565b604082019050919050565b600060208201905081810360008301526159978161595b565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006159d4602083614232565b91506159df8261599e565b602082019050919050565b60006020820190508181036000830152615a03816159c7565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615a40601c83614232565b9150615a4b82615a0a565b602082019050919050565b60006020820190508181036000830152615a6f81615a33565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615a9d82615a76565b615aa78185615a81565b9350615ab7818560208601614243565b615ac081614276565b840191505092915050565b6000608082019050615ae0600083018761433b565b615aed602083018661433b565b615afa6040830185614142565b8181036060830152615b0c8184615a92565b905095945050505050565b600081519050615b2681614198565b92915050565b600060208284031215615b4257615b416140a3565b5b6000615b5084828501615b17565b91505092915050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000615bb5602683614232565b9150615bc082615b59565b604082019050919050565b60006020820190508181036000830152615be481615ba8565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000615c21601d83614232565b9150615c2c82615beb565b602082019050919050565b60006020820190508181036000830152615c5081615c14565b9050919050565b600081905092915050565b6000615c6d82615a76565b615c778185615c57565b9350615c87818560208601614243565b80840191505092915050565b6000615c9f8284615c62565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220fab0ac7ef171e46a2167907275c09a25df340326f9e14f40b38457dd4589834464736f6c634300080d0033

Deployed Bytecode

0x6080604052600436106102715760003560e01c80634f6ccce71161014f57806395d89b41116100c1578063b88d4fde1161007a578063b88d4fde146108eb578063bcba693914610914578063c87b56dd1461093d578063e985e9c51461097a578063f2fde38b146109b7578063f3234a67146109e057610271565b806395d89b4114610801578063a035b1fe1461082c578063a22cb46514610857578063a51312c814610880578063b0220015146108a9578063b66a0e5d146108d457610271565b80637263cfe2116101135780637263cfe2146107075780637d27d66c146107305780638462151c14610759578063853828b6146107965780638da5cb5b146107ad5780638ef79e91146107d857610271565b80634f6ccce71461062257806355367ba91461065f5780636352211e1461067657806370a08231146106b3578063715018a6146106f057610271565b806315a55347116101e85780632d3df31f116101ac5780632d3df31f1461051f5780632f745c59146105295780633a065892146105665780634034968f146105a357806342842e0e146105ce5780634f30c879146105f757610271565b806315a553471461044c57806318160ddd146104775780631c8b232d146104a257806323b872dd146104cd57806327af0503146104f657610271565b8063081812fc1161023a578063081812fc14610349578063095ea7b3146103865780630a00918d146103af5780630b191314146103da5780631249c58b1461040557806314a1fc351461040f57610271565b806208ffdd1461027657806301ffc9a7146102b357806304c98b2b146102f057806306fdde0314610307578063070f5c0914610332575b600080fd5b34801561028257600080fd5b5061029d6004803603810190610298919061410b565b6109f7565b6040516102aa9190614151565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d591906141c4565b610aae565b6040516102e7919061420c565b60405180910390f35b3480156102fc57600080fd5b50610305610b28565b005b34801561031357600080fd5b5061031c610bc1565b60405161032991906142c0565b60405180910390f35b34801561033e57600080fd5b50610347610c53565b005b34801561035557600080fd5b50610370600480360381019061036b919061430e565b610cec565b60405161037d919061434a565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a89190614365565b610d71565b005b3480156103bb57600080fd5b506103c4610e88565b6040516103d19190614151565b60405180910390f35b3480156103e657600080fd5b506103ef610e8e565b6040516103fc9190614151565b60405180910390f35b61040d610e93565b005b34801561041b57600080fd5b506104366004803603810190610431919061410b565b610faf565b6040516104439190614151565b60405180910390f35b34801561045857600080fd5b50610461611066565b60405161046e9190614151565b60405180910390f35b34801561048357600080fd5b5061048c61106c565b6040516104999190614151565b60405180910390f35b3480156104ae57600080fd5b506104b7611079565b6040516104c4919061420c565b60405180910390f35b3480156104d957600080fd5b506104f460048036038101906104ef91906143a5565b61108c565b005b34801561050257600080fd5b5061051d6004803603810190610518919061410b565b611198565b005b6105276112d1565b005b34801561053557600080fd5b50610550600480360381019061054b9190614365565b6114e8565b60405161055d9190614151565b60405180910390f35b34801561057257600080fd5b5061058d6004803603810190610588919061410b565b61158d565b60405161059a919061420c565b60405180910390f35b3480156105af57600080fd5b506105b86115e3565b6040516105c59190614151565b60405180910390f35b3480156105da57600080fd5b506105f560048036038101906105f091906143a5565b6115ed565b005b34801561060357600080fd5b5061060c6116f9565b604051610619919061420c565b60405180910390f35b34801561062e57600080fd5b506106496004803603810190610644919061430e565b61170c565b6040516106569190614151565b60405180910390f35b34801561066b57600080fd5b5061067461177d565b005b34801561068257600080fd5b5061069d6004803603810190610698919061430e565b611816565b6040516106aa919061434a565b60405180910390f35b3480156106bf57600080fd5b506106da60048036038101906106d5919061410b565b6118c7565b6040516106e79190614151565b60405180910390f35b3480156106fc57600080fd5b5061070561197e565b005b34801561071357600080fd5b5061072e6004803603810190610729919061445d565b611a06565b005b34801561073c57600080fd5b5061075760048036038101906107529190614365565b611c9b565b005b34801561076557600080fd5b50610780600480360381019061077b919061410b565b611d71565b60405161078d9190614568565b60405180910390f35b3480156107a257600080fd5b506107ab611e7a565b005b3480156107b957600080fd5b506107c2611f45565b6040516107cf919061434a565b60405180910390f35b3480156107e457600080fd5b506107ff60048036038101906107fa91906145e0565b611f6f565b005b34801561080d57600080fd5b50610816612001565b60405161082391906142c0565b60405180910390f35b34801561083857600080fd5b50610841612093565b60405161084e9190614151565b60405180910390f35b34801561086357600080fd5b5061087e60048036038101906108799190614659565b612099565b005b34801561088c57600080fd5b506108a760048036038101906108a2919061445d565b6120af565b005b3480156108b557600080fd5b506108be612266565b6040516108cb919061420c565b60405180910390f35b3480156108e057600080fd5b506108e9612279565b005b3480156108f757600080fd5b50610912600480360381019061090d91906147c9565b612312565b005b34801561092057600080fd5b5061093b6004803603810190610936919061488a565b612420565b005b34801561094957600080fd5b50610964600480360381019061095f919061430e565b6124d2565b60405161097191906142c0565b60405180910390f35b34801561098657600080fd5b506109a1600480360381019061099c91906148ca565b612579565b6040516109ae919061420c565b60405180910390f35b3480156109c357600080fd5b506109de60048036038101906109d9919061410b565b61260d565b005b3480156109ec57600080fd5b506109f5612704565b005b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5e90614956565b60405180910390fd5b601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b215750610b20826128b6565b5b9050919050565b610b30612998565b73ffffffffffffffffffffffffffffffffffffffff16610b4e611f45565b73ffffffffffffffffffffffffffffffffffffffff1614610ba4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9b906149c2565b60405180910390fd5b6001601060026101000a81548160ff021916908315150217905550565b606060008054610bd090614a11565b80601f0160208091040260200160405190810160405280929190818152602001828054610bfc90614a11565b8015610c495780601f10610c1e57610100808354040283529160200191610c49565b820191906000526020600020905b815481529060010190602001808311610c2c57829003601f168201915b5050505050905090565b610c5b612998565b73ffffffffffffffffffffffffffffffffffffffff16610c79611f45565b73ffffffffffffffffffffffffffffffffffffffff1614610ccf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc6906149c2565b60405180910390fd5b6000601060026101000a81548160ff021916908315150217905550565b6000610cf7826129a0565b610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614ab4565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d7c82611816565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de390614b46565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e0b612998565b73ffffffffffffffffffffffffffffffffffffffff161480610e3a5750610e3981610e34612998565b612579565b5b610e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7090614bd8565b60405180910390fd5b610e838383612a0c565b505050565b600f5481565b607d81565b60011515601060019054906101000a900460ff16151514610ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee090614c44565b60405180910390fd5b607d6001610ef561106c565b610eff9190614c93565b10610f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3690614d35565b60405180910390fd5b34600d541115610f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7b90614da1565b60405180910390fd5b610f9533610f90612ac5565b612bd1565b600c6000815480929190610fa890614dc1565b9190505550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361101f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101690614e7b565b60405180910390fd5b601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600e5481565b6000600880549050905090565b601060019054906101000a900460ff1681565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611188576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611103929190614e9b565b6020604051808303816000875af1158015611122573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111469190614ed9565b61118757336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161117e919061434a565b60405180910390fd5b5b611193838383612bef565b505050565b6111a0612998565b73ffffffffffffffffffffffffffffffffffffffff166111be611f45565b73ffffffffffffffffffffffffffffffffffffffff1614611214576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120b906149c2565b60405180910390fd5b60001515601060009054906101000a900460ff1615151461126a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126190614f52565b60405180910390fd5b60005b60058110156112b25761128782611282612ac5565b612bd1565b600c600081548092919061129a90614dc1565b919050555080806112aa90614dc1565b91505061126d565b506001601060006101000a81548160ff02191690831515021790555050565b60011515601060029054906101000a900460ff16151514611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131e90614fbe565b60405180910390fd5b607d600161133361106c565b61133d9190614c93565b1061137d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137490614d35565b60405180910390fd5b34600d5411156113c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b990614da1565b60405180910390fd5b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661144e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114459061502a565b60405180910390fd5b6001601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461149e9190614c93565b925050819055506114b6336114b1612ac5565b612bd1565b600c60008154809291906114c990614dc1565b9190505550600f60008154809291906114e190614dc1565b9190505550565b60006114f3836118c7565b8210611534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152b906150bc565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600c54905090565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156116e9576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611664929190614e9b565b6020604051808303816000875af1158015611683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a79190614ed9565b6116e857336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016116df919061434a565b60405180910390fd5b5b6116f4838383612c4f565b505050565b601060009054906101000a900460ff1681565b600061171661106c565b8210611757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174e9061514e565b60405180910390fd5b6008828154811061176b5761176a61516e565b5b90600052602060002001549050919050565b611785612998565b73ffffffffffffffffffffffffffffffffffffffff166117a3611f45565b73ffffffffffffffffffffffffffffffffffffffff16146117f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f0906149c2565b60405180910390fd5b6000601060016101000a81548160ff021916908315150217905550565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b59061520f565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192e90614e7b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611986612998565b73ffffffffffffffffffffffffffffffffffffffff166119a4611f45565b73ffffffffffffffffffffffffffffffffffffffff16146119fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f1906149c2565b60405180910390fd5b611a046000612c6f565b565b611a0e612998565b73ffffffffffffffffffffffffffffffffffffffff16611a2c611f45565b73ffffffffffffffffffffffffffffffffffffffff1614611a82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a79906149c2565b60405180910390fd5b60005b82829050811015611c9657600073ffffffffffffffffffffffffffffffffffffffff16838383818110611abb57611aba61516e565b5b9050602002016020810190611ad0919061410b565b73ffffffffffffffffffffffffffffffffffffffff1603611b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1d9061527b565b60405180910390fd5b600160136000858585818110611b3f57611b3e61516e565b5b9050602002016020810190611b54919061410b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600060146000858585818110611bbe57611bbd61516e565b5b9050602002016020810190611bd3919061410b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611c1a576000611c82565b60146000848484818110611c3157611c3061516e565b5b9050602002016020810190611c46919061410b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020545b508080611c8e90614dc1565b915050611a85565b505050565b611ca3612998565b73ffffffffffffffffffffffffffffffffffffffff16611cc1611f45565b73ffffffffffffffffffffffffffffffffffffffff1614611d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0e906149c2565b60405180910390fd5b80601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d669190614c93565b925050819055505050565b60606000611d7e836118c7565b905060008103611dda57600067ffffffffffffffff811115611da357611da261469e565b5b604051908082528060200260200182016040528015611dd15781602001602082028036833780820191505090505b50915050611e75565b60008167ffffffffffffffff811115611df657611df561469e565b5b604051908082528060200260200182016040528015611e245781602001602082028036833780820191505090505b50905060005b82811015611e6e57611e3c85826114e8565b828281518110611e4f57611e4e61516e565b5b6020026020010181815250508080611e6690614dc1565b915050611e2a565b8193505050505b919050565b611e82612998565b73ffffffffffffffffffffffffffffffffffffffff16611ea0611f45565b73ffffffffffffffffffffffffffffffffffffffff1614611ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eed906149c2565b60405180910390fd5b60003390508073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611f41573d6000803e3d6000fd5b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611f77612998565b73ffffffffffffffffffffffffffffffffffffffff16611f95611f45565b73ffffffffffffffffffffffffffffffffffffffff1614611feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe2906149c2565b60405180910390fd5b8181600b9190611ffc929190613ff6565b505050565b60606001805461201090614a11565b80601f016020809104026020016040519081016040528092919081815260200182805461203c90614a11565b80156120895780601f1061205e57610100808354040283529160200191612089565b820191906000526020600020905b81548152906001019060200180831161206c57829003601f168201915b5050505050905090565b600d5481565b6120ab6120a4612998565b8383612d35565b5050565b6120b7612998565b73ffffffffffffffffffffffffffffffffffffffff166120d5611f45565b73ffffffffffffffffffffffffffffffffffffffff161461212b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612122906149c2565b60405180910390fd5b60005b8282905081101561226157600073ffffffffffffffffffffffffffffffffffffffff168383838181106121645761216361516e565b5b9050602002016020810190612179919061410b565b73ffffffffffffffffffffffffffffffffffffffff16036121cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c69061527b565b60405180910390fd5b6000601360008585858181106121e8576121e761516e565b5b90506020020160208101906121fd919061410b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061225990614dc1565b91505061212e565b505050565b601060029054906101000a900460ff1681565b612281612998565b73ffffffffffffffffffffffffffffffffffffffff1661229f611f45565b73ffffffffffffffffffffffffffffffffffffffff16146122f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ec906149c2565b60405180910390fd5b6001601060016101000a81548160ff021916908315150217905550565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561240e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401612389929190614e9b565b6020604051808303816000875af11580156123a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123cc9190614ed9565b61240d57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401612404919061434a565b60405180910390fd5b5b61241a84848484612ea1565b50505050565b612428612998565b73ffffffffffffffffffffffffffffffffffffffff16612446611f45565b73ffffffffffffffffffffffffffffffffffffffff161461249c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612493906149c2565b60405180910390fd5b6124ce6124a7611f45565b828473ffffffffffffffffffffffffffffffffffffffff16612f039092919063ffffffff16565b5050565b60606124dd826129a0565b61251c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125139061530d565b60405180910390fd5b6000612526612f89565b905060008151116125465760405180602001604052806000815250612571565b806125508461301b565b604051602001612561929190615369565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612615612998565b73ffffffffffffffffffffffffffffffffffffffff16612633611f45565b73ffffffffffffffffffffffffffffffffffffffff1614612689576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612680906149c2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036126f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ef906153ff565b60405180910390fd5b61270181612c6f565b50565b60011515601060019054906101000a900460ff1615151461275a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275190614c44565b60405180910390fd5b607d600161276661106c565b6127709190614c93565b11156127b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a890614d35565b60405180910390fd5b6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015612834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282b9061546b565b60405180910390fd5b61284533612840612ac5565b612bd1565b600c600081548092919061285890614dc1565b91905055506001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128ad919061548b565b92505081905550565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061298157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061299157506129908261317b565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612a7f83611816565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080600c54607d612ad7919061548b565b9050600080600083612ae76131e5565b612af191906154ee565b9050600060116000600187612b06919061548b565b81526020019081526020016000205403612b2e57600184612b27919061548b565b9250612b51565b60116000600186612b3f919061548b565b81526020019081526020016000205492505b6000601160008381526020019081526020016000205403612b8c57809150826011600083815260200190815260200160002081905550612bbb565b601160008281526020019081526020016000205491508260116000838152602001908152602001600020819055505b600182612bc89190614c93565b94505050505090565b612beb828260405180602001604052806000815250613218565b5050565b612c00612bfa612998565b82613273565b612c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3690615591565b60405180910390fd5b612c4a838383613351565b505050565b612c6a83838360405180602001604052806000815250612312565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612da3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9a906155fd565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612e94919061420c565b60405180910390a3505050565b612eb2612eac612998565b83613273565b612ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee890615591565b60405180910390fd5b612efd848484846135ac565b50505050565b612f848363a9059cbb60e01b8484604051602401612f2292919061561d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613608565b505050565b6060600b8054612f9890614a11565b80601f0160208091040260200160405190810160405280929190818152602001828054612fc490614a11565b80156130115780601f10612fe657610100808354040283529160200191613011565b820191906000526020600020905b815481529060010190602001808311612ff457829003601f168201915b5050505050905090565b606060008203613062576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613176565b600082905060005b6000821461309457808061307d90614dc1565b915050600a8261308d9190615646565b915061306a565b60008167ffffffffffffffff8111156130b0576130af61469e565b5b6040519080825280601f01601f1916602001820160405280156130e25781602001600182028036833780820191505090505b5090505b6000851461316f576001826130fb919061548b565b9150600a8561310a91906154ee565b60306131169190614c93565b60f81b81838151811061312c5761312b61516e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131689190615646565b94506130e6565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600044426040516020016131fa929190615698565b6040516020818303038152906040528051906020012060001c905090565b61322283836136cf565b61322f600084848461389c565b61326e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326590615736565b60405180910390fd5b505050565b600061327e826129a0565b6132bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b4906157c8565b60405180910390fd5b60006132c883611816565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061333757508373ffffffffffffffffffffffffffffffffffffffff1661331f84610cec565b73ffffffffffffffffffffffffffffffffffffffff16145b8061334857506133478185612579565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661337182611816565b73ffffffffffffffffffffffffffffffffffffffff16146133c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133be9061585a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613436576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342d906158ec565b60405180910390fd5b613441838383613a23565b61344c600082612a0c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461349c919061548b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134f39190614c93565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6135b7848484613351565b6135c38484848461389c565b613602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135f990615736565b60405180910390fd5b50505050565b600061366a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613a339092919063ffffffff16565b90506000815111156136ca578080602001905181019061368a9190614ed9565b6136c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136c09061597e565b60405180910390fd5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361373e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613735906159ea565b60405180910390fd5b613747816129a0565b15613787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161377e90615a56565b60405180910390fd5b61379360008383613a23565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137e39190614c93565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006138bd8473ffffffffffffffffffffffffffffffffffffffff16613a4b565b15613a16578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026138e6612998565b8786866040518563ffffffff1660e01b81526004016139089493929190615acb565b6020604051808303816000875af192505050801561394457506040513d601f19601f820116820180604052508101906139419190615b2c565b60015b6139c6573d8060008114613974576040519150601f19603f3d011682016040523d82523d6000602084013e613979565b606091505b5060008151036139be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139b590615736565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613a1b565b600190505b949350505050565b613a2e838383613a5e565b505050565b6060613a428484600085613b70565b90509392505050565b600080823b905060008111915050919050565b613a69838383613c84565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613aab57613aa681613c89565b613aea565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613ae957613ae88382613cd2565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613b2c57613b2781613e3f565b613b6b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613b6a57613b698282613f10565b5b5b505050565b606082471015613bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bac90615bcb565b60405180910390fd5b613bbe85613a4b565b613bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bf490615c37565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613c269190615c93565b60006040518083038185875af1925050503d8060008114613c63576040519150601f19603f3d011682016040523d82523d6000602084013e613c68565b606091505b5091509150613c78828286613f8f565b92505050949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613cdf846118c7565b613ce9919061548b565b9050600060076000848152602001908152602001600020549050818114613dce576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613e53919061548b565b9050600060096000848152602001908152602001600020549050600060088381548110613e8357613e8261516e565b5b906000526020600020015490508060088381548110613ea557613ea461516e565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613ef457613ef3615caa565b5b6001900381819060005260206000200160009055905550505050565b6000613f1b836118c7565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60608315613f9f57829050613fef565b600083511115613fb25782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fe691906142c0565b60405180910390fd5b9392505050565b82805461400290614a11565b90600052602060002090601f016020900481019282614024576000855561406b565b82601f1061403d57803560ff191683800117855561406b565b8280016001018555821561406b579182015b8281111561406a57823582559160200191906001019061404f565b5b509050614078919061407c565b5090565b5b8082111561409557600081600090555060010161407d565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006140d8826140ad565b9050919050565b6140e8816140cd565b81146140f357600080fd5b50565b600081359050614105816140df565b92915050565b600060208284031215614121576141206140a3565b5b600061412f848285016140f6565b91505092915050565b6000819050919050565b61414b81614138565b82525050565b60006020820190506141666000830184614142565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6141a18161416c565b81146141ac57600080fd5b50565b6000813590506141be81614198565b92915050565b6000602082840312156141da576141d96140a3565b5b60006141e8848285016141af565b91505092915050565b60008115159050919050565b614206816141f1565b82525050565b600060208201905061422160008301846141fd565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614261578082015181840152602081019050614246565b83811115614270576000848401525b50505050565b6000601f19601f8301169050919050565b600061429282614227565b61429c8185614232565b93506142ac818560208601614243565b6142b581614276565b840191505092915050565b600060208201905081810360008301526142da8184614287565b905092915050565b6142eb81614138565b81146142f657600080fd5b50565b600081359050614308816142e2565b92915050565b600060208284031215614324576143236140a3565b5b6000614332848285016142f9565b91505092915050565b614344816140cd565b82525050565b600060208201905061435f600083018461433b565b92915050565b6000806040838503121561437c5761437b6140a3565b5b600061438a858286016140f6565b925050602061439b858286016142f9565b9150509250929050565b6000806000606084860312156143be576143bd6140a3565b5b60006143cc868287016140f6565b93505060206143dd868287016140f6565b92505060406143ee868287016142f9565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f84011261441d5761441c6143f8565b5b8235905067ffffffffffffffff81111561443a576144396143fd565b5b60208301915083602082028301111561445657614455614402565b5b9250929050565b60008060208385031215614474576144736140a3565b5b600083013567ffffffffffffffff811115614492576144916140a8565b5b61449e85828601614407565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6144df81614138565b82525050565b60006144f183836144d6565b60208301905092915050565b6000602082019050919050565b6000614515826144aa565b61451f81856144b5565b935061452a836144c6565b8060005b8381101561455b57815161454288826144e5565b975061454d836144fd565b92505060018101905061452e565b5085935050505092915050565b60006020820190508181036000830152614582818461450a565b905092915050565b60008083601f8401126145a05761459f6143f8565b5b8235905067ffffffffffffffff8111156145bd576145bc6143fd565b5b6020830191508360018202830111156145d9576145d8614402565b5b9250929050565b600080602083850312156145f7576145f66140a3565b5b600083013567ffffffffffffffff811115614615576146146140a8565b5b6146218582860161458a565b92509250509250929050565b614636816141f1565b811461464157600080fd5b50565b6000813590506146538161462d565b92915050565b600080604083850312156146705761466f6140a3565b5b600061467e858286016140f6565b925050602061468f85828601614644565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6146d682614276565b810181811067ffffffffffffffff821117156146f5576146f461469e565b5b80604052505050565b6000614708614099565b905061471482826146cd565b919050565b600067ffffffffffffffff8211156147345761473361469e565b5b61473d82614276565b9050602081019050919050565b82818337600083830152505050565b600061476c61476784614719565b6146fe565b90508281526020810184848401111561478857614787614699565b5b61479384828561474a565b509392505050565b600082601f8301126147b0576147af6143f8565b5b81356147c0848260208601614759565b91505092915050565b600080600080608085870312156147e3576147e26140a3565b5b60006147f1878288016140f6565b9450506020614802878288016140f6565b9350506040614813878288016142f9565b925050606085013567ffffffffffffffff811115614834576148336140a8565b5b6148408782880161479b565b91505092959194509250565b6000614857826140cd565b9050919050565b6148678161484c565b811461487257600080fd5b50565b6000813590506148848161485e565b92915050565b600080604083850312156148a1576148a06140a3565b5b60006148af85828601614875565b92505060206148c0858286016142f9565b9150509250929050565b600080604083850312156148e1576148e06140a3565b5b60006148ef858286016140f6565b9250506020614900858286016140f6565b9150509250929050565b7f5a65726f2061646472657373206e6f74206f6e20416c6c6f77204c6973740000600082015250565b6000614940601e83614232565b915061494b8261490a565b602082019050919050565b6000602082019050818103600083015261496f81614933565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006149ac602083614232565b91506149b782614976565b602082019050919050565b600060208201905081810360008301526149db8161499f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614a2957607f821691505b602082108103614a3c57614a3b6149e2565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614a9e602c83614232565b9150614aa982614a42565b604082019050919050565b60006020820190508181036000830152614acd81614a91565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b30602183614232565b9150614b3b82614ad4565b604082019050919050565b60006020820190508181036000830152614b5f81614b23565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614bc2603883614232565b9150614bcd82614b66565b604082019050919050565b60006020820190508181036000830152614bf181614bb5565b9050919050565b7f53616c65206861736e2774207374617274656400000000000000000000000000600082015250565b6000614c2e601383614232565b9150614c3982614bf8565b602082019050919050565b60006020820190508181036000830152614c5d81614c21565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614c9e82614138565b9150614ca983614138565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614cde57614cdd614c64565b5b828201905092915050565b7f45786365656473204d41585f537570706c790000000000000000000000000000600082015250565b6000614d1f601283614232565b9150614d2a82614ce9565b602082019050919050565b60006020820190508181036000830152614d4e81614d12565b9050919050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b6000614d8b601f83614232565b9150614d9682614d55565b602082019050919050565b60006020820190508181036000830152614dba81614d7e565b9050919050565b6000614dcc82614138565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614dfe57614dfd614c64565b5b600182019050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614e65602a83614232565b9150614e7082614e09565b604082019050919050565b60006020820190508181036000830152614e9481614e58565b9050919050565b6000604082019050614eb0600083018561433b565b614ebd602083018461433b565b9392505050565b600081519050614ed38161462d565b92915050565b600060208284031215614eef57614eee6140a3565b5b6000614efd84828501614ec4565b91505092915050565b7f526573657276656420416c6c6f636174656420746f6b656e7300000000000000600082015250565b6000614f3c601983614232565b9150614f4782614f06565b602082019050919050565b60006020820190508181036000830152614f6b81614f2f565b9050919050565b7f50726573616c65206861736e2774207374617274656400000000000000000000600082015250565b6000614fa8601683614232565b9150614fb382614f72565b602082019050919050565b60006020820190508181036000830152614fd781614f9b565b9050919050565b7f596f7520617265206e6f74206f6e20746865205768697465204c697374000000600082015250565b6000615014601d83614232565b915061501f82614fde565b602082019050919050565b6000602082019050818103600083015261504381615007565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006150a6602b83614232565b91506150b18261504a565b604082019050919050565b600060208201905081810360008301526150d581615099565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000615138602c83614232565b9150615143826150dc565b604082019050919050565b600060208201905081810360008301526151678161512b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006151f9602983614232565b91506152048261519d565b604082019050919050565b60006020820190508181036000830152615228816151ec565b9050919050565b7f43616e27742061646420746865206e756c6c2061646472657373000000000000600082015250565b6000615265601a83614232565b91506152708261522f565b602082019050919050565b6000602082019050818103600083015261529481615258565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006152f7602f83614232565b91506153028261529b565b604082019050919050565b60006020820190508181036000830152615326816152ea565b9050919050565b600081905092915050565b600061534382614227565b61534d818561532d565b935061535d818560208601614243565b80840191505092915050565b60006153758285615338565b91506153818284615338565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006153e9602683614232565b91506153f48261538d565b604082019050919050565b60006020820190508181036000830152615418816153dc565b9050919050565b7f4e6f204372656469747300000000000000000000000000000000000000000000600082015250565b6000615455600a83614232565b91506154608261541f565b602082019050919050565b6000602082019050818103600083015261548481615448565b9050919050565b600061549682614138565b91506154a183614138565b9250828210156154b4576154b3614c64565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006154f982614138565b915061550483614138565b925082615514576155136154bf565b5b828206905092915050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061557b603183614232565b91506155868261551f565b604082019050919050565b600060208201905081810360008301526155aa8161556e565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006155e7601983614232565b91506155f2826155b1565b602082019050919050565b60006020820190508181036000830152615616816155da565b9050919050565b6000604082019050615632600083018561433b565b61563f6020830184614142565b9392505050565b600061565182614138565b915061565c83614138565b92508261566c5761566b6154bf565b5b828204905092915050565b6000819050919050565b61569261568d82614138565b615677565b82525050565b60006156a48285615681565b6020820191506156b48284615681565b6020820191508190509392505050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615720603283614232565b915061572b826156c4565b604082019050919050565b6000602082019050818103600083015261574f81615713565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006157b2602c83614232565b91506157bd82615756565b604082019050919050565b600060208201905081810360008301526157e1816157a5565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000615844602983614232565b915061584f826157e8565b604082019050919050565b6000602082019050818103600083015261587381615837565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006158d6602483614232565b91506158e18261587a565b604082019050919050565b60006020820190508181036000830152615905816158c9565b9050919050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000615968602a83614232565b91506159738261590c565b604082019050919050565b600060208201905081810360008301526159978161595b565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006159d4602083614232565b91506159df8261599e565b602082019050919050565b60006020820190508181036000830152615a03816159c7565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615a40601c83614232565b9150615a4b82615a0a565b602082019050919050565b60006020820190508181036000830152615a6f81615a33565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615a9d82615a76565b615aa78185615a81565b9350615ab7818560208601614243565b615ac081614276565b840191505092915050565b6000608082019050615ae0600083018761433b565b615aed602083018661433b565b615afa6040830185614142565b8181036060830152615b0c8184615a92565b905095945050505050565b600081519050615b2681614198565b92915050565b600060208284031215615b4257615b416140a3565b5b6000615b5084828501615b17565b91505092915050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000615bb5602683614232565b9150615bc082615b59565b604082019050919050565b60006020820190508181036000830152615be481615ba8565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000615c21601d83614232565b9150615c2c82615beb565b602082019050919050565b60006020820190508181036000830152615c5081615c14565b9050919050565b600081905092915050565b6000615c6d82615a76565b615c778185615c57565b9350615c87818560208601614243565b80840191505092915050565b6000615c9f8284615c62565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220fab0ac7ef171e46a2167907275c09a25df340326f9e14f40b38457dd4589834464736f6c634300080d0033

Deployed Bytecode Sourcemap

76021:7619:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78015:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58363:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81818:84;;;;;;;;;;;;;:::i;:::-;;45857:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81914:85;;;;;;;;;;;;;:::i;:::-;;47416:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46939:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76382:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76172:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79108:334;;;:::i;:::-;;80912:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76316:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59003:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76467:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83020:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80134:316;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79492:595;;;:::i;:::-;;58671:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77416:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80462:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83202:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76427:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59193:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81727:79;;;;;;;;;;;;;:::i;:::-;;45551:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45281:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31897:103;;;;;;;;;;;;;:::i;:::-;;76937:473;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82174:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82496:516;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82007:159;;;;;;;;;;;;;:::i;:::-;;31246:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81404:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46026:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76256:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47709:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77523:338;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76508:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81637:78;;;;;;;;;;;;;:::i;:::-;;83392:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81268:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46201:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47935:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32155:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80564:340;;;;;;;;;;;;;:::i;:::-;;78015:190;78082:7;78122:1;78105:19;;:5;:19;;;78097:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;78175:17;:24;78193:5;78175:24;;;;;;;;;;;;;;;;78168:31;;78015:190;;;:::o;58363:224::-;58465:4;58504:35;58489:50;;;:11;:50;;;;:90;;;;58543:36;58567:11;58543:23;:36::i;:::-;58489:90;58482:97;;58363:224;;;:::o;81818:84::-;31477:12;:10;:12::i;:::-;31466:23;;:7;:5;:7::i;:::-;:23;;;31458:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;81890:4:::1;81870:17;;:24;;;;;;;;;;;;;;;;;;81818:84::o:0;45857:100::-;45911:13;45944:5;45937:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45857:100;:::o;81914:85::-;31477:12;:10;:12::i;:::-;31466:23;;:7;:5;:7::i;:::-;:23;;;31458:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;81986:5:::1;81966:17;;:25;;;;;;;;;;;;;;;;;;81914:85::o:0;47416:221::-;47492:7;47520:16;47528:7;47520;:16::i;:::-;47512:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47605:15;:24;47621:7;47605:24;;;;;;;;;;;;;;;;;;;;;47598:31;;47416:221;;;:::o;46939:411::-;47020:13;47036:23;47051:7;47036:14;:23::i;:::-;47020:39;;47084:5;47078:11;;:2;:11;;;47070:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;47178:5;47162:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;47187:37;47204:5;47211:12;:10;:12::i;:::-;47187:16;:37::i;:::-;47162:62;47140:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;47321:21;47330:2;47334:7;47321:8;:21::i;:::-;47009:341;46939:411;;:::o;76382:38::-;;;;:::o;76172:40::-;76209:3;76172:40;:::o;79108:334::-;79177:4;79159:22;;:14;;;;;;;;;;;:22;;;79151:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;76209:3;79240:1;79224:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:30;79216:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;79305:9;79296:5;;:18;;79288:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;79381:30;79391:10;79403:7;:5;:7::i;:::-;79381:9;:30::i;:::-;79422:10;;:12;;;;;;;;;:::i;:::-;;;;;;79108:334::o;80912:206::-;80981:7;81026:1;81009:19;;:5;:19;;;81001:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;81093:10;:17;81104:5;81093:17;;;;;;;;;;;;;;;;81086:24;;80912:206;;;:::o;76316:33::-;;;;:::o;59003:113::-;59064:7;59091:10;:17;;;;59084:24;;59003:113;:::o;76467:34::-;;;;;;;;;;;;;:::o;83020:174::-;16935:1;15761:42;16889:43;;;:47;16885:225;;;15761:42;16958:40;;;17007:4;17014:10;16958:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16953:146;;17072:10;17053:30;;;;;;;;;;;:::i;:::-;;;;;;;;16953:146;16885:225;83149:37:::1;83168:4;83174:2;83178:7;83149:18;:37::i;:::-;83020:174:::0;;;:::o;80134:316::-;31477:12;:10;:12::i;:::-;31466:23;;:7;:5;:7::i;:::-;:23;;;31458:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;80239:5:::1;80224:20;;:11;;;;;;;;;;;:20;;;80216:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;80300:6;80295:120;80316:1;80312;:5;80295:120;;;80339:24;80349:4;80355:7;:5;:7::i;:::-;80339:9;:24::i;:::-;80378:10;;:12;;;;;;;;;:::i;:::-;;;;;;80319:3;;;;;:::i;:::-;;;;80295:120;;;;80438:4;80425:11;;:17;;;;;;;;;;;;;;;;;;80134:316:::0;:::o;79492:595::-;79572:4;79551:25;;:17;;;;;;;;;;;:25;;;79543:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;76209:3;79639:1;79623:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:30;79615:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;79704:9;79695:5;;:18;;79687:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;79768:10;:22;79779:10;79768:22;;;;;;;;;;;;;;;;;;;;;;;;;79760:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;79982:1;79949:17;:29;79967:10;79949:29;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;79994:30;80004:10;80016:7;:5;:7::i;:::-;79994:9;:30::i;:::-;80035:10;;:12;;;;;;;;;:::i;:::-;;;;;;80058:19;;:21;;;;;;;;;:::i;:::-;;;;;;79492:595::o;58671:256::-;58768:7;58804:23;58821:5;58804:16;:23::i;:::-;58796:5;:31;58788:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;58893:12;:19;58906:5;58893:19;;;;;;;;;;;;;;;:26;58913:5;58893:26;;;;;;;;;;;;58886:33;;58671:256;;;;:::o;77416:101::-;77475:4;77495:10;:16;77506:4;77495:16;;;;;;;;;;;;;;;;;;;;;;;;;77488:23;;77416:101;;;:::o;80462:90::-;80507:7;80534:10;;80527:17;;80462:90;:::o;83202:182::-;16935:1;15761:42;16889:43;;;:47;16885:225;;;15761:42;16958:40;;;17007:4;17014:10;16958:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16953:146;;17072:10;17053:30;;;;;;;;;;;:::i;:::-;;;;;;;;16953:146;16885:225;83335:41:::1;83358:4;83364:2;83368:7;83335:22;:41::i;:::-;83202:182:::0;;;:::o;76427:31::-;;;;;;;;;;;;;:::o;59193:233::-;59268:7;59304:30;:28;:30::i;:::-;59296:5;:38;59288:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;59401:10;59412:5;59401:17;;;;;;;;:::i;:::-;;;;;;;;;;59394:24;;59193:233;;;:::o;81727:79::-;31477:12;:10;:12::i;:::-;31466:23;;:7;:5;:7::i;:::-;:23;;;31458:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;81793:5:::1;81776:14;;:22;;;;;;;;;;;;;;;;;;81727:79::o:0;45551:239::-;45623:7;45643:13;45659:7;:16;45667:7;45659:16;;;;;;;;;;;;;;;;;;;;;45643:32;;45711:1;45694:19;;:5;:19;;;45686:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45777:5;45770:12;;;45551:239;;;:::o;45281:208::-;45353:7;45398:1;45381:19;;:5;:19;;;45373:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;45465:9;:16;45475:5;45465:16;;;;;;;;;;;;;;;;45458:23;;45281:208;;;:::o;31897:103::-;31477:12;:10;:12::i;:::-;31466:23;;:7;:5;:7::i;:::-;:23;;;31458:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31962:30:::1;31989:1;31962:18;:30::i;:::-;31897:103::o:0;76937:473::-;31477:12;:10;:12::i;:::-;31466:23;;:7;:5;:7::i;:::-;:23;;;31458:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77025:9:::1;77020:385;77044:9;;:16;;77040:1;:20;77020:385;;;77108:1;77084:26;;:9;;77094:1;77084:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:26;;::::0;77076:65:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;77179:4;77152:10;:24;77163:9;;77173:1;77163:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;77152:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;77358:1;77324:17;:31;77342:9;;77352:1;77342:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;77324:31;;;;;;;;;;;;;;;;:35;:73;;77396:1;77324:73;;;77362:17;:31;77380:9;;77390:1;77380:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;77362:31;;;;;;;;;;;;;;;;77324:73;;77062:3;;;;;:::i;:::-;;;;77020:385;;;;76937:473:::0;;:::o;82174:115::-;31477:12;:10;:12::i;:::-;31466:23;;:7;:5;:7::i;:::-;:23;;;31458:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;82274:7:::1;82253:10;:17;82264:5;82253:17;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;82174:115:::0;;:::o;82496:516::-;82557:16;82587:18;82608:17;82618:6;82608:9;:17::i;:::-;82587:38;;82654:1;82640:10;:15;82636:369;;82707:1;82693:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82686:23;;;;;82636:369;82742:23;82782:10;82768:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82742:51;;82808:13;82836:130;82860:10;82852:5;:18;82836:130;;;82916:34;82936:6;82944:5;82916:19;:34::i;:::-;82900:6;82907:5;82900:13;;;;;;;;:::i;:::-;;;;;;;:50;;;;;82872:7;;;;;:::i;:::-;;;;82836:130;;;82987:6;82980:13;;;;;82496:516;;;;:::o;82007:159::-;31477:12;:10;:12::i;:::-;31466:23;;:7;:5;:7::i;:::-;:23;;;31458:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;82058:25:::1;82095:10;82058:48;;82117:9;:18;;:41;82136:21;82117:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;82047:119;82007:159::o:0;31246:87::-;31292:7;31319:6;;;;;;;;;;;31312:13;;31246:87;:::o;81404:117::-;31477:12;:10;:12::i;:::-;31466:23;;:7;:5;:7::i;:::-;:23;;;31458:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;81502:13:::1;;81486;:29;;;;;;;:::i;:::-;;81404:117:::0;;:::o;46026:104::-;46082:13;46115:7;46108:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46026:104;:::o;76256:40::-;;;;:::o;47709:155::-;47804:52;47823:12;:10;:12::i;:::-;47837:8;47847;47804:18;:52::i;:::-;47709:155;;:::o;77523:338::-;31477:12;:10;:12::i;:::-;31466:23;;:7;:5;:7::i;:::-;:23;;;31458:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77614:9:::1;77609:247;77633:9;;:16;;77629:1;:20;77609:247;;;77697:1;77673:26;;:9;;77683:1;77673:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:26;;::::0;77665:65:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;77843:5;77816:10;:24;77827:9;;77837:1;77827:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;77816:24;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;77651:3;;;;;:::i;:::-;;;;77609:247;;;;77523:338:::0;;:::o;76508:37::-;;;;;;;;;;;;;:::o;81637:78::-;31477:12;:10;:12::i;:::-;31466:23;;:7;:5;:7::i;:::-;:23;;;31458:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;81703:4:::1;81686:14;;:21;;;;;;;;;;;;;;;;;;81637:78::o:0;83392:239::-;16935:1;15761:42;16889:43;;;:47;16885:225;;;15761:42;16958:40;;;17007:4;17014:10;16958:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16953:146;;17072:10;17053:30;;;;;;;;;;;:::i;:::-;;;;;;;;16953:146;16885:225;83576:47:::1;83599:4;83605:2;83609:7;83618:4;83576:22;:47::i;:::-;83392:239:::0;;;;:::o;81268:125::-;31477:12;:10;:12::i;:::-;31466:23;;:7;:5;:7::i;:::-;:23;;;31458:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;81352:35:::1;81371:7;:5;:7::i;:::-;81380:6;81352:5;:18;;;;:35;;;;;:::i;:::-;81268:125:::0;;:::o;46201:334::-;46274:13;46308:16;46316:7;46308;:16::i;:::-;46300:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;46389:21;46413:10;:8;:10::i;:::-;46389:34;;46465:1;46447:7;46441:21;:25;:86;;;;;;;;;;;;;;;;;46493:7;46502:18;:7;:16;:18::i;:::-;46476:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46441:86;46434:93;;;46201:334;;;:::o;47935:164::-;48032:4;48056:18;:25;48075:5;48056:25;;;;;;;;;;;;;;;:35;48082:8;48056:35;;;;;;;;;;;;;;;;;;;;;;;;;48049:42;;47935:164;;;;:::o;32155:201::-;31477:12;:10;:12::i;:::-;31466:23;;:7;:5;:7::i;:::-;:23;;;31458:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32264:1:::1;32244:22;;:8;:22;;::::0;32236:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;32320:28;32339:8;32320:18;:28::i;:::-;32155:201:::0;:::o;80564:340::-;80630:4;80612:22;;:14;;;;;;;;;;;:22;;;80604:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;76209:3;80693:1;80677:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:31;;80669:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;80776:1;80750:10;:22;80761:10;80750:22;;;;;;;;;;;;;;;;:27;;80742:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;80805:30;80815:10;80827:7;:5;:7::i;:::-;80805:9;:30::i;:::-;80846:10;;:12;;;;;;;;;:::i;:::-;;;;;;80895:1;80869:10;:22;80880:10;80869:22;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;80564:340::o;44912:305::-;45014:4;45066:25;45051:40;;;:11;:40;;;;:105;;;;45123:33;45108:48;;;:11;:48;;;;45051:105;:158;;;;45173:36;45197:11;45173:23;:36::i;:::-;45051:158;45031:178;;44912:305;;;:::o;29970:98::-;30023:7;30050:10;30043:17;;29970:98;:::o;50670:127::-;50735:4;50787:1;50759:30;;:7;:16;50767:7;50759:16;;;;;;;;;;;;;;;;;;;;;:30;;;;50752:37;;50670:127;;;:::o;54652:174::-;54754:2;54727:15;:24;54743:7;54727:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;54810:7;54806:2;54772:46;;54781:23;54796:7;54781:14;:23::i;:::-;54772:46;;;;;;;;;;;;54652:174;;:::o;78217:719::-;78250:7;78270:13;78297:10;;76209:3;78286:21;;;;:::i;:::-;78270:37;;78318:12;78341:14;78368:9;78397:5;78380:14;:12;:14::i;:::-;:22;;;;:::i;:::-;78368:34;;78500:1;78477:10;:19;78494:1;78488:5;:7;;;;:::i;:::-;78477:19;;;;;;;;;;;;:24;78473:129;;78530:1;78524:5;:7;;;;:::i;:::-;78517:14;;78473:129;;;78571:10;:19;78588:1;78582:5;:7;;;;:::i;:::-;78571:19;;;;;;;;;;;;78564:26;;78473:129;78739:1;78722:10;:13;78733:1;78722:13;;;;;;;;;;;;:18;78718:185;;78765:1;78756:10;;78797:4;78781:10;:13;78792:1;78781:13;;;;;;;;;;;:20;;;;78718:185;;;78843:10;:13;78854:1;78843:13;;;;;;;;;;;;78834:22;;78887:4;78871:10;:13;78882:1;78871:13;;;;;;;;;;;:20;;;;78718:185;78927:1;78920:6;:8;;;;:::i;:::-;78913:15;;;;;;78217:719;:::o;51654:110::-;51730:26;51740:2;51744:7;51730:26;;;;;;;;;;;;:9;:26::i;:::-;51654:110;;:::o;48166:339::-;48361:41;48380:12;:10;:12::i;:::-;48394:7;48361:18;:41::i;:::-;48353:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;48469:28;48479:4;48485:2;48489:7;48469:9;:28::i;:::-;48166:339;;;:::o;48576:185::-;48714:39;48731:4;48737:2;48741:7;48714:39;;;;;;;;;;;;:16;:39::i;:::-;48576:185;;;:::o;32516:191::-;32590:16;32609:6;;;;;;;;;;;32590:25;;32635:8;32626:6;;:17;;;;;;;;;;;;;;;;;;32690:8;32659:40;;32680:8;32659:40;;;;;;;;;;;;32579:128;32516:191;:::o;54968:315::-;55123:8;55114:17;;:5;:17;;;55106:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;55210:8;55172:18;:25;55191:5;55172:25;;;;;;;;;;;;;;;:35;55198:8;55172:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;55256:8;55234:41;;55249:5;55234:41;;;55266:8;55234:41;;;;;;:::i;:::-;;;;;;;;54968:315;;;:::o;48832:328::-;49007:41;49026:12;:10;:12::i;:::-;49040:7;49007:18;:41::i;:::-;48999:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;49113:39;49127:4;49133:2;49137:7;49146:5;49113:13;:39::i;:::-;48832:328;;;;:::o;71256:211::-;71373:86;71393:5;71423:23;;;71448:2;71452:5;71400:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71373:19;:86::i;:::-;71256:211;;;:::o;81527:100::-;81579:13;81608;81601:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81527:100;:::o;17807:723::-;17863:13;18093:1;18084:5;:10;18080:53;;18111:10;;;;;;;;;;;;;;;;;;;;;18080:53;18143:12;18158:5;18143:20;;18174:14;18199:78;18214:1;18206:4;:9;18199:78;;18232:8;;;;;:::i;:::-;;;;18263:2;18255:10;;;;;:::i;:::-;;;18199:78;;;18287:19;18319:6;18309:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18287:39;;18337:154;18353:1;18344:5;:10;18337:154;;18381:1;18371:11;;;;;:::i;:::-;;;18448:2;18440:5;:10;;;;:::i;:::-;18427:2;:24;;;;:::i;:::-;18414:39;;18397:6;18404;18397:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18477:2;18468:11;;;;;:::i;:::-;;;18337:154;;;18515:6;18501:21;;;;;17807:723;;;;:::o;22379:157::-;22464:4;22503:25;22488:40;;;:11;:40;;;;22481:47;;22379:157;;;:::o;78950:150::-;78995:7;79056:16;79074:15;79039:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;79029:62;;;;;;79021:71;;79014:78;;78950:150;:::o;51991:321::-;52121:18;52127:2;52131:7;52121:5;:18::i;:::-;52172:54;52203:1;52207:2;52211:7;52220:5;52172:22;:54::i;:::-;52150:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;51991:321;;;:::o;50964:348::-;51057:4;51082:16;51090:7;51082;:16::i;:::-;51074:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;51158:13;51174:23;51189:7;51174:14;:23::i;:::-;51158:39;;51227:5;51216:16;;:7;:16;;;:51;;;;51260:7;51236:31;;:20;51248:7;51236:11;:20::i;:::-;:31;;;51216:51;:87;;;;51271:32;51288:5;51295:7;51271:16;:32::i;:::-;51216:87;51208:96;;;50964:348;;;;:::o;53956:578::-;54115:4;54088:31;;:23;54103:7;54088:14;:23::i;:::-;:31;;;54080:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;54198:1;54184:16;;:2;:16;;;54176:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;54254:39;54275:4;54281:2;54285:7;54254:20;:39::i;:::-;54358:29;54375:1;54379:7;54358:8;:29::i;:::-;54419:1;54400:9;:15;54410:4;54400:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;54448:1;54431:9;:13;54441:2;54431:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;54479:2;54460:7;:16;54468:7;54460:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;54518:7;54514:2;54499:27;;54508:4;54499:27;;;;;;;;;;;;53956:578;;;:::o;50042:315::-;50199:28;50209:4;50215:2;50219:7;50199:9;:28::i;:::-;50246:48;50269:4;50275:2;50279:7;50288:5;50246:22;:48::i;:::-;50238:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;50042:315;;;;:::o;74323:716::-;74747:23;74773:69;74801:4;74773:69;;;;;;;;;;;;;;;;;74781:5;74773:27;;;;:69;;;;;:::i;:::-;74747:95;;74877:1;74857:10;:17;:21;74853:179;;;74954:10;74943:30;;;;;;;;;;;;:::i;:::-;74935:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;74853:179;74393:646;74323:716;;:::o;52648:382::-;52742:1;52728:16;;:2;:16;;;52720:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;52801:16;52809:7;52801;:16::i;:::-;52800:17;52792:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;52863:45;52892:1;52896:2;52900:7;52863:20;:45::i;:::-;52938:1;52921:9;:13;52931:2;52921:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;52969:2;52950:7;:16;52958:7;52950:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;53014:7;53010:2;52989:33;;53006:1;52989:33;;;;;;;;;;;;52648:382;;:::o;55848:799::-;56003:4;56024:15;:2;:13;;;:15::i;:::-;56020:620;;;56076:2;56060:36;;;56097:12;:10;:12::i;:::-;56111:4;56117:7;56126:5;56060:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;56056:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56319:1;56302:6;:13;:18;56298:272;;56345:60;;;;;;;;;;:::i;:::-;;;;;;;;56298:272;56520:6;56514:13;56505:6;56501:2;56497:15;56490:38;56056:529;56193:41;;;56183:51;;;:6;:51;;;;56176:58;;;;;56020:620;56624:4;56617:11;;55848:799;;;;;;;:::o;82301:187::-;82437:45;82464:4;82470:2;82474:7;82437:26;:45::i;:::-;82301:187;;;:::o;38995:229::-;39132:12;39164:52;39186:6;39194:4;39200:1;39203:12;39164:21;:52::i;:::-;39157:59;;38995:229;;;;;:::o;36189:387::-;36249:4;36457:12;36524:7;36512:20;36504:28;;36567:1;36560:4;:8;36553:15;;;36189:387;;;:::o;60039:589::-;60183:45;60210:4;60216:2;60220:7;60183:26;:45::i;:::-;60261:1;60245:18;;:4;:18;;;60241:187;;60280:40;60312:7;60280:31;:40::i;:::-;60241:187;;;60350:2;60342:10;;:4;:10;;;60338:90;;60369:47;60402:4;60408:7;60369:32;:47::i;:::-;60338:90;60241:187;60456:1;60442:16;;:2;:16;;;60438:183;;60475:45;60512:7;60475:36;:45::i;:::-;60438:183;;;60548:4;60542:10;;:2;:10;;;60538:83;;60569:40;60597:2;60601:7;60569:27;:40::i;:::-;60538:83;60438:183;60039:589;;;:::o;40115:510::-;40285:12;40343:5;40318:21;:30;;40310:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;40410:18;40421:6;40410:10;:18::i;:::-;40402:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;40476:12;40490:23;40517:6;:11;;40536:5;40543:4;40517:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40475:73;;;;40566:51;40583:7;40592:10;40604:12;40566:16;:51::i;:::-;40559:58;;;;40115:510;;;;;;:::o;57219:126::-;;;;:::o;61351:164::-;61455:10;:17;;;;61428:15;:24;61444:7;61428:24;;;;;;;;;;;:44;;;;61483:10;61499:7;61483:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61351:164;:::o;62142:988::-;62408:22;62458:1;62433:22;62450:4;62433:16;:22::i;:::-;:26;;;;:::i;:::-;62408:51;;62470:18;62491:17;:26;62509:7;62491:26;;;;;;;;;;;;62470:47;;62638:14;62624:10;:28;62620:328;;62669:19;62691:12;:18;62704:4;62691:18;;;;;;;;;;;;;;;:34;62710:14;62691:34;;;;;;;;;;;;62669:56;;62775:11;62742:12;:18;62755:4;62742:18;;;;;;;;;;;;;;;:30;62761:10;62742:30;;;;;;;;;;;:44;;;;62892:10;62859:17;:30;62877:11;62859:30;;;;;;;;;;;:43;;;;62654:294;62620:328;63044:17;:26;63062:7;63044:26;;;;;;;;;;;63037:33;;;63088:12;:18;63101:4;63088:18;;;;;;;;;;;;;;;:34;63107:14;63088:34;;;;;;;;;;;63081:41;;;62223:907;;62142:988;;:::o;63425:1079::-;63678:22;63723:1;63703:10;:17;;;;:21;;;;:::i;:::-;63678:46;;63735:18;63756:15;:24;63772:7;63756:24;;;;;;;;;;;;63735:45;;64107:19;64129:10;64140:14;64129:26;;;;;;;;:::i;:::-;;;;;;;;;;64107:48;;64193:11;64168:10;64179;64168:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;64304:10;64273:15;:28;64289:11;64273:28;;;;;;;;;;;:41;;;;64445:15;:24;64461:7;64445:24;;;;;;;;;;;64438:31;;;64480:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;63496:1008;;;63425:1079;:::o;60929:221::-;61014:14;61031:20;61048:2;61031:16;:20::i;:::-;61014:37;;61089:7;61062:12;:16;61075:2;61062:16;;;;;;;;;;;;;;;:24;61079:6;61062:24;;;;;;;;;;;:34;;;;61136:6;61107:17;:26;61125:7;61107:26;;;;;;;;;;;:35;;;;61003:147;60929:221;;:::o;42801:712::-;42951:12;42980:7;42976:530;;;43011:10;43004:17;;;;42976:530;43145:1;43125:10;:17;:21;43121:374;;;43323:10;43317:17;43384:15;43371:10;43367:2;43363:19;43356:44;43121:374;43466:12;43459:20;;;;;;;;;;;:::i;:::-;;;;;;;;42801:712;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::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:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:77::-;1213:7;1242:5;1231:16;;1176:77;;;:::o;1259:118::-;1346:24;1364:5;1346:24;:::i;:::-;1341:3;1334:37;1259:118;;:::o;1383:222::-;1476:4;1514:2;1503:9;1499:18;1491:26;;1527:71;1595:1;1584:9;1580:17;1571:6;1527:71;:::i;:::-;1383:222;;;;:::o;1611:149::-;1647:7;1687:66;1680:5;1676:78;1665:89;;1611:149;;;:::o;1766:120::-;1838:23;1855:5;1838:23;:::i;:::-;1831:5;1828:34;1818:62;;1876:1;1873;1866:12;1818:62;1766:120;:::o;1892:137::-;1937:5;1975:6;1962:20;1953:29;;1991:32;2017:5;1991:32;:::i;:::-;1892:137;;;;:::o;2035:327::-;2093:6;2142:2;2130:9;2121:7;2117:23;2113:32;2110:119;;;2148:79;;:::i;:::-;2110:119;2268:1;2293:52;2337:7;2328:6;2317:9;2313:22;2293:52;:::i;:::-;2283:62;;2239:116;2035:327;;;;:::o;2368:90::-;2402:7;2445:5;2438:13;2431:21;2420:32;;2368:90;;;:::o;2464:109::-;2545:21;2560:5;2545:21;:::i;:::-;2540:3;2533:34;2464:109;;:::o;2579:210::-;2666:4;2704:2;2693:9;2689:18;2681:26;;2717:65;2779:1;2768:9;2764:17;2755:6;2717:65;:::i;:::-;2579:210;;;;:::o;2795:99::-;2847:6;2881:5;2875:12;2865:22;;2795:99;;;:::o;2900:169::-;2984:11;3018:6;3013:3;3006:19;3058:4;3053:3;3049:14;3034:29;;2900:169;;;;:::o;3075:307::-;3143:1;3153:113;3167:6;3164:1;3161:13;3153:113;;;3252:1;3247:3;3243:11;3237:18;3233:1;3228:3;3224:11;3217:39;3189:2;3186:1;3182:10;3177:15;;3153:113;;;3284:6;3281:1;3278:13;3275:101;;;3364:1;3355:6;3350:3;3346:16;3339:27;3275:101;3124:258;3075:307;;;:::o;3388:102::-;3429:6;3480:2;3476:7;3471:2;3464:5;3460:14;3456:28;3446:38;;3388:102;;;:::o;3496:364::-;3584:3;3612:39;3645:5;3612:39;:::i;:::-;3667:71;3731:6;3726:3;3667:71;:::i;:::-;3660:78;;3747:52;3792:6;3787:3;3780:4;3773:5;3769:16;3747:52;:::i;:::-;3824:29;3846:6;3824:29;:::i;:::-;3819:3;3815:39;3808:46;;3588:272;3496:364;;;;:::o;3866:313::-;3979:4;4017:2;4006:9;4002:18;3994:26;;4066:9;4060:4;4056:20;4052:1;4041:9;4037:17;4030:47;4094:78;4167:4;4158:6;4094:78;:::i;:::-;4086:86;;3866:313;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:329::-;4517:6;4566:2;4554:9;4545:7;4541:23;4537:32;4534:119;;;4572:79;;:::i;:::-;4534:119;4692:1;4717:53;4762:7;4753:6;4742:9;4738:22;4717:53;:::i;:::-;4707:63;;4663:117;4458:329;;;;:::o;4793:118::-;4880:24;4898:5;4880:24;:::i;:::-;4875:3;4868:37;4793:118;;:::o;4917:222::-;5010:4;5048:2;5037:9;5033:18;5025:26;;5061:71;5129:1;5118:9;5114:17;5105:6;5061:71;:::i;:::-;4917:222;;;;:::o;5145:474::-;5213:6;5221;5270:2;5258:9;5249:7;5245:23;5241:32;5238:119;;;5276:79;;:::i;:::-;5238:119;5396:1;5421:53;5466:7;5457:6;5446:9;5442:22;5421:53;:::i;:::-;5411:63;;5367:117;5523:2;5549:53;5594:7;5585:6;5574:9;5570:22;5549:53;:::i;:::-;5539:63;;5494:118;5145:474;;;;;:::o;5625:619::-;5702:6;5710;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5991:118;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;5625:619;;;;;:::o;6250:117::-;6359:1;6356;6349:12;6373:117;6482:1;6479;6472:12;6496:117;6605:1;6602;6595:12;6636:568;6709:8;6719:6;6769:3;6762:4;6754:6;6750:17;6746:27;6736:122;;6777:79;;:::i;:::-;6736:122;6890:6;6877:20;6867:30;;6920:18;6912:6;6909:30;6906:117;;;6942:79;;:::i;:::-;6906:117;7056:4;7048:6;7044:17;7032:29;;7110:3;7102:4;7094:6;7090:17;7080:8;7076:32;7073:41;7070:128;;;7117:79;;:::i;:::-;7070:128;6636:568;;;;;:::o;7210:559::-;7296:6;7304;7353:2;7341:9;7332:7;7328:23;7324:32;7321:119;;;7359:79;;:::i;:::-;7321:119;7507:1;7496:9;7492:17;7479:31;7537:18;7529:6;7526:30;7523:117;;;7559:79;;:::i;:::-;7523:117;7672:80;7744:7;7735:6;7724:9;7720:22;7672:80;:::i;:::-;7654:98;;;;7450:312;7210:559;;;;;:::o;7775:114::-;7842:6;7876:5;7870:12;7860:22;;7775:114;;;:::o;7895:184::-;7994:11;8028:6;8023:3;8016:19;8068:4;8063:3;8059:14;8044:29;;7895:184;;;;:::o;8085:132::-;8152:4;8175:3;8167:11;;8205:4;8200:3;8196:14;8188:22;;8085:132;;;:::o;8223:108::-;8300:24;8318:5;8300:24;:::i;:::-;8295:3;8288:37;8223:108;;:::o;8337:179::-;8406:10;8427:46;8469:3;8461:6;8427:46;:::i;:::-;8505:4;8500:3;8496:14;8482:28;;8337:179;;;;:::o;8522:113::-;8592:4;8624;8619:3;8615:14;8607:22;;8522:113;;;:::o;8671:732::-;8790:3;8819:54;8867:5;8819:54;:::i;:::-;8889:86;8968:6;8963:3;8889:86;:::i;:::-;8882:93;;8999:56;9049:5;8999:56;:::i;:::-;9078:7;9109:1;9094:284;9119:6;9116:1;9113:13;9094:284;;;9195:6;9189:13;9222:63;9281:3;9266:13;9222:63;:::i;:::-;9215:70;;9308:60;9361:6;9308:60;:::i;:::-;9298:70;;9154:224;9141:1;9138;9134:9;9129:14;;9094:284;;;9098:14;9394:3;9387:10;;8795:608;;;8671:732;;;;:::o;9409:373::-;9552:4;9590:2;9579:9;9575:18;9567:26;;9639:9;9633:4;9629:20;9625:1;9614:9;9610:17;9603:47;9667:108;9770:4;9761:6;9667:108;:::i;:::-;9659:116;;9409:373;;;;:::o;9802:553::-;9860:8;9870:6;9920:3;9913:4;9905:6;9901:17;9897:27;9887:122;;9928:79;;:::i;:::-;9887:122;10041:6;10028:20;10018:30;;10071:18;10063:6;10060:30;10057:117;;;10093:79;;:::i;:::-;10057:117;10207:4;10199:6;10195:17;10183:29;;10261:3;10253:4;10245:6;10241:17;10231:8;10227:32;10224:41;10221:128;;;10268:79;;:::i;:::-;10221:128;9802:553;;;;;:::o;10361:529::-;10432:6;10440;10489:2;10477:9;10468:7;10464:23;10460:32;10457:119;;;10495:79;;:::i;:::-;10457:119;10643:1;10632:9;10628:17;10615:31;10673:18;10665:6;10662:30;10659:117;;;10695:79;;:::i;:::-;10659:117;10808:65;10865:7;10856:6;10845:9;10841:22;10808:65;:::i;:::-;10790:83;;;;10586:297;10361:529;;;;;:::o;10896:116::-;10966:21;10981:5;10966:21;:::i;:::-;10959:5;10956:32;10946:60;;11002:1;10999;10992:12;10946:60;10896:116;:::o;11018:133::-;11061:5;11099:6;11086:20;11077:29;;11115:30;11139:5;11115:30;:::i;:::-;11018:133;;;;:::o;11157:468::-;11222:6;11230;11279:2;11267:9;11258:7;11254:23;11250:32;11247:119;;;11285:79;;:::i;:::-;11247:119;11405:1;11430:53;11475:7;11466:6;11455:9;11451:22;11430:53;:::i;:::-;11420:63;;11376:117;11532:2;11558:50;11600:7;11591:6;11580:9;11576:22;11558:50;:::i;:::-;11548:60;;11503:115;11157:468;;;;;:::o;11631:117::-;11740:1;11737;11730:12;11754:180;11802:77;11799:1;11792:88;11899:4;11896:1;11889:15;11923:4;11920:1;11913:15;11940:281;12023:27;12045:4;12023:27;:::i;:::-;12015:6;12011:40;12153:6;12141:10;12138:22;12117:18;12105:10;12102:34;12099:62;12096:88;;;12164:18;;:::i;:::-;12096:88;12204:10;12200:2;12193:22;11983:238;11940:281;;:::o;12227:129::-;12261:6;12288:20;;:::i;:::-;12278:30;;12317:33;12345:4;12337:6;12317:33;:::i;:::-;12227:129;;;:::o;12362:307::-;12423:4;12513:18;12505:6;12502:30;12499:56;;;12535:18;;:::i;:::-;12499:56;12573:29;12595:6;12573:29;:::i;:::-;12565:37;;12657:4;12651;12647:15;12639:23;;12362:307;;;:::o;12675:154::-;12759:6;12754:3;12749;12736:30;12821:1;12812:6;12807:3;12803:16;12796:27;12675:154;;;:::o;12835:410::-;12912:5;12937:65;12953:48;12994:6;12953:48;:::i;:::-;12937:65;:::i;:::-;12928:74;;13025:6;13018:5;13011:21;13063:4;13056:5;13052:16;13101:3;13092:6;13087:3;13083:16;13080:25;13077:112;;;13108:79;;:::i;:::-;13077:112;13198:41;13232:6;13227:3;13222;13198:41;:::i;:::-;12918:327;12835:410;;;;;:::o;13264:338::-;13319:5;13368:3;13361:4;13353:6;13349:17;13345:27;13335:122;;13376:79;;:::i;:::-;13335:122;13493:6;13480:20;13518:78;13592:3;13584:6;13577:4;13569:6;13565:17;13518:78;:::i;:::-;13509:87;;13325:277;13264:338;;;;:::o;13608:943::-;13703:6;13711;13719;13727;13776:3;13764:9;13755:7;13751:23;13747:33;13744:120;;;13783:79;;:::i;:::-;13744:120;13903:1;13928:53;13973:7;13964:6;13953:9;13949:22;13928:53;:::i;:::-;13918:63;;13874:117;14030:2;14056:53;14101:7;14092:6;14081:9;14077:22;14056:53;:::i;:::-;14046:63;;14001:118;14158:2;14184:53;14229:7;14220:6;14209:9;14205:22;14184:53;:::i;:::-;14174:63;;14129:118;14314:2;14303:9;14299:18;14286:32;14345:18;14337:6;14334:30;14331:117;;;14367:79;;:::i;:::-;14331:117;14472:62;14526:7;14517:6;14506:9;14502:22;14472:62;:::i;:::-;14462:72;;14257:287;13608:943;;;;;;;:::o;14557:111::-;14609:7;14638:24;14656:5;14638:24;:::i;:::-;14627:35;;14557:111;;;:::o;14674:152::-;14762:39;14795:5;14762:39;:::i;:::-;14755:5;14752:50;14742:78;;14816:1;14813;14806:12;14742:78;14674:152;:::o;14832:169::-;14893:5;14931:6;14918:20;14909:29;;14947:48;14989:5;14947:48;:::i;:::-;14832:169;;;;:::o;15007:504::-;15090:6;15098;15147:2;15135:9;15126:7;15122:23;15118:32;15115:119;;;15153:79;;:::i;:::-;15115:119;15273:1;15298:68;15358:7;15349:6;15338:9;15334:22;15298:68;:::i;:::-;15288:78;;15244:132;15415:2;15441:53;15486:7;15477:6;15466:9;15462:22;15441:53;:::i;:::-;15431:63;;15386:118;15007:504;;;;;:::o;15517:474::-;15585:6;15593;15642:2;15630:9;15621:7;15617:23;15613:32;15610:119;;;15648:79;;:::i;:::-;15610:119;15768:1;15793:53;15838:7;15829:6;15818:9;15814:22;15793:53;:::i;:::-;15783:63;;15739:117;15895:2;15921:53;15966:7;15957:6;15946:9;15942:22;15921:53;:::i;:::-;15911:63;;15866:118;15517:474;;;;;:::o;15997:180::-;16137:32;16133:1;16125:6;16121:14;16114:56;15997:180;:::o;16183:366::-;16325:3;16346:67;16410:2;16405:3;16346:67;:::i;:::-;16339:74;;16422:93;16511:3;16422:93;:::i;:::-;16540:2;16535:3;16531:12;16524:19;;16183:366;;;:::o;16555:419::-;16721:4;16759:2;16748:9;16744:18;16736:26;;16808:9;16802:4;16798:20;16794:1;16783:9;16779:17;16772:47;16836:131;16962:4;16836:131;:::i;:::-;16828:139;;16555:419;;;:::o;16980:182::-;17120:34;17116:1;17108:6;17104:14;17097:58;16980:182;:::o;17168:366::-;17310:3;17331:67;17395:2;17390:3;17331:67;:::i;:::-;17324:74;;17407:93;17496:3;17407:93;:::i;:::-;17525:2;17520:3;17516:12;17509:19;;17168:366;;;:::o;17540:419::-;17706:4;17744:2;17733:9;17729:18;17721:26;;17793:9;17787:4;17783:20;17779:1;17768:9;17764:17;17757:47;17821:131;17947:4;17821:131;:::i;:::-;17813:139;;17540:419;;;:::o;17965:180::-;18013:77;18010:1;18003:88;18110:4;18107:1;18100:15;18134:4;18131:1;18124:15;18151:320;18195:6;18232:1;18226:4;18222:12;18212:22;;18279:1;18273:4;18269:12;18300:18;18290:81;;18356:4;18348:6;18344:17;18334:27;;18290:81;18418:2;18410:6;18407:14;18387:18;18384:38;18381:84;;18437:18;;:::i;:::-;18381:84;18202:269;18151:320;;;:::o;18477:231::-;18617:34;18613:1;18605:6;18601:14;18594:58;18686:14;18681:2;18673:6;18669:15;18662:39;18477:231;:::o;18714:366::-;18856:3;18877:67;18941:2;18936:3;18877:67;:::i;:::-;18870:74;;18953:93;19042:3;18953:93;:::i;:::-;19071:2;19066:3;19062:12;19055:19;;18714:366;;;:::o;19086:419::-;19252:4;19290:2;19279:9;19275:18;19267:26;;19339:9;19333:4;19329:20;19325:1;19314:9;19310:17;19303:47;19367:131;19493:4;19367:131;:::i;:::-;19359:139;;19086:419;;;:::o;19511:220::-;19651:34;19647:1;19639:6;19635:14;19628:58;19720:3;19715:2;19707:6;19703:15;19696:28;19511:220;:::o;19737:366::-;19879:3;19900:67;19964:2;19959:3;19900:67;:::i;:::-;19893:74;;19976:93;20065:3;19976:93;:::i;:::-;20094:2;20089:3;20085:12;20078:19;;19737:366;;;:::o;20109:419::-;20275:4;20313:2;20302:9;20298:18;20290:26;;20362:9;20356:4;20352:20;20348:1;20337:9;20333:17;20326:47;20390:131;20516:4;20390:131;:::i;:::-;20382:139;;20109:419;;;:::o;20534:243::-;20674:34;20670:1;20662:6;20658:14;20651:58;20743:26;20738:2;20730:6;20726:15;20719:51;20534:243;:::o;20783:366::-;20925:3;20946:67;21010:2;21005:3;20946:67;:::i;:::-;20939:74;;21022:93;21111:3;21022:93;:::i;:::-;21140:2;21135:3;21131:12;21124:19;;20783:366;;;:::o;21155:419::-;21321:4;21359:2;21348:9;21344:18;21336:26;;21408:9;21402:4;21398:20;21394:1;21383:9;21379:17;21372:47;21436:131;21562:4;21436:131;:::i;:::-;21428:139;;21155:419;;;:::o;21580:169::-;21720:21;21716:1;21708:6;21704:14;21697:45;21580:169;:::o;21755:366::-;21897:3;21918:67;21982:2;21977:3;21918:67;:::i;:::-;21911:74;;21994:93;22083:3;21994:93;:::i;:::-;22112:2;22107:3;22103:12;22096:19;;21755:366;;;:::o;22127:419::-;22293:4;22331:2;22320:9;22316:18;22308:26;;22380:9;22374:4;22370:20;22366:1;22355:9;22351:17;22344:47;22408:131;22534:4;22408:131;:::i;:::-;22400:139;;22127:419;;;:::o;22552:180::-;22600:77;22597:1;22590:88;22697:4;22694:1;22687:15;22721:4;22718:1;22711:15;22738:305;22778:3;22797:20;22815:1;22797:20;:::i;:::-;22792:25;;22831:20;22849:1;22831:20;:::i;:::-;22826:25;;22985:1;22917:66;22913:74;22910:1;22907:81;22904:107;;;22991:18;;:::i;:::-;22904:107;23035:1;23032;23028:9;23021:16;;22738:305;;;;:::o;23049:168::-;23189:20;23185:1;23177:6;23173:14;23166:44;23049:168;:::o;23223:366::-;23365:3;23386:67;23450:2;23445:3;23386:67;:::i;:::-;23379:74;;23462:93;23551:3;23462:93;:::i;:::-;23580:2;23575:3;23571:12;23564:19;;23223:366;;;:::o;23595:419::-;23761:4;23799:2;23788:9;23784:18;23776:26;;23848:9;23842:4;23838:20;23834:1;23823:9;23819:17;23812:47;23876:131;24002:4;23876:131;:::i;:::-;23868:139;;23595:419;;;:::o;24020:181::-;24160:33;24156:1;24148:6;24144:14;24137:57;24020:181;:::o;24207:366::-;24349:3;24370:67;24434:2;24429:3;24370:67;:::i;:::-;24363:74;;24446:93;24535:3;24446:93;:::i;:::-;24564:2;24559:3;24555:12;24548:19;;24207:366;;;:::o;24579:419::-;24745:4;24783:2;24772:9;24768:18;24760:26;;24832:9;24826:4;24822:20;24818:1;24807:9;24803:17;24796:47;24860:131;24986:4;24860:131;:::i;:::-;24852:139;;24579:419;;;:::o;25004:233::-;25043:3;25066:24;25084:5;25066:24;:::i;:::-;25057:33;;25112:66;25105:5;25102:77;25099:103;;25182:18;;:::i;:::-;25099:103;25229:1;25222:5;25218:13;25211:20;;25004:233;;;:::o;25243:229::-;25383:34;25379:1;25371:6;25367:14;25360:58;25452:12;25447:2;25439:6;25435:15;25428:37;25243:229;:::o;25478:366::-;25620:3;25641:67;25705:2;25700:3;25641:67;:::i;:::-;25634:74;;25717:93;25806:3;25717:93;:::i;:::-;25835:2;25830:3;25826:12;25819:19;;25478:366;;;:::o;25850:419::-;26016:4;26054:2;26043:9;26039:18;26031:26;;26103:9;26097:4;26093:20;26089:1;26078:9;26074:17;26067:47;26131:131;26257:4;26131:131;:::i;:::-;26123:139;;25850:419;;;:::o;26275:332::-;26396:4;26434:2;26423:9;26419:18;26411:26;;26447:71;26515:1;26504:9;26500:17;26491:6;26447:71;:::i;:::-;26528:72;26596:2;26585:9;26581:18;26572:6;26528:72;:::i;:::-;26275:332;;;;;:::o;26613:137::-;26667:5;26698:6;26692:13;26683:22;;26714:30;26738:5;26714:30;:::i;:::-;26613:137;;;;:::o;26756:345::-;26823:6;26872:2;26860:9;26851:7;26847:23;26843:32;26840:119;;;26878:79;;:::i;:::-;26840:119;26998:1;27023:61;27076:7;27067:6;27056:9;27052:22;27023:61;:::i;:::-;27013:71;;26969:125;26756:345;;;;:::o;27107:175::-;27247:27;27243:1;27235:6;27231:14;27224:51;27107:175;:::o;27288:366::-;27430:3;27451:67;27515:2;27510:3;27451:67;:::i;:::-;27444:74;;27527:93;27616:3;27527:93;:::i;:::-;27645:2;27640:3;27636:12;27629:19;;27288:366;;;:::o;27660:419::-;27826:4;27864:2;27853:9;27849:18;27841:26;;27913:9;27907:4;27903:20;27899:1;27888:9;27884:17;27877:47;27941:131;28067:4;27941:131;:::i;:::-;27933:139;;27660:419;;;:::o;28085:172::-;28225:24;28221:1;28213:6;28209:14;28202:48;28085:172;:::o;28263:366::-;28405:3;28426:67;28490:2;28485:3;28426:67;:::i;:::-;28419:74;;28502:93;28591:3;28502:93;:::i;:::-;28620:2;28615:3;28611:12;28604:19;;28263:366;;;:::o;28635:419::-;28801:4;28839:2;28828:9;28824:18;28816:26;;28888:9;28882:4;28878:20;28874:1;28863:9;28859:17;28852:47;28916:131;29042:4;28916:131;:::i;:::-;28908:139;;28635:419;;;:::o;29060:179::-;29200:31;29196:1;29188:6;29184:14;29177:55;29060:179;:::o;29245:366::-;29387:3;29408:67;29472:2;29467:3;29408:67;:::i;:::-;29401:74;;29484:93;29573:3;29484:93;:::i;:::-;29602:2;29597:3;29593:12;29586:19;;29245:366;;;:::o;29617:419::-;29783:4;29821:2;29810:9;29806:18;29798:26;;29870:9;29864:4;29860:20;29856:1;29845:9;29841:17;29834:47;29898:131;30024:4;29898:131;:::i;:::-;29890:139;;29617:419;;;:::o;30042:230::-;30182:34;30178:1;30170:6;30166:14;30159:58;30251:13;30246:2;30238:6;30234:15;30227:38;30042:230;:::o;30278:366::-;30420:3;30441:67;30505:2;30500:3;30441:67;:::i;:::-;30434:74;;30517:93;30606:3;30517:93;:::i;:::-;30635:2;30630:3;30626:12;30619:19;;30278:366;;;:::o;30650:419::-;30816:4;30854:2;30843:9;30839:18;30831:26;;30903:9;30897:4;30893:20;30889:1;30878:9;30874:17;30867:47;30931:131;31057:4;30931:131;:::i;:::-;30923:139;;30650:419;;;:::o;31075:231::-;31215:34;31211:1;31203:6;31199:14;31192:58;31284:14;31279:2;31271:6;31267:15;31260:39;31075:231;:::o;31312:366::-;31454:3;31475:67;31539:2;31534:3;31475:67;:::i;:::-;31468:74;;31551:93;31640:3;31551:93;:::i;:::-;31669:2;31664:3;31660:12;31653:19;;31312:366;;;:::o;31684:419::-;31850:4;31888:2;31877:9;31873:18;31865:26;;31937:9;31931:4;31927:20;31923:1;31912:9;31908:17;31901:47;31965:131;32091:4;31965:131;:::i;:::-;31957:139;;31684:419;;;:::o;32109:180::-;32157:77;32154:1;32147:88;32254:4;32251:1;32244:15;32278:4;32275:1;32268:15;32295:228;32435:34;32431:1;32423:6;32419:14;32412:58;32504:11;32499:2;32491:6;32487:15;32480:36;32295:228;:::o;32529:366::-;32671:3;32692:67;32756:2;32751:3;32692:67;:::i;:::-;32685:74;;32768:93;32857:3;32768:93;:::i;:::-;32886:2;32881:3;32877:12;32870:19;;32529:366;;;:::o;32901:419::-;33067:4;33105:2;33094:9;33090:18;33082:26;;33154:9;33148:4;33144:20;33140:1;33129:9;33125:17;33118:47;33182:131;33308:4;33182:131;:::i;:::-;33174:139;;32901:419;;;:::o;33326:176::-;33466:28;33462:1;33454:6;33450:14;33443:52;33326:176;:::o;33508:366::-;33650:3;33671:67;33735:2;33730:3;33671:67;:::i;:::-;33664:74;;33747:93;33836:3;33747:93;:::i;:::-;33865:2;33860:3;33856:12;33849:19;;33508:366;;;:::o;33880:419::-;34046:4;34084:2;34073:9;34069:18;34061:26;;34133:9;34127:4;34123:20;34119:1;34108:9;34104:17;34097:47;34161:131;34287:4;34161:131;:::i;:::-;34153:139;;33880:419;;;:::o;34305:234::-;34445:34;34441:1;34433:6;34429:14;34422:58;34514:17;34509:2;34501:6;34497:15;34490:42;34305:234;:::o;34545:366::-;34687:3;34708:67;34772:2;34767:3;34708:67;:::i;:::-;34701:74;;34784:93;34873:3;34784:93;:::i;:::-;34902:2;34897:3;34893:12;34886:19;;34545:366;;;:::o;34917:419::-;35083:4;35121:2;35110:9;35106:18;35098:26;;35170:9;35164:4;35160:20;35156:1;35145:9;35141:17;35134:47;35198:131;35324:4;35198:131;:::i;:::-;35190:139;;34917:419;;;:::o;35342:148::-;35444:11;35481:3;35466:18;;35342:148;;;;:::o;35496:377::-;35602:3;35630:39;35663:5;35630:39;:::i;:::-;35685:89;35767:6;35762:3;35685:89;:::i;:::-;35678:96;;35783:52;35828:6;35823:3;35816:4;35809:5;35805:16;35783:52;:::i;:::-;35860:6;35855:3;35851:16;35844:23;;35606:267;35496:377;;;;:::o;35879:435::-;36059:3;36081:95;36172:3;36163:6;36081:95;:::i;:::-;36074:102;;36193:95;36284:3;36275:6;36193:95;:::i;:::-;36186:102;;36305:3;36298:10;;35879:435;;;;;:::o;36320:225::-;36460:34;36456:1;36448:6;36444:14;36437:58;36529:8;36524:2;36516:6;36512:15;36505:33;36320:225;:::o;36551:366::-;36693:3;36714:67;36778:2;36773:3;36714:67;:::i;:::-;36707:74;;36790:93;36879:3;36790:93;:::i;:::-;36908:2;36903:3;36899:12;36892:19;;36551:366;;;:::o;36923:419::-;37089:4;37127:2;37116:9;37112:18;37104:26;;37176:9;37170:4;37166:20;37162:1;37151:9;37147:17;37140:47;37204:131;37330:4;37204:131;:::i;:::-;37196:139;;36923:419;;;:::o;37348:160::-;37488:12;37484:1;37476:6;37472:14;37465:36;37348:160;:::o;37514:366::-;37656:3;37677:67;37741:2;37736:3;37677:67;:::i;:::-;37670:74;;37753:93;37842:3;37753:93;:::i;:::-;37871:2;37866:3;37862:12;37855:19;;37514:366;;;:::o;37886:419::-;38052:4;38090:2;38079:9;38075:18;38067:26;;38139:9;38133:4;38129:20;38125:1;38114:9;38110:17;38103:47;38167:131;38293:4;38167:131;:::i;:::-;38159:139;;37886:419;;;:::o;38311:191::-;38351:4;38371:20;38389:1;38371:20;:::i;:::-;38366:25;;38405:20;38423:1;38405:20;:::i;:::-;38400:25;;38444:1;38441;38438:8;38435:34;;;38449:18;;:::i;:::-;38435:34;38494:1;38491;38487:9;38479:17;;38311:191;;;;:::o;38508:180::-;38556:77;38553:1;38546:88;38653:4;38650:1;38643:15;38677:4;38674:1;38667:15;38694:176;38726:1;38743:20;38761:1;38743:20;:::i;:::-;38738:25;;38777:20;38795:1;38777:20;:::i;:::-;38772:25;;38816:1;38806:35;;38821:18;;:::i;:::-;38806:35;38862:1;38859;38855:9;38850:14;;38694:176;;;;:::o;38876:236::-;39016:34;39012:1;39004:6;39000:14;38993:58;39085:19;39080:2;39072:6;39068:15;39061:44;38876:236;:::o;39118:366::-;39260:3;39281:67;39345:2;39340:3;39281:67;:::i;:::-;39274:74;;39357:93;39446:3;39357:93;:::i;:::-;39475:2;39470:3;39466:12;39459:19;;39118:366;;;:::o;39490:419::-;39656:4;39694:2;39683:9;39679:18;39671:26;;39743:9;39737:4;39733:20;39729:1;39718:9;39714:17;39707:47;39771:131;39897:4;39771:131;:::i;:::-;39763:139;;39490:419;;;:::o;39915:175::-;40055:27;40051:1;40043:6;40039:14;40032:51;39915:175;:::o;40096:366::-;40238:3;40259:67;40323:2;40318:3;40259:67;:::i;:::-;40252:74;;40335:93;40424:3;40335:93;:::i;:::-;40453:2;40448:3;40444:12;40437:19;;40096:366;;;:::o;40468:419::-;40634:4;40672:2;40661:9;40657:18;40649:26;;40721:9;40715:4;40711:20;40707:1;40696:9;40692:17;40685:47;40749:131;40875:4;40749:131;:::i;:::-;40741:139;;40468:419;;;:::o;40893:332::-;41014:4;41052:2;41041:9;41037:18;41029:26;;41065:71;41133:1;41122:9;41118:17;41109:6;41065:71;:::i;:::-;41146:72;41214:2;41203:9;41199:18;41190:6;41146:72;:::i;:::-;40893:332;;;;;:::o;41231:185::-;41271:1;41288:20;41306:1;41288:20;:::i;:::-;41283:25;;41322:20;41340:1;41322:20;:::i;:::-;41317:25;;41361:1;41351:35;;41366:18;;:::i;:::-;41351:35;41408:1;41405;41401:9;41396:14;;41231:185;;;;:::o;41422:79::-;41461:7;41490:5;41479:16;;41422:79;;;:::o;41507:157::-;41612:45;41632:24;41650:5;41632:24;:::i;:::-;41612:45;:::i;:::-;41607:3;41600:58;41507:157;;:::o;41670:397::-;41810:3;41825:75;41896:3;41887:6;41825:75;:::i;:::-;41925:2;41920:3;41916:12;41909:19;;41938:75;42009:3;42000:6;41938:75;:::i;:::-;42038:2;42033:3;42029:12;42022:19;;42058:3;42051:10;;41670:397;;;;;:::o;42073:237::-;42213:34;42209:1;42201:6;42197:14;42190:58;42282:20;42277:2;42269:6;42265:15;42258:45;42073:237;:::o;42316:366::-;42458:3;42479:67;42543:2;42538:3;42479:67;:::i;:::-;42472:74;;42555:93;42644:3;42555:93;:::i;:::-;42673:2;42668:3;42664:12;42657:19;;42316:366;;;:::o;42688:419::-;42854:4;42892:2;42881:9;42877:18;42869:26;;42941:9;42935:4;42931:20;42927:1;42916:9;42912:17;42905:47;42969:131;43095:4;42969:131;:::i;:::-;42961:139;;42688:419;;;:::o;43113:231::-;43253:34;43249:1;43241:6;43237:14;43230:58;43322:14;43317:2;43309:6;43305:15;43298:39;43113:231;:::o;43350:366::-;43492:3;43513:67;43577:2;43572:3;43513:67;:::i;:::-;43506:74;;43589:93;43678:3;43589:93;:::i;:::-;43707:2;43702:3;43698:12;43691:19;;43350:366;;;:::o;43722:419::-;43888:4;43926:2;43915:9;43911:18;43903:26;;43975:9;43969:4;43965:20;43961:1;43950:9;43946:17;43939:47;44003:131;44129:4;44003:131;:::i;:::-;43995:139;;43722:419;;;:::o;44147:228::-;44287:34;44283:1;44275:6;44271:14;44264:58;44356:11;44351:2;44343:6;44339:15;44332:36;44147:228;:::o;44381:366::-;44523:3;44544:67;44608:2;44603:3;44544:67;:::i;:::-;44537:74;;44620:93;44709:3;44620:93;:::i;:::-;44738:2;44733:3;44729:12;44722:19;;44381:366;;;:::o;44753:419::-;44919:4;44957:2;44946:9;44942:18;44934:26;;45006:9;45000:4;44996:20;44992:1;44981:9;44977:17;44970:47;45034:131;45160:4;45034:131;:::i;:::-;45026:139;;44753:419;;;:::o;45178:223::-;45318:34;45314:1;45306:6;45302:14;45295:58;45387:6;45382:2;45374:6;45370:15;45363:31;45178:223;:::o;45407:366::-;45549:3;45570:67;45634:2;45629:3;45570:67;:::i;:::-;45563:74;;45646:93;45735:3;45646:93;:::i;:::-;45764:2;45759:3;45755:12;45748:19;;45407:366;;;:::o;45779:419::-;45945:4;45983:2;45972:9;45968:18;45960:26;;46032:9;46026:4;46022:20;46018:1;46007:9;46003:17;45996:47;46060:131;46186:4;46060:131;:::i;:::-;46052:139;;45779:419;;;:::o;46204:229::-;46344:34;46340:1;46332:6;46328:14;46321:58;46413:12;46408:2;46400:6;46396:15;46389:37;46204:229;:::o;46439:366::-;46581:3;46602:67;46666:2;46661:3;46602:67;:::i;:::-;46595:74;;46678:93;46767:3;46678:93;:::i;:::-;46796:2;46791:3;46787:12;46780:19;;46439:366;;;:::o;46811:419::-;46977:4;47015:2;47004:9;47000:18;46992:26;;47064:9;47058:4;47054:20;47050:1;47039:9;47035:17;47028:47;47092:131;47218:4;47092:131;:::i;:::-;47084:139;;46811:419;;;:::o;47236:182::-;47376:34;47372:1;47364:6;47360:14;47353:58;47236:182;:::o;47424:366::-;47566:3;47587:67;47651:2;47646:3;47587:67;:::i;:::-;47580:74;;47663:93;47752:3;47663:93;:::i;:::-;47781:2;47776:3;47772:12;47765:19;;47424:366;;;:::o;47796:419::-;47962:4;48000:2;47989:9;47985:18;47977:26;;48049:9;48043:4;48039:20;48035:1;48024:9;48020:17;48013:47;48077:131;48203:4;48077:131;:::i;:::-;48069:139;;47796:419;;;:::o;48221:178::-;48361:30;48357:1;48349:6;48345:14;48338:54;48221:178;:::o;48405:366::-;48547:3;48568:67;48632:2;48627:3;48568:67;:::i;:::-;48561:74;;48644:93;48733:3;48644:93;:::i;:::-;48762:2;48757:3;48753:12;48746:19;;48405:366;;;:::o;48777:419::-;48943:4;48981:2;48970:9;48966:18;48958:26;;49030:9;49024:4;49020:20;49016:1;49005:9;49001:17;48994:47;49058:131;49184:4;49058:131;:::i;:::-;49050:139;;48777:419;;;:::o;49202:98::-;49253:6;49287:5;49281:12;49271:22;;49202:98;;;:::o;49306:168::-;49389:11;49423:6;49418:3;49411:19;49463:4;49458:3;49454:14;49439:29;;49306:168;;;;:::o;49480:360::-;49566:3;49594:38;49626:5;49594:38;:::i;:::-;49648:70;49711:6;49706:3;49648:70;:::i;:::-;49641:77;;49727:52;49772:6;49767:3;49760:4;49753:5;49749:16;49727:52;:::i;:::-;49804:29;49826:6;49804:29;:::i;:::-;49799:3;49795:39;49788:46;;49570:270;49480:360;;;;:::o;49846:640::-;50041:4;50079:3;50068:9;50064:19;50056:27;;50093:71;50161:1;50150:9;50146:17;50137:6;50093:71;:::i;:::-;50174:72;50242:2;50231:9;50227:18;50218:6;50174:72;:::i;:::-;50256;50324:2;50313:9;50309:18;50300:6;50256:72;:::i;:::-;50375:9;50369:4;50365:20;50360:2;50349:9;50345:18;50338:48;50403:76;50474:4;50465:6;50403:76;:::i;:::-;50395:84;;49846:640;;;;;;;:::o;50492:141::-;50548:5;50579:6;50573:13;50564:22;;50595:32;50621:5;50595:32;:::i;:::-;50492:141;;;;:::o;50639:349::-;50708:6;50757:2;50745:9;50736:7;50732:23;50728:32;50725:119;;;50763:79;;:::i;:::-;50725:119;50883:1;50908:63;50963:7;50954:6;50943:9;50939:22;50908:63;:::i;:::-;50898:73;;50854:127;50639:349;;;;:::o;50994:225::-;51134:34;51130:1;51122:6;51118:14;51111:58;51203:8;51198:2;51190:6;51186:15;51179:33;50994:225;:::o;51225:366::-;51367:3;51388:67;51452:2;51447:3;51388:67;:::i;:::-;51381:74;;51464:93;51553:3;51464:93;:::i;:::-;51582:2;51577:3;51573:12;51566:19;;51225:366;;;:::o;51597:419::-;51763:4;51801:2;51790:9;51786:18;51778:26;;51850:9;51844:4;51840:20;51836:1;51825:9;51821:17;51814:47;51878:131;52004:4;51878:131;:::i;:::-;51870:139;;51597:419;;;:::o;52022:179::-;52162:31;52158:1;52150:6;52146:14;52139:55;52022:179;:::o;52207:366::-;52349:3;52370:67;52434:2;52429:3;52370:67;:::i;:::-;52363:74;;52446:93;52535:3;52446:93;:::i;:::-;52564:2;52559:3;52555:12;52548:19;;52207:366;;;:::o;52579:419::-;52745:4;52783:2;52772:9;52768:18;52760:26;;52832:9;52826:4;52822:20;52818:1;52807:9;52803:17;52796:47;52860:131;52986:4;52860:131;:::i;:::-;52852:139;;52579:419;;;:::o;53004:147::-;53105:11;53142:3;53127:18;;53004:147;;;;:::o;53157:373::-;53261:3;53289:38;53321:5;53289:38;:::i;:::-;53343:88;53424:6;53419:3;53343:88;:::i;:::-;53336:95;;53440:52;53485:6;53480:3;53473:4;53466:5;53462:16;53440:52;:::i;:::-;53517:6;53512:3;53508:16;53501:23;;53265:265;53157:373;;;;:::o;53536:271::-;53666:3;53688:93;53777:3;53768:6;53688:93;:::i;:::-;53681:100;;53798:3;53791:10;;53536:271;;;;:::o;53813:180::-;53861:77;53858:1;53851:88;53958:4;53955:1;53948:15;53982:4;53979:1;53972:15

Swarm Source

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