ETH Price: $3,075.22 (-5.43%)

Token

NEGATIVE (-)
 

Overview

Max Total Supply

70 -

Holders

27

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
insolvent.eth
Balance
1 -
0xec49a8685696d46c5bd549295ca50656adb3a04d
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Negative721

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-21
*/

/**
 NEGATIVE                                                                                                                                                                                                     
 Loucas Braconnier/Figure31, contract by Jonathan Chomko
 December 2021                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
**/

// File: @openzeppelin/contracts/utils/EnumerableSet.sol
// SPDX-License-Identifier: MIT

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;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            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] = toDeleteIndex + 1; // All indexes are 1-based

            // 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) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        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/Address.sol



pragma solidity  ^0.8.0;


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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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



pragma solidity  ^0.8.0;

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

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

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



// 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() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


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

pragma solidity  ^0.8.0;

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

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



pragma solidity  ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity  ^0.8.0;



/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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

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


pragma solidity  ^0.8.0;

// /**
//  * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
//  * @dev See https://eips.ethereum.org/EIPS/eip-721
//  */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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



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



pragma solidity  ^0.8.0;

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

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



pragma solidity  ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
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: @openzeppelin/contracts/utils/EnumerableMap.sol



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 {
    // 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 MapEntry {
        bytes32 _key;
        bytes32 _value;
    }

    struct Map {
        // Storage of map keys and values
        MapEntry[] _entries;

        // Position of the entry defined by a key in the `entries` array, plus 1
        // because index 0 means a key is not in the map.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @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) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex == 0) { // Equivalent to !contains(map, key)
            map._entries.push(MapEntry({ _key: key, _value: value }));
            // The entry is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            map._indexes[key] = map._entries.length;
            return true;
        } else {
            map._entries[keyIndex - 1]._value = value;
            return false;
        }
    }

    /**
     * @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) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex != 0) { // Equivalent to contains(map, key)
            // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one
            // in the array, and then remove the last entry (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = keyIndex - 1;
            uint256 lastIndex = map._entries.length - 1;

            // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            MapEntry storage lastEntry = map._entries[lastIndex];

            // Move the last entry to the index where the entry to delete is
            map._entries[toDeleteIndex] = lastEntry;
            // Update the index for the moved entry
            map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved entry was stored
            map._entries.pop();

            // Delete the index for the deleted slot
            delete map._indexes[key];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @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._indexes[key] != 0;
    }

    /**
     * @dev Returns the number of key-value pairs in the map. O(1).
     */
    function _length(Map storage map) private view returns (uint256) {
        return map._entries.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) {
        require(map._entries.length > index, "EnumerableMap: index out of bounds");

        MapEntry storage entry = map._entries[index];
        return (entry._key, entry._value);
    }

    /**
     * @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) {
        uint256 keyIndex = map._indexes[key];
        if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key)
        return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based
    }

    /**
     * @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) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    /**
     * @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) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    // 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))));
    }
}
pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol
pragma solidity  ^0.8.0;

/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    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 - not used with on-chain
    // 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.
     */
    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");
        // return json from folder
        // string memory output = string(abi.encodePacked(baseURI(), tokenId.toString(), ".json"));
        // return string(abi.encodePacked(baseURI(), tokenId.toString(), ".json"));
        return string(abi.encodePacked(baseURI(),tokenId.toString(),".json"));

        // return "hello";
    }


    //Return contract metadata for opensea view
    function contractURI() public view returns (string memory) {
        return string(abi.encodePacked(baseURI(), "contract_metadata", '.json'));
    }

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

    function _approve(address to, uint256 tokenId) private {
        _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 { }
}

// File: contracts/Rocks721.sol
pragma solidity  ^0.8.0;

/**
 * @dev {ERC721} token, including:
 *
 *  - ability for holders to burn (destroy) their tokens
 *  - a minter role that allows for token minting (creation)
 *  - token ID and URI autogeneration
 *
 * This contract uses {AccessControl} to lock permissioned functions using the
 * different roles - head to its documentation for details.
 *
 * The account that deploys the contract will be granted the minter and pauser
 * roles, as well as the default admin role, which will let it grant both minter
 * and pauser roles to other accounts.
 */

