ETH Price: $3,326.17 (-3.91%)

Token

OnChainTarzan (OCTRZN)
 

Overview

Max Total Supply

7,682 OCTRZN

Holders

2,815

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
celestials.eth
Balance
2 OCTRZN
0x5F8e696889c74bC6342ebd529e8b3bB9A6B98888
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
OnChainTarzan

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// File: @openzeppelin/[email protected]/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.0 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

// File: @openzeppelin/[email protected]/utils/Counters.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/[email protected]/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/[email protected]/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/[email protected]/access/Ownable.sol


// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/[email protected]/utils/Address.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/[email protected]/token/ERC721/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/[email protected]/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/[email protected]/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/[email protected]/token/ERC721/IERC721.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Enumerable.sol


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

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Metadata.sol


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

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/[email protected]/token/ERC721/ERC721.sol


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

// File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721Enumerable.sol


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/OnChainTarzan.sol


pragma solidity ^0.8.0;





/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

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

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);
        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)
            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)
                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(
                    out,
                    and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF)
                )
                out := shl(8, out)
                out := add(
                    out,
                    and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF)
                )
                out := shl(8, out)
                out := add(
                    out,
                    and(mload(add(tablePtr, and(input, 0x3F))), 0xFF)
                )
                out := shl(224, out)
                mstore(resultPtr, out)
                resultPtr := add(resultPtr, 4)
            }
            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }
            mstore(result, encodedLen)
        }
        return string(result);
    }
}

contract OnChainTarzan is ERC721Enumerable, ReentrancyGuard, Ownable {
    using Counters for Counters.Counter;
    using Strings for uint256;
    using Base64 for bytes;

    Counters.Counter private _tokenIdCounter;

    string[] private skinC = [
        "FFFFFF",
        "A0522D",
        "8d5524",
        "FFFAFA",
        "DEB887",
        "FFF5EE",
        "593123",
        "8B4513",
        "FAEBD7",
        "eac086",
        "D2B48C",
        "242424"
    ];
    string[] private skinCN = [
        "White",
        "Sienna",
        "Brown",
        "Snow",
        "Burly Wood",
        "SeaShell",
        "Black Brown",
        "Saddle Brown",
        "Antique White",
        "Caucasian",
        "Tan",
        "Black"
    ];
    uint16[] private skinCD = [
        512,
        512,
        512,
        512,
        512,
        512,
        512,
        512,
        1024,
        1024,
        1024,
        1024
    ];

    string[] private eyes = [
        "M7,10H8V11H9V12H15V11H16V10H17V11H16V12H8V11H7Z",
        "M7,12V11H8V10H16V11H17V12H16V11H15V10H9V11H8V12Z"
    ];
    string[] private eyesC = ["5d0070", "06f006", "fc9320", "aaa000"];
    string[] private eyesCN = ["Green", "Blue", "Brown", "Black"];
    uint16[] private eyesCD = [2, 1, 2, 1];

    string[] private earrings = [
        "M3,14V13H4V14Z",
        "M20,14V13H21V14Z",
        "M3,14V13H21V14H20V13H4V14Z"
    ];
    string[] private earringsN = ["Right", "Left", "Both"];
    uint16[] private earringsD = [3, 2, 2];
    string[] private earringsC = [
        "1F45FC",
        "FDD017",
        "6960EC",
        "00FFFF",
        "E41B17",
        "4AA02C",
        "F9B7FF",
        "59E817",
        "F6358A"
    ];
    string[] private earringsCN = [
        "Blue Orchid",
        "Bright Gold",
        "Blue Lotus",
        "Cyan",
        "Love Red",
        "Blossom Pink",
        "Spring Green",
        "Nebula Green",
        "Violet Red"
    ];
    uint16[] private earringsCD = [
        1,
        2,
        5,
        3,
        7,
        11,
        13,
        17,
        19
    ];

    string[] private tattoos = [
        "M15,6V5H16V6H17V7H16V6Z",
        "M10,22V21H11V22H13V21H14V22H13V23H11V22Z",
        "M10,23V22H11V21H13V22H14V23H13V22H11V23Z",
        "M9,22V21H10V22H11V21H13V22H14V21H15V22H14V23H13V22H11V23H10V22Z",
        "M9,23V22H10V21H11V22H13V21H14V22H15V23H14V22H13V23H11V22H10V23Z"
    ];
    string[] private tattoosN = ["I", "II", "III", "IV", "V"];
    uint16[] private tattoosD = [3, 7, 5, 11, 13];
    string[] private tattoosC = ["333333", "881111"];
    string[] private tattoosCN = ["Gray", "Blood"];
    uint16[] private tattoosCD = [5, 3];

    string[] private eyePatches = [
        "M4,10V8H20V10H17V9H15V10H14V12H15V13H17V12H18V10H20V14H3V16H1V14H3V13H4V11H6V12H7V13H9V12H10V10H9V9H7V10H6V11H4Z",
        "M3,10V9H21V10H19V13H13V10H11V13H5V10Z",
        "M3,10V9H21V10H19V12H18V13H14V12H13V10H11V12H10V13H6V12H5V10Z",
        "M3,9V8H21V9H11V12H10V13H9V14H8V13H7V12H6V9Z",
        "M3,9V8H21V9H18V12H17V13H16V14H15V13H14V12H13V9Z"
    ];
    string[] private eyePatchesN = [
        "Ninja",
        "Sun Glasses I",
        "Sun Glasses II",
        "Right Pirate Patch",
        "Left Pirate Patch"
    ];
    uint16[] private eyePatchesD = [3, 5, 5, 7, 11];
    string[] private eyePatchesC = [
        "827839",
        "C35817",
        "2B65EC",
        "8C001A",
        "7D0552",
        "43C6DB",
        "FCDFFF",
        "FF00FF",
        "347C2C",
        "4B0082",
        "493D26",
        "C9BE62",
        "54C571",
        "342D7E",
        "25383C",
        "2C3539"
    ];
    string[] private eyePatchesCN = [
        "Moccasin",
        "Red Fox",
        "Ocean Blue",
        "Burgundy",
        "Plum Velvet",
        "Turquoise",
        "Cotton Candy",
        "Magenta",
        "Jungle Green",
        "Indigo",
        "Mocha",
        "Ginger Brown",
        "Zombie Green",
        "Blue Whale",
        "Dark Slate Gray",
        "Gunmetal"
    ];
    uint16[] private eyePatchesCD = [
        2,
        2,
        3,
        3,
        3,
        5,
        7,
        5,
        7,
        11,
        13,
        3,
        7,
        13,
        7,
        17
    ];

    string[] private hairs = [
        "M6,4V1H18V4Z",
        "M4,6V4H5V3H6V2H18V3H19V4H20V6H18V5H17V4H7V5H6V6Z",
        "M4,13V9H3V5H4V4H5V3H6V2H18V3H19V4H20V5H21V9H20V13H19V6H18V5H17V4H7V5H6V6H5V13Z",
        "M2,20V6H3V5H4V4H5V3H6V2H18V3H19V4H20V5H21V6H22V17H22V20H21V18H20V22H19V20H18V24H17V20H18V19H19V17H20V13H21V10H20V9H19V6H18V5H17V4H7V5H6V6H5V9H4V10H3V13H4V18H5V19H6V20H7V24H6V20H5V22H4V18H3V20H2V6Z",
        "M2,20V6H3V5H4V4H5V3H6V2H18V3H19V4H20V5H21V6H22V17H22V20H21V18H20V22H19V20H18V24H17V20H18V19H19V17H20V13H21V10H20V9H19V6H18V5H17V4H11V7H10V4H9V8H8V4H7V8H6V6H5V9H4V10H3V13H4V18H5V19H6V20H7V24H6V20H5V22H4V18H3V20H2V6Z",
        "M2,20V6H3V5H4V4H5V3H6V2H18V3H19V4H20V5H21V6H22V20H21V21H20V22H19V23H18V24H17V20H18V19H19V18H20V13H21V10H20V9H19V6H18V5H17V4H7V5H6V6H5V9H4V10H3V13H4V18H5V19H6V20H7V24H6V23H5V22H4V21H3V20Z",
        "M2,20V6H3V5H4V4H5V3H6V2H18V3H19V4H20V5H21V6H22V20H21V21H20V22H19V23H18V24H17V20H18V19H19V18H20V13H21V10H20V9H19V6H18V5H17V4H15V6H13V8H11V10H9V12H7V14H5V16H4V18H5V19H6V20H7V24H6V23H5V22H4V21H3V20Z"
    ];
    string[] private hairsN = [
        "Classic Fade",
        "High Fade",
        "Pompadour",
        "Long Pushed Back",
        "Tarzan Cut",
        "Hockey",
        "Macho Long"
    ];
    uint16[] private hairsD = [23, 27, 19, 5, 17, 13, 31];
    string[] private hairsC = [
        "000000",
        "625D5D",
        "EDDA74",
        "616D7E",
        "806517",
        "FFF8C6",
        "C68E17",
        "835C3B",
        "FFD801",
        "7E3817",
        "EBDDE2"
    ];
    string[] private hairsCN = [
        "Black",
        "Carbon Gray",
        "Goldenrod",
        "Jet Gray",
        "Oak Brown",
        "Lemon Chiffon",
        "Caramel",
        "Brown Bear",
        "Golden",
        "Sangria",
        "Lavender Pinocchio"
    ];
    uint16[] private hairsCD = [
        43,
        7,
        37,
        17,
        11,
        53,
        71,
        13,
        7,
        7,
        103
    ];

    string[] private hats = [
        "XXX",
        "M3,8V4H4V3H5V2H6V1H7V0H17V1H18V2H19V3H20V4H21V8Z",
        "M3,6V4H5V0H19V4H21V6Z",
        "M1,5V6H20V1H4V5Z"
    ];
    string[] private hatsN = ["None", "Beret", "Panama", "Cap"];
    uint16[] private hatsD = [997, 101, 103, 307];
    string[] private hatsC = [
        "893BFF",
        "7D0541",
        "4C787E",
        "483C32",
        "9E7BFF",
        "AF9B60",
        "4863A0",
        "736AFF",
        "483C32",
        "000080",
        "800517"
    ];
    string[] private hatsCN = [
        "Aztech Purple",
        "Plum Pie",
        "Beetle Green",
        "Taupe",
        "Purple Mimosa",
        "Bullet Shell",
        "Steel Blue",
        "Light Slate Blue",
        "Sunrise Orange",
        "Navy Blue",
        "Firebrick"
    ];
    uint16[] private hatsCD = [
        7,
        5,
        37,
        23,
        101,
        71,
        43,
        17,
        137,
        743,
        103
    ];

    string[] private beard = [
        "M9,19V16H15V19H14V17H10V19Z",
        "M9,20V16H15V20H14V17H10V18H13V19H11V18H10V20Z",
        "M9,20V16H15V21H14V22H13V23H11V22H10V21H9V20H11V18H13V20H14V17H10V20Z",
        "M9,20H7V19H6V18H5V15H6V16H7V17H9V16H15V17H17V16H18V15H19V18H18V19H17V20H15V21H14V22H13V23H11V22H10V21H9V20H11V18H13V20H14V17H10V20Z",
        "M10,17H7V16H6V15H5V18H6V19H7V20H8V21H16V20H17V19H18V18H19V15H18V16H17V17H15V16H9V17H14V19H13V18H11V19H10V17Z",
        "M10,17H7V16H6V15H5V14H4V19H5V20H6V21H7V22H9V23H11V24H13V23H15V22H17V21H18V20H19V19H20V14H19V15H18V16H17V17H15V16H9V17H14V18H10V17Z"
    ];
    string[] private beardN = [
        "Fu Manchu",
        "Zappa",
        "Van Dyke",
        "Ducktail",
        "Boxed",
        "Full Untouched"
    ];
    uint16[] private beardD = [43, 19, 71, 83, 13, 131];
    string[] private beardC = [
        "806517",
        "FFF8C6",
        "000000",
        "EDDA74",
        "616D7E",
        "625D5D",
        "FFD801",
        "C68E17",
        "835C3B",
        "7E3817",
        "EBDDE2"
    ];
    string[] private beardCN = [
        "Oak Brown",
        "Lemon Chiffon",
        "Black",
        "Goldenrod",
        "Jet Gray",
        "Carbon Gray",
        "Golden",
        "Caramel",
        "Brown Bear",
        "Sangria",
        "Lavender Pinocchio"
    ];
    uint16[] private beardCD = [
        23,
        31,
        43,
        53,
        71,
        83,
        103,
        211,
        313,
        149,
        179
    ];

    function getTrait(uint256 tokenId, uint16[] memory traitD, uint256 weight)
        private
        pure
        returns (uint256)
    {
        uint256 tokenHash = uint256(keccak256(bytes(tokenId.toString()))) %
            weight;
        uint i = 0;
        uint256 currentBound = traitD[i];
        while (tokenHash > currentBound) {
            i++;
            currentBound += traitD[i];
        }
        return i;
    }

    function genFace(uint256 tokenId)
        private
        view
        returns (string memory, string memory)
    {
        uint256 selectedTrait = getTrait(tokenId, skinCD, 8192);
        string memory svg = string(
            abi.encodePacked(
                '<path d="M5,6H6V5H7V4H17V5H18V6H19V18H18V19H17V20H16V24H8V20H7V19H6V18H5Z" fill="#',
                skinC[selectedTrait],
                '" />',
                '<path d="M8,24V20H7V19H6V18H5V6H6V5H7V4H17V5H18V6H19V18H18V19H17V20H16V24H17V20H18V19H19V18H20V13H21V9H20V6H19V5H18V4H17V3H7V4H6V5H5V6H4V9H3V13H4V18H5V19H6V20H7V24Z" fill="#333" />',
                '<path d="M7,13V12H6V11H5V10H7V9H9V10H10V11H11V12H13V11H14V10H15V9H17V10H19V11H18V12H17V13H15V12H9V13Z" fill="#DDD"/>',
                '<path d="M12,16H11V15H13V16H12V17H14V18H10V17H12V16Z" fill="#333"/>'
            )
        );
        string memory trait = string(
            abi.encodePacked(
                '{"trait_type":"Skin","value":"',
                skinCN[selectedTrait],
                '"}'
            )
        );
        return (svg, trait);
    }

    function genEyes(uint256 tokenId)
        private
        view
        returns (string memory, string memory)
    {
        string memory svg;
        uint256 selectedTrait = getTrait(tokenId, eyesCD, 6);
        string memory eyesColorSet = eyesC[selectedTrait];
        bytes memory eyesColorSetBytes = bytes(eyesColorSet);
        string memory firstEyesColor = string(
            abi.encodePacked(
                eyesColorSetBytes[0],
                eyesColorSetBytes[1],
                eyesColorSetBytes[2]
            )
        );
        string memory secondEyesColor = string(
            abi.encodePacked(
                eyesColorSetBytes[3],
                eyesColorSetBytes[4],
                eyesColorSetBytes[5]
            )
        );
        svg = string(
            abi.encodePacked(
                '<path d="',
                eyes[0],
                '" fill="#',
                firstEyesColor,
                '" />',
                '<path d="',
                eyes[1],
                '" fill="#',
                secondEyesColor,
                '" />'
            )
        );
        string memory trait = string(
            abi.encodePacked(
                '{"trait_type":"Eyes","value":"',
                eyesCN[selectedTrait],
                '"}'
            )
        );
        return (svg, trait);
    }

    function genEarrings(uint256 tokenId)
        private
        view
        returns (string memory, string memory)
    {
        string memory svg;
        string memory trait;
        uint selectedTrait = getTrait(tokenId, earringsD, 7);
        uint selectedTraitColor = getTrait(tokenId, earringsCD, 78);
        svg = string(
            abi.encodePacked(
                '<path d="',
                earrings[selectedTrait],
                '" fill="#',
                earringsC[selectedTraitColor],
                '" />'
            )
        );
        trait = string(
            abi.encodePacked(
                '{"trait_type":"Earring","value":"',
                earringsCN[selectedTraitColor],
                " ",
                earringsN[selectedTrait],
                '"}'
            )
        );
        return (svg, trait);
    }

    function genTattoos(uint256 tokenId)
        private
        view
        returns (string memory, string memory)
    {
        string memory svg;
        string memory trait;
        uint selectedTrait = getTrait(tokenId, tattoosD, 39);
        uint selectedTraitColor = getTrait(tokenId, tattoosCD, 8);
        svg = string(
            abi.encodePacked(
                '<path d="',
                tattoos[selectedTrait],
                '" fill="#',
                tattoosC[selectedTraitColor],
                '" />'
            )
        );
        trait = string(
            abi.encodePacked(
                '{"trait_type":"Tattoo","value":"',
                tattoosCN[selectedTraitColor],
                " ",
                tattoosN[selectedTrait],
                '"}'
            )
        );
        return (svg, trait);
    }

    function genEyePatches(uint256 tokenId)
        private
        view
        returns (string memory, string memory)
    {
        string memory svg;
        string memory trait;
        uint selectedTrait = getTrait(tokenId, eyePatchesD, 31);
        uint selectedTraitColor = getTrait(tokenId, eyePatchesCD, 108);
        svg = string(
            abi.encodePacked(
                '<path d="',
                eyePatches[selectedTrait],
                '" fill="#',
                eyePatchesC[selectedTraitColor],
                '" />'
            )
        );

        trait = string(
            abi.encodePacked(
                '{"trait_type":"Eyepatch","value":"',
                eyePatchesCN[selectedTraitColor],
                " ",
                eyePatchesN[selectedTrait],
                '"}'
            )
        );
        return (svg, trait);
    }

    function genHairs(uint256 tokenId)
        private
        view
        returns (string memory, string memory)
    {
        string memory svg;
        string memory trait;
        uint selectedTrait = getTrait(tokenId, hairsD, 135);
        uint selectedTraitColor = getTrait(tokenId, hairsCD, 369);
        svg = string(
            abi.encodePacked(
                '<path d="',
                hairs[selectedTrait],
                '" fill="#',
                hairsC[selectedTraitColor],
                '" />'
            )
        );
        trait = string(
            abi.encodePacked(
                '{"trait_type":"Hair","value":"',
                hairsCN[selectedTraitColor],
                " ",
                hairsN[selectedTrait],
                '"}'
            )
        );
        return (svg, trait);
    }

    function genHats(uint256 tokenId)
        private
        view
        returns (string memory, string memory)
    {
        string memory svg;
        string memory trait;
        uint selectedTrait = getTrait(tokenId, hatsD, 1508);
        if (keccak256("XXX") != keccak256(bytes(hats[selectedTrait]))) {
            uint selectedTraitColor = getTrait(tokenId, hatsCD, 1287);
            svg = string(
                abi.encodePacked(
                    '<path d="',
                    hats[selectedTrait],
                    '" fill="#',
                    hatsC[selectedTraitColor],
                    '" />'
                )
            );
            trait = string(
                abi.encodePacked(
                    '{"trait_type":"Hat","value":"',
                    hatsCN[selectedTraitColor],
                    " ",
                    hatsN[selectedTrait],
                    '"}'
                )
            );
        } else {
            svg = "";
            trait = string(
                abi.encodePacked(bytes('{"trait_type":"Hat","value":"None"}'))
            );
        }
        return (svg, trait);
    }

    function genBeard(uint256 tokenId)
        private
        view
        returns (string memory, string memory)
    {
        string memory svg;
        string memory trait;
        uint selectedTrait = getTrait(tokenId, beardD, 360);
        uint selectedTraitColor = getTrait(tokenId, beardCD, 1259);
        svg = string(
            abi.encodePacked(
                '<path d="',
                beard[selectedTrait],
                '" fill="#',
                beardC[selectedTraitColor],
                '" />'
            )
        );
        trait = string(
            abi.encodePacked(
                '{"trait_type":"Beard","value":"',
                beardCN[selectedTraitColor],
                " ",
                beardN[selectedTrait],
                '"}'
            )
        );
        return (svg, trait);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(_exists(tokenId), "ERC721Metadata: Deed does not exist!");
        string memory partialSVG;
        string memory partialAttributes;
        string
            memory svg = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" shape-rendering="crispEdges" viewBox="0 0 24 24">';
        string memory attributes = "[";
        (partialSVG, partialAttributes) = genFace(tokenId);
        attributes = string(
            abi.encodePacked(attributes, partialAttributes, ",")
        );
        svg = string(abi.encodePacked(svg, partialSVG));
        (partialSVG, partialAttributes) = genEyes(tokenId);
        attributes = string(
            abi.encodePacked(attributes, partialAttributes, ",")
        );
        svg = string(abi.encodePacked(svg, partialSVG));
        (partialSVG, partialAttributes) = genEarrings(tokenId);
        attributes = string(
            abi.encodePacked(attributes, partialAttributes, ",")
        );
        svg = string(abi.encodePacked(svg, partialSVG));
        (partialSVG, partialAttributes) = genTattoos(tokenId);
        attributes = string(
            abi.encodePacked(attributes, partialAttributes, ",")
        );
        svg = string(abi.encodePacked(svg, partialSVG));
        (partialSVG, partialAttributes) = genEyePatches(tokenId);
        attributes = string(
            abi.encodePacked(attributes, partialAttributes, ",")
        );
        svg = string(abi.encodePacked(svg, partialSVG));
        (partialSVG, partialAttributes) = genHairs(tokenId);
        attributes = string(
            abi.encodePacked(attributes, partialAttributes, ",")
        );
        svg = string(abi.encodePacked(svg, partialSVG));
        (partialSVG, partialAttributes) = genHats(tokenId);
        attributes = string(
            abi.encodePacked(attributes, partialAttributes, ",")
        );
        svg = string(abi.encodePacked(svg, partialSVG));
        (partialSVG, partialAttributes) = genBeard(tokenId);
        attributes = string(abi.encodePacked(attributes, partialAttributes));
        svg = string(abi.encodePacked(svg, partialSVG));

        svg = string(abi.encodePacked(svg, "</svg>"));
        attributes = string(abi.encodePacked(attributes, "]"));

        string memory _tokenURI = string(
            abi.encodePacked(
                "data:application/json;base64,",
                Base64.encode(
                    abi.encodePacked(
                        '{"name": "OnChainTarzan #',
                        tokenId.toString(),
                        '", "description": "OnChainTarzan is building a Metaverse FULLY Onchain! All the metadata and images are generated and stored 100% on-chain. No IPFS, no API. Merely Ethereum blockchain.", "image": "data:image/svg+xml;base64,',
                        Base64.encode(bytes(svg)),
                        '","attributes":',
                        attributes,
                        "}"
                    )
                )
            )
        );
        return _tokenURI;
    }

    function safeMint() public nonReentrant {
        uint256 tokenId = _tokenIdCounter.current();
        require(tokenId < 7680);
        _tokenIdCounter.increment();
        _safeMint(_msgSender(), tokenId);
    }

    function safeMintOwner(uint256 tokenId) public nonReentrant onlyOwner {
        require(tokenId > 7679 && tokenId < 8192);
        _safeMint(owner(), tokenId);
    }

    constructor() ERC721("OnChainTarzan", "OCTRZN") Ownable() {}
}

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":[{"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":[],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeMintOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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"}]

