ETH Price: $3,341.59 (-0.99%)

Genesis Rocks: 10,000 (ROCKS10)
 

Overview

TokenID

8334

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The very first Rock NFT collectible Created Christmas Day, 2017 by the dev who created EtherRocks - this original contract was abandoned by our father due to it's bugs(but we like the bugs) These Are The 100-9999 Rocks Rocks that grant the HODLer access to gated Rock content...

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
GenesisRocks10000

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// File: GenesisRocks10000_flat.sol


// File: base64-sol/base64.sol



pragma solidity >=0.6.0;

/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides functions for encoding/decoding base64
library Base64 {
    string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    bytes  internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000"
                                            hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000"
                                            hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000"
                                            hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000";

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';

        // load the table into memory
        string memory table = TABLE_ENCODE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
                // read 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // write 4 characters
                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(        input,  0x3F))))
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }

        return result;
    }

    function decode(string memory _data) internal pure returns (bytes memory) {
        bytes memory data = bytes(_data);

        if (data.length == 0) return new bytes(0);
        require(data.length % 4 == 0, "invalid base64 decoder input");

        // load the table into memory
        bytes memory table = TABLE_DECODE;

        // every 4 characters represent 3 bytes
        uint256 decodedLen = (data.length / 4) * 3;

        // add some extra buffer at the end required for the writing
        bytes memory result = new bytes(decodedLen + 32);

        assembly {
            // padding with '='
            let lastBytes := mload(add(data, mload(data)))
            if eq(and(lastBytes, 0xFF), 0x3d) {
                decodedLen := sub(decodedLen, 1)
                if eq(and(lastBytes, 0xFFFF), 0x3d3d) {
                    decodedLen := sub(decodedLen, 1)
                }
            }

            // set the actual output length
            mstore(result, decodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 4 characters at a time
            for {} lt(dataPtr, endPtr) {}
            {
               // read 4 characters
               dataPtr := add(dataPtr, 4)
               let input := mload(dataPtr)

               // write 3 bytes
               let output := add(
                   add(
                       shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)),
                       shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))),
                   add(
                       shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)),
                               and(mload(add(tablePtr, and(        input , 0xFF))), 0xFF)
                    )
                )
                mstore(resultPtr, shl(232, output))
                resultPtr := add(resultPtr, 3)
            }
        }

        return result;
    }
}

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



pragma solidity ^0.8.0;

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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



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/ERC721.sol



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        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 _owners[tokenId] != address(0);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

// File: GenesisRocks10000.sol



pragma solidity ^0.8.0;






interface EtherRock {
  function sellRock (uint rockNumber, uint price) external;
  function giftRock (uint rockNumber, address receiver) external;
}

contract RockWarden is Ownable {
  function claim(uint256 id, EtherRock rocks) public onlyOwner {
    rocks.sellRock(id, type(uint256).max);
    rocks.giftRock(id, owner());
  }
  
  function withdraw(uint256 id, EtherRock rocks, address recipient) public onlyOwner {
    rocks.giftRock(id, recipient);
  }
}

