ETH Price: $3,102.25 (-0.84%)

Token

AWorld Avatar NFT (AW)
 

Overview

Max Total Supply

1,932 AW

Holders

403

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
dono1harm.eth
Balance
1 AW
0xff6202e15773b4283dfa83d3559e70f293dd20ec
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Aworld is the first 10K NFT collection to be entirely hand-drawn - this makes every NFT in the collection 1/1 and truly unique.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Aworld

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-20
*/

// Sources flattened with hardhat v2.6.1 https://hardhat.org

// File @openzeppelin/contracts/utils/structs/[email protected]



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

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

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

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


// File @openzeppelin/contracts/utils/structs/[email protected]



pragma solidity ^0.8.0;

/**
 * @dev Library for managing an enumerable variant of Solidity's
 * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]
 * type.
 *
 * Maps have the following properties:
 *
 * - Entries are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Entries are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableMap for EnumerableMap.UintToAddressMap;
 *
 *     // Declare a set state variable
 *     EnumerableMap.UintToAddressMap private myMap;
 * }
 * ```
 *
 * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are
 * supported.
 */
library EnumerableMap {
    using EnumerableSet for EnumerableSet.Bytes32Set;

    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Map type with
    // bytes32 keys and values.
    // The Map implementation uses private functions, and user-facing
    // implementations (such as Uint256ToAddressMap) are just wrappers around
    // the underlying Map.
    // This means that we can only create new EnumerableMaps for types that fit
    // in bytes32.

    struct Map {
        // Storage of keys
        EnumerableSet.Bytes32Set _keys;
        mapping(bytes32 => bytes32) _values;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function _set(
        Map storage map,
        bytes32 key,
        bytes32 value
    ) private returns (bool) {
        map._values[key] = value;
        return map._keys.add(key);
    }

    /**
     * @dev Removes a key-value pair from a map. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function _remove(Map storage map, bytes32 key) private returns (bool) {
        delete map._values[key];
        return map._keys.remove(key);
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function _contains(Map storage map, bytes32 key) private view returns (bool) {
        return map._keys.contains(key);
    }

    /**
     * @dev Returns the number of key-value pairs in the map. O(1).
     */
    function _length(Map storage map) private view returns (uint256) {
        return map._keys.length();
    }

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

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     */
    function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {
        bytes32 value = map._values[key];
        if (value == bytes32(0)) {
            return (_contains(map, key), bytes32(0));
        } else {
            return (true, value);
        }
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function _get(Map storage map, bytes32 key) private view returns (bytes32) {
        bytes32 value = map._values[key];
        require(value != 0 || _contains(map, key), "EnumerableMap: nonexistent key");
        return value;
    }

    /**
     * @dev Same as {_get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {_tryGet}.
     */
    function _get(
        Map storage map,
        bytes32 key,
        string memory errorMessage
    ) private view returns (bytes32) {
        bytes32 value = map._values[key];
        require(value != 0 || _contains(map, key), errorMessage);
        return value;
    }

    // UintToAddressMap

    struct UintToAddressMap {
        Map _inner;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function set(
        UintToAddressMap storage map,
        uint256 key,
        address value
    ) internal returns (bool) {
        return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
    }

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

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

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

    /**
     * @dev Returns the element 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(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {
        (bytes32 key, bytes32 value) = _at(map._inner, index);
        return (uint256(key), address(uint160(uint256(value))));
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     *
     * _Available since v3.4._
     */
    function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {
        (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));
        return (success, address(uint160(uint256(value))));
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key)))));
    }

    /**
     * @dev Same as {get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryGet}.
     */
    function get(
        UintToAddressMap storage map,
        uint256 key,
        string memory errorMessage
    ) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));
    }
}


// File @openzeppelin/contracts/utils/introspection/[email protected]



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/token/ERC721/[email protected]



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/[email protected]



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/token/ERC721/extensions/[email protected]



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/[email protected]



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/[email protected]



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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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/utils/[email protected]



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/utils/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}


// File @openzeppelin/contracts/utils/math/[email protected]



pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}


// File contracts/ERC721/ERC165.sol



pragma solidity ^0.8.4;

abstract contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor() {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}


// File contracts/ERC721/ERC721.sol

// contracts/Aworld.sol


pragma solidity ^0.8.4;










contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using SafeMath for uint256;
    using Address for address;
    using EnumerableSet for EnumerableSet.UintSet;
    using EnumerableMap for EnumerableMap.UintToAddressMap;
    using Strings for uint256;

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    // Mapping from holder address to their (enumerable) set of owned tokens
    mapping(address => EnumerableSet.UintSet) private _holderTokens;

    // Enumerable mapping from token ids to their owners
    EnumerableMap.UintToAddressMap private _tokenOwners;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    // Base URI
    string private _baseURI;

    /*
     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    /*
     *     bytes4(keccak256('name()')) == 0x06fdde03
     *     bytes4(keccak256('symbol()')) == 0x95d89b41
     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
     *
     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
     */
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    /*
     *     bytes4(keccak256('totalSupply()')) == 0x18160ddd
     *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
     *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
     *
     *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
     */
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

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

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

    /**
     * @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 _holderTokens[owner].length();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return _tokenOwners.get(tokenId, 'ERC721: owner query for nonexistent token');
    }

    /**
     * @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 _tokenURI = _tokenURIs[tokenId];
        string memory base = baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(base, tokenId.toString()));
    }

    /**
     * @dev Returns the base URI set via {_setBaseURI}. This will be
     * automatically added as a prefix in {tokenURI} to each token's URI, or
     * to the token ID if no specific URI is set for that token ID.
     */
    function baseURI() public view virtual returns (string memory) {
        return _baseURI;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        return _holderTokens[owner].at(index);
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds
        return _tokenOwners.length();
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        (uint256 tokenId, ) = _tokenOwners.at(index);
        return tokenId;
    }

    /**
     * @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 || ERC721.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 {
        require(operator != _msgSender(), 'ERC721: approve to caller');

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //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 _tokenOwners.contains(tokenId);
    }

    /**
     * @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 || ERC721.isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     d*
     * - `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);

        _holderTokens[to].add(tokenId);

        _tokenOwners.set(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); // internal owner

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

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

        // Clear metadata (if any)
        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }

        _holderTokens[owner].remove(tokenId);

        _tokenOwners.remove(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'); // internal owner
        require(to != address(0), 'ERC721: transfer to the zero address');

        _beforeTokenTransfer(from, to, tokenId);

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

        _holderTokens[from].remove(tokenId);
        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), 'ERC721Metadata: URI set of nonexistent token');
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev Internal function to set the base URI for all token IDs. It is
     * automatically added as a prefix to the value returned in {tokenURI},
     * or to the token ID if {tokenURI} is empty.
     */
    function _setBaseURI(string memory baseURI_) internal virtual {
        _baseURI = baseURI_;
    }

    /**
     * @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()) {
            return true;
        }
        bytes memory returndata = to.functionCall(
            abi.encodeWithSelector(IERC721Receiver(to).onERC721Received.selector, _msgSender(), from, tokenId, _data),
            'ERC721: transfer to non ERC721Receiver implementer'
        );
        bytes4 retval = abi.decode(returndata, (bytes4));
        return (retval == _ERC721_RECEIVED);
    }

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

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

    function balanceOfCryptid(address _owner) public view returns (uint256) {
        uint256 genesisNumber = 0;
        for (uint256 i = 1; i <= 50; i++) {
            if (_holderTokens[_owner].contains(i)) {
                genesisNumber += 1;
            }
        }
        return balanceOf(_owner) - genesisNumber;
    }
}


// File contracts/AworldBase.sol

// contracts/AworldBase.sol


pragma solidity ^0.8.4;

contract AworldBase {
    /**
     * @dev Emitted when draw `tokenId` token to be redeem.
     */
    event Draw(uint256 indexed tokenId, address indexed owner, uint256 rn);
    event MintCryptid(uint256 indexed tokenId, address indexed owner, uint256 rn);

    using EnumerableSet for EnumerableSet.UintSet;
    EnumerableSet.UintSet internal _toBeRevealedCryptidAnimals;

    uint256 private nonce;

    function getToBeRevealedCryptidNumber() public view returns (uint256) {
        return _toBeRevealedCryptidAnimals.length();
    }

    // generete randan number for animal creation
    function _getRandNumber() internal returns (uint256) {
        nonce++;
        return uint256(keccak256(abi.encodePacked(block.difficulty, block.number, block.timestamp, nonce)));
    }

    function _getRNwithTokenId(uint256 tokenId) internal view returns (uint256) {
        return uint256(keccak256(abi.encodePacked(block.difficulty, block.number, block.timestamp, tokenId)));
    }
}


// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}


// File @openzeppelin/contracts/access/[email protected]



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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File @openzeppelin/contracts/security/[email protected]



pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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


// File contracts/AWorld.sol

// contracts/Aworld.sol


pragma solidity ^0.8.4;





