ETH Price: $3,219.62 (+0.79%)

Token

Cangjie (CANGJIE)
 

Overview

Max Total Supply

123 CANGJIE

Holders

62

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
vulkanr.eth
Balance
2 CANGJIE
0xf96a25652e9fdd4528bddec90f9a614ba469924c
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Cangjie was the creator of Chinese characters. The Cangjie NFTs are Chinese characters generated with Taiji, Wuxing, Yi Jing, and more.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Cangjie

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

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






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




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

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

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




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









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

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

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

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

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

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

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

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





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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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














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







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





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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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









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


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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).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 {}
}







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


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


contract Cangjie is ERC721Enumerable, ReentrancyGuard, Ownable {
    uint256 private constant MAX_TOTAL_SUPPLY = 10000;
    uint256 private constant RESERVED = 500;

    uint256 private constant han_start = 0x4E00;
    uint256 private constant han_end = 0x9FD5;
    uint256 private constant IChing_start = 0x4DC0;
    uint256 private constant IChing_end = 0x4DFF;
    string[] private yinyang = ["Yin", "Yang"];
    string[] private wuxing = ["Metal", "Wood", "Water", "Fire", "Earth"];

    uint256 public ownerClaimCount = 0;

    IERC721 mLoot = IERC721(0x1dfe7Ca09e99d10835Bf73044a23B73Fc20623DF);
    IERC721 xLoot = IERC721(0x8bf2f876E2dCD2CAe9C3d272f325776c82DA366d);
    IERC721 pLoot = IERC721(0x03Ea00B0619e19759eE7ba33E8EB8E914fbF52Ea);
    IERC721 bLoot = IERC721(0x4F8730E0b32B04beaa5757e5aea3aeF970E5B613);
    IERC721 superLoot = IERC721(0xDEeD638915ea9160912a77221829364F19A7b99d);


    function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input)));
    }

    function getHan(uint256 tokenId) public pure returns (string memory) {
        return pluckWithUnicode(tokenId, "Han", han_start, han_end);
    }

    function getYinYang(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "YinYang", yinyang);
    }

    function getIChing(uint256 tokenId) public pure returns (string memory) {
        string memory first = pluckWithUnicode(tokenId, "IChing+1", IChing_start, IChing_end);
        string memory second = pluckWithUnicode(tokenId, "IChing+2", IChing_start, IChing_end);
        string memory third = pluckWithUnicode(tokenId, "IChing+3", IChing_start, IChing_end);
        return string(abi.encodePacked(first, ' ', second, ' ', third));
    }

    function getMetal(uint256 tokenId) public view returns (string memory) {
        return pluckWithRange(tokenId, wuxing[0], 1, 10);
    }

    function getWood(uint256 tokenId) public view returns (string memory) {
        return pluckWithRange(tokenId, wuxing[1], 1, 10);
    }

    function getWater(uint256 tokenId) public view returns (string memory) {
        return pluckWithRange(tokenId, wuxing[2], 1, 10);
    }

    function getFire(uint256 tokenId) public view returns (string memory) {
        return pluckWithRange(tokenId, wuxing[3], 1, 10);
    }

    function getEarth(uint256 tokenId) public view returns (string memory) {
        return pluckWithRange(tokenId, wuxing[4], 1, 10);
    }

    function pluck(uint256 tokenId, string memory keyPrefix, string[] memory sourceArray) internal pure returns (string memory) {
        uint256 rand = random(string(abi.encodePacked(keyPrefix, toString(tokenId))));
        string memory output = sourceArray[rand % sourceArray.length];
        uint256 greatness = rand % 21;
        if (keccak256(abi.encodePacked(keyPrefix)) == keccak256(abi.encodePacked("YinYang")) && greatness > 19) {
            output = string(abi.encodePacked(output, ' ', unicode"☯️"));
        }
        return output;
    }

    function pluckWithUnicode(uint256 tokenId, string memory keyPrefix, uint256 start, uint256 end) internal pure returns (string memory) {
        uint256 rand = random(string(abi.encodePacked(keyPrefix, toString(tokenId))));
        string memory output = string(abi.encodePacked("&#x", Strings.toUnicodeString(start + rand % (end - start + 1)), ";"));
        return output;
    }

    function pluckWithRange(uint256 tokenId, string memory keyPrefix, uint256 start, uint256 end) internal view returns (string memory) {
        uint256 rand = random(string(abi.encodePacked(keyPrefix, toString(tokenId))));
        uint256 score = start + rand % (end - start + 1);
        string memory output = toString(score);
        uint256 greatness = rand % 21;
        if (greatness > 19) {
            if (keccak256(abi.encodePacked(keyPrefix)) == keccak256(abi.encodePacked(wuxing[0]))) {
                output = string(abi.encodePacked(output, ' ', unicode"🥇"));
            } else if (keccak256(abi.encodePacked(keyPrefix)) == keccak256(abi.encodePacked(wuxing[1]))) {
                output = string(abi.encodePacked(output, ' ', unicode"🌳"));
            } else if (keccak256(abi.encodePacked(keyPrefix)) == keccak256(abi.encodePacked(wuxing[2]))) {
                output = string(abi.encodePacked(output, ' ', unicode"💧"));
            } else if (keccak256(abi.encodePacked(keyPrefix)) == keccak256(abi.encodePacked(wuxing[3]))) {
                output = string(abi.encodePacked(output, ' ', unicode"🔥"));
            } else if (keccak256(abi.encodePacked(keyPrefix)) == keccak256(abi.encodePacked(wuxing[4]))) {
                output = string(abi.encodePacked(output, ' ', unicode"🌍"));
            }
        }
        return output;
    }

    function tokenURI(uint256 tokenId) override public view returns (string memory) {
        string[19] memory parts;
        parts[0] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.i{fill:#fff;font-family:serif;font-weight:700}</style><rect width="100%" height="100%" fill="#090d20"/><text x="30" y="230" class="i" font-size="200">';

        parts[1] = getHan(tokenId);

        parts[2] = '</text><text x="30" y="30" class="i">';

        parts[3] = string(abi.encodePacked('#', toString(tokenId)));

        parts[4] = '</text><text x="250" y="95" class="i">';

        parts[5] = getYinYang(tokenId);

        parts[6] = '</text><text x="250" y="130" class="i">';

        parts[7] = string(abi.encodePacked('Metal ', getMetal(tokenId)));

        parts[8] = '</text><text x="250" y="155" class="i">';

        parts[9] = string(abi.encodePacked('Wood ', getWood(tokenId)));

        parts[10] = '</text><text x="250" y="180" class="i">';

        parts[11] = string(abi.encodePacked('Water ', getWater(tokenId)));

        parts[12] = '</text><text x="250" y="205" class="i">';

        parts[13] = string(abi.encodePacked('Fire ', getFire(tokenId)));

        parts[14] = '</text><text x="250" y="230" class="i">';

        parts[15] = string(abi.encodePacked('Earth ', getEarth(tokenId)));

        parts[16] = '</text><text x="250" y="265" class="i">';

        parts[17] = getIChing(tokenId);

        parts[18] = '</text></svg>';

        string memory output = string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7], parts[8]));
        output = string(abi.encodePacked(output, parts[9], parts[10], parts[11], parts[12], parts[13], parts[14], parts[15], parts[16]));
        output = string(abi.encodePacked(output, parts[17], parts[18]));

        string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "Chinese #', toString(tokenId), '", "description": "Cangjie was the creator of Chinese characters. The Cangjie NFTs are Chinese characters generated with Taiji, Wuxing, Yi Jing, and more.", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}'))));
        output = string(abi.encodePacked('data:application/json;base64,', json));

        return output;
    }

    function isLooter(address account) public view returns (bool) {
        if (mLoot.balanceOf(account) > 0) return true;
        if (xLoot.balanceOf(account) > 0) return true;
        if (pLoot.balanceOf(account) > 0) return true;
        if (bLoot.balanceOf(account) > 0) return true;
        if (superLoot.balanceOf(account) > 0) return true;
        return false;
    }

    function claim(uint256 tokenId) public payable nonReentrant {
        require(tokenId > 0 && tokenId < 1000000, "Token ID invalid");
        require(totalSupply() < MAX_TOTAL_SUPPLY - RESERVED, "Maximum");

        if (!isLooter(msg.sender)) {
            if (totalSupply() >= 500 && totalSupply() < 1000) {
                require(msg.value >= 0.005 ether, "Ether value sent is not correct");
            } else if (totalSupply() >= 1000) {
                require(msg.value >= 0.01 ether, "Ether value sent is not correct");
            }
        }
        _safeMint(_msgSender(), tokenId);
    }

    function ownerClaim(uint256 tokenId) public nonReentrant onlyOwner {
        require(tokenId > 0 && tokenId < 1000000, "Token ID invalid");
        require(ownerClaimCount < RESERVED, "Maximum");
        ownerClaimCount = ownerClaimCount + 1;
        _safeMint(owner(), tokenId);
    }

    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT license
        // 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);
    }

    function withdraw(address to, uint256 amount) external onlyOwner {
        (bool success,) = to.call{value : amount}("");
        require(success, "Transfer failed.");
    }

    constructor() ERC721("Cangjie", "CANGJIE") Ownable() {}
}