contract GenesisRocks10000 is ERC721, Ownable {
  EtherRock public rocks = EtherRock(0x37504AE0282f5f334ED29b4548646f887977b7cC);

  using Address for address;
  using Strings for uint256;

  string private _baseTokenURI;
  uint256 private _totalSupply;

  mapping(address => address) public wardens;
  
  string[] hashes = [
    "bafybeibkx5swmemvqkc6n3umzuaplcssrq6bp2uyh3n2vhdywzv6lszv3q/0.png",
    "bafybeid6g2ue77ioxviruwhbz77nz7fyyomf7c24c2ya7i725uto7plpxe/1.png",
    "bafybeigwsvacvsu7puct5p2wyenietreui6yealsshmc4w3cnlx2vtwgai/2.png",
    "bafybeihaszjogt4ksjzcx5abvqsfcxc4ow35nb33idqrzelbwget7sxtzi/3.png",
    "bafybeicll7pdbhxfsnejqjgsgjfspnxpv5g6rmkqrkty7mnfbgztlhnnxe/4.png",
    "bafybeiazo5mjnq5ot6l3msgbrwsqo3qc43czdzyc7goe4vxjlk4ciwan34/5.png",
    "bafybeie62no5b4pwobhcs2ritotdf2baiiw65sjraxyeabxr4ewtqu5534/6.png",
    "bafybeibrtcuqfuredutyvezpx4jixl34zps5tx54j4x23b56bhre4l4bmq/7.png",
    "bafybeihjtbnrkbsks4xjqyqniginmhxi4miwwq7cfderohicec3tsjnojq/8.png",
    "bafybeifjmbzw4623nkbrji5vmahgygtkeikl2id23fddym4fovspeargle/9.png",
    "bafybeibljith3s2p7bhewtfjabpssvsxchhr7peuok3ovksedai24steca/10.png",
    "bafybeihyg4rr22joidsj3iabhakrtzccfw7yu4e4jivi5k2g6dxzx37cji/11.png",
    "bafybeidl4vfgozexxpnd2f6jlrvzukg57w6rx7hsp4mqyhonfe2jqsofk4/12.png",
    "bafybeiegqsp5fhjfxjlxn4pz7mjyqrfufujl7q5b7tc4m6c54qwiui56dq/13.png",
    "bafybeibnfylvb5wt52snk4ysjpjva375qrsfuefmpazjips57vqh7qotue/14.png",
    "bafybeienhpn3mmhz6thd4fsompabimm5nrckkdmee5dmbttwoenscvq35a/15.png",
    "bafybeih2nzl4whby3boqyhmxduurcpxc42swsnrdclvlnkymm3e5sazb3q/16.png",
    "bafybeiefla4dqvtitzc5gcxzkfjsyqeglrmgiqf7otvb3fyfulycg6slbi/17.png",
    "bafybeicmbsfmms2uou2j2bnkk4zclwoame4g3gfrtf3uqldc7wynvjixdy/18.png",
    "bafybeid55k5gcprfldsm6up4gn2zit2yxkiulub2dj4ch2u3cvyyvi5spm/19.png",
    "bafybeieyvsycayibpt6ba2sheynybvwspdp4hmpd5korwan62d7xh4ifoi/20.png",
    "bafybeidgyyy7uyjdszhjmjdxydjvv2ml4yubkkoszhw7jqk5cnq4q5p5ku/21.png",
    "bafybeiabef6qwjur72567ontn2enb6q6a6y2nmrxe22dptvkjmekboqxbq/22.png",
    "bafybeiaky5urvqxfbqgw7cdnz3y2jfgmmn5etkdiyststppncjt4obmsem/23.png",
    "bafybeihzdaz2zdybzruzaylgodrc5wnc4ovdgxecd5vr6cnmxiwa6bsznu/24.png",
    "bafybeid4k5owwkp2iwpwysx2fkrm22cw3uocpibiayefbyq3djndckehky/25.png",
    "bafybeidisyhllcubgt7fonj75wba5pd5fav5ouyp2pfobknj65ddt77gtu/26.png",
    "bafybeihy5ebpxx66nrit6ab37di4o4fnudxuo6uynyfyw6usqeomty53yi/27.png",
    "bafybeie7p3vv2mife23ny32sryybfvkthvtkhhr3odaz6ez3yxkztchylq/28.png",
    "bafybeidi7fynufmcpf62icnl353cpthyvlccvzmiagb347wjpkaeszm2uy/29.png",
    "bafybeiggt4qctt4zc4ok2xrabbbdiftod2mk2keaq3fedtvlfomjqwvsri/30.png",
    "bafybeihp7dluwbvde5xhcsde4n7tfhjkumpk7fkowslrhgwjsciykyxv2e/31.png",
    "bafybeiepuyb3muwc4cktrehvy7evqh2b742gshrukvvpas33kxvsubmihy/32.png",
    "bafybeicmdrbgecx74o4a6vxqa46xdiw3skhtkgi45c5wu2psj6posdqcii/33.png",
    "bafybeigcfno3crdjkorj4zrmb7ljqzjmeazycvyk7xxigufmdtabrnzlqi/34.png",
    "bafybeibqhj4w7vpeylpbmsoea2tfcxhnc64vwirdzrede2qoi4aj2h55om/35.png",
    "bafybeib2hmg65ee3vu7wz27sb42lknkv3olu23qhemqticymqnfzmkn54e/36.png",
    "bafybeifs2ebu6abo735ju7j4md6t3hkadxz645k57ucdizvqgciy4ps62i/37.png",
    "bafybeif35al6hft2zxiclyht4o67q6ikyky7h3mhfo5hutbyfzynolne4m/38.png",
    "bafybeibq6vhh3ow6ttibcbv4aepdl4m4rptf5zjsss2fhtjedecskzkhpy/39.png",
    "bafybeihtdemergxlzro3gqbnw6lnrwsv5egk5c4byhgg53645hbyztnifu/40.png",
    "bafybeigsv55x7wl3ylvxgsocjlbuacl6msd25uivlgnvnan5imosxs72ue/41.png",
    "bafybeidmjlrgqnw5jbyaugdnqoznfd5nhbmideuzisc3pihevofanvcf7m/42.png",
    "bafybeiaho2ryguxp4kikrx6l4qqnmioilvlxtzukdzazl2e2sjanjg3j5i/43.png",
    "bafybeigyxtw4sflpjzhqojrceazskx7r7di2pzm6lmm5574pkjvlu5wprq/44.png",
    "bafybeibhstjoxjpb3ifqg2pkjbjt2begv7o6yyqv2nvq6mytmpyx63pu2q/45.png",
    "bafybeibd2a22uu5nwogbnbcd2j63jhoxzebx7jiw2mz4of5eipimp3vlfm/46.png",
    "bafybeihej5csmxgut63guxwpcmjlpcqydeswac3ml3daxsxyaool5ubqrm/47.png",
    "bafybeifv25l3j7vuio4fpibldnz6pnc7ulcpjpkm56uiy34ix4xhayhrea/48.png",
    "bafybeidavpbhl5kmw2tw5m77wdadvyii4cn3kj2qa774kzqxt5hhlfk6de/49.png",
    "bafybeih3myim7cot6qgkufpf4qax4jwfosb3ay2j7ngnp23nlndbak7gbu/50.png",
    "bafybeibjr4isxcym3br4dw3qyhg2lqfxs7swnej6leovld7o6j4caiv2eq/51.png",
    "bafybeifbctyqcaw7omczjuhtusrqj6inph7duxrummkjwu54aeljenjyea/52.png",
    "bafybeihtrcyp5dvmtlrumyarinhkplroynd2mhqprbpkml6pjrhjh5jqby/53.png",
    "bafybeie3bjbnkrzz6qxm6prwkzbqson6mioo2sugkb3x5yrihad34s3jyy/54.png",
    "bafybeib7sv5z7imkhpaooyrczhpblbupqlt3gqbcwq2qxpqikbdruhj7h4/55.png",
    "bafybeifmlm6mrnyulltqnteod7gte5gjazpqcgfwwpkakrz3wfy3jdogsu/56.png",
    "bafybeidfio3epkf6fpqyz2phkfvljakcezwilnfnkuuiywm5temfcaotiu/57.png",
    "bafybeifz6omzulksux26v6edmnbzlgibbypzubrkyx6ldlygocnniemchu/58.png",
    "bafybeigg5b7ekwbhscgpfcbkvlyvbfchwlgzfap7fijsq2ukpzz2em7sja/59.png",
    "bafybeia2bjfwpgonkj7vhhwg77uclpkw6yqollcvaxjxwwriqt76idow4a/60.png",
    "bafybeiag2qrodx2ccswb3i2s6y6bk7rtvh7tisrk4xijyl66sb6vuwelru/61.png",
    "bafybeibu3mvhofxxm5lsvzuhidepfcxlimdbzz3khisp3irqe66w53hnri/62.png",
    "bafybeidlrjyyrhyxibd72ckqptuejqx2kddbcqcpwydtz3vajun2yo4j3a/63.png",
    "bafybeibnfwgnv5yiapnx6fhorzhtsbrxyzoheexwmlmr2a2xkxy24keh3q/64.png",
    "bafybeiaywoattfnnyzoqdrovfvyulnj44ypkwqxsjz6knsrsr5omooklja/65.png",
    "bafybeifiyzfn5og6gr74v6oe4ytwoztszn6sjjzqprehjdew4xge35fyte/66.png",
    "bafybeigj57sqg6lwnt2hffigvvvwhpt6ir2hgujmgnqzm6l23rmsqdanei/67.png",
    "bafybeiel246xxkwgtz3li7iitx5ujjshjdip7su2zzongk63zgxzhzxuoe/68.png",
    "bafybeihj7grfgvonzjcvd2enc3kovwmwcwhhysddb2txb5x2updha4r7qm/69.png",
    "bafybeicob7xlej5qdwotmejiizt4dhuvoq3fcdso3fsfcfabokx7hjva2u/70.png",
    "bafybeigpzytgwmpdpig3s4l7fdg2w7627c4tz7gxqa742xo6uakmyze7qa/71.png",
    "bafybeihze2fkvmli5dm73ymiqztgdni27j3ztffmn2j4syr5wx4naejqiu/72.png",
    "bafybeia5falyzlwyt5zhhrkj5xkidjplz4yuaq5ppzs3mmml4tbgvgbcgq/73.png",
    "bafybeiexu6gltckfabwhvjmrrq6dokxnfdxydgzuzc4pwehp4asyji7dsi/74.png",
    "bafybeihiyvsc4isfvziwo5lg2bqnsoeyx545awvqvyk3afyireviercg2i/75.png",
    "bafybeiewjw2bmvclvewxpish4b3h3gokqbvp2rxkuklmroys73s2casno4/76.png",
    "bafybeifiyhndowzs5ohsbu6oo3jp2efdyg5r7koiyagbecnc3l3jxtgt4i/77.png",
    "bafybeibruwz6z4v2qodbuovpgctiu6qq4xpjgdyvrp5fqih3v33hba2tgi/78.png",
    "bafybeiatcunvjtmdhgiz5gaqnc63jvoe4ch5tf3gc2nc63jgdbjnsfnrce/79.png",
    "bafybeiekjthxvazasrv2i2fav55xnqcrww23k6z5xa7vbq6ygpj5d4y7nu/80.png",
    "bafybeia7x66ub5ninxssddqqhcjg7lhkpajucgjen62haljbtpo2jcl35y/81.png",
    "bafybeibgthwxybiyai3i3tismoujkogh4xtipobm6ez2j6kjpdgtbx5rie/82.png",
    "bafybeifg5blbog3h7knabnprws7lrt3e3owjc7zqhg5e442hdnmzhpmraq/83.png",
    "bafybeihssuwji6vdi6sxaqjifso4o7cdsyxaexfpsbxswqcljgi2k4fcna/84.png",
    "bafybeidwih3zspn6r6hnvrihwhggq7mifq6p5keitcmsuucwu2be3yiygu/85.png",
    "bafybeibwh7gmwgjwjw3siysytkhyiik3rx5zml5mtqzr4dah65mojlid2q/86.png",
    "bafybeiagfudwfwbc52kbxjvfngkdmy3dgj3dd3rptvtjxmw63tgnfrgtja/87.png",
    "bafybeifl2wrn3ewx4oh5iw3kh2uctbm2wdw4c75g2ekxxnvif3u3x22vru/88.png",
    "bafybeibmxm32pspx2bmpbvf32dh67qg5z4kmqqpuierdo5sbiwdfhz76uy/89.png",
    "bafybeihouhmonqdr4scfsgazyenulsl4krvif2l4v2xrhpwi454yh7zsfa/90.png",
    "bafybeia47xlh5g4s3b5wf2um5hixjrwvk2njnpzdmizr5ayxylvmrh256y/91.png",
    "bafybeifyltspgtm32zn6v5w3jasqkv5nkyugvk6s7btvjyehmllybers7m/92.png",
    "bafybeibch2274okimr24j27n7xpxl46iq63f5ros43rp4mzvihuz6hdtzi/93.png",
    "bafybeiefji3z6v3aqemjf4cyeqkb2r4cbr4hzqabkgwc5gbm2isv2kjqxq/94.png",
    "bafybeigzqm4h3mvmulviqo2sao33dncd4xmnrmemt7jk4luhsl34pmputu/95.png",
    "bafybeiaskeyvdkkp2hnpiaww3zhiewhxiq57zha6wshktyjdl6ivvijoia/96.png",
    "bafybeic2arp2fuuocdqdcx7tzjgl6m4jfozty7mjt4mvyffjqh2y3oz33y/97.png",
    "bafybeidej2nunivmxwsrpqyxmurnflproqobzv3pm7sx3uudpb64cawcxu/98.png",
    "bafybeidqpcfb6vg3xevz3n4jyfcl5s2nftftgdqhrnuclcwrsc6wgb2g6u/99.png"
  ];
    
  constructor() ERC721("Genesis Rocks: 10,000", "ROCKS10") {}

  function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
    require(tokenId > 99 && tokenId < 10000);
   
    string memory image = string(abi.encodePacked(_baseURI(), _hash(tokenId % 100)));

    return string(
      abi.encodePacked(
        'data:application/json;base64,',
        Base64.encode(
          bytes(
            abi.encodePacked(
              '{"name":"',
                string(abi.encodePacked("Rock #", tokenId.toString())),
              '", "description":"',
                string(abi.encodePacked("Rock #", tokenId.toString(), " from a contract deployed on the 25th of December, 2017")),
              '", "attributes": [{ "trait_type:": "Number", "value": ', tokenId.toString(), ' }], "image": "',
                image,
              '"}'
            )
          )
        )
      )
    );
  }
  
  function _baseURI() internal view virtual override returns (string memory) {
    return "ipfs://";
  }
  
  function _hash(uint256 id) internal view virtual returns (string memory) {
    return hashes[id];
  }
  
  function totalSupply() public view virtual returns (uint256) {
    return _totalSupply;
  }
    
  function wrap(uint256 id) public {
    // get warden address
    address warden = wardens[_msgSender()];
    require(warden != address(0), "Warden not registered");
    require(id > 99 && id < 10000);
    
    // claim rock
    RockWarden(warden).claim(id, rocks);
    
    // mint wrapped rock
    _mint(_msgSender(), id);
    
    // increment supply
    _totalSupply += 1;
  }
  
  function unwrap(uint256 id) public {
    require(_msgSender() == ownerOf(id));
    
    // burn wrapped rock
    _burn(id);
    
    // decrement supply
    _totalSupply -= 1;
    
    // send rock to user
    rocks.giftRock(id, _msgSender());
  }
  
  function rescue(uint256 id) public {
    // get warden address
    address warden = wardens[_msgSender()];
    require(warden != address(0), "Warden not registered");

    // withdraw rock
    RockWarden(warden).withdraw(id, rocks, _msgSender());
  }
  
  function createWarden() public {
    address warden = address(new RockWarden());
    require(warden != address(0), "Warden address incorrect");
    require(wardens[_msgSender()] == address(0), "Warden already created");
    wardens[_msgSender()] = warden;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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":"createWarden","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"rescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rocks","outputs":[{"internalType":"contract EtherRock","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"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":"uint256","name":"id","type":"uint256"}],"name":"unwrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"wardens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"wrap","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040527337504ae0282f5f334ed29b4548646f887977b7cc600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180610c800160405280604051806080016040528060418152602001620065c060419139815260200160405180608001604052806041815260200162006dfc60419139815260200160405180608001604052806041815260200162005c3960419139815260200160405180608001604052806041815260200162006f86604191398152602001604051806080016040528060418152602001620064776041913981526020016040518060800160405280604181526020016200689560419139815260200160405180608001604052806041815260200162006e3d60419139815260200160405180608001604052806041815260200162006d3760419139815260200160405180608001604052806041815260200162005f0e604191398152602001604051806080016040528060418152602001620069de6041913981526020016040518060800160405280604281526020016200729d60429139815260200160405180608001604052806042815260200162005e8a604291398152602001604051806080016040528060428152602001620059216042913981526020016040518060800160405280604281526020016200695a60429139815260200160405180608001604052806042815260200162006e7e60429139815260200160405180608001604052806042815260200162005b316042913981526020016040518060800160405280604281526020016200664360429139815260200160405180608001604052806042815260200162006c2f60429139815260200160405180608001604052806042815260200162005f916042913981526020016040518060800160405280604281526020016200678d60429139815260200160405180608001604052806042815260200162006cb360429139815260200160405180608001604052806042815260200162006cf560429139815260200160405180608001604052806042815260200162005e0660429139815260200160405180608001604052806042815260200162005e486042913981526020016040518060800160405280604281526020016200596360429139815260200160405180608001604052806042815260200162006bed60429139815260200160405180608001604052806042815260200162006c71604291398152602001604051806080016040528060428152602001620064fa60429139815260200160405180608001604052806042815260200162006853604291398152602001604051806080016040528060428152602001620071d760429139815260200160405180608001604052806042815260200162005ecc60429139815260200160405180608001604052806042815260200162005f4f60429139815260200160405180608001604052806042815260200162006a61604291398152602001604051806080016040528060428152602001620068d6604291398152602001604051806080016040528060428152602001620059e7604291398152602001604051806080016040528060428152602001620066c760429139815260200160405180608001604052806042815260200162006d78604291398152602001604051806080016040528060428152602001620062a9604291398152602001604051806080016040528060428152602001620059a560429139815260200160405180608001604052806042815260200162005a2960429139815260200160405180608001604052806042815260200162007111604291398152602001604051806080016040528060428152602001620070cf604291398152602001604051806080016040528060428152602001620066016042913981526020016040518060800160405280604281526020016200636f60429139815260200160405180608001604052806042815260200162005cfe60429139815260200160405180608001604052806042815260200162005bf7604291398152602001604051806080016040528060428152602001620071536042913981526020016040518060800160405280604281526020016200708d60429139815260200160405180608001604052806042815260200162005dc4604291398152602001604051806080016040528060428152602001620067cf6042913981526020016040518060800160405280604281526020016200725b60429139815260200160405180608001604052806042815260200162006f446042913981526020016040518060800160405280604281526020016200622560429139815260200160405180608001604052806042815260200162006a1f60429139815260200160405180608001604052806042815260200162005d826042913981526020016040518060800160405280604281526020016200615f60429139815260200160405180608001604052806042815260200162006ec060429139815260200160405180608001604052806042815260200162005aad604291398152602001604051806080016040528060428152602001620063b160429139815260200160405180608001604052806042815260200162006b69604291398152602001604051806080016040528060428152602001620063f360429139815260200160405180608001604052806042815260200162005c7a60429139815260200160405180608001604052806042815260200162006fc760429139815260200160405180608001604052806042815260200162006dba604291398152602001604051806080016040528060428152602001620064b8604291398152602001604051806080016040528060428152602001620060996042913981526020016040518060800160405280604281526020016200704b604291398152602001604051806080016040528060428152602001620067096042913981526020016040518060800160405280604281526020016200721960429139815260200160405180608001604052806042815260200162005cbc60429139815260200160405180608001604052806042815260200162005a6b6042913981526020016040518060800160405280604281526020016200605760429139815260200160405180608001604052806042815260200162006918604291398152602001604051806080016040528060428152602001620071956042913981526020016040518060800160405280604281526020016200601560429139815260200160405180608001604052806042815260200162005aef6042913981526020016040518060800160405280604281526020016200626760429139815260200160405180608001604052806042815260200162006aa36042913981526020016040518060800160405280604281526020016200657e60429139815260200160405180608001604052806042815260200162006f0260429139815260200160405180608001604052806042815260200162006ae560429139815260200160405180608001604052806042815260200162005b7360429139815260200160405180608001604052806042815260200162006bab6042913981526020016040518060800160405280604281526020016200700960429139815260200160405180608001604052806042815260200162006435604291398152602001604051806080016040528060428152602001620061e3604291398152602001604051806080016040528060428152602001620062eb60429139815260200160405180608001604052806042815260200162006b27604291398152602001604051806080016040528060428152602001620060db604291398152602001604051806080016040528060428152602001620061a16042913981526020016040518060800160405280604281526020016200611d60429139815260200160405180608001604052806042815260200162005fd36042913981526020016040518060800160405280604281526020016200668560429139815260200160405180608001604052806042815260200162005d406042913981526020016040518060800160405280604281526020016200632d604291398152602001604051806080016040528060428152602001620068116042913981526020016040518060800160405280604281526020016200699c60429139815260200160405180608001604052806042815260200162005bb56042913981526020016040518060800160405280604281526020016200653c6042913981526020016040518060800160405280604281526020016200674b60429139815250600b90606462000c9192919062000e34565b5034801562000c9f57600080fd5b506040518060400160405280601581526020017f47656e6573697320526f636b733a2031302c30303000000000000000000000008152506040518060400160405280600781526020017f524f434b53313000000000000000000000000000000000000000000000000000815250816000908051906020019062000d2492919062000e9b565b50806001908051906020019062000d3d92919062000e9b565b50505062000d6062000d5462000d6660201b60201c565b62000d6e60201b60201c565b6200101e565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805482825590600052602060002090810192821562000e88579160200282015b8281111562000e8757825182908051906020019062000e7692919062000e9b565b509160200191906001019062000e55565b5b50905062000e97919062000f2c565b5090565b82805462000ea99062000fb9565b90600052602060002090601f01602090048101928262000ecd576000855562000f19565b82601f1062000ee857805160ff191683800117855562000f19565b8280016001018555821562000f19579182015b8281111562000f1857825182559160200191906001019062000efb565b5b50905062000f28919062000f54565b5090565b5b8082111562000f50576000818162000f46919062000f73565b5060010162000f2d565b5090565b5b8082111562000f6f57600081600090555060010162000f55565b5090565b50805462000f819062000fb9565b6000825580601f1062000f95575062000fb6565b601f01602090049060005260206000209081019062000fb5919062000f54565b5b50565b6000600282049050600182168062000fd257607f821691505b6020821081141562000fe95762000fe862000fef565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6148f3806200102e6000396000f3fe60806040523480156200001157600080fd5b50600436106200016c5760003560e01c8063715018a611620000d5578063b88d4fde1162000087578063b88d4fde14620003e1578063c87b56dd1462000401578063de0e9a3e1462000437578063e985e9c51462000457578063ea598cb0146200048d578063f2fde38b14620004ad576200016c565b8063715018a6146200032f5780638da5cb5b146200033b57806395d89b41146200035d578063a22cb465146200037f578063a77041dd146200039f578063abd5aa7d14620003ab576200016c565b806318160ddd116200012f57806318160ddd146200024157806323b872dd146200026357806342842e0e14620002835780636352211e14620002a35780636ac053ad14620002d957806370a0823114620002f9576200016c565b806301ffc9a7146200017157806306f3b05e14620001a757806306fdde0314620001c9578063081812fc14620001eb578063095ea7b31462000221575b600080fd5b6200018f6004803603810190620001899190620028dd565b620004cd565b6040516200019e919062002ff3565b60405180910390f35b620001b1620005b3565b604051620001c0919062003010565b60405180910390f35b620001d3620005d9565b604051620001e291906200302d565b60405180910390f35b62000209600480360381019062000203919062002935565b62000673565b60405162000218919062002f82565b60405180910390f35b6200023f60048036038101906200023991906200289c565b620006fd565b005b6200024b62000826565b6040516200025a9190620032b5565b60405180910390f35b6200028160048036038101906200027b919062002780565b62000830565b005b620002a160048036038101906200029b919062002780565b62000899565b005b620002c16004803603810190620002bb919062002935565b620008bb565b604051620002d0919062002f82565b60405180910390f35b620002f76004803603810190620002f1919062002935565b62000970565b005b62000317600480360381019062000311919062002713565b62000af2565b604051620003269190620032b5565b60405180910390f35b6200033962000bad565b005b6200034562000c3e565b60405162000354919062002f82565b60405180910390f35b6200036762000c68565b6040516200037691906200302d565b60405180910390f35b6200039d60048036038101906200039791906200285b565b62000d02565b005b620003a962000e8e565b005b620003c96004803603810190620003c3919062002713565b62001095565b604051620003d8919062002f82565b60405180910390f35b620003ff6004803603810190620003f99190620027d6565b620010c8565b005b6200041f600480360381019062000419919062002935565b62001133565b6040516200042e91906200302d565b60405180910390f35b6200045560048036038101906200044f919062002935565b62001255565b005b6200047560048036038101906200046f91906200273f565b62001367565b60405162000484919062002ff3565b60405180910390f35b620004ab6004803603810190620004a5919062002935565b620013fb565b005b620004cb6004803603810190620004c5919062002713565b620015bf565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806200059957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80620005ac5750620005ab82620016c3565b5b9050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060008054620005ea906200361f565b80601f016020809104026020016040519081016040528092919081815260200182805462000618906200361f565b8015620006695780601f106200063d5761010080835404028352916020019162000669565b820191906000526020600020905b8154815290600101906020018083116200064b57829003601f168201915b5050505050905090565b600062000680826200172d565b620006c2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006b990620031c7565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006200070a82620008bb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156200077e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000775906200324f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166200079f62001799565b73ffffffffffffffffffffffffffffffffffffffff161480620007d35750620007d281620007cc62001799565b62001367565b5b62000815576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200080c906200311d565b60405180910390fd5b620008218383620017a1565b505050565b6000600954905090565b620008456200083e62001799565b826200185c565b62000887576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200087e9062003271565b60405180910390fd5b6200089483838362001947565b505050565b620008b683838360405180602001604052806000815250620010c8565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000967576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200095e9062003161565b60405180910390fd5b80915050919050565b6000600a60006200098062001799565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000a50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a479062003293565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663b460af9483600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1662000a9a62001799565b6040518463ffffffff1660e01b815260040162000aba939291906200332c565b600060405180830381600087803b15801562000ad557600080fd5b505af115801562000aea573d6000803e3d6000fd5b505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000b66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b5d906200313f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b62000bb762001799565b73ffffffffffffffffffffffffffffffffffffffff1662000bd762000c3e565b73ffffffffffffffffffffffffffffffffffffffff161462000c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c2790620031e9565b60405180910390fd5b62000c3c600062001bb3565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805462000c79906200361f565b80601f016020809104026020016040519081016040528092919081815260200182805462000ca7906200361f565b801562000cf85780601f1062000ccc5761010080835404028352916020019162000cf8565b820191906000526020600020905b81548152906001019060200180831162000cda57829003601f168201915b5050505050905090565b62000d0c62001799565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000d7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000d7490620030d9565b60405180910390fd5b806005600062000d8c62001799565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1662000e3b62001799565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405162000e82919062002ff3565b60405180910390a35050565b600060405162000e9e9062002620565b604051809103906000f08015801562000ebb573d6000803e3d6000fd5b509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000f31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000f28906200322d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a600062000f5762001799565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146200100b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620010029062003183565b60405180910390fd5b80600a60006200101a62001799565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b620010dd620010d662001799565b836200185c565b6200111f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620011169062003271565b60405180910390fd5b6200112d8484848462001c79565b50505050565b606060638211801562001147575061271082105b6200115157600080fd5b60006200115d62001cdc565b62001176606485620011709190620036d9565b62001d19565b6040516020016200118992919062002e54565b60405160208183030381529060405290506200122c620011a98462001df8565b604051602001620011bb919062002f03565b604051602081830303815290604052620011d58562001df8565b604051602001620011e7919062002f29565b604051602081830303815290604052620012018662001df8565b8460405160200162001217949392919062002e7c565b60405160208183030381529060405262001fba565b6040516020016200123e919062002f5c565b604051602081830303815290604052915050919050565b6200126081620008bb565b73ffffffffffffffffffffffffffffffffffffffff166200128062001799565b73ffffffffffffffffffffffffffffffffffffffff1614620012a157600080fd5b620012ac816200216c565b600160096000828254620012c1919062003501565b92505081905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631b3e2002826200131162001799565b6040518363ffffffff1660e01b815260040162001330929190620032d2565b600060405180830381600087803b1580156200134b57600080fd5b505af115801562001360573d6000803e3d6000fd5b5050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600a60006200140b62001799565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620014db576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620014d29062003293565b60405180910390fd5b606382118015620014ed575061271082105b620014f757600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1663ddd5e1b283600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b815260040162001556929190620032ff565b600060405180830381600087803b1580156200157157600080fd5b505af115801562001586573d6000803e3d6000fd5b505050506200159f6200159862001799565b8362002285565b600160096000828254620015b491906200340b565b925050819055505050565b620015c962001799565b73ffffffffffffffffffffffffffffffffffffffff16620015e962000c3e565b73ffffffffffffffffffffffffffffffffffffffff161462001642576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200163990620031e9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620016b5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620016ac9062003073565b60405180910390fd5b620016c08162001bb3565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166200181683620008bb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600062001869826200172d565b620018ab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620018a290620030fb565b60405180910390fd5b6000620018b883620008bb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806200192a57508373ffffffffffffffffffffffffffffffffffffffff16620019128462000673565b73ffffffffffffffffffffffffffffffffffffffff16145b806200193e57506200193d818562001367565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166200196982620008bb565b73ffffffffffffffffffffffffffffffffffffffff1614620019c2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620019b9906200320b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562001a35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001a2c90620030b7565b60405180910390fd5b62001a428383836200245f565b62001a4f600082620017a1565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462001aa1919062003501565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462001afa91906200340b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62001c8684848462001947565b62001c948484848462002464565b62001cd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001ccd9062003051565b60405180910390fd5b50505050565b60606040518060400160405280600781526020017f697066733a2f2f00000000000000000000000000000000000000000000000000815250905090565b6060600b828154811062001d56577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001805462001d6d906200361f565b80601f016020809104026020016040519081016040528092919081815260200182805462001d9b906200361f565b801562001dec5780601f1062001dc05761010080835404028352916020019162001dec565b820191906000526020600020905b81548152906001019060200180831162001dce57829003601f168201915b50505050509050919050565b6060600082141562001e42576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905062001fb5565b600082905060005b6000821462001e7a57808062001e60906200368b565b915050600a8262001e72919062003468565b915062001e4a565b60008167ffffffffffffffff81111562001ebd577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801562001ef05781602001600182028036833780820191505090505b5090505b6000851462001fae5760018262001f0c919062003501565b9150600a8562001f1d9190620036d9565b603062001f2b91906200340b565b60f81b81838151811062001f68577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8562001fa6919062003468565b945062001ef4565b8093505050505b919050565b606060008251141562001fdf5760405180602001604052806000815250905062002167565b60006040518060600160405280604081526020016200487e60409139905060006003600285516200201191906200340b565b6200201d919062003468565b60046200202b9190620034a0565b905060006020826200203e91906200340b565b67ffffffffffffffff8111156200207e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015620020b15781602001600182028036833780820191505090505b509050818152600183018586518101602084015b8183101562002122576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825360018201915050620020c5565b6003895106600181146200213f576002811462002150576200215b565b613d3d60f01b60028303526200215b565b603d60f81b60018303525b50505050508093505050505b919050565b60006200217982620008bb565b905062002189816000846200245f565b62002196600083620017a1565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620021e8919062003501565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620022f8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620022ef90620031a5565b60405180910390fd5b62002303816200172d565b1562002346576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200233d9062003095565b60405180910390fd5b62002354600083836200245f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620023a691906200340b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6000620024878473ffffffffffffffffffffffffffffffffffffffff166200260d565b1562002600578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620024b362001799565b8786866040518563ffffffff1660e01b8152600401620024d7949392919062002f9f565b602060405180830381600087803b158015620024f257600080fd5b505af19250505080156200252657506040513d601f19601f8201168201806040525081019062002523919062002909565b60015b620025af573d806000811462002559576040519150601f19603f3d011682016040523d82523d6000602084013e6200255e565b606091505b50600081511415620025a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200259e9062003051565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062002605565b600190505b949350505050565b600080823b905060008111915050919050565b610a1f8062003e5f83390190565b6000620026456200263f8462003392565b62003369565b9050828152602081018484840111156200265e57600080fd5b6200266b848285620035da565b509392505050565b600081359050620026848162003df6565b92915050565b6000813590506200269b8162003e10565b92915050565b600081359050620026b28162003e2a565b92915050565b600081519050620026c98162003e2a565b92915050565b600082601f830112620026e157600080fd5b8135620026f38482602086016200262e565b91505092915050565b6000813590506200270d8162003e44565b92915050565b6000602082840312156200272657600080fd5b6000620027368482850162002673565b91505092915050565b600080604083850312156200275357600080fd5b6000620027638582860162002673565b9250506020620027768582860162002673565b9150509250929050565b6000806000606084860312156200279657600080fd5b6000620027a68682870162002673565b9350506020620027b98682870162002673565b9250506040620027cc86828701620026fc565b9150509250925092565b60008060008060808587031215620027ed57600080fd5b6000620027fd8782880162002673565b9450506020620028108782880162002673565b93505060406200282387828801620026fc565b925050606085013567ffffffffffffffff8111156200284157600080fd5b6200284f87828801620026cf565b91505092959194509250565b600080604083850312156200286f57600080fd5b60006200287f8582860162002673565b925050602062002892858286016200268a565b9150509250929050565b60008060408385031215620028b057600080fd5b6000620028c08582860162002673565b9250506020620028d385828601620026fc565b9150509250929050565b600060208284031215620028f057600080fd5b60006200290084828501620026a1565b91505092915050565b6000602082840312156200291c57600080fd5b60006200292c84828501620026b8565b91505092915050565b6000602082840312156200294857600080fd5b60006200295884828501620026fc565b91505092915050565b6200296c816200353c565b82525050565b6200297d8162003550565b82525050565b60006200299082620033c8565b6200299c8185620033de565b9350620029ae818560208601620035e9565b620029b981620037cd565b840191505092915050565b620029cf81620035b2565b82525050565b6000620029e282620033d3565b620029ee8185620033ef565b935062002a00818560208601620035e9565b62002a0b81620037cd565b840191505092915050565b600062002a2382620033d3565b62002a2f818562003400565b935062002a41818560208601620035e9565b80840191505092915050565b600062002a5c60098362003400565b915062002a6982620037de565b600982019050919050565b600062002a83603283620033ef565b915062002a908262003807565b604082019050919050565b600062002aaa602683620033ef565b915062002ab78262003856565b604082019050919050565b600062002ad1601c83620033ef565b915062002ade82620038a5565b602082019050919050565b600062002af8602483620033ef565b915062002b0582620038ce565b604082019050919050565b600062002b1f601983620033ef565b915062002b2c826200391d565b602082019050919050565b600062002b4660068362003400565b915062002b538262003946565b600682019050919050565b600062002b6d602c83620033ef565b915062002b7a826200396f565b604082019050919050565b600062002b94603883620033ef565b915062002ba182620039be565b604082019050919050565b600062002bbb602a83620033ef565b915062002bc88262003a0d565b604082019050919050565b600062002be2602983620033ef565b915062002bef8262003a5c565b604082019050919050565b600062002c0960028362003400565b915062002c168262003aab565b600282019050919050565b600062002c30601683620033ef565b915062002c3d8262003ad4565b602082019050919050565b600062002c57602083620033ef565b915062002c648262003afd565b602082019050919050565b600062002c7e602c83620033ef565b915062002c8b8262003b26565b604082019050919050565b600062002ca560128362003400565b915062002cb28262003b75565b601282019050919050565b600062002ccc602083620033ef565b915062002cd98262003b9e565b602082019050919050565b600062002cf3602983620033ef565b915062002d008262003bc7565b604082019050919050565b600062002d1a601883620033ef565b915062002d278262003c16565b602082019050919050565b600062002d41602183620033ef565b915062002d4e8262003c3f565b604082019050919050565b600062002d68601d8362003400565b915062002d758262003c8e565b601d82019050919050565b600062002d8f603183620033ef565b915062002d9c8262003cb7565b604082019050919050565b600062002db6601583620033ef565b915062002dc38262003d06565b602082019050919050565b600062002ddd600f8362003400565b915062002dea8262003d2f565b600f82019050919050565b600062002e0460378362003400565b915062002e118262003d58565b603782019050919050565b600062002e2b60368362003400565b915062002e388262003da7565b603682019050919050565b62002e4e81620035a8565b82525050565b600062002e62828562002a16565b915062002e70828462002a16565b91508190509392505050565b600062002e898262002a4d565b915062002e97828762002a16565b915062002ea48262002c96565b915062002eb2828662002a16565b915062002ebf8262002e1c565b915062002ecd828562002a16565b915062002eda8262002dce565b915062002ee8828462002a16565b915062002ef58262002bfa565b915081905095945050505050565b600062002f108262002b37565b915062002f1e828462002a16565b915081905092915050565b600062002f368262002b37565b915062002f44828462002a16565b915062002f518262002df5565b915081905092915050565b600062002f698262002d59565b915062002f77828462002a16565b915081905092915050565b600060208201905062002f99600083018462002961565b92915050565b600060808201905062002fb6600083018762002961565b62002fc5602083018662002961565b62002fd4604083018562002e43565b818103606083015262002fe8818462002983565b905095945050505050565b60006020820190506200300a600083018462002972565b92915050565b6000602082019050620030276000830184620029c4565b92915050565b60006020820190508181036000830152620030498184620029d5565b905092915050565b600060208201905081810360008301526200306c8162002a74565b9050919050565b600060208201905081810360008301526200308e8162002a9b565b9050919050565b60006020820190508181036000830152620030b08162002ac2565b9050919050565b60006020820190508181036000830152620030d28162002ae9565b9050919050565b60006020820190508181036000830152620030f48162002b10565b9050919050565b60006020820190508181036000830152620031168162002b5e565b9050919050565b60006020820190508181036000830152620031388162002b85565b9050919050565b600060208201905081810360008301526200315a8162002bac565b9050919050565b600060208201905081810360008301526200317c8162002bd3565b9050919050565b600060208201905081810360008301526200319e8162002c21565b9050919050565b60006020820190508181036000830152620031c08162002c48565b9050919050565b60006020820190508181036000830152620031e28162002c6f565b9050919050565b60006020820190508181036000830152620032048162002cbd565b9050919050565b60006020820190508181036000830152620032268162002ce4565b9050919050565b60006020820190508181036000830152620032488162002d0b565b9050919050565b600060208201905081810360008301526200326a8162002d32565b9050919050565b600060208201905081810360008301526200328c8162002d80565b9050919050565b60006020820190508181036000830152620032ae8162002da7565b9050919050565b6000602082019050620032cc600083018462002e43565b92915050565b6000604082019050620032e9600083018562002e43565b620032f8602083018462002961565b9392505050565b600060408201905062003316600083018562002e43565b620033256020830184620029c4565b9392505050565b600060608201905062003343600083018662002e43565b620033526020830185620029c4565b62003361604083018462002961565b949350505050565b60006200337562003388565b905062003383828262003655565b919050565b6000604051905090565b600067ffffffffffffffff821115620033b057620033af6200379e565b5b620033bb82620037cd565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006200341882620035a8565b91506200342583620035a8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200345d576200345c62003711565b5b828201905092915050565b60006200347582620035a8565b91506200348283620035a8565b92508262003495576200349462003740565b5b828204905092915050565b6000620034ad82620035a8565b9150620034ba83620035a8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620034f657620034f562003711565b5b828202905092915050565b60006200350e82620035a8565b91506200351b83620035a8565b92508282101562003531576200353062003711565b5b828203905092915050565b6000620035498262003588565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000620035bf82620035c6565b9050919050565b6000620035d38262003588565b9050919050565b82818337600083830152505050565b60005b8381101562003609578082015181840152602081019050620035ec565b8381111562003619576000848401525b50505050565b600060028204905060018216806200363857607f821691505b602082108114156200364f576200364e6200376f565b5b50919050565b6200366082620037cd565b810181811067ffffffffffffffff821117156200368257620036816200379e565b5b80604052505050565b60006200369882620035a8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415620036ce57620036cd62003711565b5b600182019050919050565b6000620036e682620035a8565b9150620036f383620035a8565b92508262003706576200370562003740565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f7b226e616d65223a220000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f526f636b20230000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f57617264656e20616c7265616479206372656174656400000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f222c20226465736372697074696f6e223a220000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f57617264656e206164647265737320696e636f72726563740000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f57617264656e206e6f7420726567697374657265640000000000000000000000600082015250565b7f207d5d2c2022696d616765223a20220000000000000000000000000000000000600082015250565b7f2066726f6d206120636f6e7472616374206465706c6f796564206f6e2074686560008201527f2032357468206f6620446563656d6265722c2032303137000000000000000000602082015250565b7f222c202261747472696275746573223a205b7b202274726169745f747970653a60008201527f223a20224e756d626572222c202276616c7565223a2000000000000000000000602082015250565b62003e01816200353c565b811462003e0d57600080fd5b50565b62003e1b8162003550565b811462003e2757600080fd5b50565b62003e35816200355c565b811462003e4157600080fd5b50565b62003e4f81620035a8565b811462003e5b57600080fd5b5056fe608060405234801561001057600080fd5b5061002d61002261003260201b60201c565b61003a60201b60201c565b6100fe565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6109128061010d6000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b14610066578063b460af9414610084578063ddd5e1b2146100a0578063f2fde38b146100bc575b600080fd5b6100646100d8565b005b61006e610160565b60405161007b9190610713565b60405180910390f35b61009e60048036038101906100999190610660565b610189565b005b6100ba60048036038101906100b59190610624565b610277565b005b6100d660048036038101906100d191906105fb565b6103f8565b005b6100e06104f0565b73ffffffffffffffffffffffffffffffffffffffff166100fe610160565b73ffffffffffffffffffffffffffffffffffffffff1614610154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014b9061074e565b60405180910390fd5b61015e60006104f8565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6101916104f0565b73ffffffffffffffffffffffffffffffffffffffff166101af610160565b73ffffffffffffffffffffffffffffffffffffffff1614610205576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101fc9061074e565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16631b3e200284836040518363ffffffff1660e01b815260040161024092919061076e565b600060405180830381600087803b15801561025a57600080fd5b505af115801561026e573d6000803e3d6000fd5b50505050505050565b61027f6104f0565b73ffffffffffffffffffffffffffffffffffffffff1661029d610160565b73ffffffffffffffffffffffffffffffffffffffff16146102f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102ea9061074e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663c6caa959837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161034e929190610797565b600060405180830381600087803b15801561036857600080fd5b505af115801561037c573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16631b3e2002836103a5610160565b6040518363ffffffff1660e01b81526004016103c292919061076e565b600060405180830381600087803b1580156103dc57600080fd5b505af11580156103f0573d6000803e3d6000fd5b505050505050565b6104006104f0565b73ffffffffffffffffffffffffffffffffffffffff1661041e610160565b73ffffffffffffffffffffffffffffffffffffffff1614610474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046b9061074e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156104e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104db9061072e565b60405180910390fd5b6104ed816104f8565b50565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000813590506105cb81610897565b92915050565b6000813590506105e0816108ae565b92915050565b6000813590506105f5816108c5565b92915050565b60006020828403121561060d57600080fd5b600061061b848285016105bc565b91505092915050565b6000806040838503121561063757600080fd5b6000610645858286016105e6565b9250506020610656858286016105d1565b9150509250929050565b60008060006060848603121561067557600080fd5b6000610683868287016105e6565b9350506020610694868287016105d1565b92505060406106a5868287016105bc565b9150509250925092565b6106b8816107d1565b82525050565b60006106cb6026836107c0565b91506106d68261081f565b604082019050919050565b60006106ee6020836107c0565b91506106f98261086e565b602082019050919050565b61070d81610815565b82525050565b600060208201905061072860008301846106af565b92915050565b60006020820190508181036000830152610747816106be565b9050919050565b60006020820190508181036000830152610767816106e1565b9050919050565b60006040820190506107836000830185610704565b61079060208301846106af565b9392505050565b60006040820190506107ac6000830185610704565b6107b96020830184610704565b9392505050565b600082825260208201905092915050565b60006107dc826107f5565b9050919050565b60006107ee826107d1565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6108a0816107d1565b81146108ab57600080fd5b50565b6108b7816107e3565b81146108c257600080fd5b50565b6108ce81610815565b81146108d957600080fd5b5056fea26469706673582212201e021954bc09bf5586daa1795e0cf4aa9edaf7d17d4c3313fdf954c4ee3c411d64736f6c634300080400334142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220647c6bf809851e249769feb85047b20e486a4057bc79da2a750050685d7970aa64736f6c6343000804003362616679626569646c347666676f7a657878706e643266366a6c72767a756b6735377736727837687370346d7179686f6e6665326a71736f666b342f31322e706e6762616679626569687a64617a327a6479627a72757a61796c676f64726335776e63346f7664677865636435767236636e6d786977613662737a6e752f32342e706e6762616679626569663335616c36686674327a7869636c796874346f36377136696b796b793768336d68666f356875746279667a796e6f6c6e65346d2f33382e706e67626166796265696763666e6f336372646a6b6f726a347a726d62376c6a717a6a6d65617a796376796b377878696775666d64746162726e7a6c71692f33342e706e6762616679626569627136766868336f77367474696263627634616570646c346d3472707466357a6a737373326668746a65646563736b7a6b6870792f33392e706e6762616679626569636f6237786c656a357164776f746d656a69697a7434646875766f7133666364736f33667366636661626f6b7837686a766132752f37302e706e67626166796265696466696f3365706b6636667071797a3270686b66766c6a616b63657a77696c6e666e6b75756979776d3574656d6663616f7469752f35372e706e676261667962656968697976736334697366767a69776f356c673262716e736f6579783534356177767176796b3361667969726576696572636732692f37352e706e6762616679626569656e68706e336d6d687a367468643466736f6d706162696d6d356e72636b6b646d656535646d627474776f656e736376713335612f31352e706e676261667962656961377836367562356e696e7873736464717168636a67376c686b70616a7563676a656e363268616c6a6274706f326a636c3335792f38312e706e67626166796265696332617270326675756f63647164637837747a6a676c366d346a666f7a7479376d6a74346d767966666a71683279336f7a3333792f39372e706e6762616679626569626873746a6f786a7062336966716732706b6a626a743262656776376f3679797176326e7671366d79746d7079783633707532712f34352e706e676261667962656967777376616376737537707563743570327779656e69657472657569367965616c7373686d63347733636e6c78327674776761692f322e706e676261667962656961673271726f647832636373776233693273367936626b377274766837746973726b3478696a796c3636736236767577656c72752f36312e706e6762616679626569686a3767726667766f6e7a6a63766432656e63336b6f76776d77637768687973646462327478623578327570646861347237716d2f36392e706e676261667962656967797874773473666c706a7a68716f6a726365617a736b78377237646932707a6d366c6d6d35353734706b6a766c7535777072712f34342e706e6762616679626569626368323237346f6b696d7232346a32376e377870786c3436697136336635726f7334337270346d7a766968757a366864747a692f39332e706e67626166796265696533626a626e6b727a7a3671786d367072776b7a6271736f6e366d696f6f327375676b62337835797269686164333473336a79792f35342e706e6762616679626569667632356c336a377675696f34667069626c646e7a36706e6337756c63706a706b6d3536756979333469783478686179687265612f34382e706e6762616679626569616265663671776a757237323536376f6e746e32656e62367136613679326e6d7278653232647074766b6a6d656b626f717862712f32322e706e6762616679626569616b7935757276717866627167773763646e7a3379326a66676d6d6e3565746b6469797374737470706e636a74346f626d73656d2f32332e706e676261667962656968796734727232326a6f6964736a3369616268616b72747a636366773779753465346a697669356b32673664787a783337636a692f31312e706e67626166796265696767743471637474347a63346f6b32787261626262646966746f64326d6b326b6561713366656474766c666f6d6a7177767372692f33302e706e6762616679626569686a74626e726b62736b7334786a7179716e6967696e6d687869346d697777713763666465726f68696365633374736a6e6f6a712f382e706e6762616679626569687037646c75776276646535786863736465346e377466686a6b756d706b37666b6f77736c726867776a736369796b79787632652f33312e706e6762616679626569636d6273666d6d7332756f75326a32626e6b6b347a636c776f616d6534673367667274663375716c64633777796e766a697864792f31382e706e6762616679626569613437786c6835673473336235776632756d356869786a7277766b326e6a6e707a646d697a7235617978796c766d7268323536792f39312e706e676261667962656965787536676c74636b6661627768766a6d72727136646f6b786e6664787964677a757a63347077656870346173796a69376473692f37342e706e676261667962656967707a797467776d70647069673373346c376664673277373632376334747a3767787161373432786f3675616b6d797a653771612f37312e706e67626166796265696179776f617474666e6e797a6f7164726f76667679756c6e6a343479706b777178736a7a366b6e73727372356f6d6f6f6b6c6a612f36352e706e6762616679626569666c3277726e33657778346f68356977336b6832756374626d32776477346337356732656b78786e7669663375337832327672752f38382e706e6762616679626569686f75686d6f6e716472347363667367617a79656e756c736c346b72766966326c3476327872687077693435347968377a7366612f39302e706e676261667962656962377376357a37696d6b6870616f6f7972637a6870626c627570716c74336771626377713271787071696b62647275686a3768342f35352e706e6762616679626569626d786d33327073707832626d706276663332646836377167357a346b6d71717075696572646f35736269776466687a373675792f38392e706e676261667962656964776968337a73706e367236686e767269687768676771376d6966713670356b656974636d7375756377753262653379697967752f38352e706e6762616679626569666263747971636177376f6d637a6a756874757372716a36696e70683764757872756d6d6b6a7775353461656c6a656e6a7965612f35322e706e676261667962656965776a7732626d76636c76657778706973683462336833676f6b716276703272786b756b6c6d726f7973373373326361736e6f342f37362e706e67626166796265696673326562753661626f3733356a75376a346d64367433686b6164787a3634356b3537756364697a7671676369793470733632692f33372e706e676261667962656962776837676d77676a776a77337369797379746b687969696b337278357a6d6c356d74717a723464616836356d6f6a6c696432712f38362e706e676261667962656965666a69337a3676336171656d6a6634637965716b6232723463627234687a7161626b6777633567626d32697376326b6a7178712f39342e706e676261667962656961686f32727967757870346b696b7278366c3471716e6d696f696c766c78747a756b647a617a6c326532736a616e6a67336a35692f34332e706e6762616679626569667a366f6d7a756c6b7375783236763665646d6e627a6c6769626279707a7562726b7978366c646c79676f636e6e69656d6368752f35382e706e67626166796265696132626a667770676f6e6b6a377668687767373775636c706b773679716f6c6c637661786a78777772697174373669646f7734612f36302e706e676261667962656968737375776a693676646936737861716a6966736f346f3763647379786165786670736278737771636c6a6769326b3466636e612f38342e706e6762616679626569636c6c37706462687866736e656a716a6773676a6673706e787076356736726d6b71726b7479376d6e6662677a746c686e6e78652f342e706e6762616679626569626e6677676e7635796961706e783666686f727a687473627278797a6f68656578776d6c6d72326132786b787932346b656833712f36342e706e6762616679626569687935656270787836366e72697436616233376469346f34666e756478756f3675796e7966797736757371656f6d7479353379692f32372e706e676261667962656964656a326e756e69766d78777372707179786d75726e666c70726f716f627a7633706d37737833757564706236346361776378752f39382e706e6762616679626569627275777a367a347632716f6462756f767067637469753671713478706a676479767270356671696833763333686261327467692f37382e706e6762616679626569626b783573776d656d76716b63366e33756d7a7561706c637373727136627032757968336e3276686479777a76366c737a7633712f302e706e6762616679626569646d6a6c7267716e77356a6279617567646e716f7a6e6664356e68626d696465757a6973633370696865766f66616e766366376d2f34322e706e676261667962656968326e7a6c347768627933626f7179686d78647575726370786334327377736e7264636c766c6e6b796d6d33653573617a6233712f31362e706e676261667962656966796c74737067746d33327a6e36763577336a6173716b76356e6b797567766b3673376274766a7965686d6c6c7962657273376d2f39322e706e67626166796265696271686a347737767065796c70626d736f65613274666378686e63363476776972647a7265646532716f6934616a326835356f6d2f33352e706e6762616679626569676a3537737167366c776e7432686666696776767677687074366972326867756a6d676e717a6d366c3233726d737164616e65692f36372e706e6762616679626569647170636662367667337865767a336e346a7966636c3573326e6674667467647168726e75636c637772736336776762326736752f39392e706e67626166796265696435356b3567637072666c64736d36757034676e327a69743279786b69756c756232646a3463683275336376797976693573706d2f31392e706e67626166796265696461767062686c356b6d77327477356d3737776461647679696934636e336b6a3271613737346b7a7178743568686c666b3664652f34392e706e6762616679626569677a716d3468336d766d756c7669716f3273616f3333646e636434786d6e726d656d74376a6b346c7568736c3334706d707574752f39352e706e6762616679626569653770337676326d69666532336e793332737279796266766b746876746b686872336f64617a36657a3379786b7a746368796c712f32382e706e6762616679626569617a6f356d6a6e71356f74366c336d736762727773716f3371633433637a647a796337676f653476786a6c6b34636977616e33342f352e706e6762616679626569636d6472626765637837346f3461367678716134367864697733736b68746b67693435633577753270736a36706f7364716369692f33332e706e6762616679626569687a6532666b766d6c6935646d3733796d69717a7467646e6932376a337a7466666d6e326a34737972357778346e61656a7169752f37322e706e676261667962656965677173703566686a66786a6c786e34707a376d6a797172667566756a6c37713562377463346d366335347177697569353664712f31332e706e676261667962656961736b657976646b6b7032686e7069617777337a686965776878697135377a6861367773686b74796a646c36697676696a6f69612f39362e706e6762616679626569666a6d627a77343632336e6b62726a6935766d6168677967746b65696b6c3269643233666464796d34666f767370656172676c652f392e706e67626166796265696874726379703564766d746c72756d796172696e686b706c726f796e64326d6871707262706b6d6c36706a72686a68356a7162792f35332e706e67626166796265696570757962336d75776334636b7472656876793765767168326237343267736872756b767670617333336b78767375626d6968792f33322e706e6762616679626569666979686e646f777a73356f68736275366f6f336a703265666479673572376b6f697961676265636e63336c336a7874677434692f37372e706e6762616679626569656b6a74687876617a617372763269326661763535786e716372777732336b367a35786137766271367967706a35643479376e752f38302e706e67626166796265696167667564776677626335326b62786a76666e676b646d793364676a3364643372707476746a786d77363374676e667267746a612f38372e706e67626166796265696767356237656b776268736367706663626b766c797662666368776c677a6661703766696a737132756b707a7a32656d37736a612f35392e706e67626166796265696267746877787962697961693369337469736d6f756a6b6f676834787469706f626d36657a326a366b6a706467746278357269652f38322e706e676261667962656964346b356f77776b70326977707779737832666b726d3232637733756f63706962696179656662797133646a6e64636b65686b792f32352e706e676261667962656965666c61346471767469747a63356763787a6b666a73797165676c726d67697166376f74766233667966756c79636736736c62692f31372e706e676261667962656964697379686c6c637562677437666f6e6a373577626135706435666176356f7579703270666f626b6e6a363564647437376774752f32362e706e676261667962656965797673796361796962707436626132736865796e796276777370647034686d7064356b6f7277616e3632643778683469666f692f32302e706e676261667962656964677979793775796a64737a686a6d6a647879646a7676326d6c347975626b6b6f737a6877376a716b35636e7134713570356b752f32312e706e6762616679626569627274637571667572656475747976657a7078346a69786c33347a707335747835346a3478323362353662687265346c34626d712f372e706e67626166796265696232686d673635656533767537777a3237736234326c6b6e6b76336f6c7532337168656d71746963796d716e667a6d6b6e3534652f33362e706e6762616679626569646c726a7979726879786962643732636b71707475656a7178326b64646263716370777964747a3376616a756e32796f346a33612f36332e706e67626166796265696436673275653737696f78766972757768627a37376e7a376679796f6d663763323463327961376937323575746f37706c7078652f312e706e67626166796265696536326e6f35623470776f62686373327269746f7464663262616969773635736a726178796561627872346577747175353533342f362e706e6762616679626569626e66796c76623577743532736e6b3479736a706a7661333735717273667565666d70617a6a697073353776716837716f7475652f31342e706e6762616679626569666d6c6d366d726e79756c6c74716e74656f643767746535676a617a70716367667777706b616b727a33776679336a646f6773752f35362e706e6762616679626569617463756e766a746d646867697a356761716e6336336a766f65346368357466336763326e6336336a6764626a6e73666e7263652f37392e706e6762616679626569626a723469737863796d3362723464773371796867326c716678733773776e656a366c656f766c64376f366a34636169763265712f35312e706e67626166796265696861737a6a6f6774346b736a7a637835616276717366637863346f7733356e623333696471727a656c6277676574377378747a692f332e706e67626166796265696275336d76686f6678786d356c73767a7568696465706663786c696d64627a7a336b6869737033697271653636773533686e72692f36322e706e6762616679626569666735626c626f673368376b6e61626e70727773376c72743365336f776a63377a716867356534343268646e6d7a68706d7261712f38332e706e67626166796265696669797a666e356f67366772373476366f65347974776f7a74737a6e36736a6a7a71707265686a646577347867653335667974652f36362e706e676261667962656968656a3563736d7867757436336775787770636d6a6c70637179646573776163336d6c33646178737879616f6f6c35756271726d2f34372e706e676261667962656967737635357837776c33796c767867736f636a6c627561636c366d736432357569766c676e766e616e35696d6f737873373275652f34312e706e6762616679626569687464656d657267786c7a726f336771626e77366c6e727773763565676b356334627968676735333634356862797a746e6966752f34302e706e67626166796265696264326132327575356e776f67626e626364326a36336a686f787a656278376a6977326d7a346f6635656970696d7033766c666d2f34362e706e6762616679626569613566616c797a6c777974357a6868726b6a35786b69646a706c7a34797561713570707a73336d6d6d6c347462677667626367712f37332e706e676261667962656964693766796e75666d637066363269636e6c3335336370746879766c6363767a6d69616762333437776a706b6165737a6d3275792f32392e706e6762616679626569656c32343678786b7767747a336c69376969747835756a6a73686a646970377375327a7a6f6e676b36337a67787a687a78756f652f36382e706e676261667962656968336d79696d37636f743671676b7566706634716178346a77666f7362336179326a376e676e7032336e6c6e6462616b376762752f35302e706e6762616679626569626c6a69746833733270376268657774666a616270737376737863686872377065756f6b336f766b7365646169323473746563612f31302e706e67

Deployed Bytecode

0x60806040523480156200001157600080fd5b50600436106200016c5760003560e01c8063715018a611620000d5578063b88d4fde1162000087578063b88d4fde14620003e1578063c87b56dd1462000401578063de0e9a3e1462000437578063e985e9c51462000457578063ea598cb0146200048d578063f2fde38b14620004ad576200016c565b8063715018a6146200032f5780638da5cb5b146200033b57806395d89b41146200035d578063a22cb465146200037f578063a77041dd146200039f578063abd5aa7d14620003ab576200016c565b806318160ddd116200012f57806318160ddd146200024157806323b872dd146200026357806342842e0e14620002835780636352211e14620002a35780636ac053ad14620002d957806370a0823114620002f9576200016c565b806301ffc9a7146200017157806306f3b05e14620001a757806306fdde0314620001c9578063081812fc14620001eb578063095ea7b31462000221575b600080fd5b6200018f6004803603810190620001899190620028dd565b620004cd565b6040516200019e919062002ff3565b60405180910390f35b620001b1620005b3565b604051620001c0919062003010565b60405180910390f35b620001d3620005d9565b604051620001e291906200302d565b60405180910390f35b62000209600480360381019062000203919062002935565b62000673565b60405162000218919062002f82565b60405180910390f35b6200023f60048036038101906200023991906200289c565b620006fd565b005b6200024b62000826565b6040516200025a9190620032b5565b60405180910390f35b6200028160048036038101906200027b919062002780565b62000830565b005b620002a160048036038101906200029b919062002780565b62000899565b005b620002c16004803603810190620002bb919062002935565b620008bb565b604051620002d0919062002f82565b60405180910390f35b620002f76004803603810190620002f1919062002935565b62000970565b005b62000317600480360381019062000311919062002713565b62000af2565b604051620003269190620032b5565b60405180910390f35b6200033962000bad565b005b6200034562000c3e565b60405162000354919062002f82565b60405180910390f35b6200036762000c68565b6040516200037691906200302d565b60405180910390f35b6200039d60048036038101906200039791906200285b565b62000d02565b005b620003a962000e8e565b005b620003c96004803603810190620003c3919062002713565b62001095565b604051620003d8919062002f82565b60405180910390f35b620003ff6004803603810190620003f99190620027d6565b620010c8565b005b6200041f600480360381019062000419919062002935565b62001133565b6040516200042e91906200302d565b60405180910390f35b6200045560048036038101906200044f919062002935565b62001255565b005b6200047560048036038101906200046f91906200273f565b62001367565b60405162000484919062002ff3565b60405180910390f35b620004ab6004803603810190620004a5919062002935565b620013fb565b005b620004cb6004803603810190620004c5919062002713565b620015bf565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806200059957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80620005ac5750620005ab82620016c3565b5b9050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060008054620005ea906200361f565b80601f016020809104026020016040519081016040528092919081815260200182805462000618906200361f565b8015620006695780601f106200063d5761010080835404028352916020019162000669565b820191906000526020600020905b8154815290600101906020018083116200064b57829003601f168201915b5050505050905090565b600062000680826200172d565b620006c2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006b990620031c7565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006200070a82620008bb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156200077e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000775906200324f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166200079f62001799565b73ffffffffffffffffffffffffffffffffffffffff161480620007d35750620007d281620007cc62001799565b62001367565b5b62000815576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200080c906200311d565b60405180910390fd5b620008218383620017a1565b505050565b6000600954905090565b620008456200083e62001799565b826200185c565b62000887576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200087e9062003271565b60405180910390fd5b6200089483838362001947565b505050565b620008b683838360405180602001604052806000815250620010c8565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000967576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200095e9062003161565b60405180910390fd5b80915050919050565b6000600a60006200098062001799565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000a50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a479062003293565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663b460af9483600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1662000a9a62001799565b6040518463ffffffff1660e01b815260040162000aba939291906200332c565b600060405180830381600087803b15801562000ad557600080fd5b505af115801562000aea573d6000803e3d6000fd5b505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000b66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b5d906200313f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b62000bb762001799565b73ffffffffffffffffffffffffffffffffffffffff1662000bd762000c3e565b73ffffffffffffffffffffffffffffffffffffffff161462000c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c2790620031e9565b60405180910390fd5b62000c3c600062001bb3565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805462000c79906200361f565b80601f016020809104026020016040519081016040528092919081815260200182805462000ca7906200361f565b801562000cf85780601f1062000ccc5761010080835404028352916020019162000cf8565b820191906000526020600020905b81548152906001019060200180831162000cda57829003601f168201915b5050505050905090565b62000d0c62001799565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000d7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000d7490620030d9565b60405180910390fd5b806005600062000d8c62001799565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1662000e3b62001799565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405162000e82919062002ff3565b60405180910390a35050565b600060405162000e9e9062002620565b604051809103906000f08015801562000ebb573d6000803e3d6000fd5b509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000f31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000f28906200322d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a600062000f5762001799565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146200100b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620010029062003183565b60405180910390fd5b80600a60006200101a62001799565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b620010dd620010d662001799565b836200185c565b6200111f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620011169062003271565b60405180910390fd5b6200112d8484848462001c79565b50505050565b606060638211801562001147575061271082105b6200115157600080fd5b60006200115d62001cdc565b62001176606485620011709190620036d9565b62001d19565b6040516020016200118992919062002e54565b60405160208183030381529060405290506200122c620011a98462001df8565b604051602001620011bb919062002f03565b604051602081830303815290604052620011d58562001df8565b604051602001620011e7919062002f29565b604051602081830303815290604052620012018662001df8565b8460405160200162001217949392919062002e7c565b60405160208183030381529060405262001fba565b6040516020016200123e919062002f5c565b604051602081830303815290604052915050919050565b6200126081620008bb565b73ffffffffffffffffffffffffffffffffffffffff166200128062001799565b73ffffffffffffffffffffffffffffffffffffffff1614620012a157600080fd5b620012ac816200216c565b600160096000828254620012c1919062003501565b92505081905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631b3e2002826200131162001799565b6040518363ffffffff1660e01b815260040162001330929190620032d2565b600060405180830381600087803b1580156200134b57600080fd5b505af115801562001360573d6000803e3d6000fd5b5050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600a60006200140b62001799565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620014db576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620014d29062003293565b60405180910390fd5b606382118015620014ed575061271082105b620014f757600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1663ddd5e1b283600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b815260040162001556929190620032ff565b600060405180830381600087803b1580156200157157600080fd5b505af115801562001586573d6000803e3d6000fd5b505050506200159f6200159862001799565b8362002285565b600160096000828254620015b491906200340b565b925050819055505050565b620015c962001799565b73ffffffffffffffffffffffffffffffffffffffff16620015e962000c3e565b73ffffffffffffffffffffffffffffffffffffffff161462001642576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200163990620031e9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620016b5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620016ac9062003073565b60405180910390fd5b620016c08162001bb3565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166200181683620008bb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600062001869826200172d565b620018ab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620018a290620030fb565b60405180910390fd5b6000620018b883620008bb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806200192a57508373ffffffffffffffffffffffffffffffffffffffff16620019128462000673565b73ffffffffffffffffffffffffffffffffffffffff16145b806200193e57506200193d818562001367565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166200196982620008bb565b73ffffffffffffffffffffffffffffffffffffffff1614620019c2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620019b9906200320b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562001a35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001a2c90620030b7565b60405180910390fd5b62001a428383836200245f565b62001a4f600082620017a1565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462001aa1919062003501565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462001afa91906200340b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62001c8684848462001947565b62001c948484848462002464565b62001cd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001ccd9062003051565b60405180910390fd5b50505050565b60606040518060400160405280600781526020017f697066733a2f2f00000000000000000000000000000000000000000000000000815250905090565b6060600b828154811062001d56577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001805462001d6d906200361f565b80601f016020809104026020016040519081016040528092919081815260200182805462001d9b906200361f565b801562001dec5780601f1062001dc05761010080835404028352916020019162001dec565b820191906000526020600020905b81548152906001019060200180831162001dce57829003601f168201915b50505050509050919050565b6060600082141562001e42576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905062001fb5565b600082905060005b6000821462001e7a57808062001e60906200368b565b915050600a8262001e72919062003468565b915062001e4a565b60008167ffffffffffffffff81111562001ebd577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801562001ef05781602001600182028036833780820191505090505b5090505b6000851462001fae5760018262001f0c919062003501565b9150600a8562001f1d9190620036d9565b603062001f2b91906200340b565b60f81b81838151811062001f68577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8562001fa6919062003468565b945062001ef4565b8093505050505b919050565b606060008251141562001fdf5760405180602001604052806000815250905062002167565b60006040518060600160405280604081526020016200487e60409139905060006003600285516200201191906200340b565b6200201d919062003468565b60046200202b9190620034a0565b905060006020826200203e91906200340b565b67ffffffffffffffff8111156200207e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015620020b15781602001600182028036833780820191505090505b509050818152600183018586518101602084015b8183101562002122576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825360018201915050620020c5565b6003895106600181146200213f576002811462002150576200215b565b613d3d60f01b60028303526200215b565b603d60f81b60018303525b50505050508093505050505b919050565b60006200217982620008bb565b905062002189816000846200245f565b62002196600083620017a1565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620021e8919062003501565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620022f8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620022ef90620031a5565b60405180910390fd5b62002303816200172d565b1562002346576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200233d9062003095565b60405180910390fd5b62002354600083836200245f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620023a691906200340b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6000620024878473ffffffffffffffffffffffffffffffffffffffff166200260d565b1562002600578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620024b362001799565b8786866040518563ffffffff1660e01b8152600401620024d7949392919062002f9f565b602060405180830381600087803b158015620024f257600080fd5b505af19250505080156200252657506040513d601f19601f8201168201806040525081019062002523919062002909565b60015b620025af573d806000811462002559576040519150601f19603f3d011682016040523d82523d6000602084013e6200255e565b606091505b50600081511415620025a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200259e9062003051565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062002605565b600190505b949350505050565b600080823b905060008111915050919050565b610a1f8062003e5f83390190565b6000620026456200263f8462003392565b62003369565b9050828152602081018484840111156200265e57600080fd5b6200266b848285620035da565b509392505050565b600081359050620026848162003df6565b92915050565b6000813590506200269b8162003e10565b92915050565b600081359050620026b28162003e2a565b92915050565b600081519050620026c98162003e2a565b92915050565b600082601f830112620026e157600080fd5b8135620026f38482602086016200262e565b91505092915050565b6000813590506200270d8162003e44565b92915050565b6000602082840312156200272657600080fd5b6000620027368482850162002673565b91505092915050565b600080604083850312156200275357600080fd5b6000620027638582860162002673565b9250506020620027768582860162002673565b9150509250929050565b6000806000606084860312156200279657600080fd5b6000620027a68682870162002673565b9350506020620027b98682870162002673565b9250506040620027cc86828701620026fc565b9150509250925092565b60008060008060808587031215620027ed57600080fd5b6000620027fd8782880162002673565b9450506020620028108782880162002673565b93505060406200282387828801620026fc565b925050606085013567ffffffffffffffff8111156200284157600080fd5b6200284f87828801620026cf565b91505092959194509250565b600080604083850312156200286f57600080fd5b60006200287f8582860162002673565b925050602062002892858286016200268a565b9150509250929050565b60008060408385031215620028b057600080fd5b6000620028c08582860162002673565b9250506020620028d385828601620026fc565b9150509250929050565b600060208284031215620028f057600080fd5b60006200290084828501620026a1565b91505092915050565b6000602082840312156200291c57600080fd5b60006200292c84828501620026b8565b91505092915050565b6000602082840312156200294857600080fd5b60006200295884828501620026fc565b91505092915050565b6200296c816200353c565b82525050565b6200297d8162003550565b82525050565b60006200299082620033c8565b6200299c8185620033de565b9350620029ae818560208601620035e9565b620029b981620037cd565b840191505092915050565b620029cf81620035b2565b82525050565b6000620029e282620033d3565b620029ee8185620033ef565b935062002a00818560208601620035e9565b62002a0b81620037cd565b840191505092915050565b600062002a2382620033d3565b62002a2f818562003400565b935062002a41818560208601620035e9565b80840191505092915050565b600062002a5c60098362003400565b915062002a6982620037de565b600982019050919050565b600062002a83603283620033ef565b915062002a908262003807565b604082019050919050565b600062002aaa602683620033ef565b915062002ab78262003856565b604082019050919050565b600062002ad1601c83620033ef565b915062002ade82620038a5565b602082019050919050565b600062002af8602483620033ef565b915062002b0582620038ce565b604082019050919050565b600062002b1f601983620033ef565b915062002b2c826200391d565b602082019050919050565b600062002b4660068362003400565b915062002b538262003946565b600682019050919050565b600062002b6d602c83620033ef565b915062002b7a826200396f565b604082019050919050565b600062002b94603883620033ef565b915062002ba182620039be565b604082019050919050565b600062002bbb602a83620033ef565b915062002bc88262003a0d565b604082019050919050565b600062002be2602983620033ef565b915062002bef8262003a5c565b604082019050919050565b600062002c0960028362003400565b915062002c168262003aab565b600282019050919050565b600062002c30601683620033ef565b915062002c3d8262003ad4565b602082019050919050565b600062002c57602083620033ef565b915062002c648262003afd565b602082019050919050565b600062002c7e602c83620033ef565b915062002c8b8262003b26565b604082019050919050565b600062002ca560128362003400565b915062002cb28262003b75565b601282019050919050565b600062002ccc602083620033ef565b915062002cd98262003b9e565b602082019050919050565b600062002cf3602983620033ef565b915062002d008262003bc7565b604082019050919050565b600062002d1a601883620033ef565b915062002d278262003c16565b602082019050919050565b600062002d41602183620033ef565b915062002d4e8262003c3f565b604082019050919050565b600062002d68601d8362003400565b915062002d758262003c8e565b601d82019050919050565b600062002d8f603183620033ef565b915062002d9c8262003cb7565b604082019050919050565b600062002db6601583620033ef565b915062002dc38262003d06565b602082019050919050565b600062002ddd600f8362003400565b915062002dea8262003d2f565b600f82019050919050565b600062002e0460378362003400565b915062002e118262003d58565b603782019050919050565b600062002e2b60368362003400565b915062002e388262003da7565b603682019050919050565b62002e4e81620035a8565b82525050565b600062002e62828562002a16565b915062002e70828462002a16565b91508190509392505050565b600062002e898262002a4d565b915062002e97828762002a16565b915062002ea48262002c96565b915062002eb2828662002a16565b915062002ebf8262002e1c565b915062002ecd828562002a16565b915062002eda8262002dce565b915062002ee8828462002a16565b915062002ef58262002bfa565b915081905095945050505050565b600062002f108262002b37565b915062002f1e828462002a16565b915081905092915050565b600062002f368262002b37565b915062002f44828462002a16565b915062002f518262002df5565b915081905092915050565b600062002f698262002d59565b915062002f77828462002a16565b915081905092915050565b600060208201905062002f99600083018462002961565b92915050565b600060808201905062002fb6600083018762002961565b62002fc5602083018662002961565b62002fd4604083018562002e43565b818103606083015262002fe8818462002983565b905095945050505050565b60006020820190506200300a600083018462002972565b92915050565b6000602082019050620030276000830184620029c4565b92915050565b60006020820190508181036000830152620030498184620029d5565b905092915050565b600060208201905081810360008301526200306c8162002a74565b9050919050565b600060208201905081810360008301526200308e8162002a9b565b9050919050565b60006020820190508181036000830152620030b08162002ac2565b9050919050565b60006020820190508181036000830152620030d28162002ae9565b9050919050565b60006020820190508181036000830152620030f48162002b10565b9050919050565b60006020820190508181036000830152620031168162002b5e565b9050919050565b60006020820190508181036000830152620031388162002b85565b9050919050565b600060208201905081810360008301526200315a8162002bac565b9050919050565b600060208201905081810360008301526200317c8162002bd3565b9050919050565b600060208201905081810360008301526200319e8162002c21565b9050919050565b60006020820190508181036000830152620031c08162002c48565b9050919050565b60006020820190508181036000830152620031e28162002c6f565b9050919050565b60006020820190508181036000830152620032048162002cbd565b9050919050565b60006020820190508181036000830152620032268162002ce4565b9050919050565b60006020820190508181036000830152620032488162002d0b565b9050919050565b600060208201905081810360008301526200326a8162002d32565b9050919050565b600060208201905081810360008301526200328c8162002d80565b9050919050565b60006020820190508181036000830152620032ae8162002da7565b9050919050565b6000602082019050620032cc600083018462002e43565b92915050565b6000604082019050620032e9600083018562002e43565b620032f8602083018462002961565b9392505050565b600060408201905062003316600083018562002e43565b620033256020830184620029c4565b9392505050565b600060608201905062003343600083018662002e43565b620033526020830185620029c4565b62003361604083018462002961565b949350505050565b60006200337562003388565b905062003383828262003655565b919050565b6000604051905090565b600067ffffffffffffffff821115620033b057620033af6200379e565b5b620033bb82620037cd565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006200341882620035a8565b91506200342583620035a8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200345d576200345c62003711565b5b828201905092915050565b60006200347582620035a8565b91506200348283620035a8565b92508262003495576200349462003740565b5b828204905092915050565b6000620034ad82620035a8565b9150620034ba83620035a8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620034f657620034f562003711565b5b828202905092915050565b60006200350e82620035a8565b91506200351b83620035a8565b92508282101562003531576200353062003711565b5b828203905092915050565b6000620035498262003588565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000620035bf82620035c6565b9050919050565b6000620035d38262003588565b9050919050565b82818337600083830152505050565b60005b8381101562003609578082015181840152602081019050620035ec565b8381111562003619576000848401525b50505050565b600060028204905060018216806200363857607f821691505b602082108114156200364f576200364e6200376f565b5b50919050565b6200366082620037cd565b810181811067ffffffffffffffff821117156200368257620036816200379e565b5b80604052505050565b60006200369882620035a8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415620036ce57620036cd62003711565b5b600182019050919050565b6000620036e682620035a8565b9150620036f383620035a8565b92508262003706576200370562003740565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f7b226e616d65223a220000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f526f636b20230000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f57617264656e20616c7265616479206372656174656400000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f222c20226465736372697074696f6e223a220000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f57617264656e206164647265737320696e636f72726563740000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f57617264656e206e6f7420726567697374657265640000000000000000000000600082015250565b7f207d5d2c2022696d616765223a20220000000000000000000000000000000000600082015250565b7f2066726f6d206120636f6e7472616374206465706c6f796564206f6e2074686560008201527f2032357468206f6620446563656d6265722c2032303137000000000000000000602082015250565b7f222c202261747472696275746573223a205b7b202274726169745f747970653a60008201527f223a20224e756d626572222c202276616c7565223a2000000000000000000000602082015250565b62003e01816200353c565b811462003e0d57600080fd5b50565b62003e1b8162003550565b811462003e2757600080fd5b50565b62003e35816200355c565b811462003e4157600080fd5b50565b62003e4f81620035a8565b811462003e5b57600080fd5b5056fe608060405234801561001057600080fd5b5061002d61002261003260201b60201c565b61003a60201b60201c565b6100fe565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6109128061010d6000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b14610066578063b460af9414610084578063ddd5e1b2146100a0578063f2fde38b146100bc575b600080fd5b6100646100d8565b005b61006e610160565b60405161007b9190610713565b60405180910390f35b61009e60048036038101906100999190610660565b610189565b005b6100ba60048036038101906100b59190610624565b610277565b005b6100d660048036038101906100d191906105fb565b6103f8565b005b6100e06104f0565b73ffffffffffffffffffffffffffffffffffffffff166100fe610160565b73ffffffffffffffffffffffffffffffffffffffff1614610154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014b9061074e565b60405180910390fd5b61015e60006104f8565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6101916104f0565b73ffffffffffffffffffffffffffffffffffffffff166101af610160565b73ffffffffffffffffffffffffffffffffffffffff1614610205576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101fc9061074e565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16631b3e200284836040518363ffffffff1660e01b815260040161024092919061076e565b600060405180830381600087803b15801561025a57600080fd5b505af115801561026e573d6000803e3d6000fd5b50505050505050565b61027f6104f0565b73ffffffffffffffffffffffffffffffffffffffff1661029d610160565b73ffffffffffffffffffffffffffffffffffffffff16146102f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102ea9061074e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663c6caa959837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161034e929190610797565b600060405180830381600087803b15801561036857600080fd5b505af115801561037c573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16631b3e2002836103a5610160565b6040518363ffffffff1660e01b81526004016103c292919061076e565b600060405180830381600087803b1580156103dc57600080fd5b505af11580156103f0573d6000803e3d6000fd5b505050505050565b6104006104f0565b73ffffffffffffffffffffffffffffffffffffffff1661041e610160565b73ffffffffffffffffffffffffffffffffffffffff1614610474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046b9061074e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156104e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104db9061072e565b60405180910390fd5b6104ed816104f8565b50565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000813590506105cb81610897565b92915050565b6000813590506105e0816108ae565b92915050565b6000813590506105f5816108c5565b92915050565b60006020828403121561060d57600080fd5b600061061b848285016105bc565b91505092915050565b6000806040838503121561063757600080fd5b6000610645858286016105e6565b9250506020610656858286016105d1565b9150509250929050565b60008060006060848603121561067557600080fd5b6000610683868287016105e6565b9350506020610694868287016105d1565b92505060406106a5868287016105bc565b9150509250925092565b6106b8816107d1565b82525050565b60006106cb6026836107c0565b91506106d68261081f565b604082019050919050565b60006106ee6020836107c0565b91506106f98261086e565b602082019050919050565b61070d81610815565b82525050565b600060208201905061072860008301846106af565b92915050565b60006020820190508181036000830152610747816106be565b9050919050565b60006020820190508181036000830152610767816106e1565b9050919050565b60006040820190506107836000830185610704565b61079060208301846106af565b9392505050565b60006040820190506107ac6000830185610704565b6107b96020830184610704565b9392505050565b600082825260208201905092915050565b60006107dc826107f5565b9050919050565b60006107ee826107d1565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6108a0816107d1565b81146108ab57600080fd5b50565b6108b7816107e3565b81146108c257600080fd5b50565b6108ce81610815565b81146108d957600080fd5b5056fea26469706673582212201e021954bc09bf5586daa1795e0cf4aa9edaf7d17d4c3313fdf954c4ee3c411d64736f6c634300080400334142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220647c6bf809851e249769feb85047b20e486a4057bc79da2a750050685d7970aa64736f6c63430008040033

Deployed Bytecode Sourcemap

40599:10316:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27924:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40650:78;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28869:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30428:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29951:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49613:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31318:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31728:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28563:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50383:257;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28293:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9559:94;;;:::i;:::-;;8908:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29038:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30721:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50648:264;;;:::i;:::-;;40865:42;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31984:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48505:877;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50117:258;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31087:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49716:393;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9808:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27924:305;28026:4;28078:25;28063:40;;;:11;:40;;;;:105;;;;28135:33;28120:48;;;:11;:48;;;;28063:105;:158;;;;28185:36;28209:11;28185:23;:36::i;:::-;28063:158;28043:178;;27924:305;;;:::o;40650:78::-;;;;;;;;;;;;;:::o;28869:100::-;28923:13;28956:5;28949:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28869:100;:::o;30428:221::-;30504:7;30532:16;30540:7;30532;:16::i;:::-;30524:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30617:15;:24;30633:7;30617:24;;;;;;;;;;;;;;;;;;;;;30610:31;;30428:221;;;:::o;29951:411::-;30032:13;30048:23;30063:7;30048:14;:23::i;:::-;30032:39;;30096:5;30090:11;;:2;:11;;;;30082:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;30190:5;30174:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;30199:37;30216:5;30223:12;:10;:12::i;:::-;30199:16;:37::i;:::-;30174:62;30152:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;30333:21;30342:2;30346:7;30333:8;:21::i;:::-;29951:411;;;:::o;49613:93::-;49665:7;49688:12;;49681:19;;49613:93;:::o;31318:339::-;31513:41;31532:12;:10;:12::i;:::-;31546:7;31513:18;:41::i;:::-;31505:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31621:28;31631:4;31637:2;31641:7;31621:9;:28::i;:::-;31318:339;;;:::o;31728:185::-;31866:39;31883:4;31889:2;31893:7;31866:39;;;;;;;;;;;;:16;:39::i;:::-;31728:185;;;:::o;28563:239::-;28635:7;28655:13;28671:7;:16;28679:7;28671:16;;;;;;;;;;;;;;;;;;;;;28655:32;;28723:1;28706:19;;:5;:19;;;;28698:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28789:5;28782:12;;;28563:239;;;:::o;50383:257::-;50452:14;50469:7;:21;50477:12;:10;:12::i;:::-;50469:21;;;;;;;;;;;;;;;;;;;;;;;;;50452:38;;50523:1;50505:20;;:6;:20;;;;50497:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;50593:6;50582:27;;;50610:2;50614:5;;;;;;;;;;;50621:12;:10;:12::i;:::-;50582:52;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50383:257;;:::o;28293:208::-;28365:7;28410:1;28393:19;;:5;:19;;;;28385:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;28477:9;:16;28487:5;28477:16;;;;;;;;;;;;;;;;28470:23;;28293:208;;;:::o;9559:94::-;9139:12;:10;:12::i;:::-;9128:23;;:7;:5;:7::i;:::-;:23;;;9120:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9624:21:::1;9642:1;9624:9;:21::i;:::-;9559:94::o:0;8908:87::-;8954:7;8981:6;;;;;;;;;;;8974:13;;8908:87;:::o;29038:104::-;29094:13;29127:7;29120:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29038:104;:::o;30721:295::-;30836:12;:10;:12::i;:::-;30824:24;;:8;:24;;;;30816:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30936:8;30891:18;:32;30910:12;:10;:12::i;:::-;30891:32;;;;;;;;;;;;;;;:42;30924:8;30891:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;30989:8;30960:48;;30975:12;:10;:12::i;:::-;30960:48;;;30999:8;30960:48;;;;;;:::i;:::-;;;;;;;;30721:295;;:::o;50648:264::-;50686:14;50711:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;50686:42;;50761:1;50743:20;;:6;:20;;;;50735:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;50840:1;50807:35;;:7;:21;50815:12;:10;:12::i;:::-;50807:21;;;;;;;;;;;;;;;;;;;;;;;;;:35;;;50799:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;50900:6;50876:7;:21;50884:12;:10;:12::i;:::-;50876:21;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;50648:264;:::o;40865:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;31984:328::-;32159:41;32178:12;:10;:12::i;:::-;32192:7;32159:18;:41::i;:::-;32151:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32265:39;32279:4;32285:2;32289:7;32298:5;32265:13;:39::i;:::-;31984:328;;;;:::o;48505:877::-;48578:13;48618:2;48608:7;:12;:31;;;;;48634:5;48624:7;:15;48608:31;48600:40;;;;;;48652:19;48698:10;:8;:10::i;:::-;48710:20;48726:3;48716:7;:13;;;;:::i;:::-;48710:5;:20::i;:::-;48681:50;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48652:80;;48832:528;48975:18;:7;:16;:18::i;:::-;48948:46;;;;;;;;:::i;:::-;;;;;;;;;;;;;49085:18;:7;:16;:18::i;:::-;49058:105;;;;;;;;:::i;:::-;;;;;;;;;;;;;49239:18;:7;:16;:18::i;:::-;49295:5;48878:458;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48832:13;:528::i;:::-;48763:606;;;;;;;;:::i;:::-;;;;;;;;;;;;;48741:635;;;48505:877;;;:::o;50117:258::-;50183:11;50191:2;50183:7;:11::i;:::-;50167:27;;:12;:10;:12::i;:::-;:27;;;50159:36;;;;;;50234:9;50240:2;50234:5;:9::i;:::-;50297:1;50281:12;;:17;;;;;;;:::i;:::-;;;;;;;;50337:5;;;;;;;;;;;:14;;;50352:2;50356:12;:10;:12::i;:::-;50337:32;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50117:258;:::o;31087:164::-;31184:4;31208:18;:25;31227:5;31208:25;;;;;;;;;;;;;;;:35;31234:8;31208:35;;;;;;;;;;;;;;;;;;;;;;;;;31201:42;;31087:164;;;;:::o;49716:393::-;49783:14;49800:7;:21;49808:12;:10;:12::i;:::-;49800:21;;;;;;;;;;;;;;;;;;;;;;;;;49783:38;;49854:1;49836:20;;:6;:20;;;;49828:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;49902:2;49897;:7;:21;;;;;49913:5;49908:2;:10;49897:21;49889:30;;;;;;49962:6;49951:24;;;49976:2;49980:5;;;;;;;;;;;49951:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50025:23;50031:12;:10;:12::i;:::-;50045:2;50025:5;:23::i;:::-;50102:1;50086:12;;:17;;;;;;;:::i;:::-;;;;;;;;49716:393;;:::o;9808:192::-;9139:12;:10;:12::i;:::-;9128:23;;:7;:5;:7::i;:::-;:23;;;9120:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9917:1:::1;9897:22;;:8;:22;;;;9889:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;9973:19;9983:8;9973:9;:19::i;:::-;9808:192:::0;:::o;20894:157::-;20979:4;21018:25;21003:40;;;:11;:40;;;;20996:47;;20894:157;;;:::o;33822:127::-;33887:4;33939:1;33911:30;;:7;:16;33919:7;33911:16;;;;;;;;;;;;;;;;;;;;;:30;;;;33904:37;;33822:127;;;:::o;7696:98::-;7749:7;7776:10;7769:17;;7696:98;:::o;37804:174::-;37906:2;37879:15;:24;37895:7;37879:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37962:7;37958:2;37924:46;;37933:23;37948:7;37933:14;:23::i;:::-;37924:46;;;;;;;;;;;;37804:174;;:::o;34116:348::-;34209:4;34234:16;34242:7;34234;:16::i;:::-;34226:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34310:13;34326:23;34341:7;34326:14;:23::i;:::-;34310:39;;34379:5;34368:16;;:7;:16;;;:51;;;;34412:7;34388:31;;:20;34400:7;34388:11;:20::i;:::-;:31;;;34368:51;:87;;;;34423:32;34440:5;34447:7;34423:16;:32::i;:::-;34368:87;34360:96;;;34116:348;;;;:::o;37108:578::-;37267:4;37240:31;;:23;37255:7;37240:14;:23::i;:::-;:31;;;37232:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;37350:1;37336:16;;:2;:16;;;;37328:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;37406:39;37427:4;37433:2;37437:7;37406:20;:39::i;:::-;37510:29;37527:1;37531:7;37510:8;:29::i;:::-;37571:1;37552:9;:15;37562:4;37552:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;37600:1;37583:9;:13;37593:2;37583:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37631:2;37612:7;:16;37620:7;37612:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37670:7;37666:2;37651:27;;37660:4;37651:27;;;;;;;;;;;;37108:578;;;:::o;10008:173::-;10064:16;10083:6;;;;;;;;;;;10064:25;;10109:8;10100:6;;:17;;;;;;;;;;;;;;;;;;10164:8;10133:40;;10154:8;10133:40;;;;;;;;;;;;10008:173;;:::o;33194:315::-;33351:28;33361:4;33367:2;33371:7;33351:9;:28::i;:::-;33398:48;33421:4;33427:2;33431:7;33440:5;33398:22;:48::i;:::-;33390:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;33194:315;;;;:::o;49390:104::-;49450:13;49472:16;;;;;;;;;;;;;;;;;;;49390:104;:::o;49502:103::-;49560:13;49589:6;49596:2;49589:10;;;;;;;;;;;;;;;;;;;;;;;49582:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49502:103;;;:::o;5312:723::-;5368:13;5598:1;5589:5;:10;5585:53;;;5616:10;;;;;;;;;;;;;;;;;;;;;5585:53;5648:12;5663:5;5648:20;;5679:14;5704:78;5719:1;5711:4;:9;5704:78;;5737:8;;;;;:::i;:::-;;;;5768:2;5760:10;;;;;:::i;:::-;;;5704:78;;;5792:19;5824:6;5814:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5792:39;;5842:154;5858:1;5849:5;:10;5842:154;;5886:1;5876:11;;;;;:::i;:::-;;;5953:2;5945:5;:10;;;;:::i;:::-;5932:2;:24;;;;:::i;:::-;5919:39;;5902:6;5909;5902:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;5982:2;5973:11;;;;;:::i;:::-;;;5842:154;;;6020:6;6006:21;;;;;5312:723;;;;:::o;835:1912::-;893:13;938:1;923:4;:11;:16;919:31;;;941:9;;;;;;;;;;;;;;;;919:31;1002:19;1024:12;;;;;;;;;;;;;;;;;1002:34;;1088:18;1134:1;1129;1115:4;:11;:15;;;;:::i;:::-;1114:21;;;;:::i;:::-;1109:1;:27;;;;:::i;:::-;1088:48;;1219:20;1266:2;1253:10;:15;;;;:::i;:::-;1242:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1219:50;;1366:10;1358:6;1351:26;1461:1;1454:5;1450:13;1520:4;1571;1565:11;1556:7;1552:25;1667:2;1659:6;1655:15;1740:754;1759:6;1750:7;1747:19;1740:754;;;1859:1;1850:7;1846:15;1835:26;;1898:7;1892:14;2024:4;2016:5;2012:2;2008:14;2004:25;1994:8;1990:40;1984:47;1973:9;1965:67;2078:1;2067:9;2063:17;2050:30;;2157:4;2149:5;2145:2;2141:14;2137:25;2127:8;2123:40;2117:47;2106:9;2098:67;2211:1;2200:9;2196:17;2183:30;;2290:4;2282:5;2279:1;2274:14;2270:25;2260:8;2256:40;2250:47;2239:9;2231:67;2344:1;2333:9;2329:17;2316:30;;2423:4;2415:5;2403:25;2393:8;2389:40;2383:47;2372:9;2364:67;2477:1;2466:9;2462:17;2449:30;;1783:711;1740:754;;;2567:1;2560:4;2554:11;2550:19;2588:1;2583:54;;;;2656:1;2651:52;;;;2543:160;;2583:54;2627:6;2622:3;2618:16;2614:1;2603:9;2599:17;2592:43;2583:54;;2651:52;2695:4;2690:3;2686:14;2682:1;2671:9;2667:17;2660:41;2543:160;;1291:1423;;;;2733:6;2726:13;;;;;835:1912;;;;:::o;36411:360::-;36471:13;36487:23;36502:7;36487:14;:23::i;:::-;36471:39;;36523:48;36544:5;36559:1;36563:7;36523:20;:48::i;:::-;36612:29;36629:1;36633:7;36612:8;:29::i;:::-;36674:1;36654:9;:16;36664:5;36654:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;36693:7;:16;36701:7;36693:16;;;;;;;;;;;;36686:23;;;;;;;;;;;36755:7;36751:1;36727:36;;36736:5;36727:36;;;;;;;;;;;;36411:360;;:::o;35800:382::-;35894:1;35880:16;;:2;:16;;;;35872:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;35953:16;35961:7;35953;:16::i;:::-;35952:17;35944:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;36015:45;36044:1;36048:2;36052:7;36015:20;:45::i;:::-;36090:1;36073:9;:13;36083:2;36073:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36121:2;36102:7;:16;36110:7;36102:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36166:7;36162:2;36141:33;;36158:1;36141:33;;;;;;;;;;;;35800:382;;:::o;39914:126::-;;;;:::o;38543:799::-;38698:4;38719:15;:2;:13;;;:15::i;:::-;38715:620;;;38771:2;38755:36;;;38792:12;:10;:12::i;:::-;38806:4;38812:7;38821:5;38755:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38751:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39014:1;38997:6;:13;:18;38993:272;;;39040:60;;;;;;;;;;:::i;:::-;;;;;;;;38993:272;39215:6;39209:13;39200:6;39196:2;39192:15;39185:38;38751:529;38888:41;;;38878:51;;;:6;:51;;;;38871:58;;;;;38715:620;39319:4;39312:11;;38543:799;;;;;;;:::o;10954:387::-;11014:4;11222:12;11289:7;11277:20;11269:28;;11332:1;11325:4;:8;11318:15;;;10954:387;;;:::o;-1:-1:-1:-;;;;;;;;:::o;7:343: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:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;402:5;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;501:133::-;544:5;582:6;569:20;560:29;;598:30;622:5;598:30;:::i;:::-;550:84;;;;:::o;640:137::-;685:5;723:6;710:20;701:29;;739:32;765:5;739:32;:::i;:::-;691:86;;;;:::o;783:141::-;839:5;870:6;864:13;855:22;;886:32;912:5;886:32;:::i;:::-;845:79;;;;:::o;943:271::-;998:5;1047:3;1040:4;1032:6;1028:17;1024:27;1014:2;;1065:1;1062;1055:12;1014:2;1105:6;1092:20;1130:78;1204:3;1196:6;1189:4;1181:6;1177:17;1130:78;:::i;:::-;1121:87;;1004:210;;;;;:::o;1220:139::-;1266:5;1304:6;1291:20;1282:29;;1320:33;1347:5;1320:33;:::i;:::-;1272:87;;;;:::o;1365:262::-;1424:6;1473:2;1461:9;1452:7;1448:23;1444:32;1441:2;;;1489:1;1486;1479:12;1441:2;1532:1;1557:53;1602:7;1593:6;1582:9;1578:22;1557:53;:::i;:::-;1547:63;;1503:117;1431:196;;;;:::o;1633:407::-;1701:6;1709;1758:2;1746:9;1737:7;1733:23;1729:32;1726:2;;;1774:1;1771;1764:12;1726:2;1817:1;1842:53;1887:7;1878:6;1867:9;1863:22;1842:53;:::i;:::-;1832:63;;1788:117;1944:2;1970:53;2015:7;2006:6;1995:9;1991:22;1970:53;:::i;:::-;1960:63;;1915:118;1716:324;;;;;:::o;2046:552::-;2123:6;2131;2139;2188:2;2176:9;2167:7;2163:23;2159:32;2156:2;;;2204:1;2201;2194:12;2156:2;2247:1;2272:53;2317:7;2308:6;2297:9;2293:22;2272:53;:::i;:::-;2262:63;;2218:117;2374:2;2400:53;2445:7;2436:6;2425:9;2421:22;2400:53;:::i;:::-;2390:63;;2345:118;2502:2;2528:53;2573:7;2564:6;2553:9;2549:22;2528:53;:::i;:::-;2518:63;;2473:118;2146:452;;;;;:::o;2604:809::-;2699:6;2707;2715;2723;2772:3;2760:9;2751:7;2747:23;2743:33;2740:2;;;2789:1;2786;2779:12;2740:2;2832:1;2857:53;2902:7;2893:6;2882:9;2878:22;2857:53;:::i;:::-;2847:63;;2803:117;2959:2;2985:53;3030:7;3021:6;3010:9;3006:22;2985:53;:::i;:::-;2975:63;;2930:118;3087:2;3113:53;3158:7;3149:6;3138:9;3134:22;3113:53;:::i;:::-;3103:63;;3058:118;3243:2;3232:9;3228:18;3215:32;3274:18;3266:6;3263:30;3260:2;;;3306:1;3303;3296:12;3260:2;3334:62;3388:7;3379:6;3368:9;3364:22;3334:62;:::i;:::-;3324:72;;3186:220;2730:683;;;;;;;:::o;3419:401::-;3484:6;3492;3541:2;3529:9;3520:7;3516:23;3512:32;3509:2;;;3557:1;3554;3547:12;3509:2;3600:1;3625:53;3670:7;3661:6;3650:9;3646:22;3625:53;:::i;:::-;3615:63;;3571:117;3727:2;3753:50;3795:7;3786:6;3775:9;3771:22;3753:50;:::i;:::-;3743:60;;3698:115;3499:321;;;;;:::o;3826:407::-;3894:6;3902;3951:2;3939:9;3930:7;3926:23;3922:32;3919:2;;;3967:1;3964;3957:12;3919:2;4010:1;4035:53;4080:7;4071:6;4060:9;4056:22;4035:53;:::i;:::-;4025:63;;3981:117;4137:2;4163:53;4208:7;4199:6;4188:9;4184:22;4163:53;:::i;:::-;4153:63;;4108:118;3909:324;;;;;:::o;4239:260::-;4297:6;4346:2;4334:9;4325:7;4321:23;4317:32;4314:2;;;4362:1;4359;4352:12;4314:2;4405:1;4430:52;4474:7;4465:6;4454:9;4450:22;4430:52;:::i;:::-;4420:62;;4376:116;4304:195;;;;:::o;4505:282::-;4574:6;4623:2;4611:9;4602:7;4598:23;4594:32;4591:2;;;4639:1;4636;4629:12;4591:2;4682:1;4707:63;4762:7;4753:6;4742:9;4738:22;4707:63;:::i;:::-;4697:73;;4653:127;4581:206;;;;:::o;4793:262::-;4852:6;4901:2;4889:9;4880:7;4876:23;4872:32;4869:2;;;4917:1;4914;4907:12;4869:2;4960:1;4985:53;5030:7;5021:6;5010:9;5006:22;4985:53;:::i;:::-;4975:63;;4931:117;4859:196;;;;:::o;5061:118::-;5148:24;5166:5;5148:24;:::i;:::-;5143:3;5136:37;5126:53;;:::o;5185:109::-;5266:21;5281:5;5266:21;:::i;:::-;5261:3;5254:34;5244:50;;:::o;5300:360::-;5386:3;5414:38;5446:5;5414:38;:::i;:::-;5468:70;5531:6;5526:3;5468:70;:::i;:::-;5461:77;;5547:52;5592:6;5587:3;5580:4;5573:5;5569:16;5547:52;:::i;:::-;5624:29;5646:6;5624:29;:::i;:::-;5619:3;5615:39;5608:46;;5390:270;;;;;:::o;5666:167::-;5771:55;5820:5;5771:55;:::i;:::-;5766:3;5759:68;5749:84;;:::o;5839:364::-;5927:3;5955:39;5988:5;5955:39;:::i;:::-;6010:71;6074:6;6069:3;6010:71;:::i;:::-;6003:78;;6090:52;6135:6;6130:3;6123:4;6116:5;6112:16;6090:52;:::i;:::-;6167:29;6189:6;6167:29;:::i;:::-;6162:3;6158:39;6151:46;;5931:272;;;;;:::o;6209:377::-;6315:3;6343:39;6376:5;6343:39;:::i;:::-;6398:89;6480:6;6475:3;6398:89;:::i;:::-;6391:96;;6496:52;6541:6;6536:3;6529:4;6522:5;6518:16;6496:52;:::i;:::-;6573:6;6568:3;6564:16;6557:23;;6319:267;;;;;:::o;6592:400::-;6752:3;6773:84;6855:1;6850:3;6773:84;:::i;:::-;6766:91;;6866:93;6955:3;6866:93;:::i;:::-;6984:1;6979:3;6975:11;6968:18;;6756:236;;;:::o;6998:366::-;7140:3;7161:67;7225:2;7220:3;7161:67;:::i;:::-;7154:74;;7237:93;7326:3;7237:93;:::i;:::-;7355:2;7350:3;7346:12;7339:19;;7144:220;;;:::o;7370:366::-;7512:3;7533:67;7597:2;7592:3;7533:67;:::i;:::-;7526:74;;7609:93;7698:3;7609:93;:::i;:::-;7727:2;7722:3;7718:12;7711:19;;7516:220;;;:::o;7742:366::-;7884:3;7905:67;7969:2;7964:3;7905:67;:::i;:::-;7898:74;;7981:93;8070:3;7981:93;:::i;:::-;8099:2;8094:3;8090:12;8083:19;;7888:220;;;:::o;8114:366::-;8256:3;8277:67;8341:2;8336:3;8277:67;:::i;:::-;8270:74;;8353:93;8442:3;8353:93;:::i;:::-;8471:2;8466:3;8462:12;8455:19;;8260:220;;;:::o;8486:366::-;8628:3;8649:67;8713:2;8708:3;8649:67;:::i;:::-;8642:74;;8725:93;8814:3;8725:93;:::i;:::-;8843:2;8838:3;8834:12;8827:19;;8632:220;;;:::o;8858:400::-;9018:3;9039:84;9121:1;9116:3;9039:84;:::i;:::-;9032:91;;9132:93;9221:3;9132:93;:::i;:::-;9250:1;9245:3;9241:11;9234:18;;9022:236;;;:::o;9264:366::-;9406:3;9427:67;9491:2;9486:3;9427:67;:::i;:::-;9420:74;;9503:93;9592:3;9503:93;:::i;:::-;9621:2;9616:3;9612:12;9605:19;;9410:220;;;:::o;9636:366::-;9778:3;9799:67;9863:2;9858:3;9799:67;:::i;:::-;9792:74;;9875:93;9964:3;9875:93;:::i;:::-;9993:2;9988:3;9984:12;9977:19;;9782:220;;;:::o;10008:366::-;10150:3;10171:67;10235:2;10230:3;10171:67;:::i;:::-;10164:74;;10247:93;10336:3;10247:93;:::i;:::-;10365:2;10360:3;10356:12;10349:19;;10154:220;;;:::o;10380:366::-;10522:3;10543:67;10607:2;10602:3;10543:67;:::i;:::-;10536:74;;10619:93;10708:3;10619:93;:::i;:::-;10737:2;10732:3;10728:12;10721:19;;10526:220;;;:::o;10752:400::-;10912:3;10933:84;11015:1;11010:3;10933:84;:::i;:::-;10926:91;;11026:93;11115:3;11026:93;:::i;:::-;11144:1;11139:3;11135:11;11128:18;;10916:236;;;:::o;11158:366::-;11300:3;11321:67;11385:2;11380:3;11321:67;:::i;:::-;11314:74;;11397:93;11486:3;11397:93;:::i;:::-;11515:2;11510:3;11506:12;11499:19;;11304:220;;;:::o;11530:366::-;11672:3;11693:67;11757:2;11752:3;11693:67;:::i;:::-;11686:74;;11769:93;11858:3;11769:93;:::i;:::-;11887:2;11882:3;11878:12;11871:19;;11676:220;;;:::o;11902:366::-;12044:3;12065:67;12129:2;12124:3;12065:67;:::i;:::-;12058:74;;12141:93;12230:3;12141:93;:::i;:::-;12259:2;12254:3;12250:12;12243:19;;12048:220;;;:::o;12274:402::-;12434:3;12455:85;12537:2;12532:3;12455:85;:::i;:::-;12448:92;;12549:93;12638:3;12549:93;:::i;:::-;12667:2;12662:3;12658:12;12651:19;;12438:238;;;:::o;12682:366::-;12824:3;12845:67;12909:2;12904:3;12845:67;:::i;:::-;12838:74;;12921:93;13010:3;12921:93;:::i;:::-;13039:2;13034:3;13030:12;13023:19;;12828:220;;;:::o;13054:366::-;13196:3;13217:67;13281:2;13276:3;13217:67;:::i;:::-;13210:74;;13293:93;13382:3;13293:93;:::i;:::-;13411:2;13406:3;13402:12;13395:19;;13200:220;;;:::o;13426:366::-;13568:3;13589:67;13653:2;13648:3;13589:67;:::i;:::-;13582:74;;13665:93;13754:3;13665:93;:::i;:::-;13783:2;13778:3;13774:12;13767:19;;13572:220;;;:::o;13798:366::-;13940:3;13961:67;14025:2;14020:3;13961:67;:::i;:::-;13954:74;;14037:93;14126:3;14037:93;:::i;:::-;14155:2;14150:3;14146:12;14139:19;;13944:220;;;:::o;14170:402::-;14330:3;14351:85;14433:2;14428:3;14351:85;:::i;:::-;14344:92;;14445:93;14534:3;14445:93;:::i;:::-;14563:2;14558:3;14554:12;14547:19;;14334:238;;;:::o;14578:366::-;14720:3;14741:67;14805:2;14800:3;14741:67;:::i;:::-;14734:74;;14817:93;14906:3;14817:93;:::i;:::-;14935:2;14930:3;14926:12;14919:19;;14724:220;;;:::o;14950:366::-;15092:3;15113:67;15177:2;15172:3;15113:67;:::i;:::-;15106:74;;15189:93;15278:3;15189:93;:::i;:::-;15307:2;15302:3;15298:12;15291:19;;15096:220;;;:::o;15322:402::-;15482:3;15503:85;15585:2;15580:3;15503:85;:::i;:::-;15496:92;;15597:93;15686:3;15597:93;:::i;:::-;15715:2;15710:3;15706:12;15699:19;;15486:238;;;:::o;15730:402::-;15890:3;15911:85;15993:2;15988:3;15911:85;:::i;:::-;15904:92;;16005:93;16094:3;16005:93;:::i;:::-;16123:2;16118:3;16114:12;16107:19;;15894:238;;;:::o;16138:402::-;16298:3;16319:85;16401:2;16396:3;16319:85;:::i;:::-;16312:92;;16413:93;16502:3;16413:93;:::i;:::-;16531:2;16526:3;16522:12;16515:19;;16302:238;;;:::o;16546:118::-;16633:24;16651:5;16633:24;:::i;:::-;16628:3;16621:37;16611:53;;:::o;16670:435::-;16850:3;16872:95;16963:3;16954:6;16872:95;:::i;:::-;16865:102;;16984:95;17075:3;17066:6;16984:95;:::i;:::-;16977:102;;17096:3;17089:10;;16854:251;;;;;:::o;17111:2085::-;17892:3;17914:148;18058:3;17914:148;:::i;:::-;17907:155;;18079:95;18170:3;18161:6;18079:95;:::i;:::-;18072:102;;18191:148;18335:3;18191:148;:::i;:::-;18184:155;;18356:95;18447:3;18438:6;18356:95;:::i;:::-;18349:102;;18468:148;18612:3;18468:148;:::i;:::-;18461:155;;18633:95;18724:3;18715:6;18633:95;:::i;:::-;18626:102;;18745:148;18889:3;18745:148;:::i;:::-;18738:155;;18910:95;19001:3;18992:6;18910:95;:::i;:::-;18903:102;;19022:148;19166:3;19022:148;:::i;:::-;19015:155;;19187:3;19180:10;;17896:1300;;;;;;;:::o;19202:541::-;19435:3;19457:148;19601:3;19457:148;:::i;:::-;19450:155;;19622:95;19713:3;19704:6;19622:95;:::i;:::-;19615:102;;19734:3;19727:10;;19439:304;;;;:::o;19749:807::-;20083:3;20105:148;20249:3;20105:148;:::i;:::-;20098:155;;20270:95;20361:3;20352:6;20270:95;:::i;:::-;20263:102;;20382:148;20526:3;20382:148;:::i;:::-;20375:155;;20547:3;20540:10;;20087:469;;;;:::o;20562:541::-;20795:3;20817:148;20961:3;20817:148;:::i;:::-;20810:155;;20982:95;21073:3;21064:6;20982:95;:::i;:::-;20975:102;;21094:3;21087:10;;20799:304;;;;:::o;21109:222::-;21202:4;21240:2;21229:9;21225:18;21217:26;;21253:71;21321:1;21310:9;21306:17;21297:6;21253:71;:::i;:::-;21207:124;;;;:::o;21337:640::-;21532:4;21570:3;21559:9;21555:19;21547:27;;21584:71;21652:1;21641:9;21637:17;21628:6;21584:71;:::i;:::-;21665:72;21733:2;21722:9;21718:18;21709:6;21665:72;:::i;:::-;21747;21815:2;21804:9;21800:18;21791:6;21747:72;:::i;:::-;21866:9;21860:4;21856:20;21851:2;21840:9;21836:18;21829:48;21894:76;21965:4;21956:6;21894:76;:::i;:::-;21886:84;;21537:440;;;;;;;:::o;21983:210::-;22070:4;22108:2;22097:9;22093:18;22085:26;;22121:65;22183:1;22172:9;22168:17;22159:6;22121:65;:::i;:::-;22075:118;;;;:::o;22199:258::-;22310:4;22348:2;22337:9;22333:18;22325:26;;22361:89;22447:1;22436:9;22432:17;22423:6;22361:89;:::i;:::-;22315:142;;;;:::o;22463:313::-;22576:4;22614:2;22603:9;22599:18;22591:26;;22663:9;22657:4;22653:20;22649:1;22638:9;22634:17;22627:47;22691:78;22764:4;22755:6;22691:78;:::i;:::-;22683:86;;22581:195;;;;:::o;22782:419::-;22948:4;22986:2;22975:9;22971:18;22963:26;;23035:9;23029:4;23025:20;23021:1;23010:9;23006:17;22999:47;23063:131;23189:4;23063:131;:::i;:::-;23055:139;;22953:248;;;:::o;23207:419::-;23373:4;23411:2;23400:9;23396:18;23388:26;;23460:9;23454:4;23450:20;23446:1;23435:9;23431:17;23424:47;23488:131;23614:4;23488:131;:::i;:::-;23480:139;;23378:248;;;:::o;23632:419::-;23798:4;23836:2;23825:9;23821:18;23813:26;;23885:9;23879:4;23875:20;23871:1;23860:9;23856:17;23849:47;23913:131;24039:4;23913:131;:::i;:::-;23905:139;;23803:248;;;:::o;24057:419::-;24223:4;24261:2;24250:9;24246:18;24238:26;;24310:9;24304:4;24300:20;24296:1;24285:9;24281:17;24274:47;24338:131;24464:4;24338:131;:::i;:::-;24330:139;;24228:248;;;:::o;24482:419::-;24648:4;24686:2;24675:9;24671:18;24663:26;;24735:9;24729:4;24725:20;24721:1;24710:9;24706:17;24699:47;24763:131;24889:4;24763:131;:::i;:::-;24755:139;;24653:248;;;:::o;24907:419::-;25073:4;25111:2;25100:9;25096:18;25088:26;;25160:9;25154:4;25150:20;25146:1;25135:9;25131:17;25124:47;25188:131;25314:4;25188:131;:::i;:::-;25180:139;;25078:248;;;:::o;25332:419::-;25498:4;25536:2;25525:9;25521:18;25513:26;;25585:9;25579:4;25575:20;25571:1;25560:9;25556:17;25549:47;25613:131;25739:4;25613:131;:::i;:::-;25605:139;;25503:248;;;:::o;25757:419::-;25923:4;25961:2;25950:9;25946:18;25938:26;;26010:9;26004:4;26000:20;25996:1;25985:9;25981:17;25974:47;26038:131;26164:4;26038:131;:::i;:::-;26030:139;;25928:248;;;:::o;26182:419::-;26348:4;26386:2;26375:9;26371:18;26363:26;;26435:9;26429:4;26425:20;26421:1;26410:9;26406:17;26399:47;26463:131;26589:4;26463:131;:::i;:::-;26455:139;;26353:248;;;:::o;26607:419::-;26773:4;26811:2;26800:9;26796:18;26788:26;;26860:9;26854:4;26850:20;26846:1;26835:9;26831:17;26824:47;26888:131;27014:4;26888:131;:::i;:::-;26880:139;;26778:248;;;:::o;27032:419::-;27198:4;27236:2;27225:9;27221:18;27213:26;;27285:9;27279:4;27275:20;27271:1;27260:9;27256:17;27249:47;27313:131;27439:4;27313:131;:::i;:::-;27305:139;;27203:248;;;:::o;27457:419::-;27623:4;27661:2;27650:9;27646:18;27638:26;;27710:9;27704:4;27700:20;27696:1;27685:9;27681:17;27674:47;27738:131;27864:4;27738:131;:::i;:::-;27730:139;;27628:248;;;:::o;27882:419::-;28048:4;28086:2;28075:9;28071:18;28063:26;;28135:9;28129:4;28125:20;28121:1;28110:9;28106:17;28099:47;28163:131;28289:4;28163:131;:::i;:::-;28155:139;;28053:248;;;:::o;28307:419::-;28473:4;28511:2;28500:9;28496:18;28488:26;;28560:9;28554:4;28550:20;28546:1;28535:9;28531:17;28524:47;28588:131;28714:4;28588:131;:::i;:::-;28580:139;;28478:248;;;:::o;28732:419::-;28898:4;28936:2;28925:9;28921:18;28913:26;;28985:9;28979:4;28975:20;28971:1;28960:9;28956:17;28949:47;29013:131;29139:4;29013:131;:::i;:::-;29005:139;;28903:248;;;:::o;29157:419::-;29323:4;29361:2;29350:9;29346:18;29338:26;;29410:9;29404:4;29400:20;29396:1;29385:9;29381:17;29374:47;29438:131;29564:4;29438:131;:::i;:::-;29430:139;;29328:248;;;:::o;29582:419::-;29748:4;29786:2;29775:9;29771:18;29763:26;;29835:9;29829:4;29825:20;29821:1;29810:9;29806:17;29799:47;29863:131;29989:4;29863:131;:::i;:::-;29855:139;;29753:248;;;:::o;30007:419::-;30173:4;30211:2;30200:9;30196:18;30188:26;;30260:9;30254:4;30250:20;30246:1;30235:9;30231:17;30224:47;30288:131;30414:4;30288:131;:::i;:::-;30280:139;;30178:248;;;:::o;30432:222::-;30525:4;30563:2;30552:9;30548:18;30540:26;;30576:71;30644:1;30633:9;30629:17;30620:6;30576:71;:::i;:::-;30530:124;;;;:::o;30660:332::-;30781:4;30819:2;30808:9;30804:18;30796:26;;30832:71;30900:1;30889:9;30885:17;30876:6;30832:71;:::i;:::-;30913:72;30981:2;30970:9;30966:18;30957:6;30913:72;:::i;:::-;30786:206;;;;;:::o;30998:368::-;31137:4;31175:2;31164:9;31160:18;31152:26;;31188:71;31256:1;31245:9;31241:17;31232:6;31188:71;:::i;:::-;31269:90;31355:2;31344:9;31340:18;31331:6;31269:90;:::i;:::-;31142:224;;;;;:::o;31372:478::-;31539:4;31577:2;31566:9;31562:18;31554:26;;31590:71;31658:1;31647:9;31643:17;31634:6;31590:71;:::i;:::-;31671:90;31757:2;31746:9;31742:18;31733:6;31671:90;:::i;:::-;31771:72;31839:2;31828:9;31824:18;31815:6;31771:72;:::i;:::-;31544:306;;;;;;:::o;31856:129::-;31890:6;31917:20;;:::i;:::-;31907:30;;31946:33;31974:4;31966:6;31946:33;:::i;:::-;31897:88;;;:::o;31991:75::-;32024:6;32057:2;32051:9;32041:19;;32031:35;:::o;32072:307::-;32133:4;32223:18;32215:6;32212:30;32209:2;;;32245:18;;:::i;:::-;32209:2;32283:29;32305:6;32283:29;:::i;:::-;32275:37;;32367:4;32361;32357:15;32349:23;;32138:241;;;:::o;32385:98::-;32436:6;32470:5;32464:12;32454:22;;32443:40;;;:::o;32489:99::-;32541:6;32575:5;32569:12;32559:22;;32548:40;;;:::o;32594:168::-;32677:11;32711:6;32706:3;32699:19;32751:4;32746:3;32742:14;32727:29;;32689:73;;;;:::o;32768:169::-;32852:11;32886:6;32881:3;32874:19;32926:4;32921:3;32917:14;32902:29;;32864:73;;;;:::o;32943:148::-;33045:11;33082:3;33067:18;;33057:34;;;;:::o;33097:305::-;33137:3;33156:20;33174:1;33156:20;:::i;:::-;33151:25;;33190:20;33208:1;33190:20;:::i;:::-;33185:25;;33344:1;33276:66;33272:74;33269:1;33266:81;33263:2;;;33350:18;;:::i;:::-;33263:2;33394:1;33391;33387:9;33380:16;;33141:261;;;;:::o;33408:185::-;33448:1;33465:20;33483:1;33465:20;:::i;:::-;33460:25;;33499:20;33517:1;33499:20;:::i;:::-;33494:25;;33538:1;33528:2;;33543:18;;:::i;:::-;33528:2;33585:1;33582;33578:9;33573:14;;33450:143;;;;:::o;33599:348::-;33639:7;33662:20;33680:1;33662:20;:::i;:::-;33657:25;;33696:20;33714:1;33696:20;:::i;:::-;33691:25;;33884:1;33816:66;33812:74;33809:1;33806:81;33801:1;33794:9;33787:17;33783:105;33780:2;;;33891:18;;:::i;:::-;33780:2;33939:1;33936;33932:9;33921:20;;33647:300;;;;:::o;33953:191::-;33993:4;34013:20;34031:1;34013:20;:::i;:::-;34008:25;;34047:20;34065:1;34047:20;:::i;:::-;34042:25;;34086:1;34083;34080:8;34077:2;;;34091:18;;:::i;:::-;34077:2;34136:1;34133;34129:9;34121:17;;33998:146;;;;:::o;34150:96::-;34187:7;34216:24;34234:5;34216:24;:::i;:::-;34205:35;;34195:51;;;:::o;34252:90::-;34286:7;34329:5;34322:13;34315:21;34304:32;;34294:48;;;:::o;34348:149::-;34384:7;34424:66;34417:5;34413:78;34402:89;;34392:105;;;:::o;34503:126::-;34540:7;34580:42;34573:5;34569:54;34558:65;;34548:81;;;:::o;34635:77::-;34672:7;34701:5;34690:16;;34680:32;;;:::o;34718:162::-;34786:9;34819:55;34868:5;34819:55;:::i;:::-;34806:68;;34796:84;;;:::o;34886:131::-;34954:9;34987:24;35005:5;34987:24;:::i;:::-;34974:37;;34964:53;;;:::o;35023:154::-;35107:6;35102:3;35097;35084:30;35169:1;35160:6;35155:3;35151:16;35144:27;35074:103;;;:::o;35183:307::-;35251:1;35261:113;35275:6;35272:1;35269:13;35261:113;;;35360:1;35355:3;35351:11;35345:18;35341:1;35336:3;35332:11;35325:39;35297:2;35294:1;35290:10;35285:15;;35261:113;;;35392:6;35389:1;35386:13;35383:2;;;35472:1;35463:6;35458:3;35454:16;35447:27;35383:2;35232:258;;;;:::o;35496:320::-;35540:6;35577:1;35571:4;35567:12;35557:22;;35624:1;35618:4;35614:12;35645:18;35635:2;;35701:4;35693:6;35689:17;35679:27;;35635:2;35763;35755:6;35752:14;35732:18;35729:38;35726:2;;;35782:18;;:::i;:::-;35726:2;35547:269;;;;:::o;35822:281::-;35905:27;35927:4;35905:27;:::i;:::-;35897:6;35893:40;36035:6;36023:10;36020:22;35999:18;35987:10;35984:34;35981:62;35978:2;;;36046:18;;:::i;:::-;35978:2;36086:10;36082:2;36075:22;35865:238;;;:::o;36109:233::-;36148:3;36171:24;36189:5;36171:24;:::i;:::-;36162:33;;36217:66;36210:5;36207:77;36204:2;;;36287:18;;:::i;:::-;36204:2;36334:1;36327:5;36323:13;36316:20;;36152:190;;;:::o;36348:176::-;36380:1;36397:20;36415:1;36397:20;:::i;:::-;36392:25;;36431:20;36449:1;36431:20;:::i;:::-;36426:25;;36470:1;36460:2;;36475:18;;:::i;:::-;36460:2;36516:1;36513;36509:9;36504:14;;36382:142;;;;:::o;36530:180::-;36578:77;36575:1;36568:88;36675:4;36672:1;36665:15;36699:4;36696:1;36689:15;36716:180;36764:77;36761:1;36754:88;36861:4;36858:1;36851:15;36885:4;36882:1;36875:15;36902:180;36950:77;36947:1;36940:88;37047:4;37044:1;37037:15;37071:4;37068:1;37061:15;37088:180;37136:77;37133:1;37126:88;37233:4;37230:1;37223:15;37257:4;37254:1;37247:15;37274:102;37315:6;37366:2;37362:7;37357:2;37350:5;37346:14;37342:28;37332:38;;37322:54;;;:::o;37382:214::-;37522:66;37518:1;37510:6;37506:14;37499:90;37488:108;:::o;37602:237::-;37742:34;37738:1;37730:6;37726:14;37719:58;37811:20;37806:2;37798:6;37794:15;37787:45;37708:131;:::o;37845:225::-;37985:34;37981:1;37973:6;37969:14;37962:58;38054:8;38049:2;38041:6;38037:15;38030:33;37951:119;:::o;38076:178::-;38216:30;38212:1;38204:6;38200:14;38193:54;38182:72;:::o;38260:223::-;38400:34;38396:1;38388:6;38384:14;38377:58;38469:6;38464:2;38456:6;38452:15;38445:31;38366:117;:::o;38489:175::-;38629:27;38625:1;38617:6;38613:14;38606:51;38595:69;:::o;38670:156::-;38810:8;38806:1;38798:6;38794:14;38787:32;38776:50;:::o;38832:231::-;38972:34;38968:1;38960:6;38956:14;38949:58;39041:14;39036:2;39028:6;39024:15;39017:39;38938:125;:::o;39069:243::-;39209:34;39205:1;39197:6;39193:14;39186:58;39278:26;39273:2;39265:6;39261:15;39254:51;39175:137;:::o;39318:229::-;39458:34;39454:1;39446:6;39442:14;39435:58;39527:12;39522:2;39514:6;39510:15;39503:37;39424:123;:::o;39553:228::-;39693:34;39689:1;39681:6;39677:14;39670:58;39762:11;39757:2;39749:6;39745:15;39738:36;39659:122;:::o;39787:214::-;39927:66;39923:1;39915:6;39911:14;39904:90;39893:108;:::o;40007:172::-;40147:24;40143:1;40135:6;40131:14;40124:48;40113:66;:::o;40185:182::-;40325:34;40321:1;40313:6;40309:14;40302:58;40291:76;:::o;40373:231::-;40513:34;40509:1;40501:6;40497:14;40490:58;40582:14;40577:2;40569:6;40565:15;40558:39;40479:125;:::o;40610:214::-;40750:66;40746:1;40738:6;40734:14;40727:90;40716:108;:::o;40830:182::-;40970:34;40966:1;40958:6;40954:14;40947:58;40936:76;:::o;41018:228::-;41158:34;41154:1;41146:6;41142:14;41135:58;41227:11;41222:2;41214:6;41210:15;41203:36;41124:122;:::o;41252:174::-;41392:26;41388:1;41380:6;41376:14;41369:50;41358:68;:::o;41432:220::-;41572:34;41568:1;41560:6;41556:14;41549:58;41641:3;41636:2;41628:6;41624:15;41617:28;41538:114;:::o;41658:179::-;41798:31;41794:1;41786:6;41782:14;41775:55;41764:73;:::o;41843:236::-;41983:34;41979:1;41971:6;41967:14;41960:58;42052:19;42047:2;42039:6;42035:15;42028:44;41949:130;:::o;42085:171::-;42225:23;42221:1;42213:6;42209:14;42202:47;42191:65;:::o;42262:214::-;42402:66;42398:1;42390:6;42386:14;42379:90;42368:108;:::o;42482:242::-;42622:34;42618:1;42610:6;42606:14;42599:58;42691:25;42686:2;42678:6;42674:15;42667:50;42588:136;:::o;42730:315::-;42870:66;42866:1;42858:6;42854:14;42847:90;42971:66;42966:2;42958:6;42954:15;42947:91;42836:209;:::o;43051:122::-;43124:24;43142:5;43124:24;:::i;:::-;43117:5;43114:35;43104:2;;43163:1;43160;43153:12;43104:2;43094:79;:::o;43179:116::-;43249:21;43264:5;43249:21;:::i;:::-;43242:5;43239:32;43229:2;;43285:1;43282;43275:12;43229:2;43219:76;:::o;43301:120::-;43373:23;43390:5;43373:23;:::i;:::-;43366:5;43363:34;43353:2;;43411:1;43408;43401:12;43353:2;43343:78;:::o;43427:122::-;43500:24;43518:5;43500:24;:::i;:::-;43493:5;43490:35;43480:2;;43539:1;43536;43529:12;43480:2;43470:79;:::o

Swarm Source

ipfs://647c6bf809851e249769feb85047b20e486a4057bc79da2a750050685d7970aa
Loading...
Loading
Loading...
Loading
[ 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.