ETH Price: $2,601.65 (-0.63%)

Token

Metaani Contest Season1 (MCS1)
 

Overview

Max Total Supply

100 MCS1

Holders

90

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 MCS1
0xa7eeb43806a235f717ca3e6f4bdef80047e71f79
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
MetaaniContestSeason1

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 11 of 13: MetaaniContestSeason1.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
import "./ERC721.sol";

import "./Ownable.sol";

import "./IConataNFT.sol";

// 
contract MetaaniContestSeason1 is IConataNFT, ERC721, Ownable{
    uint public limitedAmount = 100;
    uint public  tokenIdCount = 1;
    uint private _mintedAmount = 0;
    uint private _burnedAmount = 0;
    string private _ipfs_base = "ipfs://QmcpSsbQuQb6Z8CaSyjv26eVC1wCbMVVz2k3CRBFykBei9/";
    //
    address constant fundsWallet           = 0x8837391C2634b62C4fCF4f0b01F0772A743A4Cf3;
    address constant fundsRescueSpareKey   = 0xbDc378A75Fe1d1b53AdB3025541174B79474845b;
    address constant fundsRescueDestWallet = 0xeecE4544101f7C7198157c74A1cBfE12aa86718B;
    //
    constructor() ERC721("Metaani Contest Season1", "MCS1") {}

    
    //
    function mint(bytes calldata data) override(IConataNFT) external payable{
        revert("Not Implement");
    }
    function mint() override(IConataNFT) external payable{
        revert("Not Implement");
    }
    //
    function getOpenedMintTermNames() override(IConataNFT) external view returns(string[] memory){
        revert("Not Implement");
    }


    

    
    function totalSupply() override(IConataNFT) external view returns(uint256){
        return _mintedAmount - _burnedAmount;
    }

    //
    function burn(uint tokenId, bytes calldata data) override(IConataNFT) external{
        require(_msgSender() == ownerOf(tokenId), "Not Owner Of Token");
        _burn(tokenId);
        _burnedAmount++;
    }


    

    //
    function _baseURI() internal view override(ERC721) returns (string memory) {
        return _ipfs_base;
    }
    
    //
    function _minter(address account) internal{
        require(_mintedAmount < limitedAmount, "Limited Amount");
        _safeMint( account , tokenIdCount);
        tokenIdCount++;
        _mintedAmount++;
    }

    

    
    function giveaway(address[] memory accounts, uint len) external onlyOwner{
        require(accounts.length == len, "Invalid Length");
        for(uint i=0; i < len; i++){
            _minter(accounts[i]);
        }
    }

    
    function setLimitedAmount(uint amount) external onlyOwner{
        limitedAmount = amount;
    }

    
    function setURI(string memory newURI) override(IConataNFT) external onlyOwner {
        _ipfs_base = newURI;
    }

    //
    function withdraw() override(IConataNFT) external {
        require(_msgSender() == fundsWallet);
        uint balance = address(this).balance;
        payable(fundsWallet).transfer(balance);
    }
    function withdrawSpare() override(IConataNFT) external {
        require(_msgSender() == fundsRescueSpareKey);
        uint balance = address(this).balance;
        payable(fundsRescueDestWallet).transfer(balance);
    }

}

File 1 of 13: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

File 2 of 13: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 3 of 13: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;
import "./IERC165.sol";

/**
 * @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 4 of 13: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;
import "./IERC721.sol";

import "./IERC721Receiver.sol";

import "./IERC721Metadata.sol";

import "./Address.sol";

import "./Context.sol";

import "./Strings.sol";

import "./ERC165.sol";

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721: invalid token ID");
        return owner;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

    /**
     * @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 _ownerOf(tokenId) != address(0);
    }

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

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

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

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

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

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

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

        _afterTokenTransfer(address(0), to, tokenId, 1);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

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

        _afterTokenTransfer(owner, address(0), tokenId, 1);
    }

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

        _beforeTokenTransfer(from, to, tokenId, 1);

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

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

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

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

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256, /* firstTokenId */
        uint256 batchSize
    ) internal virtual {
        if (batchSize > 1) {
            if (from != address(0)) {
                _balances[from] -= batchSize;
            }
            if (to != address(0)) {
                _balances[to] += batchSize;
            }
        }
    }

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}
}

File 5 of 13: IConataNFT.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;







//       - ethers-v6: contract.mint(ethers.Typed.bytes("0x00"));
//       - ethers-v5: contract["mint(bytes)"]([0x00]);

//       - `ethers.utils.defaultAbiCoder.encode(["uint", "string"], [888, "Takechy"]);`
//       - `AbiCoder.defaultAbiCoder().encode(["uint", "string"], [888, "Takechy"])`






//
interface IConataNFT{
    event Log(string message);
    event Minted(address account, uint tokenId);
    event ChangedMintTerm(string termName);

    // WRITE ////////////////////////////////////////////////////////////////////////////

    
    function mint(bytes calldata data) external payable;
    function mint() external payable;

    
    function burn(uint tokenId, bytes calldata data) external;

    
    function setURI(string memory newURI) external;
    
    
    function withdraw() external;
    function withdrawSpare() external;
    
    // READ ////////////////////////////////////////////////////////////////////////////

    
    function getOpenedMintTermNames() view external returns(string[] memory);

    
    function totalSupply() external view returns (uint256);

}

File 6 of 13: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 7 of 13: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;
import "./IERC165.sol";

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

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

File 8 of 13: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;
import "./IERC721.sol";