/// [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 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":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getEarth","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFire","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getHan","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getIChing","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getMetal","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getWater","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getWood","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getYinYang","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isLooter","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":"ownerClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ownerClaimCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600360c0908152622cb4b760e91b60e052608090815261014060405260046101009081526359616e6760e01b6101205260a0526200004290600c9060026200028b565b506040805160e081018252600560a082018181526413595d185b60da1b60c084015282528251808401845260048082526315dbdbd960e21b6020838101919091528085019290925284518086018652838152642bb0ba32b960d91b818401528486015284518086018652908152634669726560e01b81830152606084015283518085019094528184526408ac2e4e8d60db1b908401526080820192909252620000ef91600d9190620002ef565b506000600e55600f80546001600160a01b0319908116731dfe7ca09e99d10835bf73044a23b73fc20623df17909155601080548216738bf2f876e2dcd2cae9c3d272f325776c82da366d1790556011805482167303ea00b0619e19759ee7ba33e8eb8e914fbf52ea179055601280548216734f8730e0b32b04beaa5757e5aea3aef970e5b6131790556013805490911673deed638915ea9160912a77221829364f19a7b99d179055348015620001a457600080fd5b506040518060400160405280600781526020016643616e676a696560c81b8152506040518060400160405280600781526020016643414e474a494560c81b8152508160009080519060200190620001fd92919062000341565b5080516200021390600190602084019062000341565b50506001600a55506200022f6200022962000235565b62000239565b62000486565b3390565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054828255906000526020600020908101928215620002dd579160200282015b82811115620002dd5782518051620002cc91849160209091019062000341565b5091602001919060010190620002ac565b50620002eb929150620003cc565b5090565b828054828255906000526020600020908101928215620002dd579160200282015b82811115620002dd57825180516200033091849160209091019062000341565b509160200191906001019062000310565b8280546200034f9062000449565b90600052602060002090601f016020900481019282620003735760008555620003be565b82601f106200038e57805160ff1916838001178555620003be565b82800160010185558215620003be579182015b82811115620003be578251825591602001919060010190620003a1565b50620002eb929150620003ed565b80821115620002eb576000620003e3828262000404565b50600101620003cc565b5b80821115620002eb5760008155600101620003ee565b508054620004129062000449565b6000825580601f1062000426575062000446565b601f016020900490600052602060002090810190620004469190620003ed565b50565b6002810460018216806200045e57607f821691505b602082108114156200048057634e487b7160e01b600052602260045260246000fd5b50919050565b613c0e80620004966000396000f3fe6080604052600436106101e35760003560e01c8063648e200a11610102578063b88d4fde11610095578063e985e9c511610064578063e985e9c514610558578063f2fde38b14610578578063f3fef3a314610598578063fb848d56146105b8576101e3565b8063b88d4fde146104d8578063b9bb84d1146104f8578063c87b56dd14610518578063e467804b14610538576101e3565b80639231269a116100d15780639231269a1461046357806395d89b4114610483578063a22cb46514610498578063ac2f4518146104b8576101e3565b8063648e200a146103f957806370a0823114610419578063715018a6146104395780638da5cb5b1461044e576101e3565b80632fe614cc1161017a578063434f48c411610149578063434f48c4146103795780634a25b83e146103995780634f6ccce7146103b95780636352211e146103d9576101e3565b80632fe614cc14610311578063379607f5146103315780633817190a1461034457806342842e0e14610359576101e3565b80630a11c4cc116101b65780630a11c4cc1461028f57806318160ddd146102af57806323b872dd146102d15780632f745c59146102f1576101e3565b806301ffc9a7146101e857806306fdde031461021e578063081812fc14610240578063095ea7b31461026d575b600080fd5b3480156101f457600080fd5b50610208610203366004612ae7565b6105d8565b6040516102159190613203565b60405180910390f35b34801561022a57600080fd5b50610233610605565b604051610215919061320e565b34801561024c57600080fd5b5061026061025b366004612b1f565b610697565b60405161021591906131b2565b34801561027957600080fd5b5061028d610288366004612abe565b6106e3565b005b34801561029b57600080fd5b506102336102aa366004612b1f565b61077b565b3480156102bb57600080fd5b506102c461083f565b60405161021591906137e7565b3480156102dd57600080fd5b5061028d6102ec36600461297d565b610845565b3480156102fd57600080fd5b506102c461030c366004612abe565b61087d565b34801561031d57600080fd5b5061023361032c366004612b1f565b6108cf565b61028d61033f366004612b1f565b61099b565b34801561035057600080fd5b506102c4610ad2565b34801561036557600080fd5b5061028d61037436600461297d565b610ad8565b34801561038557600080fd5b5061028d610394366004612b1f565b610af3565b3480156103a557600080fd5b506102336103b4366004612b1f565b610bc7565b3480156103c557600080fd5b506102c46103d4366004612b1f565b610bef565b3480156103e557600080fd5b506102606103f4366004612b1f565b610c4a565b34801561040557600080fd5b50610208610414366004612931565b610c7f565b34801561042557600080fd5b506102c4610434366004612931565b610f56565b34801561044557600080fd5b5061028d610f9a565b34801561045a57600080fd5b50610260610fe5565b34801561046f57600080fd5b5061023361047e366004612b1f565b610ff4565b34801561048f57600080fd5b50610233611021565b3480156104a457600080fd5b5061028d6104b3366004612a84565b611030565b3480156104c457600080fd5b506102336104d3366004612b1f565b6110fe565b3480156104e457600080fd5b5061028d6104f33660046129b8565b6111fb565b34801561050457600080fd5b50610233610513366004612b1f565b61123a565b34801561052457600080fd5b50610233610533366004612b1f565b611262565b34801561054457600080fd5b50610233610553366004612b1f565b61162b565b34801561056457600080fd5b5061020861057336600461294b565b611653565b34801561058457600080fd5b5061028d610593366004612931565b611681565b3480156105a457600080fd5b5061028d6105b3366004612abe565b6116f2565b3480156105c457600080fd5b506102336105d3366004612b1f565b6117ad565b60006001600160e01b0319821663780e9d6360e01b14806105fd57506105fd826117d5565b90505b919050565b606060008054610614906138a1565b80601f0160208091040260200160405190810160405280929190818152602001828054610640906138a1565b801561068d5780601f106106625761010080835404028352916020019161068d565b820191906000526020600020905b81548152906001019060200180831161067057829003601f168201915b5050505050905090565b60006106a282611815565b6106c75760405162461bcd60e51b81526004016106be906135b4565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006106ee82610c4a565b9050806001600160a01b0316836001600160a01b031614156107225760405162461bcd60e51b81526004016106be906136a8565b806001600160a01b0316610734611832565b6001600160a01b03161480610750575061075081610573611832565b61076c5760405162461bcd60e51b81526004016106be9061346e565b6107768383611836565b505050565b60606105fd82600d6001815481106107a357634e487b7160e01b600052603260045260246000fd5b9060005260206000200180546107b8906138a1565b80601f01602080910402602001604051908101604052809291908181526020018280546107e4906138a1565b80156108315780601f1061080657610100808354040283529160200191610831565b820191906000526020600020905b81548152906001019060200180831161081457829003601f168201915b50505050506001600a6118a4565b60085490565b610856610850611832565b82611c34565b6108725760405162461bcd60e51b81526004016106be90613713565b610776838383611cb1565b600061088883610f56565b82106108a65760405162461bcd60e51b81526004016106be90613256565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b606060006109038360405180604001604052806008815260200167494368696e672b3160c01b815250614dc0614dff611dde565b90506000610937846040518060400160405280600881526020016724a1b434b733959960c11b815250614dc0614dff611dde565b9050600061096b8560405180604001604052806008815260200167494368696e672b3360c01b815250614dc0614dff611dde565b905082828260405160200161098293929190612cc9565b6040516020818303038152906040529350505050919050565b6002600a5414156109be5760405162461bcd60e51b81526004016106be906137b0565b6002600a5580158015906109d45750620f424081105b6109f05760405162461bcd60e51b81526004016106be90613635565b6109fe6101f4612710613847565b610a0661083f565b10610a235760405162461bcd60e51b81526004016106be9061355e565b610a2c33610c7f565b610ab9576101f4610a3b61083f565b10158015610a5157506103e8610a4f61083f565b105b15610a82576611c37937e08000341015610a7d5760405162461bcd60e51b81526004016106be906133eb565b610ab9565b6103e8610a8d61083f565b10610ab957662386f26fc10000341015610ab95760405162461bcd60e51b81526004016106be906133eb565b610aca610ac4611832565b82611e4f565b506001600a55565b600e5481565b610776838383604051806020016040528060008152506111fb565b6002600a541415610b165760405162461bcd60e51b81526004016106be906137b0565b6002600a55610b23611832565b6001600160a01b0316610b34610fe5565b6001600160a01b031614610b5a5760405162461bcd60e51b81526004016106be90613600565b600081118015610b6c5750620f424081105b610b885760405162461bcd60e51b81526004016106be90613635565b6101f4600e5410610bab5760405162461bcd60e51b81526004016106be9061355e565b600e54610bb99060016137fc565b600e55610aca610ac4610fe5565b60606105fd82600d6003815481106107a357634e487b7160e01b600052603260045260246000fd5b6000610bf961083f565b8210610c175760405162461bcd60e51b81526004016106be90613764565b60088281548110610c3857634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806105fd5760405162461bcd60e51b81526004016106be90613515565b600f546040516370a0823160e01b815260009182916001600160a01b03909116906370a0823190610cb49086906004016131b2565b60206040518083038186803b158015610ccc57600080fd5b505afa158015610ce0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d049190612b37565b1115610d1257506001610600565b6010546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610d439086906004016131b2565b60206040518083038186803b158015610d5b57600080fd5b505afa158015610d6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d939190612b37565b1115610da157506001610600565b6011546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610dd29086906004016131b2565b60206040518083038186803b158015610dea57600080fd5b505afa158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612b37565b1115610e3057506001610600565b6012546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610e619086906004016131b2565b60206040518083038186803b158015610e7957600080fd5b505afa158015610e8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb19190612b37565b1115610ebf57506001610600565b6013546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610ef09086906004016131b2565b60206040518083038186803b158015610f0857600080fd5b505afa158015610f1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f409190612b37565b1115610f4e57506001610600565b506000919050565b60006001600160a01b038216610f7e5760405162461bcd60e51b81526004016106be906134cb565b506001600160a01b031660009081526003602052604090205490565b610fa2611832565b6001600160a01b0316610fb3610fe5565b6001600160a01b031614610fd95760405162461bcd60e51b81526004016106be90613600565b610fe36000611e6d565b565b600b546001600160a01b031690565b60606105fd82604051806040016040528060038152602001622430b760e91b815250614e00619fd5611dde565b606060018054610614906138a1565b611038611832565b6001600160a01b0316826001600160a01b031614156110695760405162461bcd60e51b81526004016106be906133b4565b8060056000611076611832565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556110ba611832565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110f29190613203565b60405180910390a35050565b60606105fd826040518060400160405280600781526020016659696e59616e6760c81b815250600c805480602002602001604051908101604052809291908181526020016000905b828210156111f2578382906000526020600020018054611165906138a1565b80601f0160208091040260200160405190810160405280929190818152602001828054611191906138a1565b80156111de5780601f106111b3576101008083540402835291602001916111de565b820191906000526020600020905b8154815290600101906020018083116111c157829003601f168201915b505050505081526020019060010190611146565b50505050611ebf565b61120c611206611832565b83611c34565b6112285760405162461bcd60e51b81526004016106be90613713565b61123484848484611fa6565b50505050565b60606105fd82600d6000815481106107a357634e487b7160e01b600052603260045260246000fd5b606061126c6128f2565b60405180610120016040528061010081526020016139f26101009139815261129383610ff4565b8160016020020181905250604051806060016040528060258152602001613b8d6025913960408201526112c583611fd9565b6040516020016112d59190613120565b60408051808303601f19018152918152606080840192909252805191820190526026808252613b6760208301396080820152611310836110fe565b60a082015260408051606081019091526027808252613964602083013960c082015261133b8361123a565b60405160200161134b9190613191565b60408051808303601f1901815291815260e08301919091528051606081019091526027808252613b1960208301396101008201526113888361077b565b604051602001611398919061303b565b60408051808303601f19018152918152610120830191909152805160608101909152602780825261398b60208301396101408201526113d68361162b565b6040516020016113e691906130df565b60408051808303601f190181529181526101608301919091528051606081019091526027808252613af2602083013961018082015261142483610bc7565b6040516020016114349190613100565b60408051808303601f190181529181526101a08301919091528051606081019091526027808252613b4060208301396101c0820152611472836117ad565b604051602001611482919061307b565b60408051808303601f190181529181526101e08301919091528051606081019091526027808252613bb260208301396102008201526114c0836108cf565b610220820152604080518082018252600d81526c1e17ba32bc3a1f1e17b9bb339f60991b602080830191909152610240840191909152825181840151838501516060860151608087015160a088015160c089015160e08a01516101008b0151995160009a6115309a909101612c09565b60408051808303601f19018152908290526101208401516101408501516101608601516101808701516101a08801516101c08901516101e08a01516102008b0151979950611583988a9890602001612c09565b60408051808303601f19018152908290526102208401516102408501519193506115b292849290602001612bc6565b604051602081830303815290604052905060006115ff6115d186611fd9565b6115da846120f4565b6040516020016115eb929190612eec565b6040516020818303038152906040526120f4565b9050806040516020016116129190613149565b60408051808303601f1901815291905295945050505050565b60606105fd82600d6002815481106107a357634e487b7160e01b600052603260045260246000fd5b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b611689611832565b6001600160a01b031661169a610fe5565b6001600160a01b0316146116c05760405162461bcd60e51b81526004016106be90613600565b6001600160a01b0381166116e65760405162461bcd60e51b81526004016106be906132f3565b6116ef81611e6d565b50565b6116fa611832565b6001600160a01b031661170b610fe5565b6001600160a01b0316146117315760405162461bcd60e51b81526004016106be90613600565b6000826001600160a01b03168260405161174a9061318e565b60006040518083038185875af1925050503d8060008114611787576040519150601f19603f3d011682016040523d82523d6000602084013e61178c565b606091505b50509050806107765760405162461bcd60e51b81526004016106be906136e9565b60606105fd82600d6004815481106107a357634e487b7160e01b600052603260045260246000fd5b60006001600160e01b031982166380ac58cd60e01b148061180657506001600160e01b03198216635b5e139f60e01b145b806105fd57506105fd82612268565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061186b82610c4a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b606060006118da856118b588611fd9565b6040516020016118c6929190612b97565b604051602081830303815290604052612281565b905060006118e88585613847565b6118f39060016137fc565b6118fd90836138f7565b61190790866137fc565b9050600061191482611fd9565b905060006119236015856138f7565b90506013811115611c2657600d60008154811061195057634e487b7160e01b600052603260045260246000fd5b9060005260206000200160405160200161196a9190612e51565b60405160208183030381529060405280519060200120886040516020016119919190612b7b565b6040516020818303038152906040528051906020012014156119d457816040516020016119be9190612dbb565b6040516020818303038152906040529150611c26565b600d6001815481106119f657634e487b7160e01b600052603260045260246000fd5b90600052602060002001604051602001611a109190612e51565b6040516020818303038152906040528051906020012088604051602001611a379190612b7b565b604051602081830303815290604052805190602001201415611a6457816040516020016119be9190612d89565b600d600281548110611a8657634e487b7160e01b600052603260045260246000fd5b90600052602060002001604051602001611aa09190612e51565b6040516020818303038152906040528051906020012088604051602001611ac79190612b7b565b604051602081830303815290604052805190602001201415611af457816040516020016119be9190612e1f565b600d600381548110611b1657634e487b7160e01b600052603260045260246000fd5b90600052602060002001604051602001611b309190612e51565b6040516020818303038152906040528051906020012088604051602001611b579190612b7b565b604051602081830303815290604052805190602001201415611b8457816040516020016119be9190612d23565b600d600481548110611ba657634e487b7160e01b600052603260045260246000fd5b90600052602060002001604051602001611bc09190612e51565b6040516020818303038152906040528051906020012088604051602001611be79190612b7b565b604051602081830303815290604052805190602001201415611c265781604051602001611c149190612ded565b60405160208183030381529060405291505b50925050505b949350505050565b6000611c3f82611815565b611c5b5760405162461bcd60e51b81526004016106be90613422565b6000611c6683610c4a565b9050806001600160a01b0316846001600160a01b03161480611ca15750836001600160a01b0316611c9684610697565b6001600160a01b0316145b80611c2c5750611c2c8185611653565b826001600160a01b0316611cc482610c4a565b6001600160a01b031614611cea5760405162461bcd60e51b81526004016106be9061365f565b6001600160a01b038216611d105760405162461bcd60e51b81526004016106be90613370565b611d1b8383836122b2565b611d26600082611836565b6001600160a01b0383166000908152600360205260408120805460019290611d4f908490613847565b90915550506001600160a01b0382166000908152600360205260408120805460019290611d7d9084906137fc565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60606000611def856118b588611fd9565b90506000611e24611e008686613847565b611e0b9060016137fc565b611e1590846138f7565b611e1f90876137fc565b61233b565b604051602001611e3491906130a9565b60408051808303601f19018152919052979650505050505050565b611e6982826040518060200160405280600081525061238e565b5050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60606000611ed0846118b587611fd9565b9050600083845183611ee291906138f7565b81518110611f0057634e487b7160e01b600052603260045260246000fd5b602002602001015190506000601583611f1991906138f7565b9050604051602001611f2a90613068565b6040516020818303038152906040528051906020012086604051602001611f519190612b7b565b60405160208183030381529060405280519060200120148015611f745750601381115b15611f9c5781604051602001611f8a9190612d55565b60405160208183030381529060405291505b5095945050505050565b611fb1848484611cb1565b611fbd848484846123c1565b6112345760405162461bcd60e51b81526004016106be906132a1565b606081611ffe57506040805180820190915260018152600360fc1b6020820152610600565b8160005b81156120285780612012816138dc565b91506120219050600a83613814565b9150612002565b60008167ffffffffffffffff81111561205157634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561207b576020820181803683370190505b5090505b8415611c2c57612090600183613847565b915061209d600a866138f7565b6120a89060306137fc565b60f81b8183815181106120cb57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506120ed600a86613814565b945061207f565b805160609080612114575050604080516020810190915260008152610600565b600060036121238360026137fc565b61212d9190613814565b612138906004613828565b905060006121478260206137fc565b67ffffffffffffffff81111561216d57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612197576020820181803683370190505b50905060006040518060600160405280604081526020016139b2604091399050600181016020830160005b86811015612223576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b8352600490920191016121c2565b50600386066001811461223d576002811461224e5761225a565b613d3d60f01b60011983015261225a565b603d60f81b6000198301525b505050918152949350505050565b6001600160e01b031981166301ffc9a760e01b14919050565b6000816040516020016122949190612b7b565b60408051601f19818403018152919052805160209091012092915050565b6122bd838383610776565b6001600160a01b0383166122d9576122d4816124d9565b6122fc565b816001600160a01b0316836001600160a01b0316146122fc576122fc838261251d565b6001600160a01b03821661231857612313816125ba565b610776565b826001600160a01b0316826001600160a01b031614610776576107768282612693565b6060816123615750604080518082019091526002815261030360f41b6020820152610600565b8160005b81156123845780612375816138dc565b915050600882901c9150612365565b611c2c84826126d7565b612398838361280d565b6123a560008484846123c1565b6107765760405162461bcd60e51b81526004016106be906132a1565b60006123d5846001600160a01b03166128ec565b156124d157836001600160a01b031663150b7a026123f1611832565b8786866040518563ffffffff1660e01b815260040161241394939291906131c6565b602060405180830381600087803b15801561242d57600080fd5b505af192505050801561245d575060408051601f3d908101601f1916820190925261245a91810190612b03565b60015b6124b7573d80801561248b576040519150601f19603f3d011682016040523d82523d6000602084013e612490565b606091505b5080516124af5760405162461bcd60e51b81526004016106be906132a1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c2c565b506001611c2c565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6000600161252a84610f56565b6125349190613847565b600083815260076020526040902054909150808214612587576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906125cc90600190613847565b6000838152600960205260408120546008805493945090928490811061260257634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061263157634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061267757634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061269e83610f56565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b606060006126e6836002613828565b67ffffffffffffffff81111561270c57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612736576020820181803683370190505b50905060006001612748856002613828565b6127529190613847565b90505b6f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061278b57634e487b7160e01b600052603260045260246000fd5b1a60f81b8282815181106127af57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c93806127d7576127e7565b6127e08161388a565b9050612755565b5083156128065760405162461bcd60e51b81526004016106be90613221565b9392505050565b6001600160a01b0382166128335760405162461bcd60e51b81526004016106be9061357f565b61283c81611815565b156128595760405162461bcd60e51b81526004016106be90613339565b612865600083836122b2565b6001600160a01b038216600090815260036020526040812080546001929061288e9084906137fc565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b6040518061026001604052806013905b60608152602001906001900390816129025790505090565b80356001600160a01b038116811461060057600080fd5b600060208284031215612942578081fd5b6128068261291a565b6000806040838503121561295d578081fd5b6129668361291a565b91506129746020840161291a565b90509250929050565b600080600060608486031215612991578081fd5b61299a8461291a565b92506129a86020850161291a565b9150604084013590509250925092565b600080600080608085870312156129cd578081fd5b6129d68561291a565b935060206129e581870161291a565b935060408601359250606086013567ffffffffffffffff80821115612a08578384fd5b818801915088601f830112612a1b578384fd5b813581811115612a2d57612a2d613937565b604051601f8201601f1916810185018381118282101715612a5057612a50613937565b60405281815283820185018b1015612a66578586fd5b81858501868301379081019093019390935250939692955090935050565b60008060408385031215612a96578182fd5b612a9f8361291a565b915060208301358015158114612ab3578182fd5b809150509250929050565b60008060408385031215612ad0578182fd5b612ad98361291a565b946020939093013593505050565b600060208284031215612af8578081fd5b81356128068161394d565b600060208284031215612b14578081fd5b81516128068161394d565b600060208284031215612b30578081fd5b5035919050565b600060208284031215612b48578081fd5b5051919050565b60008151808452612b6781602086016020860161385e565b601f01601f19169290920160200192915050565b60008251612b8d81846020870161385e565b9190910192915050565b60008351612ba981846020880161385e565b835190830190612bbd81836020880161385e565b01949350505050565b60008451612bd881846020890161385e565b845190830190612bec81836020890161385e565b8451910190612bff81836020880161385e565b0195945050505050565b60008a51612c1b818460208f0161385e565b8a51612c2d8183860160208f0161385e565b8a519184010190612c42818360208e0161385e565b8951910190612c55818360208d0161385e565b8851612c678183850160208d0161385e565b8851929091010190612c7d818360208b0161385e565b8651612c8f8183850160208b0161385e565b8651929091010190612ca581836020890161385e565b8451612cb7818385016020890161385e565b9101019b9a5050505050505050505050565b60008451612cdb81846020890161385e565b8083019050600160fd1b8082528551612cfb816001850160208a0161385e565b60019201918201528351612d1681600284016020880161385e565b0160020195945050505050565b60008251612d3581846020870161385e565b600160fd1b92019182525063f09f94a560e01b6001820152600501919050565b60008251612d6781846020870161385e565b600160fd1b92019182525065e298afefb88f60d01b6001820152600701919050565b60008251612d9b81846020870161385e565b600160fd1b92019182525063f09f8cb360e01b6001820152600501919050565b60008251612dcd81846020870161385e565b600160fd1b92019182525063f09fa58760e01b6001820152600501919050565b60008251612dff81846020870161385e565b600160fd1b92019182525063f09f8c8d60e01b6001820152600501919050565b60008251612e3181846020870161385e565b600160fd1b92019182525063f09f92a760e01b6001820152600501919050565b8154600090819060028104600180831680612e6d57607f831692505b6020808410821415612e8d57634e487b7160e01b87526022600452602487fd5b818015612ea15760018114612eb257612ede565b60ff19861689528489019650612ede565b612ebb8a6137f0565b885b86811015612ed65781548b820152908501908301612ebd565b505084890196505b509498975050505050505050565b727b226e616d65223a20224368696e657365202360681b81528251600090612f1b81601385016020880161385e565b7f222c20226465736372697074696f6e223a202243616e676a69652077617320746013918401918201527f68652063726561746f72206f66204368696e657365206368617261637465727360338201527f2e205468652043616e676a6965204e46547320617265204368696e657365206360538201527f6861726163746572732067656e6572617465642077697468205461696a692c2060738201527f577578696e672c205969204a696e672c20616e64206d6f72652e222c2022696d60938201527f616765223a2022646174613a696d6167652f7376672b786d6c3b62617365363460b3820152600b60fa1b60d382015283516130208160d484016020880161385e565b61227d60f01b60d4929091019182015260d601949350505050565b60006402bb7b7b2160dd1b8252825161305b81600585016020870161385e565b9190910160050192915050565b6659696e59616e6760c81b815260070190565b600065022b0b93a34160d51b8252825161309c81600685016020870161385e565b9190910160060192915050565b60006204c46f60eb1b825282516130c781600385016020870161385e565b603b60f81b6003939091019283015250600401919050565b60006502bb0ba32b9160d51b8252825161309c81600685016020870161385e565b60006402334b932960dd1b8252825161305b81600585016020870161385e565b6000602360f81b8252825161313c81600185016020870161385e565b9190910160010192915050565b60007f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008252825161318181601d85016020870161385e565b91909101601d0192915050565b90565b600065026b2ba30b6160d51b8252825161309c81600685016020870161385e565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906131f990830184612b4f565b9695505050505050565b901515815260200190565b6000602082526128066020830184612b4f565b6020808252818101527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252601f908201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252600790820152664d6178696d756d60c81b604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f151bdad95b881251081a5b9d985b1a5960821b604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526010908201526f2a3930b739b332b9103330b4b632b21760811b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b90815260200190565b60009081526020902090565b6000821982111561380f5761380f61390b565b500190565b60008261382357613823613921565b500490565b60008160001904831182151516156138425761384261390b565b500290565b6000828210156138595761385961390b565b500390565b60005b83811015613879578181015183820152602001613861565b838111156112345750506000910152565b6000816138995761389961390b565b506000190190565b6002810460018216806138b557607f821691505b602082108114156138d657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156138f0576138f061390b565b5060010190565b60008261390657613906613921565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146116ef57600080fdfe3c2f746578743e3c7465787420783d223235302220793d223133302220636c6173733d2269223e3c2f746578743e3c7465787420783d223235302220793d223138302220636c6173733d2269223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e697b66696c6c3a236666663b666f6e742d66616d696c793a73657269663b666f6e742d7765696768743a3730307d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d2223303930643230222f3e3c7465787420783d2233302220793d223233302220636c6173733d22692220666f6e742d73697a653d22323030223e3c2f746578743e3c7465787420783d223235302220793d223230352220636c6173733d2269223e3c2f746578743e3c7465787420783d223235302220793d223135352220636c6173733d2269223e3c2f746578743e3c7465787420783d223235302220793d223233302220636c6173733d2269223e3c2f746578743e3c7465787420783d223235302220793d2239352220636c6173733d2269223e3c2f746578743e3c7465787420783d2233302220793d2233302220636c6173733d2269223e3c2f746578743e3c7465787420783d223235302220793d223236352220636c6173733d2269223ea26469706673582212208808b3d8b30327027ce592e9eaa436d6894eba0798d9f893b1105e40d81c649564736f6c63430008000033