contract Negative721 is Context, ERC721, Ownable {

    address payable public withdrawalAddress;
    uint256 public tokenCounter;
    bool public mintActive;
    uint256 public pricePerPiece;

    mapping (bytes32 => bool) public negatedTokens;
    event Negate(address minter, uint256 price, address contractToNegate, uint256 tokenIdToNegate);
    event MetadataUpdated(string newTokenUriBase);

    constructor(
        uint256 givenPricePerPiece,
        address payable givenWithdrawalAddress,
        string memory givenTokenURIBase
    ) ERC721("NEGATIVE", "-") {
        pricePerPiece = givenPricePerPiece;
        withdrawalAddress = givenWithdrawalAddress;
        _setBaseURI(givenTokenURIBase);
        tokenCounter = 0;
    }

    //Change base uri 
     function updateBaseURI(string memory givenTokenURIBase) public onlyOwner{
        _setBaseURI(givenTokenURIBase);
    }

    function setMintActive(bool isActive) public onlyOwner {
        mintActive = isActive;
    }

    //Price setting
    function setPrice(uint256 givenPrice) external onlyOwner {
        pricePerPiece = givenPrice;
    }

    //Withdrawal
    function setWithdrawalAddress(address payable givenWithdrawalAddress) public onlyOwner {
        withdrawalAddress = givenWithdrawalAddress;
    }

    function withdrawEth() public onlyOwner {
        Address.sendValue(withdrawalAddress, address(this).balance);
    }

    //Owner info
    function tokenInfo(uint256 tokenId) public view returns (address) {
        return (ownerOf(tokenId));
    }

    function getOwners(uint256 start, uint256 end) public view returns (address[] memory){
        address[] memory re = new address[](end - start);
        for (uint256 i = start; i < end; i++) {
                re[i - start] = ownerOf(i);
        }
        return re;
    }

    function negate(address contractToNegate, uint256 tokenIdToNegate) public payable returns(uint256){
        require(msg.value >= pricePerPiece, "not enough eth sent");
        require(mintActive || msg.sender == owner(), "sale not open");
        require(!negatedTokens[keccak256(abi.encodePacked(contractToNegate, tokenIdToNegate))], "token is already minted");
        
        negatedTokens[keccak256(abi.encodePacked(contractToNegate, tokenIdToNegate))] = true;
        emit Negate(msg.sender, pricePerPiece, contractToNegate, tokenIdToNegate);

        uint256 tokenToMint = tokenCounter;
        _safeMint(msg.sender, tokenToMint);

        tokenCounter ++;
        return tokenToMint;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"givenPricePerPiece","type":"uint256"},{"internalType":"address payable","name":"givenWithdrawalAddress","type":"address"},{"internalType":"string","name":"givenTokenURIBase","type":"string"}],"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":false,"internalType":"string","name":"newTokenUriBase","type":"string"}],"name":"MetadataUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"contractToNegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenIdToNegate","type":"uint256"}],"name":"Negate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"getOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractToNegate","type":"address"},{"internalType":"uint256","name":"tokenIdToNegate","type":"uint256"}],"name":"negate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"negatedTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricePerPiece","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isActive","type":"bool"}],"name":"setMintActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"givenPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"givenWithdrawalAddress","type":"address"}],"name":"setWithdrawalAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenInfo","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"givenTokenURIBase","type":"string"}],"name":"updateBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawalAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060405162005009380380620050098339818101604052810190620000379190620004aa565b6040518060400160405280600881526020017f4e454741544956450000000000000000000000000000000000000000000000008152506040518060400160405280600181526020017f2d00000000000000000000000000000000000000000000000000000000000000815250620000bb6301ffc9a760e01b6200025260201b60201c565b8160069080519060200190620000d39291906200034e565b508060079080519060200190620000ec9291906200034e565b50620001056380ac58cd60e01b6200025260201b60201c565b6200011d635b5e139f60e01b6200025260201b60201c565b6200013563780e9d6360e01b6200025260201b60201c565b50506000620001496200032a60201b60201c565b905080600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35082600d8190555081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000241816200033260201b60201c565b6000600b819055505050506200079e565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415620002be576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002b5906200054c565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b80600890805190602001906200034a9291906200034e565b5050565b8280546200035c9062000652565b90600052602060002090601f016020900481019282620003805760008555620003cc565b82601f106200039b57805160ff1916838001178555620003cc565b82800160010185558215620003cc579182015b82811115620003cb578251825591602001919060010190620003ae565b5b509050620003db9190620003df565b5090565b5b80821115620003fa576000816000905550600101620003e0565b5090565b6000620004156200040f8462000597565b6200056e565b90508281526020810184848401111562000434576200043362000721565b5b620004418482856200061c565b509392505050565b6000815190506200045a816200076a565b92915050565b600082601f8301126200047857620004776200071c565b5b81516200048a848260208601620003fe565b91505092915050565b600081519050620004a48162000784565b92915050565b600080600060608486031215620004c657620004c56200072b565b5b6000620004d68682870162000493565b9350506020620004e98682870162000449565b925050604084015167ffffffffffffffff8111156200050d576200050c62000726565b5b6200051b8682870162000460565b9150509250925092565b600062000534601c83620005cd565b9150620005418262000741565b602082019050919050565b60006020820190508181036000830152620005678162000525565b9050919050565b60006200057a6200058d565b905062000588828262000688565b919050565b6000604051905090565b600067ffffffffffffffff821115620005b557620005b4620006ed565b5b620005c08262000730565b9050602081019050919050565b600082825260208201905092915050565b6000620005eb82620005f2565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200063c5780820151818401526020810190506200061f565b838111156200064c576000848401525b50505050565b600060028204905060018216806200066b57607f821691505b60208210811415620006825762000681620006be565b5b50919050565b620006938262000730565b810181811067ffffffffffffffff82111715620006b557620006b4620006ed565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433136353a20696e76616c696420696e7465726661636520696400000000600082015250565b6200077581620005de565b81146200078157600080fd5b50565b6200078f8162000612565b81146200079b57600080fd5b50565b61485b80620007ae6000396000f3fe6080604052600436106101f95760003560e01c8063715018a61161010d578063c87b56dd116100a0578063e8a3d4851161006f578063e8a3d4851461075e578063e985e9c514610789578063ee1cc944146107c6578063f2bcd022146107ef578063f2fde38b1461081a576101f9565b8063c87b56dd14610689578063cc33c875146106c6578063d082e38114610703578063e2ca52181461072e576101f9565b806395d89b41116100dc57806395d89b41146105f5578063a0ef91df14610620578063a22cb46514610637578063b88d4fde14610660576101f9565b8063715018a6146105615780638da5cb5b1461057857806391b7f5ed146105a3578063931688cb146105cc576101f9565b806323b872dd116101905780634f6ccce71161015f5780634f6ccce714610454578063575ca2c7146104915780636352211e146104bc5780636c0360eb146104f957806370a0823114610524576101f9565b806323b872dd1461039a57806325fd90f3146103c35780632f745c59146103ee57806342842e0e1461042b576101f9565b8063081812fc116101cc578063081812fc146102e0578063095ea7b31461031d57806318160ddd1461034657806321b8092e14610371576101f9565b806301ffc9a7146101fe578063048220581461023b57806305196db01461027857806306fdde03146102b5575b600080fd5b34801561020a57600080fd5b506102256004803603810190610220919061306e565b610843565b604051610232919061388f565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d919061313e565b6108aa565b60405161026f919061386d565b60405180910390f35b34801561028457600080fd5b5061029f600480360381019061029a9190613041565b610991565b6040516102ac919061388f565b60405180910390f35b3480156102c157600080fd5b506102ca6109b1565b6040516102d791906138aa565b60405180910390f35b3480156102ec57600080fd5b5061030760048036038101906103029190613111565b610a43565b60405161031491906137a6565b60405180910390f35b34801561032957600080fd5b50610344600480360381019061033f9190612fd4565b610ac8565b005b34801561035257600080fd5b5061035b610be0565b6040516103689190613bcc565b60405180910390f35b34801561037d57600080fd5b5061039860048036038101906103939190612e51565b610bf1565b005b3480156103a657600080fd5b506103c160048036038101906103bc9190612ebe565b610cb1565b005b3480156103cf57600080fd5b506103d8610d11565b6040516103e5919061388f565b60405180910390f35b3480156103fa57600080fd5b5061041560048036038101906104109190612fd4565b610d24565b6040516104229190613bcc565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d9190612ebe565b610d7f565b005b34801561046057600080fd5b5061047b60048036038101906104769190613111565b610d9f565b6040516104889190613bcc565b60405180910390f35b34801561049d57600080fd5b506104a6610dc2565b6040516104b39190613bcc565b60405180910390f35b3480156104c857600080fd5b506104e360048036038101906104de9190613111565b610dc8565b6040516104f091906137a6565b60405180910390f35b34801561050557600080fd5b5061050e610dff565b60405161051b91906138aa565b60405180910390f35b34801561053057600080fd5b5061054b60048036038101906105469190612e24565b610e91565b6040516105589190613bcc565b60405180910390f35b34801561056d57600080fd5b50610576610f50565b005b34801561058457600080fd5b5061058d61108d565b60405161059a91906137a6565b60405180910390f35b3480156105af57600080fd5b506105ca60048036038101906105c59190613111565b6110b7565b005b3480156105d857600080fd5b506105f360048036038101906105ee91906130c8565b61113d565b005b34801561060157600080fd5b5061060a6111c5565b60405161061791906138aa565b60405180910390f35b34801561062c57600080fd5b50610635611257565b005b34801561064357600080fd5b5061065e60048036038101906106599190612f94565b611301565b005b34801561066c57600080fd5b5061068760048036038101906106829190612f11565b611482565b005b34801561069557600080fd5b506106b060048036038101906106ab9190613111565b6114e4565b6040516106bd91906138aa565b60405180910390f35b3480156106d257600080fd5b506106ed60048036038101906106e89190613111565b611566565b6040516106fa91906137a6565b60405180910390f35b34801561070f57600080fd5b50610718611578565b6040516107259190613bcc565b60405180910390f35b61074860048036038101906107439190612fd4565b61157e565b6040516107559190613bcc565b60405180910390f35b34801561076a57600080fd5b506107736117a0565b60405161078091906138aa565b60405180910390f35b34801561079557600080fd5b506107b060048036038101906107ab9190612e7e565b6117ce565b6040516107bd919061388f565b60405180910390f35b3480156107d257600080fd5b506107ed60048036038101906107e89190613014565b611862565b005b3480156107fb57600080fd5b506108046118fb565b60405161081191906137c1565b60405180910390f35b34801561082657600080fd5b50610841600480360381019061083c9190612e24565b611921565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060600083836108ba9190613d7c565b67ffffffffffffffff8111156108d3576108d2614078565b5b6040519080825280602002602001820160405280156109015781602001602082028036833780820191505090505b50905060008490505b838110156109865761091b81610dc8565b8286836109289190613d7c565b8151811061093957610938614049565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050808061097e90613ee5565b91505061090a565b508091505092915050565b600e6020528060005260406000206000915054906101000a900460ff1681565b6060600680546109c090613e82565b80601f01602080910402602001604051908101604052809291908181526020018280546109ec90613e82565b8015610a395780601f10610a0e57610100808354040283529160200191610a39565b820191906000526020600020905b815481529060010190602001808311610a1c57829003601f168201915b5050505050905090565b6000610a4e82611acd565b610a8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8490613a8c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ad382610dc8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3b90613b2c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b63611aea565b73ffffffffffffffffffffffffffffffffffffffff161480610b925750610b9181610b8c611aea565b6117ce565b5b610bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc890613a0c565b60405180910390fd5b610bdb8383611af2565b505050565b6000610bec6002611bab565b905090565b610bf9611aea565b73ffffffffffffffffffffffffffffffffffffffff16610c1761108d565b73ffffffffffffffffffffffffffffffffffffffff1614610c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6490613aac565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610cc2610cbc611aea565b82611bc0565b610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf890613b4c565b60405180910390fd5b610d0c838383611c9e565b505050565b600c60009054906101000a900460ff1681565b6000610d7782600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611eb590919063ffffffff16565b905092915050565b610d9a83838360405180602001604052806000815250611482565b505050565b600080610db6836002611ecf90919063ffffffff16565b50905080915050919050565b600d5481565b6000610df8826040518060600160405280602981526020016147fd602991396002611efb9092919063ffffffff16565b9050919050565b606060088054610e0e90613e82565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3a90613e82565b8015610e875780601f10610e5c57610100808354040283529160200191610e87565b820191906000526020600020905b815481529060010190602001808311610e6a57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef990613a2c565b60405180910390fd5b610f49600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611f1a565b9050919050565b610f58611aea565b73ffffffffffffffffffffffffffffffffffffffff16610f7661108d565b73ffffffffffffffffffffffffffffffffffffffff1614610fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc390613aac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6110bf611aea565b73ffffffffffffffffffffffffffffffffffffffff166110dd61108d565b73ffffffffffffffffffffffffffffffffffffffff1614611133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112a90613aac565b60405180910390fd5b80600d8190555050565b611145611aea565b73ffffffffffffffffffffffffffffffffffffffff1661116361108d565b73ffffffffffffffffffffffffffffffffffffffff16146111b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b090613aac565b60405180910390fd5b6111c281611f2f565b50565b6060600780546111d490613e82565b80601f016020809104026020016040519081016040528092919081815260200182805461120090613e82565b801561124d5780601f106112225761010080835404028352916020019161124d565b820191906000526020600020905b81548152906001019060200180831161123057829003601f168201915b5050505050905090565b61125f611aea565b73ffffffffffffffffffffffffffffffffffffffff1661127d61108d565b73ffffffffffffffffffffffffffffffffffffffff16146112d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ca90613aac565b60405180910390fd5b6112ff600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1647611f49565b565b611309611aea565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611377576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136e9061396c565b60405180910390fd5b8060056000611384611aea565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611431611aea565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611476919061388f565b60405180910390a35050565b61149361148d611aea565b83611bc0565b6114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c990613b4c565b60405180910390fd5b6114de8484848461203d565b50505050565b60606114ef82611acd565b61152e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152590613aec565b60405180910390fd5b611536610dff565b61153f83612099565b604051602001611550929190613735565b6040516020818303038152906040529050919050565b600061157182610dc8565b9050919050565b600b5481565b6000600d543410156115c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bc90613b8c565b60405180910390fd5b600c60009054906101000a900460ff168061161257506115e361108d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611651576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164890613b0c565b60405180910390fd5b600e600084846040516020016116689291906136f2565b60405160208183030381529060405280519060200120815260200190815260200160002060009054906101000a900460ff16156116da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d190613bac565b60405180910390fd5b6001600e600085856040516020016116f39291906136f2565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff0219169083151502179055507f5fb040992534e913b8cbaf2d36e32901b12d29863486cf17f824f1d06bd6f77533600d5485856040516117659493929190613828565b60405180910390a16000600b54905061177e33826121fa565b600b600081548092919061179190613ee5565b91905055508091505092915050565b60606117aa610dff565b6040516020016117ba9190613764565b604051602081830303815290604052905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61186a611aea565b73ffffffffffffffffffffffffffffffffffffffff1661188861108d565b73ffffffffffffffffffffffffffffffffffffffff16146118de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d590613aac565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611929611aea565b73ffffffffffffffffffffffffffffffffffffffff1661194761108d565b73ffffffffffffffffffffffffffffffffffffffff161461199d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199490613aac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a049061390c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611ae382600261221890919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b6583610dc8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611bb982600001612232565b9050919050565b6000611bcb82611acd565b611c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c01906139ec565b60405180910390fd5b6000611c1583610dc8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c8457508373ffffffffffffffffffffffffffffffffffffffff16611c6c84610a43565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c955750611c9481856117ce565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611cbe82610dc8565b73ffffffffffffffffffffffffffffffffffffffff1614611d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0b90613acc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7b9061394c565b60405180910390fd5b611d8f838383612243565b611d9a600082611af2565b611deb81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061224890919063ffffffff16565b50611e3d81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061226290919063ffffffff16565b50611e548183600261227c9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000611ec483600001836122b1565b60001c905092915050565b600080600080611ee28660000186612325565b915091508160001c8160001c9350935050509250929050565b6000611f0e846000018460001b846123af565b60001c90509392505050565b6000611f2882600001612450565b9050919050565b8060089080519060200190611f45929190612c0e565b5050565b80471015611f8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f83906139ac565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611fb290613791565b60006040518083038185875af1925050503d8060008114611fef576040519150601f19603f3d011682016040523d82523d6000602084013e611ff4565b606091505b5050905080612038576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202f9061398c565b60405180910390fd5b505050565b612048848484611c9e565b61205484848484612461565b612093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208a906138ec565b60405180910390fd5b50505050565b606060008214156120e1576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506121f5565b600082905060005b600082146121135780806120fc90613ee5565b915050600a8261210c9190613d4b565b91506120e9565b60008167ffffffffffffffff81111561212f5761212e614078565b5b6040519080825280601f01601f1916602001820160405280156121615781602001600182028036833780820191505090505b5090505b600085146121ee5760018261217a9190613d7c565b9150600a856121899190613f5c565b60306121959190613cf5565b60f81b8183815181106121ab576121aa614049565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121e79190613d4b565b9450612165565b8093505050505b919050565b6122148282604051806020016040528060008152506125c5565b5050565b600061222a836000018360001b612620565b905092915050565b600081600001805490509050919050565b505050565b600061225a836000018360001b612643565b905092915050565b6000612274836000018360001b61275b565b905092915050565b60006122a8846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b6127cb565b90509392505050565b6000818360000180549050116122fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f3906138cc565b60405180910390fd5b82600001828154811061231257612311614049565b5b9060005260206000200154905092915050565b60008082846000018054905011612371576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236890613a4c565b60405180910390fd5b600084600001848154811061238957612388614049565b5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240891906138aa565b60405180910390fd5b50846000016001826124239190613d7c565b8154811061243457612433614049565b5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b60006124828473ffffffffffffffffffffffffffffffffffffffff166128b7565b61248f57600190506125bd565b600061255663150b7a0260e01b6124a4611aea565b8887876040516024016124ba94939291906137dc565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518060600160405280603281526020016147cb603291398773ffffffffffffffffffffffffffffffffffffffff166128ca9092919063ffffffff16565b905060008180602001905181019061256e919061309b565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b6125cf83836128e2565b6125dc6000848484612461565b61261b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612612906138ec565b60405180910390fd5b505050565b600080836001016000848152602001908152602001600020541415905092915050565b6000808360010160008481526020019081526020016000205490506000811461274f5760006001826126759190613d7c565b905060006001866000018054905061268d9190613d7c565b905060008660000182815481106126a7576126a6614049565b5b90600052602060002001549050808760000184815481106126cb576126ca614049565b5b90600052602060002001819055506001836126e69190613cf5565b87600101600083815260200190815260200160002081905550866000018054806127135761271261401a565b5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612755565b60009150505b92915050565b60006127678383612a70565b6127c05782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506127c5565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415612872578460000160405180604001604052808681526020018581525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505084600001805490508560010160008681526020019081526020016000208190555060019150506128b0565b82856000016001836128849190613d7c565b8154811061289557612894614049565b5b90600052602060002090600202016001018190555060009150505b9392505050565b600080823b905060008111915050919050565b60606128d98484600085612a93565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294990613a6c565b60405180910390fd5b61295b81611acd565b1561299b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129929061392c565b60405180910390fd5b6129a760008383612243565b6129f881600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061226290919063ffffffff16565b50612a0f8183600261227c9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080836001016000848152602001908152602001600020541415905092915050565b606082471015612ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acf906139cc565b60405180910390fd5b612ae1856128b7565b612b20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1790613b6c565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612b49919061371e565b60006040518083038185875af1925050503d8060008114612b86576040519150601f19603f3d011682016040523d82523d6000602084013e612b8b565b606091505b5091509150612b9b828286612ba7565b92505050949350505050565b60608315612bb757829050612c07565b600083511115612bca5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfe91906138aa565b60405180910390fd5b9392505050565b828054612c1a90613e82565b90600052602060002090601f016020900481019282612c3c5760008555612c83565b82601f10612c5557805160ff1916838001178555612c83565b82800160010185558215612c83579182015b82811115612c82578251825591602001919060010190612c67565b5b509050612c909190612c94565b5090565b5b80821115612cad576000816000905550600101612c95565b5090565b6000612cc4612cbf84613c0c565b613be7565b905082815260208101848484011115612ce057612cdf6140ac565b5b612ceb848285613e40565b509392505050565b6000612d06612d0184613c3d565b613be7565b905082815260208101848484011115612d2257612d216140ac565b5b612d2d848285613e40565b509392505050565b600081359050612d4481614740565b92915050565b600081359050612d5981614757565b92915050565b600081359050612d6e8161476e565b92915050565b600081359050612d8381614785565b92915050565b600081359050612d988161479c565b92915050565b600081519050612dad8161479c565b92915050565b600082601f830112612dc857612dc76140a7565b5b8135612dd8848260208601612cb1565b91505092915050565b600082601f830112612df657612df56140a7565b5b8135612e06848260208601612cf3565b91505092915050565b600081359050612e1e816147b3565b92915050565b600060208284031215612e3a57612e396140b6565b5b6000612e4884828501612d35565b91505092915050565b600060208284031215612e6757612e666140b6565b5b6000612e7584828501612d4a565b91505092915050565b60008060408385031215612e9557612e946140b6565b5b6000612ea385828601612d35565b9250506020612eb485828601612d35565b9150509250929050565b600080600060608486031215612ed757612ed66140b6565b5b6000612ee586828701612d35565b9350506020612ef686828701612d35565b9250506040612f0786828701612e0f565b9150509250925092565b60008060008060808587031215612f2b57612f2a6140b6565b5b6000612f3987828801612d35565b9450506020612f4a87828801612d35565b9350506040612f5b87828801612e0f565b925050606085013567ffffffffffffffff811115612f7c57612f7b6140b1565b5b612f8887828801612db3565b91505092959194509250565b60008060408385031215612fab57612faa6140b6565b5b6000612fb985828601612d35565b9250506020612fca85828601612d5f565b9150509250929050565b60008060408385031215612feb57612fea6140b6565b5b6000612ff985828601612d35565b925050602061300a85828601612e0f565b9150509250929050565b60006020828403121561302a576130296140b6565b5b600061303884828501612d5f565b91505092915050565b600060208284031215613057576130566140b6565b5b600061306584828501612d74565b91505092915050565b600060208284031215613084576130836140b6565b5b600061309284828501612d89565b91505092915050565b6000602082840312156130b1576130b06140b6565b5b60006130bf84828501612d9e565b91505092915050565b6000602082840312156130de576130dd6140b6565b5b600082013567ffffffffffffffff8111156130fc576130fb6140b1565b5b61310884828501612de1565b91505092915050565b600060208284031215613127576131266140b6565b5b600061313584828501612e0f565b91505092915050565b60008060408385031215613155576131546140b6565b5b600061316385828601612e0f565b925050602061317485828601612e0f565b9150509250929050565b600061318a83836131a5565b60208301905092915050565b61319f81613dc2565b82525050565b6131ae81613db0565b82525050565b6131bd81613db0565b82525050565b6131d46131cf82613db0565b613f2e565b82525050565b60006131e582613c7e565b6131ef8185613cac565b93506131fa83613c6e565b8060005b8381101561322b578151613212888261317e565b975061321d83613c9f565b9250506001810190506131fe565b5085935050505092915050565b61324181613dd4565b82525050565b600061325282613c89565b61325c8185613cbd565b935061326c818560208601613e4f565b613275816140bb565b840191505092915050565b600061328b82613c89565b6132958185613cce565b93506132a5818560208601613e4f565b80840191505092915050565b60006132bc82613c94565b6132c68185613cd9565b93506132d6818560208601613e4f565b6132df816140bb565b840191505092915050565b60006132f582613c94565b6132ff8185613cea565b935061330f818560208601613e4f565b80840191505092915050565b6000613328602283613cd9565b9150613333826140d9565b604082019050919050565b600061334b603283613cd9565b915061335682614128565b604082019050919050565b600061336e602683613cd9565b915061337982614177565b604082019050919050565b6000613391601c83613cd9565b915061339c826141c6565b602082019050919050565b60006133b4602483613cd9565b91506133bf826141ef565b604082019050919050565b60006133d7601983613cd9565b91506133e28261423e565b602082019050919050565b60006133fa603a83613cd9565b915061340582614267565b604082019050919050565b600061341d601d83613cd9565b9150613428826142b6565b602082019050919050565b6000613440602683613cd9565b915061344b826142df565b604082019050919050565b6000613463602c83613cd9565b915061346e8261432e565b604082019050919050565b6000613486601183613cea565b91506134918261437d565b601182019050919050565b60006134a9603883613cd9565b91506134b4826143a6565b604082019050919050565b60006134cc602a83613cd9565b91506134d7826143f5565b604082019050919050565b60006134ef602283613cd9565b91506134fa82614444565b604082019050919050565b6000613512602083613cd9565b915061351d82614493565b602082019050919050565b6000613535602c83613cd9565b9150613540826144bc565b604082019050919050565b6000613558600583613cea565b91506135638261450b565b600582019050919050565b600061357b602083613cd9565b915061358682614534565b602082019050919050565b600061359e602983613cd9565b91506135a98261455d565b604082019050919050565b60006135c1602f83613cd9565b91506135cc826145ac565b604082019050919050565b60006135e4600d83613cd9565b91506135ef826145fb565b602082019050919050565b6000613607602183613cd9565b915061361282614624565b604082019050919050565b600061362a600083613cce565b915061363582614673565b600082019050919050565b600061364d603183613cd9565b915061365882614676565b604082019050919050565b6000613670601d83613cd9565b915061367b826146c5565b602082019050919050565b6000613693601383613cd9565b915061369e826146ee565b602082019050919050565b60006136b6601783613cd9565b91506136c182614717565b602082019050919050565b6136d581613e36565b82525050565b6136ec6136e782613e36565b613f52565b82525050565b60006136fe82856131c3565b60148201915061370e82846136db565b6020820191508190509392505050565b600061372a8284613280565b915081905092915050565b600061374182856132ea565b915061374d82846132ea565b91506137588261354b565b91508190509392505050565b600061377082846132ea565b915061377b82613479565b91506137868261354b565b915081905092915050565b600061379c8261361d565b9150819050919050565b60006020820190506137bb60008301846131b4565b92915050565b60006020820190506137d66000830184613196565b92915050565b60006080820190506137f160008301876131b4565b6137fe60208301866131b4565b61380b60408301856136cc565b818103606083015261381d8184613247565b905095945050505050565b600060808201905061383d60008301876131b4565b61384a60208301866136cc565b61385760408301856131b4565b61386460608301846136cc565b95945050505050565b6000602082019050818103600083015261388781846131da565b905092915050565b60006020820190506138a46000830184613238565b92915050565b600060208201905081810360008301526138c481846132b1565b905092915050565b600060208201905081810360008301526138e58161331b565b9050919050565b600060208201905081810360008301526139058161333e565b9050919050565b6000602082019050818103600083015261392581613361565b9050919050565b6000602082019050818103600083015261394581613384565b9050919050565b60006020820190508181036000830152613965816133a7565b9050919050565b60006020820190508181036000830152613985816133ca565b9050919050565b600060208201905081810360008301526139a5816133ed565b9050919050565b600060208201905081810360008301526139c581613410565b9050919050565b600060208201905081810360008301526139e581613433565b9050919050565b60006020820190508181036000830152613a0581613456565b9050919050565b60006020820190508181036000830152613a258161349c565b9050919050565b60006020820190508181036000830152613a45816134bf565b9050919050565b60006020820190508181036000830152613a65816134e2565b9050919050565b60006020820190508181036000830152613a8581613505565b9050919050565b60006020820190508181036000830152613aa581613528565b9050919050565b60006020820190508181036000830152613ac58161356e565b9050919050565b60006020820190508181036000830152613ae581613591565b9050919050565b60006020820190508181036000830152613b05816135b4565b9050919050565b60006020820190508181036000830152613b25816135d7565b9050919050565b60006020820190508181036000830152613b45816135fa565b9050919050565b60006020820190508181036000830152613b6581613640565b9050919050565b60006020820190508181036000830152613b8581613663565b9050919050565b60006020820190508181036000830152613ba581613686565b9050919050565b60006020820190508181036000830152613bc5816136a9565b9050919050565b6000602082019050613be160008301846136cc565b92915050565b6000613bf1613c02565b9050613bfd8282613eb4565b919050565b6000604051905090565b600067ffffffffffffffff821115613c2757613c26614078565b5b613c30826140bb565b9050602081019050919050565b600067ffffffffffffffff821115613c5857613c57614078565b5b613c61826140bb565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613d0082613e36565b9150613d0b83613e36565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d4057613d3f613f8d565b5b828201905092915050565b6000613d5682613e36565b9150613d6183613e36565b925082613d7157613d70613fbc565b5b828204905092915050565b6000613d8782613e36565b9150613d9283613e36565b925082821015613da557613da4613f8d565b5b828203905092915050565b6000613dbb82613e16565b9050919050565b6000613dcd82613e16565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613e6d578082015181840152602081019050613e52565b83811115613e7c576000848401525b50505050565b60006002820490506001821680613e9a57607f821691505b60208210811415613eae57613ead613feb565b5b50919050565b613ebd826140bb565b810181811067ffffffffffffffff82111715613edc57613edb614078565b5b80604052505050565b6000613ef082613e36565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f2357613f22613f8d565b5b600182019050919050565b6000613f3982613f40565b9050919050565b6000613f4b826140cc565b9050919050565b6000819050919050565b6000613f6782613e36565b9150613f7283613e36565b925082613f8257613f81613fbc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f636f6e74726163745f6d65746164617461000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f73616c65206e6f74206f70656e00000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f6e6f7420656e6f756768206574682073656e7400000000000000000000000000600082015250565b7f746f6b656e20697320616c7265616479206d696e746564000000000000000000600082015250565b61474981613db0565b811461475457600080fd5b50565b61476081613dc2565b811461476b57600080fd5b50565b61477781613dd4565b811461478257600080fd5b50565b61478e81613de0565b811461479957600080fd5b50565b6147a581613dea565b81146147b057600080fd5b50565b6147bc81613e36565b81146147c757600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220d2b21069746da17c1664dd534f079b1b1fde066eaf12249509fcce2d28af47e964736f6c634300080700330000000000000000000000000000000000000000000000000058d15e176280000000000000000000000000005a73badaee01abb988d12c5e030b1857437abad700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101f95760003560e01c8063715018a61161010d578063c87b56dd116100a0578063e8a3d4851161006f578063e8a3d4851461075e578063e985e9c514610789578063ee1cc944146107c6578063f2bcd022146107ef578063f2fde38b1461081a576101f9565b8063c87b56dd14610689578063cc33c875146106c6578063d082e38114610703578063e2ca52181461072e576101f9565b806395d89b41116100dc57806395d89b41146105f5578063a0ef91df14610620578063a22cb46514610637578063b88d4fde14610660576101f9565b8063715018a6146105615780638da5cb5b1461057857806391b7f5ed146105a3578063931688cb146105cc576101f9565b806323b872dd116101905780634f6ccce71161015f5780634f6ccce714610454578063575ca2c7146104915780636352211e146104bc5780636c0360eb146104f957806370a0823114610524576101f9565b806323b872dd1461039a57806325fd90f3146103c35780632f745c59146103ee57806342842e0e1461042b576101f9565b8063081812fc116101cc578063081812fc146102e0578063095ea7b31461031d57806318160ddd1461034657806321b8092e14610371576101f9565b806301ffc9a7146101fe578063048220581461023b57806305196db01461027857806306fdde03146102b5575b600080fd5b34801561020a57600080fd5b506102256004803603810190610220919061306e565b610843565b604051610232919061388f565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d919061313e565b6108aa565b60405161026f919061386d565b60405180910390f35b34801561028457600080fd5b5061029f600480360381019061029a9190613041565b610991565b6040516102ac919061388f565b60405180910390f35b3480156102c157600080fd5b506102ca6109b1565b6040516102d791906138aa565b60405180910390f35b3480156102ec57600080fd5b5061030760048036038101906103029190613111565b610a43565b60405161031491906137a6565b60405180910390f35b34801561032957600080fd5b50610344600480360381019061033f9190612fd4565b610ac8565b005b34801561035257600080fd5b5061035b610be0565b6040516103689190613bcc565b60405180910390f35b34801561037d57600080fd5b5061039860048036038101906103939190612e51565b610bf1565b005b3480156103a657600080fd5b506103c160048036038101906103bc9190612ebe565b610cb1565b005b3480156103cf57600080fd5b506103d8610d11565b6040516103e5919061388f565b60405180910390f35b3480156103fa57600080fd5b5061041560048036038101906104109190612fd4565b610d24565b6040516104229190613bcc565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d9190612ebe565b610d7f565b005b34801561046057600080fd5b5061047b60048036038101906104769190613111565b610d9f565b6040516104889190613bcc565b60405180910390f35b34801561049d57600080fd5b506104a6610dc2565b6040516104b39190613bcc565b60405180910390f35b3480156104c857600080fd5b506104e360048036038101906104de9190613111565b610dc8565b6040516104f091906137a6565b60405180910390f35b34801561050557600080fd5b5061050e610dff565b60405161051b91906138aa565b60405180910390f35b34801561053057600080fd5b5061054b60048036038101906105469190612e24565b610e91565b6040516105589190613bcc565b60405180910390f35b34801561056d57600080fd5b50610576610f50565b005b34801561058457600080fd5b5061058d61108d565b60405161059a91906137a6565b60405180910390f35b3480156105af57600080fd5b506105ca60048036038101906105c59190613111565b6110b7565b005b3480156105d857600080fd5b506105f360048036038101906105ee91906130c8565b61113d565b005b34801561060157600080fd5b5061060a6111c5565b60405161061791906138aa565b60405180910390f35b34801561062c57600080fd5b50610635611257565b005b34801561064357600080fd5b5061065e60048036038101906106599190612f94565b611301565b005b34801561066c57600080fd5b5061068760048036038101906106829190612f11565b611482565b005b34801561069557600080fd5b506106b060048036038101906106ab9190613111565b6114e4565b6040516106bd91906138aa565b60405180910390f35b3480156106d257600080fd5b506106ed60048036038101906106e89190613111565b611566565b6040516106fa91906137a6565b60405180910390f35b34801561070f57600080fd5b50610718611578565b6040516107259190613bcc565b60405180910390f35b61074860048036038101906107439190612fd4565b61157e565b6040516107559190613bcc565b60405180910390f35b34801561076a57600080fd5b506107736117a0565b60405161078091906138aa565b60405180910390f35b34801561079557600080fd5b506107b060048036038101906107ab9190612e7e565b6117ce565b6040516107bd919061388f565b60405180910390f35b3480156107d257600080fd5b506107ed60048036038101906107e89190613014565b611862565b005b3480156107fb57600080fd5b506108046118fb565b60405161081191906137c1565b60405180910390f35b34801561082657600080fd5b50610841600480360381019061083c9190612e24565b611921565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060600083836108ba9190613d7c565b67ffffffffffffffff8111156108d3576108d2614078565b5b6040519080825280602002602001820160405280156109015781602001602082028036833780820191505090505b50905060008490505b838110156109865761091b81610dc8565b8286836109289190613d7c565b8151811061093957610938614049565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050808061097e90613ee5565b91505061090a565b508091505092915050565b600e6020528060005260406000206000915054906101000a900460ff1681565b6060600680546109c090613e82565b80601f01602080910402602001604051908101604052809291908181526020018280546109ec90613e82565b8015610a395780601f10610a0e57610100808354040283529160200191610a39565b820191906000526020600020905b815481529060010190602001808311610a1c57829003601f168201915b5050505050905090565b6000610a4e82611acd565b610a8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8490613a8c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ad382610dc8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3b90613b2c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b63611aea565b73ffffffffffffffffffffffffffffffffffffffff161480610b925750610b9181610b8c611aea565b6117ce565b5b610bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc890613a0c565b60405180910390fd5b610bdb8383611af2565b505050565b6000610bec6002611bab565b905090565b610bf9611aea565b73ffffffffffffffffffffffffffffffffffffffff16610c1761108d565b73ffffffffffffffffffffffffffffffffffffffff1614610c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6490613aac565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610cc2610cbc611aea565b82611bc0565b610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf890613b4c565b60405180910390fd5b610d0c838383611c9e565b505050565b600c60009054906101000a900460ff1681565b6000610d7782600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611eb590919063ffffffff16565b905092915050565b610d9a83838360405180602001604052806000815250611482565b505050565b600080610db6836002611ecf90919063ffffffff16565b50905080915050919050565b600d5481565b6000610df8826040518060600160405280602981526020016147fd602991396002611efb9092919063ffffffff16565b9050919050565b606060088054610e0e90613e82565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3a90613e82565b8015610e875780601f10610e5c57610100808354040283529160200191610e87565b820191906000526020600020905b815481529060010190602001808311610e6a57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef990613a2c565b60405180910390fd5b610f49600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611f1a565b9050919050565b610f58611aea565b73ffffffffffffffffffffffffffffffffffffffff16610f7661108d565b73ffffffffffffffffffffffffffffffffffffffff1614610fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc390613aac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6110bf611aea565b73ffffffffffffffffffffffffffffffffffffffff166110dd61108d565b73ffffffffffffffffffffffffffffffffffffffff1614611133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112a90613aac565b60405180910390fd5b80600d8190555050565b611145611aea565b73ffffffffffffffffffffffffffffffffffffffff1661116361108d565b73ffffffffffffffffffffffffffffffffffffffff16146111b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b090613aac565b60405180910390fd5b6111c281611f2f565b50565b6060600780546111d490613e82565b80601f016020809104026020016040519081016040528092919081815260200182805461120090613e82565b801561124d5780601f106112225761010080835404028352916020019161124d565b820191906000526020600020905b81548152906001019060200180831161123057829003601f168201915b5050505050905090565b61125f611aea565b73ffffffffffffffffffffffffffffffffffffffff1661127d61108d565b73ffffffffffffffffffffffffffffffffffffffff16146112d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ca90613aac565b60405180910390fd5b6112ff600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1647611f49565b565b611309611aea565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611377576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136e9061396c565b60405180910390fd5b8060056000611384611aea565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611431611aea565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611476919061388f565b60405180910390a35050565b61149361148d611aea565b83611bc0565b6114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c990613b4c565b60405180910390fd5b6114de8484848461203d565b50505050565b60606114ef82611acd565b61152e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152590613aec565b60405180910390fd5b611536610dff565b61153f83612099565b604051602001611550929190613735565b6040516020818303038152906040529050919050565b600061157182610dc8565b9050919050565b600b5481565b6000600d543410156115c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bc90613b8c565b60405180910390fd5b600c60009054906101000a900460ff168061161257506115e361108d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611651576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164890613b0c565b60405180910390fd5b600e600084846040516020016116689291906136f2565b60405160208183030381529060405280519060200120815260200190815260200160002060009054906101000a900460ff16156116da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d190613bac565b60405180910390fd5b6001600e600085856040516020016116f39291906136f2565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff0219169083151502179055507f5fb040992534e913b8cbaf2d36e32901b12d29863486cf17f824f1d06bd6f77533600d5485856040516117659493929190613828565b60405180910390a16000600b54905061177e33826121fa565b600b600081548092919061179190613ee5565b91905055508091505092915050565b60606117aa610dff565b6040516020016117ba9190613764565b604051602081830303815290604052905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61186a611aea565b73ffffffffffffffffffffffffffffffffffffffff1661188861108d565b73ffffffffffffffffffffffffffffffffffffffff16146118de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d590613aac565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611929611aea565b73ffffffffffffffffffffffffffffffffffffffff1661194761108d565b73ffffffffffffffffffffffffffffffffffffffff161461199d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199490613aac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a049061390c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611ae382600261221890919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b6583610dc8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611bb982600001612232565b9050919050565b6000611bcb82611acd565b611c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c01906139ec565b60405180910390fd5b6000611c1583610dc8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c8457508373ffffffffffffffffffffffffffffffffffffffff16611c6c84610a43565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c955750611c9481856117ce565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611cbe82610dc8565b73ffffffffffffffffffffffffffffffffffffffff1614611d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0b90613acc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7b9061394c565b60405180910390fd5b611d8f838383612243565b611d9a600082611af2565b611deb81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061224890919063ffffffff16565b50611e3d81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061226290919063ffffffff16565b50611e548183600261227c9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000611ec483600001836122b1565b60001c905092915050565b600080600080611ee28660000186612325565b915091508160001c8160001c9350935050509250929050565b6000611f0e846000018460001b846123af565b60001c90509392505050565b6000611f2882600001612450565b9050919050565b8060089080519060200190611f45929190612c0e565b5050565b80471015611f8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f83906139ac565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611fb290613791565b60006040518083038185875af1925050503d8060008114611fef576040519150601f19603f3d011682016040523d82523d6000602084013e611ff4565b606091505b5050905080612038576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202f9061398c565b60405180910390fd5b505050565b612048848484611c9e565b61205484848484612461565b612093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208a906138ec565b60405180910390fd5b50505050565b606060008214156120e1576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506121f5565b600082905060005b600082146121135780806120fc90613ee5565b915050600a8261210c9190613d4b565b91506120e9565b60008167ffffffffffffffff81111561212f5761212e614078565b5b6040519080825280601f01601f1916602001820160405280156121615781602001600182028036833780820191505090505b5090505b600085146121ee5760018261217a9190613d7c565b9150600a856121899190613f5c565b60306121959190613cf5565b60f81b8183815181106121ab576121aa614049565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121e79190613d4b565b9450612165565b8093505050505b919050565b6122148282604051806020016040528060008152506125c5565b5050565b600061222a836000018360001b612620565b905092915050565b600081600001805490509050919050565b505050565b600061225a836000018360001b612643565b905092915050565b6000612274836000018360001b61275b565b905092915050565b60006122a8846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b6127cb565b90509392505050565b6000818360000180549050116122fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f3906138cc565b60405180910390fd5b82600001828154811061231257612311614049565b5b9060005260206000200154905092915050565b60008082846000018054905011612371576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236890613a4c565b60405180910390fd5b600084600001848154811061238957612388614049565b5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240891906138aa565b60405180910390fd5b50846000016001826124239190613d7c565b8154811061243457612433614049565b5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b60006124828473ffffffffffffffffffffffffffffffffffffffff166128b7565b61248f57600190506125bd565b600061255663150b7a0260e01b6124a4611aea565b8887876040516024016124ba94939291906137dc565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518060600160405280603281526020016147cb603291398773ffffffffffffffffffffffffffffffffffffffff166128ca9092919063ffffffff16565b905060008180602001905181019061256e919061309b565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b6125cf83836128e2565b6125dc6000848484612461565b61261b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612612906138ec565b60405180910390fd5b505050565b600080836001016000848152602001908152602001600020541415905092915050565b6000808360010160008481526020019081526020016000205490506000811461274f5760006001826126759190613d7c565b905060006001866000018054905061268d9190613d7c565b905060008660000182815481106126a7576126a6614049565b5b90600052602060002001549050808760000184815481106126cb576126ca614049565b5b90600052602060002001819055506001836126e69190613cf5565b87600101600083815260200190815260200160002081905550866000018054806127135761271261401a565b5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612755565b60009150505b92915050565b60006127678383612a70565b6127c05782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506127c5565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415612872578460000160405180604001604052808681526020018581525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505084600001805490508560010160008681526020019081526020016000208190555060019150506128b0565b82856000016001836128849190613d7c565b8154811061289557612894614049565b5b90600052602060002090600202016001018190555060009150505b9392505050565b600080823b905060008111915050919050565b60606128d98484600085612a93565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294990613a6c565b60405180910390fd5b61295b81611acd565b1561299b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129929061392c565b60405180910390fd5b6129a760008383612243565b6129f881600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061226290919063ffffffff16565b50612a0f8183600261227c9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080836001016000848152602001908152602001600020541415905092915050565b606082471015612ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acf906139cc565b60405180910390fd5b612ae1856128b7565b612b20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1790613b6c565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612b49919061371e565b60006040518083038185875af1925050503d8060008114612b86576040519150601f19603f3d011682016040523d82523d6000602084013e612b8b565b606091505b5091509150612b9b828286612ba7565b92505050949350505050565b60608315612bb757829050612c07565b600083511115612bca5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfe91906138aa565b60405180910390fd5b9392505050565b828054612c1a90613e82565b90600052602060002090601f016020900481019282612c3c5760008555612c83565b82601f10612c5557805160ff1916838001178555612c83565b82800160010185558215612c83579182015b82811115612c82578251825591602001919060010190612c67565b5b509050612c909190612c94565b5090565b5b80821115612cad576000816000905550600101612c95565b5090565b6000612cc4612cbf84613c0c565b613be7565b905082815260208101848484011115612ce057612cdf6140ac565b5b612ceb848285613e40565b509392505050565b6000612d06612d0184613c3d565b613be7565b905082815260208101848484011115612d2257612d216140ac565b5b612d2d848285613e40565b509392505050565b600081359050612d4481614740565b92915050565b600081359050612d5981614757565b92915050565b600081359050612d6e8161476e565b92915050565b600081359050612d8381614785565b92915050565b600081359050612d988161479c565b92915050565b600081519050612dad8161479c565b92915050565b600082601f830112612dc857612dc76140a7565b5b8135612dd8848260208601612cb1565b91505092915050565b600082601f830112612df657612df56140a7565b5b8135612e06848260208601612cf3565b91505092915050565b600081359050612e1e816147b3565b92915050565b600060208284031215612e3a57612e396140b6565b5b6000612e4884828501612d35565b91505092915050565b600060208284031215612e6757612e666140b6565b5b6000612e7584828501612d4a565b91505092915050565b60008060408385031215612e9557612e946140b6565b5b6000612ea385828601612d35565b9250506020612eb485828601612d35565b9150509250929050565b600080600060608486031215612ed757612ed66140b6565b5b6000612ee586828701612d35565b9350506020612ef686828701612d35565b9250506040612f0786828701612e0f565b9150509250925092565b60008060008060808587031215612f2b57612f2a6140b6565b5b6000612f3987828801612d35565b9450506020612f4a87828801612d35565b9350506040612f5b87828801612e0f565b925050606085013567ffffffffffffffff811115612f7c57612f7b6140b1565b5b612f8887828801612db3565b91505092959194509250565b60008060408385031215612fab57612faa6140b6565b5b6000612fb985828601612d35565b9250506020612fca85828601612d5f565b9150509250929050565b60008060408385031215612feb57612fea6140b6565b5b6000612ff985828601612d35565b925050602061300a85828601612e0f565b9150509250929050565b60006020828403121561302a576130296140b6565b5b600061303884828501612d5f565b91505092915050565b600060208284031215613057576130566140b6565b5b600061306584828501612d74565b91505092915050565b600060208284031215613084576130836140b6565b5b600061309284828501612d89565b91505092915050565b6000602082840312156130b1576130b06140b6565b5b60006130bf84828501612d9e565b91505092915050565b6000602082840312156130de576130dd6140b6565b5b600082013567ffffffffffffffff8111156130fc576130fb6140b1565b5b61310884828501612de1565b91505092915050565b600060208284031215613127576131266140b6565b5b600061313584828501612e0f565b91505092915050565b60008060408385031215613155576131546140b6565b5b600061316385828601612e0f565b925050602061317485828601612e0f565b9150509250929050565b600061318a83836131a5565b60208301905092915050565b61319f81613dc2565b82525050565b6131ae81613db0565b82525050565b6131bd81613db0565b82525050565b6131d46131cf82613db0565b613f2e565b82525050565b60006131e582613c7e565b6131ef8185613cac565b93506131fa83613c6e565b8060005b8381101561322b578151613212888261317e565b975061321d83613c9f565b9250506001810190506131fe565b5085935050505092915050565b61324181613dd4565b82525050565b600061325282613c89565b61325c8185613cbd565b935061326c818560208601613e4f565b613275816140bb565b840191505092915050565b600061328b82613c89565b6132958185613cce565b93506132a5818560208601613e4f565b80840191505092915050565b60006132bc82613c94565b6132c68185613cd9565b93506132d6818560208601613e4f565b6132df816140bb565b840191505092915050565b60006132f582613c94565b6132ff8185613cea565b935061330f818560208601613e4f565b80840191505092915050565b6000613328602283613cd9565b9150613333826140d9565b604082019050919050565b600061334b603283613cd9565b915061335682614128565b604082019050919050565b600061336e602683613cd9565b915061337982614177565b604082019050919050565b6000613391601c83613cd9565b915061339c826141c6565b602082019050919050565b60006133b4602483613cd9565b91506133bf826141ef565b604082019050919050565b60006133d7601983613cd9565b91506133e28261423e565b602082019050919050565b60006133fa603a83613cd9565b915061340582614267565b604082019050919050565b600061341d601d83613cd9565b9150613428826142b6565b602082019050919050565b6000613440602683613cd9565b915061344b826142df565b604082019050919050565b6000613463602c83613cd9565b915061346e8261432e565b604082019050919050565b6000613486601183613cea565b91506134918261437d565b601182019050919050565b60006134a9603883613cd9565b91506134b4826143a6565b604082019050919050565b60006134cc602a83613cd9565b91506134d7826143f5565b604082019050919050565b60006134ef602283613cd9565b91506134fa82614444565b604082019050919050565b6000613512602083613cd9565b915061351d82614493565b602082019050919050565b6000613535602c83613cd9565b9150613540826144bc565b604082019050919050565b6000613558600583613cea565b91506135638261450b565b600582019050919050565b600061357b602083613cd9565b915061358682614534565b602082019050919050565b600061359e602983613cd9565b91506135a98261455d565b604082019050919050565b60006135c1602f83613cd9565b91506135cc826145ac565b604082019050919050565b60006135e4600d83613cd9565b91506135ef826145fb565b602082019050919050565b6000613607602183613cd9565b915061361282614624565b604082019050919050565b600061362a600083613cce565b915061363582614673565b600082019050919050565b600061364d603183613cd9565b915061365882614676565b604082019050919050565b6000613670601d83613cd9565b915061367b826146c5565b602082019050919050565b6000613693601383613cd9565b915061369e826146ee565b602082019050919050565b60006136b6601783613cd9565b91506136c182614717565b602082019050919050565b6136d581613e36565b82525050565b6136ec6136e782613e36565b613f52565b82525050565b60006136fe82856131c3565b60148201915061370e82846136db565b6020820191508190509392505050565b600061372a8284613280565b915081905092915050565b600061374182856132ea565b915061374d82846132ea565b91506137588261354b565b91508190509392505050565b600061377082846132ea565b915061377b82613479565b91506137868261354b565b915081905092915050565b600061379c8261361d565b9150819050919050565b60006020820190506137bb60008301846131b4565b92915050565b60006020820190506137d66000830184613196565b92915050565b60006080820190506137f160008301876131b4565b6137fe60208301866131b4565b61380b60408301856136cc565b818103606083015261381d8184613247565b905095945050505050565b600060808201905061383d60008301876131b4565b61384a60208301866136cc565b61385760408301856131b4565b61386460608301846136cc565b95945050505050565b6000602082019050818103600083015261388781846131da565b905092915050565b60006020820190506138a46000830184613238565b92915050565b600060208201905081810360008301526138c481846132b1565b905092915050565b600060208201905081810360008301526138e58161331b565b9050919050565b600060208201905081810360008301526139058161333e565b9050919050565b6000602082019050818103600083015261392581613361565b9050919050565b6000602082019050818103600083015261394581613384565b9050919050565b60006020820190508181036000830152613965816133a7565b9050919050565b60006020820190508181036000830152613985816133ca565b9050919050565b600060208201905081810360008301526139a5816133ed565b9050919050565b600060208201905081810360008301526139c581613410565b9050919050565b600060208201905081810360008301526139e581613433565b9050919050565b60006020820190508181036000830152613a0581613456565b9050919050565b60006020820190508181036000830152613a258161349c565b9050919050565b60006020820190508181036000830152613a45816134bf565b9050919050565b60006020820190508181036000830152613a65816134e2565b9050919050565b60006020820190508181036000830152613a8581613505565b9050919050565b60006020820190508181036000830152613aa581613528565b9050919050565b60006020820190508181036000830152613ac58161356e565b9050919050565b60006020820190508181036000830152613ae581613591565b9050919050565b60006020820190508181036000830152613b05816135b4565b9050919050565b60006020820190508181036000830152613b25816135d7565b9050919050565b60006020820190508181036000830152613b45816135fa565b9050919050565b60006020820190508181036000830152613b6581613640565b9050919050565b60006020820190508181036000830152613b8581613663565b9050919050565b60006020820190508181036000830152613ba581613686565b9050919050565b60006020820190508181036000830152613bc5816136a9565b9050919050565b6000602082019050613be160008301846136cc565b92915050565b6000613bf1613c02565b9050613bfd8282613eb4565b919050565b6000604051905090565b600067ffffffffffffffff821115613c2757613c26614078565b5b613c30826140bb565b9050602081019050919050565b600067ffffffffffffffff821115613c5857613c57614078565b5b613c61826140bb565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613d0082613e36565b9150613d0b83613e36565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d4057613d3f613f8d565b5b828201905092915050565b6000613d5682613e36565b9150613d6183613e36565b925082613d7157613d70613fbc565b5b828204905092915050565b6000613d8782613e36565b9150613d9283613e36565b925082821015613da557613da4613f8d565b5b828203905092915050565b6000613dbb82613e16565b9050919050565b6000613dcd82613e16565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613e6d578082015181840152602081019050613e52565b83811115613e7c576000848401525b50505050565b60006002820490506001821680613e9a57607f821691505b60208210811415613eae57613ead613feb565b5b50919050565b613ebd826140bb565b810181811067ffffffffffffffff82111715613edc57613edb614078565b5b80604052505050565b6000613ef082613e36565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f2357613f22613f8d565b5b600182019050919050565b6000613f3982613f40565b9050919050565b6000613f4b826140cc565b9050919050565b6000819050919050565b6000613f6782613e36565b9150613f7283613e36565b925082613f8257613f81613fbc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f636f6e74726163745f6d65746164617461000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f73616c65206e6f74206f70656e00000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f6e6f7420656e6f756768206574682073656e7400000000000000000000000000600082015250565b7f746f6b656e20697320616c7265616479206d696e746564000000000000000000600082015250565b61474981613db0565b811461475457600080fd5b50565b61476081613dc2565b811461476b57600080fd5b50565b61477781613dd4565b811461478257600080fd5b50565b61478e81613de0565b811461479957600080fd5b50565b6147a581613dea565b81146147b057600080fd5b50565b6147bc81613e36565b81146147c757600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220d2b21069746da17c1664dd534f079b1b1fde066eaf12249509fcce2d28af47e964736f6c63430008070033

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

