ETH Price: $2,525.35 (+0.33%)

Token

One Thousand and One Story (1001)
 

Overview

Max Total Supply

1,001 1001

Holders

607

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
4 1001
0xde6b25bba0742e218771682b83376c7ea305bdb6
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Stories

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-17
*/

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides a set of functions to operate with Base64 strings.
 *
 * _Available since v4.5._
 */
library Base64 {
    /**
     * @dev Base64 Encoding/Decoding Table
     */
    string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /**
     * @dev Converts a `bytes` to its Bytes64 `string` representation.
     */
    function encode(bytes memory data) internal pure returns (string memory) {
        /**
         * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
         * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
         */
        if (data.length == 0) return "";

        // Loads the table into memory
        string memory table = _TABLE;

        // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter
        // and split into 4 numbers of 6 bits.
        // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up
        // - `data.length + 2`  -> Round up
        // - `/ 3`              -> Number of 3-bytes chunks
        // - `4 *`              -> 4 characters for each chunk
        string memory result = new string(4 * ((data.length + 2) / 3));

        /// @solidity memory-safe-assembly
        assembly {
            // Prepare the lookup table (skip the first "length" byte)
            let tablePtr := add(table, 1)

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

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

            } {
                // Advance 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // To write each character, shift the 3 bytes (18 bits) chunk
                // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)
                // and apply logical AND with 0x3F which is the number of
                // the previous character in the ASCII table prior to the Base64 Table
                // The result is then added to the table to get the character to write,
                // and finally write it in the result pointer but with a left shift
                // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits

                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance
            }

            // When data `bytes` is not exactly 3 bytes long
            // it is padded with `=` characters at the end
            switch mod(mload(data), 3)
            case 1 {
                mstore8(sub(resultPtr, 1), 0x3d)
                mstore8(sub(resultPtr, 2), 0x3d)
            }
            case 2 {
                mstore8(sub(resultPtr, 1), 0x3d)
            }
        }

        return result;
    }
}

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

    /**
     * @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 an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * 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 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 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        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: invalid token ID");
        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) {
        _requireMinted(tokenId);

        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 overridden 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 token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token 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: caller is not token 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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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);

        _afterTokenTransfer(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);

        _afterTokenTransfer(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 from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: contracts/Story.sol



pragma solidity 0.8.17;




interface ICharacter
{
    function getStrength(uint256 tokenId) external view returns (string memory);
    function getDexterity(uint256 tokenId) external view returns (string memory);
    function getIntelligence(uint256 tokenId) external view returns (string memory);
    function getVitality(uint256 tokenId) external view returns (string memory);
    function getLuck(uint256 tokenId) external view returns (string memory);
    function getFaith(uint256 tokenId) external view returns (string memory);
    function getProfession(uint256 tokenId) external view returns (string memory);
    function getRace(uint256 tokenId) external view returns (string memory);
}

interface ILootBag
{
    function getWeapon(uint256 tokenId) external view returns (string memory);
    function getChest(uint256 tokenId) external view returns (string memory);
    function getHead(uint256 tokenId) external view returns (string memory);
    function getWaist(uint256 tokenId) external view returns (string memory);
    function getFoot(uint256 tokenId) external view returns (string memory);
    function getHand(uint256 tokenId) external view returns (string memory);
    function getNeck(uint256 tokenId) external view returns (string memory);
    function getRing(uint256 tokenId) external view returns (string memory);
}

contract Stories is ERC721
{
    address constant CHAR_CONTRACT_ADDRESS = 0x7403AC30DE7309a0bF019cdA8EeC034a5507cbB3;
    address constant LOOT_CONTRACT_ADDRESS = 0xFF9C1b15B16263C61d017ee9F65C50e4AE0113D7; 
    
    uint256 public totalSupply;

    struct Character
    {
        uint256 id;  /* 8001 to 12000 */
        uint256 bag; /* 1 to 7777 */
    }

    struct Adventure
    {
        Character hero;
        Character villain;
    }

    mapping(uint256 => Adventure) private _adventures;
    
    function tokenURI(uint256 tokenId) override public view returns (string memory output) 
    {
        Character memory hero = _adventures[tokenId].hero;
        Character memory villain = _adventures[tokenId].villain;
        
        string[18] memory parts;
        
        _introduction(hero, villain, parts);
        uint256 outcome = _battle(hero, villain, parts);
        _ending(hero, villain, parts, outcome);
       
        parts[17] = '</svg>';
        
        string memory svg;
        svg = string(abi.encodePacked(svg, parts[0],parts[1],parts[2],parts[3],parts[4],parts[5]));
        svg = string(abi.encodePacked(svg, parts[6],parts[7],parts[8],parts[9],parts[10],parts[11]));
        svg = string(abi.encodePacked(svg, parts[12],parts[13],parts[14],parts[15],parts[16],parts[17]));
        
        string memory strOutcome;
     
        if (outcome == 2) strOutcome = "Victory";
        else if (outcome == 1) strOutcome = "Defeat";
        else strOutcome = "Tie";
        
        bytes memory attributes = 
            abi.encodePacked(
                "[{\"trait_type\":\"Location\",\"value\":\"",_getLocation(hero),"\"},{\"trait_type\":\"Outcome\",\"value\":\"",strOutcome,"\"}]");
        
        string memory description = "1001 onchain stories. Storytelling NFT project.";
        string memory json = 
            Base64.encode(
                abi.encodePacked(
                    "{\"name\": \"Story #", Strings.toString(tokenId), 
                    "\", \"description\": \"", 
                    description,
                    "\", \"image\": \"data:image/svg+xml;base64,", 
                    Base64.encode(bytes(svg)), 
                    "\", \"attributes\":", 
                    attributes,
                    "}"));
        
        output = string(abi.encodePacked('data:application/json;base64,', json));
    }

    function _introduction(Character memory player, Character memory enemy, string[18] memory parts) private view
    {
        AdventureTemplate.introduction(parts, _getRace(player), _getRace(enemy), _getLocation(player));
    }
    
    function _battle(Character memory player, Character memory enemy, string[18] memory parts) private view returns (uint256 outcome)
    {
        outcome = 0;

        uint256 offset = 4;
        
        uint256 playerHP = _getVitality(player);
        uint256 enemyHP = _getVitality(enemy);
        
        uint256 playerMaxDamage = _getMaxDamage(player);
        uint256 enemyMaxDamage = _getMaxDamage(enemy);
        
        for (uint256 i = 0; i < 6; ++i)
        {
            bool survived = true;
            
            if (Utils.random(string(abi.encodePacked(player.id, 'attack', i))) % 2 == 0)
            {
                uint256 damage = Utils.random(string(abi.encodePacked(player.id, 'playerdamage', i))) % playerMaxDamage;
                
                if (damage < enemyHP)
                {
                    enemyHP -= damage;
                }
                else
                {
                    outcome = 2;
                    survived = false;
                }
                
                offset = _playerAttack(player, enemy, parts, offset, damage, survived);
            }
            else
            {
                uint256 damage = Utils.random(string(abi.encodePacked(player.id, 'enemydamage', i))) % enemyMaxDamage;
                
                if (damage < playerHP)
                {
                    playerHP -= damage;
                }
                else
                {
                    outcome = 1;
                    survived = false;
                }
                
                offset = _enemyAttack(enemy, parts, offset, damage, survived);
            }
        
            if (!survived) break;
        }
    }
    
    function _ending(Character memory player, Character memory enemy, string[18] memory parts, uint256 outcome) private view
    {
        AdventureTemplate.ending(parts, player.id, _getRace(enemy), outcome);
    }
    
    function _playerAttack(Character memory player, Character memory enemy, string[18] memory parts, uint256 initialOffset, uint256 damage, bool survived) private view returns (uint256 offset)
    {
        offset = AdventureTemplate.playerAttack(parts, _getWeapon(player), _getRace(enemy), initialOffset, damage, survived);
    }
    
    function _enemyAttack(Character memory enemy, string[18] memory parts, uint256 initialOffset, uint256 damage, bool survived) private view returns (uint256 offset)
    {
        offset = AdventureTemplate.enemyAttack(parts, _getRace(enemy), _getWeapon(enemy), initialOffset, damage, survived);
    }
        
    function _getWeapon(Character memory character) private view returns (string memory name)
    {
        string memory fullWeaponName = ILootBag(LOOT_CONTRACT_ADDRESS).getWeapon(character.bag);
        
        return LootParser.getWeaponName(fullWeaponName);
    }
    
    function _getRace(Character memory character) private view returns (string memory race)
    {
        string memory fullRace = ICharacter(CHAR_CONTRACT_ADDRESS).getRace(character.id);
        
        race = LootParser.getRace(fullRace);        
    }

    function _getLocation(Character memory character) private pure returns (string memory location)
    {
        uint256 rnd = Utils.random(string(abi.encodePacked(character.id, 'location'))) % 10000;
        
        if (rnd < 2000)
        {
            location = "a cave";
        }
        else if (rnd < 4000)
        {
            location = "a forest";
        }
        else if (rnd < 6000)
        {
            location = "a desert";
        }
        else if (rnd < 8000)
        {
            location = "mines";
        }
        else if (rnd < 9000)
        {
            location = "the Dark Forest";
        }
        else if (rnd < 9500)
        {
            location = "the Magic Meadow";
        }
        else if (rnd < 9750)
        {
            location = "a dungeon";
        }
        else if (rnd < 9875)
        {
            location = "an abandoned fortress";   
        }
        else if (rnd < 9940)
        {
            location = "a prison";
        }
        else if (rnd < 9990)
        {
            location = "the Witch Tower";
        }
        else
        {
            location = "the Dark Castle";
        }
        
    }
    
    function _getVitality(Character memory character) private view returns (uint256 vitality)
    {
        string memory strValue = ICharacter(CHAR_CONTRACT_ADDRESS).getVitality(character.id);
        vitality = _getIntValue(bytes(strValue), bytes("Vitality ").length);
    }

    function _getMaxDamage(Character memory character) private view returns (uint256 damage)
    {
        string memory strValue = ICharacter(CHAR_CONTRACT_ADDRESS).getStrength(character.id);
        damage = _getIntValue(bytes(strValue), bytes("Strength ").length);
    }
    
    function _getIntValue(bytes memory bStr, uint256 baseLen) private pure returns (uint256 value)
    {
        if (bStr.length - baseLen > 2) return 10;
        
        value = LootParser.parseInt(bStr[baseLen]);
    }

    function mint() public 
    {
        require(totalSupply < 1001, "I don't know any more stories");

        totalSupply += 1;

        uint256 hseed = uint256(keccak256(abi.encodePacked([1, totalSupply, block.number])));
        uint256 vseed = uint256(keccak256(abi.encodePacked([2, totalSupply, block.number])));
    
        uint hid = 1 + (hseed % 7777);
        uint hbid = 8001 + (hseed % 4000);

        uint vid = 1 + (vseed % 7777);
        uint vbid = 8001 + (vseed % 4000);

        _adventures[totalSupply] = Adventure({
            hero: Character({id: hid, bag: hbid}),
            villain: Character({id: vid, bag: vbid})
        });

        _mint(msg.sender, totalSupply);
    }
    
    constructor() ERC721("One Thousand and One Story", "1001") 
    {
        for (uint i = 0; i < 10; i++)
        {
            mint();
        }
    }
}

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

library AdventureTemplate
{
    function introduction(string[18] memory parts, string memory playerRace, string memory enemyRace, string memory location) internal pure
    {
        parts[ 0] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { fill: white; font-family: serif; font-size: 14px; }</style><rect width="100%" height="100%" fill="black" />';
        parts[ 1] = string(abi.encodePacked('<text x="10" y="20" class="base">Player: ', playerRace, '</text>'));
        parts[ 2] = string(abi.encodePacked('<text x="10" y="40" class="base">You entered ', location, '</text>'));
        parts[ 3] = string(abi.encodePacked('<text x="10" y="60" class="base">You ran into an angry ', enemyRace, '</text>'));
    }
    
    function ending(string[18] memory parts, uint256 playerId, string memory enemyRace, uint256 outcome) internal pure
    {
        string memory finale;
        
        if (outcome == 2)
        {
            finale = "Glorious victory!";
        }
        else if (outcome == 1)
        {
            finale = "The hero is defeated but not forgotten";
        }
        else
        {
            if (Utils.random(string(abi.encodePacked(playerId, "tied"))) % 2 == 0)
            {
                finale = "You run away with your tail between your legs";
            }
            else
            {
                finale = string(abi.encodePacked(enemyRace, ' retreats. The way is clear.'));
            }
        }
        
        parts[16] = string(abi.encodePacked('<text x="10" y="320" class="base">', finale, '</text>'));
    }
    
    function playerAttack(string[18] memory parts, string memory weapon, string memory enemy,  uint256 initialOffset, uint256 damage, bool survived) internal pure returns (uint256 offset)
    {
        offset = initialOffset;
        string memory finale = survived ? "but survived" : "and fell dead";
        
        parts[offset] = string(abi.encodePacked('<text x="10" y="', Strings.toString(offset * 20),'" class="base">You attack the ', enemy,' with your ', weapon, '</text>'));
        offset += 1;
        parts[offset] = string(abi.encodePacked('<text x="10" y="', Strings.toString(offset * 20),'" class="base">', enemy, ' took ', Strings.toString(damage), ' damage ', finale, '</text>'));
        offset += 1;
    }
    
    function enemyAttack(string[18] memory parts, string memory enemy, string memory weapon, uint256 initialOffset, uint256 damage, bool survived) internal pure returns (uint256 offset)
    {
        offset = initialOffset;
        string memory finale = survived ? "but survived" : "and fell dead";
        
        parts[offset] = string(abi.encodePacked('<text x="10" y="', Strings.toString(offset * 20),'" class="base">', enemy,' attacks you with the ', weapon, '</text>'));
        offset += 1;
        parts[offset] = string(abi.encodePacked('<text x="10" y="', Strings.toString(offset * 20),'" class="base">You took ', Strings.toString(damage), ' damage ', finale, '</text>'));
        offset += 1;
    }
}