contract Aworld is ERC721, Ownable, AworldBase, ReentrancyGuard {
    using Counters for Counters.Counter;
    using SafeMath for uint256;
    using EnumerableSet for EnumerableSet.UintSet;

    string public AW_PROVENANCE = '';

    uint256 public awGenesisPrice = 0.28 ether;
    uint256 public awCryptidPrice = 0.18 ether;
    uint256 public threeBundleCryptidPrice = 0.51 ether;
    uint256 public tenBundleCryptidPrice = 1.5 ether;

    uint256 public constant MAX_CRYPTID_PURCHASE = 10;

    uint256 public constant MAX_AWS = 10000;
    uint256 public constant MAX_GENESIS_SALE = 50;
    uint256 public constant MAX_CRYPTID_SALE = 9950;

    bool public saleIsActive = false;

    Counters.Counter public genesistokenIds;
    Counters.Counter public cryptidtokenIds;

    constructor() ERC721('AWorld Avatar NFT', 'AW') {
        for (uint256 i = 0; i < 50; i++) {
            cryptidtokenIds.increment();
        }
    }

    function tokensOfOwner(address _owner) external view returns (uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            // Return an empty array
            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;
        }
    }

    // withdraw eth from contract
    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    // return discounted price of blind aworld nft
    function _getBundleCryptidPrice(uint256 mintNumber) internal view returns (uint256) {
        uint256 bundlePrice = mintNumber * awCryptidPrice;
        if (mintNumber == 3) {
            return threeBundleCryptidPrice;
        } else if (mintNumber == 10) {
            return tenBundleCryptidPrice;
        } else {
            return bundlePrice;
        }
    }

    function changePrice(uint256 newPrice, uint8 priceType) public onlyOwner {
        require(priceType >= 0 && 3 >= priceType, 'The price type is not supported');
        if (priceType == 0) {
            awGenesisPrice = newPrice;
        } else if (priceType == 1) {
            awCryptidPrice = newPrice;
        } else if (priceType == 2) {
            threeBundleCryptidPrice = newPrice;
        } else {
            tenBundleCryptidPrice = newPrice;
        }
    }

    // mint genesis aworld animals
    function mintGenesisAW() public payable nonReentrant {
        require(saleIsActive, 'Sale must be active to mint Aworld');
        require(
            genesistokenIds.current() < MAX_GENESIS_SALE,
            'Purchase would exceed max supply of Aworld genesis animals'
        );
        require(awGenesisPrice <= msg.value, 'Ether value sent is not correct');
        genesistokenIds.increment();
        uint256 tokenId = genesistokenIds.current();
        _safeMint(msg.sender, tokenId);
        // _genesisAnimals.add(tokenId);
    }

    // mint cryptids
    function mintCryptidAW(uint256 numberOfTokens) public payable nonReentrant {
        require(saleIsActive, 'Sale must be active to mint Aworld');
        require(numberOfTokens <= MAX_CRYPTID_PURCHASE, 'Mint too much Aworld animals at a time');
        require(
            cryptidtokenIds.current() + numberOfTokens <= MAX_AWS,
            'Purchase would exceed max supply of Aworld cryptids'
        );
        require(_getBundleCryptidPrice(numberOfTokens) <= msg.value, 'Ether value sent is not correct');
        for (uint256 i = 0; i < numberOfTokens; i++) {
            cryptidtokenIds.increment();
            uint256 tokenId = cryptidtokenIds.current();
            _safeMint(msg.sender, tokenId);
            _toBeRevealedCryptidAnimals.add(tokenId);
            emit MintCryptid(tokenId, msg.sender, _getRNwithTokenId(tokenId));
        }
    }

    // draw random cryptids to reveal
    function drawAnimals(uint256 drawNumbers) public onlyOwner {
        require(drawNumbers <= getToBeRevealedCryptidNumber(), 'Not enough cryptid should be revealed');
        for (uint256 i = 0; i < drawNumbers; i++) {
            uint256 rn = _getRandNumber();
            uint256 drawId = rn.mod(getToBeRevealedCryptidNumber());
            uint256 tokenId = _toBeRevealedCryptidAnimals.at(drawId);
            _toBeRevealedCryptidAnimals.remove(tokenId);
            address owner = ownerOf(tokenId);

            emit Draw(tokenId, owner, _getRNwithTokenId(tokenId));
        }
    }

    // set provenance if all cryptids revealed
    function setProvenanceHash(string memory provenanceHash) public onlyOwner {
        AW_PROVENANCE = provenanceHash;
    }

    // set baseUri
    function setBaseURI(string memory baseURI) public onlyOwner {
        _setBaseURI(baseURI);
    }

    /*
     * Pause sale if active, make active if paused
     */
    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    // airdrop genesis aworld animals if needed
    function airdropGenesis(address receiver, uint256 amount) external onlyOwner {
        require(
            genesistokenIds.current().add(amount) <= MAX_GENESIS_SALE,
            'Airdrop amount will exceed max supply of Aworld genesis animals'
        );
        for (uint256 i = 0; i < amount; i++) {
            genesistokenIds.increment();
            uint256 tokenId = genesistokenIds.current();
            _safeMint(receiver, tokenId);
        }
    }

    // airdrop cryptids if needed
    function airdropCryptid(address receiver, uint256 amount) public onlyOwner {
        require(
            cryptidtokenIds.current().add(amount) <= MAX_AWS,
            'Airdrop amount will exceed max supply of Aworld cryptids'
        );
        for (uint256 i = 0; i < amount; i++) {
            cryptidtokenIds.increment();
            uint256 tokenId = cryptidtokenIds.current();
            _safeMint(receiver, tokenId);
            _toBeRevealedCryptidAnimals.add(tokenId);
            emit MintCryptid(tokenId, receiver, _getRNwithTokenId(tokenId));
        }
    }

    // batch airdrop cryptids if needed
    function airdropBatchCryptid(address[] memory receivers, uint256 amount) external onlyOwner {
        require(
            cryptidtokenIds.current().add(amount.mul(receivers.length)) <= MAX_AWS,
            'Airdrop amount will exceed max supply of Aworld cryptids'
        );
        for (uint256 i = 0; i < receivers.length; i++) {
            airdropCryptid(receivers[i], amount);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"rn","type":"uint256"}],"name":"Draw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"rn","type":"uint256"}],"name":"MintCryptid","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":"AW_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_AWS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_CRYPTID_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_CRYPTID_SALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_GENESIS_SALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"airdropBatchCryptid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"airdropCryptid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"airdropGenesis","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"awCryptidPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"awGenesisPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"balanceOfCryptid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"},{"internalType":"uint8","name":"priceType","type":"uint8"}],"name":"changePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cryptidtokenIds","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"drawNumbers","type":"uint256"}],"name":"drawAnimals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"genesistokenIds","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getToBeRevealedCryptidNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintCryptidAW","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintGenesisAW","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tenBundleCryptidPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"threeBundleCryptidPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250601090805190602001906200002b929190620003aa565b506703e2c284391c000060115567027f7d0bdb920000601255670713e24c437300006013556714d1120d7b1600006014556000601560006101000a81548160ff0219169083151502179055503480156200008457600080fd5b506040518060400160405280601181526020017f41576f726c6420417661746172204e46540000000000000000000000000000008152506040518060400160405280600281526020017f4157000000000000000000000000000000000000000000000000000000000000815250620001096301ffc9a760e01b620001ee60201b60201c565b816007908051906020019062000121929190620003aa565b5080600890805190602001906200013a929190620003aa565b50620001536380ac58cd60e01b620001ee60201b60201c565b6200016b635b5e139f60e01b620001ee60201b60201c565b6200018363780e9d6360e01b620001ee60201b60201c565b5050620001a562000199620002c660201b60201c565b620002ce60201b60201c565b6001600f8190555060005b6032811015620001e757620001d160176200039460201b620025e31760201c565b8080620001de90620004f4565b915050620001b0565b50620005c9565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156200025a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002519062000481565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b828054620003b890620004be565b90600052602060002090601f016020900481019282620003dc576000855562000428565b82601f10620003f757805160ff191683800117855562000428565b8280016001018555821562000428579182015b82811115620004275782518255916020019190600101906200040a565b5b5090506200043791906200043b565b5090565b5b80821115620004565760008160009055506001016200043c565b5090565b600062000469601c83620004a3565b91506200047682620005a0565b602082019050919050565b600060208201905081810360008301526200049c816200045a565b9050919050565b600082825260208201905092915050565b6000819050919050565b60006002820490506001821680620004d757607f821691505b60208210811415620004ee57620004ed62000571565b5b50919050565b60006200050182620004b4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000537576200053662000542565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4552433136353a20696e76616c696420696e7465726661636520696400000000600082015250565b61549d80620005d96000396000f3fe60806040526004361061027d5760003560e01c80636c0360eb1161014f578063a01072c9116100c1578063cd29f88e1161007a578063cd29f88e14610958578063d553688114610983578063d8739668146109ae578063e985e9c5146109d9578063eb8d244414610a16578063f2fde38b14610a415761027d565b8063a01072c91461084c578063a22cb46514610875578063a31b56b81461089e578063b88d4fde146108c7578063c451bcaa146108f0578063c87b56dd1461091b5761027d565b80638c9aa4e0116101135780638c9aa4e01461075b5780638da5cb5b14610777578063906e4efd146107a257806390b2a757146107cd57806395d89b41146107f85780639f40f1d9146108235761027d565b80636c0360eb1461066257806370a082311461068d578063715018a6146106ca5780638462151c146106e157806389285a921461071e5761027d565b806334918dfd116101f35780634a665b65116101ac5780634a665b651461053e5780634e98e34d146105695780634f6ccce71461059457806355f804b3146105d157806359fee1c8146105fa5780636352211e146106255761027d565b806334918dfd1461048757806334aa3e261461049e57806334c39c2c146104c95780633ccfd60b146104f45780633d1496ee1461050b57806342842e0e146105155761027d565b806318160ddd1161024557806318160ddd146103795780631c56f8bf146103a457806323b872dd146103cf5780632bbdf1c0146103f85780632e9f9ba1146104215780632f745c591461044a5761027d565b806301ffc9a71461028257806306fdde03146102bf578063081812fc146102ea578063095ea7b3146103275780631096952314610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613c9e565b610a6a565b6040516102b691906143f6565b60405180910390f35b3480156102cb57600080fd5b506102d4610ad1565b6040516102e19190614411565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c9190613d31565b610b63565b60405161031e919061436d565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190613c0e565b610be8565b005b34801561035c57600080fd5b5061037760048036038101906103729190613cf0565b610d00565b005b34801561038557600080fd5b5061038e610d96565b60405161039b9190614793565b60405180910390f35b3480156103b057600080fd5b506103b9610da7565b6040516103c69190614793565b60405180910390f35b3480156103db57600080fd5b506103f660048036038101906103f19190613b08565b610dad565b005b34801561040457600080fd5b5061041f600480360381019061041a9190613c0e565b610e0d565b005b34801561042d57600080fd5b5061044860048036038101906104439190613c0e565b610f9b565b005b34801561045657600080fd5b50610471600480360381019061046c9190613c0e565b6110bc565b60405161047e9190614793565b60405180910390f35b34801561049357600080fd5b5061049c611117565b005b3480156104aa57600080fd5b506104b36111bf565b6040516104c09190614793565b60405180910390f35b3480156104d557600080fd5b506104de6111c5565b6040516104eb9190614793565b60405180910390f35b34801561050057600080fd5b506105096111d6565b005b6105136112a1565b005b34801561052157600080fd5b5061053c60048036038101906105379190613b08565b6113fc565b005b34801561054a57600080fd5b5061055361141c565b6040516105609190614793565b60405180910390f35b34801561057557600080fd5b5061057e611422565b60405161058b9190614411565b60405180910390f35b3480156105a057600080fd5b506105bb60048036038101906105b69190613d31565b6114b0565b6040516105c89190614793565b60405180910390f35b3480156105dd57600080fd5b506105f860048036038101906105f39190613cf0565b6114d3565b005b34801561060657600080fd5b5061060f61155b565b60405161061c9190614793565b60405180910390f35b34801561063157600080fd5b5061064c60048036038101906106479190613d31565b611561565b604051610659919061436d565b60405180910390f35b34801561066e57600080fd5b50610677611598565b6040516106849190614411565b60405180910390f35b34801561069957600080fd5b506106b460048036038101906106af9190613aa3565b61162a565b6040516106c19190614793565b60405180910390f35b3480156106d657600080fd5b506106df6116e9565b005b3480156106ed57600080fd5b5061070860048036038101906107039190613aa3565b611771565b60405161071591906143d4565b60405180910390f35b34801561072a57600080fd5b5061074560048036038101906107409190613aa3565b6118ed565b6040516107529190614793565b60405180910390f35b61077560048036038101906107709190613d31565b611999565b005b34801561078357600080fd5b5061078c611bd7565b604051610799919061436d565b60405180910390f35b3480156107ae57600080fd5b506107b7611c01565b6040516107c49190614793565b60405180910390f35b3480156107d957600080fd5b506107e2611c07565b6040516107ef9190614793565b60405180910390f35b34801561080457600080fd5b5061080d611c0c565b60405161081a9190614411565b60405180910390f35b34801561082f57600080fd5b5061084a60048036038101906108459190613d31565b611c9e565b005b34801561085857600080fd5b50610873600480360381019061086e9190613d5a565b611e45565b005b34801561088157600080fd5b5061089c60048036038101906108979190613bd2565b611f6e565b005b3480156108aa57600080fd5b506108c560048036038101906108c09190613c4a565b6120ef565b005b3480156108d357600080fd5b506108ee60048036038101906108e99190613b57565b61224c565b005b3480156108fc57600080fd5b506109056122ae565b6040516109129190614793565b60405180910390f35b34801561092757600080fd5b50610942600480360381019061093d9190613d31565b6122b4565b60405161094f9190614411565b60405180910390f35b34801561096457600080fd5b5061096d612427565b60405161097a9190614793565b60405180910390f35b34801561098f57600080fd5b5061099861242c565b6040516109a59190614793565b60405180910390f35b3480156109ba57600080fd5b506109c3612438565b6040516109d09190614793565b60405180910390f35b3480156109e557600080fd5b50610a0060048036038101906109fb9190613acc565b612444565b604051610a0d91906143f6565b60405180910390f35b348015610a2257600080fd5b50610a2b6124d8565b604051610a3891906143f6565b60405180910390f35b348015610a4d57600080fd5b50610a686004803603810190610a639190613aa3565b6124eb565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060078054610ae090614ac0565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0c90614ac0565b8015610b595780601f10610b2e57610100808354040283529160200191610b59565b820191906000526020600020905b815481529060010190602001808311610b3c57829003601f168201915b5050505050905090565b6000610b6e826125f9565b610bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba490614693565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bf382611561565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5b90614713565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c83612616565b73ffffffffffffffffffffffffffffffffffffffff161480610cb25750610cb181610cac612616565b612444565b5b610cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce890614613565b60405180910390fd5b610cfb838361261e565b505050565b610d08612616565b73ffffffffffffffffffffffffffffffffffffffff16610d26611bd7565b73ffffffffffffffffffffffffffffffffffffffff1614610d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d73906146b3565b60405180910390fd5b8060109080519060200190610d9292919061381c565b5050565b6000610da260026126d7565b905090565b61271081565b610dbe610db8612616565b826126ec565b610dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df490614733565b60405180910390fd5b610e088383836127ca565b505050565b610e15612616565b73ffffffffffffffffffffffffffffffffffffffff16610e33611bd7565b73ffffffffffffffffffffffffffffffffffffffff1614610e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e80906146b3565b60405180910390fd5b612710610ea882610e9a60176129e1565b6129ef90919063ffffffff16565b1115610ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee090614453565b60405180910390fd5b60005b81811015610f9657610efe60176125e3565b6000610f0a60176129e1565b9050610f168482612a05565b610f2a81600c612a2390919063ffffffff16565b508373ffffffffffffffffffffffffffffffffffffffff16817f9fb22f134559ef7d3b14cd8d38e24cd4e36901e6918d22c5f631743cc0dbc1af610f6d84612a3d565b604051610f7a9190614793565b60405180910390a3508080610f8e90614b23565b915050610eec565b505050565b610fa3612616565b73ffffffffffffffffffffffffffffffffffffffff16610fc1611bd7565b73ffffffffffffffffffffffffffffffffffffffff1614611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100e906146b3565b60405180910390fd5b60326110358261102760166129e1565b6129ef90919063ffffffff16565b1115611076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106d90614573565b60405180910390fd5b60005b818110156110b75761108b60166125e3565b600061109760166129e1565b90506110a38482612a05565b5080806110af90614b23565b915050611079565b505050565b600061110f82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612a7690919063ffffffff16565b905092915050565b61111f612616565b73ffffffffffffffffffffffffffffffffffffffff1661113d611bd7565b73ffffffffffffffffffffffffffffffffffffffff1614611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a906146b3565b60405180910390fd5b601560009054906101000a900460ff1615601560006101000a81548160ff021916908315150217905550565b60145481565b60006111d1600c612a90565b905090565b6111de612616565b73ffffffffffffffffffffffffffffffffffffffff166111fc611bd7565b73ffffffffffffffffffffffffffffffffffffffff1614611252576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611249906146b3565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561129d573d6000803e3d6000fd5b5050565b6002600f5414156112e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112de90614773565b60405180910390fd5b6002600f81905550601560009054906101000a900460ff1661133e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133590614433565b60405180910390fd5b603261134a60166129e1565b1061138a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611381906144f3565b60405180910390fd5b3460115411156113cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c6906145b3565b60405180910390fd5b6113d960166125e3565b60006113e560166129e1565b90506113f13382612a05565b506001600f81905550565b6114178383836040518060200160405280600081525061224c565b505050565b60115481565b6010805461142f90614ac0565b80601f016020809104026020016040519081016040528092919081815260200182805461145b90614ac0565b80156114a85780601f1061147d576101008083540402835291602001916114a8565b820191906000526020600020905b81548152906001019060200180831161148b57829003601f168201915b505050505081565b6000806114c7836002612aa590919063ffffffff16565b50905080915050919050565b6114db612616565b73ffffffffffffffffffffffffffffffffffffffff166114f9611bd7565b73ffffffffffffffffffffffffffffffffffffffff161461154f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611546906146b3565b60405180910390fd5b61155881612ad1565b50565b60135481565b60006115918260405180606001604052806029815260200161543f602991396002612aeb9092919063ffffffff16565b9050919050565b6060600a80546115a790614ac0565b80601f01602080910402602001604051908101604052809291908181526020018280546115d390614ac0565b80156116205780601f106115f557610100808354040283529160200191611620565b820191906000526020600020905b81548152906001019060200180831161160357829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561169b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169290614633565b60405180910390fd5b6116e2600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612a90565b9050919050565b6116f1612616565b73ffffffffffffffffffffffffffffffffffffffff1661170f611bd7565b73ffffffffffffffffffffffffffffffffffffffff1614611765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175c906146b3565b60405180910390fd5b61176f6000612b0a565b565b6060600061177e8361162a565b9050600081141561180157600067ffffffffffffffff8111156117ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156117f85781602001602082028036833780820191505090505b509150506118e8565b60008167ffffffffffffffff811115611843577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156118715781602001602082028036833780820191505090505b50905060005b828110156118e15761188985826110bc565b8282815181106118c2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806118d990614b23565b915050611877565b8193505050505b919050565b600080600090506000600190505b6032811161197c5761195481600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612bd090919063ffffffff16565b156119695760018261196691906148e8565b91505b808061197490614b23565b9150506118fb565b50806119878461162a565b61199191906149c9565b915050919050565b6002600f5414156119df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d690614773565b60405180910390fd5b6002600f81905550601560009054906101000a900460ff16611a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2d90614433565b60405180910390fd5b600a811115611a7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7190614593565b60405180910390fd5b61271081611a8860176129e1565b611a9291906148e8565b1115611ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aca90614653565b60405180910390fd5b34611add82612bea565b1115611b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b15906145b3565b60405180910390fd5b60005b81811015611bcb57611b3360176125e3565b6000611b3f60176129e1565b9050611b4b3382612a05565b611b5f81600c612a2390919063ffffffff16565b503373ffffffffffffffffffffffffffffffffffffffff16817f9fb22f134559ef7d3b14cd8d38e24cd4e36901e6918d22c5f631743cc0dbc1af611ba284612a3d565b604051611baf9190614793565b60405180910390a3508080611bc390614b23565b915050611b21565b506001600f8190555050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60125481565b603281565b606060088054611c1b90614ac0565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4790614ac0565b8015611c945780601f10611c6957610100808354040283529160200191611c94565b820191906000526020600020905b815481529060010190602001808311611c7757829003601f168201915b5050505050905090565b611ca6612616565b73ffffffffffffffffffffffffffffffffffffffff16611cc4611bd7565b73ffffffffffffffffffffffffffffffffffffffff1614611d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d11906146b3565b60405180910390fd5b611d226111c5565b811115611d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5b90614513565b60405180910390fd5b60005b81811015611e41576000611d79612c2f565b90506000611d97611d886111c5565b83612c8090919063ffffffff16565b90506000611daf82600c612a7690919063ffffffff16565b9050611dc581600c612c9690919063ffffffff16565b506000611dd182611561565b90508073ffffffffffffffffffffffffffffffffffffffff16827f942041719a014737e072064c83c8093112607c9a162b60b0a189bf85c1ee9def611e1585612a3d565b604051611e229190614793565b60405180910390a3505050508080611e3990614b23565b915050611d67565b5050565b611e4d612616565b73ffffffffffffffffffffffffffffffffffffffff16611e6b611bd7565b73ffffffffffffffffffffffffffffffffffffffff1614611ec1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb8906146b3565b60405180910390fd5b60008160ff1610158015611ed957508060ff16600310155b611f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0f906144d3565b60405180910390fd5b60008160ff161415611f305781601181905550611f6a565b60018160ff161415611f485781601281905550611f69565b60028160ff161415611f605781601381905550611f68565b816014819055505b5b5b5050565b611f76612616565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fe4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdb90614553565b60405180910390fd5b8060066000611ff1612616565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661209e612616565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120e391906143f6565b60405180910390a35050565b6120f7612616565b73ffffffffffffffffffffffffffffffffffffffff16612115611bd7565b73ffffffffffffffffffffffffffffffffffffffff161461216b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612162906146b3565b60405180910390fd5b61271061219d612185845184612cb090919063ffffffff16565b61218f60176129e1565b6129ef90919063ffffffff16565b11156121de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d590614453565b60405180910390fd5b60005b825181101561224757612234838281518110612226577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015183610e0d565b808061223f90614b23565b9150506121e1565b505050565b61225d612257612616565b836126ec565b61229c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229390614733565b60405180910390fd5b6122a884848484612cc6565b50505050565b6126de81565b60606122bf826125f9565b6122fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f5906146f3565b60405180910390fd5b600060096000848152602001908152602001600020805461231e90614ac0565b80601f016020809104026020016040519081016040528092919081815260200182805461234a90614ac0565b80156123975780601f1061236c57610100808354040283529160200191612397565b820191906000526020600020905b81548152906001019060200180831161237a57829003601f168201915b5050505050905060006123a8611598565b90506000815114156123be578192505050612422565b6000825111156123f35780826040516020016123db9291906142fb565b60405160208183030381529060405292505050612422565b806123fd85612d22565b60405160200161240e9291906142fb565b604051602081830303815290604052925050505b919050565b600a81565b60168060000154905081565b60178060000154905081565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601560009054906101000a900460ff1681565b6124f3612616565b73ffffffffffffffffffffffffffffffffffffffff16612511611bd7565b73ffffffffffffffffffffffffffffffffffffffff1614612567576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255e906146b3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ce90614493565b60405180910390fd5b6125e081612b0a565b50565b6001816000016000828254019250508190555050565b600061260f826002612ecf90919063ffffffff16565b9050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661269183611561565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006126e582600001612ee9565b9050919050565b60006126f7826125f9565b612736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272d906145f3565b60405180910390fd5b600061274183611561565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127b057508373ffffffffffffffffffffffffffffffffffffffff1661279884610b63565b73ffffffffffffffffffffffffffffffffffffffff16145b806127c157506127c08185612444565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127ea82611561565b73ffffffffffffffffffffffffffffffffffffffff1614612840576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612837906146d3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a790614533565b60405180910390fd5b6128bb838383612efe565b6128c660008261261e565b61291781600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c9690919063ffffffff16565b5061296981600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612a2390919063ffffffff16565b5061298081836002612f039092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600081600001549050919050565b600081836129fd91906148e8565b905092915050565b612a1f828260405180602001604052806000815250612f38565b5050565b6000612a35836000018360001b612f93565b905092915050565b600044434284604051602001612a56949392919061431f565b6040516020818303038152906040528051906020012060001c9050919050565b6000612a858360000183613003565b60001c905092915050565b6000612a9e82600001613054565b9050919050565b600080600080612ab88660000186613065565b915091508160001c8160001c9350935050509250929050565b80600a9080519060200190612ae792919061381c565b5050565b6000612afe846000018460001b846130a5565b60001c90509392505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612be2836000018360001b613126565b905092915050565b60008060125483612bfb919061496f565b90506003831415612c1157601354915050612c2a565b600a831415612c2557601454915050612c2a565b809150505b919050565b6000600e6000815480929190612c4490614b23565b9190505550444342600e54604051602001612c62949392919061431f565b6040516020818303038152906040528051906020012060001c905090565b60008183612c8e9190614b76565b905092915050565b6000612ca8836000018360001b613149565b905092915050565b60008183612cbe919061496f565b905092915050565b612cd18484846127ca565b612cdd848484846132cf565b612d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1390614473565b60405180910390fd5b50505050565b60606000821415612d6a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612eca565b600082905060005b60008214612d9c578080612d8590614b23565b915050600a82612d95919061493e565b9150612d72565b60008167ffffffffffffffff811115612dde577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612e105781602001600182028036833780820191505090505b5090505b60008514612ec357600182612e2991906149c9565b9150600a85612e389190614b76565b6030612e4491906148e8565b60f81b818381518110612e80577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ebc919061493e565b9450612e14565b8093505050505b919050565b6000612ee1836000018360001b613433565b905092915050565b6000612ef782600001613453565b9050919050565b505050565b6000612f2f846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613468565b90509392505050565b612f4283836134a3565b612f4f60008484846132cf565b612f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8590614473565b60405180910390fd5b505050565b6000612f9f8383613126565b612ff8578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612ffd565b600090505b92915050565b6000826000018281548110613041577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b600081600001805490509050919050565b6000806000613080848660000161363190919063ffffffff16565b9050808560020160008381526020019081526020016000205492509250509250929050565b6000808460020160008581526020019081526020016000205490506000801b811415806130d857506130d78585613433565b5b839061311a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131119190614411565b60405180910390fd5b50809150509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146132c357600060018261317b91906149c9565b905060006001866000018054905061319391906149c9565b905081811461324e5760008660000182815481106131da577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110613224577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480613288577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506132c9565b60009150505b92915050565b60006132f08473ffffffffffffffffffffffffffffffffffffffff16613648565b6132fd576001905061342b565b60006133c463150b7a0260e01b613312612616565b8887876040516024016133289493929190614388565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405180606001604052806032815260200161540d603291398773ffffffffffffffffffffffffffffffffffffffff1661365b9092919063ffffffff16565b90506000818060200190518101906133dc9190613cc7565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600061344b828460000161367390919063ffffffff16565b905092915050565b600061346182600001613054565b9050919050565b6000818460020160008581526020019081526020016000208190555061349a838560000161368a90919063ffffffff16565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350a90614673565b60405180910390fd5b61351c816125f9565b1561355c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613553906144b3565b60405180910390fd5b61356860008383612efe565b6135b981600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612a2390919063ffffffff16565b506135d081836002612f039092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006136408360000183613003565b905092915050565b600080823b905060008111915050919050565b606061366a84846000856136a1565b90509392505050565b60006136828360000183613126565b905092915050565b60006136998360000183612f93565b905092915050565b6060824710156136e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136dd906145d3565b60405180910390fd5b6136ef85613648565b61372e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372590614753565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161375791906142e4565b60006040518083038185875af1925050503d8060008114613794576040519150601f19603f3d011682016040523d82523d6000602084013e613799565b606091505b50915091506137a98282866137b5565b92505050949350505050565b606083156137c557829050613815565b6000835111156137d85782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161380c9190614411565b60405180910390fd5b9392505050565b82805461382890614ac0565b90600052602060002090601f01602090048101928261384a5760008555613891565b82601f1061386357805160ff1916838001178555613891565b82800160010185558215613891579182015b82811115613890578251825591602001919060010190613875565b5b50905061389e91906138a2565b5090565b5b808211156138bb5760008160009055506001016138a3565b5090565b60006138d26138cd846147d3565b6147ae565b905080838252602082019050828560208602820111156138f157600080fd5b60005b85811015613921578161390788826139a7565b8452602084019350602083019250506001810190506138f4565b5050509392505050565b600061393e613939846147ff565b6147ae565b90508281526020810184848401111561395657600080fd5b613961848285614a7e565b509392505050565b600061397c61397784614830565b6147ae565b90508281526020810184848401111561399457600080fd5b61399f848285614a7e565b509392505050565b6000813590506139b681615399565b92915050565b600082601f8301126139cd57600080fd5b81356139dd8482602086016138bf565b91505092915050565b6000813590506139f5816153b0565b92915050565b600081359050613a0a816153c7565b92915050565b600081519050613a1f816153c7565b92915050565b600082601f830112613a3657600080fd5b8135613a4684826020860161392b565b91505092915050565b600082601f830112613a6057600080fd5b8135613a70848260208601613969565b91505092915050565b600081359050613a88816153de565b92915050565b600081359050613a9d816153f5565b92915050565b600060208284031215613ab557600080fd5b6000613ac3848285016139a7565b91505092915050565b60008060408385031215613adf57600080fd5b6000613aed858286016139a7565b9250506020613afe858286016139a7565b9150509250929050565b600080600060608486031215613b1d57600080fd5b6000613b2b868287016139a7565b9350506020613b3c868287016139a7565b9250506040613b4d86828701613a79565b9150509250925092565b60008060008060808587031215613b6d57600080fd5b6000613b7b878288016139a7565b9450506020613b8c878288016139a7565b9350506040613b9d87828801613a79565b925050606085013567ffffffffffffffff811115613bba57600080fd5b613bc687828801613a25565b91505092959194509250565b60008060408385031215613be557600080fd5b6000613bf3858286016139a7565b9250506020613c04858286016139e6565b9150509250929050565b60008060408385031215613c2157600080fd5b6000613c2f858286016139a7565b9250506020613c4085828601613a79565b9150509250929050565b60008060408385031215613c5d57600080fd5b600083013567ffffffffffffffff811115613c7757600080fd5b613c83858286016139bc565b9250506020613c9485828601613a79565b9150509250929050565b600060208284031215613cb057600080fd5b6000613cbe848285016139fb565b91505092915050565b600060208284031215613cd957600080fd5b6000613ce784828501613a10565b91505092915050565b600060208284031215613d0257600080fd5b600082013567ffffffffffffffff811115613d1c57600080fd5b613d2884828501613a4f565b91505092915050565b600060208284031215613d4357600080fd5b6000613d5184828501613a79565b91505092915050565b60008060408385031215613d6d57600080fd5b6000613d7b85828601613a79565b9250506020613d8c85828601613a8e565b9150509250929050565b6000613da283836142af565b60208301905092915050565b613db7816149fd565b82525050565b6000613dc882614871565b613dd2818561489f565b9350613ddd83614861565b8060005b83811015613e0e578151613df58882613d96565b9750613e0083614892565b925050600181019050613de1565b5085935050505092915050565b613e2481614a0f565b82525050565b6000613e358261487c565b613e3f81856148b0565b9350613e4f818560208601614a8d565b613e5881614c63565b840191505092915050565b6000613e6e8261487c565b613e7881856148c1565b9350613e88818560208601614a8d565b80840191505092915050565b6000613e9f82614887565b613ea981856148cc565b9350613eb9818560208601614a8d565b613ec281614c63565b840191505092915050565b6000613ed882614887565b613ee281856148dd565b9350613ef2818560208601614a8d565b80840191505092915050565b6000613f0b6022836148cc565b9150613f1682614c74565b604082019050919050565b6000613f2e6038836148cc565b9150613f3982614cc3565b604082019050919050565b6000613f516032836148cc565b9150613f5c82614d12565b604082019050919050565b6000613f746026836148cc565b9150613f7f82614d61565b604082019050919050565b6000613f97601c836148cc565b9150613fa282614db0565b602082019050919050565b6000613fba601f836148cc565b9150613fc582614dd9565b602082019050919050565b6000613fdd603a836148cc565b9150613fe882614e02565b604082019050919050565b60006140006025836148cc565b915061400b82614e51565b604082019050919050565b60006140236024836148cc565b915061402e82614ea0565b604082019050919050565b60006140466019836148cc565b915061405182614eef565b602082019050919050565b6000614069603f836148cc565b915061407482614f18565b604082019050919050565b600061408c6026836148cc565b915061409782614f67565b604082019050919050565b60006140af601f836148cc565b91506140ba82614fb6565b602082019050919050565b60006140d26026836148cc565b91506140dd82614fdf565b604082019050919050565b60006140f5602c836148cc565b91506141008261502e565b604082019050919050565b60006141186038836148cc565b91506141238261507d565b604082019050919050565b600061413b602a836148cc565b9150614146826150cc565b604082019050919050565b600061415e6033836148cc565b91506141698261511b565b604082019050919050565b60006141816020836148cc565b915061418c8261516a565b602082019050919050565b60006141a4602c836148cc565b91506141af82615193565b604082019050919050565b60006141c76020836148cc565b91506141d2826151e2565b602082019050919050565b60006141ea6029836148cc565b91506141f58261520b565b604082019050919050565b600061420d602f836148cc565b91506142188261525a565b604082019050919050565b60006142306021836148cc565b915061423b826152a9565b604082019050919050565b60006142536031836148cc565b915061425e826152f8565b604082019050919050565b6000614276601d836148cc565b915061428182615347565b602082019050919050565b6000614299601f836148cc565b91506142a482615370565b602082019050919050565b6142b881614a67565b82525050565b6142c781614a67565b82525050565b6142de6142d982614a67565b614b6c565b82525050565b60006142f08284613e63565b915081905092915050565b60006143078285613ecd565b91506143138284613ecd565b91508190509392505050565b600061432b82876142cd565b60208201915061433b82866142cd565b60208201915061434b82856142cd565b60208201915061435b82846142cd565b60208201915081905095945050505050565b60006020820190506143826000830184613dae565b92915050565b600060808201905061439d6000830187613dae565b6143aa6020830186613dae565b6143b760408301856142be565b81810360608301526143c98184613e2a565b905095945050505050565b600060208201905081810360008301526143ee8184613dbd565b905092915050565b600060208201905061440b6000830184613e1b565b92915050565b6000602082019050818103600083015261442b8184613e94565b905092915050565b6000602082019050818103600083015261444c81613efe565b9050919050565b6000602082019050818103600083015261446c81613f21565b9050919050565b6000602082019050818103600083015261448c81613f44565b9050919050565b600060208201905081810360008301526144ac81613f67565b9050919050565b600060208201905081810360008301526144cc81613f8a565b9050919050565b600060208201905081810360008301526144ec81613fad565b9050919050565b6000602082019050818103600083015261450c81613fd0565b9050919050565b6000602082019050818103600083015261452c81613ff3565b9050919050565b6000602082019050818103600083015261454c81614016565b9050919050565b6000602082019050818103600083015261456c81614039565b9050919050565b6000602082019050818103600083015261458c8161405c565b9050919050565b600060208201905081810360008301526145ac8161407f565b9050919050565b600060208201905081810360008301526145cc816140a2565b9050919050565b600060208201905081810360008301526145ec816140c5565b9050919050565b6000602082019050818103600083015261460c816140e8565b9050919050565b6000602082019050818103600083015261462c8161410b565b9050919050565b6000602082019050818103600083015261464c8161412e565b9050919050565b6000602082019050818103600083015261466c81614151565b9050919050565b6000602082019050818103600083015261468c81614174565b9050919050565b600060208201905081810360008301526146ac81614197565b9050919050565b600060208201905081810360008301526146cc816141ba565b9050919050565b600060208201905081810360008301526146ec816141dd565b9050919050565b6000602082019050818103600083015261470c81614200565b9050919050565b6000602082019050818103600083015261472c81614223565b9050919050565b6000602082019050818103600083015261474c81614246565b9050919050565b6000602082019050818103600083015261476c81614269565b9050919050565b6000602082019050818103600083015261478c8161428c565b9050919050565b60006020820190506147a860008301846142be565b92915050565b60006147b86147c9565b90506147c48282614af2565b919050565b6000604051905090565b600067ffffffffffffffff8211156147ee576147ed614c34565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561481a57614819614c34565b5b61482382614c63565b9050602081019050919050565b600067ffffffffffffffff82111561484b5761484a614c34565b5b61485482614c63565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006148f382614a67565b91506148fe83614a67565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561493357614932614ba7565b5b828201905092915050565b600061494982614a67565b915061495483614a67565b92508261496457614963614bd6565b5b828204905092915050565b600061497a82614a67565b915061498583614a67565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156149be576149bd614ba7565b5b828202905092915050565b60006149d482614a67565b91506149df83614a67565b9250828210156149f2576149f1614ba7565b5b828203905092915050565b6000614a0882614a47565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614aab578082015181840152602081019050614a90565b83811115614aba576000848401525b50505050565b60006002820490506001821680614ad857607f821691505b60208210811415614aec57614aeb614c05565b5b50919050565b614afb82614c63565b810181811067ffffffffffffffff82111715614b1a57614b19614c34565b5b80604052505050565b6000614b2e82614a67565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b6157614b60614ba7565b5b600182019050919050565b6000819050919050565b6000614b8182614a67565b9150614b8c83614a67565b925082614b9c57614b9b614bd6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f53616c65206d7573742062652061637469766520746f206d696e742041776f7260008201527f6c64000000000000000000000000000000000000000000000000000000000000602082015250565b7f41697264726f7020616d6f756e742077696c6c20657863656564206d6178207360008201527f7570706c79206f662041776f726c642063727970746964730000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5468652070726963652074797065206973206e6f7420737570706f7274656400600082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f662041776f726c642067656e6573697320616e696d616c73000000000000602082015250565b7f4e6f7420656e6f75676820637279707469642073686f756c642062652072657660008201527f65616c6564000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f41697264726f7020616d6f756e742077696c6c20657863656564206d6178207360008201527f7570706c79206f662041776f726c642067656e6573697320616e696d616c7300602082015250565b7f4d696e7420746f6f206d7563682041776f726c6420616e696d616c732061742060008201527f612074696d650000000000000000000000000000000000000000000000000000602082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f662041776f726c6420637279707469647300000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6153a2816149fd565b81146153ad57600080fd5b50565b6153b981614a0f565b81146153c457600080fd5b50565b6153d081614a1b565b81146153db57600080fd5b50565b6153e781614a67565b81146153f257600080fd5b50565b6153fe81614a71565b811461540957600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220c69bee5fa525a2f98db142e271431b951c2570a4fa002cae63319c3fbcee231064736f6c63430008040033