Deployed Bytecode

0x6080604052600436106101e35760003560e01c8063648e200a11610102578063b88d4fde11610095578063e985e9c511610064578063e985e9c514610558578063f2fde38b14610578578063f3fef3a314610598578063fb848d56146105b8576101e3565b8063b88d4fde146104d8578063b9bb84d1146104f8578063c87b56dd14610518578063e467804b14610538576101e3565b80639231269a116100d15780639231269a1461046357806395d89b4114610483578063a22cb46514610498578063ac2f4518146104b8576101e3565b8063648e200a146103f957806370a0823114610419578063715018a6146104395780638da5cb5b1461044e576101e3565b80632fe614cc1161017a578063434f48c411610149578063434f48c4146103795780634a25b83e146103995780634f6ccce7146103b95780636352211e146103d9576101e3565b80632fe614cc14610311578063379607f5146103315780633817190a1461034457806342842e0e14610359576101e3565b80630a11c4cc116101b65780630a11c4cc1461028f57806318160ddd146102af57806323b872dd146102d15780632f745c59146102f1576101e3565b806301ffc9a7146101e857806306fdde031461021e578063081812fc14610240578063095ea7b31461026d575b600080fd5b3480156101f457600080fd5b50610208610203366004612ae7565b6105d8565b6040516102159190613203565b60405180910390f35b34801561022a57600080fd5b50610233610605565b604051610215919061320e565b34801561024c57600080fd5b5061026061025b366004612b1f565b610697565b60405161021591906131b2565b34801561027957600080fd5b5061028d610288366004612abe565b6106e3565b005b34801561029b57600080fd5b506102336102aa366004612b1f565b61077b565b3480156102bb57600080fd5b506102c461083f565b60405161021591906137e7565b3480156102dd57600080fd5b5061028d6102ec36600461297d565b610845565b3480156102fd57600080fd5b506102c461030c366004612abe565b61087d565b34801561031d57600080fd5b5061023361032c366004612b1f565b6108cf565b61028d61033f366004612b1f565b61099b565b34801561035057600080fd5b506102c4610ad2565b34801561036557600080fd5b5061028d61037436600461297d565b610ad8565b34801561038557600080fd5b5061028d610394366004612b1f565b610af3565b3480156103a557600080fd5b506102336103b4366004612b1f565b610bc7565b3480156103c557600080fd5b506102c46103d4366004612b1f565b610bef565b3480156103e557600080fd5b506102606103f4366004612b1f565b610c4a565b34801561040557600080fd5b50610208610414366004612931565b610c7f565b34801561042557600080fd5b506102c4610434366004612931565b610f56565b34801561044557600080fd5b5061028d610f9a565b34801561045a57600080fd5b50610260610fe5565b34801561046f57600080fd5b5061023361047e366004612b1f565b610ff4565b34801561048f57600080fd5b50610233611021565b3480156104a457600080fd5b5061028d6104b3366004612a84565b611030565b3480156104c457600080fd5b506102336104d3366004612b1f565b6110fe565b3480156104e457600080fd5b5061028d6104f33660046129b8565b6111fb565b34801561050457600080fd5b50610233610513366004612b1f565b61123a565b34801561052457600080fd5b50610233610533366004612b1f565b611262565b34801561054457600080fd5b50610233610553366004612b1f565b61162b565b34801561056457600080fd5b5061020861057336600461294b565b611653565b34801561058457600080fd5b5061028d610593366004612931565b611681565b3480156105a457600080fd5b5061028d6105b3366004612abe565b6116f2565b3480156105c457600080fd5b506102336105d3366004612b1f565b6117ad565b60006001600160e01b0319821663780e9d6360e01b14806105fd57506105fd826117d5565b90505b919050565b606060008054610614906138a1565b80601f0160208091040260200160405190810160405280929190818152602001828054610640906138a1565b801561068d5780601f106106625761010080835404028352916020019161068d565b820191906000526020600020905b81548152906001019060200180831161067057829003601f168201915b5050505050905090565b60006106a282611815565b6106c75760405162461bcd60e51b81526004016106be906135b4565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006106ee82610c4a565b9050806001600160a01b0316836001600160a01b031614156107225760405162461bcd60e51b81526004016106be906136a8565b806001600160a01b0316610734611832565b6001600160a01b03161480610750575061075081610573611832565b61076c5760405162461bcd60e51b81526004016106be9061346e565b6107768383611836565b505050565b60606105fd82600d6001815481106107a357634e487b7160e01b600052603260045260246000fd5b9060005260206000200180546107b8906138a1565b80601f01602080910402602001604051908101604052809291908181526020018280546107e4906138a1565b80156108315780601f1061080657610100808354040283529160200191610831565b820191906000526020600020905b81548152906001019060200180831161081457829003601f168201915b50505050506001600a6118a4565b60085490565b610856610850611832565b82611c34565b6108725760405162461bcd60e51b81526004016106be90613713565b610776838383611cb1565b600061088883610f56565b82106108a65760405162461bcd60e51b81526004016106be90613256565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b606060006109038360405180604001604052806008815260200167494368696e672b3160c01b815250614dc0614dff611dde565b90506000610937846040518060400160405280600881526020016724a1b434b733959960c11b815250614dc0614dff611dde565b9050600061096b8560405180604001604052806008815260200167494368696e672b3360c01b815250614dc0614dff611dde565b905082828260405160200161098293929190612cc9565b6040516020818303038152906040529350505050919050565b6002600a5414156109be5760405162461bcd60e51b81526004016106be906137b0565b6002600a5580158015906109d45750620f424081105b6109f05760405162461bcd60e51b81526004016106be90613635565b6109fe6101f4612710613847565b610a0661083f565b10610a235760405162461bcd60e51b81526004016106be9061355e565b610a2c33610c7f565b610ab9576101f4610a3b61083f565b10158015610a5157506103e8610a4f61083f565b105b15610a82576611c37937e08000341015610a7d5760405162461bcd60e51b81526004016106be906133eb565b610ab9565b6103e8610a8d61083f565b10610ab957662386f26fc10000341015610ab95760405162461bcd60e51b81526004016106be906133eb565b610aca610ac4611832565b82611e4f565b506001600a55565b600e5481565b610776838383604051806020016040528060008152506111fb565b6002600a541415610b165760405162461bcd60e51b81526004016106be906137b0565b6002600a55610b23611832565b6001600160a01b0316610b34610fe5565b6001600160a01b031614610b5a5760405162461bcd60e51b81526004016106be90613600565b600081118015610b6c5750620f424081105b610b885760405162461bcd60e51b81526004016106be90613635565b6101f4600e5410610bab5760405162461bcd60e51b81526004016106be9061355e565b600e54610bb99060016137fc565b600e55610aca610ac4610fe5565b60606105fd82600d6003815481106107a357634e487b7160e01b600052603260045260246000fd5b6000610bf961083f565b8210610c175760405162461bcd60e51b81526004016106be90613764565b60088281548110610c3857634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806105fd5760405162461bcd60e51b81526004016106be90613515565b600f546040516370a0823160e01b815260009182916001600160a01b03909116906370a0823190610cb49086906004016131b2565b60206040518083038186803b158015610ccc57600080fd5b505afa158015610ce0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d049190612b37565b1115610d1257506001610600565b6010546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610d439086906004016131b2565b60206040518083038186803b158015610d5b57600080fd5b505afa158015610d6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d939190612b37565b1115610da157506001610600565b6011546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610dd29086906004016131b2565b60206040518083038186803b158015610dea57600080fd5b505afa158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612b37565b1115610e3057506001610600565b6012546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610e619086906004016131b2565b60206040518083038186803b158015610e7957600080fd5b505afa158015610e8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb19190612b37565b1115610ebf57506001610600565b6013546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610ef09086906004016131b2565b60206040518083038186803b158015610f0857600080fd5b505afa158015610f1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f409190612b37565b1115610f4e57506001610600565b506000919050565b60006001600160a01b038216610f7e5760405162461bcd60e51b81526004016106be906134cb565b506001600160a01b031660009081526003602052604090205490565b610fa2611832565b6001600160a01b0316610fb3610fe5565b6001600160a01b031614610fd95760405162461bcd60e51b81526004016106be90613600565b610fe36000611e6d565b565b600b546001600160a01b031690565b60606105fd82604051806040016040528060038152602001622430b760e91b815250614e00619fd5611dde565b606060018054610614906138a1565b611038611832565b6001600160a01b0316826001600160a01b031614156110695760405162461bcd60e51b81526004016106be906133b4565b8060056000611076611832565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556110ba611832565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110f29190613203565b60405180910390a35050565b60606105fd826040518060400160405280600781526020016659696e59616e6760c81b815250600c805480602002602001604051908101604052809291908181526020016000905b828210156111f2578382906000526020600020018054611165906138a1565b80601f0160208091040260200160405190810160405280929190818152602001828054611191906138a1565b80156111de5780601f106111b3576101008083540402835291602001916111de565b820191906000526020600020905b8154815290600101906020018083116111c157829003601f168201915b505050505081526020019060010190611146565b50505050611ebf565b61120c611206611832565b83611c34565b6112285760405162461bcd60e51b81526004016106be90613713565b61123484848484611fa6565b50505050565b60606105fd82600d6000815481106107a357634e487b7160e01b600052603260045260246000fd5b606061126c6128f2565b60405180610120016040528061010081526020016139f26101009139815261129383610ff4565b8160016020020181905250604051806060016040528060258152602001613b8d6025913960408201526112c583611fd9565b6040516020016112d59190613120565b60408051808303601f19018152918152606080840192909252805191820190526026808252613b6760208301396080820152611310836110fe565b60a082015260408051606081019091526027808252613964602083013960c082015261133b8361123a565b60405160200161134b9190613191565b60408051808303601f1901815291815260e08301919091528051606081019091526027808252613b1960208301396101008201526113888361077b565b604051602001611398919061303b565b60408051808303601f19018152918152610120830191909152805160608101909152602780825261398b60208301396101408201526113d68361162b565b6040516020016113e691906130df565b60408051808303601f190181529181526101608301919091528051606081019091526027808252613af2602083013961018082015261142483610bc7565b6040516020016114349190613100565b60408051808303601f190181529181526101a08301919091528051606081019091526027808252613b4060208301396101c0820152611472836117ad565b604051602001611482919061307b565b60408051808303601f190181529181526101e08301919091528051606081019091526027808252613bb260208301396102008201526114c0836108cf565b610220820152604080518082018252600d81526c1e17ba32bc3a1f1e17b9bb339f60991b602080830191909152610240840191909152825181840151838501516060860151608087015160a088015160c089015160e08a01516101008b0151995160009a6115309a909101612c09565b60408051808303601f19018152908290526101208401516101408501516101608601516101808701516101a08801516101c08901516101e08a01516102008b0151979950611583988a9890602001612c09565b60408051808303601f19018152908290526102208401516102408501519193506115b292849290602001612bc6565b604051602081830303815290604052905060006115ff6115d186611fd9565b6115da846120f4565b6040516020016115eb929190612eec565b6040516020818303038152906040526120f4565b9050806040516020016116129190613149565b60408051808303601f1901815291905295945050505050565b60606105fd82600d6002815481106107a357634e487b7160e01b600052603260045260246000fd5b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b611689611832565b6001600160a01b031661169a610fe5565b6001600160a01b0316146116c05760405162461bcd60e51b81526004016106be90613600565b6001600160a01b0381166116e65760405162461bcd60e51b81526004016106be906132f3565b6116ef81611e6d565b50565b6116fa611832565b6001600160a01b031661170b610fe5565b6001600160a01b0316146117315760405162461bcd60e51b81526004016106be90613600565b6000826001600160a01b03168260405161174a9061318e565b60006040518083038185875af1925050503d8060008114611787576040519150601f19603f3d011682016040523d82523d6000602084013e61178c565b606091505b50509050806107765760405162461bcd60e51b81526004016106be906136e9565b60606105fd82600d6004815481106107a357634e487b7160e01b600052603260045260246000fd5b60006001600160e01b031982166380ac58cd60e01b148061180657506001600160e01b03198216635b5e139f60e01b145b806105fd57506105fd82612268565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061186b82610c4a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b606060006118da856118b588611fd9565b6040516020016118c6929190612b97565b604051602081830303815290604052612281565b905060006118e88585613847565b6118f39060016137fc565b6118fd90836138f7565b61190790866137fc565b9050600061191482611fd9565b905060006119236015856138f7565b90506013811115611c2657600d60008154811061195057634e487b7160e01b600052603260045260246000fd5b9060005260206000200160405160200161196a9190612e51565b60405160208183030381529060405280519060200120886040516020016119919190612b7b565b6040516020818303038152906040528051906020012014156119d457816040516020016119be9190612dbb565b6040516020818303038152906040529150611c26565b600d6001815481106119f657634e487b7160e01b600052603260045260246000fd5b90600052602060002001604051602001611a109190612e51565b6040516020818303038152906040528051906020012088604051602001611a379190612b7b565b604051602081830303815290604052805190602001201415611a6457816040516020016119be9190612d89565b600d600281548110611a8657634e487b7160e01b600052603260045260246000fd5b90600052602060002001604051602001611aa09190612e51565b6040516020818303038152906040528051906020012088604051602001611ac79190612b7b565b604051602081830303815290604052805190602001201415611af457816040516020016119be9190612e1f565b600d600381548110611b1657634e487b7160e01b600052603260045260246000fd5b90600052602060002001604051602001611b309190612e51565b6040516020818303038152906040528051906020012088604051602001611b579190612b7b565b604051602081830303815290604052805190602001201415611b8457816040516020016119be9190612d23565b600d600481548110611ba657634e487b7160e01b600052603260045260246000fd5b90600052602060002001604051602001611bc09190612e51565b6040516020818303038152906040528051906020012088604051602001611be79190612b7b565b604051602081830303815290604052805190602001201415611c265781604051602001611c149190612ded565b60405160208183030381529060405291505b50925050505b949350505050565b6000611c3f82611815565b611c5b5760405162461bcd60e51b81526004016106be90613422565b6000611c6683610c4a565b9050806001600160a01b0316846001600160a01b03161480611ca15750836001600160a01b0316611c9684610697565b6001600160a01b0316145b80611c2c5750611c2c8185611653565b826001600160a01b0316611cc482610c4a565b6001600160a01b031614611cea5760405162461bcd60e51b81526004016106be9061365f565b6001600160a01b038216611d105760405162461bcd60e51b81526004016106be90613370565b611d1b8383836122b2565b611d26600082611836565b6001600160a01b0383166000908152600360205260408120805460019290611d4f908490613847565b90915550506001600160a01b0382166000908152600360205260408120805460019290611d7d9084906137fc565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60606000611def856118b588611fd9565b90506000611e24611e008686613847565b611e0b9060016137fc565b611e1590846138f7565b611e1f90876137fc565b61233b565b604051602001611e3491906130a9565b60408051808303601f19018152919052979650505050505050565b611e6982826040518060200160405280600081525061238e565b5050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60606000611ed0846118b587611fd9565b9050600083845183611ee291906138f7565b81518110611f0057634e487b7160e01b600052603260045260246000fd5b602002602001015190506000601583611f1991906138f7565b9050604051602001611f2a90613068565b6040516020818303038152906040528051906020012086604051602001611f519190612b7b565b60405160208183030381529060405280519060200120148015611f745750601381115b15611f9c5781604051602001611f8a9190612d55565b60405160208183030381529060405291505b5095945050505050565b611fb1848484611cb1565b611fbd848484846123c1565b6112345760405162461bcd60e51b81526004016106be906132a1565b606081611ffe57506040805180820190915260018152600360fc1b6020820152610600565b8160005b81156120285780612012816138dc565b91506120219050600a83613814565b9150612002565b60008167ffffffffffffffff81111561205157634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561207b576020820181803683370190505b5090505b8415611c2c57612090600183613847565b915061209d600a866138f7565b6120a89060306137fc565b60f81b8183815181106120cb57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506120ed600a86613814565b945061207f565b805160609080612114575050604080516020810190915260008152610600565b600060036121238360026137fc565b61212d9190613814565b612138906004613828565b905060006121478260206137fc565b67ffffffffffffffff81111561216d57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612197576020820181803683370190505b50905060006040518060600160405280604081526020016139b2604091399050600181016020830160005b86811015612223576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b8352600490920191016121c2565b50600386066001811461223d576002811461224e5761225a565b613d3d60f01b60011983015261225a565b603d60f81b6000198301525b505050918152949350505050565b6001600160e01b031981166301ffc9a760e01b14919050565b6000816040516020016122949190612b7b565b60408051601f19818403018152919052805160209091012092915050565b6122bd838383610776565b6001600160a01b0383166122d9576122d4816124d9565b6122fc565b816001600160a01b0316836001600160a01b0316146122fc576122fc838261251d565b6001600160a01b03821661231857612313816125ba565b610776565b826001600160a01b0316826001600160a01b031614610776576107768282612693565b6060816123615750604080518082019091526002815261030360f41b6020820152610600565b8160005b81156123845780612375816138dc565b915050600882901c9150612365565b611c2c84826126d7565b612398838361280d565b6123a560008484846123c1565b6107765760405162461bcd60e51b81526004016106be906132a1565b60006123d5846001600160a01b03166128ec565b156124d157836001600160a01b031663150b7a026123f1611832565b8786866040518563ffffffff1660e01b815260040161241394939291906131c6565b602060405180830381600087803b15801561242d57600080fd5b505af192505050801561245d575060408051601f3d908101601f1916820190925261245a91810190612b03565b60015b6124b7573d80801561248b576040519150601f19603f3d011682016040523d82523d6000602084013e612490565b606091505b5080516124af5760405162461bcd60e51b81526004016106be906132a1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c2c565b506001611c2c565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6000600161252a84610f56565b6125349190613847565b600083815260076020526040902054909150808214612587576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906125cc90600190613847565b6000838152600960205260408120546008805493945090928490811061260257634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061263157634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061267757634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061269e83610f56565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b606060006126e6836002613828565b67ffffffffffffffff81111561270c57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612736576020820181803683370190505b50905060006001612748856002613828565b6127529190613847565b90505b6f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061278b57634e487b7160e01b600052603260045260246000fd5b1a60f81b8282815181106127af57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c93806127d7576127e7565b6127e08161388a565b9050612755565b5083156128065760405162461bcd60e51b81526004016106be90613221565b9392505050565b6001600160a01b0382166128335760405162461bcd60e51b81526004016106be9061357f565b61283c81611815565b156128595760405162461bcd60e51b81526004016106be90613339565b612865600083836122b2565b6001600160a01b038216600090815260036020526040812080546001929061288e9084906137fc565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b6040518061026001604052806013905b60608152602001906001900390816129025790505090565b80356001600160a01b038116811461060057600080fd5b600060208284031215612942578081fd5b6128068261291a565b6000806040838503121561295d578081fd5b6129668361291a565b91506129746020840161291a565b90509250929050565b600080600060608486031215612991578081fd5b61299a8461291a565b92506129a86020850161291a565b9150604084013590509250925092565b600080600080608085870312156129cd578081fd5b6129d68561291a565b935060206129e581870161291a565b935060408601359250606086013567ffffffffffffffff80821115612a08578384fd5b818801915088601f830112612a1b578384fd5b813581811115612a2d57612a2d613937565b604051601f8201601f1916810185018381118282101715612a5057612a50613937565b60405281815283820185018b1015612a66578586fd5b81858501868301379081019093019390935250939692955090935050565b60008060408385031215612a96578182fd5b612a9f8361291a565b915060208301358015158114612ab3578182fd5b809150509250929050565b60008060408385031215612ad0578182fd5b612ad98361291a565b946020939093013593505050565b600060208284031215612af8578081fd5b81356128068161394d565b600060208284031215612b14578081fd5b81516128068161394d565b600060208284031215612b30578081fd5b5035919050565b600060208284031215612b48578081fd5b5051919050565b60008151808452612b6781602086016020860161385e565b601f01601f19169290920160200192915050565b60008251612b8d81846020870161385e565b9190910192915050565b60008351612ba981846020880161385e565b835190830190612bbd81836020880161385e565b01949350505050565b60008451612bd881846020890161385e565b845190830190612bec81836020890161385e565b8451910190612bff81836020880161385e565b0195945050505050565b60008a51612c1b818460208f0161385e565b8a51612c2d8183860160208f0161385e565b8a519184010190612c42818360208e0161385e565b8951910190612c55818360208d0161385e565b8851612c678183850160208d0161385e565b8851929091010190612c7d818360208b0161385e565b8651612c8f8183850160208b0161385e565b8651929091010190612ca581836020890161385e565b8451612cb7818385016020890161385e565b9101019b9a5050505050505050505050565b60008451612cdb81846020890161385e565b8083019050600160fd1b8082528551612cfb816001850160208a0161385e565b60019201918201528351612d1681600284016020880161385e565b0160020195945050505050565b60008251612d3581846020870161385e565b600160fd1b92019182525063f09f94a560e01b6001820152600501919050565b60008251612d6781846020870161385e565b600160fd1b92019182525065e298afefb88f60d01b6001820152600701919050565b60008251612d9b81846020870161385e565b600160fd1b92019182525063f09f8cb360e01b6001820152600501919050565b60008251612dcd81846020870161385e565b600160fd1b92019182525063f09fa58760e01b6001820152600501919050565b60008251612dff81846020870161385e565b600160fd1b92019182525063f09f8c8d60e01b6001820152600501919050565b60008251612e3181846020870161385e565b600160fd1b92019182525063f09f92a760e01b6001820152600501919050565b8154600090819060028104600180831680612e6d57607f831692505b6020808410821415612e8d57634e487b7160e01b87526022600452602487fd5b818015612ea15760018114612eb257612ede565b60ff19861689528489019650612ede565b612ebb8a6137f0565b885b86811015612ed65781548b820152908501908301612ebd565b505084890196505b509498975050505050505050565b727b226e616d65223a20224368696e657365202360681b81528251600090612f1b81601385016020880161385e565b7f222c20226465736372697074696f6e223a202243616e676a69652077617320746013918401918201527f68652063726561746f72206f66204368696e657365206368617261637465727360338201527f2e205468652043616e676a6965204e46547320617265204368696e657365206360538201527f6861726163746572732067656e6572617465642077697468205461696a692c2060738201527f577578696e672c205969204a696e672c20616e64206d6f72652e222c2022696d60938201527f616765223a2022646174613a696d6167652f7376672b786d6c3b62617365363460b3820152600b60fa1b60d382015283516130208160d484016020880161385e565b61227d60f01b60d4929091019182015260d601949350505050565b60006402bb7b7b2160dd1b8252825161305b81600585016020870161385e565b9190910160050192915050565b6659696e59616e6760c81b815260070190565b600065022b0b93a34160d51b8252825161309c81600685016020870161385e565b9190910160060192915050565b60006204c46f60eb1b825282516130c781600385016020870161385e565b603b60f81b6003939091019283015250600401919050565b60006502bb0ba32b9160d51b8252825161309c81600685016020870161385e565b60006402334b932960dd1b8252825161305b81600585016020870161385e565b6000602360f81b8252825161313c81600185016020870161385e565b9190910160010192915050565b60007f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008252825161318181601d85016020870161385e565b91909101601d0192915050565b90565b600065026b2ba30b6160d51b8252825161309c81600685016020870161385e565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906131f990830184612b4f565b9695505050505050565b901515815260200190565b6000602082526128066020830184612b4f565b6020808252818101527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252601f908201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252600790820152664d6178696d756d60c81b604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f151bdad95b881251081a5b9d985b1a5960821b604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526010908201526f2a3930b739b332b9103330b4b632b21760811b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b90815260200190565b60009081526020902090565b6000821982111561380f5761380f61390b565b500190565b60008261382357613823613921565b500490565b60008160001904831182151516156138425761384261390b565b500290565b6000828210156138595761385961390b565b500390565b60005b83811015613879578181015183820152602001613861565b838111156112345750506000910152565b6000816138995761389961390b565b506000190190565b6002810460018216806138b557607f821691505b602082108114156138d657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156138f0576138f061390b565b5060010190565b60008261390657613906613921565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146116ef57600080fdfe3c2f746578743e3c7465787420783d223235302220793d223133302220636c6173733d2269223e3c2f746578743e3c7465787420783d223235302220793d223138302220636c6173733d2269223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e697b66696c6c3a236666663b666f6e742d66616d696c793a73657269663b666f6e742d7765696768743a3730307d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d2223303930643230222f3e3c7465787420783d2233302220793d223233302220636c6173733d22692220666f6e742d73697a653d22323030223e3c2f746578743e3c7465787420783d223235302220793d223230352220636c6173733d2269223e3c2f746578743e3c7465787420783d223235302220793d223135352220636c6173733d2269223e3c2f746578743e3c7465787420783d223235302220793d223233302220636c6173733d2269223e3c2f746578743e3c7465787420783d223235302220793d2239352220636c6173733d2269223e3c2f746578743e3c7465787420783d2233302220793d2233302220636c6173733d2269223e3c2f746578743e3c7465787420783d223235302220793d223236352220636c6173733d2269223ea26469706673582212208808b3d8b30327027ce592e9eaa436d6894eba0798d9f893b1105e40d81c649564736f6c63430008000033