library LootParser 
{
    function compareStrings(string memory a, string memory b) internal pure returns (bool) 
    {
        if (bytes(a).length != bytes(b).length) 
        {
            return false;
        } 
        else 
        {
            return keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b));
        }
    }
    
    function parseInt(bytes1 b1) internal pure returns (uint256 value)
    {
        if (b1 == bytes("1")[0]) return 1;
        if (b1 == bytes("2")[0]) return 2;
        if (b1 == bytes("3")[0]) return 3;
        if (b1 == bytes("4")[0]) return 4;
        if (b1 == bytes("5")[0]) return 5;
        if (b1 == bytes("6")[0]) return 6;
        if (b1 == bytes("7")[0]) return 7;
        if (b1 == bytes("8")[0]) return 8;
        if (b1 == bytes("9")[0]) return 9;
        
        require(false, "Shouldn't be here");
    }
    
    function getRace(string memory fullRace) internal pure returns (string memory race)
    {
        bytes memory bStr = bytes(fullRace);
        bytes memory space = bytes(" ");
        
        for (uint i = 0; i < bStr.length; ++i)
        {
            if (bStr[i] == space[0]) break;
                
            race = string(abi.encodePacked(race, bStr[i]));
        }
    }
    
    function getWeaponName(string memory fullWeaponName) internal pure returns (string memory name)
    {
        bytes memory bStr = bytes(fullWeaponName);
        bytes memory quote = bytes('"');
        bytes memory space = bytes(" ");
        
        uint256 startingIndex;
        bool hasName;
        
        if (bStr[0] == quote[0])
        {
            hasName = true;
            startingIndex = 1;
        }
        
        bool firstPart = true;
        string memory part;
        
        for (uint i = startingIndex; i < bStr.length; ++i)
        {
            if (hasName)
            {
                if (bStr[i] == quote[0])
                {
                    hasName = false;
                }
                continue;
            }
            
            if (bStr[i] == space[0])
            {
                if (compareStrings(part, "of"))
                    return name;
                
                if (firstPart)
                {
                    name = part;
                }
                else
                {
                    name = string(abi.encodePacked(name, " ", part));
                }
                part = "";
            }
            else
            {
                part = string(abi.encodePacked(part, bStr[i]));
            }
        }
        
        name = string(abi.encodePacked(name, " ", part));
    }
}

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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"output","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"}]