Deployed Bytecode

0x60806040526004361061027d5760003560e01c80636c0360eb1161014f578063a01072c9116100c1578063cd29f88e1161007a578063cd29f88e14610958578063d553688114610983578063d8739668146109ae578063e985e9c5146109d9578063eb8d244414610a16578063f2fde38b14610a415761027d565b8063a01072c91461084c578063a22cb46514610875578063a31b56b81461089e578063b88d4fde146108c7578063c451bcaa146108f0578063c87b56dd1461091b5761027d565b80638c9aa4e0116101135780638c9aa4e01461075b5780638da5cb5b14610777578063906e4efd146107a257806390b2a757146107cd57806395d89b41146107f85780639f40f1d9146108235761027d565b80636c0360eb1461066257806370a082311461068d578063715018a6146106ca5780638462151c146106e157806389285a921461071e5761027d565b806334918dfd116101f35780634a665b65116101ac5780634a665b651461053e5780634e98e34d146105695780634f6ccce71461059457806355f804b3146105d157806359fee1c8146105fa5780636352211e146106255761027d565b806334918dfd1461048757806334aa3e261461049e57806334c39c2c146104c95780633ccfd60b146104f45780633d1496ee1461050b57806342842e0e146105155761027d565b806318160ddd1161024557806318160ddd146103795780631c56f8bf146103a457806323b872dd146103cf5780632bbdf1c0146103f85780632e9f9ba1146104215780632f745c591461044a5761027d565b806301ffc9a71461028257806306fdde03146102bf578063081812fc146102ea578063095ea7b3146103275780631096952314610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613c9e565b610a6a565b6040516102b691906143f6565b60405180910390f35b3480156102cb57600080fd5b506102d4610ad1565b6040516102e19190614411565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c9190613d31565b610b63565b60405161031e919061436d565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190613c0e565b610be8565b005b34801561035c57600080fd5b5061037760048036038101906103729190613cf0565b610d00565b005b34801561038557600080fd5b5061038e610d96565b60405161039b9190614793565b60405180910390f35b3480156103b057600080fd5b506103b9610da7565b6040516103c69190614793565b60405180910390f35b3480156103db57600080fd5b506103f660048036038101906103f19190613b08565b610dad565b005b34801561040457600080fd5b5061041f600480360381019061041a9190613c0e565b610e0d565b005b34801561042d57600080fd5b5061044860048036038101906104439190613c0e565b610f9b565b005b34801561045657600080fd5b50610471600480360381019061046c9190613c0e565b6110bc565b60405161047e9190614793565b60405180910390f35b34801561049357600080fd5b5061049c611117565b005b3480156104aa57600080fd5b506104b36111bf565b6040516104c09190614793565b60405180910390f35b3480156104d557600080fd5b506104de6111c5565b6040516104eb9190614793565b60405180910390f35b34801561050057600080fd5b506105096111d6565b005b6105136112a1565b005b34801561052157600080fd5b5061053c60048036038101906105379190613b08565b6113fc565b005b34801561054a57600080fd5b5061055361141c565b6040516105609190614793565b60405180910390f35b34801561057557600080fd5b5061057e611422565b60405161058b9190614411565b60405180910390f35b3480156105a057600080fd5b506105bb60048036038101906105b69190613d31565b6114b0565b6040516105c89190614793565b60405180910390f35b3480156105dd57600080fd5b506105f860048036038101906105f39190613cf0565b6114d3565b005b34801561060657600080fd5b5061060f61155b565b60405161061c9190614793565b60405180910390f35b34801561063157600080fd5b5061064c60048036038101906106479190613d31565b611561565b604051610659919061436d565b60405180910390f35b34801561066e57600080fd5b50610677611598565b6040516106849190614411565b60405180910390f35b34801561069957600080fd5b506106b460048036038101906106af9190613aa3565b61162a565b6040516106c19190614793565b60405180910390f35b3480156106d657600080fd5b506106df6116e9565b005b3480156106ed57600080fd5b5061070860048036038101906107039190613aa3565b611771565b60405161071591906143d4565b60405180910390f35b34801561072a57600080fd5b5061074560048036038101906107409190613aa3565b6118ed565b6040516107529190614793565b60405180910390f35b61077560048036038101906107709190613d31565b611999565b005b34801561078357600080fd5b5061078c611bd7565b604051610799919061436d565b60405180910390f35b3480156107ae57600080fd5b506107b7611c01565b6040516107c49190614793565b60405180910390f35b3480156107d957600080fd5b506107e2611c07565b6040516107ef9190614793565b60405180910390f35b34801561080457600080fd5b5061080d611c0c565b60405161081a9190614411565b60405180910390f35b34801561082f57600080fd5b5061084a60048036038101906108459190613d31565b611c9e565b005b34801561085857600080fd5b50610873600480360381019061086e9190613d5a565b611e45565b005b34801561088157600080fd5b5061089c60048036038101906108979190613bd2565b611f6e565b005b3480156108aa57600080fd5b506108c560048036038101906108c09190613c4a565b6120ef565b005b3480156108d357600080fd5b506108ee60048036038101906108e99190613b57565b61224c565b005b3480156108fc57600080fd5b506109056122ae565b6040516109129190614793565b60405180910390f35b34801561092757600080fd5b50610942600480360381019061093d9190613d31565b6122b4565b60405161094f9190614411565b60405180910390f35b34801561096457600080fd5b5061096d612427565b60405161097a9190614793565b60405180910390f35b34801561098f57600080fd5b5061099861242c565b6040516109a59190614793565b60405180910390f35b3480156109ba57600080fd5b506109c3612438565b6040516109d09190614793565b60405180910390f35b3480156109e557600080fd5b50610a0060048036038101906109fb9190613acc565b612444565b604051610a0d91906143f6565b60405180910390f35b348015610a2257600080fd5b50610a2b6124d8565b604051610a3891906143f6565b60405180910390f35b348015610a4d57600080fd5b50610a686004803603810190610a639190613aa3565b6124eb565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060078054610ae090614ac0565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0c90614ac0565b8015610b595780601f10610b2e57610100808354040283529160200191610b59565b820191906000526020600020905b815481529060010190602001808311610b3c57829003601f168201915b5050505050905090565b6000610b6e826125f9565b610bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba490614693565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bf382611561565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5b90614713565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c83612616565b73ffffffffffffffffffffffffffffffffffffffff161480610cb25750610cb181610cac612616565b612444565b5b610cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce890614613565b60405180910390fd5b610cfb838361261e565b505050565b610d08612616565b73ffffffffffffffffffffffffffffffffffffffff16610d26611bd7565b73ffffffffffffffffffffffffffffffffffffffff1614610d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d73906146b3565b60405180910390fd5b8060109080519060200190610d9292919061381c565b5050565b6000610da260026126d7565b905090565b61271081565b610dbe610db8612616565b826126ec565b610dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df490614733565b60405180910390fd5b610e088383836127ca565b505050565b610e15612616565b73ffffffffffffffffffffffffffffffffffffffff16610e33611bd7565b73ffffffffffffffffffffffffffffffffffffffff1614610e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e80906146b3565b60405180910390fd5b612710610ea882610e9a60176129e1565b6129ef90919063ffffffff16565b1115610ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee090614453565b60405180910390fd5b60005b81811015610f9657610efe60176125e3565b6000610f0a60176129e1565b9050610f168482612a05565b610f2a81600c612a2390919063ffffffff16565b508373ffffffffffffffffffffffffffffffffffffffff16817f9fb22f134559ef7d3b14cd8d38e24cd4e36901e6918d22c5f631743cc0dbc1af610f6d84612a3d565b604051610f7a9190614793565b60405180910390a3508080610f8e90614b23565b915050610eec565b505050565b610fa3612616565b73ffffffffffffffffffffffffffffffffffffffff16610fc1611bd7565b73ffffffffffffffffffffffffffffffffffffffff1614611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100e906146b3565b60405180910390fd5b60326110358261102760166129e1565b6129ef90919063ffffffff16565b1115611076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106d90614573565b60405180910390fd5b60005b818110156110b75761108b60166125e3565b600061109760166129e1565b90506110a38482612a05565b5080806110af90614b23565b915050611079565b505050565b600061110f82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612a7690919063ffffffff16565b905092915050565b61111f612616565b73ffffffffffffffffffffffffffffffffffffffff1661113d611bd7565b73ffffffffffffffffffffffffffffffffffffffff1614611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a906146b3565b60405180910390fd5b601560009054906101000a900460ff1615601560006101000a81548160ff021916908315150217905550565b60145481565b60006111d1600c612a90565b905090565b6111de612616565b73ffffffffffffffffffffffffffffffffffffffff166111fc611bd7565b73ffffffffffffffffffffffffffffffffffffffff1614611252576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611249906146b3565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561129d573d6000803e3d6000fd5b5050565b6002600f5414156112e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112de90614773565b60405180910390fd5b6002600f81905550601560009054906101000a900460ff1661133e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133590614433565b60405180910390fd5b603261134a60166129e1565b1061138a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611381906144f3565b60405180910390fd5b3460115411156113cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c6906145b3565b60405180910390fd5b6113d960166125e3565b60006113e560166129e1565b90506113f13382612a05565b506001600f81905550565b6114178383836040518060200160405280600081525061224c565b505050565b60115481565b6010805461142f90614ac0565b80601f016020809104026020016040519081016040528092919081815260200182805461145b90614ac0565b80156114a85780601f1061147d576101008083540402835291602001916114a8565b820191906000526020600020905b81548152906001019060200180831161148b57829003601f168201915b505050505081565b6000806114c7836002612aa590919063ffffffff16565b50905080915050919050565b6114db612616565b73ffffffffffffffffffffffffffffffffffffffff166114f9611bd7565b73ffffffffffffffffffffffffffffffffffffffff161461154f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611546906146b3565b60405180910390fd5b61155881612ad1565b50565b60135481565b60006115918260405180606001604052806029815260200161543f602991396002612aeb9092919063ffffffff16565b9050919050565b6060600a80546115a790614ac0565b80601f01602080910402602001604051908101604052809291908181526020018280546115d390614ac0565b80156116205780601f106115f557610100808354040283529160200191611620565b820191906000526020600020905b81548152906001019060200180831161160357829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561169b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169290614633565b60405180910390fd5b6116e2600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612a90565b9050919050565b6116f1612616565b73ffffffffffffffffffffffffffffffffffffffff1661170f611bd7565b73ffffffffffffffffffffffffffffffffffffffff1614611765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175c906146b3565b60405180910390fd5b61176f6000612b0a565b565b6060600061177e8361162a565b9050600081141561180157600067ffffffffffffffff8111156117ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156117f85781602001602082028036833780820191505090505b509150506118e8565b60008167ffffffffffffffff811115611843577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156118715781602001602082028036833780820191505090505b50905060005b828110156118e15761188985826110bc565b8282815181106118c2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806118d990614b23565b915050611877565b8193505050505b919050565b600080600090506000600190505b6032811161197c5761195481600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612bd090919063ffffffff16565b156119695760018261196691906148e8565b91505b808061197490614b23565b9150506118fb565b50806119878461162a565b61199191906149c9565b915050919050565b6002600f5414156119df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d690614773565b60405180910390fd5b6002600f81905550601560009054906101000a900460ff16611a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2d90614433565b60405180910390fd5b600a811115611a7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7190614593565b60405180910390fd5b61271081611a8860176129e1565b611a9291906148e8565b1115611ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aca90614653565b60405180910390fd5b34611add82612bea565b1115611b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b15906145b3565b60405180910390fd5b60005b81811015611bcb57611b3360176125e3565b6000611b3f60176129e1565b9050611b4b3382612a05565b611b5f81600c612a2390919063ffffffff16565b503373ffffffffffffffffffffffffffffffffffffffff16817f9fb22f134559ef7d3b14cd8d38e24cd4e36901e6918d22c5f631743cc0dbc1af611ba284612a3d565b604051611baf9190614793565b60405180910390a3508080611bc390614b23565b915050611b21565b506001600f8190555050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60125481565b603281565b606060088054611c1b90614ac0565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4790614ac0565b8015611c945780601f10611c6957610100808354040283529160200191611c94565b820191906000526020600020905b815481529060010190602001808311611c7757829003601f168201915b5050505050905090565b611ca6612616565b73ffffffffffffffffffffffffffffffffffffffff16611cc4611bd7565b73ffffffffffffffffffffffffffffffffffffffff1614611d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d11906146b3565b60405180910390fd5b611d226111c5565b811115611d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5b90614513565b60405180910390fd5b60005b81811015611e41576000611d79612c2f565b90506000611d97611d886111c5565b83612c8090919063ffffffff16565b90506000611daf82600c612a7690919063ffffffff16565b9050611dc581600c612c9690919063ffffffff16565b506000611dd182611561565b90508073ffffffffffffffffffffffffffffffffffffffff16827f942041719a014737e072064c83c8093112607c9a162b60b0a189bf85c1ee9def611e1585612a3d565b604051611e229190614793565b60405180910390a3505050508080611e3990614b23565b915050611d67565b5050565b611e4d612616565b73ffffffffffffffffffffffffffffffffffffffff16611e6b611bd7565b73ffffffffffffffffffffffffffffffffffffffff1614611ec1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb8906146b3565b60405180910390fd5b60008160ff1610158015611ed957508060ff16600310155b611f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0f906144d3565b60405180910390fd5b60008160ff161415611f305781601181905550611f6a565b60018160ff161415611f485781601281905550611f69565b60028160ff161415611f605781601381905550611f68565b816014819055505b5b5b5050565b611f76612616565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fe4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdb90614553565b60405180910390fd5b8060066000611ff1612616565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661209e612616565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120e391906143f6565b60405180910390a35050565b6120f7612616565b73ffffffffffffffffffffffffffffffffffffffff16612115611bd7565b73ffffffffffffffffffffffffffffffffffffffff161461216b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612162906146b3565b60405180910390fd5b61271061219d612185845184612cb090919063ffffffff16565b61218f60176129e1565b6129ef90919063ffffffff16565b11156121de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d590614453565b60405180910390fd5b60005b825181101561224757612234838281518110612226577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015183610e0d565b808061223f90614b23565b9150506121e1565b505050565b61225d612257612616565b836126ec565b61229c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229390614733565b60405180910390fd5b6122a884848484612cc6565b50505050565b6126de81565b60606122bf826125f9565b6122fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f5906146f3565b60405180910390fd5b600060096000848152602001908152602001600020805461231e90614ac0565b80601f016020809104026020016040519081016040528092919081815260200182805461234a90614ac0565b80156123975780601f1061236c57610100808354040283529160200191612397565b820191906000526020600020905b81548152906001019060200180831161237a57829003601f168201915b5050505050905060006123a8611598565b90506000815114156123be578192505050612422565b6000825111156123f35780826040516020016123db9291906142fb565b60405160208183030381529060405292505050612422565b806123fd85612d22565b60405160200161240e9291906142fb565b604051602081830303815290604052925050505b919050565b600a81565b60168060000154905081565b60178060000154905081565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601560009054906101000a900460ff1681565b6124f3612616565b73ffffffffffffffffffffffffffffffffffffffff16612511611bd7565b73ffffffffffffffffffffffffffffffffffffffff1614612567576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255e906146b3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ce90614493565b60405180910390fd5b6125e081612b0a565b50565b6001816000016000828254019250508190555050565b600061260f826002612ecf90919063ffffffff16565b9050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661269183611561565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006126e582600001612ee9565b9050919050565b60006126f7826125f9565b612736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272d906145f3565b60405180910390fd5b600061274183611561565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127b057508373ffffffffffffffffffffffffffffffffffffffff1661279884610b63565b73ffffffffffffffffffffffffffffffffffffffff16145b806127c157506127c08185612444565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127ea82611561565b73ffffffffffffffffffffffffffffffffffffffff1614612840576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612837906146d3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a790614533565b60405180910390fd5b6128bb838383612efe565b6128c660008261261e565b61291781600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c9690919063ffffffff16565b5061296981600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612a2390919063ffffffff16565b5061298081836002612f039092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600081600001549050919050565b600081836129fd91906148e8565b905092915050565b612a1f828260405180602001604052806000815250612f38565b5050565b6000612a35836000018360001b612f93565b905092915050565b600044434284604051602001612a56949392919061431f565b6040516020818303038152906040528051906020012060001c9050919050565b6000612a858360000183613003565b60001c905092915050565b6000612a9e82600001613054565b9050919050565b600080600080612ab88660000186613065565b915091508160001c8160001c9350935050509250929050565b80600a9080519060200190612ae792919061381c565b5050565b6000612afe846000018460001b846130a5565b60001c90509392505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612be2836000018360001b613126565b905092915050565b60008060125483612bfb919061496f565b90506003831415612c1157601354915050612c2a565b600a831415612c2557601454915050612c2a565b809150505b919050565b6000600e6000815480929190612c4490614b23565b9190505550444342600e54604051602001612c62949392919061431f565b6040516020818303038152906040528051906020012060001c905090565b60008183612c8e9190614b76565b905092915050565b6000612ca8836000018360001b613149565b905092915050565b60008183612cbe919061496f565b905092915050565b612cd18484846127ca565b612cdd848484846132cf565b612d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1390614473565b60405180910390fd5b50505050565b60606000821415612d6a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612eca565b600082905060005b60008214612d9c578080612d8590614b23565b915050600a82612d95919061493e565b9150612d72565b60008167ffffffffffffffff811115612dde577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612e105781602001600182028036833780820191505090505b5090505b60008514612ec357600182612e2991906149c9565b9150600a85612e389190614b76565b6030612e4491906148e8565b60f81b818381518110612e80577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ebc919061493e565b9450612e14565b8093505050505b919050565b6000612ee1836000018360001b613433565b905092915050565b6000612ef782600001613453565b9050919050565b505050565b6000612f2f846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613468565b90509392505050565b612f4283836134a3565b612f4f60008484846132cf565b612f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8590614473565b60405180910390fd5b505050565b6000612f9f8383613126565b612ff8578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612ffd565b600090505b92915050565b6000826000018281548110613041577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b600081600001805490509050919050565b6000806000613080848660000161363190919063ffffffff16565b9050808560020160008381526020019081526020016000205492509250509250929050565b6000808460020160008581526020019081526020016000205490506000801b811415806130d857506130d78585613433565b5b839061311a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131119190614411565b60405180910390fd5b50809150509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146132c357600060018261317b91906149c9565b905060006001866000018054905061319391906149c9565b905081811461324e5760008660000182815481106131da577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110613224577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480613288577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506132c9565b60009150505b92915050565b60006132f08473ffffffffffffffffffffffffffffffffffffffff16613648565b6132fd576001905061342b565b60006133c463150b7a0260e01b613312612616565b8887876040516024016133289493929190614388565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405180606001604052806032815260200161540d603291398773ffffffffffffffffffffffffffffffffffffffff1661365b9092919063ffffffff16565b90506000818060200190518101906133dc9190613cc7565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600061344b828460000161367390919063ffffffff16565b905092915050565b600061346182600001613054565b9050919050565b6000818460020160008581526020019081526020016000208190555061349a838560000161368a90919063ffffffff16565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350a90614673565b60405180910390fd5b61351c816125f9565b1561355c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613553906144b3565b60405180910390fd5b61356860008383612efe565b6135b981600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612a2390919063ffffffff16565b506135d081836002612f039092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006136408360000183613003565b905092915050565b600080823b905060008111915050919050565b606061366a84846000856136a1565b90509392505050565b60006136828360000183613126565b905092915050565b60006136998360000183612f93565b905092915050565b6060824710156136e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136dd906145d3565b60405180910390fd5b6136ef85613648565b61372e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372590614753565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161375791906142e4565b60006040518083038185875af1925050503d8060008114613794576040519150601f19603f3d011682016040523d82523d6000602084013e613799565b606091505b50915091506137a98282866137b5565b92505050949350505050565b606083156137c557829050613815565b6000835111156137d85782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161380c9190614411565b60405180910390fd5b9392505050565b82805461382890614ac0565b90600052602060002090601f01602090048101928261384a5760008555613891565b82601f1061386357805160ff1916838001178555613891565b82800160010185558215613891579182015b82811115613890578251825591602001919060010190613875565b5b50905061389e91906138a2565b5090565b5b808211156138bb5760008160009055506001016138a3565b5090565b60006138d26138cd846147d3565b6147ae565b905080838252602082019050828560208602820111156138f157600080fd5b60005b85811015613921578161390788826139a7565b8452602084019350602083019250506001810190506138f4565b5050509392505050565b600061393e613939846147ff565b6147ae565b90508281526020810184848401111561395657600080fd5b613961848285614a7e565b509392505050565b600061397c61397784614830565b6147ae565b90508281526020810184848401111561399457600080fd5b61399f848285614a7e565b509392505050565b6000813590506139b681615399565b92915050565b600082601f8301126139cd57600080fd5b81356139dd8482602086016138bf565b91505092915050565b6000813590506139f5816153b0565b92915050565b600081359050613a0a816153c7565b92915050565b600081519050613a1f816153c7565b92915050565b600082601f830112613a3657600080fd5b8135613a4684826020860161392b565b91505092915050565b600082601f830112613a6057600080fd5b8135613a70848260208601613969565b91505092915050565b600081359050613a88816153de565b92915050565b600081359050613a9d816153f5565b92915050565b600060208284031215613ab557600080fd5b6000613ac3848285016139a7565b91505092915050565b60008060408385031215613adf57600080fd5b6000613aed858286016139a7565b9250506020613afe858286016139a7565b9150509250929050565b600080600060608486031215613b1d57600080fd5b6000613b2b868287016139a7565b9350506020613b3c868287016139a7565b9250506040613b4d86828701613a79565b9150509250925092565b60008060008060808587031215613b6d57600080fd5b6000613b7b878288016139a7565b9450506020613b8c878288016139a7565b9350506040613b9d87828801613a79565b925050606085013567ffffffffffffffff811115613bba57600080fd5b613bc687828801613a25565b91505092959194509250565b60008060408385031215613be557600080fd5b6000613bf3858286016139a7565b9250506020613c04858286016139e6565b9150509250929050565b60008060408385031215613c2157600080fd5b6000613c2f858286016139a7565b9250506020613c4085828601613a79565b9150509250929050565b60008060408385031215613c5d57600080fd5b600083013567ffffffffffffffff811115613c7757600080fd5b613c83858286016139bc565b9250506020613c9485828601613a79565b9150509250929050565b600060208284031215613cb057600080fd5b6000613cbe848285016139fb565b91505092915050565b600060208284031215613cd957600080fd5b6000613ce784828501613a10565b91505092915050565b600060208284031215613d0257600080fd5b600082013567ffffffffffffffff811115613d1c57600080fd5b613d2884828501613a4f565b91505092915050565b600060208284031215613d4357600080fd5b6000613d5184828501613a79565b91505092915050565b60008060408385031215613d6d57600080fd5b6000613d7b85828601613a79565b9250506020613d8c85828601613a8e565b9150509250929050565b6000613da283836142af565b60208301905092915050565b613db7816149fd565b82525050565b6000613dc882614871565b613dd2818561489f565b9350613ddd83614861565b8060005b83811015613e0e578151613df58882613d96565b9750613e0083614892565b925050600181019050613de1565b5085935050505092915050565b613e2481614a0f565b82525050565b6000613e358261487c565b613e3f81856148b0565b9350613e4f818560208601614a8d565b613e5881614c63565b840191505092915050565b6000613e6e8261487c565b613e7881856148c1565b9350613e88818560208601614a8d565b80840191505092915050565b6000613e9f82614887565b613ea981856148cc565b9350613eb9818560208601614a8d565b613ec281614c63565b840191505092915050565b6000613ed882614887565b613ee281856148dd565b9350613ef2818560208601614a8d565b80840191505092915050565b6000613f0b6022836148cc565b9150613f1682614c74565b604082019050919050565b6000613f2e6038836148cc565b9150613f3982614cc3565b604082019050919050565b6000613f516032836148cc565b9150613f5c82614d12565b604082019050919050565b6000613f746026836148cc565b9150613f7f82614d61565b604082019050919050565b6000613f97601c836148cc565b9150613fa282614db0565b602082019050919050565b6000613fba601f836148cc565b9150613fc582614dd9565b602082019050919050565b6000613fdd603a836148cc565b9150613fe882614e02565b604082019050919050565b60006140006025836148cc565b915061400b82614e51565b604082019050919050565b60006140236024836148cc565b915061402e82614ea0565b604082019050919050565b60006140466019836148cc565b915061405182614eef565b602082019050919050565b6000614069603f836148cc565b915061407482614f18565b604082019050919050565b600061408c6026836148cc565b915061409782614f67565b604082019050919050565b60006140af601f836148cc565b91506140ba82614fb6565b602082019050919050565b60006140d26026836148cc565b91506140dd82614fdf565b604082019050919050565b60006140f5602c836148cc565b91506141008261502e565b604082019050919050565b60006141186038836148cc565b91506141238261507d565b604082019050919050565b600061413b602a836148cc565b9150614146826150cc565b604082019050919050565b600061415e6033836148cc565b91506141698261511b565b604082019050919050565b60006141816020836148cc565b915061418c8261516a565b602082019050919050565b60006141a4602c836148cc565b91506141af82615193565b604082019050919050565b60006141c76020836148cc565b91506141d2826151e2565b602082019050919050565b60006141ea6029836148cc565b91506141f58261520b565b604082019050919050565b600061420d602f836148cc565b91506142188261525a565b604082019050919050565b60006142306021836148cc565b915061423b826152a9565b604082019050919050565b60006142536031836148cc565b915061425e826152f8565b604082019050919050565b6000614276601d836148cc565b915061428182615347565b602082019050919050565b6000614299601f836148cc565b91506142a482615370565b602082019050919050565b6142b881614a67565b82525050565b6142c781614a67565b82525050565b6142de6142d982614a67565b614b6c565b82525050565b60006142f08284613e63565b915081905092915050565b60006143078285613ecd565b91506143138284613ecd565b91508190509392505050565b600061432b82876142cd565b60208201915061433b82866142cd565b60208201915061434b82856142cd565b60208201915061435b82846142cd565b60208201915081905095945050505050565b60006020820190506143826000830184613dae565b92915050565b600060808201905061439d6000830187613dae565b6143aa6020830186613dae565b6143b760408301856142be565b81810360608301526143c98184613e2a565b905095945050505050565b600060208201905081810360008301526143ee8184613dbd565b905092915050565b600060208201905061440b6000830184613e1b565b92915050565b6000602082019050818103600083015261442b8184613e94565b905092915050565b6000602082019050818103600083015261444c81613efe565b9050919050565b6000602082019050818103600083015261446c81613f21565b9050919050565b6000602082019050818103600083015261448c81613f44565b9050919050565b600060208201905081810360008301526144ac81613f67565b9050919050565b600060208201905081810360008301526144cc81613f8a565b9050919050565b600060208201905081810360008301526144ec81613fad565b9050919050565b6000602082019050818103600083015261450c81613fd0565b9050919050565b6000602082019050818103600083015261452c81613ff3565b9050919050565b6000602082019050818103600083015261454c81614016565b9050919050565b6000602082019050818103600083015261456c81614039565b9050919050565b6000602082019050818103600083015261458c8161405c565b9050919050565b600060208201905081810360008301526145ac8161407f565b9050919050565b600060208201905081810360008301526145cc816140a2565b9050919050565b600060208201905081810360008301526145ec816140c5565b9050919050565b6000602082019050818103600083015261460c816140e8565b9050919050565b6000602082019050818103600083015261462c8161410b565b9050919050565b6000602082019050818103600083015261464c8161412e565b9050919050565b6000602082019050818103600083015261466c81614151565b9050919050565b6000602082019050818103600083015261468c81614174565b9050919050565b600060208201905081810360008301526146ac81614197565b9050919050565b600060208201905081810360008301526146cc816141ba565b9050919050565b600060208201905081810360008301526146ec816141dd565b9050919050565b6000602082019050818103600083015261470c81614200565b9050919050565b6000602082019050818103600083015261472c81614223565b9050919050565b6000602082019050818103600083015261474c81614246565b9050919050565b6000602082019050818103600083015261476c81614269565b9050919050565b6000602082019050818103600083015261478c8161428c565b9050919050565b60006020820190506147a860008301846142be565b92915050565b60006147b86147c9565b90506147c48282614af2565b919050565b6000604051905090565b600067ffffffffffffffff8211156147ee576147ed614c34565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561481a57614819614c34565b5b61482382614c63565b9050602081019050919050565b600067ffffffffffffffff82111561484b5761484a614c34565b5b61485482614c63565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006148f382614a67565b91506148fe83614a67565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561493357614932614ba7565b5b828201905092915050565b600061494982614a67565b915061495483614a67565b92508261496457614963614bd6565b5b828204905092915050565b600061497a82614a67565b915061498583614a67565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156149be576149bd614ba7565b5b828202905092915050565b60006149d482614a67565b91506149df83614a67565b9250828210156149f2576149f1614ba7565b5b828203905092915050565b6000614a0882614a47565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614aab578082015181840152602081019050614a90565b83811115614aba576000848401525b50505050565b60006002820490506001821680614ad857607f821691505b60208210811415614aec57614aeb614c05565b5b50919050565b614afb82614c63565b810181811067ffffffffffffffff82111715614b1a57614b19614c34565b5b80604052505050565b6000614b2e82614a67565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b6157614b60614ba7565b5b600182019050919050565b6000819050919050565b6000614b8182614a67565b9150614b8c83614a67565b925082614b9c57614b9b614bd6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f53616c65206d7573742062652061637469766520746f206d696e742041776f7260008201527f6c64000000000000000000000000000000000000000000000000000000000000602082015250565b7f41697264726f7020616d6f756e742077696c6c20657863656564206d6178207360008201527f7570706c79206f662041776f726c642063727970746964730000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5468652070726963652074797065206973206e6f7420737570706f7274656400600082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f662041776f726c642067656e6573697320616e696d616c73000000000000602082015250565b7f4e6f7420656e6f75676820637279707469642073686f756c642062652072657660008201527f65616c6564000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f41697264726f7020616d6f756e742077696c6c20657863656564206d6178207360008201527f7570706c79206f662041776f726c642067656e6573697320616e696d616c7300602082015250565b7f4d696e7420746f6f206d7563682041776f726c6420616e696d616c732061742060008201527f612074696d650000000000000000000000000000000000000000000000000000602082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f662041776f726c6420637279707469647300000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6153a2816149fd565b81146153ad57600080fd5b50565b6153b981614a0f565b81146153c457600080fd5b50565b6153d081614a1b565b81146153db57600080fd5b50565b6153e781614a67565b81146153f257600080fd5b50565b6153fe81614a71565b811461540957600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220c69bee5fa525a2f98db142e271431b951c2570a4fa002cae63319c3fbcee231064736f6c63430008040033