60066102008181526523232323232360d11b61022052608090815261024082815265104c0d4c8c9160d21b6102605260a052610280828152650e190d4d4c8d60d21b6102a05260c0526102c08281526546464641464160d01b6102e05260e0526103008281526544454238383760d01b61032052610100526103408281526546464635454560d01b61036052610120526103808281526535393331323360d01b6103a052610140526103c08281526538423435313360d01b6103e052610160526104008281526546414542443760d01b61042052610180526104408281526532b0b1981c1b60d11b610460526101a0526104808281526544324234384360d01b6104a0526101c0526105006040526104c0918252650c8d0c8d0c8d60d21b6104e0526101e0919091526200013890600d90600c620023c6565b50604080516101c0810182526005610180820181815264576869746560d81b6101a084015282528251808401845260068152655369656e6e6160d01b602082810191909152808401919091528351808501855282815264213937bbb760d91b8183015283850152835180850185526004815263536e6f7760e01b81830152606084015283518085018552600a815269109d5c9b1e4815dbdbd960b21b81830152608084015283518085018552600881526714d95854da195b1b60c21b8183015260a084015283518085018552600b81526a213630b1b590213937bbb760a91b8183015260c084015283518085018552600c8082526b29b0b232363290213937bbb760a11b8284015260e085019190915284518086018652600d81526c416e746971756520576869746560981b8184015261010085015284518086018652600981526821b0bab1b0b9b4b0b760b91b818401526101208501528451808601865260038152622a30b760e91b81840152610140850152845180860190955291845264426c61636b60d81b90840152610160820192909252620002dc91600e9190620023c6565b50604080516101808101825261020080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101919091526104006101008201819052610120820181905261014082018190526101608201526200035090600f90600c6200242a565b5060405180604001604052806040518060600160405280602f8152602001620065c9602f91398152602001604051806060016040528060308152602001620065f8603091399052620003a7906010906002620024d6565b506040805160c0810182526006608082018181526503564303037360d41b60a084015282528251808401845281815265181b3318181b60d11b60208281019190915280840191909152835180850185528281526506663393332360d41b818301528385015283518085019094529083526506161613030360d41b9083015260608101919091526200043d90601190600462002528565b506040805160c0810182526005608082018181526423b932b2b760d91b60a0840152825282518084018452600480825263426c756560e01b602083810191909152808501929092528451808601865283815264213937bbb760d91b8184015284860152845180860190955291845264426c61636b60d81b908401526060820192909252620004cf916012919062002528565b50604080516080810182526002808252600160208301819052928201526060810191909152620005049060139060046200257a565b5060405180606001604052806040518060400160405280600e81526020016d269996189a2b1899a41a2b189a2d60911b81525081526020016040518060400160405280601081526020016f26991816189a2b1899a41918ab189a2d60811b81525081526020016040518060400160405280601a81526020017f4d332c313456313348323156313448323056313348345631345a0000000000008152508152506014906003620005b5929190620025e5565b50604051806060016040528060405180604001604052806005815260200164149a59da1d60da1b8152508152602001604051806040016040528060048152602001631319599d60e21b815250815260200160405180604001604052806004815260200163084dee8d60e31b815250815250601590600362000638929190620025e5565b50604080516060810182526003808252600260208301819052928201929092526200066791601691906200257a565b506040805161016081018252600661012082018181526531463435464360d01b6101408401528252825180840184528181526546444430313760d01b60208281019190915280840191909152835180850185528281526536393630454360d01b8183015283850152835180850185528281526518182323232360d11b818301526060840152835180850185528281526545343142313760d01b818301526080840152835180850185528281526534414130324360d01b8183015260a08401528351808501855282815265231ca11ba32360d11b8183015260c0840152835180850185528281526535394538313760d01b8183015260e084015283518085019094529083526546363335384160d01b908301526101008101919091526200079290601790600962002637565b506040805161016081018252600b61012082018181526a109b1d594813dc98da1a5960aa1b6101408401528252825180840184529081526a109c9a59da1d0811dbdb1960aa1b6020828101919091528083019190915282518084018452600a80825269426c7565204c6f74757360b01b828401528385019190915283518085018552600481526321bcb0b760e11b818401526060840152835180850185526008815267131bdd994814995960c21b81840152608084015283518085018552600c8082526b426c6f73736f6d2050696e6b60a01b8285015260a0850191909152845180860186528181526b29b83934b7339023b932b2b760a11b8185015260c0850152845180860186529081526b2732b13ab6309023b932b2b760a11b8184015260e08401528351808501909452835269159a5bdb195d0814995960b21b90830152610100810191909152620008ec90601890600962002637565b50604080516101208101825260018152600260208201526005918101919091526003606082015260076080820152600b60a0820152600d60c0820152601160e08201526013610100820152620009479060199060096200257a565b506040518060a001604052806040518060400160405280601781526020017f4d31352c3656354831365636483137563748313656365a0000000000000000008152508152602001604051806060016040528060288152602001620069ec602891398152602001604051806060016040528060288152602001620068686028913981526020016040518060600160405280603f8152602001620066a5603f913981526020016040518060600160405280603f815260200162006829603f9139905262000a1790601a90600562002689565b506040805160e081018252600160a08201818152604960f81b60c0840152825282518084018452600280825261494960f01b6020838101919091528085019290925284518086018652600381526249494960e81b8184015284860152845180860186529081526124ab60f11b8183015260608401528351808501909452908352602b60f91b90830152608081019190915262000ab890601b90600562002689565b506040805160a08101825260038152600760208201526005918101829052600b6060820152600d608082015262000af391601c91906200257a565b506040805160808101825260068183018181526533333333333360d01b60608401528252825180840190935282526538383131313160d01b60208381019190915281019190915262000b4a90601d906002620024d6565b50604080516080810182526004818301908152634772617960e01b6060830152815281518083019092526005825264109b1bdbd960da1b60208381019190915281019190915262000ba090601e906002620024d6565b5060408051808201909152600581526003602082015262000bc690601f9060026200257a565b50604080516101408101909152607060a0820181815282916200655960c08401398152602001604051806060016040528060258152602001620065346025913981526020016040518060600160405280603c815260200162006980603c913981526020016040518060600160405280602b8152602001620067fe602b913981526020016040518060600160405280602f815260200162006676602f9139905262000c7590602090600562002689565b506040805160e081018252600560a08201818152644e696e6a6160d81b60c0840152825282518084018452600d81526c53756e20476c6173736573204960981b6020828101919091528084019190915283518085018552600e81526d53756e20476c617373657320494960901b81830152838501528351808501855260128152710a4d2ced0e840a0d2e4c2e8ca40a0c2e8c6d60731b81830152606084015283518085019094526011845270098cacce840a0d2e4c2e8ca40a0c2e8c6d607b1b90840152608082019290925262000d50916021919062002689565b506040805160a0810182526003815260056020820181905291810182905260076060820152600b608082015262000d8b91602291906200257a565b506040805161024081018252600661020082018181526538323738333960d01b6102208401528252825180840184528181526543333538313760d01b60208281019190915280840191909152835180850185528281526532423635454360d01b8183015283850152835180850185528281526538433030314160d01b81830152606084015283518085018552828152651ba2181a9a9960d11b81830152608084015283518085018552828152651a19a19b222160d11b8183015260a084015283518085018552828152652321a223232360d11b8183015260c0840152835180850185528281526523231818232360d11b8183015260e0840152835180850185528281526533343743324360d01b8183015261010084015283518085018552828152651a2118181c1960d11b8183015261012084015283518085018552828152651a1c99a2191b60d11b818301526101408401528351808501855282815265219ca1229b1960d11b81830152610160840152835180850185528281526535344335373160d01b81830152610180840152835180850185528281526533343244374560d01b818301526101a0840152835180850185528281526532353338334360d01b818301526101c084015283518085019094529083526532433335333960d01b908301526101e081019190915262000f88906023906010620026db565b506040805161024081018252600861020082018181526726b7b1b1b0b9b4b760c11b6102208401528252825180840184526007808252660a4cac8408cdef60cb1b6020838101919091528085019290925284518086018652600a808252694f6365616e20426c756560b01b8285015285870191909152855180870187528481526742757267756e647960c01b81850152606086015285518087018752600b81526a141b1d5b4815995b1d995d60aa1b81850152608086015285518087018752600981526854757271756f69736560b81b8185015260a086015285518087018752600c8082526b436f74746f6e2043616e647960a01b8286015260c087019190915286518088018852928352664d6167656e746160c81b8385015260e0860192909252855180870187528281526b253ab733b6329023b932b2b760a11b81850152610100860152855180870187526006815265496e6469676f60d01b818501526101208601528551808701875260058152644d6f63686160d81b81850152610140860152855180870187528281526b23b4b733b2b910213937bbb760a11b81850152610160860152855180870187529182526b2d37b6b134b29023b932b2b760a11b828401526101808501919091528451808601865290815269426c7565205768616c6560b01b818301526101a084015283518085018552600f81526e4461726b20536c617465204772617960881b818301526101c084015283518085019094529083526711dd5b9b595d185b60c21b908301526101e0810191909152620011d4906024906010620026db565b5060408051610200810182526002808252602082015260039181018290526060810182905260808101829052600560a08201819052600760c0830181905260e08301919091526101008201819052600b610120830152600d610140830181905261016083019390935261018082018190526101a08201929092526101c081019190915260116101e08201526200126f9060259060106200257a565b506040518060e001604052806040518060400160405280600c81526020016b269b161a2b18a4189c2b1a2d60a11b8152508152602001604051806060016040528060308152602001620063516030913981526020016040518060800160405280604e815260200162006628604e9139815260200160405180610100016040528060c481526020016200638160c49139815260200160405180610100016040528060d68152602001620066e460d6913981526020016040518060e0016040528060ba81526020016200629760ba9139815260200160405180610100016040528060c38152602001620068bd60c3913990526200136f9060269060076200272d565b506040805161012081018252600c60e082019081526b436c6173736963204661646560a01b61010083015281528151808301835260098082526848696768204661646560b81b6020838101919091528084019290925283518085018552908152682837b6b830b237bab960b91b818301528284015282518084018452601081526f4c6f6e6720507573686564204261636b60801b81830152606083015282518084018452600a8082526915185c9e985b8810dd5d60b21b828401526080840191909152835180850185526006815265486f636b657960d01b8184015260a084015283518085019094528352694d6163686f204c6f6e6760b01b9083015260c0810191909152620014849060279060076200272d565b506040805160e08101825260178152601b60208201526013918101919091526005606082015260116080820152600d60a0820152601f60c0820152620014cf9060289060076200257a565b50604080516101a081018252600661016082018181526503030303030360d41b610180840152825282518084018452818152650d8c8d510d5160d21b602082810191909152808401919091528351808501855282815265115111104dcd60d21b8183015283850152835180850185528281526536313644374560d01b818301526060840152835180850185528281526538303635313760d01b81830152608084015283518085018552828152652323231c219b60d11b8183015260a0840152835180850185528281526543363845313760d01b8183015260c084015283518085018552828152651c199aa199a160d11b8183015260e0840152835180850185528281526546464438303160d01b81830152610100840152835180850185528281526537453338313760d01b8183015261012084015283518085019094529083526522a12222229960d11b908301526101408101919091526200163690602990600b6200277f565b50604080516101a0810182526005610160820190815264426c61636b60d81b610180830152815281518083018352600b8082526a436172626f6e204772617960a81b602083810191909152808401929092528351808501855260098082526811dbdb19195b9c9bd960ba1b82850152848601919091528451808601865260088152674a6574204772617960c01b818501526060850152845180860186529081526827b0b590213937bbb760b91b81840152608084015283518085018552600d81526c2632b6b7b71021b434b33337b760991b8184015260a08401528351808501855260078082526610d85c985b595b60ca1b8285015260c085019190915284518086018652600a815269213937bbb7102132b0b960b11b8185015260e085015284518086018652600681526523b7b63232b760d11b81850152610100850152845180860186529081526653616e6772696160c81b81840152610120840152835180850190945260128452714c6176656e6465722050696e6f636368696f60701b91840191909152610140820192909252620017d591602a91906200277f565b506040805161016081018252602b80825260076020830181905260259383019390935260116060830152600b60808301819052603560a0840152604760c0840152600d60e08401526101008301849052610120830193909352606761014083015262001844929091906200257a565b506040518060800160405280604051806040016040528060038152602001620b0b0b60eb1b8152508152602001604051806060016040528060308152602001620069bc6030913981526020016040518060400160405280601581526020017f4d332c36563448355630483139563448323156365a000000000000000000000081525081526020016040518060400160405280601081526020016f2698961aab1b2419182b18a41a2b1aad60811b815250815250602c9060046200190992919062002528565b506040805160c081018252600460808201818152634e6f6e6560e01b60a0840152825282518084018452600581526410995c995d60da1b6020828101919091528084019190915283518085018552600681526550616e616d6160d01b81830152838501528351808501909452600384526204361760ec1b9084015260608201929092526200199b91602d919062002528565b50604080516080810182526103e58152606560208201526067918101919091526101336060820152620019d390602e9060046200242a565b50604080516101a08101825260066101608201818152651c1c99a1232360d11b6101808401528252825180840184528181526537443035343160d01b60208281019190915280840191909152835180850185528281526534433738374560d01b818301528385015283518085018552828152651a1c19a1999960d11b818301819052606085019190915284518086018652838152651ca29ba1232360d11b818401526080850152845180860186528381526504146394236360d41b8184015260a0850152845180860186528381526503438363341360d41b8184015260c085015284518086018652838152651b999b20a32360d11b8184015260e08501528451808601865283815280830191909152610100840152835180850185528281526503030303038360d41b8183015261012084015283518085019094529083526538303035313760d01b9083015261014081019190915262001b3890602f90600b6200277f565b50604080516101a081018252600d61016082018181526c417a7465636820507572706c6560981b6101808401528252825180840184526008815267506c756d2050696560c01b6020828101919091528084019190915283518085018552600c8082526b2132b2ba36329023b932b2b760a11b8284015284860191909152845180860186526005815264546175706560d81b818401526060850152845180860186529283526c507572706c65204d696d6f736160981b838301526080840192909252835180850185529182526b109d5b1b195d0814da195b1b60a21b8282015260a083019190915282518084018452600a815269537465656c20426c756560b01b8183015260c083015282518084018452601081526f4c6967687420536c61746520426c756560801b8183015260e083015282518084018452600e81526d53756e72697365204f72616e676560901b81830152610100830152825180840184526009808252684e61767920426c756560b81b82840152610120840191909152835180850190945283526846697265627269636b60b81b9083015261014081019190915262001cea90603090600b6200277f565b50604080516101608101825260078152600560208201526025918101919091526017606082015260656080820152604760a0820152602b60c0820152601160e082015260896101008201526102e7610120820152606761014082015262001d5690603190600b6200242a565b506040518060c001604052806040518060400160405280601b81526020017f4d392c31395631364831355631394831345631374831305631395a000000000081525081526020016040518060600160405280602d815260200162006890602d91398152602001604051806080016040528060448152602001620067ba6044913981526020016040518060c0016040528060838152602001620064b16083913981526020016040518060a00160405280606c815260200162006445606c913981526020016040518060c001604052806082815260200162006a1460829139905262001e45906032906006620027d1565b506040805161010081018252600960c08201908152684675204d616e63687560b81b60e08301528152815180830183526005808252645a6170706160d81b602083810191909152808401929092528351808501855260088082526756616e2044796b6560c01b82850152848601919091528451808601865290815267111d58dadd185a5b60c21b8184015260608401528351808501855290815264109bde195960da1b8183015260808301528251808401909352600e83526d119d5b1b08155b9d1bdd58da195960921b9083015260a081019190915262001f2b906033906006620027d1565b506040805160c081018252602b81526013602082015260479181019190915260536060820152600d6080820152608360a082015262001f6f9060349060066200257a565b50604080516101a081018252600661016082018181526538303635313760d01b610180840152825282518084018452818152652323231c219b60d11b60208281019190915280840191909152835180850185528281526503030303030360d41b81830152838501528351808501855282815265115111104dcd60d21b818301526060840152835180850185528281526536313644374560d01b81830152608084015283518085018552828152650d8c8d510d5160d21b8183015260a0840152835180850185528281526546464438303160d01b8183015260c0840152835180850185528281526543363845313760d01b8183015260e084015283518085018552828152651c199aa199a160d11b81830152610100840152835180850185528281526537453338313760d01b8183015261012084015283518085019094529083526522a12222229960d11b90830152610140810191909152620020d690603590600b6200277f565b50604080516101a081018252600961016082018181526827b0b590213937bbb760b91b610180840152825282518084018452600d81526c2632b6b7b71021b434b33337b760991b60208281019190915280840191909152835180850185526005815264426c61636b60d81b8183015283850152835180850185529182526811dbdb19195b9c9bd960ba1b8282015260608301919091528251808401845260088152674a6574204772617960c01b81830152608083015282518084018452600b8082526a436172626f6e204772617960a81b8284015260a084019190915283518085018552600681526523b7b63232b760d11b8184015260c08401528351808501855260078082526610d85c985b595b60ca1b8285015260e085019190915284518086018652600a815269213937bbb7102132b0b960b11b81850152610100850152845180860186529081526653616e6772696160c81b81840152610120840152835180850190945260128452714c6176656e6465722050696e6f636368696f60701b918401919091526101408201929092526200227791603691906200277f565b50604080516101608101825260178152601f6020820152602b918101919091526035606082015260476080820152605360a0820152606760c082015260d360e0820152610139610100820152609561012082015260b3610140820152620022e390603790600b6200242a565b50348015620022f157600080fd5b50604080518082018252600d81526c27b721b430b4b72a30b93d30b760991b60208083019182528351808501909452600684526527a1aa292d2760d11b908401528151919291620023459160009162002823565b5080516200235b90600190602084019062002823565b50506001600a55506200236e3362002374565b62002957565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805482825590600052602060002090810192821562002418579160200282015b828111156200241857825180516200240791849160209091019062002823565b5091602001919060010190620023e7565b5062002426929150620028a0565b5090565b82805482825590600052602060002090600f01601090048101928215620024c85791602002820160005b838211156200249657835183826101000a81548161ffff021916908361ffff160217905550926020019260020160208160010104928301926001030262002454565b8015620024c65782816101000a81549061ffff021916905560020160208160010104928301926001030262002496565b505b5062002426929150620028c1565b82805482825590600052602060002090810192821562002418579160200282015b828111156200241857825180516200251791849160209091019062002823565b5091602001919060010190620024f7565b82805482825590600052602060002090810192821562002418579160200282015b828111156200241857825180516200256991849160209091019062002823565b509160200191906001019062002549565b82805482825590600052602060002090600f01601090048101928215620024c85791602002820160005b838211156200249657835183826101000a81548161ffff021916908360ff1602179055509260200192600201602081600101049283019260010302620025a4565b82805482825590600052602060002090810192821562002418579160200282015b828111156200241857825180516200262691849160209091019062002823565b509160200191906001019062002606565b82805482825590600052602060002090810192821562002418579160200282015b828111156200241857825180516200267891849160209091019062002823565b509160200191906001019062002658565b82805482825590600052602060002090810192821562002418579160200282015b82811115620024185782518051620026ca91849160209091019062002823565b5091602001919060010190620026aa565b82805482825590600052602060002090810192821562002418579160200282015b828111156200241857825180516200271c91849160209091019062002823565b5091602001919060010190620026fc565b82805482825590600052602060002090810192821562002418579160200282015b828111156200241857825180516200276e91849160209091019062002823565b50916020019190600101906200274e565b82805482825590600052602060002090810192821562002418579160200282015b82811115620024185782518051620027c091849160209091019062002823565b5091602001919060010190620027a0565b82805482825590600052602060002090810192821562002418579160200282015b828111156200241857825180516200281291849160209091019062002823565b5091602001919060010190620027f2565b82805462002831906200291a565b90600052602060002090601f016020900481019282620028555760008555620024c8565b82601f106200287057805160ff1916838001178555620024c8565b82800160010185558215620024c8579182015b82811115620024c857825182559160200191906001019062002883565b8082111562002426576000620028b78282620028d8565b50600101620028a0565b5b80821115620024265760008155600101620028c2565b508054620028e6906200291a565b6000825580601f10620028f7575050565b601f016020900490600052602060002090810190620029179190620028c1565b50565b600181811c908216806200292f57607f821691505b602082108114156200295157634e487b7160e01b600052602260045260246000fd5b50919050565b61393080620029676000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80636871ee40116100b857806395d89b411161007c57806395d89b4114610271578063a22cb46514610279578063b88d4fde1461028c578063c87b56dd1461029f578063e985e9c5146102b2578063f2fde38b146102ee57600080fd5b80636871ee401461022a57806370942fc11461023257806370a0823114610245578063715018a6146102585780638da5cb5b1461026057600080fd5b806323b872dd116100ff57806323b872dd146101cb5780632f745c59146101de57806342842e0e146101f15780634f6ccce7146102045780636352211e1461021757600080fd5b806301ffc9a71461013c57806306fdde0314610164578063081812fc14610179578063095ea7b3146101a457806318160ddd146101b9575b600080fd5b61014f61014a366004612c62565b610301565b60405190151581526020015b60405180910390f35b61016c61032c565b60405161015b91906135b3565b61018c610187366004612c9c565b6103be565b6040516001600160a01b03909116815260200161015b565b6101b76101b2366004612c38565b610458565b005b6008545b60405190815260200161015b565b6101b76101d9366004612ae4565b61056e565b6101bd6101ec366004612c38565b61059f565b6101b76101ff366004612ae4565b610635565b6101bd610212366004612c9c565b610650565b61018c610225366004612c9c565b6106e3565b6101b761075a565b6101b7610240366004612c9c565b6107ee565b6101bd610253366004612a8f565b6108a0565b6101b7610927565b600b546001600160a01b031661018c565b61016c61095d565b6101b7610287366004612bfc565b61096c565b6101b761029a366004612b20565b61097b565b61016c6102ad366004612c9c565b6109b3565b61014f6102c0366004612ab1565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6101b76102fc366004612a8f565b610dbc565b60006001600160e01b0319821663780e9d6360e01b1480610326575061032682610e57565b92915050565b60606000805461033b9061372c565b80601f01602080910402602001604051908101604052809291908181526020018280546103679061372c565b80156103b45780601f10610389576101008083540402835291602001916103b4565b820191906000526020600020905b81548152906001019060200180831161039757829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661043c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610463826106e3565b9050806001600160a01b0316836001600160a01b031614156104d15760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610433565b336001600160a01b03821614806104ed57506104ed81336102c0565b61055f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610433565b6105698383610ea7565b505050565b6105783382610f15565b6105945760405162461bcd60e51b81526004016104339061364d565b61056983838361100c565b60006105aa836108a0565b821061060c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610433565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6105698383836040518060200160405280600081525061097b565b600061065b60085490565b82106106be5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610433565b600882815481106106d1576106d16137d8565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806103265760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610433565b6002600a5414156107ad5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610433565b6002600a5560006107bd600c5490565b9050611e0081106107cd57600080fd5b6107db600c80546001019055565b6107e6335b826111b7565b506001600a55565b6002600a5414156108415760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610433565b6002600a55600b546001600160a01b031633146108705760405162461bcd60e51b815260040161043390613618565b611dff81118015610882575061200081105b61088b57600080fd5b6107e66107e0600b546001600160a01b031690565b60006001600160a01b03821661090b5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610433565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146109515760405162461bcd60e51b815260040161043390613618565b61095b60006111d1565b565b60606001805461033b9061372c565b610977338383611223565b5050565b6109853383610f15565b6109a15760405162461bcd60e51b81526004016104339061364d565b6109ad848484846112f2565b50505050565b6000818152600260205260409020546060906001600160a01b0316610a265760405162461bcd60e51b8152602060048201526024808201527f4552433732314d657461646174613a204465656420646f6573206e6f742065786044820152636973742160e01b6064820152608401610433565b60608060006040518060a00160405280607d815260200161385b607d91396040805180820190915260018152605b60f81b6020820152909150610a6886611325565b6040519195509350610a809082908590602001612ded565b60405160208183030381529060405290508184604051602001610aa4929190612dbe565b6040516020818303038152906040529150610abe8661143d565b6040519195509350610ad69082908590602001612ded565b60405160208183030381529060405290508184604051602001610afa929190612dbe565b6040516020818303038152906040529150610b148661174d565b6040519195509350610b2c9082908590602001612ded565b60405160208183030381529060405290508184604051602001610b50929190612dbe565b6040516020818303038152906040529150610b6a86611928565b6040519195509350610b829082908590602001612ded565b60405160208183030381529060405290508184604051602001610ba6929190612dbe565b6040516020818303038152906040529150610bc086611ae5565b6040519195509350610bd89082908590602001612ded565b60405160208183030381529060405290508184604051602001610bfc929190612dbe565b6040516020818303038152906040529150610c1686611ca2565b6040519195509350610c2e9082908590602001612ded565b60405160208183030381529060405290508184604051602001610c52929190612dbe565b6040516020818303038152906040529150610c6c86611e60565b6040519195509350610c849082908590602001612ded565b60405160208183030381529060405290508184604051602001610ca8929190612dbe565b6040516020818303038152906040529150610cc2866120e6565b6040519195509350610cda9082908590602001612dbe565b60405160208183030381529060405290508184604051602001610cfe929190612dbe565b604051602081830303815290604052915081604051602001610d209190612e4d565b604051602081830303815290604052915080604051602001610d429190612e28565b60405160208183030381529060405290506000610d91610d61886122a5565b610d6a856123a3565b84604051602001610d7d93929190612e77565b6040516020818303038152906040526123a3565b604051602001610da191906131cd565b60408051601f19818403018152919052979650505050505050565b600b546001600160a01b03163314610de65760405162461bcd60e51b815260040161043390613618565b6001600160a01b038116610e4b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610433565b610e54816111d1565b50565b60006001600160e01b031982166380ac58cd60e01b1480610e8857506001600160e01b03198216635b5e139f60e01b145b8061032657506301ffc9a760e01b6001600160e01b0319831614610326565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610edc826106e3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316610f8e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610433565b6000610f99836106e3565b9050806001600160a01b0316846001600160a01b03161480610fd45750836001600160a01b0316610fc9846103be565b6001600160a01b0316145b8061100457506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661101f826106e3565b6001600160a01b0316146110875760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610433565b6001600160a01b0382166110e95760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610433565b6110f4838383612509565b6110ff600082610ea7565b6001600160a01b03831660009081526003602052604081208054600192906111289084906136e9565b90915550506001600160a01b038216600090815260036020526040812080546001929061115690849061369e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6109778282604051806020016040528060008152506125c1565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156112855760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610433565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6112fd84848461100c565b611309848484846125f4565b6109ad5760405162461bcd60e51b8152600401610433906135c6565b60608060006113af84600f8054806020026020016040519081016040528092919081815260200182805480156113a257602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116113695790505b5050505050612000612701565b90506000600d82815481106113c6576113c66137d8565b906000526020600020016040516020016113e09190613288565b60405160208183030381529060405290506000600e8381548110611406576114066137d8565b906000526020600020016040516020016114209190613212565b60408051601f198184030181529190529196919550909350505050565b606080606060006114c88560138054806020026020016040519081016040528092919081815260200182805480156114bc57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116114835790505b50505050506006612701565b90506000601182815481106114df576114df6137d8565b9060005260206000200180546114f49061372c565b80601f01602080910402602001604051908101604052809291908181526020018280546115209061372c565b801561156d5780601f106115425761010080835404028352916020019161156d565b820191906000526020600020905b81548152906001019060200180831161155057829003601f168201915b50505050509050600081905060008160008151811061158e5761158e6137d8565b602001015160f81c60f81b826001815181106115ac576115ac6137d8565b602001015160f81c60f81b836002815181106115ca576115ca6137d8565b016020908101516040516001600160f81b031994851692810192909252918316602182015291166022820152602301604051602081830303815290604052905060008260038151811061161f5761161f6137d8565b602001015160f81c60f81b8360048151811061163d5761163d6137d8565b602001015160f81c60f81b8460058151811061165b5761165b6137d8565b016020908101516040516001600160f81b031994851692810192909252918316602182015291166022820152602301604051602081830303815290604052905060106000815481106116af576116af6137d8565b906000526020600020018260106001815481106116ce576116ce6137d8565b90600052602060002001836040516020016116ec949392919061307c565b6040516020818303038152906040529550600060128681548110611712576117126137d8565b9060005260206000200160405160200161172c9190613507565b60408051601f19818403018152919052969a96995095975050505050505050565b60608060608060006117d98660168054806020026020016040519081016040528092919081815260200182805480156117cd57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116117945790505b50505050506007612701565b9050600061186187601980548060200260200160405190810160405280929190818152602001828054801561185557602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161181c5790505b5050505050604e612701565b905060148281548110611876576118766137d8565b9060005260206000200160178281548110611893576118936137d8565b906000526020600020016040516020016118ae929190613119565b6040516020818303038152906040529350601881815481106118d2576118d26137d8565b90600052602060002001601583815481106118ef576118ef6137d8565b9060005260206000200160405160200161190a929190613018565b60408051601f19818403018152919052939793965092945050505050565b60608060608060006119b486601c8054806020026020016040519081016040528092919081815260200182805480156119a857602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161196f5790505b50505050506027612701565b90506000611a3c87601f805480602002602001604051908101604052809291908181526020018280548015611a3057602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116119f75790505b50505050506008612701565b9050601a8281548110611a5157611a516137d8565b90600052602060002001601d8281548110611a6e57611a6e6137d8565b90600052602060002001604051602001611a89929190613119565b6040516020818303038152906040529350601e8181548110611aad57611aad6137d8565b90600052602060002001601b8381548110611aca57611aca6137d8565b9060005260206000200160405160200161190a92919061319b565b6060806060806000611b71866022805480602002602001604051908101604052809291908181526020018280548015611b6557602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411611b2c5790505b5050505050601f612701565b90506000611bf9876025805480602002602001604051908101604052809291908181526020018280548015611bed57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411611bb45790505b5050505050606c612701565b905060208281548110611c0e57611c0e6137d8565b9060005260206000200160238281548110611c2b57611c2b6137d8565b90600052602060002001604051602001611c46929190613119565b604051602081830303815290604052935060248181548110611c6a57611c6a6137d8565b9060005260206000200160218381548110611c8757611c876137d8565b9060005260206000200160405160200161190a929190613539565b6060806060806000611d2e866028805480602002602001604051908101604052809291908181526020018280548015611d2257602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411611ce95790505b50505050506087612701565b90506000611db787602b805480602002602001604051908101604052809291908181526020018280548015611daa57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411611d715790505b5050505050610171612701565b905060268281548110611dcc57611dcc6137d8565b9060005260206000200160298281548110611de957611de96137d8565b90600052602060002001604051602001611e04929190613119565b6040516020818303038152906040529350602a8181548110611e2857611e286137d8565b9060005260206000200160278381548110611e4557611e456137d8565b9060005260206000200160405160200161190a9291906134d5565b6060806060806000611eed86602e805480602002602001604051908101604052809291908181526020018280548015611ee057602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411611ea75790505b50505050506105e4612701565b9050602c8181548110611f0257611f026137d8565b90600052602060002001604051611f199190612db2565b60405180910390207fc679ad1c8c8141266b59870c14c6b333ddc707ff9b838b951279df27b722407e1461208e576000611fce876031805480602002602001604051908101604052809291908181526020018280548015611fc157602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411611f885790505b5050505050610507612701565b9050602c8281548110611fe357611fe36137d8565b90600052602060002001602f8281548110612000576120006137d8565b9060005260206000200160405160200161201b929190613119565b60405160208183030381529060405293506030818154811061203f5761203f6137d8565b90600052602060002001602d838154811061205c5761205c6137d8565b90600052602060002001604051602001612077929190613169565b6040516020818303038152906040529250506120db565b6040518060200160405280600081525092506040518060600160405280602381526020016138d8602391396040516020016120c99190612d96565b60405160208183030381529060405291505b509094909350915050565b606080606080600061217386603480548060200260200160405190810160405280929190818152602001828054801561216657602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161212d5790505b5050505050610168612701565b905060006121fc8760378054806020026020016040519081016040528092919081815260200182805480156121ef57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116121b65790505b50505050506104eb612701565b905060328281548110612211576122116137d8565b906000526020600020016035828154811061222e5761222e6137d8565b90600052602060002001604051602001612249929190613119565b60405160208183030381529060405293506036818154811061226d5761226d6137d8565b906000526020600020016033838154811061228a5761228a6137d8565b9060005260206000200160405160200161190a929190613256565b6060816122c95750506040805180820190915260018152600360fc1b602082015290565b8160005b81156122f357806122dd81613767565b91506122ec9050600a836136b6565b91506122cd565b60008167ffffffffffffffff81111561230e5761230e6137ee565b6040519080825280601f01601f191660200182016040528015612338576020820181803683370190505b5090505b84156110045761234d6001836136e9565b915061235a600a86613782565b61236590603061369e565b60f81b81838151811061237a5761237a6137d8565b60200101906001600160f81b031916908160001a90535061239c600a866136b6565b945061233c565b8051606090806123c3575050604080516020810190915260008152919050565b600060036123d283600261369e565b6123dc91906136b6565b6123e79060046136ca565b905060006123f682602061369e565b67ffffffffffffffff81111561240e5761240e6137ee565b6040519080825280601f01601f191660200182016040528015612438576020820181803683370190505b509050600060405180606001604052806040815260200161381b604091399050600181016020830160005b868110156124c4576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612463565b5060038606600181146124de57600281146124ef576124fb565b613d3d60f01b6001198301526124fb565b603d60f81b6000198301525b505050918152949350505050565b6001600160a01b0383166125645761255f81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612587565b816001600160a01b0316836001600160a01b031614612587576125878382612795565b6001600160a01b03821661259e5761056981612832565b826001600160a01b0316826001600160a01b0316146105695761056982826128e1565b6125cb8383612925565b6125d860008484846125f4565b6105695760405162461bcd60e51b8152600401610433906135c6565b60006001600160a01b0384163b156126f657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612638903390899088908890600401613576565b602060405180830381600087803b15801561265257600080fd5b505af1925050508015612682575060408051601f3d908101601f1916820190925261267f91810190612c7f565b60015b6126dc573d8080156126b0576040519150601f19603f3d011682016040523d82523d6000602084013e6126b5565b606091505b5080516126d45760405162461bcd60e51b8152600401610433906135c6565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611004565b506001949350505050565b6000808261270e866122a5565b80516020909101206127209190613782565b9050600080858281518110612737576127376137d8565b602002602001015161ffff1690505b8083111561278b578161275881613767565b92505085828151811061276d5761276d6137d8565b602002602001015161ffff1681612784919061369e565b9050612746565b5095945050505050565b600060016127a2846108a0565b6127ac91906136e9565b6000838152600760205260409020549091508082146127ff576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612844906001906136e9565b6000838152600960205260408120546008805493945090928490811061286c5761286c6137d8565b90600052602060002001549050806008838154811061288d5761288d6137d8565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806128c5576128c56137c2565b6001900381819060005260206000200160009055905550505050565b60006128ec836108a0565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821661297b5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610433565b6000818152600260205260409020546001600160a01b0316156129e05760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610433565b6129ec60008383612509565b6001600160a01b0382166000908152600360205260408120805460019290612a1590849061369e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b80356001600160a01b0381168114612a8a57600080fd5b919050565b600060208284031215612aa157600080fd5b612aaa82612a73565b9392505050565b60008060408385031215612ac457600080fd5b612acd83612a73565b9150612adb60208401612a73565b90509250929050565b600080600060608486031215612af957600080fd5b612b0284612a73565b9250612b1060208501612a73565b9150604084013590509250925092565b60008060008060808587031215612b3657600080fd5b612b3f85612a73565b9350612b4d60208601612a73565b925060408501359150606085013567ffffffffffffffff80821115612b7157600080fd5b818701915087601f830112612b8557600080fd5b813581811115612b9757612b976137ee565b604051601f8201601f19908116603f01168101908382118183101715612bbf57612bbf6137ee565b816040528281528a6020848701011115612bd857600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215612c0f57600080fd5b612c1883612a73565b915060208301358015158114612c2d57600080fd5b809150509250929050565b60008060408385031215612c4b57600080fd5b612c5483612a73565b946020939093013593505050565b600060208284031215612c7457600080fd5b8135612aaa81613804565b600060208284031215612c9157600080fd5b8151612aaa81613804565b600060208284031215612cae57600080fd5b5035919050565b60008151808452612ccd816020860160208601613700565b601f01601f19169290920160200192915050565b60008151612cf3818560208601613700565b9290920192915050565b8054600090600181811c9080831680612d1757607f831692505b6020808410821415612d3957634e487b7160e01b600052602260045260246000fd5b818015612d4d5760018114612d5e57612d8a565b60ff19861689528489019650612d8a565b876000528160002060005b86811015612d825781548b820152908501908301612d69565b505084890196505b50505050505092915050565b60008251612da8818460208701613700565b9190910192915050565b6000612aaa8284612cfd565b60008351612dd0818460208801613700565b835190830190612de4818360208801613700565b01949350505050565b60008351612dff818460208801613700565b835190830190612e13818360208801613700565b600b60fa1b9101908152600101949350505050565b60008251612e3a818460208701613700565b605d60f81b920191825250600101919050565b60008251612e5f818460208701613700565b651e17b9bb339f60d11b920191825250600601919050565b7f7b226e616d65223a20224f6e436861696e5461727a616e202300000000000000815260008451612eaf816019850160208901613700565b7f222c20226465736372697074696f6e223a20224f6e436861696e5461727a616e6019918401918201527f206973206275696c64696e672061204d65746176657273652046554c4c59204f60398201527f6e636861696e2120416c6c20746865206d6574616461746120616e6420696d6160598201527f676573206172652067656e65726174656420616e642073746f7265642031303060798201527f25206f6e2d636861696e2e204e6f20495046532c206e6f204150492e204d657260998201527f656c7920457468657265756d20626c6f636b636861696e2e222c2022696d616760b98201527f65223a2022646174613a696d6167652f7376672b786d6c3b6261736536342c0060d98201528451612fd08160f8840160208901613700565b61300d613000612ffa60f8848601016e11161130ba3a3934b13aba32b9911d60891b8152600f0190565b87612ce1565b607d60f81b815260010190565b979650505050505050565b7f7b2274726169745f74797065223a2245617272696e67222c2276616c7565223a8152601160f91b602082015260006130546021830185612cfd565b600160fd1b81526130686001820185612cfd565b61227d60f01b815260020195945050505050565b681e3830ba3410321e9160b91b80825260009061309c6009840188612cfd565b68222066696c6c3d222360b81b80825287516130bf816009850160208c01613700565b631110179f60e11b920160098101839052600d8101849052916130e56016840189612cfd565b9350818452865192506130ff836009860160208a01613700565b919092016009810191909152600d01979650505050505050565b681e3830ba3410321e9160b91b815260006131376009830185612cfd565b68222066696c6c3d222360b81b81526131536009820185612cfd565b631110179f60e11b815260040195945050505050565b7f7b2274726169745f74797065223a22486174222c2276616c7565223a2200000081526000613054601d830185612cfd565b7f7b2274726169745f74797065223a22546174746f6f222c2276616c7565223a22815260006130546020830185612cfd565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161320581601d850160208701613700565b91909101601d0192915050565b7f7b2274726169745f74797065223a22536b696e222c2276616c7565223a22000081526000613244601e830184612cfd565b61227d60f01b81526002019392505050565b7f7b2274726169745f74797065223a224265617264222c2276616c7565223a220081526000613054601f830185612cfd565b7f3c7061746820643d224d352c364836563548375634483137563548313856364881527f313956313848313856313948313756323048313656323448385632304837563160208201527139483656313848355a222066696c6c3d222360701b604082015260006132fb6052830184612cfd565b631110179f60e11b81527f3c7061746820643d224d382c323456323048375631394836563138483556364860048201527f365635483756344831375635483138563648313956313848313856313948313760248201527f563230483136563234483137563230483138563139483139563138483230563160448201527f334832315639483230563648313956354831385634483137563348375634483660648201527f56354835563648345639483356313348345631384835563139483656323048376084820152732b191a2d11103334b6361e91119999999110179f60611b60a48201527f3c7061746820643d224d372c313356313248365631314835563130483756394860b88201527f395631304831305631314831315631324831335631314831345631304831355660d88201527f394831375631304831395631314831385631324831375631334831355631324860f8820152731cab1899ad11103334b6361e9111a2222211179f60611b6101188201527f3c7061746820643d224d31322c3136483131563135483133563136483132563161012c8201527f374831345631384831305631374831325631365a222066696c6c3d222333333361014c8201526211179f60e91b61016c82015261016f8101611004565b7f7b2274726169745f74797065223a2248616972222c2276616c7565223a22000081526000613054601e830185612cfd565b7f7b2274726169745f74797065223a2245796573222c2276616c7565223a22000081526000613244601e830184612cfd565b7f7b2274726169745f74797065223a224579657061746368222c2276616c7565228152611d1160f11b602082015260006130546022830185612cfd565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906135a990830184612cb5565b9695505050505050565b602081526000612aaa6020830184612cb5565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156136b1576136b1613796565b500190565b6000826136c5576136c56137ac565b500490565b60008160001904831182151516156136e4576136e4613796565b500290565b6000828210156136fb576136fb613796565b500390565b60005b8381101561371b578181015183820152602001613703565b838111156109ad5750506000910152565b600181811c9082168061374057607f821691505b6020821081141561376157634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561377b5761377b613796565b5060010190565b600082613791576137916137ac565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610e5457600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222073686170652d72656e646572696e673d2263726973704564676573222076696577426f783d22302030203234203234223e7b2274726169745f74797065223a22486174222c2276616c7565223a224e6f6e65227da2646970667358221220a4daa25774d88fa74a7982a6ff57f04d5f66e3ab4a405ba7a284134fe2aaa9f764736f6c634300080700334d322c32305636483356354834563448355633483656324831385633483139563448323056354832315636483232563230483231563231483230563232483139563233483138563234483137563230483138563139483139563138483230563133483231563130483230563948313956364831385635483137563448375635483656364835563948345631304833563133483456313848355631394836563230483756323448365632334835563232483456323148335632305a4d342c36563448355633483656324831385633483139563448323056364831385635483137563448375635483656365a4d322c3230563648335635483456344835563348365632483138563348313956344832305635483231563648323256313748323256323048323156313848323056323248313956323048313856323448313756323048313856313948313956313748323056313348323156313048323056394831395636483138563548313756344837563548365636483556394834563130483356313348345631384835563139483656323048375632344836563230483556323248345631384833563230483256365a4d31302c313748375631364836563135483556313848365631394837563230483856323148313656323048313756313948313856313848313956313548313856313648313756313748313556313648395631374831345631394831335631384831315631394831305631375a4d392c323048375631394836563138483556313548365631364837563137483956313648313556313748313756313648313856313548313956313848313856313948313756323048313556323148313456323248313356323348313156323248313056323148395632304831315631384831335632304831345631374831305632305a4d332c3130563948323156313048313956313348313356313048313156313348355631305a4d342c3130563848323056313048313756394831355631304831345631324831355631334831375631324831385631304832305631344833563136483156313448335631334834563131483656313248375631334839563132483130563130483956394837563130483656313148345a4d372c313048385631314839563132483135563131483136563130483137563131483136563132483856313148375a4d372c31325631314838563130483136563131483137563132483136563131483135563130483956313148385631325a4d342c31335639483356354834563448355633483656324831385633483139563448323056354832315639483230563133483139563648313856354831375634483756354836563648355631335a4d332c395638483231563948313856313248313756313348313656313448313556313348313456313248313356395a4d392c32325632314831305632324831315632314831335632324831345632314831355632324831345632334831335632324831315632334831305632325a4d322c3230563648335635483456344835563348365632483138563348313956344832305635483231563648323256313748323256323048323156313848323056323248313956323048313856323448313756323048313856313948313956313748323056313348323156313048323056394831395636483138563548313756344831315637483130563448395638483856344837563848365636483556394834563130483356313348345631384835563139483656323048375632344836563230483556323248345631384833563230483256365a4d392c323056313648313556323148313456323248313356323348313156323248313056323148395632304831315631384831335632304831345631374831305632305a4d332c3956384832315639483131563132483130563133483956313448385631334837563132483656395a4d392c32335632324831305632314831315632324831335632314831345632324831355632334831345632324831335632334831315632324831305632335a4d31302c32335632324831315632314831335632324831345632334831335632324831315632335a4d392c32305631364831355632304831345631374831305631384831335631394831315631384831305632305a4d322c32305636483356354834563448355633483656324831385633483139563448323056354832315636483232563230483231563231483230563232483139563233483138563234483137563230483138563139483139563138483230563133483231563130483230563948313956364831385635483137563448313556364831335638483131563130483956313248375631344835563136483456313848355631394836563230483756323448365632334835563232483456323148335632305a4d332c31305639483231563130483139563132483138563133483134563132483133563130483131563132483130563133483656313248355631305a4d332c38563448345633483556324836563148375630483137563148313856324831395633483230563448323156385a4d31302c32325632314831315632324831335632314831345632324831335632334831315632325a4d31302c31374837563136483656313548355631344834563139483556323048365632314837563232483956323348313156323448313356323348313556323248313756323148313856323048313956313948323056313448313956313548313856313648313756313748313556313648395631374831345631384831305631375a

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101375760003560e01c80636871ee40116100b857806395d89b411161007c57806395d89b4114610271578063a22cb46514610279578063b88d4fde1461028c578063c87b56dd1461029f578063e985e9c5146102b2578063f2fde38b146102ee57600080fd5b80636871ee401461022a57806370942fc11461023257806370a0823114610245578063715018a6146102585780638da5cb5b1461026057600080fd5b806323b872dd116100ff57806323b872dd146101cb5780632f745c59146101de57806342842e0e146101f15780634f6ccce7146102045780636352211e1461021757600080fd5b806301ffc9a71461013c57806306fdde0314610164578063081812fc14610179578063095ea7b3146101a457806318160ddd146101b9575b600080fd5b61014f61014a366004612c62565b610301565b60405190151581526020015b60405180910390f35b61016c61032c565b60405161015b91906135b3565b61018c610187366004612c9c565b6103be565b6040516001600160a01b03909116815260200161015b565b6101b76101b2366004612c38565b610458565b005b6008545b60405190815260200161015b565b6101b76101d9366004612ae4565b61056e565b6101bd6101ec366004612c38565b61059f565b6101b76101ff366004612ae4565b610635565b6101bd610212366004612c9c565b610650565b61018c610225366004612c9c565b6106e3565b6101b761075a565b6101b7610240366004612c9c565b6107ee565b6101bd610253366004612a8f565b6108a0565b6101b7610927565b600b546001600160a01b031661018c565b61016c61095d565b6101b7610287366004612bfc565b61096c565b6101b761029a366004612b20565b61097b565b61016c6102ad366004612c9c565b6109b3565b61014f6102c0366004612ab1565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6101b76102fc366004612a8f565b610dbc565b60006001600160e01b0319821663780e9d6360e01b1480610326575061032682610e57565b92915050565b60606000805461033b9061372c565b80601f01602080910402602001604051908101604052809291908181526020018280546103679061372c565b80156103b45780601f10610389576101008083540402835291602001916103b4565b820191906000526020600020905b81548152906001019060200180831161039757829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661043c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610463826106e3565b9050806001600160a01b0316836001600160a01b031614156104d15760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610433565b336001600160a01b03821614806104ed57506104ed81336102c0565b61055f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610433565b6105698383610ea7565b505050565b6105783382610f15565b6105945760405162461bcd60e51b81526004016104339061364d565b61056983838361100c565b60006105aa836108a0565b821061060c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610433565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6105698383836040518060200160405280600081525061097b565b600061065b60085490565b82106106be5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610433565b600882815481106106d1576106d16137d8565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806103265760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610433565b6002600a5414156107ad5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610433565b6002600a5560006107bd600c5490565b9050611e0081106107cd57600080fd5b6107db600c80546001019055565b6107e6335b826111b7565b506001600a55565b6002600a5414156108415760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610433565b6002600a55600b546001600160a01b031633146108705760405162461bcd60e51b815260040161043390613618565b611dff81118015610882575061200081105b61088b57600080fd5b6107e66107e0600b546001600160a01b031690565b60006001600160a01b03821661090b5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610433565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146109515760405162461bcd60e51b815260040161043390613618565b61095b60006111d1565b565b60606001805461033b9061372c565b610977338383611223565b5050565b6109853383610f15565b6109a15760405162461bcd60e51b81526004016104339061364d565b6109ad848484846112f2565b50505050565b6000818152600260205260409020546060906001600160a01b0316610a265760405162461bcd60e51b8152602060048201526024808201527f4552433732314d657461646174613a204465656420646f6573206e6f742065786044820152636973742160e01b6064820152608401610433565b60608060006040518060a00160405280607d815260200161385b607d91396040805180820190915260018152605b60f81b6020820152909150610a6886611325565b6040519195509350610a809082908590602001612ded565b60405160208183030381529060405290508184604051602001610aa4929190612dbe565b6040516020818303038152906040529150610abe8661143d565b6040519195509350610ad69082908590602001612ded565b60405160208183030381529060405290508184604051602001610afa929190612dbe565b6040516020818303038152906040529150610b148661174d565b6040519195509350610b2c9082908590602001612ded565b60405160208183030381529060405290508184604051602001610b50929190612dbe565b6040516020818303038152906040529150610b6a86611928565b6040519195509350610b829082908590602001612ded565b60405160208183030381529060405290508184604051602001610ba6929190612dbe565b6040516020818303038152906040529150610bc086611ae5565b6040519195509350610bd89082908590602001612ded565b60405160208183030381529060405290508184604051602001610bfc929190612dbe565b6040516020818303038152906040529150610c1686611ca2565b6040519195509350610c2e9082908590602001612ded565b60405160208183030381529060405290508184604051602001610c52929190612dbe565b6040516020818303038152906040529150610c6c86611e60565b6040519195509350610c849082908590602001612ded565b60405160208183030381529060405290508184604051602001610ca8929190612dbe565b6040516020818303038152906040529150610cc2866120e6565b6040519195509350610cda9082908590602001612dbe565b60405160208183030381529060405290508184604051602001610cfe929190612dbe565b604051602081830303815290604052915081604051602001610d209190612e4d565b604051602081830303815290604052915080604051602001610d429190612e28565b60405160208183030381529060405290506000610d91610d61886122a5565b610d6a856123a3565b84604051602001610d7d93929190612e77565b6040516020818303038152906040526123a3565b604051602001610da191906131cd565b60408051601f19818403018152919052979650505050505050565b600b546001600160a01b03163314610de65760405162461bcd60e51b815260040161043390613618565b6001600160a01b038116610e4b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610433565b610e54816111d1565b50565b60006001600160e01b031982166380ac58cd60e01b1480610e8857506001600160e01b03198216635b5e139f60e01b145b8061032657506301ffc9a760e01b6001600160e01b0319831614610326565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610edc826106e3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316610f8e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610433565b6000610f99836106e3565b9050806001600160a01b0316846001600160a01b03161480610fd45750836001600160a01b0316610fc9846103be565b6001600160a01b0316145b8061100457506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661101f826106e3565b6001600160a01b0316146110875760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610433565b6001600160a01b0382166110e95760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610433565b6110f4838383612509565b6110ff600082610ea7565b6001600160a01b03831660009081526003602052604081208054600192906111289084906136e9565b90915550506001600160a01b038216600090815260036020526040812080546001929061115690849061369e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6109778282604051806020016040528060008152506125c1565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156112855760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610433565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6112fd84848461100c565b611309848484846125f4565b6109ad5760405162461bcd60e51b8152600401610433906135c6565b60608060006113af84600f8054806020026020016040519081016040528092919081815260200182805480156113a257602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116113695790505b5050505050612000612701565b90506000600d82815481106113c6576113c66137d8565b906000526020600020016040516020016113e09190613288565b60405160208183030381529060405290506000600e8381548110611406576114066137d8565b906000526020600020016040516020016114209190613212565b60408051601f198184030181529190529196919550909350505050565b606080606060006114c88560138054806020026020016040519081016040528092919081815260200182805480156114bc57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116114835790505b50505050506006612701565b90506000601182815481106114df576114df6137d8565b9060005260206000200180546114f49061372c565b80601f01602080910402602001604051908101604052809291908181526020018280546115209061372c565b801561156d5780601f106115425761010080835404028352916020019161156d565b820191906000526020600020905b81548152906001019060200180831161155057829003601f168201915b50505050509050600081905060008160008151811061158e5761158e6137d8565b602001015160f81c60f81b826001815181106115ac576115ac6137d8565b602001015160f81c60f81b836002815181106115ca576115ca6137d8565b016020908101516040516001600160f81b031994851692810192909252918316602182015291166022820152602301604051602081830303815290604052905060008260038151811061161f5761161f6137d8565b602001015160f81c60f81b8360048151811061163d5761163d6137d8565b602001015160f81c60f81b8460058151811061165b5761165b6137d8565b016020908101516040516001600160f81b031994851692810192909252918316602182015291166022820152602301604051602081830303815290604052905060106000815481106116af576116af6137d8565b906000526020600020018260106001815481106116ce576116ce6137d8565b90600052602060002001836040516020016116ec949392919061307c565b6040516020818303038152906040529550600060128681548110611712576117126137d8565b9060005260206000200160405160200161172c9190613507565b60408051601f19818403018152919052969a96995095975050505050505050565b60608060608060006117d98660168054806020026020016040519081016040528092919081815260200182805480156117cd57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116117945790505b50505050506007612701565b9050600061186187601980548060200260200160405190810160405280929190818152602001828054801561185557602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161181c5790505b5050505050604e612701565b905060148281548110611876576118766137d8565b9060005260206000200160178281548110611893576118936137d8565b906000526020600020016040516020016118ae929190613119565b6040516020818303038152906040529350601881815481106118d2576118d26137d8565b90600052602060002001601583815481106118ef576118ef6137d8565b9060005260206000200160405160200161190a929190613018565b60408051601f19818403018152919052939793965092945050505050565b60608060608060006119b486601c8054806020026020016040519081016040528092919081815260200182805480156119a857602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161196f5790505b50505050506027612701565b90506000611a3c87601f805480602002602001604051908101604052809291908181526020018280548015611a3057602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116119f75790505b50505050506008612701565b9050601a8281548110611a5157611a516137d8565b90600052602060002001601d8281548110611a6e57611a6e6137d8565b90600052602060002001604051602001611a89929190613119565b6040516020818303038152906040529350601e8181548110611aad57611aad6137d8565b90600052602060002001601b8381548110611aca57611aca6137d8565b9060005260206000200160405160200161190a92919061319b565b6060806060806000611b71866022805480602002602001604051908101604052809291908181526020018280548015611b6557602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411611b2c5790505b5050505050601f612701565b90506000611bf9876025805480602002602001604051908101604052809291908181526020018280548015611bed57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411611bb45790505b5050505050606c612701565b905060208281548110611c0e57611c0e6137d8565b9060005260206000200160238281548110611c2b57611c2b6137d8565b90600052602060002001604051602001611c46929190613119565b604051602081830303815290604052935060248181548110611c6a57611c6a6137d8565b9060005260206000200160218381548110611c8757611c876137d8565b9060005260206000200160405160200161190a929190613539565b6060806060806000611d2e866028805480602002602001604051908101604052809291908181526020018280548015611d2257602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411611ce95790505b50505050506087612701565b90506000611db787602b805480602002602001604051908101604052809291908181526020018280548015611daa57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411611d715790505b5050505050610171612701565b905060268281548110611dcc57611dcc6137d8565b9060005260206000200160298281548110611de957611de96137d8565b90600052602060002001604051602001611e04929190613119565b6040516020818303038152906040529350602a8181548110611e2857611e286137d8565b9060005260206000200160278381548110611e4557611e456137d8565b9060005260206000200160405160200161190a9291906134d5565b6060806060806000611eed86602e805480602002602001604051908101604052809291908181526020018280548015611ee057602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411611ea75790505b50505050506105e4612701565b9050602c8181548110611f0257611f026137d8565b90600052602060002001604051611f199190612db2565b60405180910390207fc679ad1c8c8141266b59870c14c6b333ddc707ff9b838b951279df27b722407e1461208e576000611fce876031805480602002602001604051908101604052809291908181526020018280548015611fc157602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411611f885790505b5050505050610507612701565b9050602c8281548110611fe357611fe36137d8565b90600052602060002001602f8281548110612000576120006137d8565b9060005260206000200160405160200161201b929190613119565b60405160208183030381529060405293506030818154811061203f5761203f6137d8565b90600052602060002001602d838154811061205c5761205c6137d8565b90600052602060002001604051602001612077929190613169565b6040516020818303038152906040529250506120db565b6040518060200160405280600081525092506040518060600160405280602381526020016138d8602391396040516020016120c99190612d96565b60405160208183030381529060405291505b509094909350915050565b606080606080600061217386603480548060200260200160405190810160405280929190818152602001828054801561216657602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161212d5790505b5050505050610168612701565b905060006121fc8760378054806020026020016040519081016040528092919081815260200182805480156121ef57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116121b65790505b50505050506104eb612701565b905060328281548110612211576122116137d8565b906000526020600020016035828154811061222e5761222e6137d8565b90600052602060002001604051602001612249929190613119565b60405160208183030381529060405293506036818154811061226d5761226d6137d8565b906000526020600020016033838154811061228a5761228a6137d8565b9060005260206000200160405160200161190a929190613256565b6060816122c95750506040805180820190915260018152600360fc1b602082015290565b8160005b81156122f357806122dd81613767565b91506122ec9050600a836136b6565b91506122cd565b60008167ffffffffffffffff81111561230e5761230e6137ee565b6040519080825280601f01601f191660200182016040528015612338576020820181803683370190505b5090505b84156110045761234d6001836136e9565b915061235a600a86613782565b61236590603061369e565b60f81b81838151811061237a5761237a6137d8565b60200101906001600160f81b031916908160001a90535061239c600a866136b6565b945061233c565b8051606090806123c3575050604080516020810190915260008152919050565b600060036123d283600261369e565b6123dc91906136b6565b6123e79060046136ca565b905060006123f682602061369e565b67ffffffffffffffff81111561240e5761240e6137ee565b6040519080825280601f01601f191660200182016040528015612438576020820181803683370190505b509050600060405180606001604052806040815260200161381b604091399050600181016020830160005b868110156124c4576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612463565b5060038606600181146124de57600281146124ef576124fb565b613d3d60f01b6001198301526124fb565b603d60f81b6000198301525b505050918152949350505050565b6001600160a01b0383166125645761255f81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612587565b816001600160a01b0316836001600160a01b031614612587576125878382612795565b6001600160a01b03821661259e5761056981612832565b826001600160a01b0316826001600160a01b0316146105695761056982826128e1565b6125cb8383612925565b6125d860008484846125f4565b6105695760405162461bcd60e51b8152600401610433906135c6565b60006001600160a01b0384163b156126f657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612638903390899088908890600401613576565b602060405180830381600087803b15801561265257600080fd5b505af1925050508015612682575060408051601f3d908101601f1916820190925261267f91810190612c7f565b60015b6126dc573d8080156126b0576040519150601f19603f3d011682016040523d82523d6000602084013e6126b5565b606091505b5080516126d45760405162461bcd60e51b8152600401610433906135c6565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611004565b506001949350505050565b6000808261270e866122a5565b80516020909101206127209190613782565b9050600080858281518110612737576127376137d8565b602002602001015161ffff1690505b8083111561278b578161275881613767565b92505085828151811061276d5761276d6137d8565b602002602001015161ffff1681612784919061369e565b9050612746565b5095945050505050565b600060016127a2846108a0565b6127ac91906136e9565b6000838152600760205260409020549091508082146127ff576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612844906001906136e9565b6000838152600960205260408120546008805493945090928490811061286c5761286c6137d8565b90600052602060002001549050806008838154811061288d5761288d6137d8565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806128c5576128c56137c2565b6001900381819060005260206000200160009055905550505050565b60006128ec836108a0565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821661297b5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610433565b6000818152600260205260409020546001600160a01b0316156129e05760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610433565b6129ec60008383612509565b6001600160a01b0382166000908152600360205260408120805460019290612a1590849061369e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b80356001600160a01b0381168114612a8a57600080fd5b919050565b600060208284031215612aa157600080fd5b612aaa82612a73565b9392505050565b60008060408385031215612ac457600080fd5b612acd83612a73565b9150612adb60208401612a73565b90509250929050565b600080600060608486031215612af957600080fd5b612b0284612a73565b9250612b1060208501612a73565b9150604084013590509250925092565b60008060008060808587031215612b3657600080fd5b612b3f85612a73565b9350612b4d60208601612a73565b925060408501359150606085013567ffffffffffffffff80821115612b7157600080fd5b818701915087601f830112612b8557600080fd5b813581811115612b9757612b976137ee565b604051601f8201601f19908116603f01168101908382118183101715612bbf57612bbf6137ee565b816040528281528a6020848701011115612bd857600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215612c0f57600080fd5b612c1883612a73565b915060208301358015158114612c2d57600080fd5b809150509250929050565b60008060408385031215612c4b57600080fd5b612c5483612a73565b946020939093013593505050565b600060208284031215612c7457600080fd5b8135612aaa81613804565b600060208284031215612c9157600080fd5b8151612aaa81613804565b600060208284031215612cae57600080fd5b5035919050565b60008151808452612ccd816020860160208601613700565b601f01601f19169290920160200192915050565b60008151612cf3818560208601613700565b9290920192915050565b8054600090600181811c9080831680612d1757607f831692505b6020808410821415612d3957634e487b7160e01b600052602260045260246000fd5b818015612d4d5760018114612d5e57612d8a565b60ff19861689528489019650612d8a565b876000528160002060005b86811015612d825781548b820152908501908301612d69565b505084890196505b50505050505092915050565b60008251612da8818460208701613700565b9190910192915050565b6000612aaa8284612cfd565b60008351612dd0818460208801613700565b835190830190612de4818360208801613700565b01949350505050565b60008351612dff818460208801613700565b835190830190612e13818360208801613700565b600b60fa1b9101908152600101949350505050565b60008251612e3a818460208701613700565b605d60f81b920191825250600101919050565b60008251612e5f818460208701613700565b651e17b9bb339f60d11b920191825250600601919050565b7f7b226e616d65223a20224f6e436861696e5461727a616e202300000000000000815260008451612eaf816019850160208901613700565b7f222c20226465736372697074696f6e223a20224f6e436861696e5461727a616e6019918401918201527f206973206275696c64696e672061204d65746176657273652046554c4c59204f60398201527f6e636861696e2120416c6c20746865206d6574616461746120616e6420696d6160598201527f676573206172652067656e65726174656420616e642073746f7265642031303060798201527f25206f6e2d636861696e2e204e6f20495046532c206e6f204150492e204d657260998201527f656c7920457468657265756d20626c6f636b636861696e2e222c2022696d616760b98201527f65223a2022646174613a696d6167652f7376672b786d6c3b6261736536342c0060d98201528451612fd08160f8840160208901613700565b61300d613000612ffa60f8848601016e11161130ba3a3934b13aba32b9911d60891b8152600f0190565b87612ce1565b607d60f81b815260010190565b979650505050505050565b7f7b2274726169745f74797065223a2245617272696e67222c2276616c7565223a8152601160f91b602082015260006130546021830185612cfd565b600160fd1b81526130686001820185612cfd565b61227d60f01b815260020195945050505050565b681e3830ba3410321e9160b91b80825260009061309c6009840188612cfd565b68222066696c6c3d222360b81b80825287516130bf816009850160208c01613700565b631110179f60e11b920160098101839052600d8101849052916130e56016840189612cfd565b9350818452865192506130ff836009860160208a01613700565b919092016009810191909152600d01979650505050505050565b681e3830ba3410321e9160b91b815260006131376009830185612cfd565b68222066696c6c3d222360b81b81526131536009820185612cfd565b631110179f60e11b815260040195945050505050565b7f7b2274726169745f74797065223a22486174222c2276616c7565223a2200000081526000613054601d830185612cfd565b7f7b2274726169745f74797065223a22546174746f6f222c2276616c7565223a22815260006130546020830185612cfd565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161320581601d850160208701613700565b91909101601d0192915050565b7f7b2274726169745f74797065223a22536b696e222c2276616c7565223a22000081526000613244601e830184612cfd565b61227d60f01b81526002019392505050565b7f7b2274726169745f74797065223a224265617264222c2276616c7565223a220081526000613054601f830185612cfd565b7f3c7061746820643d224d352c364836563548375634483137563548313856364881527f313956313848313856313948313756323048313656323448385632304837563160208201527139483656313848355a222066696c6c3d222360701b604082015260006132fb6052830184612cfd565b631110179f60e11b81527f3c7061746820643d224d382c323456323048375631394836563138483556364860048201527f365635483756344831375635483138563648313956313848313856313948313760248201527f563230483136563234483137563230483138563139483139563138483230563160448201527f334832315639483230563648313956354831385634483137563348375634483660648201527f56354835563648345639483356313348345631384835563139483656323048376084820152732b191a2d11103334b6361e91119999999110179f60611b60a48201527f3c7061746820643d224d372c313356313248365631314835563130483756394860b88201527f395631304831305631314831315631324831335631314831345631304831355660d88201527f394831375631304831395631314831385631324831375631334831355631324860f8820152731cab1899ad11103334b6361e9111a2222211179f60611b6101188201527f3c7061746820643d224d31322c3136483131563135483133563136483132563161012c8201527f374831345631384831305631374831325631365a222066696c6c3d222333333361014c8201526211179f60e91b61016c82015261016f8101611004565b7f7b2274726169745f74797065223a2248616972222c2276616c7565223a22000081526000613054601e830185612cfd565b7f7b2274726169745f74797065223a2245796573222c2276616c7565223a22000081526000613244601e830184612cfd565b7f7b2274726169745f74797065223a224579657061746368222c2276616c7565228152611d1160f11b602082015260006130546022830185612cfd565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906135a990830184612cb5565b9695505050505050565b602081526000612aaa6020830184612cb5565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156136b1576136b1613796565b500190565b6000826136c5576136c56137ac565b500490565b60008160001904831182151516156136e4576136e4613796565b500290565b6000828210156136fb576136fb613796565b500390565b60005b8381101561371b578181015183820152602001613703565b838111156109ad5750506000910152565b600181811c9082168061374057607f821691505b6020821081141561376157634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561377b5761377b613796565b5060010190565b600082613791576137916137ac565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610e5457600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222073686170652d72656e646572696e673d2263726973704564676573222076696577426f783d22302030203234203234223e7b2274726169745f74797065223a22486174222c2276616c7565223a224e6f6e65227da2646970667358221220a4daa25774d88fa74a7982a6ff57f04d5f66e3ab4a405ba7a284134fe2aaa9f764736f6c63430008070033