60806040523480156200001157600080fd5b506040518060400160405280601a81526020017f4f6e652054686f7573616e6420616e64204f6e652053746f7279000000000000815250604051806040016040528060048152602001633130303160e01b81525081600090816200007691906200049f565b5060016200008582826200049f565b50505060005b600a811015620000b4576200009f620000bb565b80620000ab8162000581565b9150506200008b565b5062000612565b6103e960065410620001145760405162461bcd60e51b815260206004820152601d60248201527f4920646f6e2774206b6e6f7720616e79206d6f72652073746f7269657300000060448201526064015b60405180910390fd5b6001600660008282546200012991906200059d565b925050819055506000604051806060016040528060018152602001600654815260200143815250604051602001620001629190620005b9565b60408051601f198184030181528282528051602091820120606084018352600284526006548483015243848401529151919350600092620001a692909101620005b9565b60408051601f19818403018152919052805160209091012090506000620001d0611e6184620005ef565b620001dd9060016200059d565b90506000620001ef610fa085620005ef565b620001fd90611f416200059d565b905060006200020f611e6185620005ef565b6200021c9060016200059d565b905060006200022e610fa086620005ef565b6200023c90611f416200059d565b6040805160808101825280820187815260608201879052815281518083018352858152602081810185905280830191825260068054600090815260078352949094209251805184558101516001840155905180516002840155015160039091015554909150620002ae903390620002b6565b505050505050565b6001600160a01b0382166200030e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016200010b565b6000818152600260205260409020546001600160a01b031615620003755760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016200010b565b6001600160a01b0382166000908152600360205260408120805460019290620003a09084906200059d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200042e57607f821691505b6020821081036200044f57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003fe57600081815260208120601f850160051c810160208610156200047e5750805b601f850160051c820191505b81811015620002ae578281556001016200048a565b81516001600160401b03811115620004bb57620004bb62000403565b620004d381620004cc845462000419565b8462000455565b602080601f8311600181146200050b5760008415620004f25750858301515b600019600386901b1c1916600185901b178555620002ae565b600085815260208120601f198616915b828110156200053c578886015182559484019460019091019084016200051b565b50858210156200055b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b6000600182016200059657620005966200056b565b5060010190565b80820180821115620005b357620005b36200056b565b92915050565b60008183825b6003811015620005e0578151835260209283019290910190600101620005bf565b50505060608201905092915050565b6000826200060d57634e487b7160e01b600052601260045260246000fd5b500690565b61333d80620006226000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806342842e0e11610097578063a22cb46511610066578063a22cb465146101ea578063b88d4fde146101fd578063c87b56dd14610210578063e985e9c51461022357600080fd5b806342842e0e146101a95780636352211e146101bc57806370a08231146101cf57806395d89b41146101e257600080fd5b8063095ea7b3116100d3578063095ea7b3146101625780631249c58b1461017757806318160ddd1461017f57806323b872dd1461019657600080fd5b806301ffc9a7146100fa57806306fdde0314610122578063081812fc14610137575b600080fd5b61010d610108366004612442565b610236565b60405190151581526020015b60405180910390f35b61012a610288565b60405161011991906124af565b61014a6101453660046124c2565b61031a565b6040516001600160a01b039091168152602001610119565b6101756101703660046124f2565b610341565b005b61017561045b565b61018860065481565b604051908152602001610119565b6101756101a436600461251c565b610638565b6101756101b736600461251c565b610669565b61014a6101ca3660046124c2565b610684565b6101886101dd366004612558565b6106e4565b61012a61076a565b6101756101f8366004612573565b610779565b61017561020b36600461261e565b610788565b61012a61021e3660046124c2565b6107c0565b61010d6102313660046126c9565b610a58565b60006001600160e01b031982166380ac58cd60e01b148061026757506001600160e01b03198216635b5e139f60e01b145b8061028257506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610297906126fc565b80601f01602080910402602001604051908101604052809291908181526020018280546102c3906126fc565b80156103105780601f106102e557610100808354040283529160200191610310565b820191906000526020600020905b8154815290600101906020018083116102f357829003601f168201915b5050505050905090565b600061032582610a86565b506000908152600460205260409020546001600160a01b031690565b600061034c82610684565b9050806001600160a01b0316836001600160a01b0316036103be5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806103da57506103da8133610a58565b61044c5760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016103b5565b6104568383610ae8565b505050565b6103e9600654106104ae5760405162461bcd60e51b815260206004820152601d60248201527f4920646f6e2774206b6e6f7720616e79206d6f72652073746f7269657300000060448201526064016103b5565b6001600660008282546104c19190612746565b9250508190555060006040518060600160405280600181526020016006548152602001438152506040516020016104f89190612759565b60408051601f19818403018152828252805160209182012060608401835260028452600654848301524384840152915191935060009261053a92909101612759565b60408051601f19818403018152919052805160209091012090506000610562611e61846127a3565b61056d906001612746565b9050600061057d610fa0856127a3565b61058990611f41612746565b90506000610599611e61856127a3565b6105a4906001612746565b905060006105b4610fa0866127a3565b6105c090611f41612746565b6040805160808101825280820187815260608201879052815281518083018352858152602081810185905280830191825260068054600090815260078352949094209251805184558101516001840155905180516002840155015160039091015554909150610630903390610b56565b505050505050565b6106423382610c98565b61065e5760405162461bcd60e51b81526004016103b5906127b7565b610456838383610cf7565b61045683838360405180602001604052806000815250610788565b6000818152600260205260408120546001600160a01b0316806102825760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016103b5565b60006001600160a01b03821661074e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016103b5565b506001600160a01b031660009081526003602052604090205490565b606060018054610297906126fc565b610784338383610e93565b5050565b6107923383610c98565b6107ae5760405162461bcd60e51b81526004016103b5906127b7565b6107ba84848484610f61565b50505050565b60008181526007602081815260408084208151808301835281548152600182015481850152948690529282528051808201909152600283015481526003909201549082015260609190610811612404565b61081c838383610f94565b6000610829848484610fb8565b905061083784848484611176565b60408051808201825260068152651e17b9bb339f60d11b60208083019190915261022085019190915283518482015185840151606080880151608089015160a08a01519751929761088d9789979695940161281b565b60408051808303601f190181529082905260c085015160e08601516101008701516101208801516101408901516101608a01519597506108d29688969060200161281b565b60408051808303601f19018152908290526101808501516101a08601516101c08701516101e08801516102008901516102208a01519597506109199688969060200161281b565b60405160208183030381529060405290506060826002036109585750604080518082019091526007815266566963746f727960c81b602082015261099f565b82600103610983575060408051808201909152600681526511195999585d60d21b602082015261099f565b5060408051808201909152600381526254696560e81b60208201525b60006109aa8761118e565b826040516020016109bc9291906128ad565b60408051601f1981840301815260608301909152602f8083529092506000919061316a602083013990506000610a266109f48c611410565b836109fe88611511565b86604051602001610a129493929190612957565b604051602081830303815290604052611511565b905080604051602001610a399190612a52565b6040516020818303038152906040529950505050505050505050919050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6000818152600260205260409020546001600160a01b0316610ae55760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016103b5565b50565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610b1d82610684565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6001600160a01b038216610bac5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016103b5565b6000818152600260205260409020546001600160a01b031615610c115760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016103b5565b6001600160a01b0382166000908152600360205260408120805460019290610c3a908490612746565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600080610ca483610684565b9050806001600160a01b0316846001600160a01b03161480610ccb5750610ccb8185610a58565b80610cef5750836001600160a01b0316610ce48461031a565b6001600160a01b0316145b949350505050565b826001600160a01b0316610d0a82610684565b6001600160a01b031614610d6e5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016103b5565b6001600160a01b038216610dd05760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016103b5565b610ddb600082610ae8565b6001600160a01b0383166000908152600360205260408120805460019290610e04908490612a97565b90915550506001600160a01b0382166000908152600360205260408120805460019290610e32908490612746565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b816001600160a01b0316836001600160a01b031603610ef45760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016103b5565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b610f6c848484610cf7565b610f7884848484611664565b6107ba5760405162461bcd60e51b81526004016103b590612aaa565b61045681610fa185611765565b610faa85611765565b610fb38761118e565b6117f8565b6000600481610fc68661188f565b90506000610fd38661188f565b90506000610fe08861193d565b90506000610fed8861193d565b905060005b6006811015611169578951604051600191600291611044916110309186906020019182526561747461636b60d01b6020830152602682015260460190565b6040516020818303038152906040526119eb565b61104e91906127a3565b6000036110d4576000846110908d60000151856040516020016110309291909182526b706c6179657264616d61676560a01b6020830152602c820152604c0190565b61109a91906127a3565b9050858110156110b5576110ae8187612a97565b95506110be565b60029850600091505b6110cc8c8c8c8b8587611a1c565b97505061114d565b60008361110e8d60000151856040516020016110309291909182526a656e656d7964616d61676560a81b6020830152602b820152604b0190565b61111891906127a3565b9050868110156111335761112c8188612a97565b965061113c565b60019850600091505b6111498b8b8a8486611a47565b9750505b806111585750611169565b5061116281612afc565b9050610ff2565b5050505050509392505050565b6107ba82856000015161118886611765565b84611a71565b606060006127106111c08460000151604051602001611030918152673637b1b0ba34b7b760c11b602082015260280190565b6111ca91906127a3565b90506107d08110156111fc576040518060400160405280600681526020016561206361766560d01b815250915061140a565b610fa081101561122e57604051806040016040528060088152602001671848199bdc995cdd60c21b815250915061140a565b6117708110156112605760405180604001604052806008815260200167184819195cd95c9d60c21b815250915061140a565b611f4081101561128f57604051806040016040528060058152602001646d696e657360d81b815250915061140a565b6123288110156112c8576040518060400160405280600f81526020016e1d1a194811185c9ac8119bdc995cdd608a1b815250915061140a565b61251c811015611302576040518060400160405280601081526020016f746865204d61676963204d6561646f7760801b815250915061140a565b61261681101561133557604051806040016040528060098152602001683090323ab733b2b7b760b91b815250915061140a565b6126938110156113745760405180604001604052806015815260200174616e206162616e646f6e656420666f72747265737360581b815250915061140a565b6126d48110156113a657604051806040016040528060088152602001673090383934b9b7b760c11b815250915061140a565b6127068110156113df576040518060400160405280600f81526020016e3a3432902bb4ba31b4102a37bbb2b960891b815250915061140a565b6040518060400160405280600f81526020016e746865204461726b20436173746c6560881b81525091505b50919050565b6060816000036114375750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611461578061144b81612afc565b915061145a9050600a83612b15565b915061143b565b60008167ffffffffffffffff81111561147c5761147c6125af565b6040519080825280601f01601f1916602001820160405280156114a6576020820181803683370190505b5090505b8415610cef576114bb600183612a97565b91506114c8600a866127a3565b6114d3906030612746565b60f81b8183815181106114e8576114e8612805565b60200101906001600160f81b031916908160001a90535061150a600a86612b15565b94506114aa565b6060815160000361153057505060408051602081019091526000815290565b60006040518060600160405280604081526020016131c6604091399050600060038451600261155f9190612746565b6115699190612b15565b611574906004612b29565b67ffffffffffffffff81111561158c5761158c6125af565b6040519080825280601f01601f1916602001820160405280156115b6576020820181803683370190505b509050600182016020820185865187015b80821015611622576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f81168501518453506001830192506115c7565b505060038651066001811461163e576002811461165157611659565b603d6001830353603d6002830353611659565b603d60018303535b509195945050505050565b60006001600160a01b0384163b1561175a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906116a8903390899088908890600401612b40565b6020604051808303816000875af19250505080156116e3575060408051601f3d908101601f191682019092526116e091810190612b73565b60015b611740573d808015611711576040519150601f19603f3d011682016040523d82523d6000602084013e611716565b606091505b5080516000036117385760405162461bcd60e51b81526004016103b590612aaa565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610cef565b506001949350505050565b8051604051630d71aba560e01b81526004810191909152606090600090737403ac30de7309a0bf019cda8eec034a5507cbb390630d71aba590602401600060405180830381865afa1580156117be573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117e69190810190612b90565b90506117f181611b7a565b9392505050565b60405180610100016040528060dc815260200161322c60dc91398452604051611825908490602001612c07565b60408051808303601f190181529181526020808701929092525161184b91839101612c6f565b60408051808303601f190181529181528581019190915251611871908390602001612cdb565b60408051601f19818403018152919052846003602002015250505050565b80516040516334e8e64960e11b815260048101919091526000908190737403ac30de7309a0bf019cda8eec034a5507cbb3906369d1cc9290602401600060405180830381865afa1580156118e7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261190f9190810190612b90565b90506117f1816040518060400160405280600981526020016802b34ba30b634ba3c960bd1b81525051611c4a565b805160405163729fded360e11b815260048101919091526000908190737403ac30de7309a0bf019cda8eec034a5507cbb39063e53fbda690602401600060405180830381865afa158015611995573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119bd9190810190612b90565b90506117f18160405180604001604052806009815260200168029ba3932b733ba34160bd1b81525051611c4a565b6000816040516020016119fe9190612d57565b60408051601f19818403018152919052805160209091012092915050565b6000611a3c85611a2b89611c92565b611a3489611765565b878787611d21565b979650505050505050565b6000611a6785611a5688611765565b611a5f89611c92565b878787611e3f565b9695505050505050565b606081600203611aa95750604080518082019091526011815270476c6f72696f757320766963746f72792160781b6020820152611b4a565b81600103611ad157604051806060016040528060268152602001613206602691399050611b4a565b6002611af685604051602001611030918152631d1a595960e21b602082015260240190565b611b0091906127a3565b600003611b27576040518060600160405280602d8152602001613199602d91399050611b4a565b82604051602001611b389190612d73565b60405160208183030381529060405290505b80604051602001611b5b9190612db4565b60408051601f1981840301815291905285601060200201525050505050565b6040805180820190915260018152600160fd1b6020820152606090829060005b8251811015611c425781600081518110611bb657611bb6612805565b602001015160f81c60f81b6001600160f81b031916838281518110611bdd57611bdd612805565b01602001516001600160f81b03191614611c425783838281518110611c0457611c04612805565b602001015160f81c60f81b604051602001611c20929190612e15565b604051602081830303815290604052935080611c3b90612afc565b9050611b9a565b505050919050565b60006002828451611c5b9190612a97565b1115611c695750600a610282565b6117f1838381518110611c7e57611c7e612805565b01602001516001600160f81b031916611f19565b6020810151604051639e41b73f60e01b8152600481019190915260609060009073ff9c1b15b16263c61d017ee9f65c50e4ae0113d790639e41b73f90602401600060405180830381865afa158015611cee573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d169190810190612b90565b90506117f181612142565b82600082611d54576040518060400160405280600d81526020016c185b990819995b1b0819195859609a1b815250611d7a565b6040518060400160405280600c81526020016b189d5d081cdd5c9d9a5d995960a21b8152505b9050611d8f611d8a836014612b29565b611410565b8688604051602001611da393929190612e44565b604051602081830303815290604052888360128110611dc457611dc4612805565b6020020152611dd4600183612746565b9150611de4611d8a836014612b29565b86611dee86611410565b83604051602001611e029493929190612efa565b604051602081830303815290604052888360128110611e2357611e23612805565b6020020152611e33600183612746565b98975050505050505050565b82600082611e72576040518060400160405280600d81526020016c185b990819995b1b0819195859609a1b815250611e98565b6040518060400160405280600c81526020016b189d5d081cdd5c9d9a5d995960a21b8152505b9050611ea8611d8a836014612b29565b8787604051602001611ebc93929190612fc7565b604051602081830303815290604052888360128110611edd57611edd612805565b6020020152611eed600183612746565b9150611efd611d8a836014612b29565b611f0685611410565b82604051602001611e029392919061307a565b6040805180820190915260018152603160f81b602090910152600060cf60f81b6001600160f81b0319831601611f5157506001919050565b6040805180820190915260018152601960f91b602090910152606760f91b6001600160f81b0319831601611f8757506002919050565b6040805180820190915260018152603360f81b60209091015260cd60f81b6001600160f81b0319831601611fbd57506003919050565b6040805180820190915260018152600d60fa1b602090910152603360fa1b6001600160f81b0319831601611ff357506004919050565b6040805180820190915260018152603560f81b60209091015260cb60f81b6001600160f81b031983160161202957506005919050565b6040805180820190915260018152601b60f91b602090910152606560f91b6001600160f81b031983160161205f57506006919050565b6040805180820190915260018152603760f81b60209091015260c960f81b6001600160f81b031983160161209557506007919050565b6040805180820190915260018152600760fb1b602090910152601960fb1b6001600160f81b03198316016120cb57506008919050565b6040805180820190915260018152603960f81b60209091015260c760f81b6001600160f81b031983160161210157506009919050565b60405162461bcd60e51b815260206004820152601160248201527053686f756c646e2774206265206865726560781b60448201526064016103b5565b919050565b606060008290506000604051806040016040528060018152602001601160f91b81525090506000604051806040016040528060018152602001600160fd1b81525090506000808360008151811061219b5761219b612805565b602001015160f81c60f81b6001600160f81b031916856000815181106121c3576121c3612805565b01602001516001600160f81b031916036121de575060019050805b60016060835b875181101561236a57831561224b578660008151811061220657612206612805565b602001015160f81c60f81b6001600160f81b03191688828151811061222d5761222d612805565b01602001516001600160f81b0319160361224657600093505b61235a565b8560008151811061225e5761225e612805565b602001015160f81c60f81b6001600160f81b03191688828151811061228557612285612805565b01602001516001600160f81b03191603612319576122bd826040518060400160405280600281526020016137b360f11b81525061239b565b156122cf575050505050505050919050565b82156122dd57819850612302565b88826040516020016122f092919061312d565b60405160208183030381529060405298505b60405180602001604052806000815250915061235a565b8188828151811061232c5761232c612805565b602001015160f81c60f81b604051602001612348929190612e15565b60405160208183030381529060405291505b61236381612afc565b90506121e4565b50878160405160200161237e92919061312d565b604051602081830303815290604052975050505050505050919050565b600081518351146123ae57506000610282565b816040516020016123bf9190612d57565b60405160208183030381529060405280519060200120836040516020016123e69190612d57565b60405160208183030381529060405280519060200120149050610282565b6040518061024001604052806012905b60608152602001906001900390816124145790505090565b6001600160e01b031981168114610ae557600080fd5b60006020828403121561245457600080fd5b81356117f18161242c565b60005b8381101561247a578181015183820152602001612462565b50506000910152565b6000815180845261249b81602086016020860161245f565b601f01601f19169290920160200192915050565b6020815260006117f16020830184612483565b6000602082840312156124d457600080fd5b5035919050565b80356001600160a01b038116811461213d57600080fd5b6000806040838503121561250557600080fd5b61250e836124db565b946020939093013593505050565b60008060006060848603121561253157600080fd5b61253a846124db565b9250612548602085016124db565b9150604084013590509250925092565b60006020828403121561256a57600080fd5b6117f1826124db565b6000806040838503121561258657600080fd5b61258f836124db565b9150602083013580151581146125a457600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156125ee576125ee6125af565b604052919050565b600067ffffffffffffffff821115612610576126106125af565b50601f01601f191660200190565b6000806000806080858703121561263457600080fd5b61263d856124db565b935061264b602086016124db565b925060408501359150606085013567ffffffffffffffff81111561266e57600080fd5b8501601f8101871361267f57600080fd5b803561269261268d826125f6565b6125c5565b8181528860208385010111156126a757600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b600080604083850312156126dc57600080fd5b6126e5836124db565b91506126f3602084016124db565b90509250929050565b600181811c9082168061271057607f821691505b60208210810361140a57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561028257610282612730565b60008183825b600381101561277e57815183526020928301929091019060010161275f565b50505060608201905092915050565b634e487b7160e01b600052601260045260246000fd5b6000826127b2576127b261278d565b500690565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60008851602061282e8285838e0161245f565b8951918401916128418184848e0161245f565b89519201916128538184848d0161245f565b88519201916128658184848c0161245f565b87519201916128778184848b0161245f565b86519201916128898184848a0161245f565b855192019161289b818484890161245f565b919091019a9950505050505050505050565b7f5b7b2274726169745f74797065223a224c6f636174696f6e222c2276616c7565815262111d1160e91b6020820152600083516128f181602385016020880161245f565b7f227d2c7b2274726169745f74797065223a224f7574636f6d65222c2276616c756023918401918201526332911d1160e11b6043820152835161293b81604784016020880161245f565b62227d5d60e81b60479290910191820152604a01949350505050565b707b226e616d65223a202253746f7279202360781b81528451600090612984816011850160208a0161245f565b72111610113232b9b1b934b83a34b7b7111d101160691b60119184019182015285516129b7816024840160208a0161245f565b7f222c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b602492909101918201526618985cd94d8d0b60ca1b60448201528451612a0581604b84016020890161245f565b6f1116101130ba3a3934b13aba32b9911d60811b604b92909101918201528351612a3681605b84016020880161245f565b607d60f81b605b9290910191820152605c019695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251612a8a81601d85016020870161245f565b91909101601d0192915050565b8181038181111561028257610282612730565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600060018201612b0e57612b0e612730565b5060010190565b600082612b2457612b2461278d565b500490565b808202811582820484141761028257610282612730565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611a6790830184612483565b600060208284031215612b8557600080fd5b81516117f18161242c565b600060208284031215612ba257600080fd5b815167ffffffffffffffff811115612bb957600080fd5b8201601f81018413612bca57600080fd5b8051612bd861268d826125f6565b818152856020838501011115612bed57600080fd5b612bfe82602083016020860161245f565b95945050505050565b7f3c7465787420783d2231302220793d2232302220636c6173733d22626173652281526801f283630bcb2b91d160bd1b602082015260008251612c5181602985016020870161245f565b661e17ba32bc3a1f60c91b6029939091019283015250603001919050565b7f3c7465787420783d2231302220793d2234302220636c6173733d22626173652281526c01f2cb7ba9032b73a32b932b21609d1b602082015260008251612cbd81602d85016020870161245f565b661e17ba32bc3a1f60c91b602d939091019283015250603401919050565b7f3c7465787420783d2231302220793d2236302220636c6173733d22626173652281527f3e596f752072616e20696e746f20616e20616e67727920000000000000000000602082015260008251612d3981603785016020870161245f565b661e17ba32bc3a1f60c91b6037939091019283015250603e01919050565b60008251612d6981846020870161245f565b9190910192915050565b60008251612d8581846020870161245f565b7f2072657472656174732e205468652077617920697320636c6561722e00000000920191825250601c01919050565b7f3c7465787420783d2231302220793d223332302220636c6173733d2262617365815261111f60f11b602082015260008251612df781602285016020870161245f565b661e17ba32bc3a1f60c91b6022939091019283015250602901919050565b60008351612e2781846020880161245f565b6001600160f81b0319939093169190920190815260010192915050565b6f1e3a32bc3a103c1e91189811103c9e9160811b81528351600090612e7081601085016020890161245f565b7f2220636c6173733d2262617365223e596f752061747461636b207468652000006010918401918201528451612ead81602e84016020890161245f565b6a0103bb4ba34103cb7bab9160ad1b602e92909101918201528351612ed981603984016020880161245f565b661e17ba32bc3a1f60c91b6039929091019182015260400195945050505050565b6f1e3a32bc3a103c1e91189811103c9e9160811b81528451600090612f26816010850160208a0161245f565b6e111031b630b9b99e913130b9b2911f60891b6010918401918201528551612f5581601f840160208a0161245f565b650103a37b7b5960d51b601f92909101918201528451612f7c81602584016020890161245f565b670103230b6b0b3b2960c51b602592909101918201528351612fa581602d84016020880161245f565b661e17ba32bc3a1f60c91b602d92909101918201526034019695505050505050565b6f1e3a32bc3a103c1e91189811103c9e9160811b81528351600090612ff381601085016020890161245f565b6e111031b630b9b99e913130b9b2911f60891b601091840191820152845161302281601f84016020890161245f565b7501030ba3a30b1b5b9903cb7ba903bb4ba34103a3432960551b601f9290910191820152835161305981603584016020880161245f565b661e17ba32bc3a1f60c91b60359290910191820152603c0195945050505050565b6f1e3a32bc3a103c1e91189811103c9e9160811b815283516000906130a681601085016020890161245f565b7f2220636c6173733d2262617365223e596f7520746f6f6b20000000000000000060109184019182015284516130e381602884016020890161245f565b670103230b6b0b3b2960c51b60289290910191820152835161310c81603084016020880161245f565b661e17ba32bc3a1f60c91b6030929091019182015260370195945050505050565b6000835161313f81846020880161245f565b600160fd1b908301908152835161315d81600184016020880161245f565b0160010194935050505056fe31303031206f6e636861696e2073746f726965732e2053746f727974656c6c696e67204e46542070726f6a6563742e596f752072756e2061776179207769746820796f7572207461696c206265747765656e20796f7572206c6567734142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f546865206865726f20697320646566656174656420627574206e6f7420666f72676f7474656e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3ea2646970667358221220c0b1a805fef6e75524980f64ec5c0a3fb1487b7a422d1dbe661535882f96736764736f6c63430008110033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100f55760003560e01c806342842e0e11610097578063a22cb46511610066578063a22cb465146101ea578063b88d4fde146101fd578063c87b56dd14610210578063e985e9c51461022357600080fd5b806342842e0e146101a95780636352211e146101bc57806370a08231146101cf57806395d89b41146101e257600080fd5b8063095ea7b3116100d3578063095ea7b3146101625780631249c58b1461017757806318160ddd1461017f57806323b872dd1461019657600080fd5b806301ffc9a7146100fa57806306fdde0314610122578063081812fc14610137575b600080fd5b61010d610108366004612442565b610236565b60405190151581526020015b60405180910390f35b61012a610288565b60405161011991906124af565b61014a6101453660046124c2565b61031a565b6040516001600160a01b039091168152602001610119565b6101756101703660046124f2565b610341565b005b61017561045b565b61018860065481565b604051908152602001610119565b6101756101a436600461251c565b610638565b6101756101b736600461251c565b610669565b61014a6101ca3660046124c2565b610684565b6101886101dd366004612558565b6106e4565b61012a61076a565b6101756101f8366004612573565b610779565b61017561020b36600461261e565b610788565b61012a61021e3660046124c2565b6107c0565b61010d6102313660046126c9565b610a58565b60006001600160e01b031982166380ac58cd60e01b148061026757506001600160e01b03198216635b5e139f60e01b145b8061028257506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610297906126fc565b80601f01602080910402602001604051908101604052809291908181526020018280546102c3906126fc565b80156103105780601f106102e557610100808354040283529160200191610310565b820191906000526020600020905b8154815290600101906020018083116102f357829003601f168201915b5050505050905090565b600061032582610a86565b506000908152600460205260409020546001600160a01b031690565b600061034c82610684565b9050806001600160a01b0316836001600160a01b0316036103be5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806103da57506103da8133610a58565b61044c5760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016103b5565b6104568383610ae8565b505050565b6103e9600654106104ae5760405162461bcd60e51b815260206004820152601d60248201527f4920646f6e2774206b6e6f7720616e79206d6f72652073746f7269657300000060448201526064016103b5565b6001600660008282546104c19190612746565b9250508190555060006040518060600160405280600181526020016006548152602001438152506040516020016104f89190612759565b60408051601f19818403018152828252805160209182012060608401835260028452600654848301524384840152915191935060009261053a92909101612759565b60408051601f19818403018152919052805160209091012090506000610562611e61846127a3565b61056d906001612746565b9050600061057d610fa0856127a3565b61058990611f41612746565b90506000610599611e61856127a3565b6105a4906001612746565b905060006105b4610fa0866127a3565b6105c090611f41612746565b6040805160808101825280820187815260608201879052815281518083018352858152602081810185905280830191825260068054600090815260078352949094209251805184558101516001840155905180516002840155015160039091015554909150610630903390610b56565b505050505050565b6106423382610c98565b61065e5760405162461bcd60e51b81526004016103b5906127b7565b610456838383610cf7565b61045683838360405180602001604052806000815250610788565b6000818152600260205260408120546001600160a01b0316806102825760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016103b5565b60006001600160a01b03821661074e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016103b5565b506001600160a01b031660009081526003602052604090205490565b606060018054610297906126fc565b610784338383610e93565b5050565b6107923383610c98565b6107ae5760405162461bcd60e51b81526004016103b5906127b7565b6107ba84848484610f61565b50505050565b60008181526007602081815260408084208151808301835281548152600182015481850152948690529282528051808201909152600283015481526003909201549082015260609190610811612404565b61081c838383610f94565b6000610829848484610fb8565b905061083784848484611176565b60408051808201825260068152651e17b9bb339f60d11b60208083019190915261022085019190915283518482015185840151606080880151608089015160a08a01519751929761088d9789979695940161281b565b60408051808303601f190181529082905260c085015160e08601516101008701516101208801516101408901516101608a01519597506108d29688969060200161281b565b60408051808303601f19018152908290526101808501516101a08601516101c08701516101e08801516102008901516102208a01519597506109199688969060200161281b565b60405160208183030381529060405290506060826002036109585750604080518082019091526007815266566963746f727960c81b602082015261099f565b82600103610983575060408051808201909152600681526511195999585d60d21b602082015261099f565b5060408051808201909152600381526254696560e81b60208201525b60006109aa8761118e565b826040516020016109bc9291906128ad565b60408051601f1981840301815260608301909152602f8083529092506000919061316a602083013990506000610a266109f48c611410565b836109fe88611511565b86604051602001610a129493929190612957565b604051602081830303815290604052611511565b905080604051602001610a399190612a52565b6040516020818303038152906040529950505050505050505050919050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6000818152600260205260409020546001600160a01b0316610ae55760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016103b5565b50565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610b1d82610684565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6001600160a01b038216610bac5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016103b5565b6000818152600260205260409020546001600160a01b031615610c115760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016103b5565b6001600160a01b0382166000908152600360205260408120805460019290610c3a908490612746565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600080610ca483610684565b9050806001600160a01b0316846001600160a01b03161480610ccb5750610ccb8185610a58565b80610cef5750836001600160a01b0316610ce48461031a565b6001600160a01b0316145b949350505050565b826001600160a01b0316610d0a82610684565b6001600160a01b031614610d6e5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016103b5565b6001600160a01b038216610dd05760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016103b5565b610ddb600082610ae8565b6001600160a01b0383166000908152600360205260408120805460019290610e04908490612a97565b90915550506001600160a01b0382166000908152600360205260408120805460019290610e32908490612746565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b816001600160a01b0316836001600160a01b031603610ef45760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016103b5565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b610f6c848484610cf7565b610f7884848484611664565b6107ba5760405162461bcd60e51b81526004016103b590612aaa565b61045681610fa185611765565b610faa85611765565b610fb38761118e565b6117f8565b6000600481610fc68661188f565b90506000610fd38661188f565b90506000610fe08861193d565b90506000610fed8861193d565b905060005b6006811015611169578951604051600191600291611044916110309186906020019182526561747461636b60d01b6020830152602682015260460190565b6040516020818303038152906040526119eb565b61104e91906127a3565b6000036110d4576000846110908d60000151856040516020016110309291909182526b706c6179657264616d61676560a01b6020830152602c820152604c0190565b61109a91906127a3565b9050858110156110b5576110ae8187612a97565b95506110be565b60029850600091505b6110cc8c8c8c8b8587611a1c565b97505061114d565b60008361110e8d60000151856040516020016110309291909182526a656e656d7964616d61676560a81b6020830152602b820152604b0190565b61111891906127a3565b9050868110156111335761112c8188612a97565b965061113c565b60019850600091505b6111498b8b8a8486611a47565b9750505b806111585750611169565b5061116281612afc565b9050610ff2565b5050505050509392505050565b6107ba82856000015161118886611765565b84611a71565b606060006127106111c08460000151604051602001611030918152673637b1b0ba34b7b760c11b602082015260280190565b6111ca91906127a3565b90506107d08110156111fc576040518060400160405280600681526020016561206361766560d01b815250915061140a565b610fa081101561122e57604051806040016040528060088152602001671848199bdc995cdd60c21b815250915061140a565b6117708110156112605760405180604001604052806008815260200167184819195cd95c9d60c21b815250915061140a565b611f4081101561128f57604051806040016040528060058152602001646d696e657360d81b815250915061140a565b6123288110156112c8576040518060400160405280600f81526020016e1d1a194811185c9ac8119bdc995cdd608a1b815250915061140a565b61251c811015611302576040518060400160405280601081526020016f746865204d61676963204d6561646f7760801b815250915061140a565b61261681101561133557604051806040016040528060098152602001683090323ab733b2b7b760b91b815250915061140a565b6126938110156113745760405180604001604052806015815260200174616e206162616e646f6e656420666f72747265737360581b815250915061140a565b6126d48110156113a657604051806040016040528060088152602001673090383934b9b7b760c11b815250915061140a565b6127068110156113df576040518060400160405280600f81526020016e3a3432902bb4ba31b4102a37bbb2b960891b815250915061140a565b6040518060400160405280600f81526020016e746865204461726b20436173746c6560881b81525091505b50919050565b6060816000036114375750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611461578061144b81612afc565b915061145a9050600a83612b15565b915061143b565b60008167ffffffffffffffff81111561147c5761147c6125af565b6040519080825280601f01601f1916602001820160405280156114a6576020820181803683370190505b5090505b8415610cef576114bb600183612a97565b91506114c8600a866127a3565b6114d3906030612746565b60f81b8183815181106114e8576114e8612805565b60200101906001600160f81b031916908160001a90535061150a600a86612b15565b94506114aa565b6060815160000361153057505060408051602081019091526000815290565b60006040518060600160405280604081526020016131c6604091399050600060038451600261155f9190612746565b6115699190612b15565b611574906004612b29565b67ffffffffffffffff81111561158c5761158c6125af565b6040519080825280601f01601f1916602001820160405280156115b6576020820181803683370190505b509050600182016020820185865187015b80821015611622576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f81168501518453506001830192506115c7565b505060038651066001811461163e576002811461165157611659565b603d6001830353603d6002830353611659565b603d60018303535b509195945050505050565b60006001600160a01b0384163b1561175a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906116a8903390899088908890600401612b40565b6020604051808303816000875af19250505080156116e3575060408051601f3d908101601f191682019092526116e091810190612b73565b60015b611740573d808015611711576040519150601f19603f3d011682016040523d82523d6000602084013e611716565b606091505b5080516000036117385760405162461bcd60e51b81526004016103b590612aaa565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610cef565b506001949350505050565b8051604051630d71aba560e01b81526004810191909152606090600090737403ac30de7309a0bf019cda8eec034a5507cbb390630d71aba590602401600060405180830381865afa1580156117be573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117e69190810190612b90565b90506117f181611b7a565b9392505050565b60405180610100016040528060dc815260200161322c60dc91398452604051611825908490602001612c07565b60408051808303601f190181529181526020808701929092525161184b91839101612c6f565b60408051808303601f190181529181528581019190915251611871908390602001612cdb565b60408051601f19818403018152919052846003602002015250505050565b80516040516334e8e64960e11b815260048101919091526000908190737403ac30de7309a0bf019cda8eec034a5507cbb3906369d1cc9290602401600060405180830381865afa1580156118e7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261190f9190810190612b90565b90506117f1816040518060400160405280600981526020016802b34ba30b634ba3c960bd1b81525051611c4a565b805160405163729fded360e11b815260048101919091526000908190737403ac30de7309a0bf019cda8eec034a5507cbb39063e53fbda690602401600060405180830381865afa158015611995573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119bd9190810190612b90565b90506117f18160405180604001604052806009815260200168029ba3932b733ba34160bd1b81525051611c4a565b6000816040516020016119fe9190612d57565b60408051601f19818403018152919052805160209091012092915050565b6000611a3c85611a2b89611c92565b611a3489611765565b878787611d21565b979650505050505050565b6000611a6785611a5688611765565b611a5f89611c92565b878787611e3f565b9695505050505050565b606081600203611aa95750604080518082019091526011815270476c6f72696f757320766963746f72792160781b6020820152611b4a565b81600103611ad157604051806060016040528060268152602001613206602691399050611b4a565b6002611af685604051602001611030918152631d1a595960e21b602082015260240190565b611b0091906127a3565b600003611b27576040518060600160405280602d8152602001613199602d91399050611b4a565b82604051602001611b389190612d73565b60405160208183030381529060405290505b80604051602001611b5b9190612db4565b60408051601f1981840301815291905285601060200201525050505050565b6040805180820190915260018152600160fd1b6020820152606090829060005b8251811015611c425781600081518110611bb657611bb6612805565b602001015160f81c60f81b6001600160f81b031916838281518110611bdd57611bdd612805565b01602001516001600160f81b03191614611c425783838281518110611c0457611c04612805565b602001015160f81c60f81b604051602001611c20929190612e15565b604051602081830303815290604052935080611c3b90612afc565b9050611b9a565b505050919050565b60006002828451611c5b9190612a97565b1115611c695750600a610282565b6117f1838381518110611c7e57611c7e612805565b01602001516001600160f81b031916611f19565b6020810151604051639e41b73f60e01b8152600481019190915260609060009073ff9c1b15b16263c61d017ee9f65c50e4ae0113d790639e41b73f90602401600060405180830381865afa158015611cee573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d169190810190612b90565b90506117f181612142565b82600082611d54576040518060400160405280600d81526020016c185b990819995b1b0819195859609a1b815250611d7a565b6040518060400160405280600c81526020016b189d5d081cdd5c9d9a5d995960a21b8152505b9050611d8f611d8a836014612b29565b611410565b8688604051602001611da393929190612e44565b604051602081830303815290604052888360128110611dc457611dc4612805565b6020020152611dd4600183612746565b9150611de4611d8a836014612b29565b86611dee86611410565b83604051602001611e029493929190612efa565b604051602081830303815290604052888360128110611e2357611e23612805565b6020020152611e33600183612746565b98975050505050505050565b82600082611e72576040518060400160405280600d81526020016c185b990819995b1b0819195859609a1b815250611e98565b6040518060400160405280600c81526020016b189d5d081cdd5c9d9a5d995960a21b8152505b9050611ea8611d8a836014612b29565b8787604051602001611ebc93929190612fc7565b604051602081830303815290604052888360128110611edd57611edd612805565b6020020152611eed600183612746565b9150611efd611d8a836014612b29565b611f0685611410565b82604051602001611e029392919061307a565b6040805180820190915260018152603160f81b602090910152600060cf60f81b6001600160f81b0319831601611f5157506001919050565b6040805180820190915260018152601960f91b602090910152606760f91b6001600160f81b0319831601611f8757506002919050565b6040805180820190915260018152603360f81b60209091015260cd60f81b6001600160f81b0319831601611fbd57506003919050565b6040805180820190915260018152600d60fa1b602090910152603360fa1b6001600160f81b0319831601611ff357506004919050565b6040805180820190915260018152603560f81b60209091015260cb60f81b6001600160f81b031983160161202957506005919050565b6040805180820190915260018152601b60f91b602090910152606560f91b6001600160f81b031983160161205f57506006919050565b6040805180820190915260018152603760f81b60209091015260c960f81b6001600160f81b031983160161209557506007919050565b6040805180820190915260018152600760fb1b602090910152601960fb1b6001600160f81b03198316016120cb57506008919050565b6040805180820190915260018152603960f81b60209091015260c760f81b6001600160f81b031983160161210157506009919050565b60405162461bcd60e51b815260206004820152601160248201527053686f756c646e2774206265206865726560781b60448201526064016103b5565b919050565b606060008290506000604051806040016040528060018152602001601160f91b81525090506000604051806040016040528060018152602001600160fd1b81525090506000808360008151811061219b5761219b612805565b602001015160f81c60f81b6001600160f81b031916856000815181106121c3576121c3612805565b01602001516001600160f81b031916036121de575060019050805b60016060835b875181101561236a57831561224b578660008151811061220657612206612805565b602001015160f81c60f81b6001600160f81b03191688828151811061222d5761222d612805565b01602001516001600160f81b0319160361224657600093505b61235a565b8560008151811061225e5761225e612805565b602001015160f81c60f81b6001600160f81b03191688828151811061228557612285612805565b01602001516001600160f81b03191603612319576122bd826040518060400160405280600281526020016137b360f11b81525061239b565b156122cf575050505050505050919050565b82156122dd57819850612302565b88826040516020016122f092919061312d565b60405160208183030381529060405298505b60405180602001604052806000815250915061235a565b8188828151811061232c5761232c612805565b602001015160f81c60f81b604051602001612348929190612e15565b60405160208183030381529060405291505b61236381612afc565b90506121e4565b50878160405160200161237e92919061312d565b604051602081830303815290604052975050505050505050919050565b600081518351146123ae57506000610282565b816040516020016123bf9190612d57565b60405160208183030381529060405280519060200120836040516020016123e69190612d57565b60405160208183030381529060405280519060200120149050610282565b6040518061024001604052806012905b60608152602001906001900390816124145790505090565b6001600160e01b031981168114610ae557600080fd5b60006020828403121561245457600080fd5b81356117f18161242c565b60005b8381101561247a578181015183820152602001612462565b50506000910152565b6000815180845261249b81602086016020860161245f565b601f01601f19169290920160200192915050565b6020815260006117f16020830184612483565b6000602082840312156124d457600080fd5b5035919050565b80356001600160a01b038116811461213d57600080fd5b6000806040838503121561250557600080fd5b61250e836124db565b946020939093013593505050565b60008060006060848603121561253157600080fd5b61253a846124db565b9250612548602085016124db565b9150604084013590509250925092565b60006020828403121561256a57600080fd5b6117f1826124db565b6000806040838503121561258657600080fd5b61258f836124db565b9150602083013580151581146125a457600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156125ee576125ee6125af565b604052919050565b600067ffffffffffffffff821115612610576126106125af565b50601f01601f191660200190565b6000806000806080858703121561263457600080fd5b61263d856124db565b935061264b602086016124db565b925060408501359150606085013567ffffffffffffffff81111561266e57600080fd5b8501601f8101871361267f57600080fd5b803561269261268d826125f6565b6125c5565b8181528860208385010111156126a757600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b600080604083850312156126dc57600080fd5b6126e5836124db565b91506126f3602084016124db565b90509250929050565b600181811c9082168061271057607f821691505b60208210810361140a57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561028257610282612730565b60008183825b600381101561277e57815183526020928301929091019060010161275f565b50505060608201905092915050565b634e487b7160e01b600052601260045260246000fd5b6000826127b2576127b261278d565b500690565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60008851602061282e8285838e0161245f565b8951918401916128418184848e0161245f565b89519201916128538184848d0161245f565b88519201916128658184848c0161245f565b87519201916128778184848b0161245f565b86519201916128898184848a0161245f565b855192019161289b818484890161245f565b919091019a9950505050505050505050565b7f5b7b2274726169745f74797065223a224c6f636174696f6e222c2276616c7565815262111d1160e91b6020820152600083516128f181602385016020880161245f565b7f227d2c7b2274726169745f74797065223a224f7574636f6d65222c2276616c756023918401918201526332911d1160e11b6043820152835161293b81604784016020880161245f565b62227d5d60e81b60479290910191820152604a01949350505050565b707b226e616d65223a202253746f7279202360781b81528451600090612984816011850160208a0161245f565b72111610113232b9b1b934b83a34b7b7111d101160691b60119184019182015285516129b7816024840160208a0161245f565b7f222c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b602492909101918201526618985cd94d8d0b60ca1b60448201528451612a0581604b84016020890161245f565b6f1116101130ba3a3934b13aba32b9911d60811b604b92909101918201528351612a3681605b84016020880161245f565b607d60f81b605b9290910191820152605c019695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251612a8a81601d85016020870161245f565b91909101601d0192915050565b8181038181111561028257610282612730565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600060018201612b0e57612b0e612730565b5060010190565b600082612b2457612b2461278d565b500490565b808202811582820484141761028257610282612730565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611a6790830184612483565b600060208284031215612b8557600080fd5b81516117f18161242c565b600060208284031215612ba257600080fd5b815167ffffffffffffffff811115612bb957600080fd5b8201601f81018413612bca57600080fd5b8051612bd861268d826125f6565b818152856020838501011115612bed57600080fd5b612bfe82602083016020860161245f565b95945050505050565b7f3c7465787420783d2231302220793d2232302220636c6173733d22626173652281526801f283630bcb2b91d160bd1b602082015260008251612c5181602985016020870161245f565b661e17ba32bc3a1f60c91b6029939091019283015250603001919050565b7f3c7465787420783d2231302220793d2234302220636c6173733d22626173652281526c01f2cb7ba9032b73a32b932b21609d1b602082015260008251612cbd81602d85016020870161245f565b661e17ba32bc3a1f60c91b602d939091019283015250603401919050565b7f3c7465787420783d2231302220793d2236302220636c6173733d22626173652281527f3e596f752072616e20696e746f20616e20616e67727920000000000000000000602082015260008251612d3981603785016020870161245f565b661e17ba32bc3a1f60c91b6037939091019283015250603e01919050565b60008251612d6981846020870161245f565b9190910192915050565b60008251612d8581846020870161245f565b7f2072657472656174732e205468652077617920697320636c6561722e00000000920191825250601c01919050565b7f3c7465787420783d2231302220793d223332302220636c6173733d2262617365815261111f60f11b602082015260008251612df781602285016020870161245f565b661e17ba32bc3a1f60c91b6022939091019283015250602901919050565b60008351612e2781846020880161245f565b6001600160f81b0319939093169190920190815260010192915050565b6f1e3a32bc3a103c1e91189811103c9e9160811b81528351600090612e7081601085016020890161245f565b7f2220636c6173733d2262617365223e596f752061747461636b207468652000006010918401918201528451612ead81602e84016020890161245f565b6a0103bb4ba34103cb7bab9160ad1b602e92909101918201528351612ed981603984016020880161245f565b661e17ba32bc3a1f60c91b6039929091019182015260400195945050505050565b6f1e3a32bc3a103c1e91189811103c9e9160811b81528451600090612f26816010850160208a0161245f565b6e111031b630b9b99e913130b9b2911f60891b6010918401918201528551612f5581601f840160208a0161245f565b650103a37b7b5960d51b601f92909101918201528451612f7c81602584016020890161245f565b670103230b6b0b3b2960c51b602592909101918201528351612fa581602d84016020880161245f565b661e17ba32bc3a1f60c91b602d92909101918201526034019695505050505050565b6f1e3a32bc3a103c1e91189811103c9e9160811b81528351600090612ff381601085016020890161245f565b6e111031b630b9b99e913130b9b2911f60891b601091840191820152845161302281601f84016020890161245f565b7501030ba3a30b1b5b9903cb7ba903bb4ba34103a3432960551b601f9290910191820152835161305981603584016020880161245f565b661e17ba32bc3a1f60c91b60359290910191820152603c0195945050505050565b6f1e3a32bc3a103c1e91189811103c9e9160811b815283516000906130a681601085016020890161245f565b7f2220636c6173733d2262617365223e596f7520746f6f6b20000000000000000060109184019182015284516130e381602884016020890161245f565b670103230b6b0b3b2960c51b60289290910191820152835161310c81603084016020880161245f565b661e17ba32bc3a1f60c91b6030929091019182015260370195945050505050565b6000835161313f81846020880161245f565b600160fd1b908301908152835161315d81600184016020880161245f565b0160010194935050505056fe31303031206f6e636861696e2073746f726965732e2053746f727974656c6c696e67204e46542070726f6a6563742e596f752072756e2061776179207769746820796f7572207461696c206265747765656e20796f7572206c6567734142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f546865206865726f20697320646566656174656420627574206e6f7420666f72676f7474656e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3ea2646970667358221220c0b1a805fef6e75524980f64ec5c0a3fb1487b7a422d1dbe661535882f96736764736f6c63430008110033