Deployed Bytecode Sourcemap

70541:6832:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44372:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49348:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52152:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51668:418;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75347:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51146:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71053:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53042:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76331:583;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75820:468;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50908:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75674:89;;;;;;;;;;;;;:::i;:::-;;70938:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63450:132;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72086:143;;;;;;;;;;;;;:::i;:::-;;73195:551;;;:::i;:::-;;53452:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70782:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70741:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51434:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75498:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70880:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49104:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50727:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48821:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67114:94;;;;;;;;;;;;;:::i;:::-;;71503:540;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62598:329;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73776:871;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66463:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70831:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71099:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49517:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74694:597;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72671:480;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52445:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76963:407;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53708:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71151:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49692:792;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70995:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71248:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71294;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52811:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71207:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67363:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44372:200;44502:4;44531:20;:33;44552:11;44531:33;;;;;;;;;;;;;;;;;;;;;;;;;;;44524:40;;44372:200;;;:::o;49348:100::-;49402:13;49435:5;49428:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49348:100;:::o;52152:221::-;52228:7;52256:16;52264:7;52256;:16::i;:::-;52248:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;52341:15;:24;52357:7;52341:24;;;;;;;;;;;;;;;;;;;;;52334:31;;52152:221;;;:::o;51668:418::-;51749:13;51765:23;51780:7;51765:14;:23::i;:::-;51749:39;;51813:5;51807:11;;:2;:11;;;;51799:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;51907:5;51891:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;51916:44;51940:5;51947:12;:10;:12::i;:::-;51916:23;:44::i;:::-;51891:69;51869:175;;;;;;;;;;;;:::i;:::-;;;;;;;;;52057:21;52066:2;52070:7;52057:8;:21::i;:::-;51668:418;;;:::o;75347:123::-;66694:12;:10;:12::i;:::-;66683:23;;:7;:5;:7::i;:::-;:23;;;66675:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75448:14:::1;75432:13;:30;;;;;;;;;;;;:::i;:::-;;75347:123:::0;:::o;51146:211::-;51207:7;51328:21;:12;:19;:21::i;:::-;51321:28;;51146:211;:::o;71053:39::-;71087:5;71053:39;:::o;53042:339::-;53237:41;53256:12;:10;:12::i;:::-;53270:7;53237:18;:41::i;:::-;53229:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;53345:28;53355:4;53361:2;53365:7;53345:9;:28::i;:::-;53042:339;;;:::o;76331:583::-;66694:12;:10;:12::i;:::-;66683:23;;:7;:5;:7::i;:::-;:23;;;66675:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71087:5:::1;76439:37;76469:6;76439:25;:15;:23;:25::i;:::-;:29;;:37;;;;:::i;:::-;:48;;76417:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;76587:9;76582:325;76606:6;76602:1;:10;76582:325;;;76634:27;:15;:25;:27::i;:::-;76676:15;76694:25;:15;:23;:25::i;:::-;76676:43;;76734:28;76744:8;76754:7;76734:9;:28::i;:::-;76777:40;76809:7;76777:27;:31;;:40;;;;:::i;:::-;;76858:8;76837:58;;76849:7;76837:58;76868:26;76886:7;76868:17;:26::i;:::-;76837:58;;;;;;:::i;:::-;;;;;;;;76582:325;76614:3;;;;;:::i;:::-;;;;76582:325;;;;76331:583:::0;;:::o;75820:468::-;66694:12;:10;:12::i;:::-;66683:23;;:7;:5;:7::i;:::-;:23;;;66675:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71142:2:::1;75930:37;75960:6;75930:25;:15;:23;:25::i;:::-;:29;;:37;;;;:::i;:::-;:57;;75908:170;;;;;;;;;;;;:::i;:::-;;;;;;;;;76094:9;76089:192;76113:6;76109:1;:10;76089:192;;;76141:27;:15;:25;:27::i;:::-;76183:15;76201:25;:15;:23;:25::i;:::-;76183:43;;76241:28;76251:8;76261:7;76241:9;:28::i;:::-;76089:192;76121:3;;;;;:::i;:::-;;;;76089:192;;;;75820:468:::0;;:::o;50908:162::-;51005:7;51032:30;51056:5;51032:13;:20;51046:5;51032:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;51025:37;;50908:162;;;;:::o;75674:89::-;66694:12;:10;:12::i;:::-;66683:23;;:7;:5;:7::i;:::-;:23;;;66675:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75743:12:::1;;;;;;;;;;;75742:13;75727:12;;:28;;;;;;;;;;;;;;;;;;75674:89::o:0;70938:48::-;;;;:::o;63450:132::-;63511:7;63538:36;:27;:34;:36::i;:::-;63531:43;;63450:132;:::o;72086:143::-;66694:12;:10;:12::i;:::-;66683:23;;:7;:5;:7::i;:::-;:23;;;66675:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72134:15:::1;72152:21;72134:39;;72192:10;72184:28;;:37;72213:7;72184:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;66754:1;72086:143::o:0;73195:551::-;69498:1;70094:7;;:19;;70086:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;69498:1;70227:7;:18;;;;73267:12:::1;;;;;;;;;;;73259:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;71142:2;73351:25;:15;:23;:25::i;:::-;:44;73329:152;;;;;;;;;;;;:::i;:::-;;;;;;;;;73518:9;73500:14;;:27;;73492:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;73574:27;:15;:25;:27::i;:::-;73612:15;73630:25;:15;:23;:25::i;:::-;73612:43;;73666:30;73676:10;73688:7;73666:9;:30::i;:::-;70258:1;69454::::0;70406:7;:22;;;;73195:551::o;53452:185::-;53590:39;53607:4;53613:2;53617:7;53590:39;;;;;;;;;;;;:16;:39::i;:::-;53452:185;;;:::o;70782:42::-;;;;:::o;70741:32::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51434:172::-;51509:7;51530:15;51551:22;51567:5;51551:12;:15;;:22;;;;:::i;:::-;51529:44;;;51591:7;51584:14;;;51434:172;;;:::o;75498:99::-;66694:12;:10;:12::i;:::-;66683:23;;:7;:5;:7::i;:::-;:23;;;66675:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75569:20:::1;75581:7;75569:11;:20::i;:::-;75498:99:::0;:::o;70880:51::-;;;;:::o;49104:177::-;49176:7;49203:70;49220:7;49203:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;49196:77;;49104:177;;;:::o;50727:97::-;50775:13;50808:8;50801:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50727:97;:::o;48821:221::-;48893:7;48938:1;48921:19;;:5;:19;;;;48913:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;49005:29;:13;:20;49019:5;49005:20;;;;;;;;;;;;;;;:27;:29::i;:::-;48998:36;;48821:221;;;:::o;67114:94::-;66694:12;:10;:12::i;:::-;66683:23;;:7;:5;:7::i;:::-;:23;;;66675:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67179:21:::1;67197:1;67179:9;:21::i;:::-;67114:94::o:0;71503:540::-;71565:16;71594:18;71615:17;71625:6;71615:9;:17::i;:::-;71594:38;;71661:1;71647:10;:15;71643:393;;;71738:1;71724:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71717:23;;;;;71643:393;71773:23;71813:10;71799:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71773:51;;71839:13;71867:130;71891:10;71883:5;:18;71867:130;;;71947:34;71967:6;71975:5;71947:19;:34::i;:::-;71931:6;71938:5;71931:13;;;;;;;;;;;;;;;;;;;;;:50;;;;;71903:7;;;;;:::i;:::-;;;;71867:130;;;72018:6;72011:13;;;;;71503:540;;;;:::o;62598:329::-;62661:7;62681:21;62705:1;62681:25;;62722:9;62734:1;62722:13;;62717:152;62742:2;62737:1;:7;62717:152;;62770:33;62801:1;62770:13;:21;62784:6;62770:21;;;;;;;;;;;;;;;:30;;:33;;;;:::i;:::-;62766:92;;;62841:1;62824:18;;;;;:::i;:::-;;;62766:92;62746:3;;;;;:::i;:::-;;;;62717:152;;;;62906:13;62886:17;62896:6;62886:9;:17::i;:::-;:33;;;;:::i;:::-;62879:40;;;62598:329;;;:::o;73776:871::-;69498:1;70094:7;;:19;;70086:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;69498:1;70227:7;:18;;;;73870:12:::1;;;;;;;;;;;73862:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;71042:2;73940:14;:38;;73932:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;71087:5;74082:14;74054:25;:15;:23;:25::i;:::-;:42;;;;:::i;:::-;:53;;74032:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;74247:9;74205:38;74228:14;74205:22;:38::i;:::-;:51;;74197:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;74308:9;74303:337;74327:14;74323:1;:18;74303:337;;;74363:27;:15;:25;:27::i;:::-;74405:15;74423:25;:15;:23;:25::i;:::-;74405:43;;74463:30;74473:10;74485:7;74463:9;:30::i;:::-;74508:40;74540:7;74508:27;:31;;:40;;;;:::i;:::-;;74589:10;74568:60;;74580:7;74568:60;74601:26;74619:7;74601:17;:26::i;:::-;74568:60;;;;;;:::i;:::-;;;;;;;;74303:337;74343:3;;;;;:::i;:::-;;;;74303:337;;;;69454:1:::0;70406:7;:22;;;;73776:871;:::o;66463:87::-;66509:7;66536:6;;;;;;;;;;;66529:13;;66463:87;:::o;70831:42::-;;;;:::o;71099:45::-;71142:2;71099:45;:::o;49517:104::-;49573:13;49606:7;49599:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49517:104;:::o;74694:597::-;66694:12;:10;:12::i;:::-;66683:23;;:7;:5;:7::i;:::-;:23;;;66675:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74787:30:::1;:28;:30::i;:::-;74772:11;:45;;74764:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;74875:9;74870:414;74894:11;74890:1;:15;74870:414;;;74927:10;74940:16;:14;:16::i;:::-;74927:29;;74971:14;74988:38;74995:30;:28;:30::i;:::-;74988:2;:6;;:38;;;;:::i;:::-;74971:55;;75041:15;75059:38;75090:6;75059:27;:30;;:38;;;;:::i;:::-;75041:56;;75112:43;75147:7;75112:27;:34;;:43;;;;:::i;:::-;;75170:13;75186:16;75194:7;75186;:16::i;:::-;75170:32;;75238:5;75224:48;;75229:7;75224:48;75245:26;75263:7;75245:17;:26::i;:::-;75224:48;;;;;;:::i;:::-;;;;;;;;74870:414;;;;74907:3;;;;;:::i;:::-;;;;74870:414;;;;74694:597:::0;:::o;72671:480::-;66694:12;:10;:12::i;:::-;66683:23;;:7;:5;:7::i;:::-;:23;;;66675:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72776:1:::1;72763:9;:14;;;;:32;;;;;72786:9;72781:14;;:1;:14;;72763:32;72755:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;72859:1;72846:9;:14;;;72842:302;;;72894:8;72877:14;:25;;;;72842:302;;;72937:1;72924:9;:14;;;72920:224;;;72972:8;72955:14;:25;;;;72920:224;;;73015:1;73002:9;:14;;;72998:146;;;73059:8;73033:23;:34;;;;72998:146;;;73124:8;73100:21;:32;;;;72998:146;72920:224;72842:302;72671:480:::0;;:::o;52445:295::-;52560:12;:10;:12::i;:::-;52548:24;;:8;:24;;;;52540:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;52660:8;52615:18;:32;52634:12;:10;:12::i;:::-;52615:32;;;;;;;;;;;;;;;:42;52648:8;52615:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;52713:8;52684:48;;52699:12;:10;:12::i;:::-;52684:48;;;52723:8;52684:48;;;;;;:::i;:::-;;;;;;;;52445:295;;:::o;76963:407::-;66694:12;:10;:12::i;:::-;66683:23;;:7;:5;:7::i;:::-;:23;;;66675:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71087:5:::1;77088:59;77118:28;77129:9;:16;77118:6;:10;;:28;;;;:::i;:::-;77088:25;:15;:23;:25::i;:::-;:29;;:59;;;;:::i;:::-;:70;;77066:176;;;;;;;;;;;;:::i;:::-;;;;;;;;;77258:9;77253:110;77277:9;:16;77273:1;:20;77253:110;;;77315:36;77330:9;77340:1;77330:12;;;;;;;;;;;;;;;;;;;;;;77344:6;77315:14;:36::i;:::-;77295:3;;;;;:::i;:::-;;;;77253:110;;;;76963:407:::0;;:::o;53708:328::-;53883:41;53902:12;:10;:12::i;:::-;53916:7;53883:18;:41::i;:::-;53875:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;53989:39;54003:4;54009:2;54013:7;54022:5;53989:13;:39::i;:::-;53708:328;;;;:::o;71151:47::-;71194:4;71151:47;:::o;49692:792::-;49765:13;49799:16;49807:7;49799;:16::i;:::-;49791:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;49880:23;49906:10;:19;49917:7;49906:19;;;;;;;;;;;49880:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49936:18;49957:9;:7;:9::i;:::-;49936:30;;50064:1;50048:4;50042:18;:23;50038:72;;;50089:9;50082:16;;;;;;50038:72;50240:1;50220:9;50214:23;:27;50210:108;;;50289:4;50295:9;50272:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50258:48;;;;;;50210:108;50450:4;50456:18;:7;:16;:18::i;:::-;50433:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50419:57;;;;49692:792;;;;:::o;70995:49::-;71042:2;70995:49;:::o;71248:39::-;;;;;;;;;:::o;71294:::-;;;;;;;;;:::o;52811:164::-;52908:4;52932:18;:25;52951:5;52932:25;;;;;;;;;;;;;;;:35;52958:8;52932:35;;;;;;;;;;;;;;;;;;;;;;;;;52925:42;;52811:164;;;;:::o;71207:32::-;;;;;;;;;;;;;:::o;67363:192::-;66694:12;:10;:12::i;:::-;66683:23;;:7;:5;:7::i;:::-;:23;;;66675:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67472:1:::1;67452:22;;:8;:22;;;;67444:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;67528:19;67538:8;67528:9;:19::i;:::-;67363:192:::0;:::o;64988:127::-;65095:1;65077:7;:14;;;:19;;;;;;;;;;;64988:127;:::o;55546:::-;55611:4;55635:30;55657:7;55635:12;:21;;:30;;;;:::i;:::-;55628:37;;55546:127;;;:::o;34329:98::-;34382:7;34409:10;34402:17;;34329:98;:::o;61659:192::-;61761:2;61734:15;:24;61750:7;61734:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;61817:7;61813:2;61779:46;;61788:23;61803:7;61788:14;:23::i;:::-;61779:46;;;;;;;;;;;;61659:192;;:::o;15428:123::-;15497:7;15524:19;15532:3;:10;;15524:7;:19::i;:::-;15517:26;;15428:123;;;:::o;55840:355::-;55933:4;55958:16;55966:7;55958;:16::i;:::-;55950:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;56034:13;56050:23;56065:7;56050:14;:23::i;:::-;56034:39;;56103:5;56092:16;;:7;:16;;;:51;;;;56136:7;56112:31;;:20;56124:7;56112:11;:20::i;:::-;:31;;;56092:51;:94;;;;56147:39;56171:5;56178:7;56147:23;:39::i;:::-;56092:94;56084:103;;;55840:355;;;;:::o;59047:633::-;59206:4;59179:31;;:23;59194:7;59179:14;:23::i;:::-;:31;;;59171:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;59307:1;59293:16;;:2;:16;;;;59285:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;59363:39;59384:4;59390:2;59394:7;59363:20;:39::i;:::-;59467:29;59484:1;59488:7;59467:8;:29::i;:::-;59509:35;59536:7;59509:13;:19;59523:4;59509:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;59555:30;59577:7;59555:13;:17;59569:2;59555:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;59598:29;59615:7;59624:2;59598:12;:16;;:29;;;;;:::i;:::-;;59664:7;59660:2;59645:27;;59654:4;59645:27;;;;;;;;;;;;59047:633;;;:::o;64866:114::-;64931:7;64958;:14;;;64951:21;;64866:114;;;:::o;39421:98::-;39479:7;39510:1;39506;:5;;;;:::i;:::-;39499:12;;39421:98;;;;:::o;56538:110::-;56614:26;56624:2;56628:7;56614:26;;;;;;;;;;;;:9;:26::i;:::-;56538:110;;:::o;8239:131::-;8306:4;8330:32;8335:3;:10;;8355:5;8347:14;;8330:4;:32::i;:::-;8323:39;;8239:131;;;;:::o;63838:196::-;63905:7;63967:16;63985:12;63999:15;64016:7;63950:74;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63940:85;;;;;;63932:94;;63925:101;;63838:196;;;:::o;9469:137::-;9540:7;9575:22;9579:3;:10;;9591:5;9575:3;:22::i;:::-;9567:31;;9560:38;;9469:137;;;;:::o;9001:114::-;9061:7;9088:19;9096:3;:10;;9088:7;:19::i;:::-;9081:26;;9001:114;;;:::o;15899:236::-;15979:7;15988;16009:11;16022:13;16039:22;16043:3;:10;;16055:5;16039:3;:22::i;:::-;16008:53;;;;16088:3;16080:12;;16118:5;16110:14;;16072:55;;;;;;15899:236;;;;;:::o;60281:100::-;60365:8;60354;:19;;;;;;;;;;;;:::i;:::-;;60281:100;:::o;17185:247::-;17326:7;17377:44;17382:3;:10;;17402:3;17394:12;;17408;17377:4;:44::i;:::-;17369:53;;17346:78;;17185:247;;;;;:::o;67563:173::-;67619:16;67638:6;;;;;;;;;;;67619:25;;67664:8;67655:6;;:17;;;;;;;;;;;;;;;;;;67719:8;67688:40;;67709:8;67688:40;;;;;;;;;;;;67563:173;;:::o;8769:146::-;8846:4;8870:37;8880:3;:10;;8900:5;8892:14;;8870:9;:37::i;:::-;8863:44;;8769:146;;;;:::o;72289:374::-;72364:7;72384:19;72419:14;;72406:10;:27;;;;:::i;:::-;72384:49;;72462:1;72448:10;:15;72444:212;;;72487:23;;72480:30;;;;;72444:212;72546:2;72532:10;:16;72528:128;;;72572:21;;72565:28;;;;;72528:128;72633:11;72626:18;;;72289:374;;;;:::o;63641:189::-;63685:7;63705:5;;:7;;;;;;;;;:::i;:::-;;;;;;63765:16;63783:12;63797:15;63814:5;;63748:72;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63738:83;;;;;;63730:92;;63723:99;;63641:189;:::o;41123:98::-;41181:7;41212:1;41208;:5;;;;:::i;:::-;41201:12;;41123:98;;;;:::o;8546:137::-;8616:4;8640:35;8648:3;:10;;8668:5;8660:14;;8640:7;:35::i;:::-;8633:42;;8546:137;;;;:::o;40159:98::-;40217:7;40248:1;40244;:5;;;;:::i;:::-;40237:12;;40159:98;;;;:::o;54918:315::-;55075:28;55085:4;55091:2;55095:7;55075:9;:28::i;:::-;55122:48;55145:4;55151:2;55155:7;55164:5;55122:22;:48::i;:::-;55114:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;54918:315;;;;:::o;34862:723::-;34918:13;35148:1;35139:5;:10;35135:53;;;35166:10;;;;;;;;;;;;;;;;;;;;;35135:53;35198:12;35213:5;35198:20;;35229:14;35254:78;35269:1;35261:4;:9;35254:78;;35287:8;;;;;:::i;:::-;;;;35318:2;35310:10;;;;;:::i;:::-;;;35254:78;;;35342:19;35374:6;35364:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35342:39;;35392:154;35408:1;35399:5;:10;35392:154;;35436:1;35426:11;;;;;:::i;:::-;;;35503:2;35495:5;:10;;;;:::i;:::-;35482:2;:24;;;;:::i;:::-;35469:39;;35452:6;35459;35452:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;35532:2;35523:11;;;;;:::i;:::-;;;35392:154;;;35570:6;35556:21;;;;;34862:723;;;;:::o;15189:151::-;15273:4;15297:35;15307:3;:10;;15327:3;15319:12;;15297:9;:35::i;:::-;15290:42;;15189:151;;;;:::o;12199:109::-;12255:7;12282:18;:3;:9;;:16;:18::i;:::-;12275:25;;12199:109;;;:::o;62464:126::-;;;;:::o;14578:219::-;14701:4;14725:64;14730:3;:10;;14750:3;14742:12;;14780:5;14764:23;;14756:32;;14725:4;:64::i;:::-;14718:71;;14578:219;;;;;:::o;56875:321::-;57005:18;57011:2;57015:7;57005:5;:18::i;:::-;57056:54;57087:1;57091:2;57095:7;57104:5;57056:22;:54::i;:::-;57034:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;56875:321;;;:::o;1789:414::-;1852:4;1874:21;1884:3;1889:5;1874:9;:21::i;:::-;1869:327;;1912:3;:11;;1929:5;1912:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2095:3;:11;;:18;;;;2073:3;:12;;:19;2086:5;2073:19;;;;;;;;;;;:40;;;;2135:4;2128:11;;;;1869:327;2179:5;2172:12;;1789:414;;;;;:::o;4563:120::-;4630:7;4657:3;:11;;4669:5;4657:18;;;;;;;;;;;;;;;;;;;;;;;;4650:25;;4563:120;;;;:::o;4100:109::-;4156:7;4183:3;:11;;:18;;;;4176:25;;4100:109;;;:::o;12673:178::-;12740:7;12749;12769:11;12783:19;12796:5;12783:3;:9;;:12;;:19;;;;:::i;:::-;12769:33;;12821:3;12826;:11;;:16;12838:3;12826:16;;;;;;;;;;;;12813:30;;;;;12673:178;;;;;:::o;13976:278::-;14104:7;14124:13;14140:3;:11;;:16;14152:3;14140:16;;;;;;;;;;;;14124:32;;14184:1;14175:10;;:5;:10;;:33;;;;14189:19;14199:3;14204;14189:9;:19::i;:::-;14175:33;14210:12;14167:56;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;14241:5;14234:12;;;13976:278;;;;;:::o;3885:129::-;3958:4;4005:1;3982:3;:12;;:19;3995:5;3982:19;;;;;;;;;;;;:24;;3975:31;;3885:129;;;;:::o;2379:1420::-;2445:4;2563:18;2584:3;:12;;:19;2597:5;2584:19;;;;;;;;;;;;2563:40;;2634:1;2620:10;:15;2616:1176;;2995:21;3032:1;3019:10;:14;;;;:::i;:::-;2995:38;;3048:17;3089:1;3068:3;:11;;:18;;;;:22;;;;:::i;:::-;3048:42;;3124:13;3111:9;:26;3107:405;;3158:17;3178:3;:11;;3190:9;3178:22;;;;;;;;;;;;;;;;;;;;;;;;3158:42;;3332:9;3303:3;:11;;3315:13;3303:26;;;;;;;;;;;;;;;;;;;;;;;:38;;;;3443:10;3417:3;:12;;:23;3430:9;3417:23;;;;;;;;;;;:36;;;;3107:405;;3593:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3688:3;:12;;:19;3701:5;3688:19;;;;;;;;;;;3681:26;;;3731:4;3724:11;;;;;;;2616:1176;3775:5;3768:12;;;2379:1420;;;;;:::o;60946:594::-;61101:4;61123:15;:2;:13;;;:15::i;:::-;61118:60;;61162:4;61155:11;;;;61118:60;61188:23;61214:213;61267:45;;;61314:12;:10;:12::i;:::-;61328:4;61334:7;61343:5;61244:105;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61214:213;;;;;;;;;;;;;;;;;:2;:15;;;;:213;;;;;:::i;:::-;61188:239;;61438:13;61465:10;61454:32;;;;;;;;;;;;:::i;:::-;61438:48;;45818:10;61515:16;;61505:26;;;:6;:26;;;;61497:35;;;;60946:594;;;;;;;:::o;11978:126::-;12049:4;12073:23;12092:3;12073;:9;;:18;;:23;;;;:::i;:::-;12066:30;;11978:126;;;;:::o;5681:117::-;5744:7;5771:19;5779:3;:10;;5771:7;:19::i;:::-;5764:26;;5681:117;;;:::o;11373:195::-;11483:4;11519:5;11500:3;:11;;:16;11512:3;11500:16;;;;;;;;;;;:24;;;;11542:18;11556:3;11542;:9;;:13;;:18;;;;:::i;:::-;11535:25;;11373:195;;;;;:::o;57532:404::-;57626:1;57612:16;;:2;:16;;;;57604:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;57685:16;57693:7;57685;:16::i;:::-;57684:17;57676:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;57747:45;57776:1;57780:2;57784:7;57747:20;:45::i;:::-;57805:30;57827:7;57805:13;:17;57819:2;57805:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;57848:29;57865:7;57874:2;57848:12;:16;;:29;;;;;:::i;:::-;;57920:7;57916:2;57895:33;;57912:1;57895:33;;;;;;;;;;;;57532:404;;:::o;6152:131::-;6226:7;6253:22;6257:3;:10;;6269:5;6253:3;:22::i;:::-;6246:29;;6152:131;;;;:::o;26583:387::-;26643:4;26851:12;26918:7;26906:20;26898:28;;26961:1;26954:4;:8;26947:15;;;26583:387;;;:::o;29389:229::-;29526:12;29558:52;29580:6;29588:4;29594:1;29597:12;29558:21;:52::i;:::-;29551:59;;29389:229;;;;;:::o;5455:140::-;5535:4;5559:28;5569:3;:10;;5581:5;5559:9;:28::i;:::-;5552:35;;5455:140;;;;:::o;4937:125::-;5007:4;5031:23;5036:3;:10;;5048:5;5031:4;:23::i;:::-;5024:30;;4937:125;;;;:::o;30509:511::-;30679:12;30737:5;30712:21;:30;;30704:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;30804:18;30815:6;30804:10;:18::i;:::-;30796:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;30870:12;30884:23;30911:6;:11;;30930:5;30937:4;30911:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30869:73;;;;30960:52;30978:7;30987:10;30999:12;30960:17;:52::i;:::-;30953:59;;;;30509:511;;;;;;:::o;32978:712::-;33128:12;33157:7;33153:530;;;33188:10;33181:17;;;;33153:530;33322:1;33302:10;:17;:21;33298:374;;;33500:10;33494:17;33561:15;33548:10;33544:2;33540:19;33533:44;33448:148;33643:12;33636:20;;;;;;;;;;;:::i;:::-;;;;;;;;32978:712;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;685:343::-;762:5;787:65;803:48;844:6;803:48;:::i;:::-;787:65;:::i;:::-;778:74;;875:6;868:5;861:21;913:4;906:5;902:16;951:3;942:6;937:3;933:16;930:25;927:2;;;968:1;965;958:12;927:2;981:41;1015:6;1010:3;1005;981:41;:::i;:::-;768:260;;;;;;:::o;1034:345::-;1112:5;1137:66;1153:49;1195:6;1153:49;:::i;:::-;1137:66;:::i;:::-;1128:75;;1226:6;1219:5;1212:21;1264:4;1257:5;1253:16;1302:3;1293:6;1288:3;1284:16;1281:25;1278:2;;;1319:1;1316;1309:12;1278:2;1332:41;1366:6;1361:3;1356;1332:41;:::i;:::-;1118:261;;;;;;:::o;1385:139::-;1431:5;1469:6;1456:20;1447:29;;1485:33;1512:5;1485:33;:::i;:::-;1437:87;;;;:::o;1547:303::-;1618:5;1667:3;1660:4;1652:6;1648:17;1644:27;1634:2;;1685:1;1682;1675:12;1634:2;1725:6;1712:20;1750:94;1840:3;1832:6;1825:4;1817:6;1813:17;1750:94;:::i;:::-;1741:103;;1624:226;;;;;:::o;1856:133::-;1899:5;1937:6;1924:20;1915:29;;1953:30;1977:5;1953:30;:::i;:::-;1905:84;;;;:::o;1995:137::-;2040:5;2078:6;2065:20;2056:29;;2094:32;2120:5;2094:32;:::i;:::-;2046:86;;;;:::o;2138:141::-;2194:5;2225:6;2219:13;2210:22;;2241:32;2267:5;2241:32;:::i;:::-;2200:79;;;;:::o;2298:271::-;2353:5;2402:3;2395:4;2387:6;2383:17;2379:27;2369:2;;2420:1;2417;2410:12;2369:2;2460:6;2447:20;2485:78;2559:3;2551:6;2544:4;2536:6;2532:17;2485:78;:::i;:::-;2476:87;;2359:210;;;;;:::o;2589:273::-;2645:5;2694:3;2687:4;2679:6;2675:17;2671:27;2661:2;;2712:1;2709;2702:12;2661:2;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2651:211;;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2920:87;;;;:::o;3013:135::-;3057:5;3095:6;3082:20;3073:29;;3111:31;3136:5;3111:31;:::i;:::-;3063:85;;;;:::o;3154:262::-;3213:6;3262:2;3250:9;3241:7;3237:23;3233:32;3230:2;;;3278:1;3275;3268:12;3230:2;3321:1;3346:53;3391:7;3382:6;3371:9;3367:22;3346:53;:::i;:::-;3336:63;;3292:117;3220:196;;;;:::o;3422:407::-;3490:6;3498;3547:2;3535:9;3526:7;3522:23;3518:32;3515:2;;;3563:1;3560;3553:12;3515:2;3606:1;3631:53;3676:7;3667:6;3656:9;3652:22;3631:53;:::i;:::-;3621:63;;3577:117;3733:2;3759:53;3804:7;3795:6;3784:9;3780:22;3759:53;:::i;:::-;3749:63;;3704:118;3505:324;;;;;:::o;3835:552::-;3912:6;3920;3928;3977:2;3965:9;3956:7;3952:23;3948:32;3945:2;;;3993:1;3990;3983:12;3945:2;4036:1;4061:53;4106:7;4097:6;4086:9;4082:22;4061:53;:::i;:::-;4051:63;;4007:117;4163:2;4189:53;4234:7;4225:6;4214:9;4210:22;4189:53;:::i;:::-;4179:63;;4134:118;4291:2;4317:53;4362:7;4353:6;4342:9;4338:22;4317:53;:::i;:::-;4307:63;;4262:118;3935:452;;;;;:::o;4393:809::-;4488:6;4496;4504;4512;4561:3;4549:9;4540:7;4536:23;4532:33;4529:2;;;4578:1;4575;4568:12;4529:2;4621:1;4646:53;4691:7;4682:6;4671:9;4667:22;4646:53;:::i;:::-;4636:63;;4592:117;4748:2;4774:53;4819:7;4810:6;4799:9;4795:22;4774:53;:::i;:::-;4764:63;;4719:118;4876:2;4902:53;4947:7;4938:6;4927:9;4923:22;4902:53;:::i;:::-;4892:63;;4847:118;5032:2;5021:9;5017:18;5004:32;5063:18;5055:6;5052:30;5049:2;;;5095:1;5092;5085:12;5049:2;5123:62;5177:7;5168:6;5157:9;5153:22;5123:62;:::i;:::-;5113:72;;4975:220;4519:683;;;;;;;:::o;5208:401::-;5273:6;5281;5330:2;5318:9;5309:7;5305:23;5301:32;5298:2;;;5346:1;5343;5336:12;5298:2;5389:1;5414:53;5459:7;5450:6;5439:9;5435:22;5414:53;:::i;:::-;5404:63;;5360:117;5516:2;5542:50;5584:7;5575:6;5564:9;5560:22;5542:50;:::i;:::-;5532:60;;5487:115;5288:321;;;;;:::o;5615:407::-;5683:6;5691;5740:2;5728:9;5719:7;5715:23;5711:32;5708:2;;;5756:1;5753;5746:12;5708:2;5799:1;5824:53;5869:7;5860:6;5849:9;5845:22;5824:53;:::i;:::-;5814:63;;5770:117;5926:2;5952:53;5997:7;5988:6;5977:9;5973:22;5952:53;:::i;:::-;5942:63;;5897:118;5698:324;;;;;:::o;6028:550::-;6121:6;6129;6178:2;6166:9;6157:7;6153:23;6149:32;6146:2;;;6194:1;6191;6184:12;6146:2;6265:1;6254:9;6250:17;6237:31;6295:18;6287:6;6284:30;6281:2;;;6327:1;6324;6317:12;6281:2;6355:78;6425:7;6416:6;6405:9;6401:22;6355:78;:::i;:::-;6345:88;;6208:235;6482:2;6508:53;6553:7;6544:6;6533:9;6529:22;6508:53;:::i;:::-;6498:63;;6453:118;6136:442;;;;;:::o;6584:260::-;6642:6;6691:2;6679:9;6670:7;6666:23;6662:32;6659:2;;;6707:1;6704;6697:12;6659:2;6750:1;6775:52;6819:7;6810:6;6799:9;6795:22;6775:52;:::i;:::-;6765:62;;6721:116;6649:195;;;;:::o;6850:282::-;6919:6;6968:2;6956:9;6947:7;6943:23;6939:32;6936:2;;;6984:1;6981;6974:12;6936:2;7027:1;7052:63;7107:7;7098:6;7087:9;7083:22;7052:63;:::i;:::-;7042:73;;6998:127;6926:206;;;;:::o;7138:375::-;7207:6;7256:2;7244:9;7235:7;7231:23;7227:32;7224:2;;;7272:1;7269;7262:12;7224:2;7343:1;7332:9;7328:17;7315:31;7373:18;7365:6;7362:30;7359:2;;;7405:1;7402;7395:12;7359:2;7433:63;7488:7;7479:6;7468:9;7464:22;7433:63;:::i;:::-;7423:73;;7286:220;7214:299;;;;:::o;7519:262::-;7578:6;7627:2;7615:9;7606:7;7602:23;7598:32;7595:2;;;7643:1;7640;7633:12;7595:2;7686:1;7711:53;7756:7;7747:6;7736:9;7732:22;7711:53;:::i;:::-;7701:63;;7657:117;7585:196;;;;:::o;7787:403::-;7853:6;7861;7910:2;7898:9;7889:7;7885:23;7881:32;7878:2;;;7926:1;7923;7916:12;7878:2;7969:1;7994:53;8039:7;8030:6;8019:9;8015:22;7994:53;:::i;:::-;7984:63;;7940:117;8096:2;8122:51;8165:7;8156:6;8145:9;8141:22;8122:51;:::i;:::-;8112:61;;8067:116;7868:322;;;;;:::o;8196:179::-;8265:10;8286:46;8328:3;8320:6;8286:46;:::i;:::-;8364:4;8359:3;8355:14;8341:28;;8276:99;;;;:::o;8381:118::-;8468:24;8486:5;8468:24;:::i;:::-;8463:3;8456:37;8446:53;;:::o;8535:732::-;8654:3;8683:54;8731:5;8683:54;:::i;:::-;8753:86;8832:6;8827:3;8753:86;:::i;:::-;8746:93;;8863:56;8913:5;8863:56;:::i;:::-;8942:7;8973:1;8958:284;8983:6;8980:1;8977:13;8958:284;;;9059:6;9053:13;9086:63;9145:3;9130:13;9086:63;:::i;:::-;9079:70;;9172:60;9225:6;9172:60;:::i;:::-;9162:70;;9018:224;9005:1;9002;8998:9;8993:14;;8958:284;;;8962:14;9258:3;9251:10;;8659:608;;;;;;;:::o;9273:109::-;9354:21;9369:5;9354:21;:::i;:::-;9349:3;9342:34;9332:50;;:::o;9388:360::-;9474:3;9502:38;9534:5;9502:38;:::i;:::-;9556:70;9619:6;9614:3;9556:70;:::i;:::-;9549:77;;9635:52;9680:6;9675:3;9668:4;9661:5;9657:16;9635:52;:::i;:::-;9712:29;9734:6;9712:29;:::i;:::-;9707:3;9703:39;9696:46;;9478:270;;;;;:::o;9754:373::-;9858:3;9886:38;9918:5;9886:38;:::i;:::-;9940:88;10021:6;10016:3;9940:88;:::i;:::-;9933:95;;10037:52;10082:6;10077:3;10070:4;10063:5;10059:16;10037:52;:::i;:::-;10114:6;10109:3;10105:16;10098:23;;9862:265;;;;;:::o;10133:364::-;10221:3;10249:39;10282:5;10249:39;:::i;:::-;10304:71;10368:6;10363:3;10304:71;:::i;:::-;10297:78;;10384:52;10429:6;10424:3;10417:4;10410:5;10406:16;10384:52;:::i;:::-;10461:29;10483:6;10461:29;:::i;:::-;10456:3;10452:39;10445:46;;10225:272;;;;;:::o;10503:377::-;10609:3;10637:39;10670:5;10637:39;:::i;:::-;10692:89;10774:6;10769:3;10692:89;:::i;:::-;10685:96;;10790:52;10835:6;10830:3;10823:4;10816:5;10812:16;10790:52;:::i;:::-;10867:6;10862:3;10858:16;10851:23;;10613:267;;;;;:::o;10886:366::-;11028:3;11049:67;11113:2;11108:3;11049:67;:::i;:::-;11042:74;;11125:93;11214:3;11125:93;:::i;:::-;11243:2;11238:3;11234:12;11227:19;;11032:220;;;:::o;11258:366::-;11400:3;11421:67;11485:2;11480:3;11421:67;:::i;:::-;11414:74;;11497:93;11586:3;11497:93;:::i;:::-;11615:2;11610:3;11606:12;11599:19;;11404:220;;;:::o;11630:366::-;11772:3;11793:67;11857:2;11852:3;11793:67;:::i;:::-;11786:74;;11869:93;11958:3;11869:93;:::i;:::-;11987:2;11982:3;11978:12;11971:19;;11776:220;;;:::o;12002:366::-;12144:3;12165:67;12229:2;12224:3;12165:67;:::i;:::-;12158:74;;12241:93;12330:3;12241:93;:::i;:::-;12359:2;12354:3;12350:12;12343:19;;12148:220;;;:::o;12374:366::-;12516:3;12537:67;12601:2;12596:3;12537:67;:::i;:::-;12530:74;;12613:93;12702:3;12613:93;:::i;:::-;12731:2;12726:3;12722:12;12715:19;;12520:220;;;:::o;12746:366::-;12888:3;12909:67;12973:2;12968:3;12909:67;:::i;:::-;12902:74;;12985:93;13074:3;12985:93;:::i;:::-;13103:2;13098:3;13094:12;13087:19;;12892:220;;;:::o;13118:366::-;13260:3;13281:67;13345:2;13340:3;13281:67;:::i;:::-;13274:74;;13357:93;13446:3;13357:93;:::i;:::-;13475:2;13470:3;13466:12;13459:19;;13264:220;;;:::o;13490:366::-;13632:3;13653:67;13717:2;13712:3;13653:67;:::i;:::-;13646:74;;13729:93;13818:3;13729:93;:::i;:::-;13847:2;13842:3;13838:12;13831:19;;13636:220;;;:::o;13862:366::-;14004:3;14025:67;14089:2;14084:3;14025:67;:::i;:::-;14018:74;;14101:93;14190:3;14101:93;:::i;:::-;14219:2;14214:3;14210:12;14203:19;;14008:220;;;:::o;14234:366::-;14376:3;14397:67;14461:2;14456:3;14397:67;:::i;:::-;14390:74;;14473:93;14562:3;14473:93;:::i;:::-;14591:2;14586:3;14582:12;14575:19;;14380:220;;;:::o;14606:366::-;14748:3;14769:67;14833:2;14828:3;14769:67;:::i;:::-;14762:74;;14845:93;14934:3;14845:93;:::i;:::-;14963:2;14958:3;14954:12;14947:19;;14752:220;;;:::o;14978:366::-;15120:3;15141:67;15205:2;15200:3;15141:67;:::i;:::-;15134:74;;15217:93;15306:3;15217:93;:::i;:::-;15335:2;15330:3;15326:12;15319:19;;15124:220;;;:::o;15350:366::-;15492:3;15513:67;15577:2;15572:3;15513:67;:::i;:::-;15506:74;;15589:93;15678:3;15589:93;:::i;:::-;15707:2;15702:3;15698:12;15691:19;;15496:220;;;:::o;15722:366::-;15864:3;15885:67;15949:2;15944:3;15885:67;:::i;:::-;15878:74;;15961:93;16050:3;15961:93;:::i;:::-;16079:2;16074:3;16070:12;16063:19;;15868:220;;;:::o;16094:366::-;16236:3;16257:67;16321:2;16316:3;16257:67;:::i;:::-;16250:74;;16333:93;16422:3;16333:93;:::i;:::-;16451:2;16446:3;16442:12;16435:19;;16240:220;;;:::o;16466:366::-;16608:3;16629:67;16693:2;16688:3;16629:67;:::i;:::-;16622:74;;16705:93;16794:3;16705:93;:::i;:::-;16823:2;16818:3;16814:12;16807:19;;16612:220;;;:::o;16838:366::-;16980:3;17001:67;17065:2;17060:3;17001:67;:::i;:::-;16994:74;;17077:93;17166:3;17077:93;:::i;:::-;17195:2;17190:3;17186:12;17179:19;;16984:220;;;:::o;17210:366::-;17352:3;17373:67;17437:2;17432:3;17373:67;:::i;:::-;17366:74;;17449:93;17538:3;17449:93;:::i;:::-;17567:2;17562:3;17558:12;17551:19;;17356:220;;;:::o;17582:366::-;17724:3;17745:67;17809:2;17804:3;17745:67;:::i;:::-;17738:74;;17821:93;17910:3;17821:93;:::i;:::-;17939:2;17934:3;17930:12;17923:19;;17728:220;;;:::o;17954:366::-;18096:3;18117:67;18181:2;18176:3;18117:67;:::i;:::-;18110:74;;18193:93;18282:3;18193:93;:::i;:::-;18311:2;18306:3;18302:12;18295:19;;18100:220;;;:::o;18326:366::-;18468:3;18489:67;18553:2;18548:3;18489:67;:::i;:::-;18482:74;;18565:93;18654:3;18565:93;:::i;:::-;18683:2;18678:3;18674:12;18667:19;;18472:220;;;:::o;18698:366::-;18840:3;18861:67;18925:2;18920:3;18861:67;:::i;:::-;18854:74;;18937:93;19026:3;18937:93;:::i;:::-;19055:2;19050:3;19046:12;19039:19;;18844:220;;;:::o;19070:366::-;19212:3;19233:67;19297:2;19292:3;19233:67;:::i;:::-;19226:74;;19309:93;19398:3;19309:93;:::i;:::-;19427:2;19422:3;19418:12;19411:19;;19216:220;;;:::o;19442:366::-;19584:3;19605:67;19669:2;19664:3;19605:67;:::i;:::-;19598:74;;19681:93;19770:3;19681:93;:::i;:::-;19799:2;19794:3;19790:12;19783:19;;19588:220;;;:::o;19814:366::-;19956:3;19977:67;20041:2;20036:3;19977:67;:::i;:::-;19970:74;;20053:93;20142:3;20053:93;:::i;:::-;20171:2;20166:3;20162:12;20155:19;;19960:220;;;:::o;20186:366::-;20328:3;20349:67;20413:2;20408:3;20349:67;:::i;:::-;20342:74;;20425:93;20514:3;20425:93;:::i;:::-;20543:2;20538:3;20534:12;20527:19;;20332:220;;;:::o;20558:366::-;20700:3;20721:67;20785:2;20780:3;20721:67;:::i;:::-;20714:74;;20797:93;20886:3;20797:93;:::i;:::-;20915:2;20910:3;20906:12;20899:19;;20704:220;;;:::o;20930:108::-;21007:24;21025:5;21007:24;:::i;:::-;21002:3;20995:37;20985:53;;:::o;21044:118::-;21131:24;21149:5;21131:24;:::i;:::-;21126:3;21119:37;21109:53;;:::o;21168:157::-;21273:45;21293:24;21311:5;21293:24;:::i;:::-;21273:45;:::i;:::-;21268:3;21261:58;21251:74;;:::o;21331:271::-;21461:3;21483:93;21572:3;21563:6;21483:93;:::i;:::-;21476:100;;21593:3;21586:10;;21465:137;;;;:::o;21608:435::-;21788:3;21810:95;21901:3;21892:6;21810:95;:::i;:::-;21803:102;;21922:95;22013:3;22004:6;21922:95;:::i;:::-;21915:102;;22034:3;22027:10;;21792:251;;;;;:::o;22049:679::-;22245:3;22260:75;22331:3;22322:6;22260:75;:::i;:::-;22360:2;22355:3;22351:12;22344:19;;22373:75;22444:3;22435:6;22373:75;:::i;:::-;22473:2;22468:3;22464:12;22457:19;;22486:75;22557:3;22548:6;22486:75;:::i;:::-;22586:2;22581:3;22577:12;22570:19;;22599:75;22670:3;22661:6;22599:75;:::i;:::-;22699:2;22694:3;22690:12;22683:19;;22719:3;22712:10;;22249:479;;;;;;;:::o;22734:222::-;22827:4;22865:2;22854:9;22850:18;22842:26;;22878:71;22946:1;22935:9;22931:17;22922:6;22878:71;:::i;:::-;22832:124;;;;:::o;22962:640::-;23157:4;23195:3;23184:9;23180:19;23172:27;;23209:71;23277:1;23266:9;23262:17;23253:6;23209:71;:::i;:::-;23290:72;23358:2;23347:9;23343:18;23334:6;23290:72;:::i;:::-;23372;23440:2;23429:9;23425:18;23416:6;23372:72;:::i;:::-;23491:9;23485:4;23481:20;23476:2;23465:9;23461:18;23454:48;23519:76;23590:4;23581:6;23519:76;:::i;:::-;23511:84;;23162:440;;;;;;;:::o;23608:373::-;23751:4;23789:2;23778:9;23774:18;23766:26;;23838:9;23832:4;23828:20;23824:1;23813:9;23809:17;23802:47;23866:108;23969:4;23960:6;23866:108;:::i;:::-;23858:116;;23756:225;;;;:::o;23987:210::-;24074:4;24112:2;24101:9;24097:18;24089:26;;24125:65;24187:1;24176:9;24172:17;24163:6;24125:65;:::i;:::-;24079:118;;;;:::o;24203:313::-;24316:4;24354:2;24343:9;24339:18;24331:26;;24403:9;24397:4;24393:20;24389:1;24378:9;24374:17;24367:47;24431:78;24504:4;24495:6;24431:78;:::i;:::-;24423:86;;24321:195;;;;:::o;24522:419::-;24688:4;24726:2;24715:9;24711:18;24703:26;;24775:9;24769:4;24765:20;24761:1;24750:9;24746:17;24739:47;24803:131;24929:4;24803:131;:::i;:::-;24795:139;;24693:248;;;:::o;24947:419::-;25113:4;25151:2;25140:9;25136:18;25128:26;;25200:9;25194:4;25190:20;25186:1;25175:9;25171:17;25164:47;25228:131;25354:4;25228:131;:::i;:::-;25220:139;;25118:248;;;:::o;25372:419::-;25538:4;25576:2;25565:9;25561:18;25553:26;;25625:9;25619:4;25615:20;25611:1;25600:9;25596:17;25589:47;25653:131;25779:4;25653:131;:::i;:::-;25645:139;;25543:248;;;:::o;25797:419::-;25963:4;26001:2;25990:9;25986:18;25978:26;;26050:9;26044:4;26040:20;26036:1;26025:9;26021:17;26014:47;26078:131;26204:4;26078:131;:::i;:::-;26070:139;;25968:248;;;:::o;26222:419::-;26388:4;26426:2;26415:9;26411:18;26403:26;;26475:9;26469:4;26465:20;26461:1;26450:9;26446:17;26439:47;26503:131;26629:4;26503:131;:::i;:::-;26495:139;;26393:248;;;:::o;26647:419::-;26813:4;26851:2;26840:9;26836:18;26828:26;;26900:9;26894:4;26890:20;26886:1;26875:9;26871:17;26864:47;26928:131;27054:4;26928:131;:::i;:::-;26920:139;;26818:248;;;:::o;27072:419::-;27238:4;27276:2;27265:9;27261:18;27253:26;;27325:9;27319:4;27315:20;27311:1;27300:9;27296:17;27289:47;27353:131;27479:4;27353:131;:::i;:::-;27345:139;;27243:248;;;:::o;27497:419::-;27663:4;27701:2;27690:9;27686:18;27678:26;;27750:9;27744:4;27740:20;27736:1;27725:9;27721:17;27714:47;27778:131;27904:4;27778:131;:::i;:::-;27770:139;;27668:248;;;:::o;27922:419::-;28088:4;28126:2;28115:9;28111:18;28103:26;;28175:9;28169:4;28165:20;28161:1;28150:9;28146:17;28139:47;28203:131;28329:4;28203:131;:::i;:::-;28195:139;;28093:248;;;:::o;28347:419::-;28513:4;28551:2;28540:9;28536:18;28528:26;;28600:9;28594:4;28590:20;28586:1;28575:9;28571:17;28564:47;28628:131;28754:4;28628:131;:::i;:::-;28620:139;;28518:248;;;:::o;28772:419::-;28938:4;28976:2;28965:9;28961:18;28953:26;;29025:9;29019:4;29015:20;29011:1;29000:9;28996:17;28989:47;29053:131;29179:4;29053:131;:::i;:::-;29045:139;;28943:248;;;:::o;29197:419::-;29363:4;29401:2;29390:9;29386:18;29378:26;;29450:9;29444:4;29440:20;29436:1;29425:9;29421:17;29414:47;29478:131;29604:4;29478:131;:::i;:::-;29470:139;;29368:248;;;:::o;29622:419::-;29788:4;29826:2;29815:9;29811:18;29803:26;;29875:9;29869:4;29865:20;29861:1;29850:9;29846:17;29839:47;29903:131;30029:4;29903:131;:::i;:::-;29895:139;;29793:248;;;:::o;30047:419::-;30213:4;30251:2;30240:9;30236:18;30228:26;;30300:9;30294:4;30290:20;30286:1;30275:9;30271:17;30264:47;30328:131;30454:4;30328:131;:::i;:::-;30320:139;;30218:248;;;:::o;30472:419::-;30638:4;30676:2;30665:9;30661:18;30653:26;;30725:9;30719:4;30715:20;30711:1;30700:9;30696:17;30689:47;30753:131;30879:4;30753:131;:::i;:::-;30745:139;;30643:248;;;:::o;30897:419::-;31063:4;31101:2;31090:9;31086:18;31078:26;;31150:9;31144:4;31140:20;31136:1;31125:9;31121:17;31114:47;31178:131;31304:4;31178:131;:::i;:::-;31170:139;;31068:248;;;:::o;31322:419::-;31488:4;31526:2;31515:9;31511:18;31503:26;;31575:9;31569:4;31565:20;31561:1;31550:9;31546:17;31539:47;31603:131;31729:4;31603:131;:::i;:::-;31595:139;;31493:248;;;:::o;31747:419::-;31913:4;31951:2;31940:9;31936:18;31928:26;;32000:9;31994:4;31990:20;31986:1;31975:9;31971:17;31964:47;32028:131;32154:4;32028:131;:::i;:::-;32020:139;;31918:248;;;:::o;32172:419::-;32338:4;32376:2;32365:9;32361:18;32353:26;;32425:9;32419:4;32415:20;32411:1;32400:9;32396:17;32389:47;32453:131;32579:4;32453:131;:::i;:::-;32445:139;;32343:248;;;:::o;32597:419::-;32763:4;32801:2;32790:9;32786:18;32778:26;;32850:9;32844:4;32840:20;32836:1;32825:9;32821:17;32814:47;32878:131;33004:4;32878:131;:::i;:::-;32870:139;;32768:248;;;:::o;33022:419::-;33188:4;33226:2;33215:9;33211:18;33203:26;;33275:9;33269:4;33265:20;33261:1;33250:9;33246:17;33239:47;33303:131;33429:4;33303:131;:::i;:::-;33295:139;;33193:248;;;:::o;33447:419::-;33613:4;33651:2;33640:9;33636:18;33628:26;;33700:9;33694:4;33690:20;33686:1;33675:9;33671:17;33664:47;33728:131;33854:4;33728:131;:::i;:::-;33720:139;;33618:248;;;:::o;33872:419::-;34038:4;34076:2;34065:9;34061:18;34053:26;;34125:9;34119:4;34115:20;34111:1;34100:9;34096:17;34089:47;34153:131;34279:4;34153:131;:::i;:::-;34145:139;;34043:248;;;:::o;34297:419::-;34463:4;34501:2;34490:9;34486:18;34478:26;;34550:9;34544:4;34540:20;34536:1;34525:9;34521:17;34514:47;34578:131;34704:4;34578:131;:::i;:::-;34570:139;;34468:248;;;:::o;34722:419::-;34888:4;34926:2;34915:9;34911:18;34903:26;;34975:9;34969:4;34965:20;34961:1;34950:9;34946:17;34939:47;35003:131;35129:4;35003:131;:::i;:::-;34995:139;;34893:248;;;:::o;35147:419::-;35313:4;35351:2;35340:9;35336:18;35328:26;;35400:9;35394:4;35390:20;35386:1;35375:9;35371:17;35364:47;35428:131;35554:4;35428:131;:::i;:::-;35420:139;;35318:248;;;:::o;35572:419::-;35738:4;35776:2;35765:9;35761:18;35753:26;;35825:9;35819:4;35815:20;35811:1;35800:9;35796:17;35789:47;35853:131;35979:4;35853:131;:::i;:::-;35845:139;;35743:248;;;:::o;35997:222::-;36090:4;36128:2;36117:9;36113:18;36105:26;;36141:71;36209:1;36198:9;36194:17;36185:6;36141:71;:::i;:::-;36095:124;;;;:::o;36225:129::-;36259:6;36286:20;;:::i;:::-;36276:30;;36315:33;36343:4;36335:6;36315:33;:::i;:::-;36266:88;;;:::o;36360:75::-;36393:6;36426:2;36420:9;36410:19;;36400:35;:::o;36441:311::-;36518:4;36608:18;36600:6;36597:30;36594:2;;;36630:18;;:::i;:::-;36594:2;36680:4;36672:6;36668:17;36660:25;;36740:4;36734;36730:15;36722:23;;36523:229;;;:::o;36758:307::-;36819:4;36909:18;36901:6;36898:30;36895:2;;;36931:18;;:::i;:::-;36895:2;36969:29;36991:6;36969:29;:::i;:::-;36961:37;;37053:4;37047;37043:15;37035:23;;36824:241;;;:::o;37071:308::-;37133:4;37223:18;37215:6;37212:30;37209:2;;;37245:18;;:::i;:::-;37209:2;37283:29;37305:6;37283:29;:::i;:::-;37275:37;;37367:4;37361;37357:15;37349:23;;37138:241;;;:::o;37385:132::-;37452:4;37475:3;37467:11;;37505:4;37500:3;37496:14;37488:22;;37457:60;;;:::o;37523:114::-;37590:6;37624:5;37618:12;37608:22;;37597:40;;;:::o;37643:98::-;37694:6;37728:5;37722:12;37712:22;;37701:40;;;:::o;37747:99::-;37799:6;37833:5;37827:12;37817:22;;37806:40;;;:::o;37852:113::-;37922:4;37954;37949:3;37945:14;37937:22;;37927:38;;;:::o;37971:184::-;38070:11;38104:6;38099:3;38092:19;38144:4;38139:3;38135:14;38120:29;;38082:73;;;;:::o;38161:168::-;38244:11;38278:6;38273:3;38266:19;38318:4;38313:3;38309:14;38294:29;;38256:73;;;;:::o;38335:147::-;38436:11;38473:3;38458:18;;38448:34;;;;:::o;38488:169::-;38572:11;38606:6;38601:3;38594:19;38646:4;38641:3;38637:14;38622:29;;38584:73;;;;:::o;38663:148::-;38765:11;38802:3;38787:18;;38777:34;;;;:::o;38817:305::-;38857:3;38876:20;38894:1;38876:20;:::i;:::-;38871:25;;38910:20;38928:1;38910:20;:::i;:::-;38905:25;;39064:1;38996:66;38992:74;38989:1;38986:81;38983:2;;;39070:18;;:::i;:::-;38983:2;39114:1;39111;39107:9;39100:16;;38861:261;;;;:::o;39128:185::-;39168:1;39185:20;39203:1;39185:20;:::i;:::-;39180:25;;39219:20;39237:1;39219:20;:::i;:::-;39214:25;;39258:1;39248:2;;39263:18;;:::i;:::-;39248:2;39305:1;39302;39298:9;39293:14;;39170:143;;;;:::o;39319:348::-;39359:7;39382:20;39400:1;39382:20;:::i;:::-;39377:25;;39416:20;39434:1;39416:20;:::i;:::-;39411:25;;39604:1;39536:66;39532:74;39529:1;39526:81;39521:1;39514:9;39507:17;39503:105;39500:2;;;39611:18;;:::i;:::-;39500:2;39659:1;39656;39652:9;39641:20;;39367:300;;;;:::o;39673:191::-;39713:4;39733:20;39751:1;39733:20;:::i;:::-;39728:25;;39767:20;39785:1;39767:20;:::i;:::-;39762:25;;39806:1;39803;39800:8;39797:2;;;39811:18;;:::i;:::-;39797:2;39856:1;39853;39849:9;39841:17;;39718:146;;;;:::o;39870:96::-;39907:7;39936:24;39954:5;39936:24;:::i;:::-;39925:35;;39915:51;;;:::o;39972:90::-;40006:7;40049:5;40042:13;40035:21;40024:32;;40014:48;;;:::o;40068:149::-;40104:7;40144:66;40137:5;40133:78;40122:89;;40112:105;;;:::o;40223:126::-;40260:7;40300:42;40293:5;40289:54;40278:65;;40268:81;;;:::o;40355:77::-;40392:7;40421:5;40410:16;;40400:32;;;:::o;40438:86::-;40473:7;40513:4;40506:5;40502:16;40491:27;;40481:43;;;:::o;40530:154::-;40614:6;40609:3;40604;40591:30;40676:1;40667:6;40662:3;40658:16;40651:27;40581:103;;;:::o;40690:307::-;40758:1;40768:113;40782:6;40779:1;40776:13;40768:113;;;40867:1;40862:3;40858:11;40852:18;40848:1;40843:3;40839:11;40832:39;40804:2;40801:1;40797:10;40792:15;;40768:113;;;40899:6;40896:1;40893:13;40890:2;;;40979:1;40970:6;40965:3;40961:16;40954:27;40890:2;40739:258;;;;:::o;41003:320::-;41047:6;41084:1;41078:4;41074:12;41064:22;;41131:1;41125:4;41121:12;41152:18;41142:2;;41208:4;41200:6;41196:17;41186:27;;41142:2;41270;41262:6;41259:14;41239:18;41236:38;41233:2;;;41289:18;;:::i;:::-;41233:2;41054:269;;;;:::o;41329:281::-;41412:27;41434:4;41412:27;:::i;:::-;41404:6;41400:40;41542:6;41530:10;41527:22;41506:18;41494:10;41491:34;41488:62;41485:2;;;41553:18;;:::i;:::-;41485:2;41593:10;41589:2;41582:22;41372:238;;;:::o;41616:233::-;41655:3;41678:24;41696:5;41678:24;:::i;:::-;41669:33;;41724:66;41717:5;41714:77;41711:2;;;41794:18;;:::i;:::-;41711:2;41841:1;41834:5;41830:13;41823:20;;41659:190;;;:::o;41855:79::-;41894:7;41923:5;41912:16;;41902:32;;;:::o;41940:176::-;41972:1;41989:20;42007:1;41989:20;:::i;:::-;41984:25;;42023:20;42041:1;42023:20;:::i;:::-;42018:25;;42062:1;42052:2;;42067:18;;:::i;:::-;42052:2;42108:1;42105;42101:9;42096:14;;41974:142;;;;:::o;42122:180::-;42170:77;42167:1;42160:88;42267:4;42264:1;42257:15;42291:4;42288:1;42281:15;42308:180;42356:77;42353:1;42346:88;42453:4;42450:1;42443:15;42477:4;42474:1;42467:15;42494:180;42542:77;42539:1;42532:88;42639:4;42636:1;42629:15;42663:4;42660:1;42653:15;42680:180;42728:77;42725:1;42718:88;42825:4;42822:1;42815:15;42849:4;42846:1;42839:15;42866:102;42907:6;42958:2;42954:7;42949:2;42942:5;42938:14;42934:28;42924:38;;42914:54;;;:::o;42974:221::-;43114:34;43110:1;43102:6;43098:14;43091:58;43183:4;43178:2;43170:6;43166:15;43159:29;43080:115;:::o;43201:243::-;43341:34;43337:1;43329:6;43325:14;43318:58;43410:26;43405:2;43397:6;43393:15;43386:51;43307:137;:::o;43450:237::-;43590:34;43586:1;43578:6;43574:14;43567:58;43659:20;43654:2;43646:6;43642:15;43635:45;43556:131;:::o;43693:225::-;43833:34;43829:1;43821:6;43817:14;43810:58;43902:8;43897:2;43889:6;43885:15;43878:33;43799:119;:::o;43924:178::-;44064:30;44060:1;44052:6;44048:14;44041:54;44030:72;:::o;44108:181::-;44248:33;44244:1;44236:6;44232:14;44225:57;44214:75;:::o;44295:245::-;44435:34;44431:1;44423:6;44419:14;44412:58;44504:28;44499:2;44491:6;44487:15;44480:53;44401:139;:::o;44546:224::-;44686:34;44682:1;44674:6;44670:14;44663:58;44755:7;44750:2;44742:6;44738:15;44731:32;44652:118;:::o;44776:223::-;44916:34;44912:1;44904:6;44900:14;44893:58;44985:6;44980:2;44972:6;44968:15;44961:31;44882:117;:::o;45005:175::-;45145:27;45141:1;45133:6;45129:14;45122:51;45111:69;:::o;45186:250::-;45326:34;45322:1;45314:6;45310:14;45303:58;45395:33;45390:2;45382:6;45378:15;45371:58;45292:144;:::o;45442:225::-;45582:34;45578:1;45570:6;45566:14;45559:58;45651:8;45646:2;45638:6;45634:15;45627:33;45548:119;:::o;45673:181::-;45813:33;45809:1;45801:6;45797:14;45790:57;45779:75;:::o;45860:225::-;46000:34;45996:1;45988:6;45984:14;45977:58;46069:8;46064:2;46056:6;46052:15;46045:33;45966:119;:::o;46091:231::-;46231:34;46227:1;46219:6;46215:14;46208:58;46300:14;46295:2;46287:6;46283:15;46276:39;46197:125;:::o;46328:243::-;46468:34;46464:1;46456:6;46452:14;46445:58;46537:26;46532:2;46524:6;46520:15;46513:51;46434:137;:::o;46577:229::-;46717:34;46713:1;46705:6;46701:14;46694:58;46786:12;46781:2;46773:6;46769:15;46762:37;46683:123;:::o;46812:238::-;46952:34;46948:1;46940:6;46936:14;46929:58;47021:21;47016:2;47008:6;47004:15;46997:46;46918:132;:::o;47056:182::-;47196:34;47192:1;47184:6;47180:14;47173:58;47162:76;:::o;47244:231::-;47384:34;47380:1;47372:6;47368:14;47361:58;47453:14;47448:2;47440:6;47436:15;47429:39;47350:125;:::o;47481:182::-;47621:34;47617:1;47609:6;47605:14;47598:58;47587:76;:::o;47669:228::-;47809:34;47805:1;47797:6;47793:14;47786:58;47878:11;47873:2;47865:6;47861:15;47854:36;47775:122;:::o;47903:234::-;48043:34;48039:1;48031:6;48027:14;48020:58;48112:17;48107:2;48099:6;48095:15;48088:42;48009:128;:::o;48143:220::-;48283:34;48279:1;48271:6;48267:14;48260:58;48352:3;48347:2;48339:6;48335:15;48328:28;48249:114;:::o;48369:236::-;48509:34;48505:1;48497:6;48493:14;48486:58;48578:19;48573:2;48565:6;48561:15;48554:44;48475:130;:::o;48611:179::-;48751:31;48747:1;48739:6;48735:14;48728:55;48717:73;:::o;48796:181::-;48936:33;48932:1;48924:6;48920:14;48913:57;48902:75;:::o;48983:122::-;49056:24;49074:5;49056:24;:::i;:::-;49049:5;49046:35;49036:2;;49095:1;49092;49085:12;49036:2;49026:79;:::o;49111:116::-;49181:21;49196:5;49181:21;:::i;:::-;49174:5;49171:32;49161:2;;49217:1;49214;49207:12;49161:2;49151:76;:::o;49233:120::-;49305:23;49322:5;49305:23;:::i;:::-;49298:5;49295:34;49285:2;;49343:1;49340;49333:12;49285:2;49275:78;:::o;49359:122::-;49432:24;49450:5;49432:24;:::i;:::-;49425:5;49422:35;49412:2;;49471:1;49468;49461:12;49412:2;49402:79;:::o;49487:118::-;49558:22;49574:5;49558:22;:::i;:::-;49551:5;49548:33;49538:2;;49595:1;49592;49585:12;49538:2;49528:77;:::o

Swarm Source

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