ETH Price: $3,243.53 (-0.34%)
Gas: 1 Gwei

Token

Porn NFT Community Pack (PORN)
 

Overview

Max Total Supply

551 PORN

Holders

157

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
manbi.eth
Balance
2 PORN
0xC6F1B9611b6741217C152fb2861D44aBDfa172eB
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

3000 unique NFTs which are 1:1 with a random URL of a video from the biggest porn website.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
PornNFTCommunity

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


// File: node_modules\@openzeppelin\contracts\token\ERC721\extensions\IERC721Enumerable.sol



pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin\contracts\token\ERC721\extensions\ERC721Enumerable.sol



pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: ethereum\contracts\PornNFTCommunity.sol


pragma solidity ^0.8.0;




/**
 * @title PornNFT Community Pack contract
 * @dev Extends ERC721 Non-Fungible Token Standard basic implementation
 */
contract PornNFTCommunity is ERC721, ERC721Enumerable, Ownable {

    uint256 public constant tokenPrice = 36900000000000000; // 0.0369 ETH
    uint256 public constant presaleTokenPrice = 27700000000000000; // 0.0277 ETH
    uint public constant maxTokenPurchase = 19;
    uint256 public MAX_TOKENS = 10000;
    bool public saleIsActive = false;
    bool public presaleIsActive = false;

    string private _baseURIextended;

    constructor() ERC721("Porn NFT Community Pack", "PORN") {
    }

    // CHANGED: needed to resolve conflicting fns in ERC721 and ERC721Enumerable
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    // CHANGED: needed to resolve conflicting fns in ERC721 and ERC721Enumerable
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC721Enumerable) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    // CHANGED: added to account for changes in openzeppelin versions
    function setBaseURI(string memory baseURI_) external onlyOwner() {
        _baseURIextended = baseURI_;
    }

    // CHANGED: added to account for changes in openzeppelin versions
    function _baseURI() internal view virtual override returns (string memory) {
        return _baseURIextended;
    }

    function reserveTokens(uint numberOfTokens) public onlyOwner {        
        require(totalSupply() + numberOfTokens <= MAX_TOKENS, "Purchase would exceed max supply of tokens");
        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply();
            if (totalSupply() < MAX_TOKENS) {
                _safeMint(msg.sender, mintIndex);
            }
        }
    }
    
    function flipSaleState(bool presale, bool sale) public onlyOwner {
        presaleIsActive = presale;
        saleIsActive = sale;
    }
    
    function mintPorn(uint numberOfTokens) public payable {
        require(saleIsActive, "Sale must be active to mint Tokens");
        require(numberOfTokens <= maxTokenPurchase, "Exceeded max token purchase");
        // CHANGED: mult and add to + and *
        require(totalSupply() + numberOfTokens <= MAX_TOKENS, "Purchase would exceed max supply of tokens");
        // CHANGED: mult and add to + and *
        require(tokenPrice * numberOfTokens <= msg.value, "Ether value sent is not correct");
        
        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply();
            if (totalSupply() < MAX_TOKENS) {
                _safeMint(msg.sender, mintIndex);
            }
        }
    }
    
    function mintPresale(uint numberOfTokens) public payable {
        require(presaleIsActive, "PreSale must be active to mint Tokens");
        require(numberOfTokens <= maxTokenPurchase, "Exceeded max token purchase");
        // CHANGED: mult and add to + and *
        require(totalSupply() + numberOfTokens <= MAX_TOKENS, "Purchase would exceed max supply of tokens");
        // CHANGED: mult and add to + and *
        require(presaleTokenPrice * numberOfTokens <= msg.value, "Ether value sent is not correct");
        
        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply();
            if (totalSupply() < MAX_TOKENS) {
                _safeMint(msg.sender, mintIndex);
            }
        }
    }
    
    function getHolderTokens(address owner) public view virtual returns (uint256[] memory) {
        uint256 tokenCount = balanceOf(owner);
        if(tokenCount == 0){
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 resultIndex = 0;
            uint256 x;

            for(x=0; x < tokenCount; x++){
                result[resultIndex] = tokenOfOwnerByIndex(owner, x);
                resultIndex++;
            }

            return result;
        }
    }

    function withdraw() public onlyOwner {
        payable(0x4a0B9fE60630E05952d7Ffca38aa7613196Dc9fb).transfer((address(this).balance*5)/100);
        payable(msg.sender).transfer(address(this).balance);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":"bool","name":"presale","type":"bool"},{"internalType":"bool","name":"sale","type":"bool"}],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getHolderTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"maxTokenPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintPorn","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052612710600b556000600c60006101000a81548160ff0219169083151502179055506000600c60016101000a81548160ff0219169083151502179055503480156200004d57600080fd5b506040518060400160405280601781526020017f506f726e204e465420436f6d6d756e697479205061636b0000000000000000008152506040518060400160405280600481526020017f504f524e000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000d2929190620001e2565b508060019080519060200190620000eb929190620001e2565b5050506200010e620001026200011460201b60201c565b6200011c60201b60201c565b620002f7565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001f09062000292565b90600052602060002090601f01602090048101928262000214576000855562000260565b82601f106200022f57805160ff191683800117855562000260565b8280016001018555821562000260579182015b828111156200025f57825182559160200191906001019062000242565b5b5090506200026f919062000273565b5090565b5b808211156200028e57600081600090555060010162000274565b5090565b60006002820490506001821680620002ab57607f821691505b60208210811415620002c257620002c1620002c8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6143e580620003076000396000f3fe6080604052600436106101e35760003560e01c80637ff9b59611610102578063c87b56dd11610095578063eb8d244411610064578063eb8d2444146106f7578063f2fde38b14610722578063f47c84c51461074b578063f759867a14610776576101e3565b8063c87b56dd14610617578063d031370b14610654578063e547e6931461067d578063e985e9c5146106ba576101e3565b80639c5fc4e6116100d15780639c5fc4e614610580578063a22cb4651461059c578063b88d4fde146105c5578063be75d318146105ee576101e3565b80637ff9b596146104d45780638da5cb5b146104ff57806393777fb31461052a57806395d89b4114610555576101e3565b806330f72cd41161017a57806355f804b31161014957806355f804b31461041a5780636352211e1461044357806370a0823114610480578063715018a6146104bd576101e3565b806330f72cd4146103725780633ccfd60b1461039d57806342842e0e146103b45780634f6ccce7146103dd576101e3565b806309aa3dcf116101b657806309aa3dcf146102b657806318160ddd146102e157806323b872dd1461030c5780632f745c5914610335576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a91906130c6565b610792565b60405161021c9190613bca565b60405180910390f35b34801561023157600080fd5b5061023a6107a4565b6040516102479190613be5565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190613159565b610836565b6040516102849190613b41565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af919061304e565b6108bb565b005b3480156102c257600080fd5b506102cb6109d3565b6040516102d89190613ee7565b60405180910390f35b3480156102ed57600080fd5b506102f66109d8565b6040516103039190613ee7565b60405180910390f35b34801561031857600080fd5b50610333600480360381019061032e9190612f48565b6109e5565b005b34801561034157600080fd5b5061035c6004803603810190610357919061304e565b610a45565b6040516103699190613ee7565b60405180910390f35b34801561037e57600080fd5b50610387610aea565b6040516103949190613bca565b60405180910390f35b3480156103a957600080fd5b506103b2610afd565b005b3480156103c057600080fd5b506103db60048036038101906103d69190612f48565b610c35565b005b3480156103e957600080fd5b5061040460048036038101906103ff9190613159565b610c55565b6040516104119190613ee7565b60405180910390f35b34801561042657600080fd5b50610441600480360381019061043c9190613118565b610cec565b005b34801561044f57600080fd5b5061046a60048036038101906104659190613159565b610d82565b6040516104779190613b41565b60405180910390f35b34801561048c57600080fd5b506104a760048036038101906104a29190612ee3565b610e34565b6040516104b49190613ee7565b60405180910390f35b3480156104c957600080fd5b506104d2610eec565b005b3480156104e057600080fd5b506104e9610f74565b6040516104f69190613ee7565b60405180910390f35b34801561050b57600080fd5b50610514610f7f565b6040516105219190613b41565b60405180910390f35b34801561053657600080fd5b5061053f610fa9565b60405161054c9190613ee7565b60405180910390f35b34801561056157600080fd5b5061056a610fb4565b6040516105779190613be5565b60405180910390f35b61059a60048036038101906105959190613159565b611046565b005b3480156105a857600080fd5b506105c360048036038101906105be9190613012565b6111d0565b005b3480156105d157600080fd5b506105ec60048036038101906105e79190612f97565b611351565b005b3480156105fa57600080fd5b506106156004803603810190610610919061308a565b6113b3565b005b34801561062357600080fd5b5061063e60048036038101906106399190613159565b611467565b60405161064b9190613be5565b60405180910390f35b34801561066057600080fd5b5061067b60048036038101906106769190613159565b61150e565b005b34801561068957600080fd5b506106a4600480360381019061069f9190612ee3565b61162c565b6040516106b19190613ba8565b60405180910390f35b3480156106c657600080fd5b506106e160048036038101906106dc9190612f0c565b6117b8565b6040516106ee9190613bca565b60405180910390f35b34801561070357600080fd5b5061070c61184c565b6040516107199190613bca565b60405180910390f35b34801561072e57600080fd5b5061074960048036038101906107449190612ee3565b61185f565b005b34801561075757600080fd5b50610760611957565b60405161076d9190613ee7565b60405180910390f35b610790600480360381019061078b9190613159565b61195d565b005b600061079d82611ae7565b9050919050565b6060600080546107b3906141da565b80601f01602080910402602001604051908101604052809291908181526020018280546107df906141da565b801561082c5780601f106108015761010080835404028352916020019161082c565b820191906000526020600020905b81548152906001019060200180831161080f57829003601f168201915b5050505050905090565b600061084182611b61565b610880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087790613dc7565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108c682610d82565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092e90613e67565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610956611bcd565b73ffffffffffffffffffffffffffffffffffffffff16148061098557506109848161097f611bcd565b6117b8565b5b6109c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bb90613d27565b60405180910390fd5b6109ce8383611bd5565b505050565b601381565b6000600880549050905090565b6109f66109f0611bcd565b82611c8e565b610a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2c90613ea7565b60405180910390fd5b610a40838383611d6c565b505050565b6000610a5083610e34565b8210610a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8890613c07565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600c60019054906101000a900460ff1681565b610b05611bcd565b73ffffffffffffffffffffffffffffffffffffffff16610b23610f7f565b73ffffffffffffffffffffffffffffffffffffffff1614610b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7090613de7565b60405180910390fd5b734a0b9fe60630e05952d7ffca38aa7613196dc9fb73ffffffffffffffffffffffffffffffffffffffff166108fc6064600547610bb69190614096565b610bc09190614065565b9081150290604051600060405180830381858888f19350505050158015610beb573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610c32573d6000803e3d6000fd5b50565b610c5083838360405180602001604052806000815250611351565b505050565b6000610c5f6109d8565b8210610ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9790613ec7565b60405180910390fd5b60088281548110610cda577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610cf4611bcd565b73ffffffffffffffffffffffffffffffffffffffff16610d12610f7f565b73ffffffffffffffffffffffffffffffffffffffff1614610d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5f90613de7565b60405180910390fd5b80600d9080519060200190610d7e929190612d07565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2290613d67565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9c90613d47565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ef4611bcd565b73ffffffffffffffffffffffffffffffffffffffff16610f12610f7f565b73ffffffffffffffffffffffffffffffffffffffff1614610f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5f90613de7565b60405180910390fd5b610f726000611fc8565b565b6683185ac036400081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b66626900d447400081565b606060018054610fc3906141da565b80601f0160208091040260200160405190810160405280929190818152602001828054610fef906141da565b801561103c5780601f106110115761010080835404028352916020019161103c565b820191906000526020600020905b81548152906001019060200180831161101f57829003601f168201915b5050505050905090565b600c60009054906101000a900460ff16611095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108c90613ce7565b60405180910390fd5b60138111156110d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d090613e87565b60405180910390fd5b600b54816110e56109d8565b6110ef919061400f565b1115611130576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112790613d87565b60405180910390fd5b34816683185ac03640006111449190614096565b1115611185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117c90613cc7565b60405180910390fd5b60005b818110156111cc57600061119a6109d8565b9050600b546111a76109d8565b10156111b8576111b7338261208e565b5b5080806111c49061420c565b915050611188565b5050565b6111d8611bcd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611246576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123d90613ca7565b60405180910390fd5b8060056000611253611bcd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611300611bcd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113459190613bca565b60405180910390a35050565b61136261135c611bcd565b83611c8e565b6113a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139890613ea7565b60405180910390fd5b6113ad848484846120ac565b50505050565b6113bb611bcd565b73ffffffffffffffffffffffffffffffffffffffff166113d9610f7f565b73ffffffffffffffffffffffffffffffffffffffff161461142f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142690613de7565b60405180910390fd5b81600c60016101000a81548160ff02191690831515021790555080600c60006101000a81548160ff0219169083151502179055505050565b606061147282611b61565b6114b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a890613e27565b60405180910390fd5b60006114bb612108565b905060008151116114db5760405180602001604052806000815250611506565b806114e58461219a565b6040516020016114f6929190613b1d565b6040516020818303038152906040525b915050919050565b611516611bcd565b73ffffffffffffffffffffffffffffffffffffffff16611534610f7f565b73ffffffffffffffffffffffffffffffffffffffff161461158a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158190613de7565b60405180910390fd5b600b54816115966109d8565b6115a0919061400f565b11156115e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d890613d87565b60405180910390fd5b60005b818110156116285760006115f66109d8565b9050600b546116036109d8565b101561161457611613338261208e565b5b5080806116209061420c565b9150506115e4565b5050565b6060600061163983610e34565b905060008114156116bc57600067ffffffffffffffff811115611685577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156116b35781602001602082028036833780820191505090505b509150506117b3565b60008167ffffffffffffffff8111156116fe577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561172c5781602001602082028036833780820191505090505b5090506000805b838110156117ab576117458682610a45565b83838151811061177e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505081806117959061420c565b92505080806117a39061420c565b915050611733565b829450505050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900460ff1681565b611867611bcd565b73ffffffffffffffffffffffffffffffffffffffff16611885610f7f565b73ffffffffffffffffffffffffffffffffffffffff16146118db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d290613de7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561194b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194290613c47565b60405180910390fd5b61195481611fc8565b50565b600b5481565b600c60019054906101000a900460ff166119ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a390613e47565b60405180910390fd5b60138111156119f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e790613e87565b60405180910390fd5b600b54816119fc6109d8565b611a06919061400f565b1115611a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3e90613d87565b60405180910390fd5b348166626900d4474000611a5b9190614096565b1115611a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9390613cc7565b60405180910390fd5b60005b81811015611ae3576000611ab16109d8565b9050600b54611abe6109d8565b1015611acf57611ace338261208e565b5b508080611adb9061420c565b915050611a9f565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b5a5750611b5982612347565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611c4883610d82565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c9982611b61565b611cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccf90613d07565b60405180910390fd5b6000611ce383610d82565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d5257508373ffffffffffffffffffffffffffffffffffffffff16611d3a84610836565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d635750611d6281856117b8565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d8c82610d82565b73ffffffffffffffffffffffffffffffffffffffff1614611de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd990613e07565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4990613c87565b60405180910390fd5b611e5d838383612429565b611e68600082611bd5565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eb891906140f0565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f0f919061400f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6120a8828260405180602001604052806000815250612439565b5050565b6120b7848484611d6c565b6120c384848484612494565b612102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f990613c27565b60405180910390fd5b50505050565b6060600d8054612117906141da565b80601f0160208091040260200160405190810160405280929190818152602001828054612143906141da565b80156121905780601f1061216557610100808354040283529160200191612190565b820191906000526020600020905b81548152906001019060200180831161217357829003601f168201915b5050505050905090565b606060008214156121e2576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612342565b600082905060005b600082146122145780806121fd9061420c565b915050600a8261220d9190614065565b91506121ea565b60008167ffffffffffffffff811115612256577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156122885781602001600182028036833780820191505090505b5090505b6000851461233b576001826122a191906140f0565b9150600a856122b09190614255565b60306122bc919061400f565b60f81b8183815181106122f8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123349190614065565b945061228c565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061241257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061242257506124218261262b565b5b9050919050565b612434838383612695565b505050565b61244383836127a9565b6124506000848484612494565b61248f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248690613c27565b60405180910390fd5b505050565b60006124b58473ffffffffffffffffffffffffffffffffffffffff16612977565b1561261e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124de611bcd565b8786866040518563ffffffff1660e01b81526004016125009493929190613b5c565b602060405180830381600087803b15801561251a57600080fd5b505af192505050801561254b57506040513d601f19601f8201168201806040525081019061254891906130ef565b60015b6125ce573d806000811461257b576040519150601f19603f3d011682016040523d82523d6000602084013e612580565b606091505b506000815114156125c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125bd90613c27565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612623565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6126a083838361298a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126e3576126de8161298f565b612722565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146127215761272083826129d8565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127655761276081612b45565b6127a4565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146127a3576127a28282612c88565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281090613da7565b60405180910390fd5b61282281611b61565b15612862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285990613c67565b60405180910390fd5b61286e60008383612429565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128be919061400f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016129e584610e34565b6129ef91906140f0565b9050600060076000848152602001908152602001600020549050818114612ad4576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612b5991906140f0565b9050600060096000848152602001908152602001600020549050600060088381548110612baf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612bf7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612c6c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612c9383610e34565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612d13906141da565b90600052602060002090601f016020900481019282612d355760008555612d7c565b82601f10612d4e57805160ff1916838001178555612d7c565b82800160010185558215612d7c579182015b82811115612d7b578251825591602001919060010190612d60565b5b509050612d899190612d8d565b5090565b5b80821115612da6576000816000905550600101612d8e565b5090565b6000612dbd612db884613f33565b613f02565b905082815260208101848484011115612dd557600080fd5b612de0848285614198565b509392505050565b6000612dfb612df684613f63565b613f02565b905082815260208101848484011115612e1357600080fd5b612e1e848285614198565b509392505050565b600081359050612e3581614353565b92915050565b600081359050612e4a8161436a565b92915050565b600081359050612e5f81614381565b92915050565b600081519050612e7481614381565b92915050565b600082601f830112612e8b57600080fd5b8135612e9b848260208601612daa565b91505092915050565b600082601f830112612eb557600080fd5b8135612ec5848260208601612de8565b91505092915050565b600081359050612edd81614398565b92915050565b600060208284031215612ef557600080fd5b6000612f0384828501612e26565b91505092915050565b60008060408385031215612f1f57600080fd5b6000612f2d85828601612e26565b9250506020612f3e85828601612e26565b9150509250929050565b600080600060608486031215612f5d57600080fd5b6000612f6b86828701612e26565b9350506020612f7c86828701612e26565b9250506040612f8d86828701612ece565b9150509250925092565b60008060008060808587031215612fad57600080fd5b6000612fbb87828801612e26565b9450506020612fcc87828801612e26565b9350506040612fdd87828801612ece565b925050606085013567ffffffffffffffff811115612ffa57600080fd5b61300687828801612e7a565b91505092959194509250565b6000806040838503121561302557600080fd5b600061303385828601612e26565b925050602061304485828601612e3b565b9150509250929050565b6000806040838503121561306157600080fd5b600061306f85828601612e26565b925050602061308085828601612ece565b9150509250929050565b6000806040838503121561309d57600080fd5b60006130ab85828601612e3b565b92505060206130bc85828601612e3b565b9150509250929050565b6000602082840312156130d857600080fd5b60006130e684828501612e50565b91505092915050565b60006020828403121561310157600080fd5b600061310f84828501612e65565b91505092915050565b60006020828403121561312a57600080fd5b600082013567ffffffffffffffff81111561314457600080fd5b61315084828501612ea4565b91505092915050565b60006020828403121561316b57600080fd5b600061317984828501612ece565b91505092915050565b600061318e8383613aff565b60208301905092915050565b6131a381614124565b82525050565b60006131b482613fa3565b6131be8185613fd1565b93506131c983613f93565b8060005b838110156131fa5781516131e18882613182565b97506131ec83613fc4565b9250506001810190506131cd565b5085935050505092915050565b61321081614136565b82525050565b600061322182613fae565b61322b8185613fe2565b935061323b8185602086016141a7565b61324481614342565b840191505092915050565b600061325a82613fb9565b6132648185613ff3565b93506132748185602086016141a7565b61327d81614342565b840191505092915050565b600061329382613fb9565b61329d8185614004565b93506132ad8185602086016141a7565b80840191505092915050565b60006132c6602b83613ff3565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061332c603283613ff3565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613392602683613ff3565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133f8601c83613ff3565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613438602483613ff3565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061349e601983613ff3565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006134de601f83613ff3565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b600061351e602283613ff3565b91507f53616c65206d7573742062652061637469766520746f206d696e7420546f6b6560008301527f6e730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613584602c83613ff3565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006135ea603883613ff3565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613650602a83613ff3565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006136b6602983613ff3565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061371c602a83613ff3565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620746f6b656e73000000000000000000000000000000000000000000006020830152604082019050919050565b6000613782602083613ff3565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006137c2602c83613ff3565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613828602083613ff3565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613868602983613ff3565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006138ce602f83613ff3565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613934602583613ff3565b91507f50726553616c65206d7573742062652061637469766520746f206d696e74205460008301527f6f6b656e730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061399a602183613ff3565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a00601b83613ff3565b91507f4578636565646564206d617820746f6b656e20707572636861736500000000006000830152602082019050919050565b6000613a40603183613ff3565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613aa6602c83613ff3565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b613b088161418e565b82525050565b613b178161418e565b82525050565b6000613b298285613288565b9150613b358284613288565b91508190509392505050565b6000602082019050613b56600083018461319a565b92915050565b6000608082019050613b71600083018761319a565b613b7e602083018661319a565b613b8b6040830185613b0e565b8181036060830152613b9d8184613216565b905095945050505050565b60006020820190508181036000830152613bc281846131a9565b905092915050565b6000602082019050613bdf6000830184613207565b92915050565b60006020820190508181036000830152613bff818461324f565b905092915050565b60006020820190508181036000830152613c20816132b9565b9050919050565b60006020820190508181036000830152613c408161331f565b9050919050565b60006020820190508181036000830152613c6081613385565b9050919050565b60006020820190508181036000830152613c80816133eb565b9050919050565b60006020820190508181036000830152613ca08161342b565b9050919050565b60006020820190508181036000830152613cc081613491565b9050919050565b60006020820190508181036000830152613ce0816134d1565b9050919050565b60006020820190508181036000830152613d0081613511565b9050919050565b60006020820190508181036000830152613d2081613577565b9050919050565b60006020820190508181036000830152613d40816135dd565b9050919050565b60006020820190508181036000830152613d6081613643565b9050919050565b60006020820190508181036000830152613d80816136a9565b9050919050565b60006020820190508181036000830152613da08161370f565b9050919050565b60006020820190508181036000830152613dc081613775565b9050919050565b60006020820190508181036000830152613de0816137b5565b9050919050565b60006020820190508181036000830152613e008161381b565b9050919050565b60006020820190508181036000830152613e208161385b565b9050919050565b60006020820190508181036000830152613e40816138c1565b9050919050565b60006020820190508181036000830152613e6081613927565b9050919050565b60006020820190508181036000830152613e808161398d565b9050919050565b60006020820190508181036000830152613ea0816139f3565b9050919050565b60006020820190508181036000830152613ec081613a33565b9050919050565b60006020820190508181036000830152613ee081613a99565b9050919050565b6000602082019050613efc6000830184613b0e565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613f2957613f28614313565b5b8060405250919050565b600067ffffffffffffffff821115613f4e57613f4d614313565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613f7e57613f7d614313565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061401a8261418e565b91506140258361418e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561405a57614059614286565b5b828201905092915050565b60006140708261418e565b915061407b8361418e565b92508261408b5761408a6142b5565b5b828204905092915050565b60006140a18261418e565b91506140ac8361418e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140e5576140e4614286565b5b828202905092915050565b60006140fb8261418e565b91506141068361418e565b92508282101561411957614118614286565b5b828203905092915050565b600061412f8261416e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156141c55780820151818401526020810190506141aa565b838111156141d4576000848401525b50505050565b600060028204905060018216806141f257607f821691505b60208210811415614206576142056142e4565b5b50919050565b60006142178261418e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561424a57614249614286565b5b600182019050919050565b60006142608261418e565b915061426b8361418e565b92508261427b5761427a6142b5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61435c81614124565b811461436757600080fd5b50565b61437381614136565b811461437e57600080fd5b50565b61438a81614142565b811461439557600080fd5b50565b6143a18161418e565b81146143ac57600080fd5b5056fea264697066735822122001acaf77ec6a58c356a02166c812cf7da9895ee66d2139a91e8742178405354364736f6c63430008000033

Deployed Bytecode

0x6080604052600436106101e35760003560e01c80637ff9b59611610102578063c87b56dd11610095578063eb8d244411610064578063eb8d2444146106f7578063f2fde38b14610722578063f47c84c51461074b578063f759867a14610776576101e3565b8063c87b56dd14610617578063d031370b14610654578063e547e6931461067d578063e985e9c5146106ba576101e3565b80639c5fc4e6116100d15780639c5fc4e614610580578063a22cb4651461059c578063b88d4fde146105c5578063be75d318146105ee576101e3565b80637ff9b596146104d45780638da5cb5b146104ff57806393777fb31461052a57806395d89b4114610555576101e3565b806330f72cd41161017a57806355f804b31161014957806355f804b31461041a5780636352211e1461044357806370a0823114610480578063715018a6146104bd576101e3565b806330f72cd4146103725780633ccfd60b1461039d57806342842e0e146103b45780634f6ccce7146103dd576101e3565b806309aa3dcf116101b657806309aa3dcf146102b657806318160ddd146102e157806323b872dd1461030c5780632f745c5914610335576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a91906130c6565b610792565b60405161021c9190613bca565b60405180910390f35b34801561023157600080fd5b5061023a6107a4565b6040516102479190613be5565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190613159565b610836565b6040516102849190613b41565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af919061304e565b6108bb565b005b3480156102c257600080fd5b506102cb6109d3565b6040516102d89190613ee7565b60405180910390f35b3480156102ed57600080fd5b506102f66109d8565b6040516103039190613ee7565b60405180910390f35b34801561031857600080fd5b50610333600480360381019061032e9190612f48565b6109e5565b005b34801561034157600080fd5b5061035c6004803603810190610357919061304e565b610a45565b6040516103699190613ee7565b60405180910390f35b34801561037e57600080fd5b50610387610aea565b6040516103949190613bca565b60405180910390f35b3480156103a957600080fd5b506103b2610afd565b005b3480156103c057600080fd5b506103db60048036038101906103d69190612f48565b610c35565b005b3480156103e957600080fd5b5061040460048036038101906103ff9190613159565b610c55565b6040516104119190613ee7565b60405180910390f35b34801561042657600080fd5b50610441600480360381019061043c9190613118565b610cec565b005b34801561044f57600080fd5b5061046a60048036038101906104659190613159565b610d82565b6040516104779190613b41565b60405180910390f35b34801561048c57600080fd5b506104a760048036038101906104a29190612ee3565b610e34565b6040516104b49190613ee7565b60405180910390f35b3480156104c957600080fd5b506104d2610eec565b005b3480156104e057600080fd5b506104e9610f74565b6040516104f69190613ee7565b60405180910390f35b34801561050b57600080fd5b50610514610f7f565b6040516105219190613b41565b60405180910390f35b34801561053657600080fd5b5061053f610fa9565b60405161054c9190613ee7565b60405180910390f35b34801561056157600080fd5b5061056a610fb4565b6040516105779190613be5565b60405180910390f35b61059a60048036038101906105959190613159565b611046565b005b3480156105a857600080fd5b506105c360048036038101906105be9190613012565b6111d0565b005b3480156105d157600080fd5b506105ec60048036038101906105e79190612f97565b611351565b005b3480156105fa57600080fd5b506106156004803603810190610610919061308a565b6113b3565b005b34801561062357600080fd5b5061063e60048036038101906106399190613159565b611467565b60405161064b9190613be5565b60405180910390f35b34801561066057600080fd5b5061067b60048036038101906106769190613159565b61150e565b005b34801561068957600080fd5b506106a4600480360381019061069f9190612ee3565b61162c565b6040516106b19190613ba8565b60405180910390f35b3480156106c657600080fd5b506106e160048036038101906106dc9190612f0c565b6117b8565b6040516106ee9190613bca565b60405180910390f35b34801561070357600080fd5b5061070c61184c565b6040516107199190613bca565b60405180910390f35b34801561072e57600080fd5b5061074960048036038101906107449190612ee3565b61185f565b005b34801561075757600080fd5b50610760611957565b60405161076d9190613ee7565b60405180910390f35b610790600480360381019061078b9190613159565b61195d565b005b600061079d82611ae7565b9050919050565b6060600080546107b3906141da565b80601f01602080910402602001604051908101604052809291908181526020018280546107df906141da565b801561082c5780601f106108015761010080835404028352916020019161082c565b820191906000526020600020905b81548152906001019060200180831161080f57829003601f168201915b5050505050905090565b600061084182611b61565b610880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087790613dc7565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108c682610d82565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092e90613e67565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610956611bcd565b73ffffffffffffffffffffffffffffffffffffffff16148061098557506109848161097f611bcd565b6117b8565b5b6109c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bb90613d27565b60405180910390fd5b6109ce8383611bd5565b505050565b601381565b6000600880549050905090565b6109f66109f0611bcd565b82611c8e565b610a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2c90613ea7565b60405180910390fd5b610a40838383611d6c565b505050565b6000610a5083610e34565b8210610a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8890613c07565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600c60019054906101000a900460ff1681565b610b05611bcd565b73ffffffffffffffffffffffffffffffffffffffff16610b23610f7f565b73ffffffffffffffffffffffffffffffffffffffff1614610b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7090613de7565b60405180910390fd5b734a0b9fe60630e05952d7ffca38aa7613196dc9fb73ffffffffffffffffffffffffffffffffffffffff166108fc6064600547610bb69190614096565b610bc09190614065565b9081150290604051600060405180830381858888f19350505050158015610beb573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610c32573d6000803e3d6000fd5b50565b610c5083838360405180602001604052806000815250611351565b505050565b6000610c5f6109d8565b8210610ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9790613ec7565b60405180910390fd5b60088281548110610cda577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610cf4611bcd565b73ffffffffffffffffffffffffffffffffffffffff16610d12610f7f565b73ffffffffffffffffffffffffffffffffffffffff1614610d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5f90613de7565b60405180910390fd5b80600d9080519060200190610d7e929190612d07565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2290613d67565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9c90613d47565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ef4611bcd565b73ffffffffffffffffffffffffffffffffffffffff16610f12610f7f565b73ffffffffffffffffffffffffffffffffffffffff1614610f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5f90613de7565b60405180910390fd5b610f726000611fc8565b565b6683185ac036400081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b66626900d447400081565b606060018054610fc3906141da565b80601f0160208091040260200160405190810160405280929190818152602001828054610fef906141da565b801561103c5780601f106110115761010080835404028352916020019161103c565b820191906000526020600020905b81548152906001019060200180831161101f57829003601f168201915b5050505050905090565b600c60009054906101000a900460ff16611095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108c90613ce7565b60405180910390fd5b60138111156110d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d090613e87565b60405180910390fd5b600b54816110e56109d8565b6110ef919061400f565b1115611130576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112790613d87565b60405180910390fd5b34816683185ac03640006111449190614096565b1115611185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117c90613cc7565b60405180910390fd5b60005b818110156111cc57600061119a6109d8565b9050600b546111a76109d8565b10156111b8576111b7338261208e565b5b5080806111c49061420c565b915050611188565b5050565b6111d8611bcd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611246576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123d90613ca7565b60405180910390fd5b8060056000611253611bcd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611300611bcd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113459190613bca565b60405180910390a35050565b61136261135c611bcd565b83611c8e565b6113a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139890613ea7565b60405180910390fd5b6113ad848484846120ac565b50505050565b6113bb611bcd565b73ffffffffffffffffffffffffffffffffffffffff166113d9610f7f565b73ffffffffffffffffffffffffffffffffffffffff161461142f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142690613de7565b60405180910390fd5b81600c60016101000a81548160ff02191690831515021790555080600c60006101000a81548160ff0219169083151502179055505050565b606061147282611b61565b6114b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a890613e27565b60405180910390fd5b60006114bb612108565b905060008151116114db5760405180602001604052806000815250611506565b806114e58461219a565b6040516020016114f6929190613b1d565b6040516020818303038152906040525b915050919050565b611516611bcd565b73ffffffffffffffffffffffffffffffffffffffff16611534610f7f565b73ffffffffffffffffffffffffffffffffffffffff161461158a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158190613de7565b60405180910390fd5b600b54816115966109d8565b6115a0919061400f565b11156115e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d890613d87565b60405180910390fd5b60005b818110156116285760006115f66109d8565b9050600b546116036109d8565b101561161457611613338261208e565b5b5080806116209061420c565b9150506115e4565b5050565b6060600061163983610e34565b905060008114156116bc57600067ffffffffffffffff811115611685577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156116b35781602001602082028036833780820191505090505b509150506117b3565b60008167ffffffffffffffff8111156116fe577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561172c5781602001602082028036833780820191505090505b5090506000805b838110156117ab576117458682610a45565b83838151811061177e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505081806117959061420c565b92505080806117a39061420c565b915050611733565b829450505050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900460ff1681565b611867611bcd565b73ffffffffffffffffffffffffffffffffffffffff16611885610f7f565b73ffffffffffffffffffffffffffffffffffffffff16146118db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d290613de7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561194b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194290613c47565b60405180910390fd5b61195481611fc8565b50565b600b5481565b600c60019054906101000a900460ff166119ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a390613e47565b60405180910390fd5b60138111156119f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e790613e87565b60405180910390fd5b600b54816119fc6109d8565b611a06919061400f565b1115611a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3e90613d87565b60405180910390fd5b348166626900d4474000611a5b9190614096565b1115611a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9390613cc7565b60405180910390fd5b60005b81811015611ae3576000611ab16109d8565b9050600b54611abe6109d8565b1015611acf57611ace338261208e565b5b508080611adb9061420c565b915050611a9f565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b5a5750611b5982612347565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611c4883610d82565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c9982611b61565b611cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccf90613d07565b60405180910390fd5b6000611ce383610d82565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d5257508373ffffffffffffffffffffffffffffffffffffffff16611d3a84610836565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d635750611d6281856117b8565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d8c82610d82565b73ffffffffffffffffffffffffffffffffffffffff1614611de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd990613e07565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4990613c87565b60405180910390fd5b611e5d838383612429565b611e68600082611bd5565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eb891906140f0565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f0f919061400f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6120a8828260405180602001604052806000815250612439565b5050565b6120b7848484611d6c565b6120c384848484612494565b612102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f990613c27565b60405180910390fd5b50505050565b6060600d8054612117906141da565b80601f0160208091040260200160405190810160405280929190818152602001828054612143906141da565b80156121905780601f1061216557610100808354040283529160200191612190565b820191906000526020600020905b81548152906001019060200180831161217357829003601f168201915b5050505050905090565b606060008214156121e2576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612342565b600082905060005b600082146122145780806121fd9061420c565b915050600a8261220d9190614065565b91506121ea565b60008167ffffffffffffffff811115612256577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156122885781602001600182028036833780820191505090505b5090505b6000851461233b576001826122a191906140f0565b9150600a856122b09190614255565b60306122bc919061400f565b60f81b8183815181106122f8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123349190614065565b945061228c565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061241257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061242257506124218261262b565b5b9050919050565b612434838383612695565b505050565b61244383836127a9565b6124506000848484612494565b61248f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248690613c27565b60405180910390fd5b505050565b60006124b58473ffffffffffffffffffffffffffffffffffffffff16612977565b1561261e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124de611bcd565b8786866040518563ffffffff1660e01b81526004016125009493929190613b5c565b602060405180830381600087803b15801561251a57600080fd5b505af192505050801561254b57506040513d601f19601f8201168201806040525081019061254891906130ef565b60015b6125ce573d806000811461257b576040519150601f19603f3d011682016040523d82523d6000602084013e612580565b606091505b506000815114156125c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125bd90613c27565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612623565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6126a083838361298a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126e3576126de8161298f565b612722565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146127215761272083826129d8565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127655761276081612b45565b6127a4565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146127a3576127a28282612c88565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281090613da7565b60405180910390fd5b61282281611b61565b15612862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285990613c67565b60405180910390fd5b61286e60008383612429565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128be919061400f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016129e584610e34565b6129ef91906140f0565b9050600060076000848152602001908152602001600020549050818114612ad4576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612b5991906140f0565b9050600060096000848152602001908152602001600020549050600060088381548110612baf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612bf7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612c6c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612c9383610e34565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612d13906141da565b90600052602060002090601f016020900481019282612d355760008555612d7c565b82601f10612d4e57805160ff1916838001178555612d7c565b82800160010185558215612d7c579182015b82811115612d7b578251825591602001919060010190612d60565b5b509050612d899190612d8d565b5090565b5b80821115612da6576000816000905550600101612d8e565b5090565b6000612dbd612db884613f33565b613f02565b905082815260208101848484011115612dd557600080fd5b612de0848285614198565b509392505050565b6000612dfb612df684613f63565b613f02565b905082815260208101848484011115612e1357600080fd5b612e1e848285614198565b509392505050565b600081359050612e3581614353565b92915050565b600081359050612e4a8161436a565b92915050565b600081359050612e5f81614381565b92915050565b600081519050612e7481614381565b92915050565b600082601f830112612e8b57600080fd5b8135612e9b848260208601612daa565b91505092915050565b600082601f830112612eb557600080fd5b8135612ec5848260208601612de8565b91505092915050565b600081359050612edd81614398565b92915050565b600060208284031215612ef557600080fd5b6000612f0384828501612e26565b91505092915050565b60008060408385031215612f1f57600080fd5b6000612f2d85828601612e26565b9250506020612f3e85828601612e26565b9150509250929050565b600080600060608486031215612f5d57600080fd5b6000612f6b86828701612e26565b9350506020612f7c86828701612e26565b9250506040612f8d86828701612ece565b9150509250925092565b60008060008060808587031215612fad57600080fd5b6000612fbb87828801612e26565b9450506020612fcc87828801612e26565b9350506040612fdd87828801612ece565b925050606085013567ffffffffffffffff811115612ffa57600080fd5b61300687828801612e7a565b91505092959194509250565b6000806040838503121561302557600080fd5b600061303385828601612e26565b925050602061304485828601612e3b565b9150509250929050565b6000806040838503121561306157600080fd5b600061306f85828601612e26565b925050602061308085828601612ece565b9150509250929050565b6000806040838503121561309d57600080fd5b60006130ab85828601612e3b565b92505060206130bc85828601612e3b565b9150509250929050565b6000602082840312156130d857600080fd5b60006130e684828501612e50565b91505092915050565b60006020828403121561310157600080fd5b600061310f84828501612e65565b91505092915050565b60006020828403121561312a57600080fd5b600082013567ffffffffffffffff81111561314457600080fd5b61315084828501612ea4565b91505092915050565b60006020828403121561316b57600080fd5b600061317984828501612ece565b91505092915050565b600061318e8383613aff565b60208301905092915050565b6131a381614124565b82525050565b60006131b482613fa3565b6131be8185613fd1565b93506131c983613f93565b8060005b838110156131fa5781516131e18882613182565b97506131ec83613fc4565b9250506001810190506131cd565b5085935050505092915050565b61321081614136565b82525050565b600061322182613fae565b61322b8185613fe2565b935061323b8185602086016141a7565b61324481614342565b840191505092915050565b600061325a82613fb9565b6132648185613ff3565b93506132748185602086016141a7565b61327d81614342565b840191505092915050565b600061329382613fb9565b61329d8185614004565b93506132ad8185602086016141a7565b80840191505092915050565b60006132c6602b83613ff3565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061332c603283613ff3565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613392602683613ff3565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133f8601c83613ff3565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613438602483613ff3565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061349e601983613ff3565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006134de601f83613ff3565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b600061351e602283613ff3565b91507f53616c65206d7573742062652061637469766520746f206d696e7420546f6b6560008301527f6e730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613584602c83613ff3565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006135ea603883613ff3565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613650602a83613ff3565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006136b6602983613ff3565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061371c602a83613ff3565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620746f6b656e73000000000000000000000000000000000000000000006020830152604082019050919050565b6000613782602083613ff3565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006137c2602c83613ff3565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613828602083613ff3565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613868602983613ff3565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006138ce602f83613ff3565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613934602583613ff3565b91507f50726553616c65206d7573742062652061637469766520746f206d696e74205460008301527f6f6b656e730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061399a602183613ff3565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a00601b83613ff3565b91507f4578636565646564206d617820746f6b656e20707572636861736500000000006000830152602082019050919050565b6000613a40603183613ff3565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613aa6602c83613ff3565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b613b088161418e565b82525050565b613b178161418e565b82525050565b6000613b298285613288565b9150613b358284613288565b91508190509392505050565b6000602082019050613b56600083018461319a565b92915050565b6000608082019050613b71600083018761319a565b613b7e602083018661319a565b613b8b6040830185613b0e565b8181036060830152613b9d8184613216565b905095945050505050565b60006020820190508181036000830152613bc281846131a9565b905092915050565b6000602082019050613bdf6000830184613207565b92915050565b60006020820190508181036000830152613bff818461324f565b905092915050565b60006020820190508181036000830152613c20816132b9565b9050919050565b60006020820190508181036000830152613c408161331f565b9050919050565b60006020820190508181036000830152613c6081613385565b9050919050565b60006020820190508181036000830152613c80816133eb565b9050919050565b60006020820190508181036000830152613ca08161342b565b9050919050565b60006020820190508181036000830152613cc081613491565b9050919050565b60006020820190508181036000830152613ce0816134d1565b9050919050565b60006020820190508181036000830152613d0081613511565b9050919050565b60006020820190508181036000830152613d2081613577565b9050919050565b60006020820190508181036000830152613d40816135dd565b9050919050565b60006020820190508181036000830152613d6081613643565b9050919050565b60006020820190508181036000830152613d80816136a9565b9050919050565b60006020820190508181036000830152613da08161370f565b9050919050565b60006020820190508181036000830152613dc081613775565b9050919050565b60006020820190508181036000830152613de0816137b5565b9050919050565b60006020820190508181036000830152613e008161381b565b9050919050565b60006020820190508181036000830152613e208161385b565b9050919050565b60006020820190508181036000830152613e40816138c1565b9050919050565b60006020820190508181036000830152613e6081613927565b9050919050565b60006020820190508181036000830152613e808161398d565b9050919050565b60006020820190508181036000830152613ea0816139f3565b9050919050565b60006020820190508181036000830152613ec081613a33565b9050919050565b60006020820190508181036000830152613ee081613a99565b9050919050565b6000602082019050613efc6000830184613b0e565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613f2957613f28614313565b5b8060405250919050565b600067ffffffffffffffff821115613f4e57613f4d614313565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613f7e57613f7d614313565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061401a8261418e565b91506140258361418e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561405a57614059614286565b5b828201905092915050565b60006140708261418e565b915061407b8361418e565b92508261408b5761408a6142b5565b5b828204905092915050565b60006140a18261418e565b91506140ac8361418e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140e5576140e4614286565b5b828202905092915050565b60006140fb8261418e565b91506141068361418e565b92508282101561411957614118614286565b5b828203905092915050565b600061412f8261416e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156141c55780820151818401526020810190506141aa565b838111156141d4576000848401525b50505050565b600060028204905060018216806141f257607f821691505b60208210811415614206576142056142e4565b5b50919050565b60006142178261418e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561424a57614249614286565b5b600182019050919050565b60006142608261418e565b915061426b8361418e565b92508261427b5761427a6142b5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61435c81614124565b811461436757600080fd5b50565b61437381614136565b811461437e57600080fd5b50565b61438a81614142565b811461439557600080fd5b50565b6143a18161418e565b81146143ac57600080fd5b5056fea264697066735822122001acaf77ec6a58c356a02166c812cf7da9895ee66d2139a91e8742178405354364736f6c63430008000033

Deployed Bytecode Sourcemap

43582:4319:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44448:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21725:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23284:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22807:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43811:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37861:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24174:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37529:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43939:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47687:209;;;;;;;;;;;;;:::i;:::-;;24584:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38051:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44706:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21419:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21149:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34552:94;;;;;;;;;;;;;:::i;:::-;;43654:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33901:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43729:61;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21894:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45592:743;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23577:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24840:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45441:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22069:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45021:408;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47118:561;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23943:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43900:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34801:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43860:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46347:759;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44448:179;44559:4;44583:36;44607:11;44583:23;:36::i;:::-;44576:43;;44448:179;;;:::o;21725:100::-;21779:13;21812:5;21805:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21725:100;:::o;23284:221::-;23360:7;23388:16;23396:7;23388;:16::i;:::-;23380:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23473:15;:24;23489:7;23473:24;;;;;;;;;;;;;;;;;;;;;23466:31;;23284:221;;;:::o;22807:411::-;22888:13;22904:23;22919:7;22904:14;:23::i;:::-;22888:39;;22952:5;22946:11;;:2;:11;;;;22938:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23046:5;23030:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23055:37;23072:5;23079:12;:10;:12::i;:::-;23055:16;:37::i;:::-;23030:62;23008:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23189:21;23198:2;23202:7;23189:8;:21::i;:::-;22807:411;;;:::o;43811:42::-;43851:2;43811:42;:::o;37861:113::-;37922:7;37949:10;:17;;;;37942:24;;37861:113;:::o;24174:339::-;24369:41;24388:12;:10;:12::i;:::-;24402:7;24369:18;:41::i;:::-;24361:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24477:28;24487:4;24493:2;24497:7;24477:9;:28::i;:::-;24174:339;;;:::o;37529:256::-;37626:7;37662:23;37679:5;37662:16;:23::i;:::-;37654:5;:31;37646:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37751:12;:19;37764:5;37751:19;;;;;;;;;;;;;;;:26;37771:5;37751:26;;;;;;;;;;;;37744:33;;37529:256;;;;:::o;43939:35::-;;;;;;;;;;;;;:::o;47687:209::-;34132:12;:10;:12::i;:::-;34121:23;;:7;:5;:7::i;:::-;:23;;;34113:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47743:42:::1;47735:60;;:91;47822:3;47819:1;47797:21;:23;;;;:::i;:::-;47796:29;;;;:::i;:::-;47735:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;47845:10;47837:28;;:51;47866:21;47837:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;47687:209::o:0;24584:185::-;24722:39;24739:4;24745:2;24749:7;24722:39;;;;;;;;;;;;:16;:39::i;:::-;24584:185;;;:::o;38051:233::-;38126:7;38162:30;:28;:30::i;:::-;38154:5;:38;38146:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;38259:10;38270:5;38259:17;;;;;;;;;;;;;;;;;;;;;;;;38252:24;;38051:233;;;:::o;44706:111::-;34132:12;:10;:12::i;:::-;34121:23;;:7;:5;:7::i;:::-;:23;;;34113:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44801:8:::1;44782:16;:27;;;;;;;;;;;;:::i;:::-;;44706:111:::0;:::o;21419:239::-;21491:7;21511:13;21527:7;:16;21535:7;21527:16;;;;;;;;;;;;;;;;;;;;;21511:32;;21579:1;21562:19;;:5;:19;;;;21554:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21645:5;21638:12;;;21419:239;;;:::o;21149:208::-;21221:7;21266:1;21249:19;;:5;:19;;;;21241:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21333:9;:16;21343:5;21333:16;;;;;;;;;;;;;;;;21326:23;;21149:208;;;:::o;34552:94::-;34132:12;:10;:12::i;:::-;34121:23;;:7;:5;:7::i;:::-;:23;;;34113:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34617:21:::1;34635:1;34617:9;:21::i;:::-;34552:94::o:0;43654:54::-;43691:17;43654:54;:::o;33901:87::-;33947:7;33974:6;;;;;;;;;;;33967:13;;33901:87;:::o;43729:61::-;43773:17;43729:61;:::o;21894:104::-;21950:13;21983:7;21976:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21894:104;:::o;45592:743::-;45665:12;;;;;;;;;;;45657:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;43851:2;45735:14;:34;;45727:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;45899:10;;45881:14;45865:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:44;;45857:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;46051:9;46033:14;43691:17;46020:27;;;;:::i;:::-;:40;;46012:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;46121:6;46117:211;46137:14;46133:1;:18;46117:211;;;46173:14;46190:13;:11;:13::i;:::-;46173:30;;46238:10;;46222:13;:11;:13::i;:::-;:26;46218:99;;;46269:32;46279:10;46291:9;46269;:32::i;:::-;46218:99;46117:211;46153:3;;;;;:::i;:::-;;;;46117:211;;;;45592:743;:::o;23577:295::-;23692:12;:10;:12::i;:::-;23680:24;;:8;:24;;;;23672:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23792:8;23747:18;:32;23766:12;:10;:12::i;:::-;23747:32;;;;;;;;;;;;;;;:42;23780:8;23747:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23845:8;23816:48;;23831:12;:10;:12::i;:::-;23816:48;;;23855:8;23816:48;;;;;;:::i;:::-;;;;;;;;23577:295;;:::o;24840:328::-;25015:41;25034:12;:10;:12::i;:::-;25048:7;25015:18;:41::i;:::-;25007:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25121:39;25135:4;25141:2;25145:7;25154:5;25121:13;:39::i;:::-;24840:328;;;;:::o;45441:139::-;34132:12;:10;:12::i;:::-;34121:23;;:7;:5;:7::i;:::-;:23;;;34113:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45535:7:::1;45517:15;;:25;;;;;;;;;;;;;;;;;;45568:4;45553:12;;:19;;;;;;;;;;;;;;;;;;45441:139:::0;;:::o;22069:334::-;22142:13;22176:16;22184:7;22176;:16::i;:::-;22168:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22257:21;22281:10;:8;:10::i;:::-;22257:34;;22333:1;22315:7;22309:21;:25;:86;;;;;;;;;;;;;;;;;22361:7;22370:18;:7;:16;:18::i;:::-;22344:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22309:86;22302:93;;;22069:334;;;:::o;45021:408::-;34132:12;:10;:12::i;:::-;34121:23;;:7;:5;:7::i;:::-;:23;;;34113:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45143:10:::1;;45125:14;45109:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:44;;45101:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;45215:6;45211:211;45231:14;45227:1;:18;45211:211;;;45267:14;45284:13;:11;:13::i;:::-;45267:30;;45332:10;;45316:13;:11;:13::i;:::-;:26;45312:99;;;45363:32;45373:10;45385:9;45363;:32::i;:::-;45312:99;45211:211;45247:3;;;;;:::i;:::-;;;;45211:211;;;;45021:408:::0;:::o;47118:561::-;47187:16;47216:18;47237:16;47247:5;47237:9;:16::i;:::-;47216:37;;47281:1;47267:10;:15;47264:408;;;47319:1;47305:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47298:23;;;;;47264:408;47354:23;47394:10;47380:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47354:51;;47420:19;47458:9;47484:147;47497:10;47493:1;:14;47484:147;;;47554:29;47574:5;47581:1;47554:19;:29::i;:::-;47532:6;47539:11;47532:19;;;;;;;;;;;;;;;;;;;;;:51;;;;;47602:13;;;;;:::i;:::-;;;;47509:3;;;;;:::i;:::-;;;;47484:147;;;47654:6;47647:13;;;;;;47118:561;;;;:::o;23943:164::-;24040:4;24064:18;:25;24083:5;24064:25;;;;;;;;;;;;;;;:35;24090:8;24064:35;;;;;;;;;;;;;;;;;;;;;;;;;24057:42;;23943:164;;;;:::o;43900:32::-;;;;;;;;;;;;;:::o;34801:192::-;34132:12;:10;:12::i;:::-;34121:23;;:7;:5;:7::i;:::-;:23;;;34113:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34910:1:::1;34890:22;;:8;:22;;;;34882:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34966:19;34976:8;34966:9;:19::i;:::-;34801:192:::0;:::o;43860:33::-;;;;:::o;46347:759::-;46423:15;;;;;;;;;;;46415:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;43851:2;46499:14;:34;;46491:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;46663:10;;46645:14;46629:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:44;;46621:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;46822:9;46804:14;43773:17;46784:34;;;;:::i;:::-;:47;;46776:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;46892:6;46888:211;46908:14;46904:1;:18;46888:211;;;46944:14;46961:13;:11;:13::i;:::-;46944:30;;47009:10;;46993:13;:11;:13::i;:::-;:26;46989:99;;;47040:32;47050:10;47062:9;47040;:32::i;:::-;46989:99;46888:211;46924:3;;;;;:::i;:::-;;;;46888:211;;;;46347:759;:::o;37221:224::-;37323:4;37362:35;37347:50;;;:11;:50;;;;:90;;;;37401:36;37425:11;37401:23;:36::i;:::-;37347:90;37340:97;;37221:224;;;:::o;26678:127::-;26743:4;26795:1;26767:30;;:7;:16;26775:7;26767:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26760:37;;26678:127;;;:::o;16176:98::-;16229:7;16256:10;16249:17;;16176:98;:::o;30660:174::-;30762:2;30735:15;:24;30751:7;30735:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30818:7;30814:2;30780:46;;30789:23;30804:7;30789:14;:23::i;:::-;30780:46;;;;;;;;;;;;30660:174;;:::o;26972:348::-;27065:4;27090:16;27098:7;27090;:16::i;:::-;27082:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27166:13;27182:23;27197:7;27182:14;:23::i;:::-;27166:39;;27235:5;27224:16;;:7;:16;;;:51;;;;27268:7;27244:31;;:20;27256:7;27244:11;:20::i;:::-;:31;;;27224:51;:87;;;;27279:32;27296:5;27303:7;27279:16;:32::i;:::-;27224:87;27216:96;;;26972:348;;;;:::o;29964:578::-;30123:4;30096:31;;:23;30111:7;30096:14;:23::i;:::-;:31;;;30088:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30206:1;30192:16;;:2;:16;;;;30184:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30262:39;30283:4;30289:2;30293:7;30262:20;:39::i;:::-;30366:29;30383:1;30387:7;30366:8;:29::i;:::-;30427:1;30408:9;:15;30418:4;30408:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30456:1;30439:9;:13;30449:2;30439:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30487:2;30468:7;:16;30476:7;30468:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30526:7;30522:2;30507:27;;30516:4;30507:27;;;;;;;;;;;;29964:578;;;:::o;35001:173::-;35057:16;35076:6;;;;;;;;;;;35057:25;;35102:8;35093:6;;:17;;;;;;;;;;;;;;;;;;35157:8;35126:40;;35147:8;35126:40;;;;;;;;;;;;35001:173;;:::o;27662:110::-;27738:26;27748:2;27752:7;27738:26;;;;;;;;;;;;:9;:26::i;:::-;27662:110;;:::o;26050:315::-;26207:28;26217:4;26223:2;26227:7;26207:9;:28::i;:::-;26254:48;26277:4;26283:2;26287:7;26296:5;26254:22;:48::i;:::-;26246:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26050:315;;;;:::o;44896:117::-;44956:13;44989:16;44982:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44896:117;:::o;16714:723::-;16770:13;17000:1;16991:5;:10;16987:53;;;17018:10;;;;;;;;;;;;;;;;;;;;;16987:53;17050:12;17065:5;17050:20;;17081:14;17106:78;17121:1;17113:4;:9;17106:78;;17139:8;;;;;:::i;:::-;;;;17170:2;17162:10;;;;;:::i;:::-;;;17106:78;;;17194:19;17226:6;17216:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17194:39;;17244:154;17260:1;17251:5;:10;17244:154;;17288:1;17278:11;;;;;:::i;:::-;;;17355:2;17347:5;:10;;;;:::i;:::-;17334:2;:24;;;;:::i;:::-;17321:39;;17304:6;17311;17304:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17384:2;17375:11;;;;;:::i;:::-;;;17244:154;;;17422:6;17408:21;;;;;16714:723;;;;:::o;20780:305::-;20882:4;20934:25;20919:40;;;:11;:40;;;;:105;;;;20991:33;20976:48;;;:11;:48;;;;20919:105;:158;;;;21041:36;21065:11;21041:23;:36::i;:::-;20919:158;20899:178;;20780:305;;;:::o;44177:181::-;44305:45;44332:4;44338:2;44342:7;44305:26;:45::i;:::-;44177:181;;;:::o;27999:321::-;28129:18;28135:2;28139:7;28129:5;:18::i;:::-;28180:54;28211:1;28215:2;28219:7;28228:5;28180:22;:54::i;:::-;28158:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27999:321;;;:::o;31399:799::-;31554:4;31575:15;:2;:13;;;:15::i;:::-;31571:620;;;31627:2;31611:36;;;31648:12;:10;:12::i;:::-;31662:4;31668:7;31677:5;31611:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31607:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31870:1;31853:6;:13;:18;31849:272;;;31896:60;;;;;;;;;;:::i;:::-;;;;;;;;31849:272;32071:6;32065:13;32056:6;32052:2;32048:15;32041:38;31607:529;31744:41;;;31734:51;;;:6;:51;;;;31727:58;;;;;31571:620;32175:4;32168:11;;31399:799;;;;;;;:::o;19284:157::-;19369:4;19408:25;19393:40;;;:11;:40;;;;19386:47;;19284:157;;;:::o;38897:589::-;39041:45;39068:4;39074:2;39078:7;39041:26;:45::i;:::-;39119:1;39103:18;;:4;:18;;;39099:187;;;39138:40;39170:7;39138:31;:40::i;:::-;39099:187;;;39208:2;39200:10;;:4;:10;;;39196:90;;39227:47;39260:4;39266:7;39227:32;:47::i;:::-;39196:90;39099:187;39314:1;39300:16;;:2;:16;;;39296:183;;;39333:45;39370:7;39333:36;:45::i;:::-;39296:183;;;39406:4;39400:10;;:2;:10;;;39396:83;;39427:40;39455:2;39459:7;39427:27;:40::i;:::-;39396:83;39296:183;38897:589;;;:::o;28656:382::-;28750:1;28736:16;;:2;:16;;;;28728:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28809:16;28817:7;28809;:16::i;:::-;28808:17;28800:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28871:45;28900:1;28904:2;28908:7;28871:20;:45::i;:::-;28946:1;28929:9;:13;28939:2;28929:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28977:2;28958:7;:16;28966:7;28958:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29022:7;29018:2;28997:33;;29014:1;28997:33;;;;;;;;;;;;28656:382;;:::o;8207:387::-;8267:4;8475:12;8542:7;8530:20;8522:28;;8585:1;8578:4;:8;8571:15;;;8207:387;;;:::o;32770:126::-;;;;:::o;40209:164::-;40313:10;:17;;;;40286:15;:24;40302:7;40286:24;;;;;;;;;;;:44;;;;40341:10;40357:7;40341:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40209:164;:::o;41000:988::-;41266:22;41316:1;41291:22;41308:4;41291:16;:22::i;:::-;:26;;;;:::i;:::-;41266:51;;41328:18;41349:17;:26;41367:7;41349:26;;;;;;;;;;;;41328:47;;41496:14;41482:10;:28;41478:328;;41527:19;41549:12;:18;41562:4;41549:18;;;;;;;;;;;;;;;:34;41568:14;41549:34;;;;;;;;;;;;41527:56;;41633:11;41600:12;:18;41613:4;41600:18;;;;;;;;;;;;;;;:30;41619:10;41600:30;;;;;;;;;;;:44;;;;41750:10;41717:17;:30;41735:11;41717:30;;;;;;;;;;;:43;;;;41478:328;;41902:17;:26;41920:7;41902:26;;;;;;;;;;;41895:33;;;41946:12;:18;41959:4;41946:18;;;;;;;;;;;;;;;:34;41965:14;41946:34;;;;;;;;;;;41939:41;;;41000:988;;;;:::o;42283:1079::-;42536:22;42581:1;42561:10;:17;;;;:21;;;;:::i;:::-;42536:46;;42593:18;42614:15;:24;42630:7;42614:24;;;;;;;;;;;;42593:45;;42965:19;42987:10;42998:14;42987:26;;;;;;;;;;;;;;;;;;;;;;;;42965:48;;43051:11;43026:10;43037;43026:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;43162:10;43131:15;:28;43147:11;43131:28;;;;;;;;;;;:41;;;;43303:15;:24;43319:7;43303:24;;;;;;;;;;;43296:31;;;43338:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42283:1079;;;;:::o;39787:221::-;39872:14;39889:20;39906:2;39889:16;:20::i;:::-;39872:37;;39947:7;39920:12;:16;39933:2;39920:16;;;;;;;;;;;;;;;:24;39937:6;39920:24;;;;;;;;;;;:34;;;;39994:6;39965:17;:26;39983:7;39965:26;;;;;;;;;;;:35;;;;39787:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:395::-;;;5000:2;4988:9;4979:7;4975:23;4971:32;4968:2;;;5016:1;5013;5006:12;4968:2;5059:1;5084:50;5126:7;5117:6;5106:9;5102:22;5084:50;:::i;:::-;5074:60;;5030:114;5183:2;5209:50;5251:7;5242:6;5231:9;5227:22;5209:50;:::i;:::-;5199:60;;5154:115;4958:318;;;;;:::o;5282:260::-;;5389:2;5377:9;5368:7;5364:23;5360:32;5357:2;;;5405:1;5402;5395:12;5357:2;5448:1;5473:52;5517:7;5508:6;5497:9;5493:22;5473:52;:::i;:::-;5463:62;;5419:116;5347:195;;;;:::o;5548:282::-;;5666:2;5654:9;5645:7;5641:23;5637:32;5634:2;;;5682:1;5679;5672:12;5634:2;5725:1;5750:63;5805:7;5796:6;5785:9;5781:22;5750:63;:::i;:::-;5740:73;;5696:127;5624:206;;;;:::o;5836:375::-;;5954:2;5942:9;5933:7;5929:23;5925:32;5922:2;;;5970:1;5967;5960:12;5922:2;6041:1;6030:9;6026:17;6013:31;6071:18;6063:6;6060:30;6057:2;;;6103:1;6100;6093:12;6057:2;6131:63;6186:7;6177:6;6166:9;6162:22;6131:63;:::i;:::-;6121:73;;5984:220;5912:299;;;;:::o;6217:262::-;;6325:2;6313:9;6304:7;6300:23;6296:32;6293:2;;;6341:1;6338;6331:12;6293:2;6384:1;6409:53;6454:7;6445:6;6434:9;6430:22;6409:53;:::i;:::-;6399:63;;6355:117;6283:196;;;;:::o;6485:179::-;;6575:46;6617:3;6609:6;6575:46;:::i;:::-;6653:4;6648:3;6644:14;6630:28;;6565:99;;;;:::o;6670:118::-;6757:24;6775:5;6757:24;:::i;:::-;6752:3;6745:37;6735:53;;:::o;6824:732::-;;6972:54;7020:5;6972:54;:::i;:::-;7042:86;7121:6;7116:3;7042:86;:::i;:::-;7035:93;;7152:56;7202:5;7152:56;:::i;:::-;7231:7;7262:1;7247:284;7272:6;7269:1;7266:13;7247:284;;;7348:6;7342:13;7375:63;7434:3;7419:13;7375:63;:::i;:::-;7368:70;;7461:60;7514:6;7461:60;:::i;:::-;7451:70;;7307:224;7294:1;7291;7287:9;7282:14;;7247:284;;;7251:14;7547:3;7540:10;;6948:608;;;;;;;:::o;7562:109::-;7643:21;7658:5;7643:21;:::i;:::-;7638:3;7631:34;7621:50;;:::o;7677:360::-;;7791:38;7823:5;7791:38;:::i;:::-;7845:70;7908:6;7903:3;7845:70;:::i;:::-;7838:77;;7924:52;7969:6;7964:3;7957:4;7950:5;7946:16;7924:52;:::i;:::-;8001:29;8023:6;8001:29;:::i;:::-;7996:3;7992:39;7985:46;;7767:270;;;;;:::o;8043:364::-;;8159:39;8192:5;8159:39;:::i;:::-;8214:71;8278:6;8273:3;8214:71;:::i;:::-;8207:78;;8294:52;8339:6;8334:3;8327:4;8320:5;8316:16;8294:52;:::i;:::-;8371:29;8393:6;8371:29;:::i;:::-;8366:3;8362:39;8355:46;;8135:272;;;;;:::o;8413:377::-;;8547:39;8580:5;8547:39;:::i;:::-;8602:89;8684:6;8679:3;8602:89;:::i;:::-;8595:96;;8700:52;8745:6;8740:3;8733:4;8726:5;8722:16;8700:52;:::i;:::-;8777:6;8772:3;8768:16;8761:23;;8523:267;;;;;:::o;8796:375::-;;8959:67;9023:2;9018:3;8959:67;:::i;:::-;8952:74;;9056:34;9052:1;9047:3;9043:11;9036:55;9122:13;9117:2;9112:3;9108:12;9101:35;9162:2;9157:3;9153:12;9146:19;;8942:229;;;:::o;9177:382::-;;9340:67;9404:2;9399:3;9340:67;:::i;:::-;9333:74;;9437:34;9433:1;9428:3;9424:11;9417:55;9503:20;9498:2;9493:3;9489:12;9482:42;9550:2;9545:3;9541:12;9534:19;;9323:236;;;:::o;9565:370::-;;9728:67;9792:2;9787:3;9728:67;:::i;:::-;9721:74;;9825:34;9821:1;9816:3;9812:11;9805:55;9891:8;9886:2;9881:3;9877:12;9870:30;9926:2;9921:3;9917:12;9910:19;;9711:224;;;:::o;9941:326::-;;10104:67;10168:2;10163:3;10104:67;:::i;:::-;10097:74;;10201:30;10197:1;10192:3;10188:11;10181:51;10258:2;10253:3;10249:12;10242:19;;10087:180;;;:::o;10273:368::-;;10436:67;10500:2;10495:3;10436:67;:::i;:::-;10429:74;;10533:34;10529:1;10524:3;10520:11;10513:55;10599:6;10594:2;10589:3;10585:12;10578:28;10632:2;10627:3;10623:12;10616:19;;10419:222;;;:::o;10647:323::-;;10810:67;10874:2;10869:3;10810:67;:::i;:::-;10803:74;;10907:27;10903:1;10898:3;10894:11;10887:48;10961:2;10956:3;10952:12;10945:19;;10793:177;;;:::o;10976:329::-;;11139:67;11203:2;11198:3;11139:67;:::i;:::-;11132:74;;11236:33;11232:1;11227:3;11223:11;11216:54;11296:2;11291:3;11287:12;11280:19;;11122:183;;;:::o;11311:366::-;;11474:67;11538:2;11533:3;11474:67;:::i;:::-;11467:74;;11571:34;11567:1;11562:3;11558:11;11551:55;11637:4;11632:2;11627:3;11623:12;11616:26;11668:2;11663:3;11659:12;11652:19;;11457:220;;;:::o;11683:376::-;;11846:67;11910:2;11905:3;11846:67;:::i;:::-;11839:74;;11943:34;11939:1;11934:3;11930:11;11923:55;12009:14;12004:2;11999:3;11995:12;11988:36;12050:2;12045:3;12041:12;12034:19;;11829:230;;;:::o;12065:388::-;;12228:67;12292:2;12287:3;12228:67;:::i;:::-;12221:74;;12325:34;12321:1;12316:3;12312:11;12305:55;12391:26;12386:2;12381:3;12377:12;12370:48;12444:2;12439:3;12435:12;12428:19;;12211:242;;;:::o;12459:374::-;;12622:67;12686:2;12681:3;12622:67;:::i;:::-;12615:74;;12719:34;12715:1;12710:3;12706:11;12699:55;12785:12;12780:2;12775:3;12771:12;12764:34;12824:2;12819:3;12815:12;12808:19;;12605:228;;;:::o;12839:373::-;;13002:67;13066:2;13061:3;13002:67;:::i;:::-;12995:74;;13099:34;13095:1;13090:3;13086:11;13079:55;13165:11;13160:2;13155:3;13151:12;13144:33;13203:2;13198:3;13194:12;13187:19;;12985:227;;;:::o;13218:374::-;;13381:67;13445:2;13440:3;13381:67;:::i;:::-;13374:74;;13478:34;13474:1;13469:3;13465:11;13458:55;13544:12;13539:2;13534:3;13530:12;13523:34;13583:2;13578:3;13574:12;13567:19;;13364:228;;;:::o;13598:330::-;;13761:67;13825:2;13820:3;13761:67;:::i;:::-;13754:74;;13858:34;13854:1;13849:3;13845:11;13838:55;13919:2;13914:3;13910:12;13903:19;;13744:184;;;:::o;13934:376::-;;14097:67;14161:2;14156:3;14097:67;:::i;:::-;14090:74;;14194:34;14190:1;14185:3;14181:11;14174:55;14260:14;14255:2;14250:3;14246:12;14239:36;14301:2;14296:3;14292:12;14285:19;;14080:230;;;:::o;14316:330::-;;14479:67;14543:2;14538:3;14479:67;:::i;:::-;14472:74;;14576:34;14572:1;14567:3;14563:11;14556:55;14637:2;14632:3;14628:12;14621:19;;14462:184;;;:::o;14652:373::-;;14815:67;14879:2;14874:3;14815:67;:::i;:::-;14808:74;;14912:34;14908:1;14903:3;14899:11;14892:55;14978:11;14973:2;14968:3;14964:12;14957:33;15016:2;15011:3;15007:12;15000:19;;14798:227;;;:::o;15031:379::-;;15194:67;15258:2;15253:3;15194:67;:::i;:::-;15187:74;;15291:34;15287:1;15282:3;15278:11;15271:55;15357:17;15352:2;15347:3;15343:12;15336:39;15401:2;15396:3;15392:12;15385:19;;15177:233;;;:::o;15416:369::-;;15579:67;15643:2;15638:3;15579:67;:::i;:::-;15572:74;;15676:34;15672:1;15667:3;15663:11;15656:55;15742:7;15737:2;15732:3;15728:12;15721:29;15776:2;15771:3;15767:12;15760:19;;15562:223;;;:::o;15791:365::-;;15954:67;16018:2;16013:3;15954:67;:::i;:::-;15947:74;;16051:34;16047:1;16042:3;16038:11;16031:55;16117:3;16112:2;16107:3;16103:12;16096:25;16147:2;16142:3;16138:12;16131:19;;15937:219;;;:::o;16162:325::-;;16325:67;16389:2;16384:3;16325:67;:::i;:::-;16318:74;;16422:29;16418:1;16413:3;16409:11;16402:50;16478:2;16473:3;16469:12;16462:19;;16308:179;;;:::o;16493:381::-;;16656:67;16720:2;16715:3;16656:67;:::i;:::-;16649:74;;16753:34;16749:1;16744:3;16740:11;16733:55;16819:19;16814:2;16809:3;16805:12;16798:41;16865:2;16860:3;16856:12;16849:19;;16639:235;;;:::o;16880:376::-;;17043:67;17107:2;17102:3;17043:67;:::i;:::-;17036:74;;17140:34;17136:1;17131:3;17127:11;17120:55;17206:14;17201:2;17196:3;17192:12;17185:36;17247:2;17242:3;17238:12;17231:19;;17026:230;;;:::o;17262:108::-;17339:24;17357:5;17339:24;:::i;:::-;17334:3;17327:37;17317:53;;:::o;17376:118::-;17463:24;17481:5;17463:24;:::i;:::-;17458:3;17451:37;17441:53;;:::o;17500:435::-;;17702:95;17793:3;17784:6;17702:95;:::i;:::-;17695:102;;17814:95;17905:3;17896:6;17814:95;:::i;:::-;17807:102;;17926:3;17919:10;;17684:251;;;;;:::o;17941:222::-;;18072:2;18061:9;18057:18;18049:26;;18085:71;18153:1;18142:9;18138:17;18129:6;18085:71;:::i;:::-;18039:124;;;;:::o;18169:640::-;;18402:3;18391:9;18387:19;18379:27;;18416:71;18484:1;18473:9;18469:17;18460:6;18416:71;:::i;:::-;18497:72;18565:2;18554:9;18550:18;18541:6;18497:72;:::i;:::-;18579;18647:2;18636:9;18632:18;18623:6;18579:72;:::i;:::-;18698:9;18692:4;18688:20;18683:2;18672:9;18668:18;18661:48;18726:76;18797:4;18788:6;18726:76;:::i;:::-;18718:84;;18369:440;;;;;;;:::o;18815:373::-;;18996:2;18985:9;18981:18;18973:26;;19045:9;19039:4;19035:20;19031:1;19020:9;19016:17;19009:47;19073:108;19176:4;19167:6;19073:108;:::i;:::-;19065:116;;18963:225;;;;:::o;19194:210::-;;19319:2;19308:9;19304:18;19296:26;;19332:65;19394:1;19383:9;19379:17;19370:6;19332:65;:::i;:::-;19286:118;;;;:::o;19410:313::-;;19561:2;19550:9;19546:18;19538:26;;19610:9;19604:4;19600:20;19596:1;19585:9;19581:17;19574:47;19638:78;19711:4;19702:6;19638:78;:::i;:::-;19630:86;;19528:195;;;;:::o;19729:419::-;;19933:2;19922:9;19918:18;19910:26;;19982:9;19976:4;19972:20;19968:1;19957:9;19953:17;19946:47;20010:131;20136:4;20010:131;:::i;:::-;20002:139;;19900:248;;;:::o;20154:419::-;;20358:2;20347:9;20343:18;20335:26;;20407:9;20401:4;20397:20;20393:1;20382:9;20378:17;20371:47;20435:131;20561:4;20435:131;:::i;:::-;20427:139;;20325:248;;;:::o;20579:419::-;;20783:2;20772:9;20768:18;20760:26;;20832:9;20826:4;20822:20;20818:1;20807:9;20803:17;20796:47;20860:131;20986:4;20860:131;:::i;:::-;20852:139;;20750:248;;;:::o;21004:419::-;;21208:2;21197:9;21193:18;21185:26;;21257:9;21251:4;21247:20;21243:1;21232:9;21228:17;21221:47;21285:131;21411:4;21285:131;:::i;:::-;21277:139;;21175:248;;;:::o;21429:419::-;;21633:2;21622:9;21618:18;21610:26;;21682:9;21676:4;21672:20;21668:1;21657:9;21653:17;21646:47;21710:131;21836:4;21710:131;:::i;:::-;21702:139;;21600:248;;;:::o;21854:419::-;;22058:2;22047:9;22043:18;22035:26;;22107:9;22101:4;22097:20;22093:1;22082:9;22078:17;22071:47;22135:131;22261:4;22135:131;:::i;:::-;22127:139;;22025:248;;;:::o;22279:419::-;;22483:2;22472:9;22468:18;22460:26;;22532:9;22526:4;22522:20;22518:1;22507:9;22503:17;22496:47;22560:131;22686:4;22560:131;:::i;:::-;22552:139;;22450:248;;;:::o;22704:419::-;;22908:2;22897:9;22893:18;22885:26;;22957:9;22951:4;22947:20;22943:1;22932:9;22928:17;22921:47;22985:131;23111:4;22985:131;:::i;:::-;22977:139;;22875:248;;;:::o;23129:419::-;;23333:2;23322:9;23318:18;23310:26;;23382:9;23376:4;23372:20;23368:1;23357:9;23353:17;23346:47;23410:131;23536:4;23410:131;:::i;:::-;23402:139;;23300:248;;;:::o;23554:419::-;;23758:2;23747:9;23743:18;23735:26;;23807:9;23801:4;23797:20;23793:1;23782:9;23778:17;23771:47;23835:131;23961:4;23835:131;:::i;:::-;23827:139;;23725:248;;;:::o;23979:419::-;;24183:2;24172:9;24168:18;24160:26;;24232:9;24226:4;24222:20;24218:1;24207:9;24203:17;24196:47;24260:131;24386:4;24260:131;:::i;:::-;24252:139;;24150:248;;;:::o;24404:419::-;;24608:2;24597:9;24593:18;24585:26;;24657:9;24651:4;24647:20;24643:1;24632:9;24628:17;24621:47;24685:131;24811:4;24685:131;:::i;:::-;24677:139;;24575:248;;;:::o;24829:419::-;;25033:2;25022:9;25018:18;25010:26;;25082:9;25076:4;25072:20;25068:1;25057:9;25053:17;25046:47;25110:131;25236:4;25110:131;:::i;:::-;25102:139;;25000:248;;;:::o;25254:419::-;;25458:2;25447:9;25443:18;25435:26;;25507:9;25501:4;25497:20;25493:1;25482:9;25478:17;25471:47;25535:131;25661:4;25535:131;:::i;:::-;25527:139;;25425:248;;;:::o;25679:419::-;;25883:2;25872:9;25868:18;25860:26;;25932:9;25926:4;25922:20;25918:1;25907:9;25903:17;25896:47;25960:131;26086:4;25960:131;:::i;:::-;25952:139;;25850:248;;;:::o;26104:419::-;;26308:2;26297:9;26293:18;26285:26;;26357:9;26351:4;26347:20;26343:1;26332:9;26328:17;26321:47;26385:131;26511:4;26385:131;:::i;:::-;26377:139;;26275:248;;;:::o;26529:419::-;;26733:2;26722:9;26718:18;26710:26;;26782:9;26776:4;26772:20;26768:1;26757:9;26753:17;26746:47;26810:131;26936:4;26810:131;:::i;:::-;26802:139;;26700:248;;;:::o;26954:419::-;;27158:2;27147:9;27143:18;27135:26;;27207:9;27201:4;27197:20;27193:1;27182:9;27178:17;27171:47;27235:131;27361:4;27235:131;:::i;:::-;27227:139;;27125:248;;;:::o;27379:419::-;;27583:2;27572:9;27568:18;27560:26;;27632:9;27626:4;27622:20;27618:1;27607:9;27603:17;27596:47;27660:131;27786:4;27660:131;:::i;:::-;27652:139;;27550:248;;;:::o;27804:419::-;;28008:2;27997:9;27993:18;27985:26;;28057:9;28051:4;28047:20;28043:1;28032:9;28028:17;28021:47;28085:131;28211:4;28085:131;:::i;:::-;28077:139;;27975:248;;;:::o;28229:419::-;;28433:2;28422:9;28418:18;28410:26;;28482:9;28476:4;28472:20;28468:1;28457:9;28453:17;28446:47;28510:131;28636:4;28510:131;:::i;:::-;28502:139;;28400:248;;;:::o;28654:419::-;;28858:2;28847:9;28843:18;28835:26;;28907:9;28901:4;28897:20;28893:1;28882:9;28878:17;28871:47;28935:131;29061:4;28935:131;:::i;:::-;28927:139;;28825:248;;;:::o;29079:419::-;;29283:2;29272:9;29268:18;29260:26;;29332:9;29326:4;29322:20;29318:1;29307:9;29303:17;29296:47;29360:131;29486:4;29360:131;:::i;:::-;29352:139;;29250:248;;;:::o;29504:222::-;;29635:2;29624:9;29620:18;29612:26;;29648:71;29716:1;29705:9;29701:17;29692:6;29648:71;:::i;:::-;29602:124;;;;:::o;29732:283::-;;29798:2;29792:9;29782:19;;29840:4;29832:6;29828:17;29947:6;29935:10;29932:22;29911:18;29899:10;29896:34;29893:62;29890:2;;;29958:18;;:::i;:::-;29890:2;29998:10;29994:2;29987:22;29772:243;;;;:::o;30021:331::-;;30172:18;30164:6;30161:30;30158:2;;;30194:18;;:::i;:::-;30158:2;30279:4;30275:9;30268:4;30260:6;30256:17;30252:33;30244:41;;30340:4;30334;30330:15;30322:23;;30087:265;;;:::o;30358:332::-;;30510:18;30502:6;30499:30;30496:2;;;30532:18;;:::i;:::-;30496:2;30617:4;30613:9;30606:4;30598:6;30594:17;30590:33;30582:41;;30678:4;30672;30668:15;30660:23;;30425:265;;;:::o;30696:132::-;;30786:3;30778:11;;30816:4;30811:3;30807:14;30799:22;;30768:60;;;:::o;30834:114::-;;30935:5;30929:12;30919:22;;30908:40;;;:::o;30954:98::-;;31039:5;31033:12;31023:22;;31012:40;;;:::o;31058:99::-;;31144:5;31138:12;31128:22;;31117:40;;;:::o;31163:113::-;;31265:4;31260:3;31256:14;31248:22;;31238:38;;;:::o;31282:184::-;;31415:6;31410:3;31403:19;31455:4;31450:3;31446:14;31431:29;;31393:73;;;;:::o;31472:168::-;;31589:6;31584:3;31577:19;31629:4;31624:3;31620:14;31605:29;;31567:73;;;;:::o;31646:169::-;;31764:6;31759:3;31752:19;31804:4;31799:3;31795:14;31780:29;;31742:73;;;;:::o;31821:148::-;;31960:3;31945:18;;31935:34;;;;:::o;31975:305::-;;32034:20;32052:1;32034:20;:::i;:::-;32029:25;;32068:20;32086:1;32068:20;:::i;:::-;32063:25;;32222:1;32154:66;32150:74;32147:1;32144:81;32141:2;;;32228:18;;:::i;:::-;32141:2;32272:1;32269;32265:9;32258:16;;32019:261;;;;:::o;32286:185::-;;32343:20;32361:1;32343:20;:::i;:::-;32338:25;;32377:20;32395:1;32377:20;:::i;:::-;32372:25;;32416:1;32406:2;;32421:18;;:::i;:::-;32406:2;32463:1;32460;32456:9;32451:14;;32328:143;;;;:::o;32477:348::-;;32540:20;32558:1;32540:20;:::i;:::-;32535:25;;32574:20;32592:1;32574:20;:::i;:::-;32569:25;;32762:1;32694:66;32690:74;32687:1;32684:81;32679:1;32672:9;32665:17;32661:105;32658:2;;;32769:18;;:::i;:::-;32658:2;32817:1;32814;32810:9;32799:20;;32525:300;;;;:::o;32831:191::-;;32891:20;32909:1;32891:20;:::i;:::-;32886:25;;32925:20;32943:1;32925:20;:::i;:::-;32920:25;;32964:1;32961;32958:8;32955:2;;;32969:18;;:::i;:::-;32955:2;33014:1;33011;33007:9;32999:17;;32876:146;;;;:::o;33028:96::-;;33094:24;33112:5;33094:24;:::i;:::-;33083:35;;33073:51;;;:::o;33130:90::-;;33207:5;33200:13;33193:21;33182:32;;33172:48;;;:::o;33226:149::-;;33302:66;33295:5;33291:78;33280:89;;33270:105;;;:::o;33381:126::-;;33458:42;33451:5;33447:54;33436:65;;33426:81;;;:::o;33513:77::-;;33579:5;33568:16;;33558:32;;;:::o;33596:154::-;33680:6;33675:3;33670;33657:30;33742:1;33733:6;33728:3;33724:16;33717:27;33647:103;;;:::o;33756:307::-;33824:1;33834:113;33848:6;33845:1;33842:13;33834:113;;;33933:1;33928:3;33924:11;33918:18;33914:1;33909:3;33905:11;33898:39;33870:2;33867:1;33863:10;33858:15;;33834:113;;;33965:6;33962:1;33959:13;33956:2;;;34045:1;34036:6;34031:3;34027:16;34020:27;33956:2;33805:258;;;;:::o;34069:320::-;;34150:1;34144:4;34140:12;34130:22;;34197:1;34191:4;34187:12;34218:18;34208:2;;34274:4;34266:6;34262:17;34252:27;;34208:2;34336;34328:6;34325:14;34305:18;34302:38;34299:2;;;34355:18;;:::i;:::-;34299:2;34120:269;;;;:::o;34395:233::-;;34457:24;34475:5;34457:24;:::i;:::-;34448:33;;34503:66;34496:5;34493:77;34490:2;;;34573:18;;:::i;:::-;34490:2;34620:1;34613:5;34609:13;34602:20;;34438:190;;;:::o;34634:176::-;;34683:20;34701:1;34683:20;:::i;:::-;34678:25;;34717:20;34735:1;34717:20;:::i;:::-;34712:25;;34756:1;34746:2;;34761:18;;:::i;:::-;34746:2;34802:1;34799;34795:9;34790:14;;34668:142;;;;:::o;34816:180::-;34864:77;34861:1;34854:88;34961:4;34958:1;34951:15;34985:4;34982:1;34975:15;35002:180;35050:77;35047:1;35040:88;35147:4;35144:1;35137:15;35171:4;35168:1;35161:15;35188:180;35236:77;35233:1;35226:88;35333:4;35330:1;35323:15;35357:4;35354:1;35347:15;35374:180;35422:77;35419:1;35412:88;35519:4;35516:1;35509:15;35543:4;35540:1;35533:15;35560:102;;35652:2;35648:7;35643:2;35636:5;35632:14;35628:28;35618:38;;35608:54;;;:::o;35668:122::-;35741:24;35759:5;35741:24;:::i;:::-;35734:5;35731:35;35721:2;;35780:1;35777;35770:12;35721:2;35711:79;:::o;35796:116::-;35866:21;35881:5;35866:21;:::i;:::-;35859:5;35856:32;35846:2;;35902:1;35899;35892:12;35846:2;35836:76;:::o;35918:120::-;35990:23;36007:5;35990:23;:::i;:::-;35983:5;35980:34;35970:2;;36028:1;36025;36018:12;35970:2;35960:78;:::o;36044:122::-;36117:24;36135:5;36117:24;:::i;:::-;36110:5;36107:35;36097:2;;36156:1;36153;36146:12;36097:2;36087:79;:::o

Swarm Source

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