Deployed Bytecode Sourcemap

45648:9555:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39454:224;;;;;;;;;;-1:-1:-1;39454:224:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26568:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;28127:221::-;;;;;;;;;;-1:-1:-1;28127:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;27650:411::-;;;;;;;;;;-1:-1:-1;27650:411:0;;;;;:::i;:::-;;:::i;:::-;;47611:137;;;;;;;;;;-1:-1:-1;47611:137:0;;;;;:::i;:::-;;:::i;40094:113::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29017:339::-;;;;;;;;;;-1:-1:-1;29017:339:0;;;;;:::i;:::-;;:::i;39762:256::-;;;;;;;;;;-1:-1:-1;39762:256:0;;;;;:::i;:::-;;:::i;47014:443::-;;;;;;;;;;-1:-1:-1;47014:443:0;;;;;:::i;:::-;;:::i;53314:610::-;;;;;;:::i;:::-;;:::i;46151:34::-;;;;;;;;;;;;;:::i;29427:185::-;;;;;;;;;;-1:-1:-1;29427:185:0;;;;;:::i;:::-;;:::i;53932:290::-;;;;;;;;;;-1:-1:-1;53932:290:0;;;;;:::i;:::-;;:::i;47902:137::-;;;;;;;;;;-1:-1:-1;47902:137:0;;;;;:::i;:::-;;:::i;40284:233::-;;;;;;;;;;-1:-1:-1;40284:233:0;;;;;:::i;:::-;;:::i;26262:239::-;;;;;;;;;;-1:-1:-1;26262:239:0;;;;;:::i;:::-;;:::i;52929:377::-;;;;;;;;;;-1:-1:-1;52929:377:0;;;;;:::i;:::-;;:::i;25992:208::-;;;;;;;;;;-1:-1:-1;25992:208:0;;;;;:::i;:::-;;:::i;10971:94::-;;;;;;;;;;;;;:::i;10320:87::-;;;;;;;;;;;;;:::i;46718:147::-;;;;;;;;;;-1:-1:-1;46718:147:0;;;;;:::i;:::-;;:::i;26737:104::-;;;;;;;;;;;;;:::i;28420:295::-;;;;;;;;;;-1:-1:-1;28420:295:0;;;;;:::i;:::-;;:::i;46873:133::-;;;;;;;;;;-1:-1:-1;46873:133:0;;;;;:::i;:::-;;:::i;29683:328::-;;;;;;;;;;-1:-1:-1;29683:328:0;;;;;:::i;:::-;;:::i;47465:138::-;;;;;;;;;;-1:-1:-1;47465:138:0;;;;;:::i;:::-;;:::i;50550:2371::-;;;;;;;;;;-1:-1:-1;50550:2371:0;;;;;:::i;:::-;;:::i;47756:138::-;;;;;;;;;;-1:-1:-1;47756:138:0;;;;;:::i;:::-;;:::i;28786:164::-;;;;;;;;;;-1:-1:-1;28786:164:0;;;;;:::i;:::-;;:::i;11220:192::-;;;;;;;;;;-1:-1:-1;11220:192:0;;;;;:::i;:::-;;:::i;54961:176::-;;;;;;;;;;-1:-1:-1;54961:176:0;;;;;:::i;:::-;;:::i;48047:138::-;;;;;;;;;;-1:-1:-1;48047:138:0;;;;;:::i;:::-;;:::i;39454:224::-;39556:4;-1:-1:-1;;;;;;39580:50:0;;-1:-1:-1;;;39580:50:0;;:90;;;39634:36;39658:11;39634:23;:36::i;:::-;39573:97;;39454:224;;;;:::o;26568:100::-;26622:13;26655:5;26648:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26568:100;:::o;28127:221::-;28203:7;28231:16;28239:7;28231;:16::i;:::-;28223:73;;;;-1:-1:-1;;;28223:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;28316:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;28316:24:0;;28127:221::o;27650:411::-;27731:13;27747:23;27762:7;27747:14;:23::i;:::-;27731:39;;27795:5;-1:-1:-1;;;;;27789:11:0;:2;-1:-1:-1;;;;;27789:11:0;;;27781:57;;;;-1:-1:-1;;;27781:57:0;;;;;;;:::i;:::-;27889:5;-1:-1:-1;;;;;27873:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;27873:21:0;;:62;;;;27898:37;27915:5;27922:12;:10;:12::i;27898:37::-;27851:168;;;;-1:-1:-1;;;27851:168:0;;;;;;;:::i;:::-;28032:21;28041:2;28045:7;28032:8;:21::i;:::-;27650:411;;;:::o;47611:137::-;47666:13;47699:41;47714:7;47723:6;47730:1;47723:9;;;;;;-1:-1:-1;;;47723:9:0;;;;;;;;;;;;;;;;47699:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47734:1;47737:2;47699:14;:41::i;40094:113::-;40182:10;:17;40094:113;:::o;29017:339::-;29212:41;29231:12;:10;:12::i;:::-;29245:7;29212:18;:41::i;:::-;29204:103;;;;-1:-1:-1;;;29204:103:0;;;;;;;:::i;:::-;29320:28;29330:4;29336:2;29340:7;29320:9;:28::i;39762:256::-;39859:7;39895:23;39912:5;39895:16;:23::i;:::-;39887:5;:31;39879:87;;;;-1:-1:-1;;;39879:87:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;39984:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;39762:256::o;47014:443::-;47071:13;47097:19;47119:63;47136:7;47119:63;;;;;;;;;;;;;-1:-1:-1;;;47119:63:0;;;45960:6;46011;47119:16;:63::i;:::-;47097:85;;47193:20;47216:63;47233:7;47216:63;;;;;;;;;;;;;-1:-1:-1;;;47216:63:0;;;45960:6;46011;47216:16;:63::i;:::-;47193:86;;47290:19;47312:63;47329:7;47312:63;;;;;;;;;;;;;-1:-1:-1;;;47312:63:0;;;45960:6;46011;47312:16;:63::i;:::-;47290:85;;47417:5;47429:6;47442:5;47400:48;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47386:63;;;;;47014:443;;;:::o;53314:610::-;13259:1;13855:7;;:19;;13847:63;;;;-1:-1:-1;;;13847:63:0;;;;;;;:::i;:::-;13259:1;13988:7;:18;53393:11;;;;;:32:::1;;;53418:7;53408;:17;53393:32;53385:61;;;;-1:-1:-1::0;;;53385:61:0::1;;;;;;;:::i;:::-;53481:27;45810:3;45762:5;53481:27;:::i;:::-;53465:13;:11;:13::i;:::-;:43;53457:63;;;;-1:-1:-1::0;;;53457:63:0::1;;;;;;;:::i;:::-;53538:20;53547:10;53538:8;:20::i;:::-;53533:341;;53596:3;53579:13;:11;:13::i;:::-;:20;;:44;;;;;53619:4;53603:13;:11;:13::i;:::-;:20;53579:44;53575:288;;;53665:11;53652:9;:24;;53644:68;;;;-1:-1:-1::0;;;53644:68:0::1;;;;;;;:::i;:::-;53575:288;;;53755:4;53738:13;:11;:13::i;:::-;:21;53734:129;;53801:10;53788:9;:23;;53780:67;;;;-1:-1:-1::0;;;53780:67:0::1;;;;;;;:::i;:::-;53884:32;53894:12;:10;:12::i;:::-;53908:7;53884:9;:32::i;:::-;-1:-1:-1::0;13215:1:0;14167:7;:22;53314:610::o;46151:34::-;;;;:::o;29427:185::-;29565:39;29582:4;29588:2;29592:7;29565:39;;;;;;;;;;;;:16;:39::i;53932:290::-;13259:1;13855:7;;:19;;13847:63;;;;-1:-1:-1;;;13847:63:0;;;;;;;:::i;:::-;13259:1;13988:7;:18;10551:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;10540:23:0::1;:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;10540:23:0::1;;10532:68;;;;-1:-1:-1::0;;;10532:68:0::1;;;;;;;:::i;:::-;54028:1:::2;54018:7;:11;:32;;;;;54043:7;54033;:17;54018:32;54010:61;;;;-1:-1:-1::0;;;54010:61:0::2;;;;;;;:::i;:::-;45810:3;54090:15;;:26;54082:46;;;;-1:-1:-1::0;;;54082:46:0::2;;;;;;;:::i;:::-;54157:15;::::0;:19:::2;::::0;54175:1:::2;54157:19;:::i;:::-;54139:15;:37:::0;54187:27:::2;54197:7;:5;:7::i;47902:137::-:0;47957:13;47990:41;48005:7;48014:6;48021:1;48014:9;;;;;;-1:-1:-1;;;48014:9:0;;;;;;;;40284:233;40359:7;40395:30;:28;:30::i;:::-;40387:5;:38;40379:95;;;;-1:-1:-1;;;40379:95:0;;;;;;;:::i;:::-;40492:10;40503:5;40492:17;;;;;;-1:-1:-1;;;40492:17:0;;;;;;;;;;;;;;;;;40485:24;;40284:233;;;:::o;26262:239::-;26334:7;26370:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26370:16:0;26405:19;26397:73;;;;-1:-1:-1;;;26397:73:0;;;;;;;:::i;52929:377::-;53006:5;;:24;;-1:-1:-1;;;53006:24:0;;52985:4;;;;-1:-1:-1;;;;;53006:5:0;;;;:15;;:24;;53022:7;;53006:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:28;53002:45;;;-1:-1:-1;53043:4:0;53036:11;;53002:45;53062:5;;:24;;-1:-1:-1;;;53062:24:0;;53089:1;;-1:-1:-1;;;;;53062:5:0;;:15;;:24;;53078:7;;53062:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:28;53058:45;;;-1:-1:-1;53099:4:0;53092:11;;53058:45;53118:5;;:24;;-1:-1:-1;;;53118:24:0;;53145:1;;-1:-1:-1;;;;;53118:5:0;;:15;;:24;;53134:7;;53118:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:28;53114:45;;;-1:-1:-1;53155:4:0;53148:11;;53114:45;53174:5;;:24;;-1:-1:-1;;;53174:24:0;;53201:1;;-1:-1:-1;;;;;53174:5:0;;:15;;:24;;53190:7;;53174:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:28;53170:45;;;-1:-1:-1;53211:4:0;53204:11;;53170:45;53230:9;;:28;;-1:-1:-1;;;53230:28:0;;53261:1;;-1:-1:-1;;;;;53230:9:0;;:19;;:28;;53250:7;;53230:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:32;53226:49;;;-1:-1:-1;53271:4:0;53264:11;;53226:49;-1:-1:-1;53293:5:0;52929:377;;;:::o;25992:208::-;26064:7;-1:-1:-1;;;;;26092:19:0;;26084:74;;;;-1:-1:-1;;;26084:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;26176:16:0;;;;;:9;:16;;;;;;;25992:208::o;10971:94::-;10551:12;:10;:12::i;:::-;-1:-1:-1;;;;;10540:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;10540:23:0;;10532:68;;;;-1:-1:-1;;;10532:68:0;;;;;;;:::i;:::-;11036:21:::1;11054:1;11036:9;:21::i;:::-;10971:94::o:0;10320:87::-;10393:6;;-1:-1:-1;;;;;10393:6:0;10320:87;:::o;46718:147::-;46772:13;46805:52;46822:7;46805:52;;;;;;;;;;;;;-1:-1:-1;;;46805:52:0;;;45859:6;45907;46805:16;:52::i;26737:104::-;26793:13;26826:7;26819:14;;;;;:::i;28420:295::-;28535:12;:10;:12::i;:::-;-1:-1:-1;;;;;28523:24:0;:8;-1:-1:-1;;;;;28523:24:0;;;28515:62;;;;-1:-1:-1;;;28515:62:0;;;;;;;:::i;:::-;28635:8;28590:18;:32;28609:12;:10;:12::i;:::-;-1:-1:-1;;;;;28590:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;28590:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;28590:53:0;;;;;;;;;;;28674:12;:10;:12::i;:::-;-1:-1:-1;;;;;28659:48:0;;28698:8;28659:48;;;;;;:::i;:::-;;;;;;;;28420:295;;:::o;46873:133::-;46931:13;46964:34;46970:7;46964:34;;;;;;;;;;;;;-1:-1:-1;;;46964:34:0;;;46990:7;46964:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:34::i;29683:328::-;29858:41;29877:12;:10;:12::i;:::-;29891:7;29858:18;:41::i;:::-;29850:103;;;;-1:-1:-1;;;29850:103:0;;;;;;;:::i;:::-;29964:39;29978:4;29984:2;29988:7;29997:5;29964:13;:39::i;:::-;29683:328;;;;:::o;47465:138::-;47521:13;47554:41;47569:7;47578:6;47585:1;47578:9;;;;;;-1:-1:-1;;;47578:9:0;;;;;;;;50550:2371;50615:13;50641:23;;:::i;:::-;50675:269;;;;;;;;;;;;;;;;;;;50968:15;50975:7;50968:6;:15::i;:::-;50957:5;50963:1;50957:8;;;:26;;;;50996:50;;;;;;;;;;;;;;;;;:8;;;:50;51099:17;51108:7;51099:8;:17::i;:::-;51077:40;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;51077:40:0;;;;;;51059:8;;;;:59;;;;51131:51;;;;;;;;;;;;51059:8;51131:51;;;:8;;;:51;51206:19;51217:7;51206:10;:19::i;:::-;51195:8;;;:30;51238:52;;;;;;;;;;;;;;51195:8;51238:52;;;:8;;;:52;51348:17;51357:7;51348:8;:17::i;:::-;51321:45;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;51321:45:0;;;;;;51303:8;;;:64;;;;51380:52;;;;;;;;;;;;;51303:8;51380:52;;;:8;;;:52;51489:16;51497:7;51489;:16::i;:::-;51463:43;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;51463:43:0;;;;;;51445:8;;;:62;;;;51520:53;;;;;;;;;;;;;51445:8;51520:53;;;:9;;;:53;51632:17;51641:7;51632:8;:17::i;:::-;51605:45;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;51605:45:0;;;;;;51586:9;;;:65;;;;51664:53;;;;;;;;;;;;;51586:9;51664:53;;;:9;;;:53;51775:16;51783:7;51775;:16::i;:::-;51749:43;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;51749:43:0;;;;;;51730:9;;;:63;;;;51806:53;;;;;;;;;;;;;51730:9;51806:53;;;:9;;;:53;51918:17;51927:7;51918:8;:17::i;:::-;51891:45;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;51891:45:0;;;;;;51872:9;;;:65;;;;51950:53;;;;;;;;;;;;;51872:9;51950:53;;;:9;;;:53;52028:18;52038:7;52028:9;:18::i;:::-;52016:9;;;:30;52059:27;;;;;;;;;;;-1:-1:-1;;;52016:9:0;52059:27;;;;;;;:9;;;:27;;;;52146:8;;52156;;;;52166;;;;52176;;;;52186;;;;52196;;;;52206;;;;52216;;;;52226;;;;52129:106;;-1:-1:-1;;52129:106:0;;52226:8;;52129:106;;:::i;:::-;;;;;;;-1:-1:-1;;52129:106:0;;;;;;;52288:8;;;;52298:9;;;;52309;;;;52320;;;;52331;;;;52342;;;;52353;;;;52364;;;;52129:106;;-1:-1:-1;52263:111:0;;52129:106;;52364:9;52288:8;52263:111;;:::i;:::-;;;;;;;-1:-1:-1;;52263:111:0;;;;;;;52427:9;;;;52438;;;;52263:111;;-1:-1:-1;52402:46:0;;52263:111;;52438:9;52427;52402:46;;:::i;:::-;;;;;;;;;;;;;52386:63;;52462:18;52483:321;52550:17;52559:7;52550:8;:17::i;:::-;52766:28;52786:6;52766:13;:28::i;:::-;52510:291;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52483:13;:321::i;:::-;52462:342;;52881:4;52831:55;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;52831:55:0;;;;;;;50550:2371;-1:-1:-1;;;;;50550:2371:0:o;47756:138::-;47812:13;47845:41;47860:7;47869:6;47876:1;47869:9;;;;;;-1:-1:-1;;;47869:9:0;;;;;;;;28786:164;-1:-1:-1;;;;;28907:25:0;;;28883:4;28907:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;28786:164::o;11220:192::-;10551:12;:10;:12::i;:::-;-1:-1:-1;;;;;10540:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;10540:23:0;;10532:68;;;;-1:-1:-1;;;10532:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11309:22:0;::::1;11301:73;;;;-1:-1:-1::0;;;11301:73:0::1;;;;;;;:::i;:::-;11385:19;11395:8;11385:9;:19::i;:::-;11220:192:::0;:::o;54961:176::-;10551:12;:10;:12::i;:::-;-1:-1:-1;;;;;10540:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;10540:23:0;;10532:68;;;;-1:-1:-1;;;10532:68:0;;;;;;;:::i;:::-;55038:12:::1;55055:2;-1:-1:-1::0;;;;;55055:7:0::1;55071:6;55055:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55037:45;;;55101:7;55093:36;;;;-1:-1:-1::0;;;55093:36:0::1;;;;;;;:::i;48047:138::-:0;48103:13;48136:41;48151:7;48160:6;48167:1;48160:9;;;;;;-1:-1:-1;;;48160:9:0;;;;;;;;25635:293;25737:4;-1:-1:-1;;;;;;25770:40:0;;-1:-1:-1;;;25770:40:0;;:101;;-1:-1:-1;;;;;;;25823:48:0;;-1:-1:-1;;;25823:48:0;25770:101;:150;;;;25884:36;25908:11;25884:23;:36::i;31521:127::-;31586:4;31610:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31610:16:0;:30;;;31521:127::o;9180:98::-;9260:10;9180:98;:::o;35503:174::-;35578:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;35578:29:0;-1:-1:-1;;;;;35578:29:0;;;;;;;;:24;;35632:23;35578:24;35632:14;:23::i;:::-;-1:-1:-1;;;;;35623:46:0;;;;;;;;;;;35503:174;;:::o;49152:1390::-;49269:13;49295:12;49310:62;49341:9;49352:17;49361:7;49352:8;:17::i;:::-;49324:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49310:6;:62::i;:::-;49295:77;-1:-1:-1;49383:13:0;49415:11;49421:5;49415:3;:11;:::i;:::-;:15;;49429:1;49415:15;:::i;:::-;49407:24;;:4;:24;:::i;:::-;49399:32;;:5;:32;:::i;:::-;49383:48;;49442:20;49465:15;49474:5;49465:8;:15::i;:::-;49442:38;-1:-1:-1;49491:17:0;49511:9;49518:2;49511:4;:9;:::i;:::-;49491:29;;49547:2;49535:9;:14;49531:980;;;49639:6;49646:1;49639:9;;;;;;-1:-1:-1;;;49639:9:0;;;;;;;;;;;;;;;;49622:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;49612:38;;;;;;49597:9;49580:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;49570:38;;;;;;:80;49566:934;;;49704:6;49687:44;;;;;;;;:::i;:::-;;;;;;;;;;;;;49671:61;;49566:934;;;49827:6;49834:1;49827:9;;;;;;-1:-1:-1;;;49827:9:0;;;;;;;;;;;;;;;;49810:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;49800:38;;;;;;49785:9;49768:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;49758:38;;;;;;:80;49754:746;;;49892:6;49875:44;;;;;;;;:::i;49754:746::-;50015:6;50022:1;50015:9;;;;;;-1:-1:-1;;;50015:9:0;;;;;;;;;;;;;;;;49998:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;49988:38;;;;;;49973:9;49956:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;49946:38;;;;;;:80;49942:558;;;50080:6;50063:44;;;;;;;;:::i;49942:558::-;50203:6;50210:1;50203:9;;;;;;-1:-1:-1;;;50203:9:0;;;;;;;;;;;;;;;;50186:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;50176:38;;;;;;50161:9;50144:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;50134:38;;;;;;:80;50130:370;;;50268:6;50251:44;;;;;;;;:::i;50130:370::-;50391:6;50398:1;50391:9;;;;;;-1:-1:-1;;;50391:9:0;;;;;;;;;;;;;;;;50374:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;50364:38;;;;;;50349:9;50332:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;50322:38;;;;;;:80;50318:182;;;50456:6;50439:44;;;;;;;;:::i;:::-;;;;;;;;;;;;;50423:61;;50318:182;-1:-1:-1;50528:6:0;-1:-1:-1;;;49152:1390:0;;;;;;;:::o;31815:348::-;31908:4;31933:16;31941:7;31933;:16::i;:::-;31925:73;;;;-1:-1:-1;;;31925:73:0;;;;;;;:::i;:::-;32009:13;32025:23;32040:7;32025:14;:23::i;:::-;32009:39;;32078:5;-1:-1:-1;;;;;32067:16:0;:7;-1:-1:-1;;;;;32067:16:0;;:51;;;;32111:7;-1:-1:-1;;;;;32087:31:0;:20;32099:7;32087:11;:20::i;:::-;-1:-1:-1;;;;;32087:31:0;;32067:51;:87;;;;32122:32;32139:5;32146:7;32122:16;:32::i;34807:578::-;34966:4;-1:-1:-1;;;;;34939:31:0;:23;34954:7;34939:14;:23::i;:::-;-1:-1:-1;;;;;34939:31:0;;34931:85;;;;-1:-1:-1;;;34931:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35035:16:0;;35027:65;;;;-1:-1:-1;;;35027:65:0;;;;;;;:::i;:::-;35105:39;35126:4;35132:2;35136:7;35105:20;:39::i;:::-;35209:29;35226:1;35230:7;35209:8;:29::i;:::-;-1:-1:-1;;;;;35251:15:0;;;;;;:9;:15;;;;;:20;;35270:1;;35251:15;:20;;35270:1;;35251:20;:::i;:::-;;;;-1:-1:-1;;;;;;;35282:13:0;;;;;;:9;:13;;;;;:18;;35299:1;;35282:13;:18;;35299:1;;35282:18;:::i;:::-;;;;-1:-1:-1;;35311:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35311:21:0;-1:-1:-1;;;;;35311:21:0;;;;;;;;;35350:27;;35311:16;;35350:27;;;;;;;34807:578;;;:::o;48761:383::-;48880:13;48906:12;48921:62;48952:9;48963:17;48972:7;48963:8;:17::i;48921:62::-;48906:77;-1:-1:-1;48994:20:0;49048:57;49088:11;49094:5;49088:3;:11;:::i;:::-;:15;;49102:1;49088:15;:::i;:::-;49080:24;;:4;:24;:::i;:::-;49072:32;;:5;:32;:::i;:::-;49048:23;:57::i;:::-;49024:87;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;49024:87:0;;;;;;;48761:383;-1:-1:-1;;;;;;;48761:383:0:o;32505:110::-;32581:26;32591:2;32595:7;32581:26;;;;;;;;;;;;:9;:26::i;:::-;32505:110;;:::o;11420:173::-;11495:6;;;-1:-1:-1;;;;;11512:17:0;;;-1:-1:-1;;;;;;11512:17:0;;;;;;;11545:40;;11495:6;;;11512:17;11495:6;;11545:40;;11476:16;;11545:40;11420:173;;:::o;48193:560::-;48302:13;48328:12;48343:62;48374:9;48385:17;48394:7;48385:8;:17::i;48343:62::-;48328:77;;48416:20;48439:11;48458;:18;48451:4;:25;;;;:::i;:::-;48439:38;;;;;;-1:-1:-1;;;48439:38:0;;;;;;;;;;;;;;;48416:61;;48488:17;48515:2;48508:4;:9;;;;:::i;:::-;48488:29;;48584:27;;;;;;;:::i;:::-;;;;;;;;;;;;;48574:38;;;;;;48559:9;48542:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;48532:38;;;;;;:80;:98;;;;;48628:2;48616:9;:14;48532:98;48528:194;;;48680:6;48663:46;;;;;;;;:::i;:::-;;;;;;;;;;;;;48647:63;;48528:194;-1:-1:-1;48739:6:0;48193:560;-1:-1:-1;;;;;48193:560:0:o;30893:315::-;31050:28;31060:4;31066:2;31070:7;31050:9;:28::i;:::-;31097:48;31120:4;31126:2;31130:7;31139:5;31097:22;:48::i;:::-;31089:111;;;;-1:-1:-1;;;31089:111:0;;;;;;;:::i;54230:723::-;54286:13;54507:10;54503:53;;-1:-1:-1;54534:10:0;;;;;;;;;;;;-1:-1:-1;;;54534:10:0;;;;;;54503:53;54581:5;54566:12;54622:78;54629:9;;54622:78;;54655:8;;;;:::i;:::-;;-1:-1:-1;54678:10:0;;-1:-1:-1;54686:2:0;54678:10;;:::i;:::-;;;54622:78;;;54710:19;54742:6;54732:17;;;;;;-1:-1:-1;;;54732:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54732:17:0;;54710:39;;54760:154;54767:10;;54760:154;;54794:11;54804:1;54794:11;;:::i;:::-;;-1:-1:-1;54863:10:0;54871:2;54863:5;:10;:::i;:::-;54850:24;;:2;:24;:::i;:::-;54837:39;;54820:6;54827;54820:14;;;;;;-1:-1:-1;;;54820:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;54820:56:0;;;;;;;;-1:-1:-1;54891:11:0;54900:2;54891:11;;:::i;:::-;;;54760:154;;55554:1607;55652:11;;55612:13;;55678:8;55674:23;;-1:-1:-1;;55688:9:0;;;;;;;;;-1:-1:-1;55688:9:0;;;;55674:23;55749:18;55787:1;55776:7;:3;55782:1;55776:7;:::i;:::-;55775:13;;;;:::i;:::-;55770:19;;:1;:19;:::i;:::-;55749:40;-1:-1:-1;55847:19:0;55879:15;55749:40;55892:2;55879:15;:::i;:::-;55869:26;;;;;;-1:-1:-1;;;55869:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55869:26:0;;55847:48;;55908:18;55929:5;;;;;;;;;;;;;;;;;55908:26;;55998:1;55991:5;55987:13;56043:2;56035:6;56031:15;56094:1;56062:777;56117:3;56114:1;56111:10;56062:777;;;56172:1;56215:12;;;;;56209:19;56310:4;56298:2;56294:14;;;;;56276:40;;56270:47;56419:2;56415:14;;;56411:25;;56397:40;;56391:47;56548:1;56544:13;;;56540:24;;56526:39;;56520:46;56668:16;;;;56654:31;;56648:38;56346:1;56342:11;;;56440:4;56387:58;;;56378:68;56471:11;;56516:57;;;56507:67;;;;56599:11;;56644:49;;56635:59;56723:3;56719:13;56752:22;;56822:1;56807:17;;;;56165:9;56062:777;;;56066:44;56871:1;56866:3;56862:11;56892:1;56887:84;;;;56990:1;56985:82;;;;56855:212;;56887:84;-1:-1:-1;;;;;56920:17:0;;56913:43;56887:84;;56985:82;-1:-1:-1;;;;;57018:17:0;;57011:41;56855:212;-1:-1:-1;;;57083:26:0;;;;55554:1607;-1:-1:-1;;;;55554:1607:0:o;24242:157::-;-1:-1:-1;;;;;;24351:40:0;;-1:-1:-1;;;24351:40:0;24242:157;;;:::o;46572:138::-;46632:7;46694:5;46677:23;;;;;;;;:::i;:::-;;;;-1:-1:-1;;46677:23:0;;;;;;;;;46667:34;;46677:23;46667:34;;;;;46572:138;-1:-1:-1;;46572:138:0:o;41130:589::-;41274:45;41301:4;41307:2;41311:7;41274:26;:45::i;:::-;-1:-1:-1;;;;;41336:18:0;;41332:187;;41371:40;41403:7;41371:31;:40::i;:::-;41332:187;;;41441:2;-1:-1:-1;;;;;41433:10:0;:4;-1:-1:-1;;;;;41433:10:0;;41429:90;;41460:47;41493:4;41499:7;41460:32;:47::i;:::-;-1:-1:-1;;;;;41533:16:0;;41529:183;;41566:45;41603:7;41566:36;:45::i;:::-;41529:183;;;41639:4;-1:-1:-1;;;;;41633:10:0;:2;-1:-1:-1;;;;;41633:10:0;;41629:83;;41660:40;41688:2;41692:7;41660:27;:40::i;7615:346::-;7678:13;7708:10;7704:54;;-1:-1:-1;7735:11:0;;;;;;;;;;;;-1:-1:-1;;;7735:11:0;;;;;;7704:54;7783:5;7768:12;7828:78;7835:9;;7828:78;;7861:8;;;;:::i;:::-;;;;7893:1;7884:10;;;;;7828:78;;;7923:30;7939:5;7946:6;7923:15;:30::i;32842:321::-;32972:18;32978:2;32982:7;32972:5;:18::i;:::-;33023:54;33054:1;33058:2;33062:7;33071:5;33023:22;:54::i;:::-;33001:154;;;;-1:-1:-1;;;33001:154:0;;;;;;;:::i;36242:803::-;36397:4;36418:15;:2;-1:-1:-1;;;;;36418:13:0;;:15::i;:::-;36414:624;;;36470:2;-1:-1:-1;;;;;36454:36:0;;36491:12;:10;:12::i;:::-;36505:4;36511:7;36520:5;36454:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36454:72:0;;;;;;;;-1:-1:-1;;36454:72:0;;;;;;;;;;;;:::i;:::-;;;36450:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36700:13:0;;36696:272;;36743:60;;-1:-1:-1;;;36743:60:0;;;;;;;:::i;36696:272::-;36918:6;36912:13;36903:6;36899:2;36895:15;36888:38;36450:533;-1:-1:-1;;;;;;36577:55:0;-1:-1:-1;;;36577:55:0;;-1:-1:-1;36570:62:0;;36414:624;-1:-1:-1;37022:4:0;37015:11;;42442:164;42546:10;:17;;42519:24;;;;:15;:24;;;;;:44;;;42574:24;;;;;;;;;;;;42442:164::o;43233:1014::-;43499:22;43549:1;43524:22;43541:4;43524:16;:22::i;:::-;:26;;;;:::i;:::-;43561:18;43582:26;;;:17;:26;;;;;;43499:51;;-1:-1:-1;43715:28:0;;;43711:354;;-1:-1:-1;;;;;43782:18:0;;43760:19;43782:18;;;:12;:18;;;;;;;;:34;;;;;;;;;43833:30;;;;;;:44;;;43963:30;;:17;:30;;;;;:43;;;43711:354;-1:-1:-1;44161:26:0;;;;:17;:26;;;;;;;;44154:33;;;-1:-1:-1;;;;;44205:18:0;;;;;:12;:18;;;;;:34;;;;;;;44198:41;43233:1014::o;44542:1097::-;44820:10;:17;44795:22;;44820:21;;44840:1;;44820:21;:::i;:::-;44852:18;44873:24;;;:15;:24;;;;;;45246:10;:26;;44795:46;;-1:-1:-1;44873:24:0;;44795:46;;45246:26;;;;-1:-1:-1;;;45246:26:0;;;;;;;;;;;;;;;;;45224:48;;45310:11;45285:10;45296;45285:22;;;;;;-1:-1:-1;;;45285:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;45399:28;;;:15;:28;;;;;;;:41;;;45580:24;;;;;45573:31;45615:10;:16;;;;;-1:-1:-1;;;45615:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;44542:1097;;;;:::o;42020:221::-;42105:14;42122:20;42139:2;42122:16;:20::i;:::-;-1:-1:-1;;;;;42153:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;42198:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;42020:221:0:o;8089:539::-;8168:13;8194:19;8226:10;8230:6;8226:1;:10;:::i;:::-;8216:21;;;;;;-1:-1:-1;;;8216:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8216:21:0;-1:-1:-1;8194:43:0;-1:-1:-1;8326:9:0;8351:1;8338:10;8342:6;8338:1;:10;:::i;:::-;:14;;;;:::i;:::-;8326:26;;8321:202;-1:-1:-1;;;8407:5:0;8415:3;8407:11;8394:25;;;;;-1:-1:-1;;;8394:25:0;;;;;;;;;;;;8382:6;8389:1;8382:9;;;;;;-1:-1:-1;;;8382:9:0;;;;;;;;;;;;:37;-1:-1:-1;;;;;8382:37:0;;;;;;;;-1:-1:-1;8444:1:0;8434:11;;;;;8464:6;8460:52;;8491:5;;8460:52;8362:3;;;:::i;:::-;;;8321:202;;;-1:-1:-1;8541:10:0;;8533:55;;;;-1:-1:-1;;;8533:55:0;;;;;;;:::i;:::-;8613:6;8089:539;-1:-1:-1;;;8089:539:0:o;33499:382::-;-1:-1:-1;;;;;33579:16:0;;33571:61;;;;-1:-1:-1;;;33571:61:0;;;;;;;:::i;:::-;33652:16;33660:7;33652;:16::i;:::-;33651:17;33643:58;;;;-1:-1:-1;;;33643:58:0;;;;;;;:::i;:::-;33714:45;33743:1;33747:2;33751:7;33714:20;:45::i;:::-;-1:-1:-1;;;;;33772:13:0;;;;;;:9;:13;;;;;:18;;33789:1;;33772:13;:18;;33789:1;;33772:18;:::i;:::-;;;;-1:-1:-1;;33801:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;33801:21:0;-1:-1:-1;;;;;33801:21:0;;;;;;;;33840:33;;33801:16;;;33840:33;;33801:16;;33840:33;33499:382;;:::o;16413:387::-;16736:20;16784:8;;;16413:387::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:175:1:-;84:20;;-1:-1:-1;;;;;133:31:1;;123:42;;113:2;;179:1;176;169:12;194:198;;306:2;294:9;285:7;281:23;277:32;274:2;;;327:6;319;312:22;274:2;355:31;376:9;355:31;:::i;397:274::-;;;526:2;514:9;505:7;501:23;497:32;494:2;;;547:6;539;532:22;494:2;575:31;596:9;575:31;:::i;:::-;565:41;;625:40;661:2;650:9;646:18;625:40;:::i;:::-;615:50;;484:187;;;;;:::o;676:342::-;;;;822:2;810:9;801:7;797:23;793:32;790:2;;;843:6;835;828:22;790:2;871:31;892:9;871:31;:::i;:::-;861:41;;921:40;957:2;946:9;942:18;921:40;:::i;:::-;911:50;;1008:2;997:9;993:18;980:32;970:42;;780:238;;;;;:::o;1023:1178::-;;;;;1195:3;1183:9;1174:7;1170:23;1166:33;1163:2;;;1217:6;1209;1202:22;1163:2;1245:31;1266:9;1245:31;:::i;:::-;1235:41;;1295:2;1316:40;1352:2;1341:9;1337:18;1316:40;:::i;:::-;1306:50;;1403:2;1392:9;1388:18;1375:32;1365:42;;1458:2;1447:9;1443:18;1430:32;1481:18;1522:2;1514:6;1511:14;1508:2;;;1543:6;1535;1528:22;1508:2;1586:6;1575:9;1571:22;1561:32;;1631:7;1624:4;1620:2;1616:13;1612:27;1602:2;;1658:6;1650;1643:22;1602:2;1699;1686:16;1721:2;1717;1714:10;1711:2;;;1727:18;;:::i;:::-;1776:2;1770:9;1845:2;1826:13;;-1:-1:-1;;1822:27:1;1810:40;;1806:49;;1870:18;;;1890:22;;;1867:46;1864:2;;;1916:18;;:::i;:::-;1952:2;1945:22;1976:18;;;2013:11;;;2009:20;;2006:33;-1:-1:-1;2003:2:1;;;2057:6;2049;2042:22;2003:2;2118;2113;2109;2105:11;2100:2;2092:6;2088:15;2075:46;2141:15;;;2137:24;;;2130:40;;;;-1:-1:-1;1153:1048:1;;;;-1:-1:-1;1153:1048:1;;-1:-1:-1;;1153:1048:1:o;2206:369::-;;;2332:2;2320:9;2311:7;2307:23;2303:32;2300:2;;;2353:6;2345;2338:22;2300:2;2381:31;2402:9;2381:31;:::i;:::-;2371:41;;2462:2;2451:9;2447:18;2434:32;2509:5;2502:13;2495:21;2488:5;2485:32;2475:2;;2536:6;2528;2521:22;2475:2;2564:5;2554:15;;;2290:285;;;;;:::o;2580:266::-;;;2709:2;2697:9;2688:7;2684:23;2680:32;2677:2;;;2730:6;2722;2715:22;2677:2;2758:31;2779:9;2758:31;:::i;:::-;2748:41;2836:2;2821:18;;;;2808:32;;-1:-1:-1;;;2667:179:1:o;2851:257::-;;2962:2;2950:9;2941:7;2937:23;2933:32;2930:2;;;2983:6;2975;2968:22;2930:2;3027:9;3014:23;3046:32;3072:5;3046:32;:::i;3113:261::-;;3235:2;3223:9;3214:7;3210:23;3206:32;3203:2;;;3256:6;3248;3241:22;3203:2;3293:9;3287:16;3312:32;3338:5;3312:32;:::i;3379:190::-;;3491:2;3479:9;3470:7;3466:23;3462:32;3459:2;;;3512:6;3504;3497:22;3459:2;-1:-1:-1;3540:23:1;;3449:120;-1:-1:-1;3449:120:1:o;3574:194::-;;3697:2;3685:9;3676:7;3672:23;3668:32;3665:2;;;3718:6;3710;3703:22;3665:2;-1:-1:-1;3746:16:1;;3655:113;-1:-1:-1;3655:113:1:o;3773:259::-;;3854:5;3848:12;3881:6;3876:3;3869:19;3897:63;3953:6;3946:4;3941:3;3937:14;3930:4;3923:5;3919:16;3897:63;:::i;:::-;4014:2;3993:15;-1:-1:-1;;3989:29:1;3980:39;;;;4021:4;3976:50;;3824:208;-1:-1:-1;;3824:208:1:o;4037:276::-;;4206:6;4200:13;4222:53;4268:6;4263:3;4256:4;4248:6;4244:17;4222:53;:::i;:::-;4291:16;;;;;4176:137;-1:-1:-1;;4176:137:1:o;4318:470::-;;4535:6;4529:13;4551:53;4597:6;4592:3;4585:4;4577:6;4573:17;4551:53;:::i;:::-;4667:13;;4626:16;;;;4689:57;4667:13;4626:16;4723:4;4711:17;;4689:57;:::i;:::-;4762:20;;4505:283;-1:-1:-1;;;;4505:283:1:o;4793:664::-;;5058:6;5052:13;5074:53;5120:6;5115:3;5108:4;5100:6;5096:17;5074:53;:::i;:::-;5190:13;;5149:16;;;;5212:57;5190:13;5149:16;5246:4;5234:17;;5212:57;:::i;:::-;5336:13;;5291:20;;;5358:57;5336:13;5291:20;5392:4;5380:17;;5358:57;:::i;:::-;5431:20;;5028:429;-1:-1:-1;;;;;5028:429:1:o;5462:1776::-;;6015:6;6009:13;6031:53;6077:6;6072:3;6065:4;6057:6;6053:17;6031:53;:::i;:::-;6115:6;6109:13;6131:68;6190:8;6181:6;6176:3;6172:16;6165:4;6157:6;6153:17;6131:68;:::i;:::-;6277:13;;6225:16;;;6221:31;;6299:57;6277:13;6221:31;6333:4;6321:17;;6299:57;:::i;:::-;6423:13;;6378:20;;;6445:57;6423:13;6378:20;6479:4;6467:17;;6445:57;:::i;:::-;6533:6;6527:13;6549:72;6612:8;6601;6594:5;6590:20;6583:4;6575:6;6571:17;6549:72;:::i;:::-;6703:13;;6647:20;;;;6643:35;;6725:57;6703:13;6643:35;6759:4;6747:17;;6725:57;:::i;:::-;6813:6;6807:13;6829:72;6892:8;6881;6874:5;6870:20;6863:4;6855:6;6851:17;6829:72;:::i;:::-;6983:13;;6927:20;;;;6923:35;;7005:57;6983:13;6923:35;7039:4;7027:17;;7005:57;:::i;:::-;7093:6;7087:13;7109:72;7172:8;7161;7154:5;7150:20;7143:4;7135:6;7131:17;7109:72;:::i;:::-;7201:20;;7197:35;;5985:1253;-1:-1:-1;;;;;;;;;;;5985:1253:1:o;7243:960::-;;7710:6;7704:13;7726:53;7772:6;7767:3;7760:4;7752:6;7748:17;7726:53;:::i;:::-;7810:6;7805:3;7801:16;7788:29;;-1:-1:-1;;;7862:2:1;7855:5;7848:17;7896:6;7890:13;7912:65;7968:8;7964:1;7957:5;7953:13;7946:4;7938:6;7934:17;7912:65;:::i;:::-;8040:1;7996:20;;8032:10;;;8025:22;8072:13;;8094:62;8072:13;8143:1;8135:10;;8128:4;8116:17;;8094:62;:::i;:::-;8176:17;8195:1;8172:25;;7680:523;-1:-1:-1;;;;;7680:523:1:o;8208:592::-;;8579:6;8573:13;8595:53;8641:6;8636:3;8629:4;8621:6;8617:17;8595:53;:::i;:::-;-1:-1:-1;;;8670:16:1;;8695:18;;;-1:-1:-1;;;;8740:1:1;8729:13;;8722:43;8792:1;8781:13;;8549:251;-1:-1:-1;8549:251:1:o;8805:596::-;;9176:6;9170:13;9192:53;9238:6;9233:3;9226:4;9218:6;9214:17;9192:53;:::i;:::-;-1:-1:-1;;;9267:16:1;;9292:18;;;-1:-1:-1;;;;9337:1:1;9326:13;;9319:47;9393:1;9382:13;;9146:255;-1:-1:-1;9146:255:1:o;9406:592::-;;9777:6;9771:13;9793:53;9839:6;9834:3;9827:4;9819:6;9815:17;9793:53;:::i;:::-;-1:-1:-1;;;9868:16:1;;9893:18;;;-1:-1:-1;;;;9938:1:1;9927:13;;9920:43;9990:1;9979:13;;9747:251;-1:-1:-1;9747:251:1:o;10003:592::-;;10374:6;10368:13;10390:53;10436:6;10431:3;10424:4;10416:6;10412:17;10390:53;:::i;:::-;-1:-1:-1;;;10465:16:1;;10490:18;;;-1:-1:-1;;;;10535:1:1;10524:13;;10517:43;10587:1;10576:13;;10344:251;-1:-1:-1;10344:251:1:o;10600:592::-;;10971:6;10965:13;10987:53;11033:6;11028:3;11021:4;11013:6;11009:17;10987:53;:::i;:::-;-1:-1:-1;;;11062:16:1;;11087:18;;;-1:-1:-1;;;;11132:1:1;11121:13;;11114:43;11184:1;11173:13;;10941:251;-1:-1:-1;10941:251:1:o;11197:592::-;;11568:6;11562:13;11584:53;11630:6;11625:3;11618:4;11610:6;11606:17;11584:53;:::i;:::-;-1:-1:-1;;;11659:16:1;;11684:18;;;-1:-1:-1;;;;11729:1:1;11718:13;;11711:43;11781:1;11770:13;;11538:251;-1:-1:-1;11538:251:1:o;11794:1104::-;11980:13;;11794:1104;;;;12053:1;12038:17;;12074:1;12110:18;;;;12137:2;;12191:4;12183:6;12179:17;12169:27;;12137:2;12217;12265;12257:6;12254:14;12234:18;12231:38;12228:2;;;-1:-1:-1;;;12292:33:1;;12348:4;12345:1;12338:15;12378:4;12299:3;12366:17;12228:2;12409:18;12436:104;;;;12554:1;12549:324;;;;12402:471;;12436:104;-1:-1:-1;;12469:24:1;;12457:37;;12514:16;;;;-1:-1:-1;12436:104:1;;12549:324;12585:39;12617:6;12585:39;:::i;:::-;12646:3;12662:165;12676:6;12673:1;12670:13;12662:165;;;12754:14;;12741:11;;;12734:35;12797:16;;;;12691:10;;12662:165;;;12666:3;;12856:6;12851:3;12847:16;12840:23;;12402:471;-1:-1:-1;12889:3:1;;11930:968;-1:-1:-1;;;;;;;;11930:968:1:o;12903:1448::-;-1:-1:-1;;;13403:63:1;;13489:13;;12903:1448;;13511:62;13489:13;13561:2;13552:12;;13545:4;13533:17;;13511:62;:::i;:::-;13637:66;13632:2;13592:16;;;13624:11;;;13617:87;13733:34;13728:2;13720:11;;13713:55;13797:34;13792:2;13784:11;;13777:55;13862:34;13856:3;13848:12;;13841:56;13927:66;13921:3;13913:12;;13906:88;14024:66;14018:3;14010:12;;14003:88;-1:-1:-1;;;14115:3:1;14107:12;;14100:25;14150:13;;14172:64;14150:13;14221:3;14213:12;;14206:4;14194:17;;14172:64;:::i;:::-;-1:-1:-1;;;14296:3:1;14255:17;;;;14288:12;;;14281:36;14341:3;14333:12;;13393:958;-1:-1:-1;;;;13393:958:1:o;14356:422::-;;-1:-1:-1;;;14613:3:1;14606:20;14655:6;14649:13;14671:61;14725:6;14721:1;14716:3;14712:11;14705:4;14697:6;14693:17;14671:61;:::i;:::-;14752:16;;;;14770:1;14748:24;;14596:182;-1:-1:-1;;14596:182:1:o;14783:257::-;-1:-1:-1;;;14985:22:1;;15032:1;15023:11;;14975:65::o;15045:423::-;;-1:-1:-1;;;15302:3:1;15295:21;15345:6;15339:13;15361:61;15415:6;15411:1;15406:3;15402:11;15395:4;15387:6;15383:17;15361:61;:::i;:::-;15442:16;;;;15460:1;15438:24;;15285:183;-1:-1:-1;;15285:183:1:o;15473:574::-;;-1:-1:-1;;;15831:3:1;15824:18;15871:6;15865:13;15887:61;15941:6;15937:1;15932:3;15928:11;15921:4;15913:6;15909:17;15887:61;:::i;:::-;-1:-1:-1;;;16007:1:1;15967:16;;;;15999:10;;;15992:23;-1:-1:-1;16039:1:1;16031:10;;15814:233;-1:-1:-1;15814:233:1:o;16052:423::-;;-1:-1:-1;;;16309:3:1;16302:21;16352:6;16346:13;16368:61;16422:6;16418:1;16413:3;16409:11;16402:4;16394:6;16390:17;16368:61;:::i;16480:422::-;;-1:-1:-1;;;16737:3:1;16730:20;16779:6;16773:13;16795:61;16849:6;16845:1;16840:3;16836:11;16829:4;16821:6;16817:17;16795:61;:::i;16907:418::-;;-1:-1:-1;;;17164:3:1;17157:16;17202:6;17196:13;17218:61;17272:6;17268:1;17263:3;17259:11;17252:4;17244:6;17240:17;17218:61;:::i;:::-;17299:16;;;;17317:1;17295:24;;17147:178;-1:-1:-1;;17147:178:1:o;17330:448::-;;17592:31;17587:3;17580:44;17653:6;17647:13;17669:62;17724:6;17719:2;17714:3;17710:12;17703:4;17695:6;17691:17;17669:62;:::i;:::-;17751:16;;;;17769:2;17747:25;;17570:208;-1:-1:-1;;17570:208:1:o;17783:205::-;17983:3;17974:14::o;17993:423::-;;-1:-1:-1;;;18250:3:1;18243:21;18293:6;18287:13;18309:61;18363:6;18359:1;18354:3;18350:11;18343:4;18335:6;18331:17;18309:61;:::i;18421:203::-;-1:-1:-1;;;;;18585:32:1;;;;18567:51;;18555:2;18540:18;;18522:102::o;18629:490::-;-1:-1:-1;;;;;18898:15:1;;;18880:34;;18950:15;;18945:2;18930:18;;18923:43;18997:2;18982:18;;18975:34;;;19045:3;19040:2;19025:18;;19018:31;;;18629:490;;19066:47;;19093:19;;19085:6;19066:47;:::i;:::-;19058:55;18832:287;-1:-1:-1;;;;;;18832:287:1:o;19124:187::-;19289:14;;19282:22;19264:41;;19252:2;19237:18;;19219:92::o;19316:221::-;;19465:2;19454:9;19447:21;19485:46;19527:2;19516:9;19512:18;19504:6;19485:46;:::i;19542:356::-;19744:2;19726:21;;;19763:18;;;19756:30;19822:34;19817:2;19802:18;;19795:62;19889:2;19874:18;;19716:182::o;19903:407::-;20105:2;20087:21;;;20144:2;20124:18;;;20117:30;20183:34;20178:2;20163:18;;20156:62;-1:-1:-1;;;20249:2:1;20234:18;;20227:41;20300:3;20285:19;;20077:233::o;20315:414::-;20517:2;20499:21;;;20556:2;20536:18;;;20529:30;20595:34;20590:2;20575:18;;20568:62;-1:-1:-1;;;20661:2:1;20646:18;;20639:48;20719:3;20704:19;;20489:240::o;20734:402::-;20936:2;20918:21;;;20975:2;20955:18;;;20948:30;21014:34;21009:2;20994:18;;20987:62;-1:-1:-1;;;21080:2:1;21065:18;;21058:36;21126:3;21111:19;;20908:228::o;21141:352::-;21343:2;21325:21;;;21382:2;21362:18;;;21355:30;21421;21416:2;21401:18;;21394:58;21484:2;21469:18;;21315:178::o;21498:400::-;21700:2;21682:21;;;21739:2;21719:18;;;21712:30;21778:34;21773:2;21758:18;;21751:62;-1:-1:-1;;;21844:2:1;21829:18;;21822:34;21888:3;21873:19;;21672:226::o;21903:349::-;22105:2;22087:21;;;22144:2;22124:18;;;22117:30;22183:27;22178:2;22163:18;;22156:55;22243:2;22228:18;;22077:175::o;22257:355::-;22459:2;22441:21;;;22498:2;22478:18;;;22471:30;22537:33;22532:2;22517:18;;22510:61;22603:2;22588:18;;22431:181::o;22617:408::-;22819:2;22801:21;;;22858:2;22838:18;;;22831:30;22897:34;22892:2;22877:18;;22870:62;-1:-1:-1;;;22963:2:1;22948:18;;22941:42;23015:3;23000:19;;22791:234::o;23030:420::-;23232:2;23214:21;;;23271:2;23251:18;;;23244:30;23310:34;23305:2;23290:18;;23283:62;23381:26;23376:2;23361:18;;23354:54;23440:3;23425:19;;23204:246::o;23455:406::-;23657:2;23639:21;;;23696:2;23676:18;;;23669:30;23735:34;23730:2;23715:18;;23708:62;-1:-1:-1;;;23801:2:1;23786:18;;23779:40;23851:3;23836:19;;23629:232::o;23866:405::-;24068:2;24050:21;;;24107:2;24087:18;;;24080:30;24146:34;24141:2;24126:18;;24119:62;-1:-1:-1;;;24212:2:1;24197:18;;24190:39;24261:3;24246:19;;24040:231::o;24276:330::-;24478:2;24460:21;;;24517:1;24497:18;;;24490:29;-1:-1:-1;;;24550:2:1;24535:18;;24528:37;24597:2;24582:18;;24450:156::o;24611:356::-;24813:2;24795:21;;;24832:18;;;24825:30;24891:34;24886:2;24871:18;;24864:62;24958:2;24943:18;;24785:182::o;24972:408::-;25174:2;25156:21;;;25213:2;25193:18;;;25186:30;25252:34;25247:2;25232:18;;25225:62;-1:-1:-1;;;25318:2:1;25303:18;;25296:42;25370:3;25355:19;;25146:234::o;25385:356::-;25587:2;25569:21;;;25606:18;;;25599:30;25665:34;25660:2;25645:18;;25638:62;25732:2;25717:18;;25559:182::o;25746:340::-;25948:2;25930:21;;;25987:2;25967:18;;;25960:30;-1:-1:-1;;;26021:2:1;26006:18;;25999:46;26077:2;26062:18;;25920:166::o;26091:405::-;26293:2;26275:21;;;26332:2;26312:18;;;26305:30;26371:34;26366:2;26351:18;;26344:62;-1:-1:-1;;;26437:2:1;26422:18;;26415:39;26486:3;26471:19;;26265:231::o;26501:397::-;26703:2;26685:21;;;26742:2;26722:18;;;26715:30;26781:34;26776:2;26761:18;;26754:62;-1:-1:-1;;;26847:2:1;26832:18;;26825:31;26888:3;26873:19;;26675:223::o;26903:340::-;27105:2;27087:21;;;27144:2;27124:18;;;27117:30;-1:-1:-1;;;27178:2:1;27163:18;;27156:46;27234:2;27219:18;;27077:166::o;27248:413::-;27450:2;27432:21;;;27489:2;27469:18;;;27462:30;27528:34;27523:2;27508:18;;27501:62;-1:-1:-1;;;27594:2:1;27579:18;;27572:47;27651:3;27636:19;;27422:239::o;27666:408::-;27868:2;27850:21;;;27907:2;27887:18;;;27880:30;27946:34;27941:2;27926:18;;27919:62;-1:-1:-1;;;28012:2:1;27997:18;;27990:42;28064:3;28049:19;;27840:234::o;28079:355::-;28281:2;28263:21;;;28320:2;28300:18;;;28293:30;28359:33;28354:2;28339:18;;28332:61;28425:2;28410:18;;28253:181::o;28439:177::-;28585:25;;;28573:2;28558:18;;28540:76::o;28621:129::-;;28689:17;;;28739:4;28723:21;;;28679:71::o;28755:128::-;;28826:1;28822:6;28819:1;28816:13;28813:2;;;28832:18;;:::i;:::-;-1:-1:-1;28868:9:1;;28803:80::o;28888:120::-;;28954:1;28944:2;;28959:18;;:::i;:::-;-1:-1:-1;28993:9:1;;28934:74::o;29013:168::-;;29119:1;29115;29111:6;29107:14;29104:1;29101:21;29096:1;29089:9;29082:17;29078:45;29075:2;;;29126:18;;:::i;:::-;-1:-1:-1;29166:9:1;;29065:116::o;29186:125::-;;29254:1;29251;29248:8;29245:2;;;29259:18;;:::i;:::-;-1:-1:-1;29296:9:1;;29235:76::o;29316:258::-;29388:1;29398:113;29412:6;29409:1;29406:13;29398:113;;;29488:11;;;29482:18;29469:11;;;29462:39;29434:2;29427:10;29398:113;;;29529:6;29526:1;29523:13;29520:2;;;-1:-1:-1;;29564:1:1;29546:16;;29539:27;29369:205::o;29579:136::-;;29646:5;29636:2;;29655:18;;:::i;:::-;-1:-1:-1;;;29691:18:1;;29626:89::o;29720:380::-;29805:1;29795:12;;29852:1;29842:12;;;29863:2;;29917:4;29909:6;29905:17;29895:27;;29863:2;29970;29962:6;29959:14;29939:18;29936:38;29933:2;;;30016:10;30011:3;30007:20;30004:1;29997:31;30051:4;30048:1;30041:15;30079:4;30076:1;30069:15;29933:2;;29775:325;;;:::o;30105:135::-;;-1:-1:-1;;30165:17:1;;30162:2;;;30185:18;;:::i;:::-;-1:-1:-1;30232:1:1;30221:13;;30152:88::o;30245:112::-;;30303:1;30293:2;;30308:18;;:::i;:::-;-1:-1:-1;30342:9:1;;30283:74::o;30362:127::-;30423:10;30418:3;30414:20;30411:1;30404:31;30454:4;30451:1;30444:15;30478:4;30475:1;30468:15;30494:127;30555:10;30550:3;30546:20;30543:1;30536:31;30586:4;30583:1;30576:15;30610:4;30607:1;30600:15;30626:127;30687:10;30682:3;30678:20;30675:1;30668:31;30718:4;30715:1;30708:15;30742:4;30739:1;30732:15;30758:133;-1:-1:-1;;;;;;30834:32:1;;30824:43;;30814:2;;30881:1;30878;30871:12

Swarm Source

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