/**
 * @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 9 of 13: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 10 of 13: Math.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

File 12 of 13: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;
import "./Context.sol";

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

File 13 of 13: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;
import "./Math.sol";

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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":false,"internalType":"string","name":"termName","type":"string"}],"name":"ChangedMintTerm","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"message","type":"string"}],"name":"Log","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"burn","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":[],"name":"getOpenedMintTermNames","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256","name":"len","type":"uint256"}],"name":"giveaway","outputs":[],"stateMutability":"nonpayable","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":"limitedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mint","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setLimitedAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setURI","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":[],"name":"tokenIdCount","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"},{"inputs":[],"name":"withdrawSpare","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526064600755600160085560006009556000600a556040518060600160405280603681526020016200410a60369139600b908162000042919062000451565b503480156200005057600080fd5b506040518060400160405280601781526020017f4d657461616e6920436f6e7465737420536561736f6e310000000000000000008152506040518060400160405280600481526020017f4d435331000000000000000000000000000000000000000000000000000000008152508160009081620000ce919062000451565b508060019081620000e0919062000451565b50505062000103620000f76200010960201b60201c565b6200011160201b60201c565b62000538565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200025957607f821691505b6020821081036200026f576200026e62000211565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200029a565b620002e586836200029a565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003326200032c6200032684620002fd565b62000307565b620002fd565b9050919050565b6000819050919050565b6200034e8362000311565b620003666200035d8262000339565b848454620002a7565b825550505050565b600090565b6200037d6200036e565b6200038a81848462000343565b505050565b5b81811015620003b257620003a660008262000373565b60018101905062000390565b5050565b601f8211156200040157620003cb8162000275565b620003d6846200028a565b81016020851015620003e6578190505b620003fe620003f5856200028a565b8301826200038f565b50505b505050565b600082821c905092915050565b6000620004266000198460080262000406565b1980831691505092915050565b600062000441838362000413565b9150826002028217905092915050565b6200045c82620001d7565b67ffffffffffffffff811115620004785762000477620001e2565b5b62000484825462000240565b62000491828285620003b6565b600060209050601f831160018114620004c95760008415620004b4578287015190505b620004c0858262000433565b86555062000530565b601f198416620004d98662000275565b60005b828110156200050357848901518255600182019150602085019450602081019050620004dc565b868310156200052357848901516200051f601f89168262000413565b8355505b6001600288020188555050505b505050505050565b613bc280620005486000396000f3fe6080604052600436106101b75760003560e01c80637ba0e2e7116100ec578063d4d8b3921161008a578063e985e9c511610064578063e985e9c5146105a2578063f127394c146105df578063f2fde38b1461060a578063fe9d930314610633576101b7565b8063d4d8b39214610537578063d65ae67714610560578063e875b7d014610577576101b7565b8063a06c7aab116100c6578063a06c7aab1461047f578063a22cb465146104a8578063b88d4fde146104d1578063c87b56dd146104fa576101b7565b80637ba0e2e71461040d5780638da5cb5b1461042957806395d89b4114610454576101b7565b806323b872dd1161015957806347ea4c6e1161013357806347ea4c6e146103515780636352211e1461037c57806370a08231146103b9578063715018a6146103f6576101b7565b806323b872dd146102e85780633ccfd60b1461031157806342842e0e14610328576101b7565b8063081812fc11610195578063081812fc1461024d578063095ea7b31461028a5780631249c58b146102b357806318160ddd146102bd576101b7565b806301ffc9a7146101bc57806302fe5305146101f957806306fdde0314610222575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612440565b61065c565b6040516101f09190612488565b60405180910390f35b34801561020557600080fd5b50610220600480360381019061021b91906125e9565b61073e565b005b34801561022e57600080fd5b50610237610759565b60405161024491906126b1565b60405180910390f35b34801561025957600080fd5b50610274600480360381019061026f9190612709565b6107eb565b6040516102819190612777565b60405180910390f35b34801561029657600080fd5b506102b160048036038101906102ac91906127be565b610831565b005b6102bb610948565b005b3480156102c957600080fd5b506102d2610983565b6040516102df919061280d565b60405180910390f35b3480156102f457600080fd5b5061030f600480360381019061030a9190612828565b61099a565b005b34801561031d57600080fd5b506103266109fa565b005b34801561033457600080fd5b5061034f600480360381019061034a9190612828565b610ab0565b005b34801561035d57600080fd5b50610366610ad0565b6040516103739190612987565b60405180910390f35b34801561038857600080fd5b506103a3600480360381019061039e9190612709565b610b0d565b6040516103b09190612777565b60405180910390f35b3480156103c557600080fd5b506103e060048036038101906103db91906129a9565b610b93565b6040516103ed919061280d565b60405180910390f35b34801561040257600080fd5b5061040b610c4a565b005b61042760048036038101906104229190612a36565b610c5e565b005b34801561043557600080fd5b5061043e610c99565b60405161044b9190612777565b60405180910390f35b34801561046057600080fd5b50610469610cc3565b60405161047691906126b1565b60405180910390f35b34801561048b57600080fd5b506104a660048036038101906104a19190612709565b610d55565b005b3480156104b457600080fd5b506104cf60048036038101906104ca9190612aaf565b610d67565b005b3480156104dd57600080fd5b506104f860048036038101906104f39190612b90565b610d7d565b005b34801561050657600080fd5b50610521600480360381019061051c9190612709565b610ddf565b60405161052e91906126b1565b60405180910390f35b34801561054357600080fd5b5061055e60048036038101906105599190612cd6565b610e47565b005b34801561056c57600080fd5b50610575610ed8565b005b34801561058357600080fd5b5061058c610f8e565b604051610599919061280d565b60405180910390f35b3480156105ae57600080fd5b506105c960048036038101906105c49190612d32565b610f94565b6040516105d69190612488565b60405180910390f35b3480156105eb57600080fd5b506105f4611028565b604051610601919061280d565b60405180910390f35b34801561061657600080fd5b50610631600480360381019061062c91906129a9565b61102e565b005b34801561063f57600080fd5b5061065a60048036038101906106559190612d72565b6110b1565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061072757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610737575061073682611154565b5b9050919050565b6107466111be565b80600b90816107559190612fde565b5050565b60606000805461076890612e01565b80601f016020809104026020016040519081016040528092919081815260200182805461079490612e01565b80156107e15780601f106107b6576101008083540402835291602001916107e1565b820191906000526020600020905b8154815290600101906020018083116107c457829003601f168201915b5050505050905090565b60006107f68261123c565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061083c82610b0d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a390613122565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108cb611287565b73ffffffffffffffffffffffffffffffffffffffff1614806108fa57506108f9816108f4611287565b610f94565b5b610939576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610930906131b4565b60405180910390fd5b610943838361128f565b505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097a90613220565b60405180910390fd5b6000600a54600954610995919061326f565b905090565b6109ab6109a5611287565b82611348565b6109ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e190613315565b60405180910390fd5b6109f58383836113dd565b505050565b738837391c2634b62c4fcf4f0b01f0772a743a4cf373ffffffffffffffffffffffffffffffffffffffff16610a2d611287565b73ffffffffffffffffffffffffffffffffffffffff1614610a4d57600080fd5b6000479050738837391c2634b62c4fcf4f0b01f0772a743a4cf373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610aac573d6000803e3d6000fd5b5050565b610acb83838360405180602001604052806000815250610d7d565b505050565b60606040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0490613220565b60405180910390fd5b600080610b19836116d6565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8190613381565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfa90613413565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c526111be565b610c5c6000611713565b565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9090613220565b60405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610cd290612e01565b80601f0160208091040260200160405190810160405280929190818152602001828054610cfe90612e01565b8015610d4b5780601f10610d2057610100808354040283529160200191610d4b565b820191906000526020600020905b815481529060010190602001808311610d2e57829003601f168201915b5050505050905090565b610d5d6111be565b8060078190555050565b610d79610d72611287565b83836117d9565b5050565b610d8e610d88611287565b83611348565b610dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc490613315565b60405180910390fd5b610dd984848484611945565b50505050565b6060610dea8261123c565b6000610df46119a1565b90506000815111610e145760405180602001604052806000815250610e3f565b80610e1e84611a33565b604051602001610e2f92919061346f565b6040516020818303038152906040525b915050919050565b610e4f6111be565b80825114610e92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e89906134df565b60405180910390fd5b60005b81811015610ed357610ec0838281518110610eb357610eb26134ff565b5b6020026020010151611b01565b8080610ecb9061352e565b915050610e95565b505050565b73bdc378a75fe1d1b53adb3025541174b79474845b73ffffffffffffffffffffffffffffffffffffffff16610f0b611287565b73ffffffffffffffffffffffffffffffffffffffff1614610f2b57600080fd5b600047905073eece4544101f7c7198157c74a1cbfe12aa86718b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f8a573d6000803e3d6000fd5b5050565b60075481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60085481565b6110366111be565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109c906135e8565b60405180910390fd5b6110ae81611713565b50565b6110ba83610b0d565b73ffffffffffffffffffffffffffffffffffffffff166110d8611287565b73ffffffffffffffffffffffffffffffffffffffff161461112e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112590613654565b60405180910390fd5b61113783611b86565b600a600081548092919061114a9061352e565b9190505550505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6111c6611287565b73ffffffffffffffffffffffffffffffffffffffff166111e4610c99565b73ffffffffffffffffffffffffffffffffffffffff161461123a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611231906136c0565b60405180910390fd5b565b61124581611cd4565b611284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127b90613381565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661130283610b0d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061135483610b0d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061139657506113958185610f94565b5b806113d457508373ffffffffffffffffffffffffffffffffffffffff166113bc846107eb565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166113fd82610b0d565b73ffffffffffffffffffffffffffffffffffffffff1614611453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144a90613752565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b9906137e4565b60405180910390fd5b6114cf8383836001611d15565b8273ffffffffffffffffffffffffffffffffffffffff166114ef82610b0d565b73ffffffffffffffffffffffffffffffffffffffff1614611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153c90613752565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46116d18383836001611e3b565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611847576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183e90613850565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119389190612488565b60405180910390a3505050565b6119508484846113dd565b61195c84848484611e41565b61199b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611992906138e2565b60405180910390fd5b50505050565b6060600b80546119b090612e01565b80601f01602080910402602001604051908101604052809291908181526020018280546119dc90612e01565b8015611a295780601f106119fe57610100808354040283529160200191611a29565b820191906000526020600020905b815481529060010190602001808311611a0c57829003601f168201915b5050505050905090565b606060006001611a4284611fc8565b01905060008167ffffffffffffffff811115611a6157611a606124be565b5b6040519080825280601f01601f191660200182016040528015611a935781602001600182028036833780820191505090505b509050600082602001820190505b600115611af6578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611aea57611ae9613902565b5b04945060008503611aa1575b819350505050919050565b60075460095410611b47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3e9061397d565b60405180910390fd5b611b538160085461211b565b60086000815480929190611b669061352e565b919050555060096000815480929190611b7e9061352e565b919050555050565b6000611b9182610b0d565b9050611ba1816000846001611d15565b611baa82610b0d565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611cd0816000846001611e3b565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff16611cf6836116d6565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6001811115611e3557600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611da95780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611da1919061326f565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611e345780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e2c919061399d565b925050819055505b5b50505050565b50505050565b6000611e628473ffffffffffffffffffffffffffffffffffffffff16612139565b15611fbb578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e8b611287565b8786866040518563ffffffff1660e01b8152600401611ead9493929190613a26565b6020604051808303816000875af1925050508015611ee957506040513d601f19601f82011682018060405250810190611ee69190613a87565b60015b611f6b573d8060008114611f19576040519150601f19603f3d011682016040523d82523d6000602084013e611f1e565b606091505b506000815103611f63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5a906138e2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611fc0565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612026577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161201c5761201b613902565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612063576d04ee2d6d415b85acef8100000000838161205957612058613902565b5b0492506020810190505b662386f26fc10000831061209257662386f26fc10000838161208857612087613902565b5b0492506010810190505b6305f5e10083106120bb576305f5e10083816120b1576120b0613902565b5b0492506008810190505b61271083106120e05761271083816120d6576120d5613902565b5b0492506004810190505b6064831061210357606483816120f9576120f8613902565b5b0492506002810190505b600a8310612112576001810190505b80915050919050565b61213582826040518060200160405280600081525061215c565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b61216683836121b7565b6121736000848484611e41565b6121b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a9906138e2565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221d90613b00565b60405180910390fd5b61222f81611cd4565b1561226f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226690613b6c565b60405180910390fd5b61227d600083836001611d15565b61228681611cd4565b156122c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122bd90613b6c565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123d0600083836001611e3b565b5050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61241d816123e8565b811461242857600080fd5b50565b60008135905061243a81612414565b92915050565b600060208284031215612456576124556123de565b5b60006124648482850161242b565b91505092915050565b60008115159050919050565b6124828161246d565b82525050565b600060208201905061249d6000830184612479565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6124f6826124ad565b810181811067ffffffffffffffff82111715612515576125146124be565b5b80604052505050565b60006125286123d4565b905061253482826124ed565b919050565b600067ffffffffffffffff821115612554576125536124be565b5b61255d826124ad565b9050602081019050919050565b82818337600083830152505050565b600061258c61258784612539565b61251e565b9050828152602081018484840111156125a8576125a76124a8565b5b6125b384828561256a565b509392505050565b600082601f8301126125d0576125cf6124a3565b5b81356125e0848260208601612579565b91505092915050565b6000602082840312156125ff576125fe6123de565b5b600082013567ffffffffffffffff81111561261d5761261c6123e3565b5b612629848285016125bb565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561266c578082015181840152602081019050612651565b60008484015250505050565b600061268382612632565b61268d818561263d565b935061269d81856020860161264e565b6126a6816124ad565b840191505092915050565b600060208201905081810360008301526126cb8184612678565b905092915050565b6000819050919050565b6126e6816126d3565b81146126f157600080fd5b50565b600081359050612703816126dd565b92915050565b60006020828403121561271f5761271e6123de565b5b600061272d848285016126f4565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061276182612736565b9050919050565b61277181612756565b82525050565b600060208201905061278c6000830184612768565b92915050565b61279b81612756565b81146127a657600080fd5b50565b6000813590506127b881612792565b92915050565b600080604083850312156127d5576127d46123de565b5b60006127e3858286016127a9565b92505060206127f4858286016126f4565b9150509250929050565b612807816126d3565b82525050565b600060208201905061282260008301846127fe565b92915050565b600080600060608486031215612841576128406123de565b5b600061284f868287016127a9565b9350506020612860868287016127a9565b9250506040612871868287016126f4565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b60006128c382612632565b6128cd81856128a7565b93506128dd81856020860161264e565b6128e6816124ad565b840191505092915050565b60006128fd83836128b8565b905092915050565b6000602082019050919050565b600061291d8261287b565b6129278185612886565b93508360208202850161293985612897565b8060005b85811015612975578484038952815161295685826128f1565b945061296183612905565b925060208a0199505060018101905061293d565b50829750879550505050505092915050565b600060208201905081810360008301526129a18184612912565b905092915050565b6000602082840312156129bf576129be6123de565b5b60006129cd848285016127a9565b91505092915050565b600080fd5b600080fd5b60008083601f8401126129f6576129f56124a3565b5b8235905067ffffffffffffffff811115612a1357612a126129d6565b5b602083019150836001820283011115612a2f57612a2e6129db565b5b9250929050565b60008060208385031215612a4d57612a4c6123de565b5b600083013567ffffffffffffffff811115612a6b57612a6a6123e3565b5b612a77858286016129e0565b92509250509250929050565b612a8c8161246d565b8114612a9757600080fd5b50565b600081359050612aa981612a83565b92915050565b60008060408385031215612ac657612ac56123de565b5b6000612ad4858286016127a9565b9250506020612ae585828601612a9a565b9150509250929050565b600067ffffffffffffffff821115612b0a57612b096124be565b5b612b13826124ad565b9050602081019050919050565b6000612b33612b2e84612aef565b61251e565b905082815260208101848484011115612b4f57612b4e6124a8565b5b612b5a84828561256a565b509392505050565b600082601f830112612b7757612b766124a3565b5b8135612b87848260208601612b20565b91505092915050565b60008060008060808587031215612baa57612ba96123de565b5b6000612bb8878288016127a9565b9450506020612bc9878288016127a9565b9350506040612bda878288016126f4565b925050606085013567ffffffffffffffff811115612bfb57612bfa6123e3565b5b612c0787828801612b62565b91505092959194509250565b600067ffffffffffffffff821115612c2e57612c2d6124be565b5b602082029050602081019050919050565b6000612c52612c4d84612c13565b61251e565b90508083825260208201905060208402830185811115612c7557612c746129db565b5b835b81811015612c9e5780612c8a88826127a9565b845260208401935050602081019050612c77565b5050509392505050565b600082601f830112612cbd57612cbc6124a3565b5b8135612ccd848260208601612c3f565b91505092915050565b60008060408385031215612ced57612cec6123de565b5b600083013567ffffffffffffffff811115612d0b57612d0a6123e3565b5b612d1785828601612ca8565b9250506020612d28858286016126f4565b9150509250929050565b60008060408385031215612d4957612d486123de565b5b6000612d57858286016127a9565b9250506020612d68858286016127a9565b9150509250929050565b600080600060408486031215612d8b57612d8a6123de565b5b6000612d99868287016126f4565b935050602084013567ffffffffffffffff811115612dba57612db96123e3565b5b612dc6868287016129e0565b92509250509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612e1957607f821691505b602082108103612e2c57612e2b612dd2565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612e947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612e57565b612e9e8683612e57565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612edb612ed6612ed1846126d3565b612eb6565b6126d3565b9050919050565b6000819050919050565b612ef583612ec0565b612f09612f0182612ee2565b848454612e64565b825550505050565b600090565b612f1e612f11565b612f29818484612eec565b505050565b5b81811015612f4d57612f42600082612f16565b600181019050612f2f565b5050565b601f821115612f9257612f6381612e32565b612f6c84612e47565b81016020851015612f7b578190505b612f8f612f8785612e47565b830182612f2e565b50505b505050565b600082821c905092915050565b6000612fb560001984600802612f97565b1980831691505092915050565b6000612fce8383612fa4565b9150826002028217905092915050565b612fe782612632565b67ffffffffffffffff81111561300057612fff6124be565b5b61300a8254612e01565b613015828285612f51565b600060209050601f8311600181146130485760008415613036578287015190505b6130408582612fc2565b8655506130a8565b601f19841661305686612e32565b60005b8281101561307e57848901518255600182019150602085019450602081019050613059565b8683101561309b5784890151613097601f891682612fa4565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061310c60218361263d565b9150613117826130b0565b604082019050919050565b6000602082019050818103600083015261313b816130ff565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b600061319e603d8361263d565b91506131a982613142565b604082019050919050565b600060208201905081810360008301526131cd81613191565b9050919050565b7f4e6f7420496d706c656d656e7400000000000000000000000000000000000000600082015250565b600061320a600d8361263d565b9150613215826131d4565b602082019050919050565b60006020820190508181036000830152613239816131fd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061327a826126d3565b9150613285836126d3565b925082820390508181111561329d5761329c613240565b5b92915050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006132ff602d8361263d565b915061330a826132a3565b604082019050919050565b6000602082019050818103600083015261332e816132f2565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061336b60188361263d565b915061337682613335565b602082019050919050565b6000602082019050818103600083015261339a8161335e565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006133fd60298361263d565b9150613408826133a1565b604082019050919050565b6000602082019050818103600083015261342c816133f0565b9050919050565b600081905092915050565b600061344982612632565b6134538185613433565b935061346381856020860161264e565b80840191505092915050565b600061347b828561343e565b9150613487828461343e565b91508190509392505050565b7f496e76616c6964204c656e677468000000000000000000000000000000000000600082015250565b60006134c9600e8361263d565b91506134d482613493565b602082019050919050565b600060208201905081810360008301526134f8816134bc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613539826126d3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361356b5761356a613240565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006135d260268361263d565b91506135dd82613576565b604082019050919050565b60006020820190508181036000830152613601816135c5565b9050919050565b7f4e6f74204f776e6572204f6620546f6b656e0000000000000000000000000000600082015250565b600061363e60128361263d565b915061364982613608565b602082019050919050565b6000602082019050818103600083015261366d81613631565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136aa60208361263d565b91506136b582613674565b602082019050919050565b600060208201905081810360008301526136d98161369d565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061373c60258361263d565b9150613747826136e0565b604082019050919050565b6000602082019050818103600083015261376b8161372f565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006137ce60248361263d565b91506137d982613772565b604082019050919050565b600060208201905081810360008301526137fd816137c1565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061383a60198361263d565b915061384582613804565b602082019050919050565b600060208201905081810360008301526138698161382d565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006138cc60328361263d565b91506138d782613870565b604082019050919050565b600060208201905081810360008301526138fb816138bf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4c696d6974656420416d6f756e74000000000000000000000000000000000000600082015250565b6000613967600e8361263d565b915061397282613931565b602082019050919050565b600060208201905081810360008301526139968161395a565b9050919050565b60006139a8826126d3565b91506139b3836126d3565b92508282019050808211156139cb576139ca613240565b5b92915050565b600081519050919050565b600082825260208201905092915050565b60006139f8826139d1565b613a0281856139dc565b9350613a1281856020860161264e565b613a1b816124ad565b840191505092915050565b6000608082019050613a3b6000830187612768565b613a486020830186612768565b613a5560408301856127fe565b8181036060830152613a6781846139ed565b905095945050505050565b600081519050613a8181612414565b92915050565b600060208284031215613a9d57613a9c6123de565b5b6000613aab84828501613a72565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613aea60208361263d565b9150613af582613ab4565b602082019050919050565b60006020820190508181036000830152613b1981613add565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613b56601c8361263d565b9150613b6182613b20565b602082019050919050565b60006020820190508181036000830152613b8581613b49565b905091905056fea26469706673582212207104944a5b2b80451cd337a198deb41ecf512ccbe77d8db157f216ff83eecef564736f6c63430008110033697066733a2f2f516d637053736251755162365a38436153796a763236655643317743624d56567a326b3343524246796b426569392f

Deployed Bytecode

0x6080604052600436106101b75760003560e01c80637ba0e2e7116100ec578063d4d8b3921161008a578063e985e9c511610064578063e985e9c5146105a2578063f127394c146105df578063f2fde38b1461060a578063fe9d930314610633576101b7565b8063d4d8b39214610537578063d65ae67714610560578063e875b7d014610577576101b7565b8063a06c7aab116100c6578063a06c7aab1461047f578063a22cb465146104a8578063b88d4fde146104d1578063c87b56dd146104fa576101b7565b80637ba0e2e71461040d5780638da5cb5b1461042957806395d89b4114610454576101b7565b806323b872dd1161015957806347ea4c6e1161013357806347ea4c6e146103515780636352211e1461037c57806370a08231146103b9578063715018a6146103f6576101b7565b806323b872dd146102e85780633ccfd60b1461031157806342842e0e14610328576101b7565b8063081812fc11610195578063081812fc1461024d578063095ea7b31461028a5780631249c58b146102b357806318160ddd146102bd576101b7565b806301ffc9a7146101bc57806302fe5305146101f957806306fdde0314610222575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612440565b61065c565b6040516101f09190612488565b60405180910390f35b34801561020557600080fd5b50610220600480360381019061021b91906125e9565b61073e565b005b34801561022e57600080fd5b50610237610759565b60405161024491906126b1565b60405180910390f35b34801561025957600080fd5b50610274600480360381019061026f9190612709565b6107eb565b6040516102819190612777565b60405180910390f35b34801561029657600080fd5b506102b160048036038101906102ac91906127be565b610831565b005b6102bb610948565b005b3480156102c957600080fd5b506102d2610983565b6040516102df919061280d565b60405180910390f35b3480156102f457600080fd5b5061030f600480360381019061030a9190612828565b61099a565b005b34801561031d57600080fd5b506103266109fa565b005b34801561033457600080fd5b5061034f600480360381019061034a9190612828565b610ab0565b005b34801561035d57600080fd5b50610366610ad0565b6040516103739190612987565b60405180910390f35b34801561038857600080fd5b506103a3600480360381019061039e9190612709565b610b0d565b6040516103b09190612777565b60405180910390f35b3480156103c557600080fd5b506103e060048036038101906103db91906129a9565b610b93565b6040516103ed919061280d565b60405180910390f35b34801561040257600080fd5b5061040b610c4a565b005b61042760048036038101906104229190612a36565b610c5e565b005b34801561043557600080fd5b5061043e610c99565b60405161044b9190612777565b60405180910390f35b34801561046057600080fd5b50610469610cc3565b60405161047691906126b1565b60405180910390f35b34801561048b57600080fd5b506104a660048036038101906104a19190612709565b610d55565b005b3480156104b457600080fd5b506104cf60048036038101906104ca9190612aaf565b610d67565b005b3480156104dd57600080fd5b506104f860048036038101906104f39190612b90565b610d7d565b005b34801561050657600080fd5b50610521600480360381019061051c9190612709565b610ddf565b60405161052e91906126b1565b60405180910390f35b34801561054357600080fd5b5061055e60048036038101906105599190612cd6565b610e47565b005b34801561056c57600080fd5b50610575610ed8565b005b34801561058357600080fd5b5061058c610f8e565b604051610599919061280d565b60405180910390f35b3480156105ae57600080fd5b506105c960048036038101906105c49190612d32565b610f94565b6040516105d69190612488565b60405180910390f35b3480156105eb57600080fd5b506105f4611028565b604051610601919061280d565b60405180910390f35b34801561061657600080fd5b50610631600480360381019061062c91906129a9565b61102e565b005b34801561063f57600080fd5b5061065a60048036038101906106559190612d72565b6110b1565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061072757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610737575061073682611154565b5b9050919050565b6107466111be565b80600b90816107559190612fde565b5050565b60606000805461076890612e01565b80601f016020809104026020016040519081016040528092919081815260200182805461079490612e01565b80156107e15780601f106107b6576101008083540402835291602001916107e1565b820191906000526020600020905b8154815290600101906020018083116107c457829003601f168201915b5050505050905090565b60006107f68261123c565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061083c82610b0d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a390613122565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108cb611287565b73ffffffffffffffffffffffffffffffffffffffff1614806108fa57506108f9816108f4611287565b610f94565b5b610939576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610930906131b4565b60405180910390fd5b610943838361128f565b505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097a90613220565b60405180910390fd5b6000600a54600954610995919061326f565b905090565b6109ab6109a5611287565b82611348565b6109ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e190613315565b60405180910390fd5b6109f58383836113dd565b505050565b738837391c2634b62c4fcf4f0b01f0772a743a4cf373ffffffffffffffffffffffffffffffffffffffff16610a2d611287565b73ffffffffffffffffffffffffffffffffffffffff1614610a4d57600080fd5b6000479050738837391c2634b62c4fcf4f0b01f0772a743a4cf373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610aac573d6000803e3d6000fd5b5050565b610acb83838360405180602001604052806000815250610d7d565b505050565b60606040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0490613220565b60405180910390fd5b600080610b19836116d6565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8190613381565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfa90613413565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c526111be565b610c5c6000611713565b565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9090613220565b60405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610cd290612e01565b80601f0160208091040260200160405190810160405280929190818152602001828054610cfe90612e01565b8015610d4b5780601f10610d2057610100808354040283529160200191610d4b565b820191906000526020600020905b815481529060010190602001808311610d2e57829003601f168201915b5050505050905090565b610d5d6111be565b8060078190555050565b610d79610d72611287565b83836117d9565b5050565b610d8e610d88611287565b83611348565b610dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc490613315565b60405180910390fd5b610dd984848484611945565b50505050565b6060610dea8261123c565b6000610df46119a1565b90506000815111610e145760405180602001604052806000815250610e3f565b80610e1e84611a33565b604051602001610e2f92919061346f565b6040516020818303038152906040525b915050919050565b610e4f6111be565b80825114610e92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e89906134df565b60405180910390fd5b60005b81811015610ed357610ec0838281518110610eb357610eb26134ff565b5b6020026020010151611b01565b8080610ecb9061352e565b915050610e95565b505050565b73bdc378a75fe1d1b53adb3025541174b79474845b73ffffffffffffffffffffffffffffffffffffffff16610f0b611287565b73ffffffffffffffffffffffffffffffffffffffff1614610f2b57600080fd5b600047905073eece4544101f7c7198157c74a1cbfe12aa86718b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f8a573d6000803e3d6000fd5b5050565b60075481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60085481565b6110366111be565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109c906135e8565b60405180910390fd5b6110ae81611713565b50565b6110ba83610b0d565b73ffffffffffffffffffffffffffffffffffffffff166110d8611287565b73ffffffffffffffffffffffffffffffffffffffff161461112e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112590613654565b60405180910390fd5b61113783611b86565b600a600081548092919061114a9061352e565b9190505550505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6111c6611287565b73ffffffffffffffffffffffffffffffffffffffff166111e4610c99565b73ffffffffffffffffffffffffffffffffffffffff161461123a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611231906136c0565b60405180910390fd5b565b61124581611cd4565b611284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127b90613381565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661130283610b0d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061135483610b0d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061139657506113958185610f94565b5b806113d457508373ffffffffffffffffffffffffffffffffffffffff166113bc846107eb565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166113fd82610b0d565b73ffffffffffffffffffffffffffffffffffffffff1614611453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144a90613752565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b9906137e4565b60405180910390fd5b6114cf8383836001611d15565b8273ffffffffffffffffffffffffffffffffffffffff166114ef82610b0d565b73ffffffffffffffffffffffffffffffffffffffff1614611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153c90613752565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46116d18383836001611e3b565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611847576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183e90613850565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119389190612488565b60405180910390a3505050565b6119508484846113dd565b61195c84848484611e41565b61199b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611992906138e2565b60405180910390fd5b50505050565b6060600b80546119b090612e01565b80601f01602080910402602001604051908101604052809291908181526020018280546119dc90612e01565b8015611a295780601f106119fe57610100808354040283529160200191611a29565b820191906000526020600020905b815481529060010190602001808311611a0c57829003601f168201915b5050505050905090565b606060006001611a4284611fc8565b01905060008167ffffffffffffffff811115611a6157611a606124be565b5b6040519080825280601f01601f191660200182016040528015611a935781602001600182028036833780820191505090505b509050600082602001820190505b600115611af6578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611aea57611ae9613902565b5b04945060008503611aa1575b819350505050919050565b60075460095410611b47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3e9061397d565b60405180910390fd5b611b538160085461211b565b60086000815480929190611b669061352e565b919050555060096000815480929190611b7e9061352e565b919050555050565b6000611b9182610b0d565b9050611ba1816000846001611d15565b611baa82610b0d565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611cd0816000846001611e3b565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff16611cf6836116d6565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6001811115611e3557600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611da95780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611da1919061326f565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611e345780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e2c919061399d565b925050819055505b5b50505050565b50505050565b6000611e628473ffffffffffffffffffffffffffffffffffffffff16612139565b15611fbb578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e8b611287565b8786866040518563ffffffff1660e01b8152600401611ead9493929190613a26565b6020604051808303816000875af1925050508015611ee957506040513d601f19601f82011682018060405250810190611ee69190613a87565b60015b611f6b573d8060008114611f19576040519150601f19603f3d011682016040523d82523d6000602084013e611f1e565b606091505b506000815103611f63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5a906138e2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611fc0565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612026577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161201c5761201b613902565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612063576d04ee2d6d415b85acef8100000000838161205957612058613902565b5b0492506020810190505b662386f26fc10000831061209257662386f26fc10000838161208857612087613902565b5b0492506010810190505b6305f5e10083106120bb576305f5e10083816120b1576120b0613902565b5b0492506008810190505b61271083106120e05761271083816120d6576120d5613902565b5b0492506004810190505b6064831061210357606483816120f9576120f8613902565b5b0492506002810190505b600a8310612112576001810190505b80915050919050565b61213582826040518060200160405280600081525061215c565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b61216683836121b7565b6121736000848484611e41565b6121b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a9906138e2565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221d90613b00565b60405180910390fd5b61222f81611cd4565b1561226f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226690613b6c565b60405180910390fd5b61227d600083836001611d15565b61228681611cd4565b156122c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122bd90613b6c565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123d0600083836001611e3b565b5050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61241d816123e8565b811461242857600080fd5b50565b60008135905061243a81612414565b92915050565b600060208284031215612456576124556123de565b5b60006124648482850161242b565b91505092915050565b60008115159050919050565b6124828161246d565b82525050565b600060208201905061249d6000830184612479565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6124f6826124ad565b810181811067ffffffffffffffff82111715612515576125146124be565b5b80604052505050565b60006125286123d4565b905061253482826124ed565b919050565b600067ffffffffffffffff821115612554576125536124be565b5b61255d826124ad565b9050602081019050919050565b82818337600083830152505050565b600061258c61258784612539565b61251e565b9050828152602081018484840111156125a8576125a76124a8565b5b6125b384828561256a565b509392505050565b600082601f8301126125d0576125cf6124a3565b5b81356125e0848260208601612579565b91505092915050565b6000602082840312156125ff576125fe6123de565b5b600082013567ffffffffffffffff81111561261d5761261c6123e3565b5b612629848285016125bb565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561266c578082015181840152602081019050612651565b60008484015250505050565b600061268382612632565b61268d818561263d565b935061269d81856020860161264e565b6126a6816124ad565b840191505092915050565b600060208201905081810360008301526126cb8184612678565b905092915050565b6000819050919050565b6126e6816126d3565b81146126f157600080fd5b50565b600081359050612703816126dd565b92915050565b60006020828403121561271f5761271e6123de565b5b600061272d848285016126f4565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061276182612736565b9050919050565b61277181612756565b82525050565b600060208201905061278c6000830184612768565b92915050565b61279b81612756565b81146127a657600080fd5b50565b6000813590506127b881612792565b92915050565b600080604083850312156127d5576127d46123de565b5b60006127e3858286016127a9565b92505060206127f4858286016126f4565b9150509250929050565b612807816126d3565b82525050565b600060208201905061282260008301846127fe565b92915050565b600080600060608486031215612841576128406123de565b5b600061284f868287016127a9565b9350506020612860868287016127a9565b9250506040612871868287016126f4565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b60006128c382612632565b6128cd81856128a7565b93506128dd81856020860161264e565b6128e6816124ad565b840191505092915050565b60006128fd83836128b8565b905092915050565b6000602082019050919050565b600061291d8261287b565b6129278185612886565b93508360208202850161293985612897565b8060005b85811015612975578484038952815161295685826128f1565b945061296183612905565b925060208a0199505060018101905061293d565b50829750879550505050505092915050565b600060208201905081810360008301526129a18184612912565b905092915050565b6000602082840312156129bf576129be6123de565b5b60006129cd848285016127a9565b91505092915050565b600080fd5b600080fd5b60008083601f8401126129f6576129f56124a3565b5b8235905067ffffffffffffffff811115612a1357612a126129d6565b5b602083019150836001820283011115612a2f57612a2e6129db565b5b9250929050565b60008060208385031215612a4d57612a4c6123de565b5b600083013567ffffffffffffffff811115612a6b57612a6a6123e3565b5b612a77858286016129e0565b92509250509250929050565b612a8c8161246d565b8114612a9757600080fd5b50565b600081359050612aa981612a83565b92915050565b60008060408385031215612ac657612ac56123de565b5b6000612ad4858286016127a9565b9250506020612ae585828601612a9a565b9150509250929050565b600067ffffffffffffffff821115612b0a57612b096124be565b5b612b13826124ad565b9050602081019050919050565b6000612b33612b2e84612aef565b61251e565b905082815260208101848484011115612b4f57612b4e6124a8565b5b612b5a84828561256a565b509392505050565b600082601f830112612b7757612b766124a3565b5b8135612b87848260208601612b20565b91505092915050565b60008060008060808587031215612baa57612ba96123de565b5b6000612bb8878288016127a9565b9450506020612bc9878288016127a9565b9350506040612bda878288016126f4565b925050606085013567ffffffffffffffff811115612bfb57612bfa6123e3565b5b612c0787828801612b62565b91505092959194509250565b600067ffffffffffffffff821115612c2e57612c2d6124be565b5b602082029050602081019050919050565b6000612c52612c4d84612c13565b61251e565b90508083825260208201905060208402830185811115612c7557612c746129db565b5b835b81811015612c9e5780612c8a88826127a9565b845260208401935050602081019050612c77565b5050509392505050565b600082601f830112612cbd57612cbc6124a3565b5b8135612ccd848260208601612c3f565b91505092915050565b60008060408385031215612ced57612cec6123de565b5b600083013567ffffffffffffffff811115612d0b57612d0a6123e3565b5b612d1785828601612ca8565b9250506020612d28858286016126f4565b9150509250929050565b60008060408385031215612d4957612d486123de565b5b6000612d57858286016127a9565b9250506020612d68858286016127a9565b9150509250929050565b600080600060408486031215612d8b57612d8a6123de565b5b6000612d99868287016126f4565b935050602084013567ffffffffffffffff811115612dba57612db96123e3565b5b612dc6868287016129e0565b92509250509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612e1957607f821691505b602082108103612e2c57612e2b612dd2565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612e947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612e57565b612e9e8683612e57565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612edb612ed6612ed1846126d3565b612eb6565b6126d3565b9050919050565b6000819050919050565b612ef583612ec0565b612f09612f0182612ee2565b848454612e64565b825550505050565b600090565b612f1e612f11565b612f29818484612eec565b505050565b5b81811015612f4d57612f42600082612f16565b600181019050612f2f565b5050565b601f821115612f9257612f6381612e32565b612f6c84612e47565b81016020851015612f7b578190505b612f8f612f8785612e47565b830182612f2e565b50505b505050565b600082821c905092915050565b6000612fb560001984600802612f97565b1980831691505092915050565b6000612fce8383612fa4565b9150826002028217905092915050565b612fe782612632565b67ffffffffffffffff81111561300057612fff6124be565b5b61300a8254612e01565b613015828285612f51565b600060209050601f8311600181146130485760008415613036578287015190505b6130408582612fc2565b8655506130a8565b601f19841661305686612e32565b60005b8281101561307e57848901518255600182019150602085019450602081019050613059565b8683101561309b5784890151613097601f891682612fa4565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061310c60218361263d565b9150613117826130b0565b604082019050919050565b6000602082019050818103600083015261313b816130ff565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b600061319e603d8361263d565b91506131a982613142565b604082019050919050565b600060208201905081810360008301526131cd81613191565b9050919050565b7f4e6f7420496d706c656d656e7400000000000000000000000000000000000000600082015250565b600061320a600d8361263d565b9150613215826131d4565b602082019050919050565b60006020820190508181036000830152613239816131fd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061327a826126d3565b9150613285836126d3565b925082820390508181111561329d5761329c613240565b5b92915050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006132ff602d8361263d565b915061330a826132a3565b604082019050919050565b6000602082019050818103600083015261332e816132f2565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061336b60188361263d565b915061337682613335565b602082019050919050565b6000602082019050818103600083015261339a8161335e565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006133fd60298361263d565b9150613408826133a1565b604082019050919050565b6000602082019050818103600083015261342c816133f0565b9050919050565b600081905092915050565b600061344982612632565b6134538185613433565b935061346381856020860161264e565b80840191505092915050565b600061347b828561343e565b9150613487828461343e565b91508190509392505050565b7f496e76616c6964204c656e677468000000000000000000000000000000000000600082015250565b60006134c9600e8361263d565b91506134d482613493565b602082019050919050565b600060208201905081810360008301526134f8816134bc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613539826126d3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361356b5761356a613240565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006135d260268361263d565b91506135dd82613576565b604082019050919050565b60006020820190508181036000830152613601816135c5565b9050919050565b7f4e6f74204f776e6572204f6620546f6b656e0000000000000000000000000000600082015250565b600061363e60128361263d565b915061364982613608565b602082019050919050565b6000602082019050818103600083015261366d81613631565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136aa60208361263d565b91506136b582613674565b602082019050919050565b600060208201905081810360008301526136d98161369d565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061373c60258361263d565b9150613747826136e0565b604082019050919050565b6000602082019050818103600083015261376b8161372f565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006137ce60248361263d565b91506137d982613772565b604082019050919050565b600060208201905081810360008301526137fd816137c1565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061383a60198361263d565b915061384582613804565b602082019050919050565b600060208201905081810360008301526138698161382d565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006138cc60328361263d565b91506138d782613870565b604082019050919050565b600060208201905081810360008301526138fb816138bf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4c696d6974656420416d6f756e74000000000000000000000000000000000000600082015250565b6000613967600e8361263d565b915061397282613931565b602082019050919050565b600060208201905081810360008301526139968161395a565b9050919050565b60006139a8826126d3565b91506139b3836126d3565b92508282019050808211156139cb576139ca613240565b5b92915050565b600081519050919050565b600082825260208201905092915050565b60006139f8826139d1565b613a0281856139dc565b9350613a1281856020860161264e565b613a1b816124ad565b840191505092915050565b6000608082019050613a3b6000830187612768565b613a486020830186612768565b613a5560408301856127fe565b8181036060830152613a6781846139ed565b905095945050505050565b600081519050613a8181612414565b92915050565b600060208284031215613a9d57613a9c6123de565b5b6000613aab84828501613a72565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613aea60208361263d565b9150613af582613ab4565b602082019050919050565b60006020820190508181036000830152613b1981613add565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613b56601c8361263d565b9150613b6182613b20565b602082019050919050565b60006020820190508181036000830152613b8581613b49565b905091905056fea26469706673582212207104944a5b2b80451cd337a198deb41ecf512ccbe77d8db157f216ff83eecef564736f6c63430008110033

Deployed Bytecode Sourcemap

138:2639:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1510:300:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2225:114:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2411:98:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3875:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3408:406;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;913:93:10;;;:::i;:::-;;1169:127;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4552:326:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2352:197:10;;;;;;;;;;;;;:::i;:::-;;4944:179:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1018:133:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2130:219:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1869:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1823:101:11;;;;;;;;;;;;;:::i;:::-;;796:112:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1193:85:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2573:102:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2118:96:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4109:153:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5189:314;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2741:276;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1887:220:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2554;;;;;;;;;;;;;:::i;:::-;;205:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4328:162:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;242:29:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2073:198:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1309:207:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1510:300:3;1612:4;1662:25;1647:40;;;:11;:40;;;;:104;;;;1718:33;1703:48;;;:11;:48;;;;1647:104;:156;;;;1767:36;1791:11;1767:23;:36::i;:::-;1647:156;1628:175;;1510:300;;;:::o;2225:114:10:-;1086:13:11;:11;:13::i;:::-;2326:6:10::1;2313:10;:19;;;;;;:::i;:::-;;2225:114:::0;:::o;2411:98:3:-;2465:13;2497:5;2490:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2411:98;:::o;3875:167::-;3951:7;3970:23;3985:7;3970:14;:23::i;:::-;4011:15;:24;4027:7;4011:24;;;;;;;;;;;;;;;;;;;;;4004:31;;3875:167;;;:::o;3408:406::-;3488:13;3504:23;3519:7;3504:14;:23::i;:::-;3488:39;;3551:5;3545:11;;:2;:11;;;3537:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3642:5;3626:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3651:37;3668:5;3675:12;:10;:12::i;:::-;3651:16;:37::i;:::-;3626:62;3605:170;;;;;;;;;;;;:::i;:::-;;;;;;;;;3786:21;3795:2;3799:7;3786:8;:21::i;:::-;3478:336;3408:406;;:::o;913:93:10:-;976:23;;;;;;;;;;:::i;:::-;;;;;;;;1169:127;1235:7;1276:13;;1260;;:29;;;;:::i;:::-;1253:36;;1169:127;:::o;4552:326:3:-;4741:41;4760:12;:10;:12::i;:::-;4774:7;4741:18;:41::i;:::-;4733:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;4843:28;4853:4;4859:2;4863:7;4843:9;:28::i;:::-;4552:326;;;:::o;2352:197:10:-;487:42;2420:27;;:12;:10;:12::i;:::-;:27;;;2412:36;;;;;;2458:12;2473:21;2458:36;;487:42;2504:29;;:38;2534:7;2504:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2402:147;2352:197::o;4944:179:3:-;5077:39;5094:4;5100:2;5104:7;5077:39;;;;;;;;;;;;:16;:39::i;:::-;4944:179;;;:::o;1018:133:10:-;1095:15;1121:23;;;;;;;;;;:::i;:::-;;;;;;;;2130:219:3;2202:7;2221:13;2237:17;2246:7;2237:8;:17::i;:::-;2221:33;;2289:1;2272:19;;:5;:19;;;2264:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;2337:5;2330:12;;;2130:219;;;:::o;1869:204::-;1941:7;1985:1;1968:19;;:5;:19;;;1960:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2050:9;:16;2060:5;2050:16;;;;;;;;;;;;;;;;2043:23;;1869:204;;;:::o;1823:101:11:-;1086:13;:11;:13::i;:::-;1887:30:::1;1914:1;1887:18;:30::i;:::-;1823:101::o:0;796:112:10:-;878:23;;;;;;;;;;:::i;:::-;;;;;;;;1193:85:11;1239:7;1265:6;;;;;;;;;;;1258:13;;1193:85;:::o;2573:102:3:-;2629:13;2661:7;2654:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2573:102;:::o;2118:96:10:-;1086:13:11;:11;:13::i;:::-;2201:6:10::1;2185:13;:22;;;;2118:96:::0;:::o;4109:153:3:-;4203:52;4222:12;:10;:12::i;:::-;4236:8;4246;4203:18;:52::i;:::-;4109:153;;:::o;5189:314::-;5357:41;5376:12;:10;:12::i;:::-;5390:7;5357:18;:41::i;:::-;5349:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;5458:38;5472:4;5478:2;5482:7;5491:4;5458:13;:38::i;:::-;5189:314;;;;:::o;2741:276::-;2814:13;2839:23;2854:7;2839:14;:23::i;:::-;2873:21;2897:10;:8;:10::i;:::-;2873:34;;2948:1;2930:7;2924:21;:25;:86;;;;;;;;;;;;;;;;;2976:7;2985:18;:7;:16;:18::i;:::-;2959:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2924:86;2917:93;;;2741:276;;;:::o;1887:220:10:-;1086:13:11;:11;:13::i;:::-;1997:3:10::1;1978:8;:15;:22;1970:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;2033:6;2029:72;2047:3;2043:1;:7;2029:72;;;2070:20;2078:8;2087:1;2078:11;;;;;;;;:::i;:::-;;;;;;;;2070:7;:20::i;:::-;2052:3;;;;;:::i;:::-;;;;2029:72;;;;1887:220:::0;;:::o;2554:::-;576:42;2627:35;;:12;:10;:12::i;:::-;:35;;;2619:44;;;;;;2673:12;2688:21;2673:36;;665:42;2719:39;;:48;2759:7;2719:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2609:165;2554:220::o;205:31::-;;;;:::o;4328:162:3:-;4425:4;4448:18;:25;4467:5;4448:25;;;;;;;;;;;;;;;:35;4474:8;4448:35;;;;;;;;;;;;;;;;;;;;;;;;;4441:42;;4328:162;;;;:::o;242:29:10:-;;;;:::o;2073:198:11:-;1086:13;:11;:13::i;:::-;2181:1:::1;2161:22;;:8;:22;;::::0;2153:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2236:28;2255:8;2236:18;:28::i;:::-;2073:198:::0;:::o;1309:207:10:-;1421:16;1429:7;1421;:16::i;:::-;1405:32;;:12;:10;:12::i;:::-;:32;;;1397:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1470:14;1476:7;1470:5;:14::i;:::-;1494:13;;:15;;;;;;;;;:::i;:::-;;;;;;1309:207;;;:::o;828:155:2:-;913:4;951:25;936:40;;;:11;:40;;;;929:47;;828:155;;;:::o;1351:130:11:-;1425:12;:10;:12::i;:::-;1414:23;;:7;:5;:7::i;:::-;:23;;;1406:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1351:130::o;13406:133:3:-;13487:16;13495:7;13487;:16::i;:::-;13479:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;13406:133;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;12708:171:3:-;12809:2;12782:15;:24;12798:7;12782:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;12864:7;12860:2;12826:46;;12835:23;12850:7;12835:14;:23::i;:::-;12826:46;;;;;;;;;;;;12708:171;;:::o;7480:261::-;7573:4;7589:13;7605:23;7620:7;7605:14;:23::i;:::-;7589:39;;7657:5;7646:16;;:7;:16;;;:52;;;;7666:32;7683:5;7690:7;7666:16;:32::i;:::-;7646:52;:87;;;;7726:7;7702:31;;:20;7714:7;7702:11;:20::i;:::-;:31;;;7646:87;7638:96;;;7480:261;;;;:::o;11363:1233::-;11517:4;11490:31;;:23;11505:7;11490:14;:23::i;:::-;:31;;;11482:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;11595:1;11581:16;;:2;:16;;;11573:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;11649:42;11670:4;11676:2;11680:7;11689:1;11649:20;:42::i;:::-;11818:4;11791:31;;:23;11806:7;11791:14;:23::i;:::-;:31;;;11783:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;11933:15;:24;11949:7;11933:24;;;;;;;;;;;;11926:31;;;;;;;;;;;12420:1;12401:9;:15;12411:4;12401:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;12452:1;12435:9;:13;12445:2;12435:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;12492:2;12473:7;:16;12481:7;12473:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;12529:7;12525:2;12510:27;;12519:4;12510:27;;;;;;;;;;;;12548:41;12568:4;12574:2;12578:7;12587:1;12548:19;:41::i;:::-;11363:1233;;;:::o;6778:115::-;6844:7;6870;:16;6878:7;6870:16;;;;;;;;;;;;;;;;;;;;;6863:23;;6778:115;;;:::o;2425:187:11:-;2498:16;2517:6;;;;;;;;;;;2498:25;;2542:8;2533:6;;:17;;;;;;;;;;;;;;;;;;2596:8;2565:40;;2586:8;2565:40;;;;;;;;;;;;2488:124;2425:187;:::o;13015:307:3:-;13165:8;13156:17;;:5;:17;;;13148:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;13251:8;13213:18;:25;13232:5;13213:25;;;;;;;;;;;;;;;:35;13239:8;13213:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;13296:8;13274:41;;13289:5;13274:41;;;13306:8;13274:41;;;;;;:::i;:::-;;;;;;;;13015:307;;;:::o;6364:305::-;6514:28;6524:4;6530:2;6534:7;6514:9;:28::i;:::-;6560:47;6583:4;6589:2;6593:7;6602:4;6560:22;:47::i;:::-;6552:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;6364:305;;;;:::o;1536:109:10:-;1596:13;1628:10;1621:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1536:109;:::o;409:696:12:-;465:13;514:14;551:1;531:17;542:5;531:10;:17::i;:::-;:21;514:38;;566:20;600:6;589:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;566:41;;621:11;747:6;743:2;739:15;731:6;727:28;720:35;;782:280;789:4;782:280;;;813:5;;;;;;;;952:8;947:2;940:5;936:14;931:30;926:3;918:44;1006:2;997:11;;;;;;:::i;:::-;;;;;1039:1;1030:5;:10;782:280;1026:21;782:280;1082:6;1075:13;;;;;409:696;;;:::o;1662:208:10:-;1738:13;;1722;;:29;1714:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;1780:34;1791:7;1801:12;;1780:9;:34::i;:::-;1824:12;;:14;;;;;;;;;:::i;:::-;;;;;;1848:13;;:15;;;;;;;;;:::i;:::-;;;;;;1662:208;:::o;10277:762:3:-;10336:13;10352:23;10367:7;10352:14;:23::i;:::-;10336:39;;10386:51;10407:5;10422:1;10426:7;10435:1;10386:20;:51::i;:::-;10547:23;10562:7;10547:14;:23::i;:::-;10539:31;;10615:15;:24;10631:7;10615:24;;;;;;;;;;;;10608:31;;;;;;;;;;;10875:1;10855:9;:16;10865:5;10855:16;;;;;;;;;;;;;;;;:21;;;;;;;;;;;10903:7;:16;10911:7;10903:16;;;;;;;;;;;;10896:23;;;;;;;;;;;10963:7;10959:1;10935:36;;10944:5;10935:36;;;;;;;;;;;;10982:50;11002:5;11017:1;11021:7;11030:1;10982:19;:50::i;:::-;10326:713;10277:762;:::o;7196:126::-;7261:4;7313:1;7284:31;;:17;7293:7;7284:8;:17::i;:::-;:31;;;;7277:38;;7196:126;;;:::o;15638:396::-;15822:1;15810:9;:13;15806:222;;;15859:1;15843:18;;:4;:18;;;15839:85;;15900:9;15881;:15;15891:4;15881:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;15839:85;15955:1;15941:16;;:2;:16;;;15937:81;;15994:9;15977;:13;15987:2;15977:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;15937:81;15806:222;15638:396;;;;:::o;16740:153::-;;;;;:::o;14091:831::-;14240:4;14260:15;:2;:13;;;:15::i;:::-;14256:660;;;14311:2;14295:36;;;14332:12;:10;:12::i;:::-;14346:4;14352:7;14361:4;14295:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14291:573;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14550:1;14533:6;:13;:18;14529:321;;14575:60;;;;;;;;;;:::i;:::-;;;;;;;;14529:321;14802:6;14796:13;14787:6;14783:2;14779:15;14772:38;14291:573;14426:41;;;14416:51;;;:6;:51;;;;14409:58;;;;;14256:660;14901:4;14894:11;;14091:831;;;;;;;:::o;9889:890:9:-;9942:7;9961:14;9978:1;9961:18;;10026:6;10017:5;:15;10013:99;;10061:6;10052:15;;;;;;:::i;:::-;;;;;10095:2;10085:12;;;;10013:99;10138:6;10129:5;:15;10125:99;;10173:6;10164:15;;;;;;:::i;:::-;;;;;10207:2;10197:12;;;;10125:99;10250:6;10241:5;:15;10237:99;;10285:6;10276:15;;;;;;:::i;:::-;;;;;10319:2;10309:12;;;;10237:99;10362:5;10353;:14;10349:96;;10396:5;10387:14;;;;;;:::i;:::-;;;;;10429:1;10419:11;;;;10349:96;10471:5;10462;:14;10458:96;;10505:5;10496:14;;;;;;:::i;:::-;;;;;10538:1;10528:11;;;;10458:96;10580:5;10571;:14;10567:96;;10614:5;10605:14;;;;;;:::i;:::-;;;;;10647:1;10637:11;;;;10567:96;10689:5;10680;:14;10676:64;;10724:1;10714:11;;;;10676:64;10766:6;10759:13;;;9889:890;;;:::o;8071:108:3:-;8146:26;8156:2;8160:7;8146:26;;;;;;;;;;;;:9;:26::i;:::-;8071:108;;:::o;1175:320:0:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;8400:309:3:-;8524:18;8530:2;8534:7;8524:5;:18::i;:::-;8573:53;8604:1;8608:2;8612:7;8621:4;8573:22;:53::i;:::-;8552:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;8400:309;;;:::o;9031:920::-;9124:1;9110:16;;:2;:16;;;9102:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9182:16;9190:7;9182;:16::i;:::-;9181:17;9173:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9242:48;9271:1;9275:2;9279:7;9288:1;9242:20;:48::i;:::-;9386:16;9394:7;9386;:16::i;:::-;9385:17;9377:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9794:1;9777:9;:13;9787:2;9777:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;9835:2;9816:7;:16;9824:7;9816:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9878:7;9874:2;9853:33;;9870:1;9853:33;;;;;;;;;;;;9897:47;9925:1;9929:2;9933:7;9942:1;9897:19;:47::i;:::-;9031:920;;:::o;7:75:13:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:117::-;1627:1;1624;1617:12;1641:117;1750:1;1747;1740:12;1764:102;1805:6;1856:2;1852:7;1847:2;1840:5;1836:14;1832:28;1822:38;;1764:102;;;:::o;1872:180::-;1920:77;1917:1;1910:88;2017:4;2014:1;2007:15;2041:4;2038:1;2031:15;2058:281;2141:27;2163:4;2141:27;:::i;:::-;2133:6;2129:40;2271:6;2259:10;2256:22;2235:18;2223:10;2220:34;2217:62;2214:88;;;2282:18;;:::i;:::-;2214:88;2322:10;2318:2;2311:22;2101:238;2058:281;;:::o;2345:129::-;2379:6;2406:20;;:::i;:::-;2396:30;;2435:33;2463:4;2455:6;2435:33;:::i;:::-;2345:129;;;:::o;2480:308::-;2542:4;2632:18;2624:6;2621:30;2618:56;;;2654:18;;:::i;:::-;2618:56;2692:29;2714:6;2692:29;:::i;:::-;2684:37;;2776:4;2770;2766:15;2758:23;;2480:308;;;:::o;2794:146::-;2891:6;2886:3;2881;2868:30;2932:1;2923:6;2918:3;2914:16;2907:27;2794:146;;;:::o;2946:425::-;3024:5;3049:66;3065:49;3107:6;3065:49;:::i;:::-;3049:66;:::i;:::-;3040:75;;3138:6;3131:5;3124:21;3176:4;3169:5;3165:16;3214:3;3205:6;3200:3;3196:16;3193:25;3190:112;;;3221:79;;:::i;:::-;3190:112;3311:54;3358:6;3353:3;3348;3311:54;:::i;:::-;3030:341;2946:425;;;;;:::o;3391:340::-;3447:5;3496:3;3489:4;3481:6;3477:17;3473:27;3463:122;;3504:79;;:::i;:::-;3463:122;3621:6;3608:20;3646:79;3721:3;3713:6;3706:4;3698:6;3694:17;3646:79;:::i;:::-;3637:88;;3453:278;3391:340;;;;:::o;3737:509::-;3806:6;3855:2;3843:9;3834:7;3830:23;3826:32;3823:119;;;3861:79;;:::i;:::-;3823:119;4009:1;3998:9;3994:17;3981:31;4039:18;4031:6;4028:30;4025:117;;;4061:79;;:::i;:::-;4025:117;4166:63;4221:7;4212:6;4201:9;4197:22;4166:63;:::i;:::-;4156:73;;3952:287;3737:509;;;;:::o;4252:99::-;4304:6;4338:5;4332:12;4322:22;;4252:99;;;:::o;4357:169::-;4441:11;4475:6;4470:3;4463:19;4515:4;4510:3;4506:14;4491:29;;4357:169;;;;:::o;4532:246::-;4613:1;4623:113;4637:6;4634:1;4631:13;4623:113;;;4722:1;4717:3;4713:11;4707:18;4703:1;4698:3;4694:11;4687:39;4659:2;4656:1;4652:10;4647:15;;4623:113;;;4770:1;4761:6;4756:3;4752:16;4745:27;4594:184;4532:246;;;:::o;4784:377::-;4872:3;4900:39;4933:5;4900:39;:::i;:::-;4955:71;5019:6;5014:3;4955:71;:::i;:::-;4948:78;;5035:65;5093:6;5088:3;5081:4;5074:5;5070:16;5035:65;:::i;:::-;5125:29;5147:6;5125:29;:::i;:::-;5120:3;5116:39;5109:46;;4876:285;4784:377;;;;:::o;5167:313::-;5280:4;5318:2;5307:9;5303:18;5295:26;;5367:9;5361:4;5357:20;5353:1;5342:9;5338:17;5331:47;5395:78;5468:4;5459:6;5395:78;:::i;:::-;5387:86;;5167:313;;;;:::o;5486:77::-;5523:7;5552:5;5541:16;;5486:77;;;:::o;5569:122::-;5642:24;5660:5;5642:24;:::i;:::-;5635:5;5632:35;5622:63;;5681:1;5678;5671:12;5622:63;5569:122;:::o;5697:139::-;5743:5;5781:6;5768:20;5759:29;;5797:33;5824:5;5797:33;:::i;:::-;5697:139;;;;:::o;5842:329::-;5901:6;5950:2;5938:9;5929:7;5925:23;5921:32;5918:119;;;5956:79;;:::i;:::-;5918:119;6076:1;6101:53;6146:7;6137:6;6126:9;6122:22;6101:53;:::i;:::-;6091:63;;6047:117;5842:329;;;;:::o;6177:126::-;6214:7;6254:42;6247:5;6243:54;6232:65;;6177:126;;;:::o;6309:96::-;6346:7;6375:24;6393:5;6375:24;:::i;:::-;6364:35;;6309:96;;;:::o;6411:118::-;6498:24;6516:5;6498:24;:::i;:::-;6493:3;6486:37;6411:118;;:::o;6535:222::-;6628:4;6666:2;6655:9;6651:18;6643:26;;6679:71;6747:1;6736:9;6732:17;6723:6;6679:71;:::i;:::-;6535:222;;;;:::o;6763:122::-;6836:24;6854:5;6836:24;:::i;:::-;6829:5;6826:35;6816:63;;6875:1;6872;6865:12;6816:63;6763:122;:::o;6891:139::-;6937:5;6975:6;6962:20;6953:29;;6991:33;7018:5;6991:33;:::i;:::-;6891:139;;;;:::o;7036:474::-;7104:6;7112;7161:2;7149:9;7140:7;7136:23;7132:32;7129:119;;;7167:79;;:::i;:::-;7129:119;7287:1;7312:53;7357:7;7348:6;7337:9;7333:22;7312:53;:::i;:::-;7302:63;;7258:117;7414:2;7440:53;7485:7;7476:6;7465:9;7461:22;7440:53;:::i;:::-;7430:63;;7385:118;7036:474;;;;;:::o;7516:118::-;7603:24;7621:5;7603:24;:::i;:::-;7598:3;7591:37;7516:118;;:::o;7640:222::-;7733:4;7771:2;7760:9;7756:18;7748:26;;7784:71;7852:1;7841:9;7837:17;7828:6;7784:71;:::i;:::-;7640:222;;;;:::o;7868:619::-;7945:6;7953;7961;8010:2;7998:9;7989:7;7985:23;7981:32;7978:119;;;8016:79;;:::i;:::-;7978:119;8136:1;8161:53;8206:7;8197:6;8186:9;8182:22;8161:53;:::i;:::-;8151:63;;8107:117;8263:2;8289:53;8334:7;8325:6;8314:9;8310:22;8289:53;:::i;:::-;8279:63;;8234:118;8391:2;8417:53;8462:7;8453:6;8442:9;8438:22;8417:53;:::i;:::-;8407:63;;8362:118;7868:619;;;;;:::o;8493:124::-;8570:6;8604:5;8598:12;8588:22;;8493:124;;;:::o;8623:194::-;8732:11;8766:6;8761:3;8754:19;8806:4;8801:3;8797:14;8782:29;;8623:194;;;;:::o;8823:142::-;8900:4;8923:3;8915:11;;8953:4;8948:3;8944:14;8936:22;;8823:142;;;:::o;8971:159::-;9045:11;9079:6;9074:3;9067:19;9119:4;9114:3;9110:14;9095:29;;8971:159;;;;:::o;9136:357::-;9214:3;9242:39;9275:5;9242:39;:::i;:::-;9297:61;9351:6;9346:3;9297:61;:::i;:::-;9290:68;;9367:65;9425:6;9420:3;9413:4;9406:5;9402:16;9367:65;:::i;:::-;9457:29;9479:6;9457:29;:::i;:::-;9452:3;9448:39;9441:46;;9218:275;9136:357;;;;:::o;9499:196::-;9588:10;9623:66;9685:3;9677:6;9623:66;:::i;:::-;9609:80;;9499:196;;;;:::o;9701:123::-;9781:4;9813;9808:3;9804:14;9796:22;;9701:123;;;:::o;9858:991::-;9997:3;10026:64;10084:5;10026:64;:::i;:::-;10106:96;10195:6;10190:3;10106:96;:::i;:::-;10099:103;;10228:3;10273:4;10265:6;10261:17;10256:3;10252:27;10303:66;10363:5;10303:66;:::i;:::-;10392:7;10423:1;10408:396;10433:6;10430:1;10427:13;10408:396;;;10504:9;10498:4;10494:20;10489:3;10482:33;10555:6;10549:13;10583:84;10662:4;10647:13;10583:84;:::i;:::-;10575:92;;10690:70;10753:6;10690:70;:::i;:::-;10680:80;;10789:4;10784:3;10780:14;10773:21;;10468:336;10455:1;10452;10448:9;10443:14;;10408:396;;;10412:14;10820:4;10813:11;;10840:3;10833:10;;10002:847;;;;;9858:991;;;;:::o;10855:413::-;11018:4;11056:2;11045:9;11041:18;11033:26;;11105:9;11099:4;11095:20;11091:1;11080:9;11076:17;11069:47;11133:128;11256:4;11247:6;11133:128;:::i;:::-;11125:136;;10855:413;;;;:::o;11274:329::-;11333:6;11382:2;11370:9;11361:7;11357:23;11353:32;11350:119;;;11388:79;;:::i;:::-;11350:119;11508:1;11533:53;11578:7;11569:6;11558:9;11554:22;11533:53;:::i;:::-;11523:63;;11479:117;11274:329;;;;:::o;11609:117::-;11718:1;11715;11708:12;11732:117;11841:1;11838;11831:12;11868:552;11925:8;11935:6;11985:3;11978:4;11970:6;11966:17;11962:27;11952:122;;11993:79;;:::i;:::-;11952:122;12106:6;12093:20;12083:30;;12136:18;12128:6;12125:30;12122:117;;;12158:79;;:::i;:::-;12122:117;12272:4;12264:6;12260:17;12248:29;;12326:3;12318:4;12310:6;12306:17;12296:8;12292:32;12289:41;12286:128;;;12333:79;;:::i;:::-;12286:128;11868:552;;;;;:::o;12426:527::-;12496:6;12504;12553:2;12541:9;12532:7;12528:23;12524:32;12521:119;;;12559:79;;:::i;:::-;12521:119;12707:1;12696:9;12692:17;12679:31;12737:18;12729:6;12726:30;12723:117;;;12759:79;;:::i;:::-;12723:117;12872:64;12928:7;12919:6;12908:9;12904:22;12872:64;:::i;:::-;12854:82;;;;12650:296;12426:527;;;;;:::o;12959:116::-;13029:21;13044:5;13029:21;:::i;:::-;13022:5;13019:32;13009:60;;13065:1;13062;13055:12;13009:60;12959:116;:::o;13081:133::-;13124:5;13162:6;13149:20;13140:29;;13178:30;13202:5;13178:30;:::i;:::-;13081:133;;;;:::o;13220:468::-;13285:6;13293;13342:2;13330:9;13321:7;13317:23;13313:32;13310:119;;;13348:79;;:::i;:::-;13310:119;13468:1;13493:53;13538:7;13529:6;13518:9;13514:22;13493:53;:::i;:::-;13483:63;;13439:117;13595:2;13621:50;13663:7;13654:6;13643:9;13639:22;13621:50;:::i;:::-;13611:60;;13566:115;13220:468;;;;;:::o;13694:307::-;13755:4;13845:18;13837:6;13834:30;13831:56;;;13867:18;;:::i;:::-;13831:56;13905:29;13927:6;13905:29;:::i;:::-;13897:37;;13989:4;13983;13979:15;13971:23;;13694:307;;;:::o;14007:423::-;14084:5;14109:65;14125:48;14166:6;14125:48;:::i;:::-;14109:65;:::i;:::-;14100:74;;14197:6;14190:5;14183:21;14235:4;14228:5;14224:16;14273:3;14264:6;14259:3;14255:16;14252:25;14249:112;;;14280:79;;:::i;:::-;14249:112;14370:54;14417:6;14412:3;14407;14370:54;:::i;:::-;14090:340;14007:423;;;;;:::o;14449:338::-;14504:5;14553:3;14546:4;14538:6;14534:17;14530:27;14520:122;;14561:79;;:::i;:::-;14520:122;14678:6;14665:20;14703:78;14777:3;14769:6;14762:4;14754:6;14750:17;14703:78;:::i;:::-;14694:87;;14510:277;14449:338;;;;:::o;14793:943::-;14888:6;14896;14904;14912;14961:3;14949:9;14940:7;14936:23;14932:33;14929:120;;;14968:79;;:::i;:::-;14929:120;15088:1;15113:53;15158:7;15149:6;15138:9;15134:22;15113:53;:::i;:::-;15103:63;;15059:117;15215:2;15241:53;15286:7;15277:6;15266:9;15262:22;15241:53;:::i;:::-;15231:63;;15186:118;15343:2;15369:53;15414:7;15405:6;15394:9;15390:22;15369:53;:::i;:::-;15359:63;;15314:118;15499:2;15488:9;15484:18;15471:32;15530:18;15522:6;15519:30;15516:117;;;15552:79;;:::i;:::-;15516:117;15657:62;15711:7;15702:6;15691:9;15687:22;15657:62;:::i;:::-;15647:72;;15442:287;14793:943;;;;;;;:::o;15742:311::-;15819:4;15909:18;15901:6;15898:30;15895:56;;;15931:18;;:::i;:::-;15895:56;15981:4;15973:6;15969:17;15961:25;;16041:4;16035;16031:15;16023:23;;15742:311;;;:::o;16076:710::-;16172:5;16197:81;16213:64;16270:6;16213:64;:::i;:::-;16197:81;:::i;:::-;16188:90;;16298:5;16327:6;16320:5;16313:21;16361:4;16354:5;16350:16;16343:23;;16414:4;16406:6;16402:17;16394:6;16390:30;16443:3;16435:6;16432:15;16429:122;;;16462:79;;:::i;:::-;16429:122;16577:6;16560:220;16594:6;16589:3;16586:15;16560:220;;;16669:3;16698:37;16731:3;16719:10;16698:37;:::i;:::-;16693:3;16686:50;16765:4;16760:3;16756:14;16749:21;;16636:144;16620:4;16615:3;16611:14;16604:21;;16560:220;;;16564:21;16178:608;;16076:710;;;;;:::o;16809:370::-;16880:5;16929:3;16922:4;16914:6;16910:17;16906:27;16896:122;;16937:79;;:::i;:::-;16896:122;17054:6;17041:20;17079:94;17169:3;17161:6;17154:4;17146:6;17142:17;17079:94;:::i;:::-;17070:103;;16886:293;16809:370;;;;:::o;17185:684::-;17278:6;17286;17335:2;17323:9;17314:7;17310:23;17306:32;17303:119;;;17341:79;;:::i;:::-;17303:119;17489:1;17478:9;17474:17;17461:31;17519:18;17511:6;17508:30;17505:117;;;17541:79;;:::i;:::-;17505:117;17646:78;17716:7;17707:6;17696:9;17692:22;17646:78;:::i;:::-;17636:88;;17432:302;17773:2;17799:53;17844:7;17835:6;17824:9;17820:22;17799:53;:::i;:::-;17789:63;;17744:118;17185:684;;;;;:::o;17875:474::-;17943:6;17951;18000:2;17988:9;17979:7;17975:23;17971:32;17968:119;;;18006:79;;:::i;:::-;17968:119;18126:1;18151:53;18196:7;18187:6;18176:9;18172:22;18151:53;:::i;:::-;18141:63;;18097:117;18253:2;18279:53;18324:7;18315:6;18304:9;18300:22;18279:53;:::i;:::-;18269:63;;18224:118;17875:474;;;;;:::o;18355:672::-;18434:6;18442;18450;18499:2;18487:9;18478:7;18474:23;18470:32;18467:119;;;18505:79;;:::i;:::-;18467:119;18625:1;18650:53;18695:7;18686:6;18675:9;18671:22;18650:53;:::i;:::-;18640:63;;18596:117;18780:2;18769:9;18765:18;18752:32;18811:18;18803:6;18800:30;18797:117;;;18833:79;;:::i;:::-;18797:117;18946:64;19002:7;18993:6;18982:9;18978:22;18946:64;:::i;:::-;18928:82;;;;18723:297;18355:672;;;;;:::o;19033:180::-;19081:77;19078:1;19071:88;19178:4;19175:1;19168:15;19202:4;19199:1;19192:15;19219:320;19263:6;19300:1;19294:4;19290:12;19280:22;;19347:1;19341:4;19337:12;19368:18;19358:81;;19424:4;19416:6;19412:17;19402:27;;19358:81;19486:2;19478:6;19475:14;19455:18;19452:38;19449:84;;19505:18;;:::i;:::-;19449:84;19270:269;19219:320;;;:::o;19545:141::-;19594:4;19617:3;19609:11;;19640:3;19637:1;19630:14;19674:4;19671:1;19661:18;19653:26;;19545:141;;;:::o;19692:93::-;19729:6;19776:2;19771;19764:5;19760:14;19756:23;19746:33;;19692:93;;;:::o;19791:107::-;19835:8;19885:5;19879:4;19875:16;19854:37;;19791:107;;;;:::o;19904:393::-;19973:6;20023:1;20011:10;20007:18;20046:97;20076:66;20065:9;20046:97;:::i;:::-;20164:39;20194:8;20183:9;20164:39;:::i;:::-;20152:51;;20236:4;20232:9;20225:5;20221:21;20212:30;;20285:4;20275:8;20271:19;20264:5;20261:30;20251:40;;19980:317;;19904:393;;;;;:::o;20303:60::-;20331:3;20352:5;20345:12;;20303:60;;;:::o;20369:142::-;20419:9;20452:53;20470:34;20479:24;20497:5;20479:24;:::i;:::-;20470:34;:::i;:::-;20452:53;:::i;:::-;20439:66;;20369:142;;;:::o;20517:75::-;20560:3;20581:5;20574:12;;20517:75;;;:::o;20598:269::-;20708:39;20739:7;20708:39;:::i;:::-;20769:91;20818:41;20842:16;20818:41;:::i;:::-;20810:6;20803:4;20797:11;20769:91;:::i;:::-;20763:4;20756:105;20674:193;20598:269;;;:::o;20873:73::-;20918:3;20873:73;:::o;20952:189::-;21029:32;;:::i;:::-;21070:65;21128:6;21120;21114:4;21070:65;:::i;:::-;21005:136;20952:189;;:::o;21147:186::-;21207:120;21224:3;21217:5;21214:14;21207:120;;;21278:39;21315:1;21308:5;21278:39;:::i;:::-;21251:1;21244:5;21240:13;21231:22;;21207:120;;;21147:186;;:::o;21339:543::-;21440:2;21435:3;21432:11;21429:446;;;21474:38;21506:5;21474:38;:::i;:::-;21558:29;21576:10;21558:29;:::i;:::-;21548:8;21544:44;21741:2;21729:10;21726:18;21723:49;;;21762:8;21747:23;;21723:49;21785:80;21841:22;21859:3;21841:22;:::i;:::-;21831:8;21827:37;21814:11;21785:80;:::i;:::-;21444:431;;21429:446;21339:543;;;:::o;21888:117::-;21942:8;21992:5;21986:4;21982:16;21961:37;;21888:117;;;;:::o;22011:169::-;22055:6;22088:51;22136:1;22132:6;22124:5;22121:1;22117:13;22088:51;:::i;:::-;22084:56;22169:4;22163;22159:15;22149:25;;22062:118;22011:169;;;;:::o;22185:295::-;22261:4;22407:29;22432:3;22426:4;22407:29;:::i;:::-;22399:37;;22469:3;22466:1;22462:11;22456:4;22453:21;22445:29;;22185:295;;;;:::o;22485:1395::-;22602:37;22635:3;22602:37;:::i;:::-;22704:18;22696:6;22693:30;22690:56;;;22726:18;;:::i;:::-;22690:56;22770:38;22802:4;22796:11;22770:38;:::i;:::-;22855:67;22915:6;22907;22901:4;22855:67;:::i;:::-;22949:1;22973:4;22960:17;;23005:2;22997:6;22994:14;23022:1;23017:618;;;;23679:1;23696:6;23693:77;;;23745:9;23740:3;23736:19;23730:26;23721:35;;23693:77;23796:67;23856:6;23849:5;23796:67;:::i;:::-;23790:4;23783:81;23652:222;22987:887;;23017:618;23069:4;23065:9;23057:6;23053:22;23103:37;23135:4;23103:37;:::i;:::-;23162:1;23176:208;23190:7;23187:1;23184:14;23176:208;;;23269:9;23264:3;23260:19;23254:26;23246:6;23239:42;23320:1;23312:6;23308:14;23298:24;;23367:2;23356:9;23352:18;23339:31;;23213:4;23210:1;23206:12;23201:17;;23176:208;;;23412:6;23403:7;23400:19;23397:179;;;23470:9;23465:3;23461:19;23455:26;23513:48;23555:4;23547:6;23543:17;23532:9;23513:48;:::i;:::-;23505:6;23498:64;23420:156;23397:179;23622:1;23618;23610:6;23606:14;23602:22;23596:4;23589:36;23024:611;;;22987:887;;22577:1303;;;22485:1395;;:::o;23886:220::-;24026:34;24022:1;24014:6;24010:14;24003:58;24095:3;24090:2;24082:6;24078:15;24071:28;23886:220;:::o;24112:366::-;24254:3;24275:67;24339:2;24334:3;24275:67;:::i;:::-;24268:74;;24351:93;24440:3;24351:93;:::i;:::-;24469:2;24464:3;24460:12;24453:19;;24112:366;;;:::o;24484:419::-;24650:4;24688:2;24677:9;24673:18;24665:26;;24737:9;24731:4;24727:20;24723:1;24712:9;24708:17;24701:47;24765:131;24891:4;24765:131;:::i;:::-;24757:139;;24484:419;;;:::o;24909:248::-;25049:34;25045:1;25037:6;25033:14;25026:58;25118:31;25113:2;25105:6;25101:15;25094:56;24909:248;:::o;25163:366::-;25305:3;25326:67;25390:2;25385:3;25326:67;:::i;:::-;25319:74;;25402:93;25491:3;25402:93;:::i;:::-;25520:2;25515:3;25511:12;25504:19;;25163:366;;;:::o;25535:419::-;25701:4;25739:2;25728:9;25724:18;25716:26;;25788:9;25782:4;25778:20;25774:1;25763:9;25759:17;25752:47;25816:131;25942:4;25816:131;:::i;:::-;25808:139;;25535:419;;;:::o;25960:163::-;26100:15;26096:1;26088:6;26084:14;26077:39;25960:163;:::o;26129:366::-;26271:3;26292:67;26356:2;26351:3;26292:67;:::i;:::-;26285:74;;26368:93;26457:3;26368:93;:::i;:::-;26486:2;26481:3;26477:12;26470:19;;26129:366;;;:::o;26501:419::-;26667:4;26705:2;26694:9;26690:18;26682:26;;26754:9;26748:4;26744:20;26740:1;26729:9;26725:17;26718:47;26782:131;26908:4;26782:131;:::i;:::-;26774:139;;26501:419;;;:::o;26926:180::-;26974:77;26971:1;26964:88;27071:4;27068:1;27061:15;27095:4;27092:1;27085:15;27112:194;27152:4;27172:20;27190:1;27172:20;:::i;:::-;27167:25;;27206:20;27224:1;27206:20;:::i;:::-;27201:25;;27250:1;27247;27243:9;27235:17;;27274:1;27268:4;27265:11;27262:37;;;27279:18;;:::i;:::-;27262:37;27112:194;;;;:::o;27312:232::-;27452:34;27448:1;27440:6;27436:14;27429:58;27521:15;27516:2;27508:6;27504:15;27497:40;27312:232;:::o;27550:366::-;27692:3;27713:67;27777:2;27772:3;27713:67;:::i;:::-;27706:74;;27789:93;27878:3;27789:93;:::i;:::-;27907:2;27902:3;27898:12;27891:19;;27550:366;;;:::o;27922:419::-;28088:4;28126:2;28115:9;28111:18;28103:26;;28175:9;28169:4;28165:20;28161:1;28150:9;28146:17;28139:47;28203:131;28329:4;28203:131;:::i;:::-;28195:139;;27922:419;;;:::o;28347:174::-;28487:26;28483:1;28475:6;28471:14;28464:50;28347:174;:::o;28527:366::-;28669:3;28690:67;28754:2;28749:3;28690:67;:::i;:::-;28683:74;;28766:93;28855:3;28766:93;:::i;:::-;28884:2;28879:3;28875:12;28868:19;;28527:366;;;:::o;28899:419::-;29065:4;29103:2;29092:9;29088:18;29080:26;;29152:9;29146:4;29142:20;29138:1;29127:9;29123:17;29116:47;29180:131;29306:4;29180:131;:::i;:::-;29172:139;;28899:419;;;:::o;29324:228::-;29464:34;29460:1;29452:6;29448:14;29441:58;29533:11;29528:2;29520:6;29516:15;29509:36;29324:228;:::o;29558:366::-;29700:3;29721:67;29785:2;29780:3;29721:67;:::i;:::-;29714:74;;29797:93;29886:3;29797:93;:::i;:::-;29915:2;29910:3;29906:12;29899:19;;29558:366;;;:::o;29930:419::-;30096:4;30134:2;30123:9;30119:18;30111:26;;30183:9;30177:4;30173:20;30169:1;30158:9;30154:17;30147:47;30211:131;30337:4;30211:131;:::i;:::-;30203:139;;29930:419;;;:::o;30355:148::-;30457:11;30494:3;30479:18;;30355:148;;;;:::o;30509:390::-;30615:3;30643:39;30676:5;30643:39;:::i;:::-;30698:89;30780:6;30775:3;30698:89;:::i;:::-;30691:96;;30796:65;30854:6;30849:3;30842:4;30835:5;30831:16;30796:65;:::i;:::-;30886:6;30881:3;30877:16;30870:23;;30619:280;30509:390;;;;:::o;30905:435::-;31085:3;31107:95;31198:3;31189:6;31107:95;:::i;:::-;31100:102;;31219:95;31310:3;31301:6;31219:95;:::i;:::-;31212:102;;31331:3;31324:10;;30905:435;;;;;:::o;31346:164::-;31486:16;31482:1;31474:6;31470:14;31463:40;31346:164;:::o;31516:366::-;31658:3;31679:67;31743:2;31738:3;31679:67;:::i;:::-;31672:74;;31755:93;31844:3;31755:93;:::i;:::-;31873:2;31868:3;31864:12;31857:19;;31516:366;;;:::o;31888:419::-;32054:4;32092:2;32081:9;32077:18;32069:26;;32141:9;32135:4;32131:20;32127:1;32116:9;32112:17;32105:47;32169:131;32295:4;32169:131;:::i;:::-;32161:139;;31888:419;;;:::o;32313:180::-;32361:77;32358:1;32351:88;32458:4;32455:1;32448:15;32482:4;32479:1;32472:15;32499:233;32538:3;32561:24;32579:5;32561:24;:::i;:::-;32552:33;;32607:66;32600:5;32597:77;32594:103;;32677:18;;:::i;:::-;32594:103;32724:1;32717:5;32713:13;32706:20;;32499:233;;;:::o;32738:225::-;32878:34;32874:1;32866:6;32862:14;32855:58;32947:8;32942:2;32934:6;32930:15;32923:33;32738:225;:::o;32969:366::-;33111:3;33132:67;33196:2;33191:3;33132:67;:::i;:::-;33125:74;;33208:93;33297:3;33208:93;:::i;:::-;33326:2;33321:3;33317:12;33310:19;;32969:366;;;:::o;33341:419::-;33507:4;33545:2;33534:9;33530:18;33522:26;;33594:9;33588:4;33584:20;33580:1;33569:9;33565:17;33558:47;33622:131;33748:4;33622:131;:::i;:::-;33614:139;;33341:419;;;:::o;33766:168::-;33906:20;33902:1;33894:6;33890:14;33883:44;33766:168;:::o;33940:366::-;34082:3;34103:67;34167:2;34162:3;34103:67;:::i;:::-;34096:74;;34179:93;34268:3;34179:93;:::i;:::-;34297:2;34292:3;34288:12;34281:19;;33940:366;;;:::o;34312:419::-;34478:4;34516:2;34505:9;34501:18;34493:26;;34565:9;34559:4;34555:20;34551:1;34540:9;34536:17;34529:47;34593:131;34719:4;34593:131;:::i;:::-;34585:139;;34312:419;;;:::o;34737:182::-;34877:34;34873:1;34865:6;34861:14;34854:58;34737:182;:::o;34925:366::-;35067:3;35088:67;35152:2;35147:3;35088:67;:::i;:::-;35081:74;;35164:93;35253:3;35164:93;:::i;:::-;35282:2;35277:3;35273:12;35266:19;;34925:366;;;:::o;35297:419::-;35463:4;35501:2;35490:9;35486:18;35478:26;;35550:9;35544:4;35540:20;35536:1;35525:9;35521:17;35514:47;35578:131;35704:4;35578:131;:::i;:::-;35570:139;;35297:419;;;:::o;35722:224::-;35862:34;35858:1;35850:6;35846:14;35839:58;35931:7;35926:2;35918:6;35914:15;35907:32;35722:224;:::o;35952:366::-;36094:3;36115:67;36179:2;36174:3;36115:67;:::i;:::-;36108:74;;36191:93;36280:3;36191:93;:::i;:::-;36309:2;36304:3;36300:12;36293:19;;35952:366;;;:::o;36324:419::-;36490:4;36528:2;36517:9;36513:18;36505:26;;36577:9;36571:4;36567:20;36563:1;36552:9;36548:17;36541:47;36605:131;36731:4;36605:131;:::i;:::-;36597:139;;36324:419;;;:::o;36749:223::-;36889:34;36885:1;36877:6;36873:14;36866:58;36958:6;36953:2;36945:6;36941:15;36934:31;36749:223;:::o;36978:366::-;37120:3;37141:67;37205:2;37200:3;37141:67;:::i;:::-;37134:74;;37217:93;37306:3;37217:93;:::i;:::-;37335:2;37330:3;37326:12;37319:19;;36978:366;;;:::o;37350:419::-;37516:4;37554:2;37543:9;37539:18;37531:26;;37603:9;37597:4;37593:20;37589:1;37578:9;37574:17;37567:47;37631:131;37757:4;37631:131;:::i;:::-;37623:139;;37350:419;;;:::o;37775:175::-;37915:27;37911:1;37903:6;37899:14;37892:51;37775:175;:::o;37956:366::-;38098:3;38119:67;38183:2;38178:3;38119:67;:::i;:::-;38112:74;;38195:93;38284:3;38195:93;:::i;:::-;38313:2;38308:3;38304:12;38297:19;;37956:366;;;:::o;38328:419::-;38494:4;38532:2;38521:9;38517:18;38509:26;;38581:9;38575:4;38571:20;38567:1;38556:9;38552:17;38545:47;38609:131;38735:4;38609:131;:::i;:::-;38601:139;;38328:419;;;:::o;38753:237::-;38893:34;38889:1;38881:6;38877:14;38870:58;38962:20;38957:2;38949:6;38945:15;38938:45;38753:237;:::o;38996:366::-;39138:3;39159:67;39223:2;39218:3;39159:67;:::i;:::-;39152:74;;39235:93;39324:3;39235:93;:::i;:::-;39353:2;39348:3;39344:12;39337:19;;38996:366;;;:::o;39368:419::-;39534:4;39572:2;39561:9;39557:18;39549:26;;39621:9;39615:4;39611:20;39607:1;39596:9;39592:17;39585:47;39649:131;39775:4;39649:131;:::i;:::-;39641:139;;39368:419;;;:::o;39793:180::-;39841:77;39838:1;39831:88;39938:4;39935:1;39928:15;39962:4;39959:1;39952:15;39979:164;40119:16;40115:1;40107:6;40103:14;40096:40;39979:164;:::o;40149:366::-;40291:3;40312:67;40376:2;40371:3;40312:67;:::i;:::-;40305:74;;40388:93;40477:3;40388:93;:::i;:::-;40506:2;40501:3;40497:12;40490:19;;40149:366;;;:::o;40521:419::-;40687:4;40725:2;40714:9;40710:18;40702:26;;40774:9;40768:4;40764:20;40760:1;40749:9;40745:17;40738:47;40802:131;40928:4;40802:131;:::i;:::-;40794:139;;40521:419;;;:::o;40946:191::-;40986:3;41005:20;41023:1;41005:20;:::i;:::-;41000:25;;41039:20;41057:1;41039:20;:::i;:::-;41034:25;;41082:1;41079;41075:9;41068:16;;41103:3;41100:1;41097:10;41094:36;;;41110:18;;:::i;:::-;41094:36;40946:191;;;;:::o;41143:98::-;41194:6;41228:5;41222:12;41212:22;;41143:98;;;:::o;41247:168::-;41330:11;41364:6;41359:3;41352:19;41404:4;41399:3;41395:14;41380:29;;41247:168;;;;:::o;41421:373::-;41507:3;41535:38;41567:5;41535:38;:::i;:::-;41589:70;41652:6;41647:3;41589:70;:::i;:::-;41582:77;;41668:65;41726:6;41721:3;41714:4;41707:5;41703:16;41668:65;:::i;:::-;41758:29;41780:6;41758:29;:::i;:::-;41753:3;41749:39;41742:46;;41511:283;41421:373;;;;:::o;41800:640::-;41995:4;42033:3;42022:9;42018:19;42010:27;;42047:71;42115:1;42104:9;42100:17;42091:6;42047:71;:::i;:::-;42128:72;42196:2;42185:9;42181:18;42172:6;42128:72;:::i;:::-;42210;42278:2;42267:9;42263:18;42254:6;42210:72;:::i;:::-;42329:9;42323:4;42319:20;42314:2;42303:9;42299:18;42292:48;42357:76;42428:4;42419:6;42357:76;:::i;:::-;42349:84;;41800:640;;;;;;;:::o;42446:141::-;42502:5;42533:6;42527:13;42518:22;;42549:32;42575:5;42549:32;:::i;:::-;42446:141;;;;:::o;42593:349::-;42662:6;42711:2;42699:9;42690:7;42686:23;42682:32;42679:119;;;42717:79;;:::i;:::-;42679:119;42837:1;42862:63;42917:7;42908:6;42897:9;42893:22;42862:63;:::i;:::-;42852:73;;42808:127;42593:349;;;;:::o;42948:182::-;43088:34;43084:1;43076:6;43072:14;43065:58;42948:182;:::o;43136:366::-;43278:3;43299:67;43363:2;43358:3;43299:67;:::i;:::-;43292:74;;43375:93;43464:3;43375:93;:::i;:::-;43493:2;43488:3;43484:12;43477:19;;43136:366;;;:::o;43508:419::-;43674:4;43712:2;43701:9;43697:18;43689:26;;43761:9;43755:4;43751:20;43747:1;43736:9;43732:17;43725:47;43789:131;43915:4;43789:131;:::i;:::-;43781:139;;43508:419;;;:::o;43933:178::-;44073:30;44069:1;44061:6;44057:14;44050:54;43933:178;:::o;44117:366::-;44259:3;44280:67;44344:2;44339:3;44280:67;:::i;:::-;44273:74;;44356:93;44445:3;44356:93;:::i;:::-;44474:2;44469:3;44465:12;44458:19;;44117:366;;;:::o;44489:419::-;44655:4;44693:2;44682:9;44678:18;44670:26;;44742:9;44736:4;44732:20;44728:1;44717:9;44713:17;44706:47;44770:131;44896:4;44770:131;:::i;:::-;44762:139;;44489:419;;;:::o

Swarm Source

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