Deployed Bytecode Sourcemap

50969:21373:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42607:224;;;;;;:::i;:::-;;:::i;:::-;;;21628:14:1;;21621:22;21603:41;;21591:2;21576:18;42607:224:0;;;;;;;;30095:100;;;:::i;:::-;;;;;;;:::i;31654:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;20915:32:1;;;20897:51;;20885:2;20870:18;31654:221:0;20751:203:1;31177:411:0;;;;;;:::i;:::-;;:::i;:::-;;43247:113;43335:10;:17;43247:113;;;29592:25:1;;;29580:2;29565:18;43247:113:0;29446:177:1;32404:339:0;;;;;;:::i;:::-;;:::i;42915:256::-;;;;;;:::i;:::-;;:::i;32814:185::-;;;;;;:::i;:::-;;:::i;43437:233::-;;;;;;:::i;:::-;;:::i;29789:239::-;;;;;;:::i;:::-;;:::i;71878:217::-;;;:::i;72103:168::-;;;;;;:::i;:::-;;:::i;29519:208::-;;;;;;:::i;:::-;;:::i;9017:103::-;;;:::i;8366:87::-;8439:6;;-1:-1:-1;;;;;8439:6:0;8366:87;;30264:104;;;:::i;31947:155::-;;;;;;:::i;:::-;;:::i;33070:328::-;;;;;;:::i;:::-;;:::i;68645:3225::-;;;;;;:::i;:::-;;:::i;32173:164::-;;;;;;:::i;:::-;-1:-1:-1;;;;;32294:25:0;;;32270:4;32294:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;32173:164;9275:201;;;;;;:::i;:::-;;:::i;42607:224::-;42709:4;-1:-1:-1;;;;;;42733:50:0;;-1:-1:-1;;;42733:50:0;;:90;;;42787:36;42811:11;42787:23;:36::i;:::-;42726:97;42607:224;-1:-1:-1;;42607:224:0:o;30095:100::-;30149:13;30182:5;30175:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30095:100;:::o;31654:221::-;31730:7;34997:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34997:16:0;31750:73;;;;-1:-1:-1;;;31750:73:0;;26871:2:1;31750:73:0;;;26853:21:1;26910:2;26890:18;;;26883:30;26949:34;26929:18;;;26922:62;-1:-1:-1;;;27000:18:1;;;26993:42;27052:19;;31750:73:0;;;;;;;;;-1:-1:-1;31843:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;31843:24:0;;31654:221::o;31177:411::-;31258:13;31274:23;31289:7;31274:14;:23::i;:::-;31258:39;;31322:5;-1:-1:-1;;;;;31316:11:0;:2;-1:-1:-1;;;;;31316:11:0;;;31308:57;;;;-1:-1:-1;;;31308:57:0;;28055:2:1;31308:57:0;;;28037:21:1;28094:2;28074:18;;;28067:30;28133:34;28113:18;;;28106:62;-1:-1:-1;;;28184:18:1;;;28177:31;28225:19;;31308:57:0;27853:397:1;31308:57:0;7164:10;-1:-1:-1;;;;;31400:21:0;;;;:62;;-1:-1:-1;31425:37:0;31442:5;7164:10;32173:164;:::i;31425:37::-;31378:168;;;;-1:-1:-1;;;31378:168:0;;25264:2:1;31378:168:0;;;25246:21:1;25303:2;25283:18;;;25276:30;25342:34;25322:18;;;25315:62;25413:26;25393:18;;;25386:54;25457:19;;31378:168:0;25062:420:1;31378:168:0;31559:21;31568:2;31572:7;31559:8;:21::i;:::-;31247:341;31177:411;;:::o;32404:339::-;32599:41;7164:10;32632:7;32599:18;:41::i;:::-;32591:103;;;;-1:-1:-1;;;32591:103:0;;;;;;;:::i;:::-;32707:28;32717:4;32723:2;32727:7;32707:9;:28::i;42915:256::-;43012:7;43048:23;43065:5;43048:16;:23::i;:::-;43040:5;:31;43032:87;;;;-1:-1:-1;;;43032:87:0;;22497:2:1;43032:87:0;;;22479:21:1;22536:2;22516:18;;;22509:30;22575:34;22555:18;;;22548:62;-1:-1:-1;;;22626:18:1;;;22619:41;22677:19;;43032:87:0;22295:407:1;43032:87:0;-1:-1:-1;;;;;;43137:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;42915:256::o;32814:185::-;32952:39;32969:4;32975:2;32979:7;32952:39;;;;;;;;;;;;:16;:39::i;43437:233::-;43512:7;43548:30;43335:10;:17;;43247:113;43548:30;43540:5;:38;43532:95;;;;-1:-1:-1;;;43532:95:0;;28875:2:1;43532:95:0;;;28857:21:1;28914:2;28894:18;;;28887:30;28953:34;28933:18;;;28926:62;-1:-1:-1;;;29004:18:1;;;28997:42;29056:19;;43532:95:0;28673:408:1;43532:95:0;43645:10;43656:5;43645:17;;;;;;;;:::i;:::-;;;;;;;;;43638:24;;43437:233;;;:::o;29789:239::-;29861:7;29897:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29897:16:0;29932:19;29924:73;;;;-1:-1:-1;;;29924:73:0;;26100:2:1;29924:73:0;;;26082:21:1;26139:2;26119:18;;;26112:30;26178:34;26158:18;;;26151:62;-1:-1:-1;;;26229:18:1;;;26222:39;26278:19;;29924:73:0;25898:405:1;71878:217:0;1851:1;2449:7;;:19;;2441:63;;;;-1:-1:-1;;;2441:63:0;;29288:2:1;2441:63:0;;;29270:21:1;29327:2;29307:18;;;29300:30;29366:33;29346:18;;;29339:61;29417:18;;2441:63:0;29086:355:1;2441:63:0;1851:1;2582:7;:18;71929:15:::1;71947:25;:15;3768:14:::0;;3676:114;71947:25:::1;71929:43;;72001:4;71991:7;:14;71983:23;;;::::0;::::1;;72017:27;:15;3887:19:::0;;3905:1;3887:19;;;3798:127;72017:27:::1;72055:32;7164:10:::0;72065:12:::1;72079:7;72055:9;:32::i;:::-;-1:-1:-1::0;1807:1:0;2761:7;:22;71878:217::o;72103:168::-;1851:1;2449:7;;:19;;2441:63;;;;-1:-1:-1;;;2441:63:0;;29288:2:1;2441:63:0;;;29270:21:1;29327:2;29307:18;;;29300:30;29366:33;29346:18;;;29339:61;29417:18;;2441:63:0;29086:355:1;2441:63:0;1851:1;2582:7;:18;8439:6;;-1:-1:-1;;;;;8439:6:0;7164:10;8586:23:::1;8578:68;;;;-1:-1:-1::0;;;8578:68:0::1;;;;;;;:::i;:::-;72202:4:::2;72192:7;:14;:32;;;;;72220:4;72210:7;:14;72192:32;72184:41;;;::::0;::::2;;72236:27;72246:7;8439:6:::0;;-1:-1:-1;;;;;8439:6:0;;8366:87;29519:208;29591:7;-1:-1:-1;;;;;29619:19:0;;29611:74;;;;-1:-1:-1;;;29611:74:0;;25689:2:1;29611:74:0;;;25671:21:1;25728:2;25708:18;;;25701:30;25767:34;25747:18;;;25740:62;-1:-1:-1;;;25818:18:1;;;25811:40;25868:19;;29611:74:0;25487:406:1;29611:74:0;-1:-1:-1;;;;;;29703:16:0;;;;;:9;:16;;;;;;;29519:208::o;9017:103::-;8439:6;;-1:-1:-1;;;;;8439:6:0;7164:10;8586:23;8578:68;;;;-1:-1:-1;;;8578:68:0;;;;;;;:::i;:::-;9082:30:::1;9109:1;9082:18;:30::i;:::-;9017:103::o:0;30264:104::-;30320:13;30353:7;30346:14;;;;;:::i;31947:155::-;32042:52;7164:10;32075:8;32085;32042:18;:52::i;:::-;31947:155;;:::o;33070:328::-;33245:41;7164:10;33278:7;33245:18;:41::i;:::-;33237:103;;;;-1:-1:-1;;;33237:103:0;;;;;;;:::i;:::-;33351:39;33365:4;33371:2;33375:7;33384:5;33351:13;:39::i;:::-;33070:328;;;;:::o;68645:3225::-;34973:4;34997:16;;;:7;:16;;;;;;68746:13;;-1:-1:-1;;;;;34997:16:0;68777:65;;;;-1:-1:-1;;;68777:65:0;;22092:2:1;68777:65:0;;;22074:21:1;22131:2;22111:18;;;22104:30;22170:34;22150:18;;;22143:62;-1:-1:-1;;;22221:18:1;;;22214:34;22265:19;;68777:65:0;21890:400:1;68777:65:0;68853:24;68888:31;68930:30;:160;;;;;;;;;;;;;;;;;69101:30;;;;;;;;;;;;-1:-1:-1;;;69101:30:0;;;;68930:160;;-1:-1:-1;69176:16:0;69184:7;69176;:16::i;:::-;69237:52;;69142:50;;-1:-1:-1;69142:50:0;-1:-1:-1;69237:52:0;;69254:10;;69142:50;;69237:52;;;:::i;:::-;;;;;;;;;;;;;69203:97;;69341:3;69346:10;69324:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69311:47;;69403:16;69411:7;69403;:16::i;:::-;69464:52;;69369:50;;-1:-1:-1;69369:50:0;-1:-1:-1;69464:52:0;;69481:10;;69369:50;;69464:52;;;:::i;:::-;;;;;;;;;;;;;69430:97;;69568:3;69573:10;69551:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69538:47;;69630:20;69642:7;69630:11;:20::i;:::-;69695:52;;69596:54;;-1:-1:-1;69596:54:0;-1:-1:-1;69695:52:0;;69712:10;;69596:54;;69695:52;;;:::i;:::-;;;;;;;;;;;;;69661:97;;69799:3;69804:10;69782:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69769:47;;69861:19;69872:7;69861:10;:19::i;:::-;69925:52;;69827:53;;-1:-1:-1;69827:53:0;-1:-1:-1;69925:52:0;;69942:10;;69827:53;;69925:52;;;:::i;:::-;;;;;;;;;;;;;69891:97;;70029:3;70034:10;70012:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69999:47;;70091:22;70105:7;70091:13;:22::i;:::-;70158:52;;70057:56;;-1:-1:-1;70057:56:0;-1:-1:-1;70158:52:0;;70175:10;;70057:56;;70158:52;;;:::i;:::-;;;;;;;;;;;;;70124:97;;70262:3;70267:10;70245:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70232:47;;70324:17;70333:7;70324:8;:17::i;:::-;70386:52;;70290:51;;-1:-1:-1;70290:51:0;-1:-1:-1;70386:52:0;;70403:10;;70290:51;;70386:52;;;:::i;:::-;;;;;;;;;;;;;70352:97;;70490:3;70495:10;70473:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70460:47;;70552:16;70560:7;70552;:16::i;:::-;70613:52;;70518:50;;-1:-1:-1;70518:50:0;-1:-1:-1;70613:52:0;;70630:10;;70518:50;;70613:52;;;:::i;:::-;;;;;;;;;;;;;70579:97;;70717:3;70722:10;70700:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70687:47;;70779:17;70788:7;70779:8;:17::i;:::-;70827:47;;70745:51;;-1:-1:-1;70745:51:0;-1:-1:-1;70827:47:0;;70844:10;;70745:51;;70827:47;;;:::i;:::-;;;;;;;;;;;;;70807:68;;70916:3;70921:10;70899:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70886:47;;70976:3;70959:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;70946:45;;71039:10;71022:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;71002:54;;71069:23;71201:608;71334:18;:7;:16;:18::i;:::-;71631:25;71651:3;71631:13;:25::i;:::-;71727:10;71237:553;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71201:13;:608::i;:::-;71116:708;;;;;;;;:::i;:::-;;;;-1:-1:-1;;71116:708:0;;;;;;;;;;68645:3225;-1:-1:-1;;;;;;;68645:3225:0:o;9275:201::-;8439:6;;-1:-1:-1;;;;;8439:6:0;7164:10;8586:23;8578:68;;;;-1:-1:-1;;;8578:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9364:22:0;::::1;9356:73;;;::::0;-1:-1:-1;;;9356:73:0;;23328:2:1;9356:73:0::1;::::0;::::1;23310:21:1::0;23367:2;23347:18;;;23340:30;23406:34;23386:18;;;23379:62;-1:-1:-1;;;23457:18:1;;;23450:36;23503:19;;9356:73:0::1;23126:402:1::0;9356:73:0::1;9440:28;9459:8;9440:18;:28::i;:::-;9275:201:::0;:::o;29150:305::-;29252:4;-1:-1:-1;;;;;;29289:40:0;;-1:-1:-1;;;29289:40:0;;:105;;-1:-1:-1;;;;;;;29346:48:0;;-1:-1:-1;;;29346:48:0;29289:105;:158;;;-1:-1:-1;;;;;;;;;;20931:40:0;;;29411:36;20822:157;38890:174;38965:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;38965:29:0;-1:-1:-1;;;;;38965:29:0;;;;;;;;:24;;39019:23;38965:24;39019:14;:23::i;:::-;-1:-1:-1;;;;;39010:46:0;;;;;;;;;;;38890:174;;:::o;35202:348::-;35295:4;34997:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34997:16:0;35312:73;;;;-1:-1:-1;;;35312:73:0;;24851:2:1;35312:73:0;;;24833:21:1;24890:2;24870:18;;;24863:30;24929:34;24909:18;;;24902:62;-1:-1:-1;;;24980:18:1;;;24973:42;25032:19;;35312:73:0;24649:408:1;35312:73:0;35396:13;35412:23;35427:7;35412:14;:23::i;:::-;35396:39;;35465:5;-1:-1:-1;;;;;35454:16:0;:7;-1:-1:-1;;;;;35454:16:0;;:51;;;;35498:7;-1:-1:-1;;;;;35474:31:0;:20;35486:7;35474:11;:20::i;:::-;-1:-1:-1;;;;;35474:31:0;;35454:51;:87;;;-1:-1:-1;;;;;;32294:25:0;;;32270:4;32294:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;35509:32;35446:96;35202:348;-1:-1:-1;;;;35202:348:0:o;38194:578::-;38353:4;-1:-1:-1;;;;;38326:31:0;:23;38341:7;38326:14;:23::i;:::-;-1:-1:-1;;;;;38326:31:0;;38318:85;;;;-1:-1:-1;;;38318:85:0;;27645:2:1;38318:85:0;;;27627:21:1;27684:2;27664:18;;;27657:30;27723:34;27703:18;;;27696:62;-1:-1:-1;;;27774:18:1;;;27767:39;27823:19;;38318:85:0;27443:405:1;38318:85:0;-1:-1:-1;;;;;38422:16:0;;38414:65;;;;-1:-1:-1;;;38414:65:0;;24092:2:1;38414:65:0;;;24074:21:1;24131:2;24111:18;;;24104:30;24170:34;24150:18;;;24143:62;-1:-1:-1;;;24221:18:1;;;24214:34;24265:19;;38414:65:0;23890:400:1;38414:65:0;38492:39;38513:4;38519:2;38523:7;38492:20;:39::i;:::-;38596:29;38613:1;38617:7;38596:8;:29::i;:::-;-1:-1:-1;;;;;38638:15:0;;;;;;:9;:15;;;;;:20;;38657:1;;38638:15;:20;;38657:1;;38638:20;:::i;:::-;;;;-1:-1:-1;;;;;;;38669:13:0;;;;;;:9;:13;;;;;:18;;38686:1;;38669:13;:18;;38686:1;;38669:18;:::i;:::-;;;;-1:-1:-1;;38698:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;38698:21:0;-1:-1:-1;;;;;38698:21:0;;;;;;;;;38737:27;;38698:16;;38737:27;;;;;;;38194:578;;;:::o;35892:110::-;35968:26;35978:2;35982:7;35968:26;;;;;;;;;;;;:9;:26::i;9636:191::-;9729:6;;;-1:-1:-1;;;;;9746:17:0;;;-1:-1:-1;;;;;;9746:17:0;;;;;;;9779:40;;9729:6;;;9746:17;9729:6;;9779:40;;9710:16;;9779:40;9699:128;9636:191;:::o;39206:315::-;39361:8;-1:-1:-1;;;;;39352:17:0;:5;-1:-1:-1;;;;;39352:17:0;;;39344:55;;;;-1:-1:-1;;;39344:55:0;;24497:2:1;39344:55:0;;;24479:21:1;24536:2;24516:18;;;24509:30;24575:27;24555:18;;;24548:55;24620:18;;39344:55:0;24295:349:1;39344:55:0;-1:-1:-1;;;;;39410:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;39410:46:0;;;;;;;;;;39472:41;;21603::1;;;39472::0;;21576:18:1;39472:41:0;;;;;;;39206:315;;;:::o;34280:::-;34437:28;34447:4;34453:2;34457:7;34437:9;:28::i;:::-;34484:48;34507:4;34513:2;34517:7;34526:5;34484:22;:48::i;:::-;34476:111;;;;-1:-1:-1;;;34476:111:0;;;;;;;:::i;60523:1119::-;60606:13;60621;60652:21;60676:31;60685:7;60694:6;60676:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60702:4;60676:8;:31::i;:::-;60652:55;;60718:17;60897:5;60903:13;60897:20;;;;;;;;:::i;:::-;;;;;;;;60759:624;;;;;;;;:::i;:::-;;;;;;;;;;;;;60718:676;;61405:19;61534:6;61541:13;61534:21;;;;;;;;:::i;:::-;;;;;;;;61448:145;;;;;;;;:::i;:::-;;;;-1:-1:-1;;61448:145:0;;;;;;;;;61623:3;;61448:145;;-1:-1:-1;60523:1119:0;;-1:-1:-1;;;;60523:1119:0:o;61650:1394::-;61733:13;61748;61779:17;61807:21;61831:28;61840:7;61849:6;61831:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61857:1;61831:8;:28::i;:::-;61807:52;;61870:26;61899:5;61905:13;61899:20;;;;;;;;:::i;:::-;;;;;;;;61870:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61930:30;61969:12;61930:52;;61993:28;62080:17;62098:1;62080:20;;;;;;;;:::i;:::-;;;;;;;;;62119:17;62137:1;62119:20;;;;;;;;:::i;:::-;;;;;;;;;62158:17;62176:1;62158:20;;;;;;;;:::i;:::-;;;;;;;62045:148;;-1:-1:-1;;;;;;5700:15:1;;;62045:148:0;;;5688:28:1;;;;5745:15;;;5732:11;;;5725:36;62158:20:0;;5777:11:1;;;5770:36;5822:11;;62045:148:0;;;;;;;;;;;;61993:211;;62215:29;62303:17;62321:1;62303:20;;;;;;;;:::i;:::-;;;;;;;;;62342:17;62360:1;62342:20;;;;;;;;:::i;:::-;;;;;;;;;62381:17;62399:1;62381:20;;;;;;;;:::i;:::-;;;;;;;62268:148;;-1:-1:-1;;;;;;5700:15:1;;;62268:148:0;;;5688:28:1;;;;5745:15;;;5732:11;;;5725:36;62381:20:0;;5777:11:1;;;5770:36;5822:11;;62268:148:0;;;;;;;;;;;;62215:212;;62530:4;62535:1;62530:7;;;;;;;;:::i;:::-;;;;;;;;62586:14;62674:4;62679:1;62674:7;;;;;;;;:::i;:::-;;;;;;;;62730:15;62465:320;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62438:358;;62807:19;62936:6;62943:13;62936:21;;;;;;;;:::i;:::-;;;;;;;;62850:145;;;;;;;;:::i;:::-;;;;-1:-1:-1;;62850:145:0;;;;;;;;;63025:3;;62850:145;;-1:-1:-1;61650:1394:0;;-1:-1:-1;;;;;;;;61650:1394:0:o;63052:879::-;63139:13;63154;63185:17;63213:19;63243:18;63264:31;63273:7;63282:9;63264:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63293:1;63264:8;:31::i;:::-;63243:52;;63306:23;63332:33;63341:7;63350:10;63332:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63362:2;63332:8;:33::i;:::-;63306:59;;63468:8;63477:13;63468:23;;;;;;;;:::i;:::-;;;;;;;;63540:9;63550:18;63540:29;;;;;;;;:::i;:::-;;;;;;;;63403:206;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63376:244;;63749:10;63760:18;63749:30;;;;;;;;:::i;:::-;;;;;;;;63820:9;63830:13;63820:24;;;;;;;;:::i;:::-;;;;;;;;63660:222;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;63660:222:0;;;;;;;;;63912:3;;63660:222;;-1:-1:-1;63052:879:0;;-1:-1:-1;;;;;63052:879:0:o;63939:871::-;64025:13;64040;64071:17;64099:19;64129:18;64150:31;64159:7;64168:8;64150:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64178:2;64150:8;:31::i;:::-;64129:52;;64192:23;64218:31;64227:7;64236:9;64218:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64247:1;64218:8;:31::i;:::-;64192:57;;64352:7;64360:13;64352:22;;;;;;;;:::i;:::-;;;;;;;;64423:8;64432:18;64423:28;;;;;;;;:::i;:::-;;;;;;;;64287:204;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64260:242;;64630:9;64640:18;64630:29;;;;;;;;:::i;:::-;;;;;;;;64700:8;64709:13;64700:23;;;;;;;;:::i;:::-;;;;;;;;64542:219;;;;;;;;;:::i;64818:898::-;64907:13;64922;64953:17;64981:19;65011:18;65032:34;65041:7;65050:11;65032:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65063:2;65032:8;:34::i;:::-;65011:55;;65077:23;65103:36;65112:7;65121:12;65103:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65135:3;65103:8;:36::i;:::-;65077:62;;65242:10;65253:13;65242:25;;;;;;;;:::i;:::-;;;;;;;;65316:11;65328:18;65316:31;;;;;;;;:::i;:::-;;;;;;;;65177:210;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65150:248;;65530:12;65543:18;65530:32;;;;;;;;:::i;:::-;;;;;;;;65603:11;65615:13;65603:26;;;;;;;;:::i;:::-;;;;;;;;65440:227;;;;;;;;;:::i;65724:858::-;65808:13;65823;65854:17;65882:19;65912:18;65933:30;65942:7;65951:6;65933:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65959:3;65933:8;:30::i;:::-;65912:51;;65974:23;66000:31;66009:7;66018;66000:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66027:3;66000:8;:31::i;:::-;65974:57;;66134:5;66140:13;66134:20;;;;;;;;:::i;:::-;;;;;;;;66203:6;66210:18;66203:26;;;;;;;;:::i;:::-;;;;;;;;66069:200;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66042:238;;66406:7;66414:18;66406:27;;;;;;;;:::i;:::-;;;;;;;;66474:6;66481:13;66474:21;;;;;;;;:::i;:::-;;;;;;;;66320:213;;;;;;;;;:::i;66590:1179::-;66673:13;66688;66719:17;66747:19;66777:18;66798:30;66807:7;66816:5;66798:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66823:4;66798:8;:30::i;:::-;66777:51;;66879:4;66884:13;66879:19;;;;;;;;:::i;:::-;;;;;;;;66863:37;;;;;;:::i;:::-;;;;;;;;66843:16;:57;66839:893;;66917:23;66943:31;66952:7;66961:6;66943:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66969:4;66943:8;:31::i;:::-;66917:57;;67093:4;67098:13;67093:19;;;;;;;;:::i;:::-;;;;;;;;67169:5;67175:18;67169:25;;;;;;;;:::i;:::-;;;;;;;;67020:222;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66989:268;;67398:6;67405:18;67398:26;;;;;;;;:::i;:::-;;;;;;;;67473:5;67479:13;67473:20;;;;;;;;:::i;:::-;;;;;;;;67305:234;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67272:282;;66902:664;66839:893;;;67587:8;;;;;;;;;;;;;;67660:44;;;;;;;;;;;;;;;;;67643:62;;;;;;;;:::i;:::-;;;;;;;;;;;;;67610:110;;66839:893;-1:-1:-1;67750:3:0;;67755:5;;-1:-1:-1;66590:1179:0;-1:-1:-1;;66590:1179:0:o;67777:860::-;67861:13;67876;67907:17;67935:19;67965:18;67986:30;67995:7;68004:6;67986:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68012:3;67986:8;:30::i;:::-;67965:51;;68027:23;68053:32;68062:7;68071;68053:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68080:4;68053:8;:32::i;:::-;68027:58;;68188:5;68194:13;68188:20;;;;;;;;:::i;:::-;;;;;;;;68257:6;68264:18;68257:26;;;;;;;;:::i;:::-;;;;;;;;68123:200;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68096:238;;68461:7;68469:18;68461:27;;;;;;;;:::i;:::-;;;;;;;;68529:6;68536:13;68529:21;;;;;;;;:::i;:::-;;;;;;;;68374:214;;;;;;;;;:::i;4640:723::-;4696:13;4917:10;4913:53;;-1:-1:-1;;4944:10:0;;;;;;;;;;;;-1:-1:-1;;;4944:10:0;;;;;4640:723::o;4913:53::-;4991:5;4976:12;5032:78;5039:9;;5032:78;;5065:8;;;;:::i;:::-;;-1:-1:-1;5088:10:0;;-1:-1:-1;5096:2:0;5088:10;;:::i;:::-;;;5032:78;;;5120:19;5152:6;5142:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5142:17:0;;5120:39;;5170:154;5177:10;;5170:154;;5204:11;5214:1;5204:11;;:::i;:::-;;-1:-1:-1;5273:10:0;5281:2;5273:5;:10;:::i;:::-;5260:24;;:2;:24;:::i;:::-;5247:39;;5230:6;5237;5230:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;5230:56:0;;;;;;;;-1:-1:-1;5301:11:0;5310:2;5301:11;;:::i;:::-;;;5170:154;;49188:1774;49286:11;;49246:13;;49312:8;49308:23;;-1:-1:-1;;49322:9:0;;;;;;;;;-1:-1:-1;49322:9:0;;;49188:1774;-1:-1:-1;49188:1774:0:o;49308:23::-;49383:18;49421:1;49410:7;:3;49416:1;49410:7;:::i;:::-;49409:13;;;;:::i;:::-;49404:19;;:1;:19;:::i;:::-;49383:40;-1:-1:-1;49481:19:0;49513:15;49383:40;49526:2;49513:15;:::i;:::-;49503:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49503:26:0;;49481:48;;49540:18;49561:5;;;;;;;;;;;;;;;;;49540:26;;49630:1;49623:5;49619:13;49675:2;49667:6;49663:15;49724:1;49692:954;49747:3;49744:1;49741:10;49692:954;;;49802:1;49845:12;;;;;49839:19;49938:4;49926:2;49922:14;;;;;49904:40;;49898:47;50090:2;50086:14;;;50082:25;;50068:40;;50062:47;50280:1;50276:13;;;50272:24;;50258:39;;50252:46;50461:16;;;;50447:31;;50441:38;49974:1;49970:11;;;50111:4;50058:58;;;50006:129;50160:11;;50248:57;;;50196:128;;;;50349:11;;50437:49;;50385:120;50534:3;50530:13;50561:22;;50629:1;50614:17;;;;49795:9;49692:954;;;49696:44;50676:1;50671:3;50667:11;50697:1;50692:84;;;;50795:1;50790:82;;;;50660:212;;50692:84;-1:-1:-1;;;;;50725:17:0;;50718:43;50692:84;;50790:82;-1:-1:-1;;;;;50823:17:0;;50816:41;50660:212;-1:-1:-1;;;50886:26:0;;;50893:6;49188:1774;-1:-1:-1;;;;49188:1774:0:o;44283:589::-;-1:-1:-1;;;;;44489:18:0;;44485:187;;44524:40;44556:7;45699:10;:17;;45672:24;;;;:15;:24;;;;;:44;;;45727:24;;;;;;;;;;;;45595:164;44524:40;44485:187;;;44594:2;-1:-1:-1;;;;;44586:10:0;:4;-1:-1:-1;;;;;44586:10:0;;44582:90;;44613:47;44646:4;44652:7;44613:32;:47::i;:::-;-1:-1:-1;;;;;44686:16:0;;44682:183;;44719:45;44756:7;44719:36;:45::i;44682:183::-;44792:4;-1:-1:-1;;;;;44786:10:0;:2;-1:-1:-1;;;;;44786:10:0;;44782:83;;44813:40;44841:2;44845:7;44813:27;:40::i;36229:321::-;36359:18;36365:2;36369:7;36359:5;:18::i;:::-;36410:54;36441:1;36445:2;36449:7;36458:5;36410:22;:54::i;:::-;36388:154;;;;-1:-1:-1;;;36388:154:0;;;;;;;:::i;40086:799::-;40241:4;-1:-1:-1;;;;;40262:13:0;;10983:20;11031:8;40258:620;;40298:72;;-1:-1:-1;;;40298:72:0;;-1:-1:-1;;;;;40298:36:0;;;;;:72;;7164:10;;40349:4;;40355:7;;40364:5;;40298:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40298:72:0;;;;;;;;-1:-1:-1;;40298:72:0;;;;;;;;;;;;:::i;:::-;;;40294:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40540:13:0;;40536:272;;40583:60;;-1:-1:-1;;;40583:60:0;;;;;;;:::i;40536:272::-;40758:6;40752:13;40743:6;40739:2;40735:15;40728:38;40294:529;-1:-1:-1;;;;;;40421:51:0;-1:-1:-1;;;40421:51:0;;-1:-1:-1;40414:58:0;;40258:620;-1:-1:-1;40862:4:0;40086:799;;;;;;:::o;60075:440::-;60199:7;60224:17;60305:6;60268:18;:7;:16;:18::i;:::-;60252:36;;;;;;;60244:67;;;;:::i;:::-;60224:87;;60322:6;60343:20;60366:6;60373:1;60366:9;;;;;;;;:::i;:::-;;;;;;;60343:32;;;;60386:103;60405:12;60393:9;:24;60386:103;;;60434:3;;;;:::i;:::-;;;;60468:6;60475:1;60468:9;;;;;;;;:::i;:::-;;;;;;;60452:25;;;;;;;:::i;:::-;;;60386:103;;;-1:-1:-1;60506:1:0;60075:440;-1:-1:-1;;;;;60075:440:0:o;46386:988::-;46652:22;46702:1;46677:22;46694:4;46677:16;:22::i;:::-;:26;;;;:::i;:::-;46714:18;46735:26;;;:17;:26;;;;;;46652:51;;-1:-1:-1;46868:28:0;;;46864:328;;-1:-1:-1;;;;;46935:18:0;;46913:19;46935:18;;;:12;:18;;;;;;;;:34;;;;;;;;;46986:30;;;;;;:44;;;47103:30;;:17;:30;;;;;:43;;;46864:328;-1:-1:-1;47288:26:0;;;;:17;:26;;;;;;;;47281:33;;;-1:-1:-1;;;;;47332:18:0;;;;;:12;:18;;;;;:34;;;;;;;47325:41;46386:988::o;47669:1079::-;47947:10;:17;47922:22;;47947:21;;47967:1;;47947:21;:::i;:::-;47979:18;48000:24;;;:15;:24;;;;;;48373:10;:26;;47922:46;;-1:-1:-1;48000:24:0;;47922:46;;48373:26;;;;;;:::i;:::-;;;;;;;;;48351:48;;48437:11;48412:10;48423;48412:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;48517:28;;;:15;:28;;;;;;;:41;;;48689:24;;;;;48682:31;48724:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;47740:1008;;;47669:1079;:::o;45173:221::-;45258:14;45275:20;45292:2;45275:16;:20::i;:::-;-1:-1:-1;;;;;45306:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;45351:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;45173:221:0:o;36886:382::-;-1:-1:-1;;;;;36966:16:0;;36958:61;;;;-1:-1:-1;;;36958:61:0;;26510:2:1;36958:61:0;;;26492:21:1;;;26529:18;;;26522:30;26588:34;26568:18;;;26561:62;26640:18;;36958:61:0;26308:356:1;36958:61:0;34973:4;34997:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34997:16:0;:30;37030:58;;;;-1:-1:-1;;;37030:58:0;;23735:2:1;37030:58:0;;;23717:21:1;23774:2;23754:18;;;23747:30;23813;23793:18;;;23786:58;23861:18;;37030:58:0;23533:352:1;37030:58:0;37101:45;37130:1;37134:2;37138:7;37101:20;:45::i;:::-;-1:-1:-1;;;;;37159:13:0;;;;;;:9;:13;;;;;:18;;37176:1;;37159:13;:18;;37176:1;;37159:18;:::i;:::-;;;;-1:-1:-1;;37188:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;37188:21:0;-1:-1:-1;;;;;37188:21:0;;;;;;;;37227:33;;37188:16;;;37227:33;;37188:16;;37227:33;36886:382;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:1:o;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;648:328;;;;;:::o;981:1138::-;1076:6;1084;1092;1100;1153:3;1141:9;1132:7;1128:23;1124:33;1121:53;;;1170:1;1167;1160:12;1121:53;1193:29;1212:9;1193:29;:::i;:::-;1183:39;;1241:38;1275:2;1264:9;1260:18;1241:38;:::i;:::-;1231:48;;1326:2;1315:9;1311:18;1298:32;1288:42;;1381:2;1370:9;1366:18;1353:32;1404:18;1445:2;1437:6;1434:14;1431:34;;;1461:1;1458;1451:12;1431:34;1499:6;1488:9;1484:22;1474:32;;1544:7;1537:4;1533:2;1529:13;1525:27;1515:55;;1566:1;1563;1556:12;1515:55;1602:2;1589:16;1624:2;1620;1617:10;1614:36;;;1630:18;;:::i;:::-;1705:2;1699:9;1673:2;1759:13;;-1:-1:-1;;1755:22:1;;;1779:2;1751:31;1747:40;1735:53;;;1803:18;;;1823:22;;;1800:46;1797:72;;;1849:18;;:::i;:::-;1889:10;1885:2;1878:22;1924:2;1916:6;1909:18;1964:7;1959:2;1954;1950;1946:11;1942:20;1939:33;1936:53;;;1985:1;1982;1975:12;1936:53;2041:2;2036;2032;2028:11;2023:2;2015:6;2011:15;1998:46;2086:1;2081:2;2076;2068:6;2064:15;2060:24;2053:35;2107:6;2097:16;;;;;;;981:1138;;;;;;;:::o;2124:347::-;2189:6;2197;2250:2;2238:9;2229:7;2225:23;2221:32;2218:52;;;2266:1;2263;2256:12;2218:52;2289:29;2308:9;2289:29;:::i;:::-;2279:39;;2368:2;2357:9;2353:18;2340:32;2415:5;2408:13;2401:21;2394:5;2391:32;2381:60;;2437:1;2434;2427:12;2381:60;2460:5;2450:15;;;2124:347;;;;;:::o;2476:254::-;2544:6;2552;2605:2;2593:9;2584:7;2580:23;2576:32;2573:52;;;2621:1;2618;2611:12;2573:52;2644:29;2663:9;2644:29;:::i;:::-;2634:39;2720:2;2705:18;;;;2692:32;;-1:-1:-1;;;2476:254:1:o;2735:245::-;2793:6;2846:2;2834:9;2825:7;2821:23;2817:32;2814:52;;;2862:1;2859;2852:12;2814:52;2901:9;2888:23;2920:30;2944:5;2920:30;:::i;2985:249::-;3054:6;3107:2;3095:9;3086:7;3082:23;3078:32;3075:52;;;3123:1;3120;3113:12;3075:52;3155:9;3149:16;3174:30;3198:5;3174:30;:::i;3239:180::-;3298:6;3351:2;3339:9;3330:7;3326:23;3322:32;3319:52;;;3367:1;3364;3357:12;3319:52;-1:-1:-1;3390:23:1;;3239:180;-1:-1:-1;3239:180:1:o;3424:268::-;3476:3;3514:5;3508:12;3541:6;3536:3;3529:19;3557:63;3613:6;3606:4;3601:3;3597:14;3590:4;3583:5;3579:16;3557:63;:::i;:::-;3674:2;3653:15;-1:-1:-1;;3649:29:1;3640:39;;;;3681:4;3636:50;;3424:268;-1:-1:-1;;3424:268:1:o;3697:184::-;3738:3;3776:5;3770:12;3791:52;3836:6;3831:3;3824:4;3817:5;3813:16;3791:52;:::i;:::-;3859:16;;;;;3697:184;-1:-1:-1;;3697:184:1:o;3886:985::-;3974:12;;3939:3;;4029:1;4049:18;;;;4102;;;;4129:61;;4183:4;4175:6;4171:17;4161:27;;4129:61;4209:2;4257;4249:6;4246:14;4226:18;4223:38;4220:161;;;4303:10;4298:3;4294:20;4291:1;4284:31;4338:4;4335:1;4328:15;4366:4;4363:1;4356:15;4220:161;4397:18;4424:104;;;;4542:1;4537:328;;;;4390:475;;4424:104;-1:-1:-1;;4457:24:1;;4445:37;;4502:16;;;;-1:-1:-1;4424:104:1;;4537:328;4568:5;4565:1;4558:16;4615:2;4612:1;4602:16;4640:1;4654:165;4668:6;4665:1;4662:13;4654:165;;;4746:14;;4733:11;;;4726:35;4789:16;;;;4683:10;;4654:165;;;4658:3;;4848:6;4843:3;4839:16;4832:23;;4390:475;;;;;;;3886:985;;;;:::o;5844:274::-;5973:3;6011:6;6005:13;6027:53;6073:6;6068:3;6061:4;6053:6;6049:17;6027:53;:::i;:::-;6096:16;;;;;5844:274;-1:-1:-1;;5844:274:1:o;6123:202::-;6253:3;6278:41;6315:3;6307:6;6278:41;:::i;6330:470::-;6509:3;6547:6;6541:13;6563:53;6609:6;6604:3;6597:4;6589:6;6585:17;6563:53;:::i;:::-;6679:13;;6638:16;;;;6701:57;6679:13;6638:16;6735:4;6723:17;;6701:57;:::i;:::-;6774:20;;6330:470;-1:-1:-1;;;;6330:470:1:o;6805:633::-;7085:3;7123:6;7117:13;7139:53;7185:6;7180:3;7173:4;7165:6;7161:17;7139:53;:::i;:::-;7255:13;;7214:16;;;;7277:57;7255:13;7214:16;7311:4;7299:17;;7277:57;:::i;:::-;-1:-1:-1;;;7356:20:1;;7385:18;;;7430:1;7419:13;;6805:633;-1:-1:-1;;;;6805:633:1:o;7443:439::-;7675:3;7713:6;7707:13;7729:53;7775:6;7770:3;7763:4;7755:6;7751:17;7729:53;:::i;:::-;-1:-1:-1;;;7804:16:1;;7829:18;;;-1:-1:-1;7874:1:1;7863:13;;7443:439;-1:-1:-1;7443:439:1:o;7887:444::-;8119:3;8157:6;8151:13;8173:53;8219:6;8214:3;8207:4;8199:6;8195:17;8173:53;:::i;:::-;-1:-1:-1;;;8248:16:1;;8273:23;;;-1:-1:-1;8323:1:1;8312:13;;7887:444;-1:-1:-1;7887:444:1:o;8336:1661::-;8997:66;8992:3;8985:79;8967:3;9093:6;9087:13;9109:62;9164:6;9159:2;9154:3;9150:12;9143:4;9135:6;9131:17;9109:62;:::i;:::-;9235:66;9230:2;9190:16;;;9222:11;;;9215:87;9331:34;9326:2;9318:11;;9311:55;9395:34;9390:2;9382:11;;9375:55;9460:34;9454:3;9446:12;;9439:56;9525:34;9519:3;9511:12;;9504:56;9590:66;9584:3;9576:12;;9569:88;9687:66;9681:3;9673:12;;9666:88;9779:13;;9801:64;9779:13;9850:3;9842:12;;9835:4;9823:17;;9801:64;:::i;:::-;9881:110;9911:79;9936:53;9984:3;9973:8;9969:2;9965:17;9961:27;-1:-1:-1;;;5264:55:1;;5344:2;5335:12;;5204:149;9936:53;9928:6;9911:79;:::i;:::-;-1:-1:-1;;;5423:16:1;;5464:1;5455:11;;5358:114;9881:110;9874:117;8336:1661;-1:-1:-1;;;;;;;8336:1661:1:o;10002:843::-;10508:66;10496:79;;-1:-1:-1;;;10600:2:1;10591:12;;10584:34;-1:-1:-1;10637:50:1;10683:2;10674:12;;10666:6;10637:50;:::i;:::-;-1:-1:-1;;;10703:2:1;10696:15;10730:48;10775:1;10771:2;10767:10;10759:6;10730:48;:::i;:::-;-1:-1:-1;;;10787:26:1;;10837:1;10829:10;;10002:843;-1:-1:-1;;;;;10002:843:1:o;10850:1638::-;-1:-1:-1;;;11792:15:1;;;11725:3;;11826:49;11872:1;11863:11;;11855:6;11826:49;:::i;:::-;-1:-1:-1;;;11933:14:1;;;11970:13;;11992:60;11970:13;12041:1;12033:10;;12026:4;12014:17;;11992:60;:::i;:::-;-1:-1:-1;;;12071:15:1;;12149:1;12141:10;;12134:22;;;12180:2;12172:11;;12165:23;;;12071:15;12207:49;12252:2;12244:11;;12236:6;12207:49;:::i;:::-;12197:59;;12276:2;12272;12265:14;12310:6;12304:13;12288:29;;12326:62;12379:8;12375:1;12371:2;12367:10;12360:4;12352:6;12348:17;12326:62;:::i;:::-;12407:17;;;;12448:1;12440:10;;12433:22;;;;12479:2;12471:11;;;-1:-1:-1;;;;;;;10850:1638:1:o;12493:796::-;-1:-1:-1;;;12987:43:1;;12969:3;13049:49;13095:1;13086:11;;13078:6;13049:49;:::i;:::-;-1:-1:-1;;;13107:42:1;;13168:48;13213:1;13205:10;;13197:6;13168:48;:::i;:::-;-1:-1:-1;;;13225:32:1;;13281:1;13273:10;;12493:796;-1:-1:-1;;;;;12493:796:1:o;13294:800::-;13800:66;13795:3;13788:79;13770:3;13886:50;13932:2;13927:3;13923:12;13915:6;13886:50;:::i;14099:800::-;14605:66;14600:3;14593:79;14575:3;14691:50;14737:2;14732:3;14728:12;14720:6;14691:50;:::i;14904:448::-;15166:31;15161:3;15154:44;15136:3;15227:6;15221:13;15243:62;15298:6;15293:2;15288:3;15284:12;15277:4;15269:6;15265:17;15243:62;:::i;:::-;15325:16;;;;15343:2;15321:25;;14904:448;-1:-1:-1;;14904:448:1:o;15357:563::-;15717:66;15712:3;15705:79;15687:3;15803:50;15849:2;15844:3;15840:12;15832:6;15803:50;:::i;:::-;-1:-1:-1;;;15862:26:1;;15912:1;15904:10;;15357:563;-1:-1:-1;;;15357:563:1:o;15925:800::-;16431:66;16426:3;16419:79;16401:3;16517:50;16563:2;16558:3;16554:12;16546:6;16517:50;:::i;16730:1793::-;17393:66;17381:79;;17490:34;17485:2;17476:12;;17469:56;-1:-1:-1;;;17550:2:1;17541:12;;17534:70;-1:-1:-1;17623:50:1;17669:2;17660:12;;17652:6;17623:50;:::i;:::-;-1:-1:-1;;;17682:32:1;;17742:66;17738:1;17730:10;;17723:86;17838:34;17833:2;17825:11;;17818:55;17902:34;17897:2;17889:11;;17882:55;17967:34;17961:3;17953:12;;17946:56;18032:34;18026:3;18018:12;;18011:56;-1:-1:-1;;;18091:3:1;18083:12;;18076:73;18179:66;18173:3;18165:12;;18158:88;18276:34;18270:3;18262:12;;18255:56;18341:34;18335:3;18327:12;;18320:56;-1:-1:-1;;;18400:3:1;18392:12;;18385:73;4953:66;18512:3;18504:12;;4941:79;5050:66;5036:12;;;5029:88;-1:-1:-1;;;5133:12:1;;;5126:39;5181:12;;;18474:43;4876:323;18528:800;19034:66;19029:3;19022:79;19004:3;19120:50;19166:2;19161:3;19157:12;19149:6;19120:50;:::i;19333:563::-;19693:66;19688:3;19681:79;19663:3;19779:50;19825:2;19820:3;19816:12;19808:6;19779:50;:::i;19901:845::-;20407:66;20395:79;;-1:-1:-1;;;20499:2:1;20490:12;;20483:36;-1:-1:-1;20538:50:1;20584:2;20575:12;;20567:6;20538:50;:::i;20959:499::-;-1:-1:-1;;;;;21228:15:1;;;21210:34;;21280:15;;21275:2;21260:18;;21253:43;21327:2;21312:18;;21305:34;;;21375:3;21370:2;21355:18;;21348:31;;;21153:4;;21396:56;;21432:19;;21424:6;21396:56;:::i;:::-;21388:64;20959:499;-1:-1:-1;;;;;;20959:499:1:o;21655:230::-;21804:2;21793:9;21786:21;21767:4;21824:55;21875:2;21864:9;21860:18;21852:6;21824:55;:::i;22707:414::-;22909:2;22891:21;;;22948:2;22928:18;;;22921:30;22987:34;22982:2;22967:18;;22960:62;-1:-1:-1;;;23053:2:1;23038:18;;23031:48;23111:3;23096:19;;22707:414::o;27082:356::-;27284:2;27266:21;;;27303:18;;;27296:30;27362:34;27357:2;27342:18;;27335:62;27429:2;27414:18;;27082:356::o;28255:413::-;28457:2;28439:21;;;28496:2;28476:18;;;28469:30;28535:34;28530:2;28515:18;;28508:62;-1:-1:-1;;;28601:2:1;28586:18;;28579:47;28658:3;28643:19;;28255:413::o;29628:128::-;29668:3;29699:1;29695:6;29692:1;29689:13;29686:39;;;29705:18;;:::i;:::-;-1:-1:-1;29741:9:1;;29628:128::o;29761:120::-;29801:1;29827;29817:35;;29832:18;;:::i;:::-;-1:-1:-1;29866:9:1;;29761:120::o;29886:168::-;29926:7;29992:1;29988;29984:6;29980:14;29977:1;29974:21;29969:1;29962:9;29955:17;29951:45;29948:71;;;29999:18;;:::i;:::-;-1:-1:-1;30039:9:1;;29886:168::o;30059:125::-;30099:4;30127:1;30124;30121:8;30118:34;;;30132:18;;:::i;:::-;-1:-1:-1;30169:9:1;;30059:125::o;30189:258::-;30261:1;30271:113;30285:6;30282:1;30279:13;30271:113;;;30361:11;;;30355:18;30342:11;;;30335:39;30307:2;30300:10;30271:113;;;30402:6;30399:1;30396:13;30393:48;;;-1:-1:-1;;30437:1:1;30419:16;;30412:27;30189:258::o;30452:380::-;30531:1;30527:12;;;;30574;;;30595:61;;30649:4;30641:6;30637:17;30627:27;;30595:61;30702:2;30694:6;30691:14;30671:18;30668:38;30665:161;;;30748:10;30743:3;30739:20;30736:1;30729:31;30783:4;30780:1;30773:15;30811:4;30808:1;30801:15;30665:161;;30452:380;;;:::o;30837:135::-;30876:3;-1:-1:-1;;30897:17:1;;30894:43;;;30917:18;;:::i;:::-;-1:-1:-1;30964:1:1;30953:13;;30837:135::o;30977:112::-;31009:1;31035;31025:35;;31040:18;;:::i;:::-;-1:-1:-1;31074:9:1;;30977:112::o;31094:127::-;31155:10;31150:3;31146:20;31143:1;31136:31;31186:4;31183:1;31176:15;31210:4;31207:1;31200:15;31226:127;31287:10;31282:3;31278:20;31275:1;31268:31;31318:4;31315:1;31308:15;31342:4;31339:1;31332:15;31358:127;31419:10;31414:3;31410:20;31407:1;31400:31;31450:4;31447:1;31440:15;31474:4;31471:1;31464:15;31490:127;31551:10;31546:3;31542:20;31539:1;31532:31;31582:4;31579:1;31572:15;31606:4;31603:1;31596:15;31622:127;31683:10;31678:3;31674:20;31671:1;31664:31;31714:4;31711:1;31704:15;31738:4;31735:1;31728:15;31754:131;-1:-1:-1;;;;;;31828:32:1;;31818:43;;31808:71;;31875:1;31872;31865:12

Swarm Source

ipfs://a4daa25774d88fa74a7982a6ff57f04d5f66e3ab4a405ba7a284134fe2aaa9f7
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.