Deployed Bytecode Sourcemap

40276:8781:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25687:305;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;25687:305:0;;;;;;;;26614:100;;;:::i;:::-;;;;;;;:::i;28127:171::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;28127:171:0;1533:203:1;27644:417:0;;;;;;:::i;:::-;;:::i;:::-;;48170:717;;;:::i;40498:26::-;;;;;;;;;2324:25:1;;;2312:2;2297:18;40498:26:0;2178:177:1;28827:336:0;;;;;;:::i;:::-;;:::i;29234:185::-;;;;;;:::i;:::-;;:::i;26325:222::-;;;;;;:::i;:::-;;:::i;26056:207::-;;;;;;:::i;:::-;;:::i;26783:104::-;;;:::i;28370:155::-;;;;;;:::i;:::-;;:::i;29490:323::-;;;;;;:::i;:::-;;:::i;40804:1905::-;;;;;;:::i;:::-;;:::i;28596:164::-;;;;;;:::i;:::-;;:::i;25687:305::-;25789:4;-1:-1:-1;;;;;;25826:40:0;;-1:-1:-1;;;25826:40:0;;:105;;-1:-1:-1;;;;;;;25883:48:0;;-1:-1:-1;;;25883:48:0;25826:105;:158;;;-1:-1:-1;;;;;;;;;;18538:40:0;;;25948:36;25806:178;25687:305;-1:-1:-1;;25687:305:0:o;26614:100::-;26668:13;26701:5;26694:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26614:100;:::o;28127:171::-;28203:7;28223:23;28238:7;28223:14;:23::i;:::-;-1:-1:-1;28266:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;28266:24:0;;28127:171::o;27644:417::-;27725:13;27741:23;27756:7;27741:14;:23::i;:::-;27725:39;;27789:5;-1:-1:-1;;;;;27783:11:0;:2;-1:-1:-1;;;;;27783:11:0;;27775:57;;;;-1:-1:-1;;;27775:57:0;;5584:2:1;27775:57:0;;;5566:21:1;5623:2;5603:18;;;5596:30;5662:34;5642:18;;;5635:62;-1:-1:-1;;;5713:18:1;;;5706:31;5754:19;;27775:57:0;;;;;;;;;6906:10;-1:-1:-1;;;;;27867:21:0;;;;:62;;-1:-1:-1;27892:37:0;27909:5;6906:10;28596:164;:::i;27892:37::-;27845:174;;;;-1:-1:-1;;;27845:174:0;;5986:2:1;27845:174:0;;;5968:21:1;6025:2;6005:18;;;5998:30;6064:34;6044:18;;;6037:62;6135:32;6115:18;;;6108:60;6185:19;;27845:174:0;5784:426:1;27845:174:0;28032:21;28041:2;28045:7;28032:8;:21::i;:::-;27714:347;27644:417;;:::o;48170:717::-;48232:4;48218:11;;:18;48210:60;;;;-1:-1:-1;;;48210:60:0;;6417:2:1;48210:60:0;;;6399:21:1;6456:2;6436:18;;;6429:30;6495:31;6475:18;;;6468:59;6544:18;;48210:60:0;6215:353:1;48210:60:0;48298:1;48283:11;;:16;;;;;;;:::i;:::-;;;;;;;;48312:13;48346:48;;;;;;;;48364:1;48346:48;;;;48367:11;;48346:48;;;;48380:12;48346:48;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;48346:48:0;;;;;;;;;48336:59;;48346:48;48336:59;;;;48441:48;;;;;48459:1;48441:48;;48462:11;;48441:48;;;;48475:12;48441:48;;;;;;48336:59;;-1:-1:-1;48328:68:0;;48441:48;;48346;;48441;;:::i;:::-;;;;-1:-1:-1;;48441:48:0;;;;;;;;;48431:59;;48441:48;48431:59;;;;;-1:-1:-1;48423:68:0;48524:12;48532:4;48524:5;:12;:::i;:::-;48519:18;;:1;:18;:::i;:::-;48508:29;-1:-1:-1;48548:9:0;48568:12;48576:4;48568:5;:12;:::i;:::-;48560:21;;:4;:21;:::i;:::-;48548:33;-1:-1:-1;48594:8:0;48610:12;48618:4;48610:5;:12;:::i;:::-;48605:18;;:1;:18;:::i;:::-;48594:29;-1:-1:-1;48634:9:0;48654:12;48662:4;48654:5;:12;:::i;:::-;48646:21;;:4;:21;:::i;:::-;48707:129;;;48738:31;;;;;48707:129;;;48738:31;;;;;;;;;48707:129;;48793:31;;;;;;;;;;48738;48793;;;;;;48707:129;;;;;;48692:11;;;-1:-1:-1;48680:24:0;;;:11;:24;;;;;;:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;48867:11;48634:33;;-1:-1:-1;48849:30:0;;48855:10;;48849:5;:30::i;:::-;48199:688;;;;;;48170:717::o;28827:336::-;29022:41;6906:10;29055:7;29022:18;:41::i;:::-;29014:100;;;;-1:-1:-1;;;29014:100:0;;;;;;;:::i;:::-;29127:28;29137:4;29143:2;29147:7;29127:9;:28::i;29234:185::-;29372:39;29389:4;29395:2;29399:7;29372:39;;;;;;;;;;;;:16;:39::i;26325:222::-;26397:7;26433:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26433:16:0;;26460:56;;;;-1:-1:-1;;;26460:56:0;;8209:2:1;26460:56:0;;;8191:21:1;8248:2;8228:18;;;8221:30;-1:-1:-1;;;8267:18:1;;;8260:54;8331:18;;26460:56:0;8007:348:1;26056:207:0;26128:7;-1:-1:-1;;;;;26156:19:0;;26148:73;;;;-1:-1:-1;;;26148:73:0;;8562:2:1;26148:73:0;;;8544:21:1;8601:2;8581:18;;;8574:30;8640:34;8620:18;;;8613:62;-1:-1:-1;;;8691:18:1;;;8684:39;8740:19;;26148:73:0;8360:405:1;26148:73:0;-1:-1:-1;;;;;;26239:16:0;;;;;:9;:16;;;;;;;26056:207::o;26783:104::-;26839:13;26872:7;26865:14;;;;;:::i;28370:155::-;28465:52;6906:10;28498:8;28508;28465:18;:52::i;:::-;28370:155;;:::o;29490:323::-;29664:41;6906:10;29697:7;29664:18;:41::i;:::-;29656:100;;;;-1:-1:-1;;;29656:100:0;;;;;;;:::i;:::-;29767:38;29781:4;29787:2;29791:7;29800:4;29767:13;:38::i;:::-;29490:323;;;;:::o;40804:1905::-;40908:21;40932:20;;;:11;:20;;;;;;;;40908:49;;;;;;;;;;;;;;;;;;;40995:20;;;;;;;40968:55;;;;;;;;40995:28;;;40968:55;;;;;;;;;;;;40869:20;;40908:49;41044:23;;:::i;:::-;41088:35;41102:4;41108:7;41117:5;41088:13;:35::i;:::-;41134:15;41152:29;41160:4;41166:7;41175:5;41152:7;:29::i;:::-;41134:47;;41192:38;41200:4;41206:7;41215:5;41222:7;41192;:38::i;:::-;41250:20;;;;;;;;;;;-1:-1:-1;;;41250:20:0;;;;;;;;:9;;;:20;;;;41354:8;;41363;;;;41372;;;;41291:17;41381:8;;;;41390;;;;41399;;;;41332:76;;41291:17;;41332:76;;41291:17;;41354:8;41363;41372;41332:76;;:::i;:::-;;;;;;;-1:-1:-1;;41332:76:0;;;;;;;41455:8;;;;41464;;;;41473;;;;41482;;;;41491:9;;;;41501;;;;41332:76;;-1:-1:-1;41433:78:0;;41332:76;;41501:9;41455:8;41433:78;;:::i;:::-;;;;;;;-1:-1:-1;;41433:78:0;;;;;;;41558:9;;;;41568;;;;41578;;;;41588;;;;41598;;;;41608;;;;41433:78;;-1:-1:-1;41536:82:0;;41433:78;;41608:9;41558;41536:82;;:::i;:::-;;;;;;;;;;;;;41523:96;;41640:24;41686:7;41697:1;41686:12;41682:129;;-1:-1:-1;41700:22:0;;;;;;;;;;;;-1:-1:-1;;;41700:22:0;;;;41682:129;;;41742:7;41753:1;41742:12;41738:73;;-1:-1:-1;41756:21:0;;;;;;;;;;;;-1:-1:-1;;;41756:21:0;;;;41738:73;;;-1:-1:-1;41793:18:0;;;;;;;;;;;;-1:-1:-1;;;41793:18:0;;;;41738:73;41832:23;41952:18;41965:4;41952:12;:18::i;:::-;42018:10;41872:164;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;41872:164:0;;;;;;42057:77;;;;;;;;;;41872:164;;-1:-1:-1;42057:25:0;;41872:164;42057:77;41872:164;42057:77;;;;;42145:18;42180:428;42275:25;42292:7;42275:16;:25::i;:::-;42373:11;42476:25;42496:3;42476:13;:25::i;:::-;42570:10;42212:395;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42180:13;:428::i;:::-;42145:463;;42695:4;42645:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;42629:72;;40897:1812;;;;;;;;;40804:1905;;;:::o;28596:164::-;-1:-1:-1;;;;;28717:25:0;;;28693:4;28717:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;28596:164::o;36102:135::-;31385:4;31409:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31409:16:0;36176:53;;;;-1:-1:-1;;;36176:53:0;;8209:2:1;36176:53:0;;;8191:21:1;8248:2;8228:18;;;8221:30;-1:-1:-1;;;8267:18:1;;;8260:54;8331:18;;36176:53:0;8007:348:1;36176:53:0;36102:135;:::o;35381:174::-;35456:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;35456:29:0;-1:-1:-1;;;;;35456:29:0;;;;;;;;:24;;35510:23;35456:24;35510:14;:23::i;:::-;-1:-1:-1;;;;;35501:46:0;;;;;;;;;;;35381:174;;:::o;33212:439::-;-1:-1:-1;;;;;33292:16:0;;33284:61;;;;-1:-1:-1;;;33284:61:0;;14130:2:1;33284:61:0;;;14112:21:1;;;14149:18;;;14142:30;14208:34;14188:18;;;14181:62;14260:18;;33284:61:0;13928:356:1;33284:61:0;31385:4;31409:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31409:16:0;:30;33356:58;;;;-1:-1:-1;;;33356:58:0;;14491:2:1;33356:58:0;;;14473:21:1;14530:2;14510:18;;;14503:30;14569;14549:18;;;14542:58;14617:18;;33356:58:0;14289:352:1;33356:58:0;-1:-1:-1;;;;;33485:13:0;;;;;;:9;:13;;;;;:18;;33502:1;;33485:13;:18;;33502:1;;33485:18;:::i;:::-;;;;-1:-1:-1;;33514:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;33514:21:0;-1:-1:-1;;;;;33514:21:0;;;;;;;;33553:33;;33514:16;;;33553:33;;33514:16;;33553:33;28370:155;;:::o;31614:264::-;31707:4;31724:13;31740:23;31755:7;31740:14;:23::i;:::-;31724:39;;31793:5;-1:-1:-1;;;;;31782:16:0;:7;-1:-1:-1;;;;;31782:16:0;;:52;;;;31802:32;31819:5;31826:7;31802:16;:32::i;:::-;31782:87;;;;31862:7;-1:-1:-1;;;;;31838:31:0;:20;31850:7;31838:11;:20::i;:::-;-1:-1:-1;;;;;31838:31:0;;31782:87;31774:96;31614:264;-1:-1:-1;;;;31614:264:0:o;34637:625::-;34796:4;-1:-1:-1;;;;;34769:31:0;:23;34784:7;34769:14;:23::i;:::-;-1:-1:-1;;;;;34769:31:0;;34761:81;;;;-1:-1:-1;;;34761:81:0;;14848:2:1;34761:81:0;;;14830:21:1;14887:2;14867:18;;;14860:30;14926:34;14906:18;;;14899:62;-1:-1:-1;;;14977:18:1;;;14970:35;15022:19;;34761:81:0;14646:401:1;34761:81:0;-1:-1:-1;;;;;34861:16:0;;34853:65;;;;-1:-1:-1;;;34853:65:0;;15254:2:1;34853:65:0;;;15236:21:1;15293:2;15273:18;;;15266:30;15332:34;15312:18;;;15305:62;-1:-1:-1;;;15383:18:1;;;15376:34;15427:19;;34853:65:0;15052:400:1;34853:65:0;35035:29;35052:1;35056:7;35035:8;:29::i;:::-;-1:-1:-1;;;;;35077:15:0;;;;;;:9;:15;;;;;:20;;35096:1;;35077:15;:20;;35096:1;;35077:20;:::i;:::-;;;;-1:-1:-1;;;;;;;35108:13:0;;;;;;:9;:13;;;;;:18;;35125:1;;35108:13;:18;;35125:1;;35108:18;:::i;:::-;;;;-1:-1:-1;;35137:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35137:21:0;-1:-1:-1;;;;;35137:21:0;;;;;;;;;35176:27;;35137:16;;35176:27;;;;;;;27714:347;27644:417;;:::o;35698:315::-;35853:8;-1:-1:-1;;;;;35844:17:0;:5;-1:-1:-1;;;;;35844:17:0;;35836:55;;;;-1:-1:-1;;;35836:55:0;;15792:2:1;35836:55:0;;;15774:21:1;15831:2;15811:18;;;15804:30;15870:27;15850:18;;;15843:55;15915:18;;35836:55:0;15590:349:1;35836:55:0;-1:-1:-1;;;;;35902:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;35902:46:0;;;;;;;;;;35964:41;;540::1;;;35964::0;;513:18:1;35964:41:0;;;;;;;35698:315;;;:::o;30694:313::-;30850:28;30860:4;30866:2;30870:7;30850:9;:28::i;:::-;30897:47;30920:4;30926:2;30930:7;30939:4;30897:22;:47::i;:::-;30889:110;;;;-1:-1:-1;;;30889:110:0;;;;;;;:::i;42717:228::-;42843:94;42874:5;42881:16;42890:6;42881:8;:16::i;:::-;42899:15;42908:5;42899:8;:15::i;:::-;42916:20;42929:6;42916:12;:20::i;:::-;42843:30;:94::i;42957:1748::-;43070:15;43144:1;43070:15;43185:20;43198:6;43185:12;:20::i;:::-;43166:39;;43216:15;43234:19;43247:5;43234:12;:19::i;:::-;43216:37;;43274:23;43300:21;43314:6;43300:13;:21::i;:::-;43274:47;;43332:22;43357:20;43371:5;43357:13;:20::i;:::-;43332:45;;43403:9;43398:1300;43422:1;43418;:5;43398:1300;;;43544:9;;43527:40;;43470:4;;43572:1;;43507:62;;43527:40;;43565:1;;43527:40;;16621:19:1;;;-1:-1:-1;;;16665:2:1;16656:12;;16649:30;16704:2;16695:12;;16688:28;16741:2;16732:12;;16363:387;43527:40:0;;;;;;;;;;;;;43507:12;:62::i;:::-;:66;;;;:::i;:::-;43577:1;43507:71;43503:1139;;43612:14;43700:15;43629:68;43666:6;:9;;;43693:1;43649:46;;;;;;;;17013:19:1;;;-1:-1:-1;;;17057:2:1;17048:12;;17041:36;17102:2;17093:12;;17086:28;17139:2;17130:12;;16755:393;43629:68:0;:86;;;;:::i;:::-;43612:103;;43765:7;43756:6;:16;43752:232;;;43814:17;43825:6;43814:17;;:::i;:::-;;;43752:232;;;43924:1;43914:11;;43959:5;43948:16;;43752:232;44029:61;44043:6;44051:5;44058;44065:6;44073;44081:8;44029:13;:61::i;:::-;44020:70;;43593:513;43503:1139;;;44157:14;44244;44174:67;44211:6;:9;;;44237:1;44194:45;;;;;;;;17411:19:1;;;-1:-1:-1;;;17455:2:1;17446:12;;17439:35;17499:2;17490:12;;17483:28;17536:2;17527:12;;17153:392;44174:67:0;:84;;;;:::i;:::-;44157:101;;44308:8;44299:6;:17;44295:234;;;44358:18;44370:6;44358:18;;:::i;:::-;;;44295:234;;;44469:1;44459:11;;44504:5;44493:16;;44295:234;44574:52;44587:5;44594;44601:6;44609;44617:8;44574:12;:52::i;:::-;44565:61;;44138:504;43503:1139;44671:8;44666:20;;44681:5;;;44666:20;-1:-1:-1;43425:3:0;;;:::i;:::-;;;43398:1300;;;;43092:1613;;;;;42957:1748;;;;;:::o;44717:213::-;44854:68;44879:5;44886:6;:9;;;44897:15;44906:5;44897:8;:15::i;:::-;44914:7;44854:24;:68::i;46145:1214::-;46217:22;46257:11;46338:5;46271:64;46308:9;:12;;;46291:42;;;;;;17920:19:1;;-1:-1:-1;;;17964:2:1;17955:12;;17948:32;18005:2;17996:12;;17690:324;46271:64:0;:72;;;;:::i;:::-;46257:86;;46374:4;46368:3;:10;46364:978;;;46404:19;;;;;;;;;;;;;-1:-1:-1;;;46404:19:0;;;;;46364:978;;;46460:4;46454:3;:10;46450:892;;;46490:21;;;;;;;;;;;;;-1:-1:-1;;;46490:21:0;;;;;46450:892;;;46548:4;46542:3;:10;46538:804;;;46578:21;;;;;;;;;;;;;-1:-1:-1;;;46578:21:0;;;;;46538:804;;;46636:4;46630:3;:10;46626:716;;;46666:18;;;;;;;;;;;;;-1:-1:-1;;;46666:18:0;;;;;46626:716;;;46721:4;46715:3;:10;46711:631;;;46751:28;;;;;;;;;;;;;-1:-1:-1;;;46751:28:0;;;;;46711:631;;;46816:4;46810:3;:10;46806:536;;;46846:29;;;;;;;;;;;;;-1:-1:-1;;;46846:29:0;;;;;46806:536;;;46912:4;46906:3;:10;46902:440;;;46942:22;;;;;;;;;;;;;-1:-1:-1;;;46942:22:0;;;;;46902:440;;;47001:4;46995:3;:10;46991:351;;;47031:34;;;;;;;;;;;;;-1:-1:-1;;;47031:34:0;;;;;46991:351;;;47105:4;47099:3;:10;47095:247;;;47135:21;;;;;;;;;;;;;-1:-1:-1;;;47135:21:0;;;;;47095:247;;;47193:4;47187:3;:10;47183:159;;;47223:28;;;;;;;;;;;;;-1:-1:-1;;;47223:28:0;;;;;47183:159;;;47302:28;;;;;;;;;;;;;-1:-1:-1;;;47302:28:0;;;;;47183:159;46246:1113;46145:1214;;;:::o;4080:723::-;4136:13;4357:5;4366:1;4357:10;4353:53;;-1:-1:-1;;4384:10:0;;;;;;;;;;;;-1:-1:-1;;;4384:10:0;;;;;4080:723::o;4353:53::-;4431:5;4416:12;4472:78;4479:9;;4472:78;;4505:8;;;;:::i;:::-;;-1:-1:-1;4528:10:0;;-1:-1:-1;4536:2:0;4528:10;;:::i;:::-;;;4472:78;;;4560:19;4592:6;4582:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4582:17:0;;4560:39;;4610:154;4617:10;;4610:154;;4644:11;4654:1;4644:11;;:::i;:::-;;-1:-1:-1;4713:10:0;4721:2;4713:5;:10;:::i;:::-;4700:24;;:2;:24;:::i;:::-;4687:39;;4670:6;4677;4670:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;4670:56:0;;;;;;;;-1:-1:-1;4741:11:0;4750:2;4741:11;;:::i;:::-;;;4610:154;;546:3097;604:13;841:4;:11;856:1;841:16;837:31;;-1:-1:-1;;859:9:0;;;;;;;;;-1:-1:-1;859:9:0;;;546:3097::o;837:31::-;921:19;943:6;;;;;;;;;;;;;;;;;921:28;;1360:20;1419:1;1400:4;:11;1414:1;1400:15;;;;:::i;:::-;1399:21;;;;:::i;:::-;1394:27;;:1;:27;:::i;:::-;1383:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1383:39:0;;1360:62;;1602:1;1595:5;1591:13;1706:2;1698:6;1694:15;1817:4;1869;1863:11;1857:4;1853:22;1779:1432;1903:6;1894:7;1891:19;1779:1432;;;2009:1;2000:7;1996:15;1985:26;;2048:7;2042:14;2701:4;2693:5;2689:2;2685:14;2681:25;2671:8;2667:40;2661:47;2650:9;2642:67;2755:1;2744:9;2740:17;2727:30;;2847:4;2839:5;2835:2;2831:14;2827:25;2817:8;2813:40;2807:47;2796:9;2788:67;2901:1;2890:9;2886:17;2873:30;;2992:4;2984:5;2981:1;2977:13;2973:24;2963:8;2959:39;2953:46;2942:9;2934:66;3046:1;3035:9;3031:17;3018:30;;3129:4;3122:5;3118:16;3108:8;3104:31;3098:38;3087:9;3079:58;;3183:1;3172:9;3168:17;3155:30;;1779:1432;;;1783:107;;3373:1;3366:4;3360:11;3356:19;3394:1;3389:123;;;;3531:1;3526:73;;;;3349:250;;3389:123;3442:4;3438:1;3427:9;3423:17;3415:32;3492:4;3488:1;3477:9;3473:17;3465:32;3389:123;;3526:73;3579:4;3575:1;3564:9;3560:17;3552:32;3349:250;-1:-1:-1;3629:6:0;;546:3097;-1:-1:-1;;;;;546:3097:0:o;36801:853::-;36955:4;-1:-1:-1;;;;;36976:13:0;;8568:19;:23;36972:675;;37012:71;;-1:-1:-1;;;37012:71:0;;-1:-1:-1;;;;;37012:36:0;;;;;:71;;6906:10;;37063:4;;37069:7;;37078:4;;37012:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37012:71:0;;;;;;;;-1:-1:-1;;37012:71:0;;;;;;;;;;;;:::i;:::-;;;37008:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37253:6;:13;37270:1;37253:18;37249:328;;37296:60;;-1:-1:-1;;;37296:60:0;;;;;;;:::i;37249:328::-;37527:6;37521:13;37512:6;37508:2;37504:15;37497:38;37008:584;-1:-1:-1;;;;;;37134:51:0;-1:-1:-1;;;37134:51:0;;-1:-1:-1;37127:58:0;;36972:675;-1:-1:-1;37631:4:0;36801:853;;;;;;:::o;45881:256::-;46052:12;;46010:55;;-1:-1:-1;;;46010:55:0;;;;;2324:25:1;;;;45949:18:0;;45985:22;;40352:42;;46010:41;;2297:18:1;;46010:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46010:55:0;;;;;;;;;;;;:::i;:::-;45985:80;;46093:28;46112:8;46093:18;:28::i;:::-;46086:35;45881:256;-1:-1:-1;;;45881:256:0:o;49270:754::-;49422:234;;;;;;;;;;;;;;;;;;;49686:84;;;;49748:10;;49422:9;49686:84;;:::i;:::-;;;;;;;-1:-1:-1;;49686:84:0;;;;;;49667:9;;;;:104;;;;49801:86;;;49867:8;;49801:86;;:::i;:::-;;;;;;;-1:-1:-1;;49801:86:0;;;;;;49782:9;;;:106;;;;49918:97;;;49994:9;;49782;49918:97;;:::i;:::-;;;;-1:-1:-1;;49918:97:0;;;;;;;;;49899:5;49906:1;49899:9;;;:117;-1:-1:-1;;;;49270:754:0:o;47371:276::-;47548:12;;47502:59;;-1:-1:-1;;;47502:59:0;;;;;2324:25:1;;;;47443:16:0;;;;40352:42;;47502:45;;2297:18:1;;47502:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47502:59:0;;;;;;;;;;;;:::i;:::-;47477:84;;47583:56;47602:8;47613:18;;;;;;;;;;;;;-1:-1:-1;;;47613:18:0;;;:25;47583:12;:56::i;47655:273::-;47831:12;;47785:59;;-1:-1:-1;;;47785:59:0;;;;;2324:25:1;;;;47728:14:0;;;;40352:42;;47785:45;;2297:18:1;;47785:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47785:59:0;;;;;;;;;;;;:::i;:::-;47760:84;;47864:56;47883:8;47894:18;;;;;;;;;;;;;-1:-1:-1;;;47894:18:0;;;:25;47864:12;:56::i;49083:144::-;49143:7;49211:5;49194:23;;;;;;;;:::i;:::-;;;;-1:-1:-1;;49194:23:0;;;;;;;;;49184:34;;49194:23;49184:34;;;;;49083:144;-1:-1:-1;;49083:144:0:o;44942:329::-;45115:14;45156:107;45187:5;45194:18;45205:6;45194:10;:18::i;:::-;45214:15;45223:5;45214:8;:15::i;:::-;45231:13;45246:6;45254:8;45156:30;:107::i;:::-;45147:116;44942:329;-1:-1:-1;;;;;;;44942:329:0:o;45283:301::-;45430:14;45471:105;45501:5;45508:15;45517:5;45508:8;:15::i;:::-;45525:17;45536:5;45525:10;:17::i;:::-;45544:13;45559:6;45567:8;45471:29;:105::i;:::-;45462:114;45283:301;-1:-1:-1;;;;;;45283:301:0:o;50036:861::-;50167:20;50212:7;50223:1;50212:12;50208:568;;-1:-1:-1;50250:28:0;;;;;;;;;;;;-1:-1:-1;;;50250:28:0;;;;50208:568;;;50309:7;50320:1;50309:12;50305:471;;50347:49;;;;;;;;;;;;;;;;;;;50305:471;;;50510:1;50451:56;50488:8;50471:34;;;;;;22366:19:1;;-1:-1:-1;;;22410:2:1;22401:12;;22394:28;22447:2;22438:12;;22136:320;50451:56:0;:60;;;;:::i;:::-;50515:1;50451:65;50447:318;;50550:56;;;;;;;;;;;;;;;;;;;50447:318;;;50706:9;50689:59;;;;;;;;:::i;:::-;;;;;;;;;;;;;50673:76;;50447:318;50870:6;50815:73;;;;;;;;:::i;:::-;;;;-1:-1:-1;;50815:73:0;;;;;;;;;50796:5;50802:2;50796:9;;;:93;-1:-1:-1;;;;;50036:861:0:o;53282:389::-;53449:10;;;;;;;;;;;;-1:-1:-1;;;53449:10:0;;;;53346:18;;53408:8;;53382:17;53480:184;53501:4;:11;53497:1;:15;53480:184;;;53558:5;53564:1;53558:8;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;53547:19:0;;:4;53552:1;53547:7;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;53547:7:0;53543:30;53568:5;53543:30;53637:4;53643;53648:1;53643:7;;;;;;;;:::i;:::-;;;;;;;;;53620:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53606:46;;53514:3;;;;:::i;:::-;;;53480:184;;;;53371:300;;53282:389;;;:::o;47940:222::-;48020:13;48079:1;48069:7;48055:4;:11;:21;;;;:::i;:::-;:25;48051:40;;;-1:-1:-1;48089:2:0;48082:9;;48051:40;48120:34;48140:4;48145:7;48140:13;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;48140:13:0;48120:19;:34::i;45600:269::-;45779:13;;;;45737:56;;-1:-1:-1;;;45737:56:0;;;;;2324:25:1;;;;45670:18:0;;45706:28;;40442:42;;45737:41;;2297:18:1;;45737:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45737:56:0;;;;;;;;;;;;:::i;:::-;45706:87;;45821:40;45846:14;45821:24;:40::i;50909:730::-;51118:13;51077:14;51165:8;:43;;;;;;;;;;;;;;;-1:-1:-1;;;51165:43:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51165:43:0;;;;51142:66;-1:-1:-1;51289:29:0;51306:11;:6;51315:2;51306:11;:::i;:::-;51289:16;:29::i;:::-;51353:5;51374:6;51252:140;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51229:5;51235:6;51229:13;;;;;;;:::i;:::-;;;;:164;51404:11;51414:1;51404:11;;:::i;:::-;;-1:-1:-1;51486:29:0;51503:11;51404;51512:2;51503:11;:::i;51486:29::-;51535:5;51552:24;51569:6;51552:16;:24::i;:::-;51590:6;51449:159;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51426:5;51432:6;51426:13;;;;;;;:::i;:::-;;;;:183;51620:11;51630:1;51620:11;;:::i;:::-;;50909:730;-1:-1:-1;;;;;;;;50909:730:0:o;51651:716::-;51858:13;51817:14;51905:8;:43;;;;;;;;;;;;;;;-1:-1:-1;;;51905:43:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51905:43:0;;;;51882:66;-1:-1:-1;52029:29:0;52046:11;:6;52055:2;52046:11;:::i;52029:29::-;52078:5;52110:6;51992:136;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51969:5;51975:6;51969:13;;;;;;;:::i;:::-;;;;:160;52140:11;52150:1;52140:11;;:::i;:::-;;-1:-1:-1;52222:29:0;52239:11;52140;52248:2;52239:11;:::i;52222:29::-;52280:24;52297:6;52280:16;:24::i;:::-;52318:6;52185:151;;;;;;;;;;:::i;52738:532::-;52831:10;;;;;;;;;;;;-1:-1:-1;;;52831:10:0;;;;;-1:-1:-1;;;;;;;;;;52825:19:0;;;52821:33;;-1:-1:-1;52853:1:0;;52738:532;-1:-1:-1;52738:532:0:o;52821:33::-;52875:10;;;;;;;;;;;;-1:-1:-1;;;52875:10:0;;;;;-1:-1:-1;;;;;;;;;52869:19:0;;;52865:33;;-1:-1:-1;52897:1:0;;52738:532;-1:-1:-1;52738:532:0:o;52865:33::-;52919:10;;;;;;;;;;;;-1:-1:-1;;;52919:10:0;;;;;-1:-1:-1;;;;;;;;;52913:19:0;;;52909:33;;-1:-1:-1;52941:1:0;;52738:532;-1:-1:-1;52738:532:0:o;52909:33::-;52963:10;;;;;;;;;;;;-1:-1:-1;;;52963:10:0;;;;;-1:-1:-1;;;;;;;;;52957:19:0;;;52953:33;;-1:-1:-1;52985:1:0;;52738:532;-1:-1:-1;52738:532:0:o;52953:33::-;53007:10;;;;;;;;;;;;-1:-1:-1;;;53007:10:0;;;;;-1:-1:-1;;;;;;;;;53001:19:0;;;52997:33;;-1:-1:-1;53029:1:0;;52738:532;-1:-1:-1;52738:532:0:o;52997:33::-;53051:10;;;;;;;;;;;;-1:-1:-1;;;53051:10:0;;;;;-1:-1:-1;;;;;;;;;53045:19:0;;;53041:33;;-1:-1:-1;53073:1:0;;52738:532;-1:-1:-1;52738:532:0:o;53041:33::-;53095:10;;;;;;;;;;;;-1:-1:-1;;;53095:10:0;;;;;-1:-1:-1;;;;;;;;;53089:19:0;;;53085:33;;-1:-1:-1;53117:1:0;;52738:532;-1:-1:-1;52738:532:0:o;53085:33::-;53139:10;;;;;;;;;;;;-1:-1:-1;;;53139:10:0;;;;;-1:-1:-1;;;;;;;;;53133:19:0;;;53129:33;;-1:-1:-1;53161:1:0;;52738:532;-1:-1:-1;52738:532:0:o;53129:33::-;53183:10;;;;;;;;;;;;-1:-1:-1;;;53183:10:0;;;;;-1:-1:-1;;;;;;;;;53177:19:0;;;53173:33;;-1:-1:-1;53205:1:0;;52738:532;-1:-1:-1;52738:532:0:o;53173:33::-;53227:35;;-1:-1:-1;;;53227:35:0;;30141:2:1;53227:35:0;;;30123:21:1;30180:2;30160:18;;;30153:30;-1:-1:-1;;;30199:18:1;;;30192:47;30256:18;;53227:35:0;29939:341:1;53227:35:0;52738:532;;;:::o;53683:1429::-;53759:18;53795:17;53821:14;53795:41;;53847:18;53868:10;;;;;;;;;;;;;-1:-1:-1;;;53868:10:0;;;53847:31;;53889:18;53910:10;;;;;;;;;;;;;-1:-1:-1;;;53910:10:0;;;53889:31;;53941:21;53973:12;54021:5;54027:1;54021:8;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;54010:19:0;;:4;54015:1;54010:7;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;54010:7:0;:19;54006:107;;-1:-1:-1;54065:4:0;;-1:-1:-1;54065:4:0;54006:107;54150:4;54165:18;54218:13;54204:832;54237:4;:11;54233:1;:15;54204:832;;;54283:7;54279:187;;;54339:5;54345:1;54339:8;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;54328:19:0;;:4;54333:1;54328:7;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;54328:7:0;:19;54324:100;;54399:5;54389:15;;54324:100;54442:8;;54279:187;54509:5;54515:1;54509:8;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;54498:19:0;;:4;54503:1;54498:7;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;54498:7:0;:19;54494:531;;54555:26;54570:4;54555:26;;;;;;;;;;;;;-1:-1:-1;;;54555:26:0;;;:14;:26::i;:::-;54551:64;;;54604:11;;;;;;;;53683:1429;;;:::o;54551:64::-;54656:9;54652:217;;;54714:4;54707:11;;54652:217;;;54832:4;54843;54815:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54801:48;;54652:217;54887:9;;;;;;;;;;;;;;54494:531;;;54994:4;55000;55005:1;55000:7;;;;;;;;:::i;:::-;;;;;;;;;54977:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54963:46;;54494:531;54250:3;;;:::i;:::-;;;54204:832;;;;55087:4;55098;55070:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55056:48;;53784:1328;;;;;;;53683:1429;;;:::o;52402:324::-;52483:4;52535:1;52529:15;52516:1;52510:15;:34;52506:213;;-1:-1:-1;52578:5:0;52571:12;;52506:213;52704:1;52687:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;52677:30;;;;;;52670:1;52653:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;52643:30;;;;;;:64;52636:71;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1919:254;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2360:328::-;2437:6;2445;2453;2506:2;2494:9;2485:7;2481:23;2477:32;2474:52;;;2522:1;2519;2512:12;2474:52;2545:29;2564:9;2545:29;:::i;:::-;2535:39;;2593:38;2627:2;2616:9;2612:18;2593:38;:::i;:::-;2583:48;;2678:2;2667:9;2663:18;2650:32;2640:42;;2360:328;;;;;:::o;2693:186::-;2752:6;2805:2;2793:9;2784:7;2780:23;2776:32;2773:52;;;2821:1;2818;2811:12;2773:52;2844:29;2863:9;2844:29;:::i;2884:347::-;2949:6;2957;3010:2;2998:9;2989:7;2985:23;2981:32;2978:52;;;3026:1;3023;3016:12;2978:52;3049:29;3068:9;3049:29;:::i;:::-;3039:39;;3128:2;3117:9;3113:18;3100:32;3175:5;3168:13;3161:21;3154:5;3151:32;3141:60;;3197:1;3194;3187:12;3141:60;3220:5;3210:15;;;2884:347;;;;;:::o;3236:127::-;3297:10;3292:3;3288:20;3285:1;3278:31;3328:4;3325:1;3318:15;3352:4;3349:1;3342:15;3368:275;3439:2;3433:9;3504:2;3485:13;;-1:-1:-1;;3481:27:1;3469:40;;3539:18;3524:34;;3560:22;;;3521:62;3518:88;;;3586:18;;:::i;:::-;3622:2;3615:22;3368:275;;-1:-1:-1;3368:275:1:o;3648:186::-;3696:4;3729:18;3721:6;3718:30;3715:56;;;3751:18;;:::i;:::-;-1:-1:-1;3817:2:1;3796:15;-1:-1:-1;;3792:29:1;3823:4;3788:40;;3648:186::o;3839:888::-;3934:6;3942;3950;3958;4011:3;3999:9;3990:7;3986:23;3982:33;3979:53;;;4028:1;4025;4018:12;3979:53;4051:29;4070:9;4051:29;:::i;:::-;4041:39;;4099:38;4133:2;4122:9;4118:18;4099:38;:::i;:::-;4089:48;;4184:2;4173:9;4169:18;4156:32;4146:42;;4239:2;4228:9;4224:18;4211:32;4266:18;4258:6;4255:30;4252:50;;;4298:1;4295;4288:12;4252:50;4321:22;;4374:4;4366:13;;4362:27;-1:-1:-1;4352:55:1;;4403:1;4400;4393:12;4352:55;4439:2;4426:16;4464:48;4480:31;4508:2;4480:31;:::i;:::-;4464:48;:::i;:::-;4535:2;4528:5;4521:17;4575:7;4570:2;4565;4561;4557:11;4553:20;4550:33;4547:53;;;4596:1;4593;4586:12;4547:53;4651:2;4646;4642;4638:11;4633:2;4626:5;4622:14;4609:45;4695:1;4690:2;4685;4678:5;4674:14;4670:23;4663:34;4716:5;4706:15;;;;;3839:888;;;;;;;:::o;4732:260::-;4800:6;4808;4861:2;4849:9;4840:7;4836:23;4832:32;4829:52;;;4877:1;4874;4867:12;4829:52;4900:29;4919:9;4900:29;:::i;:::-;4890:39;;4948:38;4982:2;4971:9;4967:18;4948:38;:::i;:::-;4938:48;;4732:260;;;;;:::o;4997:380::-;5076:1;5072:12;;;;5119;;;5140:61;;5194:4;5186:6;5182:17;5172:27;;5140:61;5247:2;5239:6;5236:14;5216:18;5213:38;5210:161;;5293:10;5288:3;5284:20;5281:1;5274:31;5328:4;5325:1;5318:15;5356:4;5353:1;5346:15;6573:127;6634:10;6629:3;6625:20;6622:1;6615:31;6665:4;6662:1;6655:15;6689:4;6686:1;6679:15;6705:125;6770:9;;;6791:10;;;6788:36;;;6804:18;;:::i;6835:503::-;6992:3;7023;7070:6;6992:3;7104:200;7118:4;7115:1;7112:11;7104:200;;;7179:13;;7165:28;;7216:4;7242:14;;;;7279:15;;;;7138:1;7131:9;7104:200;;;7108:3;;;7329:2;7324:3;7320:12;7313:19;;6835:503;;;;:::o;7343:127::-;7404:10;7399:3;7395:20;7392:1;7385:31;7435:4;7432:1;7425:15;7459:4;7456:1;7449:15;7475:112;7507:1;7533;7523:35;;7538:18;;:::i;:::-;-1:-1:-1;7572:9:1;;7475:112::o;7592:410::-;7794:2;7776:21;;;7833:2;7813:18;;;7806:30;7872:34;7867:2;7852:18;;7845:62;-1:-1:-1;;;7938:2:1;7923:18;;7916:44;7992:3;7977:19;;7592:410::o;8770:127::-;8831:10;8826:3;8822:20;8819:1;8812:31;8862:4;8859:1;8852:15;8886:4;8883:1;8876:15;8902:1540;9321:3;9359:6;9353:13;9385:4;9398:64;9455:6;9450:3;9445:2;9437:6;9433:15;9398:64;:::i;:::-;9525:13;;9484:16;;;;9547:68;9525:13;9484:16;9582:15;;;9547:68;:::i;:::-;9682:13;;9637:20;;;9704:68;9682:13;9637:20;9739:15;;;9704:68;:::i;:::-;9839:13;;9794:20;;;9861:68;9839:13;9794:20;9896:15;;;9861:68;:::i;:::-;9996:13;;9951:20;;;10018:68;9996:13;9951:20;10053:15;;;10018:68;:::i;:::-;10153:13;;10108:20;;;10175:68;10153:13;10108:20;10210:15;;;10175:68;:::i;:::-;10310:13;;10265:20;;;10332:68;10310:13;10265:20;10367:15;;;10332:68;:::i;:::-;10416:20;;;;;8902:1540;-1:-1:-1;;;;;;;;;;8902:1540:1:o;10447:1163::-;10959:66;10954:3;10947:79;11065:7;11060:3;11056:17;11051:2;11046:3;11042:12;11035:39;10929:3;11103:6;11097:13;11119:73;11185:6;11180:2;11175:3;11171:12;11166:2;11158:6;11154:15;11119:73;:::i;:::-;11256:66;11251:2;11211:16;;;11243:11;;;11236:87;-1:-1:-1;;;11347:2:1;11339:11;;11332:41;11398:13;;11420:74;11398:13;11480:2;11472:11;;11467:2;11455:15;;11420:74;:::i;:::-;-1:-1:-1;;;11554:2:1;11513:17;;;;11546:11;;;11539:38;11601:2;11593:11;;10447:1163;-1:-1:-1;;;;10447:1163:1:o;11615:1842::-;-1:-1:-1;;;12411:59:1;;12493:13;;12393:3;;12515:75;12493:13;12578:2;12569:12;;12562:4;12550:17;;12515:75;:::i;:::-;-1:-1:-1;;;12649:2:1;12609:16;;;12641:11;;;12634:71;12730:13;;12752:76;12730:13;12814:2;12806:11;;12799:4;12787:17;;12752:76;:::i;:::-;12893:66;12888:2;12847:17;;;;12880:11;;;12873:87;-1:-1:-1;;;12984:2:1;12976:11;;12969:30;13024:13;;13046:76;13024:13;13108:2;13100:11;;13093:4;13081:17;;13046:76;:::i;:::-;-1:-1:-1;;;13182:2:1;13141:17;;;;13174:11;;;13167:65;13257:13;;13279:76;13257:13;13341:2;13333:11;;13326:4;13314:17;;13279:76;:::i;:::-;-1:-1:-1;;;13415:2:1;13374:17;;;;13407:11;;;13400:24;13448:2;13440:11;;11615:1842;-1:-1:-1;;;;;;11615:1842:1:o;13462:461::-;13724:31;13719:3;13712:44;13694:3;13785:6;13779:13;13801:75;13869:6;13864:2;13859:3;13855:12;13848:4;13840:6;13836:17;13801:75;:::i;:::-;13896:16;;;;13914:2;13892:25;;13462:461;-1:-1:-1;;13462:461:1:o;15457:128::-;15524:9;;;15545:11;;;15542:37;;;15559:18;;:::i;15944:414::-;16146:2;16128:21;;;16185:2;16165:18;;;16158:30;16224:34;16219:2;16204:18;;16197:62;-1:-1:-1;;;16290:2:1;16275:18;;16268:48;16348:3;16333:19;;15944:414::o;17550:135::-;17589:3;17610:17;;;17607:43;;17630:18;;:::i;:::-;-1:-1:-1;17677:1:1;17666:13;;17550:135::o;18019:120::-;18059:1;18085;18075:35;;18090:18;;:::i;:::-;-1:-1:-1;18124:9:1;;18019:120::o;18144:168::-;18217:9;;;18248;;18265:15;;;18259:22;;18245:37;18235:71;;18286:18;;:::i;18317:489::-;-1:-1:-1;;;;;18586:15:1;;;18568:34;;18638:15;;18633:2;18618:18;;18611:43;18685:2;18670:18;;18663:34;;;18733:3;18728:2;18713:18;;18706:31;;;18511:4;;18754:46;;18780:19;;18772:6;18754:46;:::i;18811:249::-;18880:6;18933:2;18921:9;18912:7;18908:23;18904:32;18901:52;;;18949:1;18946;18939:12;18901:52;18981:9;18975:16;19000:30;19024:5;19000:30;:::i;19065:648::-;19145:6;19198:2;19186:9;19177:7;19173:23;19169:32;19166:52;;;19214:1;19211;19204:12;19166:52;19247:9;19241:16;19280:18;19272:6;19269:30;19266:50;;;19312:1;19309;19302:12;19266:50;19335:22;;19388:4;19380:13;;19376:27;-1:-1:-1;19366:55:1;;19417:1;19414;19407:12;19366:55;19446:2;19440:9;19471:48;19487:31;19515:2;19487:31;:::i;19471:48::-;19542:2;19535:5;19528:17;19582:7;19577:2;19572;19568;19564:11;19560:20;19557:33;19554:53;;;19603:1;19600;19593:12;19554:53;19616:67;19680:2;19675;19668:5;19664:14;19659:2;19655;19651:11;19616:67;:::i;:::-;19702:5;19065:648;-1:-1:-1;;;;;19065:648:1:o;19718:697::-;20081:66;20076:3;20069:79;-1:-1:-1;;;20173:2:1;20168:3;20164:12;20157:33;20051:3;20219:6;20213:13;20235:73;20301:6;20296:2;20291:3;20287:12;20282:2;20274:6;20270:15;20235:73;:::i;:::-;-1:-1:-1;;;20367:2:1;20327:16;;;;20359:11;;;20352:30;-1:-1:-1;20406:2:1;20398:11;;19718:697;-1:-1:-1;19718:697:1:o;20420:701::-;20783:66;20778:3;20771:79;-1:-1:-1;;;20875:2:1;20870:3;20866:12;20859:37;20753:3;20925:6;20919:13;20941:73;21007:6;21002:2;20997:3;20993:12;20988:2;20980:6;20976:15;20941:73;:::i;:::-;-1:-1:-1;;;21073:2:1;21033:16;;;;21065:11;;;21058:30;-1:-1:-1;21112:2:1;21104:11;;20420:701;-1:-1:-1;20420:701:1:o;21126:711::-;21489:66;21484:3;21477:79;21586:25;21581:2;21576:3;21572:12;21565:47;21459:3;21641:6;21635:13;21657:73;21723:6;21718:2;21713:3;21709:12;21704:2;21696:6;21692:15;21657:73;:::i;:::-;-1:-1:-1;;;21789:2:1;21749:16;;;;21781:11;;;21774:30;-1:-1:-1;21828:2:1;21820:11;;21126:711;-1:-1:-1;21126:711:1:o;21842:289::-;21973:3;22011:6;22005:13;22027:66;22086:6;22081:3;22074:4;22066:6;22062:17;22027:66;:::i;:::-;22109:16;;;;;21842:289;-1:-1:-1;;21842:289:1:o;22461:480::-;22693:3;22731:6;22725:13;22747:66;22806:6;22801:3;22794:4;22786:6;22782:17;22747:66;:::i;:::-;22874:30;22835:16;;22860:45;;;-1:-1:-1;22932:2:1;22921:14;;22461:480;-1:-1:-1;22461:480:1:o;22946:700::-;23309:66;23304:3;23297:79;23415:4;23410:3;23406:14;23401:2;23396:3;23392:12;23385:36;23279:3;23450:6;23444:13;23466:73;23532:6;23527:2;23522:3;23518:12;23513:2;23505:6;23501:15;23466:73;:::i;:::-;-1:-1:-1;;;23598:2:1;23558:16;;;;23590:11;;;23583:30;-1:-1:-1;23637:2:1;23629:11;;22946:700;-1:-1:-1;22946:700:1:o;23651:400::-;23808:3;23846:6;23840:13;23862:66;23921:6;23916:3;23909:4;23901:6;23897:17;23862:66;:::i;:::-;-1:-1:-1;;;;;;23989:26:1;;;;23950:16;;;;23975:41;;;24043:1;24032:13;;23651:400;-1:-1:-1;;23651:400:1:o;24056:1390::-;-1:-1:-1;;;24705:57:1;;24785:13;;24687:3;;24807:75;24785:13;24870:2;24861:12;;24854:4;24842:17;;24807:75;:::i;:::-;24946:66;24941:2;24901:16;;;24933:11;;;24926:87;25038:13;;25060:76;25038:13;25122:2;25114:11;;25107:4;25095:17;;25060:76;:::i;:::-;-1:-1:-1;;;25196:2:1;25155:17;;;;25188:11;;;25181:34;25240:13;;25262:76;25240:13;25324:2;25316:11;;25309:4;25297:17;;25262:76;:::i;:::-;-1:-1:-1;;;25398:2:1;25357:17;;;;25390:11;;;25383:30;25437:2;25429:11;;24056:1390;-1:-1:-1;;;;;24056:1390:1:o;25451:1709::-;-1:-1:-1;;;26249:57:1;;26329:13;;26231:3;;26351:75;26329:13;26414:2;26405:12;;26398:4;26386:17;;26351:75;:::i;:::-;-1:-1:-1;;;26485:2:1;26445:16;;;26477:11;;;26470:63;26558:13;;26580:76;26558:13;26642:2;26634:11;;26627:4;26615:17;;26580:76;:::i;:::-;-1:-1:-1;;;26716:2:1;26675:17;;;;26708:11;;;26701:29;26755:13;;26777:76;26755:13;26839:2;26831:11;;26824:4;26812:17;;26777:76;:::i;:::-;-1:-1:-1;;;26913:2:1;26872:17;;;;26905:11;;;26898:31;26954:13;;26976:76;26954:13;27038:2;27030:11;;27023:4;27011:17;;26976:76;:::i;:::-;-1:-1:-1;;;27112:2:1;27071:17;;;;27104:11;;;27097:30;27151:2;27143:11;;25451:1709;-1:-1:-1;;;;;;25451:1709:1:o;27165:1377::-;-1:-1:-1;;;27814:57:1;;27894:13;;27796:3;;27916:75;27894:13;27979:2;27970:12;;27963:4;27951:17;;27916:75;:::i;:::-;-1:-1:-1;;;28050:2:1;28010:16;;;28042:11;;;28035:63;28123:13;;28145:76;28123:13;28207:2;28199:11;;28192:4;28180:17;;28145:76;:::i;:::-;-1:-1:-1;;;28281:2:1;28240:17;;;;28273:11;;;28266:45;28336:13;;28358:76;28336:13;28420:2;28412:11;;28405:4;28393:17;;28358:76;:::i;:::-;-1:-1:-1;;;28494:2:1;28453:17;;;;28486:11;;;28479:30;28533:2;28525:11;;27165:1377;-1:-1:-1;;;;;27165:1377:1:o;28547:1387::-;-1:-1:-1;;;29196:57:1;;29276:13;;29178:3;;29298:75;29276:13;29361:2;29352:12;;29345:4;29333:17;;29298:75;:::i;:::-;29437:66;29432:2;29392:16;;;29424:11;;;29417:87;29529:13;;29551:76;29529:13;29613:2;29605:11;;29598:4;29586:17;;29551:76;:::i;:::-;-1:-1:-1;;;29687:2:1;29646:17;;;;29679:11;;;29672:31;29728:13;;29750:76;29728:13;29812:2;29804:11;;29797:4;29785:17;;29750:76;:::i;:::-;-1:-1:-1;;;29886:2:1;29845:17;;;;29878:11;;;29871:30;29925:2;29917:11;;28547:1387;-1:-1:-1;;;;;28547:1387:1:o;30285:640::-;30565:3;30603:6;30597:13;30619:66;30678:6;30673:3;30666:4;30658:6;30654:17;30619:66;:::i;:::-;-1:-1:-1;;;30707:16:1;;;30732:18;;;30775:13;;30797:78;30775:13;30862:1;30851:13;;30844:4;30832:17;;30797:78;:::i;:::-;30895:20;30917:1;30891:28;;30285:640;-1:-1:-1;;;;30285:640:1:o

Swarm Source

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