0000000000000000000000000000000000000000000000000058d15e176280000000000000000000000000005a73badaee01abb988d12c5e030b1857437abad700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : givenPricePerPiece (uint256): 25000000000000000
Arg [1] : givenWithdrawalAddress (address): 0x5A73baDaeE01aBB988d12C5E030B1857437abAd7
Arg [2] : givenTokenURIBase (string):

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000058d15e17628000
Arg [1] : 0000000000000000000000005a73badaee01abb988d12c5e030b1857437abad7
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

61396:2588:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30934:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62986:277;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61601:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47990:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50709:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50239:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49717:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62568:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51599:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61535:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49479:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51975:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50005:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61564:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47746:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49297:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47463:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21203:148;;;;;;;;;;;;;:::i;:::-;;20552:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62440:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62187:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48159:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62724:118;;;;;;;;;;;;;:::i;:::-;;51002:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52197:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48334:515;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62868:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61501:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63271:710;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48908:150;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51368:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62316:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61454:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21506:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30934:150;31019:4;31043:20;:33;31064:11;31043:33;;;;;;;;;;;;;;;;;;;;;;;;;;;31036:40;;30934:150;;;:::o;62986:277::-;63054:16;63082:19;63124:5;63118:3;:11;;;;:::i;:::-;63104:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63082:48;;63146:9;63158:5;63146:17;;63141:95;63169:3;63165:1;:7;63141:95;;;63214:10;63222:1;63214:7;:10::i;:::-;63198:2;63205:5;63201:1;:9;;;;:::i;:::-;63198:13;;;;;;;;:::i;:::-;;;;;;;:26;;;;;;;;;;;63174:3;;;;;:::i;:::-;;;;63141:95;;;;63253:2;63246:9;;;62986:277;;;;:::o;61601:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;47990:100::-;48044:13;48077:5;48070:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47990:100;:::o;50709:221::-;50785:7;50813:16;50821:7;50813;:16::i;:::-;50805:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;50898:15;:24;50914:7;50898:24;;;;;;;;;;;;;;;;;;;;;50891:31;;50709:221;;;:::o;50239:404::-;50320:13;50336:23;50351:7;50336:14;:23::i;:::-;50320:39;;50384:5;50378:11;;:2;:11;;;;50370:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;50464:5;50448:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;50473:44;50497:5;50504:12;:10;:12::i;:::-;50473:23;:44::i;:::-;50448:69;50440:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;50614:21;50623:2;50627:7;50614:8;:21::i;:::-;50309:334;50239:404;;:::o;49717:211::-;49778:7;49899:21;:12;:19;:21::i;:::-;49892:28;;49717:211;:::o;62568:148::-;20783:12;:10;:12::i;:::-;20772:23;;:7;:5;:7::i;:::-;:23;;;20764:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62686:22:::1;62666:17;;:42;;;;;;;;;;;;;;;;;;62568:148:::0;:::o;51599:305::-;51760:41;51779:12;:10;:12::i;:::-;51793:7;51760:18;:41::i;:::-;51752:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;51868:28;51878:4;51884:2;51888:7;51868:9;:28::i;:::-;51599:305;;;:::o;61535:22::-;;;;;;;;;;;;;:::o;49479:162::-;49576:7;49603:30;49627:5;49603:13;:20;49617:5;49603:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;49596:37;;49479:162;;;;:::o;51975:151::-;52079:39;52096:4;52102:2;52106:7;52079:39;;;;;;;;;;;;:16;:39::i;:::-;51975:151;;;:::o;50005:172::-;50080:7;50101:15;50122:22;50138:5;50122:12;:15;;:22;;;;:::i;:::-;50100:44;;;50162:7;50155:14;;;50005:172;;;:::o;61564:28::-;;;;:::o;47746:177::-;47818:7;47845:70;47862:7;47845:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;47838:77;;47746:177;;;:::o;49297:97::-;49345:13;49378:8;49371:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49297:97;:::o;47463:221::-;47535:7;47580:1;47563:19;;:5;:19;;;;47555:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;47647:29;:13;:20;47661:5;47647:20;;;;;;;;;;;;;;;:27;:29::i;:::-;47640:36;;47463:221;;;:::o;21203:148::-;20783:12;:10;:12::i;:::-;20772:23;;:7;:5;:7::i;:::-;:23;;;20764:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21310:1:::1;21273:40;;21294:6;;;;;;;;;;;21273:40;;;;;;;;;;;;21341:1;21324:6;;:19;;;;;;;;;;;;;;;;;;21203:148::o:0;20552:87::-;20598:7;20625:6;;;;;;;;;;;20618:13;;20552:87;:::o;62440:102::-;20783:12;:10;:12::i;:::-;20772:23;;:7;:5;:7::i;:::-;:23;;;20764:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62524:10:::1;62508:13;:26;;;;62440:102:::0;:::o;62187:121::-;20783:12;:10;:12::i;:::-;20772:23;;:7;:5;:7::i;:::-;:23;;;20764:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62270:30:::1;62282:17;62270:11;:30::i;:::-;62187:121:::0;:::o;48159:104::-;48215:13;48248:7;48241:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48159:104;:::o;62724:118::-;20783:12;:10;:12::i;:::-;20772:23;;:7;:5;:7::i;:::-;:23;;;20764:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62775:59:::1;62793:17;;;;;;;;;;;62812:21;62775:17;:59::i;:::-;62724:118::o:0;51002:295::-;51117:12;:10;:12::i;:::-;51105:24;;:8;:24;;;;51097:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;51217:8;51172:18;:32;51191:12;:10;:12::i;:::-;51172:32;;;;;;;;;;;;;;;:42;51205:8;51172:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;51270:8;51241:48;;51256:12;:10;:12::i;:::-;51241:48;;;51280:8;51241:48;;;;;;:::i;:::-;;;;;;;;51002:295;;:::o;52197:285::-;52329:41;52348:12;:10;:12::i;:::-;52362:7;52329:18;:41::i;:::-;52321:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;52435:39;52449:4;52455:2;52459:7;52468:5;52435:13;:39::i;:::-;52197:285;;;;:::o;48334:515::-;48407:13;48441:16;48449:7;48441;:16::i;:::-;48433:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;48773:9;:7;:9::i;:::-;48783:18;:7;:16;:18::i;:::-;48756:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48742:69;;48334:515;;;:::o;62868:110::-;62925:7;62953:16;62961:7;62953;:16::i;:::-;62945:25;;62868:110;;;:::o;61501:27::-;;;;:::o;63271:710::-;63361:7;63401:13;;63388:9;:26;;63380:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;63457:10;;;;;;;;;;;:35;;;;63485:7;:5;:7::i;:::-;63471:21;;:10;:21;;;63457:35;63449:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;63530:13;:77;63571:16;63589:15;63554:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63544:62;;;;;;63530:77;;;;;;;;;;;;;;;;;;;;;63529:78;63521:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;63736:4;63656:13;:77;63697:16;63715:15;63680:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63670:62;;;;;;63656:77;;;;;;;;;;;;:84;;;;;;;;;;;;;;;;;;63756:68;63763:10;63775:13;;63790:16;63808:15;63756:68;;;;;;;;;:::i;:::-;;;;;;;;63837:19;63859:12;;63837:34;;63882;63892:10;63904:11;63882:9;:34::i;:::-;63929:12;;:15;;;;;;;;;:::i;:::-;;;;;;63962:11;63955:18;;;63271:710;;;;:::o;48908:150::-;48952:13;49009:9;:7;:9::i;:::-;48992:57;;;;;;;;:::i;:::-;;;;;;;;;;;;;48978:72;;48908:150;:::o;51368:164::-;51465:4;51489:18;:25;51508:5;51489:25;;;;;;;;;;;;;;;:35;51515:8;51489:35;;;;;;;;;;;;;;;;;;;;;;;;;51482:42;;51368:164;;;;:::o;62316:95::-;20783:12;:10;:12::i;:::-;20772:23;;:7;:5;:7::i;:::-;:23;;;20764:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62395:8:::1;62382:10;;:21;;;;;;;;;;;;;;;;;;62316:95:::0;:::o;61454:40::-;;;;;;;;;;;;;:::o;21506:244::-;20783:12;:10;:12::i;:::-;20772:23;;:7;:5;:7::i;:::-;:23;;;20764:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21615:1:::1;21595:22;;:8;:22;;;;21587:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21705:8;21676:38;;21697:6;;;;;;;;;;;21676:38;;;;;;;;;;;;21734:8;21725:6;;:17;;;;;;;;;;;;;;;;;;21506:244:::0;:::o;53949:127::-;54014:4;54038:30;54060:7;54038:12;:21;;:30;;;;:::i;:::-;54031:37;;53949:127;;;:::o;19177:98::-;19230:7;19257:10;19250:17;;19177:98;:::o;59877:183::-;59970:2;59943:15;:24;59959:7;59943:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;60026:7;60022:2;59988:46;;59997:23;60012:7;59997:14;:23::i;:::-;59988:46;;;;;;;;;;;;59877:183;;:::o;39757:123::-;39826:7;39853:19;39861:3;:10;;39853:7;:19::i;:::-;39846:26;;39757:123;;;:::o;54243:355::-;54336:4;54361:16;54369:7;54361;:16::i;:::-;54353:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54437:13;54453:23;54468:7;54453:14;:23::i;:::-;54437:39;;54506:5;54495:16;;:7;:16;;;:51;;;;54539:7;54515:31;;:20;54527:7;54515:11;:20::i;:::-;:31;;;54495:51;:94;;;;54550:39;54574:5;54581:7;54550:23;:39::i;:::-;54495:94;54487:103;;;54243:355;;;;:::o;57388:599::-;57513:4;57486:31;;:23;57501:7;57486:14;:23::i;:::-;:31;;;57478:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;57614:1;57600:16;;:2;:16;;;;57592:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;57670:39;57691:4;57697:2;57701:7;57670:20;:39::i;:::-;57774:29;57791:1;57795:7;57774:8;:29::i;:::-;57816:35;57843:7;57816:13;:19;57830:4;57816:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;57862:30;57884:7;57862:13;:17;57876:2;57862:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;57905:29;57922:7;57931:2;57905:12;:16;;:29;;;;;:::i;:::-;;57971:7;57967:2;57952:27;;57961:4;57952:27;;;;;;;;;;;;57388:599;;;:::o;10375:137::-;10446:7;10481:22;10485:3;:10;;10497:5;10481:3;:22::i;:::-;10473:31;;10466:38;;10375:137;;;;:::o;40219:236::-;40299:7;40308;40329:11;40342:13;40359:22;40363:3;:10;;40375:5;40359:3;:22::i;:::-;40328:53;;;;40408:3;40400:12;;40438:5;40430:14;;40392:55;;;;;;40219:236;;;;;:::o;41505:213::-;41612:7;41663:44;41668:3;:10;;41688:3;41680:12;;41694;41663:4;:44::i;:::-;41655:53;;41632:78;;41505:213;;;;;:::o;9918:114::-;9978:7;10005:19;10013:3;:10;;10005:7;:19::i;:::-;9998:26;;9918:114;;;:::o;58600:100::-;58684:8;58673;:19;;;;;;;;;;;;:::i;:::-;;58600:100;:::o;12645:397::-;12760:6;12735:21;:31;;12727:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;12892:12;12910:9;:14;;12933:6;12910:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12891:54;;;12964:7;12956:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;12716:326;12645:397;;:::o;53364:272::-;53478:28;53488:4;53494:2;53498:7;53478:9;:28::i;:::-;53525:48;53548:4;53554:2;53558:7;53567:5;53525:22;:48::i;:::-;53517:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;53364:272;;;;:::o;41976:723::-;42032:13;42262:1;42253:5;:10;42249:53;;;42280:10;;;;;;;;;;;;;;;;;;;;;42249:53;42312:12;42327:5;42312:20;;42343:14;42368:78;42383:1;42375:4;:9;42368:78;;42401:8;;;;;:::i;:::-;;;;42432:2;42424:10;;;;;:::i;:::-;;;42368:78;;;42456:19;42488:6;42478:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42456:39;;42506:154;42522:1;42513:5;:10;42506:154;;42550:1;42540:11;;;;;:::i;:::-;;;42617:2;42609:5;:10;;;;:::i;:::-;42596:2;:24;;;;:::i;:::-;42583:39;;42566:6;42573;42566:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;42646:2;42637:11;;;;;:::i;:::-;;;42506:154;;;42684:6;42670:21;;;;;41976:723;;;;:::o;54941:110::-;55017:26;55027:2;55031:7;55017:26;;;;;;;;;;;;:9;:26::i;:::-;54941:110;;:::o;39518:151::-;39602:4;39626:35;39636:3;:10;;39656:3;39648:12;;39626:9;:35::i;:::-;39619:42;;39518:151;;;;:::o;36336:110::-;36392:7;36419:3;:12;;:19;;;;36412:26;;36336:110;;;:::o;60673:93::-;;;;:::o;9463:137::-;9533:4;9557:35;9565:3;:10;;9585:5;9577:14;;9557:7;:35::i;:::-;9550:42;;9463:137;;;;:::o;9156:131::-;9223:4;9247:32;9252:3;:10;;9272:5;9264:14;;9247:4;:32::i;:::-;9240:39;;9156:131;;;;:::o;38941:185::-;39030:4;39054:64;39059:3;:10;;39079:3;39071:12;;39109:5;39093:23;;39085:32;;39054:4;:64::i;:::-;39047:71;;38941:185;;;;;:::o;5416:204::-;5483:7;5532:5;5511:3;:11;;:18;;;;:26;5503:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5594:3;:11;;5606:5;5594:18;;;;;;;;:::i;:::-;;;;;;;;;;5587:25;;5416:204;;;;:::o;36801:279::-;36868:7;36877;36927:5;36905:3;:12;;:19;;;;:27;36897:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;36984:22;37009:3;:12;;37022:5;37009:19;;;;;;;;:::i;:::-;;;;;;;;;;;;36984:44;;37047:5;:10;;;37059:5;:12;;;37039:33;;;;;36801:279;;;;;:::o;38298:319::-;38392:7;38412:16;38431:3;:12;;:17;38444:3;38431:17;;;;;;;;;;;;38412:36;;38479:1;38467:8;:13;;38482:12;38459:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;38549:3;:12;;38573:1;38562:8;:12;;;;:::i;:::-;38549:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:33;;;38542:40;;;38298:319;;;;;:::o;4964:109::-;5020:7;5047:3;:11;;:18;;;;5040:25;;4964:109;;;:::o;59265:604::-;59386:4;59413:15;:2;:13;;;:15::i;:::-;59408:60;;59452:4;59445:11;;;;59408:60;59478:23;59504:252;59557:45;;;59617:12;:10;:12::i;:::-;59644:4;59663:7;59685:5;59520:181;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59504:252;;;;;;;;;;;;;;;;;:2;:15;;;;:252;;;;;:::i;:::-;59478:278;;59767:13;59794:10;59783:32;;;;;;;;;;;;:::i;:::-;59767:48;;44433:10;59844:16;;59834:26;;;:6;:26;;;;59826:35;;;;59265:604;;;;;;;:::o;55278:250::-;55374:18;55380:2;55384:7;55374:5;:18::i;:::-;55411:54;55442:1;55446:2;55450:7;55459:5;55411:22;:54::i;:::-;55403:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;55278:250;;;:::o;36116:125::-;36187:4;36232:1;36211:3;:12;;:17;36224:3;36211:17;;;;;;;;;;;;:22;;36204:29;;36116:125;;;;:::o;3119:1544::-;3185:4;3303:18;3324:3;:12;;:19;3337:5;3324:19;;;;;;;;;;;;3303:40;;3374:1;3360:10;:15;3356:1300;;3722:21;3759:1;3746:10;:14;;;;:::i;:::-;3722:38;;3775:17;3816:1;3795:3;:11;;:18;;;;:22;;;;:::i;:::-;3775:42;;4062:17;4082:3;:11;;4094:9;4082:22;;;;;;;;:::i;:::-;;;;;;;;;;4062:42;;4228:9;4199:3;:11;;4211:13;4199:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;4347:1;4331:13;:17;;;;:::i;:::-;4305:3;:12;;:23;4318:9;4305:23;;;;;;;;;;;:43;;;;4457:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4552:3;:12;;:19;4565:5;4552:19;;;;;;;;;;;4545:26;;;4595:4;4588:11;;;;;;;;3356:1300;4639:5;4632:12;;;3119:1544;;;;;:::o;2529:414::-;2592:4;2614:21;2624:3;2629:5;2614:9;:21::i;:::-;2609:327;;2652:3;:11;;2669:5;2652:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2835:3;:11;;:18;;;;2813:3;:12;;:19;2826:5;2813:19;;;;;;;;;;;:40;;;;2875:4;2868:11;;;;2609:327;2919:5;2912:12;;2529:414;;;;;:::o;33616:692::-;33692:4;33808:16;33827:3;:12;;:17;33840:3;33827:17;;;;;;;;;;;;33808:36;;33873:1;33861:8;:13;33857:444;;;33928:3;:12;;33946:38;;;;;;;;33963:3;33946:38;;;;33976:5;33946:38;;;33928:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34143:3;:12;;:19;;;;34123:3;:12;;:17;34136:3;34123:17;;;;;;;;;;;:39;;;;34184:4;34177:11;;;;;33857:444;34257:5;34221:3;:12;;34245:1;34234:8;:12;;;;:::i;:::-;34221:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:33;;:41;;;;34284:5;34277:12;;;33616:692;;;;;;:::o;11288:422::-;11348:4;11556:12;11667:7;11655:20;11647:28;;11701:1;11694:4;:8;11687:15;;;11288:422;;;:::o;14206:195::-;14309:12;14341:52;14363:6;14371:4;14377:1;14380:12;14341:21;:52::i;:::-;14334:59;;14206:195;;;;;:::o;55864:404::-;55958:1;55944:16;;:2;:16;;;;55936:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;56017:16;56025:7;56017;:16::i;:::-;56016:17;56008:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;56079:45;56108:1;56112:2;56116:7;56079:20;:45::i;:::-;56137:30;56159:7;56137:13;:17;56151:2;56137:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;56180:29;56197:7;56206:2;56180:12;:16;;:29;;;;;:::i;:::-;;56252:7;56248:2;56227:33;;56244:1;56227:33;;;;;;;;;;;;55864:404;;:::o;4749:129::-;4822:4;4869:1;4846:3;:12;;:19;4859:5;4846:19;;;;;;;;;;;;:24;;4839:31;;4749:129;;;;:::o;15258:530::-;15385:12;15443:5;15418:21;:30;;15410:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;15510:18;15521:6;15510:10;:18::i;:::-;15502:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;15636:12;15650:23;15677:6;:11;;15697:5;15705:4;15677:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15635:75;;;;15728:52;15746:7;15755:10;15767:12;15728:17;:52::i;:::-;15721:59;;;;15258:530;;;;;;:::o;17798:742::-;17913:12;17942:7;17938:595;;;17973:10;17966:17;;;;17938:595;18107:1;18087:10;:17;:21;18083:439;;;18350:10;18344:17;18411:15;18398:10;18394:2;18390:19;18383:44;18083:439;18493:12;18486:20;;;;;;;;;;;:::i;:::-;;;;;;;;17798:742;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:155::-;1040:5;1078:6;1065:20;1056:29;;1094:41;1129:5;1094:41;:::i;:::-;986:155;;;;:::o;1147:133::-;1190:5;1228:6;1215:20;1206:29;;1244:30;1268:5;1244:30;:::i;:::-;1147:133;;;;:::o;1286:139::-;1332:5;1370:6;1357:20;1348:29;;1386:33;1413:5;1386:33;:::i;:::-;1286:139;;;;:::o;1431:137::-;1476:5;1514:6;1501:20;1492:29;;1530:32;1556:5;1530:32;:::i;:::-;1431:137;;;;:::o;1574:141::-;1630:5;1661:6;1655:13;1646:22;;1677:32;1703:5;1677:32;:::i;:::-;1574:141;;;;:::o;1734:338::-;1789:5;1838:3;1831:4;1823:6;1819:17;1815:27;1805:122;;1846:79;;:::i;:::-;1805:122;1963:6;1950:20;1988:78;2062:3;2054:6;2047:4;2039:6;2035:17;1988:78;:::i;:::-;1979:87;;1795:277;1734:338;;;;:::o;2092:340::-;2148:5;2197:3;2190:4;2182:6;2178:17;2174:27;2164:122;;2205:79;;:::i;:::-;2164:122;2322:6;2309:20;2347:79;2422:3;2414:6;2407:4;2399:6;2395:17;2347:79;:::i;:::-;2338:88;;2154:278;2092:340;;;;:::o;2438:139::-;2484:5;2522:6;2509:20;2500:29;;2538:33;2565:5;2538:33;:::i;:::-;2438:139;;;;:::o;2583:329::-;2642:6;2691:2;2679:9;2670:7;2666:23;2662:32;2659:119;;;2697:79;;:::i;:::-;2659:119;2817:1;2842:53;2887:7;2878:6;2867:9;2863:22;2842:53;:::i;:::-;2832:63;;2788:117;2583:329;;;;:::o;2918:345::-;2985:6;3034:2;3022:9;3013:7;3009:23;3005:32;3002:119;;;3040:79;;:::i;:::-;3002:119;3160:1;3185:61;3238:7;3229:6;3218:9;3214:22;3185:61;:::i;:::-;3175:71;;3131:125;2918:345;;;;:::o;3269:474::-;3337:6;3345;3394:2;3382:9;3373:7;3369:23;3365:32;3362:119;;;3400:79;;:::i;:::-;3362:119;3520:1;3545:53;3590:7;3581:6;3570:9;3566:22;3545:53;:::i;:::-;3535:63;;3491:117;3647:2;3673:53;3718:7;3709:6;3698:9;3694:22;3673:53;:::i;:::-;3663:63;;3618:118;3269:474;;;;;:::o;3749:619::-;3826:6;3834;3842;3891:2;3879:9;3870:7;3866:23;3862:32;3859:119;;;3897:79;;:::i;:::-;3859:119;4017:1;4042:53;4087:7;4078:6;4067:9;4063:22;4042:53;:::i;:::-;4032:63;;3988:117;4144:2;4170:53;4215:7;4206:6;4195:9;4191:22;4170:53;:::i;:::-;4160:63;;4115:118;4272:2;4298:53;4343:7;4334:6;4323:9;4319:22;4298:53;:::i;:::-;4288:63;;4243:118;3749:619;;;;;:::o;4374:943::-;4469:6;4477;4485;4493;4542:3;4530:9;4521:7;4517:23;4513:33;4510:120;;;4549:79;;:::i;:::-;4510:120;4669:1;4694:53;4739:7;4730:6;4719:9;4715:22;4694:53;:::i;:::-;4684:63;;4640:117;4796:2;4822:53;4867:7;4858:6;4847:9;4843:22;4822:53;:::i;:::-;4812:63;;4767:118;4924:2;4950:53;4995:7;4986:6;4975:9;4971:22;4950:53;:::i;:::-;4940:63;;4895:118;5080:2;5069:9;5065:18;5052:32;5111:18;5103:6;5100:30;5097:117;;;5133:79;;:::i;:::-;5097:117;5238:62;5292:7;5283:6;5272:9;5268:22;5238:62;:::i;:::-;5228:72;;5023:287;4374:943;;;;;;;:::o;5323:468::-;5388:6;5396;5445:2;5433:9;5424:7;5420:23;5416:32;5413:119;;;5451:79;;:::i;:::-;5413:119;5571:1;5596:53;5641:7;5632:6;5621:9;5617:22;5596:53;:::i;:::-;5586:63;;5542:117;5698:2;5724:50;5766:7;5757:6;5746:9;5742:22;5724:50;:::i;:::-;5714:60;;5669:115;5323:468;;;;;:::o;5797:474::-;5865:6;5873;5922:2;5910:9;5901:7;5897:23;5893:32;5890:119;;;5928:79;;:::i;:::-;5890:119;6048:1;6073:53;6118:7;6109:6;6098:9;6094:22;6073:53;:::i;:::-;6063:63;;6019:117;6175:2;6201:53;6246:7;6237:6;6226:9;6222:22;6201:53;:::i;:::-;6191:63;;6146:118;5797:474;;;;;:::o;6277:323::-;6333:6;6382:2;6370:9;6361:7;6357:23;6353:32;6350:119;;;6388:79;;:::i;:::-;6350:119;6508:1;6533:50;6575:7;6566:6;6555:9;6551:22;6533:50;:::i;:::-;6523:60;;6479:114;6277:323;;;;:::o;6606:329::-;6665:6;6714:2;6702:9;6693:7;6689:23;6685:32;6682:119;;;6720:79;;:::i;:::-;6682:119;6840:1;6865:53;6910:7;6901:6;6890:9;6886:22;6865:53;:::i;:::-;6855:63;;6811:117;6606:329;;;;:::o;6941:327::-;6999:6;7048:2;7036:9;7027:7;7023:23;7019:32;7016:119;;;7054:79;;:::i;:::-;7016:119;7174:1;7199:52;7243:7;7234:6;7223:9;7219:22;7199:52;:::i;:::-;7189:62;;7145:116;6941:327;;;;:::o;7274:349::-;7343:6;7392:2;7380:9;7371:7;7367:23;7363:32;7360:119;;;7398:79;;:::i;:::-;7360:119;7518:1;7543:63;7598:7;7589:6;7578:9;7574:22;7543:63;:::i;:::-;7533:73;;7489:127;7274:349;;;;:::o;7629:509::-;7698:6;7747:2;7735:9;7726:7;7722:23;7718:32;7715:119;;;7753:79;;:::i;:::-;7715:119;7901:1;7890:9;7886:17;7873:31;7931:18;7923:6;7920:30;7917:117;;;7953:79;;:::i;:::-;7917:117;8058:63;8113:7;8104:6;8093:9;8089:22;8058:63;:::i;:::-;8048:73;;7844:287;7629:509;;;;:::o;8144:329::-;8203:6;8252:2;8240:9;8231:7;8227:23;8223:32;8220:119;;;8258:79;;:::i;:::-;8220:119;8378:1;8403:53;8448:7;8439:6;8428:9;8424:22;8403:53;:::i;:::-;8393:63;;8349:117;8144:329;;;;:::o;8479:474::-;8547:6;8555;8604:2;8592:9;8583:7;8579:23;8575:32;8572:119;;;8610:79;;:::i;:::-;8572:119;8730:1;8755:53;8800:7;8791:6;8780:9;8776:22;8755:53;:::i;:::-;8745:63;;8701:117;8857:2;8883:53;8928:7;8919:6;8908:9;8904:22;8883:53;:::i;:::-;8873:63;;8828:118;8479:474;;;;;:::o;8959:179::-;9028:10;9049:46;9091:3;9083:6;9049:46;:::i;:::-;9127:4;9122:3;9118:14;9104:28;;8959:179;;;;:::o;9144:142::-;9247:32;9273:5;9247:32;:::i;:::-;9242:3;9235:45;9144:142;;:::o;9292:108::-;9369:24;9387:5;9369:24;:::i;:::-;9364:3;9357:37;9292:108;;:::o;9406:118::-;9493:24;9511:5;9493:24;:::i;:::-;9488:3;9481:37;9406:118;;:::o;9530:157::-;9635:45;9655:24;9673:5;9655:24;:::i;:::-;9635:45;:::i;:::-;9630:3;9623:58;9530:157;;:::o;9723:732::-;9842:3;9871:54;9919:5;9871:54;:::i;:::-;9941:86;10020:6;10015:3;9941:86;:::i;:::-;9934:93;;10051:56;10101:5;10051:56;:::i;:::-;10130:7;10161:1;10146:284;10171:6;10168:1;10165:13;10146:284;;;10247:6;10241:13;10274:63;10333:3;10318:13;10274:63;:::i;:::-;10267:70;;10360:60;10413:6;10360:60;:::i;:::-;10350:70;;10206:224;10193:1;10190;10186:9;10181:14;;10146:284;;;10150:14;10446:3;10439:10;;9847:608;;;9723:732;;;;:::o;10461:109::-;10542:21;10557:5;10542:21;:::i;:::-;10537:3;10530:34;10461:109;;:::o;10576:360::-;10662:3;10690:38;10722:5;10690:38;:::i;:::-;10744:70;10807:6;10802:3;10744:70;:::i;:::-;10737:77;;10823:52;10868:6;10863:3;10856:4;10849:5;10845:16;10823:52;:::i;:::-;10900:29;10922:6;10900:29;:::i;:::-;10895:3;10891:39;10884:46;;10666:270;10576:360;;;;:::o;10942:373::-;11046:3;11074:38;11106:5;11074:38;:::i;:::-;11128:88;11209:6;11204:3;11128:88;:::i;:::-;11121:95;;11225:52;11270:6;11265:3;11258:4;11251:5;11247:16;11225:52;:::i;:::-;11302:6;11297:3;11293:16;11286:23;;11050:265;10942:373;;;;:::o;11321:364::-;11409:3;11437:39;11470:5;11437:39;:::i;:::-;11492:71;11556:6;11551:3;11492:71;:::i;:::-;11485:78;;11572:52;11617:6;11612:3;11605:4;11598:5;11594:16;11572:52;:::i;:::-;11649:29;11671:6;11649:29;:::i;:::-;11644:3;11640:39;11633:46;;11413:272;11321:364;;;;:::o;11691:377::-;11797:3;11825:39;11858:5;11825:39;:::i;:::-;11880:89;11962:6;11957:3;11880:89;:::i;:::-;11873:96;;11978:52;12023:6;12018:3;12011:4;12004:5;12000:16;11978:52;:::i;:::-;12055:6;12050:3;12046:16;12039:23;;11801:267;11691:377;;;;:::o;12074:366::-;12216:3;12237:67;12301:2;12296:3;12237:67;:::i;:::-;12230:74;;12313:93;12402:3;12313:93;:::i;:::-;12431:2;12426:3;12422:12;12415:19;;12074:366;;;:::o;12446:::-;12588:3;12609:67;12673:2;12668:3;12609:67;:::i;:::-;12602:74;;12685:93;12774:3;12685:93;:::i;:::-;12803:2;12798:3;12794:12;12787:19;;12446:366;;;:::o;12818:::-;12960:3;12981:67;13045:2;13040:3;12981:67;:::i;:::-;12974:74;;13057:93;13146:3;13057:93;:::i;:::-;13175:2;13170:3;13166:12;13159:19;;12818:366;;;:::o;13190:::-;13332:3;13353:67;13417:2;13412:3;13353:67;:::i;:::-;13346:74;;13429:93;13518:3;13429:93;:::i;:::-;13547:2;13542:3;13538:12;13531:19;;13190:366;;;:::o;13562:::-;13704:3;13725:67;13789:2;13784:3;13725:67;:::i;:::-;13718:74;;13801:93;13890:3;13801:93;:::i;:::-;13919:2;13914:3;13910:12;13903:19;;13562:366;;;:::o;13934:::-;14076:3;14097:67;14161:2;14156:3;14097:67;:::i;:::-;14090:74;;14173:93;14262:3;14173:93;:::i;:::-;14291:2;14286:3;14282:12;14275:19;;13934:366;;;:::o;14306:::-;14448:3;14469:67;14533:2;14528:3;14469:67;:::i;:::-;14462:74;;14545:93;14634:3;14545:93;:::i;:::-;14663:2;14658:3;14654:12;14647:19;;14306:366;;;:::o;14678:::-;14820:3;14841:67;14905:2;14900:3;14841:67;:::i;:::-;14834:74;;14917:93;15006:3;14917:93;:::i;:::-;15035:2;15030:3;15026:12;15019:19;;14678:366;;;:::o;15050:::-;15192:3;15213:67;15277:2;15272:3;15213:67;:::i;:::-;15206:74;;15289:93;15378:3;15289:93;:::i;:::-;15407:2;15402:3;15398:12;15391:19;;15050:366;;;:::o;15422:::-;15564:3;15585:67;15649:2;15644:3;15585:67;:::i;:::-;15578:74;;15661:93;15750:3;15661:93;:::i;:::-;15779:2;15774:3;15770:12;15763:19;;15422:366;;;:::o;15794:402::-;15954:3;15975:85;16057:2;16052:3;15975:85;:::i;:::-;15968:92;;16069:93;16158:3;16069:93;:::i;:::-;16187:2;16182:3;16178:12;16171:19;;15794:402;;;:::o;16202:366::-;16344:3;16365:67;16429:2;16424:3;16365:67;:::i;:::-;16358:74;;16441:93;16530:3;16441:93;:::i;:::-;16559:2;16554:3;16550:12;16543:19;;16202:366;;;:::o;16574:::-;16716:3;16737:67;16801:2;16796:3;16737:67;:::i;:::-;16730:74;;16813:93;16902:3;16813:93;:::i;:::-;16931:2;16926:3;16922:12;16915:19;;16574:366;;;:::o;16946:::-;17088:3;17109:67;17173:2;17168:3;17109:67;:::i;:::-;17102:74;;17185:93;17274:3;17185:93;:::i;:::-;17303:2;17298:3;17294:12;17287:19;;16946:366;;;:::o;17318:::-;17460:3;17481:67;17545:2;17540:3;17481:67;:::i;:::-;17474:74;;17557:93;17646:3;17557:93;:::i;:::-;17675:2;17670:3;17666:12;17659:19;;17318:366;;;:::o;17690:::-;17832:3;17853:67;17917:2;17912:3;17853:67;:::i;:::-;17846:74;;17929:93;18018:3;17929:93;:::i;:::-;18047:2;18042:3;18038:12;18031:19;;17690:366;;;:::o;18062:400::-;18222:3;18243:84;18325:1;18320:3;18243:84;:::i;:::-;18236:91;;18336:93;18425:3;18336:93;:::i;:::-;18454:1;18449:3;18445:11;18438:18;;18062:400;;;:::o;18468:366::-;18610:3;18631:67;18695:2;18690:3;18631:67;:::i;:::-;18624:74;;18707:93;18796:3;18707:93;:::i;:::-;18825:2;18820:3;18816:12;18809:19;;18468:366;;;:::o;18840:::-;18982:3;19003:67;19067:2;19062:3;19003:67;:::i;:::-;18996:74;;19079:93;19168:3;19079:93;:::i;:::-;19197:2;19192:3;19188:12;19181:19;;18840:366;;;:::o;19212:::-;19354:3;19375:67;19439:2;19434:3;19375:67;:::i;:::-;19368:74;;19451:93;19540:3;19451:93;:::i;:::-;19569:2;19564:3;19560:12;19553:19;;19212:366;;;:::o;19584:::-;19726:3;19747:67;19811:2;19806:3;19747:67;:::i;:::-;19740:74;;19823:93;19912:3;19823:93;:::i;:::-;19941:2;19936:3;19932:12;19925:19;;19584:366;;;:::o;19956:::-;20098:3;20119:67;20183:2;20178:3;20119:67;:::i;:::-;20112:74;;20195:93;20284:3;20195:93;:::i;:::-;20313:2;20308:3;20304:12;20297:19;;19956:366;;;:::o;20328:398::-;20487:3;20508:83;20589:1;20584:3;20508:83;:::i;:::-;20501:90;;20600:93;20689:3;20600:93;:::i;:::-;20718:1;20713:3;20709:11;20702:18;;20328:398;;;:::o;20732:366::-;20874:3;20895:67;20959:2;20954:3;20895:67;:::i;:::-;20888:74;;20971:93;21060:3;20971:93;:::i;:::-;21089:2;21084:3;21080:12;21073:19;;20732:366;;;:::o;21104:::-;21246:3;21267:67;21331:2;21326:3;21267:67;:::i;:::-;21260:74;;21343:93;21432:3;21343:93;:::i;:::-;21461:2;21456:3;21452:12;21445:19;;21104:366;;;:::o;21476:::-;21618:3;21639:67;21703:2;21698:3;21639:67;:::i;:::-;21632:74;;21715:93;21804:3;21715:93;:::i;:::-;21833:2;21828:3;21824:12;21817:19;;21476:366;;;:::o;21848:::-;21990:3;22011:67;22075:2;22070:3;22011:67;:::i;:::-;22004:74;;22087:93;22176:3;22087:93;:::i;:::-;22205:2;22200:3;22196:12;22189:19;;21848:366;;;:::o;22220:118::-;22307:24;22325:5;22307:24;:::i;:::-;22302:3;22295:37;22220:118;;:::o;22344:157::-;22449:45;22469:24;22487:5;22469:24;:::i;:::-;22449:45;:::i;:::-;22444:3;22437:58;22344:157;;:::o;22507:397::-;22647:3;22662:75;22733:3;22724:6;22662:75;:::i;:::-;22762:2;22757:3;22753:12;22746:19;;22775:75;22846:3;22837:6;22775:75;:::i;:::-;22875:2;22870:3;22866:12;22859:19;;22895:3;22888:10;;22507:397;;;;;:::o;22910:271::-;23040:3;23062:93;23151:3;23142:6;23062:93;:::i;:::-;23055:100;;23172:3;23165:10;;22910:271;;;;:::o;23187:701::-;23468:3;23490:95;23581:3;23572:6;23490:95;:::i;:::-;23483:102;;23602:95;23693:3;23684:6;23602:95;:::i;:::-;23595:102;;23714:148;23858:3;23714:148;:::i;:::-;23707:155;;23879:3;23872:10;;23187:701;;;;;:::o;23894:807::-;24228:3;24250:95;24341:3;24332:6;24250:95;:::i;:::-;24243:102;;24362:148;24506:3;24362:148;:::i;:::-;24355:155;;24527:148;24671:3;24527:148;:::i;:::-;24520:155;;24692:3;24685:10;;23894:807;;;;:::o;24707:379::-;24891:3;24913:147;25056:3;24913:147;:::i;:::-;24906:154;;25077:3;25070:10;;24707:379;;;:::o;25092:222::-;25185:4;25223:2;25212:9;25208:18;25200:26;;25236:71;25304:1;25293:9;25289:17;25280:6;25236:71;:::i;:::-;25092:222;;;;:::o;25320:254::-;25429:4;25467:2;25456:9;25452:18;25444:26;;25480:87;25564:1;25553:9;25549:17;25540:6;25480:87;:::i;:::-;25320:254;;;;:::o;25580:640::-;25775:4;25813:3;25802:9;25798:19;25790:27;;25827:71;25895:1;25884:9;25880:17;25871:6;25827:71;:::i;:::-;25908:72;25976:2;25965:9;25961:18;25952:6;25908:72;:::i;:::-;25990;26058:2;26047:9;26043:18;26034:6;25990:72;:::i;:::-;26109:9;26103:4;26099:20;26094:2;26083:9;26079:18;26072:48;26137:76;26208:4;26199:6;26137:76;:::i;:::-;26129:84;;25580:640;;;;;;;:::o;26226:553::-;26403:4;26441:3;26430:9;26426:19;26418:27;;26455:71;26523:1;26512:9;26508:17;26499:6;26455:71;:::i;:::-;26536:72;26604:2;26593:9;26589:18;26580:6;26536:72;:::i;:::-;26618;26686:2;26675:9;26671:18;26662:6;26618:72;:::i;:::-;26700;26768:2;26757:9;26753:18;26744:6;26700:72;:::i;:::-;26226:553;;;;;;;:::o;26785:373::-;26928:4;26966:2;26955:9;26951:18;26943:26;;27015:9;27009:4;27005:20;27001:1;26990:9;26986:17;26979:47;27043:108;27146:4;27137:6;27043:108;:::i;:::-;27035:116;;26785:373;;;;:::o;27164:210::-;27251:4;27289:2;27278:9;27274:18;27266:26;;27302:65;27364:1;27353:9;27349:17;27340:6;27302:65;:::i;:::-;27164:210;;;;:::o;27380:313::-;27493:4;27531:2;27520:9;27516:18;27508:26;;27580:9;27574:4;27570:20;27566:1;27555:9;27551:17;27544:47;27608:78;27681:4;27672:6;27608:78;:::i;:::-;27600:86;;27380:313;;;;:::o;27699:419::-;27865:4;27903:2;27892:9;27888:18;27880:26;;27952:9;27946:4;27942:20;27938:1;27927:9;27923:17;27916:47;27980:131;28106:4;27980:131;:::i;:::-;27972:139;;27699:419;;;:::o;28124:::-;28290:4;28328:2;28317:9;28313:18;28305:26;;28377:9;28371:4;28367:20;28363:1;28352:9;28348:17;28341:47;28405:131;28531:4;28405:131;:::i;:::-;28397:139;;28124:419;;;:::o;28549:::-;28715:4;28753:2;28742:9;28738:18;28730:26;;28802:9;28796:4;28792:20;28788:1;28777:9;28773:17;28766:47;28830:131;28956:4;28830:131;:::i;:::-;28822:139;;28549:419;;;:::o;28974:::-;29140:4;29178:2;29167:9;29163:18;29155:26;;29227:9;29221:4;29217:20;29213:1;29202:9;29198:17;29191:47;29255:131;29381:4;29255:131;:::i;:::-;29247:139;;28974:419;;;:::o;29399:::-;29565:4;29603:2;29592:9;29588:18;29580:26;;29652:9;29646:4;29642:20;29638:1;29627:9;29623:17;29616:47;29680:131;29806:4;29680:131;:::i;:::-;29672:139;;29399:419;;;:::o;29824:::-;29990:4;30028:2;30017:9;30013:18;30005:26;;30077:9;30071:4;30067:20;30063:1;30052:9;30048:17;30041:47;30105:131;30231:4;30105:131;:::i;:::-;30097:139;;29824:419;;;:::o;30249:::-;30415:4;30453:2;30442:9;30438:18;30430:26;;30502:9;30496:4;30492:20;30488:1;30477:9;30473:17;30466:47;30530:131;30656:4;30530:131;:::i;:::-;30522:139;;30249:419;;;:::o;30674:::-;30840:4;30878:2;30867:9;30863:18;30855:26;;30927:9;30921:4;30917:20;30913:1;30902:9;30898:17;30891:47;30955:131;31081:4;30955:131;:::i;:::-;30947:139;;30674:419;;;:::o;31099:::-;31265:4;31303:2;31292:9;31288:18;31280:26;;31352:9;31346:4;31342:20;31338:1;31327:9;31323:17;31316:47;31380:131;31506:4;31380:131;:::i;:::-;31372:139;;31099:419;;;:::o;31524:::-;31690:4;31728:2;31717:9;31713:18;31705:26;;31777:9;31771:4;31767:20;31763:1;31752:9;31748:17;31741:47;31805:131;31931:4;31805:131;:::i;:::-;31797:139;;31524:419;;;:::o;31949:::-;32115:4;32153:2;32142:9;32138:18;32130:26;;32202:9;32196:4;32192:20;32188:1;32177:9;32173:17;32166:47;32230:131;32356:4;32230:131;:::i;:::-;32222:139;;31949:419;;;:::o;32374:::-;32540:4;32578:2;32567:9;32563:18;32555:26;;32627:9;32621:4;32617:20;32613:1;32602:9;32598:17;32591:47;32655:131;32781:4;32655:131;:::i;:::-;32647:139;;32374:419;;;:::o;32799:::-;32965:4;33003:2;32992:9;32988:18;32980:26;;33052:9;33046:4;33042:20;33038:1;33027:9;33023:17;33016:47;33080:131;33206:4;33080:131;:::i;:::-;33072:139;;32799:419;;;:::o;33224:::-;33390:4;33428:2;33417:9;33413:18;33405:26;;33477:9;33471:4;33467:20;33463:1;33452:9;33448:17;33441:47;33505:131;33631:4;33505:131;:::i;:::-;33497:139;;33224:419;;;:::o;33649:::-;33815:4;33853:2;33842:9;33838:18;33830:26;;33902:9;33896:4;33892:20;33888:1;33877:9;33873:17;33866:47;33930:131;34056:4;33930:131;:::i;:::-;33922:139;;33649:419;;;:::o;34074:::-;34240:4;34278:2;34267:9;34263:18;34255:26;;34327:9;34321:4;34317:20;34313:1;34302:9;34298:17;34291:47;34355:131;34481:4;34355:131;:::i;:::-;34347:139;;34074:419;;;:::o;34499:::-;34665:4;34703:2;34692:9;34688:18;34680:26;;34752:9;34746:4;34742:20;34738:1;34727:9;34723:17;34716:47;34780:131;34906:4;34780:131;:::i;:::-;34772:139;;34499:419;;;:::o;34924:::-;35090:4;35128:2;35117:9;35113:18;35105:26;;35177:9;35171:4;35167:20;35163:1;35152:9;35148:17;35141:47;35205:131;35331:4;35205:131;:::i;:::-;35197:139;;34924:419;;;:::o;35349:::-;35515:4;35553:2;35542:9;35538:18;35530:26;;35602:9;35596:4;35592:20;35588:1;35577:9;35573:17;35566:47;35630:131;35756:4;35630:131;:::i;:::-;35622:139;;35349:419;;;:::o;35774:::-;35940:4;35978:2;35967:9;35963:18;35955:26;;36027:9;36021:4;36017:20;36013:1;36002:9;35998:17;35991:47;36055:131;36181:4;36055:131;:::i;:::-;36047:139;;35774:419;;;:::o;36199:::-;36365:4;36403:2;36392:9;36388:18;36380:26;;36452:9;36446:4;36442:20;36438:1;36427:9;36423:17;36416:47;36480:131;36606:4;36480:131;:::i;:::-;36472:139;;36199:419;;;:::o;36624:::-;36790:4;36828:2;36817:9;36813:18;36805:26;;36877:9;36871:4;36867:20;36863:1;36852:9;36848:17;36841:47;36905:131;37031:4;36905:131;:::i;:::-;36897:139;;36624:419;;;:::o;37049:::-;37215:4;37253:2;37242:9;37238:18;37230:26;;37302:9;37296:4;37292:20;37288:1;37277:9;37273:17;37266:47;37330:131;37456:4;37330:131;:::i;:::-;37322:139;;37049:419;;;:::o;37474:::-;37640:4;37678:2;37667:9;37663:18;37655:26;;37727:9;37721:4;37717:20;37713:1;37702:9;37698:17;37691:47;37755:131;37881:4;37755:131;:::i;:::-;37747:139;;37474:419;;;:::o;37899:222::-;37992:4;38030:2;38019:9;38015:18;38007:26;;38043:71;38111:1;38100:9;38096:17;38087:6;38043:71;:::i;:::-;37899:222;;;;:::o;38127:129::-;38161:6;38188:20;;:::i;:::-;38178:30;;38217:33;38245:4;38237:6;38217:33;:::i;:::-;38127:129;;;:::o;38262:75::-;38295:6;38328:2;38322:9;38312:19;;38262:75;:::o;38343:307::-;38404:4;38494:18;38486:6;38483:30;38480:56;;;38516:18;;:::i;:::-;38480:56;38554:29;38576:6;38554:29;:::i;:::-;38546:37;;38638:4;38632;38628:15;38620:23;;38343:307;;;:::o;38656:308::-;38718:4;38808:18;38800:6;38797:30;38794:56;;;38830:18;;:::i;:::-;38794:56;38868:29;38890:6;38868:29;:::i;:::-;38860:37;;38952:4;38946;38942:15;38934:23;;38656:308;;;:::o;38970:132::-;39037:4;39060:3;39052:11;;39090:4;39085:3;39081:14;39073:22;;38970:132;;;:::o;39108:114::-;39175:6;39209:5;39203:12;39193:22;;39108:114;;;:::o;39228:98::-;39279:6;39313:5;39307:12;39297:22;;39228:98;;;:::o;39332:99::-;39384:6;39418:5;39412:12;39402:22;;39332:99;;;:::o;39437:113::-;39507:4;39539;39534:3;39530:14;39522:22;;39437:113;;;:::o;39556:184::-;39655:11;39689:6;39684:3;39677:19;39729:4;39724:3;39720:14;39705:29;;39556:184;;;;:::o;39746:168::-;39829:11;39863:6;39858:3;39851:19;39903:4;39898:3;39894:14;39879:29;;39746:168;;;;:::o;39920:147::-;40021:11;40058:3;40043:18;;39920:147;;;;:::o;40073:169::-;40157:11;40191:6;40186:3;40179:19;40231:4;40226:3;40222:14;40207:29;;40073:169;;;;:::o;40248:148::-;40350:11;40387:3;40372:18;;40248:148;;;;:::o;40402:305::-;40442:3;40461:20;40479:1;40461:20;:::i;:::-;40456:25;;40495:20;40513:1;40495:20;:::i;:::-;40490:25;;40649:1;40581:66;40577:74;40574:1;40571:81;40568:107;;;40655:18;;:::i;:::-;40568:107;40699:1;40696;40692:9;40685:16;;40402:305;;;;:::o;40713:185::-;40753:1;40770:20;40788:1;40770:20;:::i;:::-;40765:25;;40804:20;40822:1;40804:20;:::i;:::-;40799:25;;40843:1;40833:35;;40848:18;;:::i;:::-;40833:35;40890:1;40887;40883:9;40878:14;;40713:185;;;;:::o;40904:191::-;40944:4;40964:20;40982:1;40964:20;:::i;:::-;40959:25;;40998:20;41016:1;40998:20;:::i;:::-;40993:25;;41037:1;41034;41031:8;41028:34;;;41042:18;;:::i;:::-;41028:34;41087:1;41084;41080:9;41072:17;;40904:191;;;;:::o;41101:96::-;41138:7;41167:24;41185:5;41167:24;:::i;:::-;41156:35;;41101:96;;;:::o;41203:104::-;41248:7;41277:24;41295:5;41277:24;:::i;:::-;41266:35;;41203:104;;;:::o;41313:90::-;41347:7;41390:5;41383:13;41376:21;41365:32;;41313:90;;;:::o;41409:77::-;41446:7;41475:5;41464:16;;41409:77;;;:::o;41492:149::-;41528:7;41568:66;41561:5;41557:78;41546:89;;41492:149;;;:::o;41647:126::-;41684:7;41724:42;41717:5;41713:54;41702:65;;41647:126;;;:::o;41779:77::-;41816:7;41845:5;41834:16;;41779:77;;;:::o;41862:154::-;41946:6;41941:3;41936;41923:30;42008:1;41999:6;41994:3;41990:16;41983:27;41862:154;;;:::o;42022:307::-;42090:1;42100:113;42114:6;42111:1;42108:13;42100:113;;;42199:1;42194:3;42190:11;42184:18;42180:1;42175:3;42171:11;42164:39;42136:2;42133:1;42129:10;42124:15;;42100:113;;;42231:6;42228:1;42225:13;42222:101;;;42311:1;42302:6;42297:3;42293:16;42286:27;42222:101;42071:258;42022:307;;;:::o;42335:320::-;42379:6;42416:1;42410:4;42406:12;42396:22;;42463:1;42457:4;42453:12;42484:18;42474:81;;42540:4;42532:6;42528:17;42518:27;;42474:81;42602:2;42594:6;42591:14;42571:18;42568:38;42565:84;;;42621:18;;:::i;:::-;42565:84;42386:269;42335:320;;;:::o;42661:281::-;42744:27;42766:4;42744:27;:::i;:::-;42736:6;42732:40;42874:6;42862:10;42859:22;42838:18;42826:10;42823:34;42820:62;42817:88;;;42885:18;;:::i;:::-;42817:88;42925:10;42921:2;42914:22;42704:238;42661:281;;:::o;42948:233::-;42987:3;43010:24;43028:5;43010:24;:::i;:::-;43001:33;;43056:66;43049:5;43046:77;43043:103;;;43126:18;;:::i;:::-;43043:103;43173:1;43166:5;43162:13;43155:20;;42948:233;;;:::o;43187:100::-;43226:7;43255:26;43275:5;43255:26;:::i;:::-;43244:37;;43187:100;;;:::o;43293:94::-;43332:7;43361:20;43375:5;43361:20;:::i;:::-;43350:31;;43293:94;;;:::o;43393:79::-;43432:7;43461:5;43450:16;;43393:79;;;:::o;43478:176::-;43510:1;43527:20;43545:1;43527:20;:::i;:::-;43522:25;;43561:20;43579:1;43561:20;:::i;:::-;43556:25;;43600:1;43590:35;;43605:18;;:::i;:::-;43590:35;43646:1;43643;43639:9;43634:14;;43478:176;;;;:::o;43660:180::-;43708:77;43705:1;43698:88;43805:4;43802:1;43795:15;43829:4;43826:1;43819:15;43846:180;43894:77;43891:1;43884:88;43991:4;43988:1;43981:15;44015:4;44012:1;44005:15;44032:180;44080:77;44077:1;44070:88;44177:4;44174:1;44167:15;44201:4;44198:1;44191:15;44218:180;44266:77;44263:1;44256:88;44363:4;44360:1;44353:15;44387:4;44384:1;44377:15;44404:180;44452:77;44449:1;44442:88;44549:4;44546:1;44539:15;44573:4;44570:1;44563:15;44590:180;44638:77;44635:1;44628:88;44735:4;44732:1;44725:15;44759:4;44756:1;44749:15;44776:117;44885:1;44882;44875:12;44899:117;45008:1;45005;44998:12;45022:117;45131:1;45128;45121:12;45145:117;45254:1;45251;45244:12;45268:102;45309:6;45360:2;45356:7;45351:2;45344:5;45340:14;45336:28;45326:38;;45268:102;;;:::o;45376:94::-;45409:8;45457:5;45453:2;45449:14;45428:35;;45376:94;;;:::o;45476:221::-;45616:34;45612:1;45604:6;45600:14;45593:58;45685:4;45680:2;45672:6;45668:15;45661:29;45476:221;:::o;45703:237::-;45843:34;45839:1;45831:6;45827:14;45820:58;45912:20;45907:2;45899:6;45895:15;45888:45;45703:237;:::o;45946:225::-;46086:34;46082:1;46074:6;46070:14;46063:58;46155:8;46150:2;46142:6;46138:15;46131:33;45946:225;:::o;46177:178::-;46317:30;46313:1;46305:6;46301:14;46294:54;46177:178;:::o;46361:223::-;46501:34;46497:1;46489:6;46485:14;46478:58;46570:6;46565:2;46557:6;46553:15;46546:31;46361:223;:::o;46590:175::-;46730:27;46726:1;46718:6;46714:14;46707:51;46590:175;:::o;46771:245::-;46911:34;46907:1;46899:6;46895:14;46888:58;46980:28;46975:2;46967:6;46963:15;46956:53;46771:245;:::o;47022:179::-;47162:31;47158:1;47150:6;47146:14;47139:55;47022:179;:::o;47207:225::-;47347:34;47343:1;47335:6;47331:14;47324:58;47416:8;47411:2;47403:6;47399:15;47392:33;47207:225;:::o;47438:231::-;47578:34;47574:1;47566:6;47562:14;47555:58;47647:14;47642:2;47634:6;47630:15;47623:39;47438:231;:::o;47675:167::-;47815:19;47811:1;47803:6;47799:14;47792:43;47675:167;:::o;47848:243::-;47988:34;47984:1;47976:6;47972:14;47965:58;48057:26;48052:2;48044:6;48040:15;48033:51;47848:243;:::o;48097:229::-;48237:34;48233:1;48225:6;48221:14;48214:58;48306:12;48301:2;48293:6;48289:15;48282:37;48097:229;:::o;48332:221::-;48472:34;48468:1;48460:6;48456:14;48449:58;48541:4;48536:2;48528:6;48524:15;48517:29;48332:221;:::o;48559:182::-;48699:34;48695:1;48687:6;48683:14;48676:58;48559:182;:::o;48747:231::-;48887:34;48883:1;48875:6;48871:14;48864:58;48956:14;48951:2;48943:6;48939:15;48932:39;48747:231;:::o;48984:155::-;49124:7;49120:1;49112:6;49108:14;49101:31;48984:155;:::o;49145:182::-;49285:34;49281:1;49273:6;49269:14;49262:58;49145:182;:::o;49333:228::-;49473:34;49469:1;49461:6;49457:14;49450:58;49542:11;49537:2;49529:6;49525:15;49518:36;49333:228;:::o;49567:234::-;49707:34;49703:1;49695:6;49691:14;49684:58;49776:17;49771:2;49763:6;49759:15;49752:42;49567:234;:::o;49807:163::-;49947:15;49943:1;49935:6;49931:14;49924:39;49807:163;:::o;49976:220::-;50116:34;50112:1;50104:6;50100:14;50093:58;50185:3;50180:2;50172:6;50168:15;50161:28;49976:220;:::o;50202:114::-;;:::o;50322:236::-;50462:34;50458:1;50450:6;50446:14;50439:58;50531:19;50526:2;50518:6;50514:15;50507:44;50322:236;:::o;50564:179::-;50704:31;50700:1;50692:6;50688:14;50681:55;50564:179;:::o;50749:169::-;50889:21;50885:1;50877:6;50873:14;50866:45;50749:169;:::o;50924:173::-;51064:25;51060:1;51052:6;51048:14;51041:49;50924:173;:::o;51103:122::-;51176:24;51194:5;51176:24;:::i;:::-;51169:5;51166:35;51156:63;;51215:1;51212;51205:12;51156:63;51103:122;:::o;51231:138::-;51312:32;51338:5;51312:32;:::i;:::-;51305:5;51302:43;51292:71;;51359:1;51356;51349:12;51292:71;51231:138;:::o;51375:116::-;51445:21;51460:5;51445:21;:::i;:::-;51438:5;51435:32;51425:60;;51481:1;51478;51471:12;51425:60;51375:116;:::o;51497:122::-;51570:24;51588:5;51570:24;:::i;:::-;51563:5;51560:35;51550:63;;51609:1;51606;51599:12;51550:63;51497:122;:::o;51625:120::-;51697:23;51714:5;51697:23;:::i;:::-;51690:5;51687:34;51677:62;;51735:1;51732;51725:12;51677:62;51625:120;:::o;51751:122::-;51824:24;51842:5;51824:24;:::i;:::-;51817:5;51814:35;51804:63;;51863:1;51860;51853:12;51804:63;51751:122;:::o

Swarm Source

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