ETH Price: $3,238.70 (-1.10%)
Gas: 4 Gwei

Token

Cute Cat Gang NFT (CCG)
 

Overview

Max Total Supply

15 CCG

Holders

8

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
sangley.eth
Balance
2 CCG
0xF7b8301347bB7267356Ed7835AC69ec0bC14dEce
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:
CuteCatGangNFT

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/access/Ownable.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;
    }
}


pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;


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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;


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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

pragma solidity ^0.8.0;



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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

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

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}


pragma solidity 0.8.3;

contract CuteCatGangNFT is ERC721, ERC721Enumerable,ERC721URIStorage, Ownable {
   using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;
    
    uint16 public constant maxSupply = 10001;
    string private _baseTokenURI = 'https://ipfs.io/ipfs/QmYTgYVACEEyg35HDMnXSVAr6qqfvLjbEg1pKsZm8CePnr/';
    
    uint256 public _mintForAllStartDate = 1632150000;

    constructor() ERC721("Cute Cat Gang NFT", "CCG") {
    }
    
    function setMintForAllStartDate(uint256 startDate) public onlyOwner {
        _mintForAllStartDate = startDate;
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }
    
    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }


    function setBaseURI(string memory _newbaseTokenURI) public onlyOwner {
        _baseTokenURI = _newbaseTokenURI;
    }

    function _baseURI() internal view override returns (string memory) {
        return _baseTokenURI;
    }

    // Get minting limit (for a single transaction) based on current token supply
    function getCurrentMintLimit() public pure returns (uint8) {
        return 50;
    }

    // Get ether price based on current token supply
    function getCurrentPrice() public pure returns (uint64) {
        return 42_000_000_000_000_000;
    }
    
    // Mint new token(s)
    function mint(uint8 _quantityToMint) public payable {
        require(_mintForAllStartDate <= block.timestamp, "Sale is not open");
        require(_quantityToMint >= 1, "Must mint at least 1");
        require(
            _quantityToMint <= getCurrentMintLimit(),
            "Maximum current buy limit for individual transaction exceeded"
        );
        require(
            (_quantityToMint + totalSupply()) <= maxSupply,
            "Exceeds maximum supply"
        );
        require((_quantityToMint + balanceOf(msg.sender)) <= 50, "Max mint per account is 50");
        require(
            msg.value == (getCurrentPrice() * _quantityToMint),
            "Ether submitted does not match current price"
        );

        for (uint8 i = 0; i < _quantityToMint; i++) {
            _tokenIds.increment();

            uint256 newItemId = _tokenIds.current();
            _mint(msg.sender, newItemId);
        }
    }
    
    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

    // Withdraw ether from contract
    function withdraw() public onlyOwner {
        require(address(this).balance > 0, "Balance must be positive");
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success == true, "Failed to withdraw ether");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_mintForAllStartDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentMintLimit","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getCurrentPrice","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"pure","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":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_quantityToMint","type":"uint8"}],"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":"string","name":"_newbaseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startDate","type":"uint256"}],"name":"setMintForAllStartDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060800160405280604481526020016200467160449139600d908051906020019062000035929190620001e0565b50636148a1f0600e553480156200004b57600080fd5b506040518060400160405280601181526020017f43757465204361742047616e67204e46540000000000000000000000000000008152506040518060400160405280600381526020017f43434700000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000d0929190620001e0565b508060019080519060200190620000e9929190620001e0565b5050506200010c620001006200011260201b60201c565b6200011a60201b60201c565b620002f5565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001ee9062000290565b90600052602060002090601f0160209004810192826200021257600085556200025e565b82601f106200022d57805160ff19168380011785556200025e565b828001600101855582156200025e579182015b828111156200025d57825182559160200191906001019062000240565b5b5090506200026d919062000271565b5090565b5b808211156200028c57600081600090555060010162000272565b5090565b60006002820490506001821680620002a957607f821691505b60208210811415620002c057620002bf620002c6565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61436c80620003056000396000f3fe60806040526004361061019c5760003560e01c80636352211e116100ec578063a22cb4651161008a578063d5abeb0111610064578063d5abeb01146105b7578063e985e9c5146105e2578063eb91d37e1461061f578063f2fde38b1461064a5761019c565b8063a22cb46514610528578063b88d4fde14610551578063c87b56dd1461057a5761019c565b8063715018a6116100c6578063715018a6146104925780638da5cb5b146104a957806395d89b41146104d45780639d12006a146104ff5761019c565b80636352211e146103fc5780636ecd23061461043957806370a08231146104555761019c565b80632f745c59116101595780633ccfd60b116101335780633ccfd60b1461035657806342842e0e1461036d5780634f6ccce71461039657806355f804b3146103d35761019c565b80632f745c59146102c3578063339181d9146103005780633cc420941461032b5761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b31461024657806318160ddd1461026f57806323b872dd1461029a575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612cfd565b610673565b6040516101d59190613353565b60405180910390f35b3480156101ea57600080fd5b506101f3610685565b604051610200919061336e565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b9190612d90565b610717565b60405161023d91906132ec565b60405180910390f35b34801561025257600080fd5b5061026d60048036038101906102689190612cc1565b61079c565b005b34801561027b57600080fd5b506102846108b4565b604051610291919061370b565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc9190612bbb565b6108c1565b005b3480156102cf57600080fd5b506102ea60048036038101906102e59190612cc1565b610921565b6040516102f7919061370b565b60405180910390f35b34801561030c57600080fd5b506103156109c6565b6040516103229190613741565b60405180910390f35b34801561033757600080fd5b506103406109cf565b60405161034d919061370b565b60405180910390f35b34801561036257600080fd5b5061036b6109d5565b005b34801561037957600080fd5b50610394600480360381019061038f9190612bbb565b610b4a565b005b3480156103a257600080fd5b506103bd60048036038101906103b89190612d90565b610b6a565b6040516103ca919061370b565b60405180910390f35b3480156103df57600080fd5b506103fa60048036038101906103f59190612d4f565b610c01565b005b34801561040857600080fd5b50610423600480360381019061041e9190612d90565b610c97565b60405161043091906132ec565b60405180910390f35b610453600480360381019061044e9190612db9565b610d49565b005b34801561046157600080fd5b5061047c60048036038101906104779190612b56565b610f89565b604051610489919061370b565b60405180910390f35b34801561049e57600080fd5b506104a7611041565b005b3480156104b557600080fd5b506104be6110c9565b6040516104cb91906132ec565b60405180910390f35b3480156104e057600080fd5b506104e96110f3565b6040516104f6919061336e565b60405180910390f35b34801561050b57600080fd5b5061052660048036038101906105219190612d90565b611185565b005b34801561053457600080fd5b5061054f600480360381019061054a9190612c85565b61120b565b005b34801561055d57600080fd5b5061057860048036038101906105739190612c0a565b61138c565b005b34801561058657600080fd5b506105a1600480360381019061059c9190612d90565b6113ee565b6040516105ae919061336e565b60405180910390f35b3480156105c357600080fd5b506105cc611400565b6040516105d991906136f0565b60405180910390f35b3480156105ee57600080fd5b5061060960048036038101906106049190612b7f565b611406565b6040516106169190613353565b60405180910390f35b34801561062b57600080fd5b5061063461149a565b6040516106419190613726565b60405180910390f35b34801561065657600080fd5b50610671600480360381019061066c9190612b56565b6114a9565b005b600061067e826115a1565b9050919050565b60606000805461069490613a13565b80601f01602080910402602001604051908101604052809291908181526020018280546106c090613a13565b801561070d5780601f106106e25761010080835404028352916020019161070d565b820191906000526020600020905b8154815290600101906020018083116106f057829003601f168201915b5050505050905090565b60006107228261161b565b610761576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075890613570565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107a782610c97565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080f90613610565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610837611687565b73ffffffffffffffffffffffffffffffffffffffff161480610866575061086581610860611687565b611406565b5b6108a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089c906134d0565b60405180910390fd5b6108af838361168f565b505050565b6000600880549050905090565b6108d26108cc611687565b82611748565b610911576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090890613690565b60405180910390fd5b61091c838383611826565b505050565b600061092c83610f89565b821061096d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096490613390565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60006032905090565b600e5481565b6109dd611687565b73ffffffffffffffffffffffffffffffffffffffff166109fb6110c9565b73ffffffffffffffffffffffffffffffffffffffff1614610a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4890613590565b60405180910390fd5b60004711610a94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8b90613430565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610aba906132d7565b60006040518083038185875af1925050503d8060008114610af7576040519150601f19603f3d011682016040523d82523d6000602084013e610afc565b606091505b505090506001151581151514610b47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3e906135f0565b60405180910390fd5b50565b610b658383836040518060200160405280600081525061138c565b505050565b6000610b746108b4565b8210610bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bac906136d0565b60405180910390fd5b60088281548110610bef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610c09611687565b73ffffffffffffffffffffffffffffffffffffffff16610c276110c9565b73ffffffffffffffffffffffffffffffffffffffff1614610c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7490613590565b60405180910390fd5b80600d9080519060200190610c93929190612965565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3790613510565b60405180910390fd5b80915050919050565b42600e541115610d8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8590613670565b60405180910390fd5b60018160ff161015610dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcc90613650565b60405180910390fd5b610ddd6109c6565b60ff168160ff161115610e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1c90613450565b60405180910390fd5b61271161ffff16610e346108b4565b8260ff16610e429190613831565b1115610e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7a90613630565b60405180910390fd5b6032610e8e33610f89565b8260ff16610e9c9190613831565b1115610edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed4906136b0565b60405180910390fd5b8060ff16610ee961149a565b610ef391906138b8565b67ffffffffffffffff163414610f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f35906133b0565b60405180910390fd5b60005b8160ff168160ff161015610f8557610f59600c611a82565b6000610f65600c611a98565b9050610f713382611aa6565b508080610f7d90613abf565b915050610f41565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff1906134f0565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611049611687565b73ffffffffffffffffffffffffffffffffffffffff166110676110c9565b73ffffffffffffffffffffffffffffffffffffffff16146110bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b490613590565b60405180910390fd5b6110c76000611c74565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461110290613a13565b80601f016020809104026020016040519081016040528092919081815260200182805461112e90613a13565b801561117b5780601f106111505761010080835404028352916020019161117b565b820191906000526020600020905b81548152906001019060200180831161115e57829003601f168201915b5050505050905090565b61118d611687565b73ffffffffffffffffffffffffffffffffffffffff166111ab6110c9565b73ffffffffffffffffffffffffffffffffffffffff1614611201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f890613590565b60405180910390fd5b80600e8190555050565b611213611687565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611281576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127890613490565b60405180910390fd5b806005600061128e611687565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661133b611687565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113809190613353565b60405180910390a35050565b61139d611397611687565b83611748565b6113dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d390613690565b60405180910390fd5b6113e884848484611d3a565b50505050565b60606113f982611d96565b9050919050565b61271181565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000669536c708910000905090565b6114b1611687565b73ffffffffffffffffffffffffffffffffffffffff166114cf6110c9565b73ffffffffffffffffffffffffffffffffffffffff1614611525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151c90613590565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158c906133f0565b60405180910390fd5b61159e81611c74565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611614575061161382611ee8565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661170283610c97565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006117538261161b565b611792576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611789906134b0565b60405180910390fd5b600061179d83610c97565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061180c57508373ffffffffffffffffffffffffffffffffffffffff166117f484610717565b73ffffffffffffffffffffffffffffffffffffffff16145b8061181d575061181c8185611406565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661184682610c97565b73ffffffffffffffffffffffffffffffffffffffff161461189c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611893906135b0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561190c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190390613470565b60405180910390fd5b611917838383611fca565b61192260008261168f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461197291906138fa565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119c99190613831565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0d90613530565b60405180910390fd5b611b1f8161161b565b15611b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5690613410565b60405180910390fd5b611b6b60008383611fca565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bbb9190613831565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611d45848484611826565b611d5184848484611fda565b611d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d87906133d0565b60405180910390fd5b50505050565b6060611da18261161b565b611de0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd790613550565b60405180910390fd5b6000600a60008481526020019081526020016000208054611e0090613a13565b80601f0160208091040260200160405190810160405280929190818152602001828054611e2c90613a13565b8015611e795780601f10611e4e57610100808354040283529160200191611e79565b820191906000526020600020905b815481529060010190602001808311611e5c57829003601f168201915b505050505090506000611e8a612171565b9050600081511415611ea0578192505050611ee3565b600082511115611ed5578082604051602001611ebd9291906132b3565b60405160208183030381529060405292505050611ee3565b611ede84612203565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611fb357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611fc35750611fc2826122aa565b5b9050919050565b611fd5838383612314565b505050565b6000611ffb8473ffffffffffffffffffffffffffffffffffffffff16612428565b15612164578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612024611687565b8786866040518563ffffffff1660e01b81526004016120469493929190613307565b602060405180830381600087803b15801561206057600080fd5b505af192505050801561209157506040513d601f19601f8201168201806040525081019061208e9190612d26565b60015b612114573d80600081146120c1576040519150601f19603f3d011682016040523d82523d6000602084013e6120c6565b606091505b5060008151141561210c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612103906133d0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612169565b600190505b949350505050565b6060600d805461218090613a13565b80601f01602080910402602001604051908101604052809291908181526020018280546121ac90613a13565b80156121f95780601f106121ce576101008083540402835291602001916121f9565b820191906000526020600020905b8154815290600101906020018083116121dc57829003601f168201915b5050505050905090565b606061220e8261161b565b61224d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612244906135d0565b60405180910390fd5b6000612257612171565b9050600081511161227757604051806020016040528060008152506122a2565b806122818461243b565b6040516020016122929291906132b3565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61231f8383836125e8565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123625761235d816125ed565b6123a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146123a05761239f8382612636565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123e4576123df816127a3565b612423565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146124225761242182826128e6565b5b5b505050565b600080823b905060008111915050919050565b60606000821415612483576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125e3565b600082905060005b600082146124b557808061249e90613a76565b915050600a826124ae9190613887565b915061248b565b60008167ffffffffffffffff8111156124f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156125295781602001600182028036833780820191505090505b5090505b600085146125dc5760018261254291906138fa565b9150600a856125519190613ae9565b603061255d9190613831565b60f81b818381518110612599577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125d59190613887565b945061252d565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161264384610f89565b61264d91906138fa565b9050600060076000848152602001908152602001600020549050818114612732576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127b791906138fa565b905060006009600084815260200190815260200160002054905060006008838154811061280d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612855577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806128ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006128f183610f89565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461297190613a13565b90600052602060002090601f01602090048101928261299357600085556129da565b82601f106129ac57805160ff19168380011785556129da565b828001600101855582156129da579182015b828111156129d95782518255916020019190600101906129be565b5b5090506129e791906129eb565b5090565b5b80821115612a045760008160009055506001016129ec565b5090565b6000612a1b612a1684613781565b61375c565b905082815260208101848484011115612a3357600080fd5b612a3e8482856139d1565b509392505050565b6000612a59612a54846137b2565b61375c565b905082815260208101848484011115612a7157600080fd5b612a7c8482856139d1565b509392505050565b600081359050612a93816142c3565b92915050565b600081359050612aa8816142da565b92915050565b600081359050612abd816142f1565b92915050565b600081519050612ad2816142f1565b92915050565b600082601f830112612ae957600080fd5b8135612af9848260208601612a08565b91505092915050565b600082601f830112612b1357600080fd5b8135612b23848260208601612a46565b91505092915050565b600081359050612b3b81614308565b92915050565b600081359050612b508161431f565b92915050565b600060208284031215612b6857600080fd5b6000612b7684828501612a84565b91505092915050565b60008060408385031215612b9257600080fd5b6000612ba085828601612a84565b9250506020612bb185828601612a84565b9150509250929050565b600080600060608486031215612bd057600080fd5b6000612bde86828701612a84565b9350506020612bef86828701612a84565b9250506040612c0086828701612b2c565b9150509250925092565b60008060008060808587031215612c2057600080fd5b6000612c2e87828801612a84565b9450506020612c3f87828801612a84565b9350506040612c5087828801612b2c565b925050606085013567ffffffffffffffff811115612c6d57600080fd5b612c7987828801612ad8565b91505092959194509250565b60008060408385031215612c9857600080fd5b6000612ca685828601612a84565b9250506020612cb785828601612a99565b9150509250929050565b60008060408385031215612cd457600080fd5b6000612ce285828601612a84565b9250506020612cf385828601612b2c565b9150509250929050565b600060208284031215612d0f57600080fd5b6000612d1d84828501612aae565b91505092915050565b600060208284031215612d3857600080fd5b6000612d4684828501612ac3565b91505092915050565b600060208284031215612d6157600080fd5b600082013567ffffffffffffffff811115612d7b57600080fd5b612d8784828501612b02565b91505092915050565b600060208284031215612da257600080fd5b6000612db084828501612b2c565b91505092915050565b600060208284031215612dcb57600080fd5b6000612dd984828501612b41565b91505092915050565b612deb8161392e565b82525050565b612dfa81613940565b82525050565b6000612e0b826137e3565b612e1581856137f9565b9350612e258185602086016139e0565b612e2e81613bd6565b840191505092915050565b6000612e44826137ee565b612e4e8185613815565b9350612e5e8185602086016139e0565b612e6781613bd6565b840191505092915050565b6000612e7d826137ee565b612e878185613826565b9350612e978185602086016139e0565b80840191505092915050565b6000612eb0602b83613815565b9150612ebb82613be7565b604082019050919050565b6000612ed3602c83613815565b9150612ede82613c36565b604082019050919050565b6000612ef6603283613815565b9150612f0182613c85565b604082019050919050565b6000612f19602683613815565b9150612f2482613cd4565b604082019050919050565b6000612f3c601c83613815565b9150612f4782613d23565b602082019050919050565b6000612f5f601883613815565b9150612f6a82613d4c565b602082019050919050565b6000612f82603d83613815565b9150612f8d82613d75565b604082019050919050565b6000612fa5602483613815565b9150612fb082613dc4565b604082019050919050565b6000612fc8601983613815565b9150612fd382613e13565b602082019050919050565b6000612feb602c83613815565b9150612ff682613e3c565b604082019050919050565b600061300e603883613815565b915061301982613e8b565b604082019050919050565b6000613031602a83613815565b915061303c82613eda565b604082019050919050565b6000613054602983613815565b915061305f82613f29565b604082019050919050565b6000613077602083613815565b915061308282613f78565b602082019050919050565b600061309a603183613815565b91506130a582613fa1565b604082019050919050565b60006130bd602c83613815565b91506130c882613ff0565b604082019050919050565b60006130e0602083613815565b91506130eb8261403f565b602082019050919050565b6000613103602983613815565b915061310e82614068565b604082019050919050565b6000613126602f83613815565b9150613131826140b7565b604082019050919050565b6000613149601883613815565b915061315482614106565b602082019050919050565b600061316c602183613815565b91506131778261412f565b604082019050919050565b600061318f601683613815565b915061319a8261417e565b602082019050919050565b60006131b2601483613815565b91506131bd826141a7565b602082019050919050565b60006131d5601083613815565b91506131e0826141d0565b602082019050919050565b60006131f860008361380a565b9150613203826141f9565b600082019050919050565b600061321b603183613815565b9150613226826141fc565b604082019050919050565b600061323e601a83613815565b91506132498261424b565b602082019050919050565b6000613261602c83613815565b915061326c82614274565b604082019050919050565b61328081613978565b82525050565b61328f816139a6565b82525050565b61329e816139b0565b82525050565b6132ad816139c4565b82525050565b60006132bf8285612e72565b91506132cb8284612e72565b91508190509392505050565b60006132e2826131eb565b9150819050919050565b60006020820190506133016000830184612de2565b92915050565b600060808201905061331c6000830187612de2565b6133296020830186612de2565b6133366040830185613286565b81810360608301526133488184612e00565b905095945050505050565b60006020820190506133686000830184612df1565b92915050565b600060208201905081810360008301526133888184612e39565b905092915050565b600060208201905081810360008301526133a981612ea3565b9050919050565b600060208201905081810360008301526133c981612ec6565b9050919050565b600060208201905081810360008301526133e981612ee9565b9050919050565b6000602082019050818103600083015261340981612f0c565b9050919050565b6000602082019050818103600083015261342981612f2f565b9050919050565b6000602082019050818103600083015261344981612f52565b9050919050565b6000602082019050818103600083015261346981612f75565b9050919050565b6000602082019050818103600083015261348981612f98565b9050919050565b600060208201905081810360008301526134a981612fbb565b9050919050565b600060208201905081810360008301526134c981612fde565b9050919050565b600060208201905081810360008301526134e981613001565b9050919050565b6000602082019050818103600083015261350981613024565b9050919050565b6000602082019050818103600083015261352981613047565b9050919050565b600060208201905081810360008301526135498161306a565b9050919050565b600060208201905081810360008301526135698161308d565b9050919050565b60006020820190508181036000830152613589816130b0565b9050919050565b600060208201905081810360008301526135a9816130d3565b9050919050565b600060208201905081810360008301526135c9816130f6565b9050919050565b600060208201905081810360008301526135e981613119565b9050919050565b600060208201905081810360008301526136098161313c565b9050919050565b600060208201905081810360008301526136298161315f565b9050919050565b6000602082019050818103600083015261364981613182565b9050919050565b60006020820190508181036000830152613669816131a5565b9050919050565b60006020820190508181036000830152613689816131c8565b9050919050565b600060208201905081810360008301526136a98161320e565b9050919050565b600060208201905081810360008301526136c981613231565b9050919050565b600060208201905081810360008301526136e981613254565b9050919050565b60006020820190506137056000830184613277565b92915050565b60006020820190506137206000830184613286565b92915050565b600060208201905061373b6000830184613295565b92915050565b600060208201905061375660008301846132a4565b92915050565b6000613766613777565b90506137728282613a45565b919050565b6000604051905090565b600067ffffffffffffffff82111561379c5761379b613ba7565b5b6137a582613bd6565b9050602081019050919050565b600067ffffffffffffffff8211156137cd576137cc613ba7565b5b6137d682613bd6565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061383c826139a6565b9150613847836139a6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561387c5761387b613b1a565b5b828201905092915050565b6000613892826139a6565b915061389d836139a6565b9250826138ad576138ac613b49565b5b828204905092915050565b60006138c3826139b0565b91506138ce836139b0565b92508167ffffffffffffffff04831182151516156138ef576138ee613b1a565b5b828202905092915050565b6000613905826139a6565b9150613910836139a6565b92508282101561392357613922613b1a565b5b828203905092915050565b600061393982613986565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156139fe5780820151818401526020810190506139e3565b83811115613a0d576000848401525b50505050565b60006002820490506001821680613a2b57607f821691505b60208210811415613a3f57613a3e613b78565b5b50919050565b613a4e82613bd6565b810181811067ffffffffffffffff82111715613a6d57613a6c613ba7565b5b80604052505050565b6000613a81826139a6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ab457613ab3613b1a565b5b600182019050919050565b6000613aca826139c4565b915060ff821415613ade57613add613b1a565b5b600182019050919050565b6000613af4826139a6565b9150613aff836139a6565b925082613b0f57613b0e613b49565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4574686572207375626d697474656420646f6573206e6f74206d61746368206360008201527f757272656e742070726963650000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f42616c616e6365206d75737420626520706f7369746976650000000000000000600082015250565b7f4d6178696d756d2063757272656e7420627579206c696d697420666f7220696e60008201527f646976696475616c207472616e73616374696f6e206578636565646564000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4661696c656420746f2077697468647261772065746865720000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b7f4d757374206d696e74206174206c656173742031000000000000000000000000600082015250565b7f53616c65206973206e6f74206f70656e00000000000000000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4d6178206d696e7420706572206163636f756e74206973203530000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6142cc8161392e565b81146142d757600080fd5b50565b6142e381613940565b81146142ee57600080fd5b50565b6142fa8161394c565b811461430557600080fd5b50565b614311816139a6565b811461431c57600080fd5b50565b614328816139c4565b811461433357600080fd5b5056fea264697066735822122037e0623aa0a7fe7b4035bc7d81777a330f41cab258311f14adbf3a46d8ad677464736f6c6343000803003368747470733a2f2f697066732e696f2f697066732f516d5954675956414345457967333548444d6e585356417236717166764c6a62456731704b735a6d384365506e722f

Deployed Bytecode

0x60806040526004361061019c5760003560e01c80636352211e116100ec578063a22cb4651161008a578063d5abeb0111610064578063d5abeb01146105b7578063e985e9c5146105e2578063eb91d37e1461061f578063f2fde38b1461064a5761019c565b8063a22cb46514610528578063b88d4fde14610551578063c87b56dd1461057a5761019c565b8063715018a6116100c6578063715018a6146104925780638da5cb5b146104a957806395d89b41146104d45780639d12006a146104ff5761019c565b80636352211e146103fc5780636ecd23061461043957806370a08231146104555761019c565b80632f745c59116101595780633ccfd60b116101335780633ccfd60b1461035657806342842e0e1461036d5780634f6ccce71461039657806355f804b3146103d35761019c565b80632f745c59146102c3578063339181d9146103005780633cc420941461032b5761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b31461024657806318160ddd1461026f57806323b872dd1461029a575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612cfd565b610673565b6040516101d59190613353565b60405180910390f35b3480156101ea57600080fd5b506101f3610685565b604051610200919061336e565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b9190612d90565b610717565b60405161023d91906132ec565b60405180910390f35b34801561025257600080fd5b5061026d60048036038101906102689190612cc1565b61079c565b005b34801561027b57600080fd5b506102846108b4565b604051610291919061370b565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc9190612bbb565b6108c1565b005b3480156102cf57600080fd5b506102ea60048036038101906102e59190612cc1565b610921565b6040516102f7919061370b565b60405180910390f35b34801561030c57600080fd5b506103156109c6565b6040516103229190613741565b60405180910390f35b34801561033757600080fd5b506103406109cf565b60405161034d919061370b565b60405180910390f35b34801561036257600080fd5b5061036b6109d5565b005b34801561037957600080fd5b50610394600480360381019061038f9190612bbb565b610b4a565b005b3480156103a257600080fd5b506103bd60048036038101906103b89190612d90565b610b6a565b6040516103ca919061370b565b60405180910390f35b3480156103df57600080fd5b506103fa60048036038101906103f59190612d4f565b610c01565b005b34801561040857600080fd5b50610423600480360381019061041e9190612d90565b610c97565b60405161043091906132ec565b60405180910390f35b610453600480360381019061044e9190612db9565b610d49565b005b34801561046157600080fd5b5061047c60048036038101906104779190612b56565b610f89565b604051610489919061370b565b60405180910390f35b34801561049e57600080fd5b506104a7611041565b005b3480156104b557600080fd5b506104be6110c9565b6040516104cb91906132ec565b60405180910390f35b3480156104e057600080fd5b506104e96110f3565b6040516104f6919061336e565b60405180910390f35b34801561050b57600080fd5b5061052660048036038101906105219190612d90565b611185565b005b34801561053457600080fd5b5061054f600480360381019061054a9190612c85565b61120b565b005b34801561055d57600080fd5b5061057860048036038101906105739190612c0a565b61138c565b005b34801561058657600080fd5b506105a1600480360381019061059c9190612d90565b6113ee565b6040516105ae919061336e565b60405180910390f35b3480156105c357600080fd5b506105cc611400565b6040516105d991906136f0565b60405180910390f35b3480156105ee57600080fd5b5061060960048036038101906106049190612b7f565b611406565b6040516106169190613353565b60405180910390f35b34801561062b57600080fd5b5061063461149a565b6040516106419190613726565b60405180910390f35b34801561065657600080fd5b50610671600480360381019061066c9190612b56565b6114a9565b005b600061067e826115a1565b9050919050565b60606000805461069490613a13565b80601f01602080910402602001604051908101604052809291908181526020018280546106c090613a13565b801561070d5780601f106106e25761010080835404028352916020019161070d565b820191906000526020600020905b8154815290600101906020018083116106f057829003601f168201915b5050505050905090565b60006107228261161b565b610761576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075890613570565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107a782610c97565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080f90613610565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610837611687565b73ffffffffffffffffffffffffffffffffffffffff161480610866575061086581610860611687565b611406565b5b6108a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089c906134d0565b60405180910390fd5b6108af838361168f565b505050565b6000600880549050905090565b6108d26108cc611687565b82611748565b610911576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090890613690565b60405180910390fd5b61091c838383611826565b505050565b600061092c83610f89565b821061096d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096490613390565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60006032905090565b600e5481565b6109dd611687565b73ffffffffffffffffffffffffffffffffffffffff166109fb6110c9565b73ffffffffffffffffffffffffffffffffffffffff1614610a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4890613590565b60405180910390fd5b60004711610a94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8b90613430565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610aba906132d7565b60006040518083038185875af1925050503d8060008114610af7576040519150601f19603f3d011682016040523d82523d6000602084013e610afc565b606091505b505090506001151581151514610b47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3e906135f0565b60405180910390fd5b50565b610b658383836040518060200160405280600081525061138c565b505050565b6000610b746108b4565b8210610bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bac906136d0565b60405180910390fd5b60088281548110610bef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610c09611687565b73ffffffffffffffffffffffffffffffffffffffff16610c276110c9565b73ffffffffffffffffffffffffffffffffffffffff1614610c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7490613590565b60405180910390fd5b80600d9080519060200190610c93929190612965565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3790613510565b60405180910390fd5b80915050919050565b42600e541115610d8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8590613670565b60405180910390fd5b60018160ff161015610dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcc90613650565b60405180910390fd5b610ddd6109c6565b60ff168160ff161115610e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1c90613450565b60405180910390fd5b61271161ffff16610e346108b4565b8260ff16610e429190613831565b1115610e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7a90613630565b60405180910390fd5b6032610e8e33610f89565b8260ff16610e9c9190613831565b1115610edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed4906136b0565b60405180910390fd5b8060ff16610ee961149a565b610ef391906138b8565b67ffffffffffffffff163414610f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f35906133b0565b60405180910390fd5b60005b8160ff168160ff161015610f8557610f59600c611a82565b6000610f65600c611a98565b9050610f713382611aa6565b508080610f7d90613abf565b915050610f41565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff1906134f0565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611049611687565b73ffffffffffffffffffffffffffffffffffffffff166110676110c9565b73ffffffffffffffffffffffffffffffffffffffff16146110bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b490613590565b60405180910390fd5b6110c76000611c74565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461110290613a13565b80601f016020809104026020016040519081016040528092919081815260200182805461112e90613a13565b801561117b5780601f106111505761010080835404028352916020019161117b565b820191906000526020600020905b81548152906001019060200180831161115e57829003601f168201915b5050505050905090565b61118d611687565b73ffffffffffffffffffffffffffffffffffffffff166111ab6110c9565b73ffffffffffffffffffffffffffffffffffffffff1614611201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f890613590565b60405180910390fd5b80600e8190555050565b611213611687565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611281576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127890613490565b60405180910390fd5b806005600061128e611687565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661133b611687565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113809190613353565b60405180910390a35050565b61139d611397611687565b83611748565b6113dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d390613690565b60405180910390fd5b6113e884848484611d3a565b50505050565b60606113f982611d96565b9050919050565b61271181565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000669536c708910000905090565b6114b1611687565b73ffffffffffffffffffffffffffffffffffffffff166114cf6110c9565b73ffffffffffffffffffffffffffffffffffffffff1614611525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151c90613590565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158c906133f0565b60405180910390fd5b61159e81611c74565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611614575061161382611ee8565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661170283610c97565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006117538261161b565b611792576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611789906134b0565b60405180910390fd5b600061179d83610c97565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061180c57508373ffffffffffffffffffffffffffffffffffffffff166117f484610717565b73ffffffffffffffffffffffffffffffffffffffff16145b8061181d575061181c8185611406565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661184682610c97565b73ffffffffffffffffffffffffffffffffffffffff161461189c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611893906135b0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561190c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190390613470565b60405180910390fd5b611917838383611fca565b61192260008261168f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461197291906138fa565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119c99190613831565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0d90613530565b60405180910390fd5b611b1f8161161b565b15611b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5690613410565b60405180910390fd5b611b6b60008383611fca565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bbb9190613831565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611d45848484611826565b611d5184848484611fda565b611d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d87906133d0565b60405180910390fd5b50505050565b6060611da18261161b565b611de0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd790613550565b60405180910390fd5b6000600a60008481526020019081526020016000208054611e0090613a13565b80601f0160208091040260200160405190810160405280929190818152602001828054611e2c90613a13565b8015611e795780601f10611e4e57610100808354040283529160200191611e79565b820191906000526020600020905b815481529060010190602001808311611e5c57829003601f168201915b505050505090506000611e8a612171565b9050600081511415611ea0578192505050611ee3565b600082511115611ed5578082604051602001611ebd9291906132b3565b60405160208183030381529060405292505050611ee3565b611ede84612203565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611fb357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611fc35750611fc2826122aa565b5b9050919050565b611fd5838383612314565b505050565b6000611ffb8473ffffffffffffffffffffffffffffffffffffffff16612428565b15612164578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612024611687565b8786866040518563ffffffff1660e01b81526004016120469493929190613307565b602060405180830381600087803b15801561206057600080fd5b505af192505050801561209157506040513d601f19601f8201168201806040525081019061208e9190612d26565b60015b612114573d80600081146120c1576040519150601f19603f3d011682016040523d82523d6000602084013e6120c6565b606091505b5060008151141561210c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612103906133d0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612169565b600190505b949350505050565b6060600d805461218090613a13565b80601f01602080910402602001604051908101604052809291908181526020018280546121ac90613a13565b80156121f95780601f106121ce576101008083540402835291602001916121f9565b820191906000526020600020905b8154815290600101906020018083116121dc57829003601f168201915b5050505050905090565b606061220e8261161b565b61224d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612244906135d0565b60405180910390fd5b6000612257612171565b9050600081511161227757604051806020016040528060008152506122a2565b806122818461243b565b6040516020016122929291906132b3565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61231f8383836125e8565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123625761235d816125ed565b6123a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146123a05761239f8382612636565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123e4576123df816127a3565b612423565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146124225761242182826128e6565b5b5b505050565b600080823b905060008111915050919050565b60606000821415612483576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125e3565b600082905060005b600082146124b557808061249e90613a76565b915050600a826124ae9190613887565b915061248b565b60008167ffffffffffffffff8111156124f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156125295781602001600182028036833780820191505090505b5090505b600085146125dc5760018261254291906138fa565b9150600a856125519190613ae9565b603061255d9190613831565b60f81b818381518110612599577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125d59190613887565b945061252d565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161264384610f89565b61264d91906138fa565b9050600060076000848152602001908152602001600020549050818114612732576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127b791906138fa565b905060006009600084815260200190815260200160002054905060006008838154811061280d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612855577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806128ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006128f183610f89565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461297190613a13565b90600052602060002090601f01602090048101928261299357600085556129da565b82601f106129ac57805160ff19168380011785556129da565b828001600101855582156129da579182015b828111156129d95782518255916020019190600101906129be565b5b5090506129e791906129eb565b5090565b5b80821115612a045760008160009055506001016129ec565b5090565b6000612a1b612a1684613781565b61375c565b905082815260208101848484011115612a3357600080fd5b612a3e8482856139d1565b509392505050565b6000612a59612a54846137b2565b61375c565b905082815260208101848484011115612a7157600080fd5b612a7c8482856139d1565b509392505050565b600081359050612a93816142c3565b92915050565b600081359050612aa8816142da565b92915050565b600081359050612abd816142f1565b92915050565b600081519050612ad2816142f1565b92915050565b600082601f830112612ae957600080fd5b8135612af9848260208601612a08565b91505092915050565b600082601f830112612b1357600080fd5b8135612b23848260208601612a46565b91505092915050565b600081359050612b3b81614308565b92915050565b600081359050612b508161431f565b92915050565b600060208284031215612b6857600080fd5b6000612b7684828501612a84565b91505092915050565b60008060408385031215612b9257600080fd5b6000612ba085828601612a84565b9250506020612bb185828601612a84565b9150509250929050565b600080600060608486031215612bd057600080fd5b6000612bde86828701612a84565b9350506020612bef86828701612a84565b9250506040612c0086828701612b2c565b9150509250925092565b60008060008060808587031215612c2057600080fd5b6000612c2e87828801612a84565b9450506020612c3f87828801612a84565b9350506040612c5087828801612b2c565b925050606085013567ffffffffffffffff811115612c6d57600080fd5b612c7987828801612ad8565b91505092959194509250565b60008060408385031215612c9857600080fd5b6000612ca685828601612a84565b9250506020612cb785828601612a99565b9150509250929050565b60008060408385031215612cd457600080fd5b6000612ce285828601612a84565b9250506020612cf385828601612b2c565b9150509250929050565b600060208284031215612d0f57600080fd5b6000612d1d84828501612aae565b91505092915050565b600060208284031215612d3857600080fd5b6000612d4684828501612ac3565b91505092915050565b600060208284031215612d6157600080fd5b600082013567ffffffffffffffff811115612d7b57600080fd5b612d8784828501612b02565b91505092915050565b600060208284031215612da257600080fd5b6000612db084828501612b2c565b91505092915050565b600060208284031215612dcb57600080fd5b6000612dd984828501612b41565b91505092915050565b612deb8161392e565b82525050565b612dfa81613940565b82525050565b6000612e0b826137e3565b612e1581856137f9565b9350612e258185602086016139e0565b612e2e81613bd6565b840191505092915050565b6000612e44826137ee565b612e4e8185613815565b9350612e5e8185602086016139e0565b612e6781613bd6565b840191505092915050565b6000612e7d826137ee565b612e878185613826565b9350612e978185602086016139e0565b80840191505092915050565b6000612eb0602b83613815565b9150612ebb82613be7565b604082019050919050565b6000612ed3602c83613815565b9150612ede82613c36565b604082019050919050565b6000612ef6603283613815565b9150612f0182613c85565b604082019050919050565b6000612f19602683613815565b9150612f2482613cd4565b604082019050919050565b6000612f3c601c83613815565b9150612f4782613d23565b602082019050919050565b6000612f5f601883613815565b9150612f6a82613d4c565b602082019050919050565b6000612f82603d83613815565b9150612f8d82613d75565b604082019050919050565b6000612fa5602483613815565b9150612fb082613dc4565b604082019050919050565b6000612fc8601983613815565b9150612fd382613e13565b602082019050919050565b6000612feb602c83613815565b9150612ff682613e3c565b604082019050919050565b600061300e603883613815565b915061301982613e8b565b604082019050919050565b6000613031602a83613815565b915061303c82613eda565b604082019050919050565b6000613054602983613815565b915061305f82613f29565b604082019050919050565b6000613077602083613815565b915061308282613f78565b602082019050919050565b600061309a603183613815565b91506130a582613fa1565b604082019050919050565b60006130bd602c83613815565b91506130c882613ff0565b604082019050919050565b60006130e0602083613815565b91506130eb8261403f565b602082019050919050565b6000613103602983613815565b915061310e82614068565b604082019050919050565b6000613126602f83613815565b9150613131826140b7565b604082019050919050565b6000613149601883613815565b915061315482614106565b602082019050919050565b600061316c602183613815565b91506131778261412f565b604082019050919050565b600061318f601683613815565b915061319a8261417e565b602082019050919050565b60006131b2601483613815565b91506131bd826141a7565b602082019050919050565b60006131d5601083613815565b91506131e0826141d0565b602082019050919050565b60006131f860008361380a565b9150613203826141f9565b600082019050919050565b600061321b603183613815565b9150613226826141fc565b604082019050919050565b600061323e601a83613815565b91506132498261424b565b602082019050919050565b6000613261602c83613815565b915061326c82614274565b604082019050919050565b61328081613978565b82525050565b61328f816139a6565b82525050565b61329e816139b0565b82525050565b6132ad816139c4565b82525050565b60006132bf8285612e72565b91506132cb8284612e72565b91508190509392505050565b60006132e2826131eb565b9150819050919050565b60006020820190506133016000830184612de2565b92915050565b600060808201905061331c6000830187612de2565b6133296020830186612de2565b6133366040830185613286565b81810360608301526133488184612e00565b905095945050505050565b60006020820190506133686000830184612df1565b92915050565b600060208201905081810360008301526133888184612e39565b905092915050565b600060208201905081810360008301526133a981612ea3565b9050919050565b600060208201905081810360008301526133c981612ec6565b9050919050565b600060208201905081810360008301526133e981612ee9565b9050919050565b6000602082019050818103600083015261340981612f0c565b9050919050565b6000602082019050818103600083015261342981612f2f565b9050919050565b6000602082019050818103600083015261344981612f52565b9050919050565b6000602082019050818103600083015261346981612f75565b9050919050565b6000602082019050818103600083015261348981612f98565b9050919050565b600060208201905081810360008301526134a981612fbb565b9050919050565b600060208201905081810360008301526134c981612fde565b9050919050565b600060208201905081810360008301526134e981613001565b9050919050565b6000602082019050818103600083015261350981613024565b9050919050565b6000602082019050818103600083015261352981613047565b9050919050565b600060208201905081810360008301526135498161306a565b9050919050565b600060208201905081810360008301526135698161308d565b9050919050565b60006020820190508181036000830152613589816130b0565b9050919050565b600060208201905081810360008301526135a9816130d3565b9050919050565b600060208201905081810360008301526135c9816130f6565b9050919050565b600060208201905081810360008301526135e981613119565b9050919050565b600060208201905081810360008301526136098161313c565b9050919050565b600060208201905081810360008301526136298161315f565b9050919050565b6000602082019050818103600083015261364981613182565b9050919050565b60006020820190508181036000830152613669816131a5565b9050919050565b60006020820190508181036000830152613689816131c8565b9050919050565b600060208201905081810360008301526136a98161320e565b9050919050565b600060208201905081810360008301526136c981613231565b9050919050565b600060208201905081810360008301526136e981613254565b9050919050565b60006020820190506137056000830184613277565b92915050565b60006020820190506137206000830184613286565b92915050565b600060208201905061373b6000830184613295565b92915050565b600060208201905061375660008301846132a4565b92915050565b6000613766613777565b90506137728282613a45565b919050565b6000604051905090565b600067ffffffffffffffff82111561379c5761379b613ba7565b5b6137a582613bd6565b9050602081019050919050565b600067ffffffffffffffff8211156137cd576137cc613ba7565b5b6137d682613bd6565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061383c826139a6565b9150613847836139a6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561387c5761387b613b1a565b5b828201905092915050565b6000613892826139a6565b915061389d836139a6565b9250826138ad576138ac613b49565b5b828204905092915050565b60006138c3826139b0565b91506138ce836139b0565b92508167ffffffffffffffff04831182151516156138ef576138ee613b1a565b5b828202905092915050565b6000613905826139a6565b9150613910836139a6565b92508282101561392357613922613b1a565b5b828203905092915050565b600061393982613986565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156139fe5780820151818401526020810190506139e3565b83811115613a0d576000848401525b50505050565b60006002820490506001821680613a2b57607f821691505b60208210811415613a3f57613a3e613b78565b5b50919050565b613a4e82613bd6565b810181811067ffffffffffffffff82111715613a6d57613a6c613ba7565b5b80604052505050565b6000613a81826139a6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ab457613ab3613b1a565b5b600182019050919050565b6000613aca826139c4565b915060ff821415613ade57613add613b1a565b5b600182019050919050565b6000613af4826139a6565b9150613aff836139a6565b925082613b0f57613b0e613b49565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4574686572207375626d697474656420646f6573206e6f74206d61746368206360008201527f757272656e742070726963650000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f42616c616e6365206d75737420626520706f7369746976650000000000000000600082015250565b7f4d6178696d756d2063757272656e7420627579206c696d697420666f7220696e60008201527f646976696475616c207472616e73616374696f6e206578636565646564000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4661696c656420746f2077697468647261772065746865720000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b7f4d757374206d696e74206174206c656173742031000000000000000000000000600082015250565b7f53616c65206973206e6f74206f70656e00000000000000000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4d6178206d696e7420706572206163636f756e74206973203530000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6142cc8161392e565b81146142d757600080fd5b50565b6142e381613940565b81146142ee57600080fd5b50565b6142fa8161394c565b811461430557600080fd5b50565b614311816139a6565b811461431c57600080fd5b50565b614328816139c4565b811461433357600080fd5b5056fea264697066735822122037e0623aa0a7fe7b4035bc7d81777a330f41cab258311f14adbf3a46d8ad677464736f6c63430008030033

Deployed Bytecode Sourcemap

46248:3240:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47185:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26235:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27794:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27317:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38873:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28684:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38541:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47732:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46582:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49225:260;;;;;;;;;;;;;:::i;:::-;;29094:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39063:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47407:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25929:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48023:949;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25659:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3868:94;;;;;;;;;;;;;:::i;:::-;;3217:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26404:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46708:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28087:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29350:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48984:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46421:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28453:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47881:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4117:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47185:212;47324:4;47353:36;47377:11;47353:23;:36::i;:::-;47346:43;;47185:212;;;:::o;26235:100::-;26289:13;26322:5;26315:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26235:100;:::o;27794:221::-;27870:7;27898:16;27906:7;27898;:16::i;:::-;27890:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27983:15;:24;27999:7;27983:24;;;;;;;;;;;;;;;;;;;;;27976:31;;27794:221;;;:::o;27317:411::-;27398:13;27414:23;27429:7;27414:14;:23::i;:::-;27398:39;;27462:5;27456:11;;:2;:11;;;;27448:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27556:5;27540:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27565:37;27582:5;27589:12;:10;:12::i;:::-;27565:16;:37::i;:::-;27540:62;27518:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27699:21;27708:2;27712:7;27699:8;:21::i;:::-;27317:411;;;:::o;38873:113::-;38934:7;38961:10;:17;;;;38954:24;;38873:113;:::o;28684:339::-;28879:41;28898:12;:10;:12::i;:::-;28912:7;28879:18;:41::i;:::-;28871:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28987:28;28997:4;29003:2;29007:7;28987:9;:28::i;:::-;28684:339;;;:::o;38541:256::-;38638:7;38674:23;38691:5;38674:16;:23::i;:::-;38666:5;:31;38658:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38763:12;:19;38776:5;38763:19;;;;;;;;;;;;;;;:26;38783:5;38763:26;;;;;;;;;;;;38756:33;;38541:256;;;;:::o;47732:87::-;47784:5;47809:2;47802:9;;47732:87;:::o;46582:48::-;;;;:::o;49225:260::-;3448:12;:10;:12::i;:::-;3437:23;;:7;:5;:7::i;:::-;:23;;;3429:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49305:1:::1;49281:21;:25;49273:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;49347:12;49365:10;:15;;49388:21;49365:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49346:68;;;49444:4;49433:15;;:7;:15;;;49425:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;3508:1;49225:260::o:0;29094:185::-;29232:39;29249:4;29255:2;29259:7;29232:39;;;;;;;;;;;;:16;:39::i;:::-;29094:185;;;:::o;39063:233::-;39138:7;39174:30;:28;:30::i;:::-;39166:5;:38;39158:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;39271:10;39282:5;39271:17;;;;;;;;;;;;;;;;;;;;;;;;39264:24;;39063:233;;;:::o;47407:120::-;3448:12;:10;:12::i;:::-;3437:23;;:7;:5;:7::i;:::-;:23;;;3429:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47503:16:::1;47487:13;:32;;;;;;;;;;;;:::i;:::-;;47407:120:::0;:::o;25929:239::-;26001:7;26021:13;26037:7;:16;26045:7;26037:16;;;;;;;;;;;;;;;;;;;;;26021:32;;26089:1;26072:19;;:5;:19;;;;26064:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26155:5;26148:12;;;25929:239;;;:::o;48023:949::-;48118:15;48094:20;;:39;;48086:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48192:1;48173:15;:20;;;;48165:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;48270:21;:19;:21::i;:::-;48251:40;;:15;:40;;;;48229:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;46456:5;48413:46;;48432:13;:11;:13::i;:::-;48414:15;:31;;;;;;:::i;:::-;48413:46;;48391:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;48573:2;48547:21;48557:10;48547:9;:21::i;:::-;48529:15;:39;;;;;;:::i;:::-;48528:47;;48520:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;48673:15;48653:35;;:17;:15;:17::i;:::-;:35;;;;:::i;:::-;48639:50;;:9;:50;48617:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;48779:7;48774:191;48796:15;48792:19;;:1;:19;;;48774:191;;;48833:21;:9;:19;:21::i;:::-;48871:17;48891:19;:9;:17;:19::i;:::-;48871:39;;48925:28;48931:10;48943:9;48925:5;:28::i;:::-;48774:191;48813:3;;;;;:::i;:::-;;;;48774:191;;;;48023:949;:::o;25659:208::-;25731:7;25776:1;25759:19;;:5;:19;;;;25751:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25843:9;:16;25853:5;25843:16;;;;;;;;;;;;;;;;25836:23;;25659:208;;;:::o;3868:94::-;3448:12;:10;:12::i;:::-;3437:23;;:7;:5;:7::i;:::-;:23;;;3429:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3933:21:::1;3951:1;3933:9;:21::i;:::-;3868:94::o:0;3217:87::-;3263:7;3290:6;;;;;;;;;;;3283:13;;3217:87;:::o;26404:104::-;26460:13;26493:7;26486:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26404:104;:::o;46708:119::-;3448:12;:10;:12::i;:::-;3437:23;;:7;:5;:7::i;:::-;:23;;;3429:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46810:9:::1;46787:20;:32;;;;46708:119:::0;:::o;28087:295::-;28202:12;:10;:12::i;:::-;28190:24;;:8;:24;;;;28182:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28302:8;28257:18;:32;28276:12;:10;:12::i;:::-;28257:32;;;;;;;;;;;;;;;:42;28290:8;28257:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28355:8;28326:48;;28341:12;:10;:12::i;:::-;28326:48;;;28365:8;28326:48;;;;;;:::i;:::-;;;;;;;;28087:295;;:::o;29350:328::-;29525:41;29544:12;:10;:12::i;:::-;29558:7;29525:18;:41::i;:::-;29517:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29631:39;29645:4;29651:2;29655:7;29664:5;29631:13;:39::i;:::-;29350:328;;;;:::o;48984:196::-;49111:13;49149:23;49164:7;49149:14;:23::i;:::-;49142:30;;48984:196;;;:::o;46421:40::-;46456:5;46421:40;:::o;28453:164::-;28550:4;28574:18;:25;28593:5;28574:25;;;;;;;;;;;;;;;:35;28600:8;28574:35;;;;;;;;;;;;;;;;;;;;;;;;;28567:42;;28453:164;;;;:::o;47881:104::-;47929:6;47955:22;47948:29;;47881:104;:::o;4117:192::-;3448:12;:10;:12::i;:::-;3437:23;;:7;:5;:7::i;:::-;:23;;;3429:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4226:1:::1;4206:22;;:8;:22;;;;4198:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4282:19;4292:8;4282:9;:19::i;:::-;4117:192:::0;:::o;38233:224::-;38335:4;38374:35;38359:50;;;:11;:50;;;;:90;;;;38413:36;38437:11;38413:23;:36::i;:::-;38359:90;38352:97;;38233:224;;;:::o;31188:127::-;31253:4;31305:1;31277:30;;:7;:16;31285:7;31277:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31270:37;;31188:127;;;:::o;2062:98::-;2115:7;2142:10;2135:17;;2062:98;:::o;35170:174::-;35272:2;35245:15;:24;35261:7;35245:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35328:7;35324:2;35290:46;;35299:23;35314:7;35299:14;:23::i;:::-;35290:46;;;;;;;;;;;;35170:174;;:::o;31482:348::-;31575:4;31600:16;31608:7;31600;:16::i;:::-;31592:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31676:13;31692:23;31707:7;31692:14;:23::i;:::-;31676:39;;31745:5;31734:16;;:7;:16;;;:51;;;;31778:7;31754:31;;:20;31766:7;31754:11;:20::i;:::-;:31;;;31734:51;:87;;;;31789:32;31806:5;31813:7;31789:16;:32::i;:::-;31734:87;31726:96;;;31482:348;;;;:::o;34474:578::-;34633:4;34606:31;;:23;34621:7;34606:14;:23::i;:::-;:31;;;34598:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34716:1;34702:16;;:2;:16;;;;34694:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34772:39;34793:4;34799:2;34803:7;34772:20;:39::i;:::-;34876:29;34893:1;34897:7;34876:8;:29::i;:::-;34937:1;34918:9;:15;34928:4;34918:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34966:1;34949:9;:13;34959:2;34949:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34997:2;34978:7;:16;34986:7;34978:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35036:7;35032:2;35017:27;;35026:4;35017:27;;;;;;;;;;;;34474:578;;;:::o;970:127::-;1077:1;1059:7;:14;;;:19;;;;;;;;;;;970:127;:::o;848:114::-;913:7;940;:14;;;933:21;;848:114;;;:::o;33166:382::-;33260:1;33246:16;;:2;:16;;;;33238:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33319:16;33327:7;33319;:16::i;:::-;33318:17;33310:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33381:45;33410:1;33414:2;33418:7;33381:20;:45::i;:::-;33456:1;33439:9;:13;33449:2;33439:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33487:2;33468:7;:16;33476:7;33468:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33532:7;33528:2;33507:33;;33524:1;33507:33;;;;;;;;;;;;33166:382;;:::o;4317:173::-;4373:16;4392:6;;;;;;;;;;;4373:25;;4418:8;4409:6;;:17;;;;;;;;;;;;;;;;;;4473:8;4442:40;;4463:8;4442:40;;;;;;;;;;;;4317:173;;:::o;30560:315::-;30717:28;30727:4;30733:2;30737:7;30717:9;:28::i;:::-;30764:48;30787:4;30793:2;30797:7;30806:5;30764:22;:48::i;:::-;30756:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30560:315;;;;:::o;44726:679::-;44799:13;44833:16;44841:7;44833;:16::i;:::-;44825:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;44916:23;44942:10;:19;44953:7;44942:19;;;;;;;;;;;44916:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44972:18;44993:10;:8;:10::i;:::-;44972:31;;45101:1;45085:4;45079:18;:23;45075:72;;;45126:9;45119:16;;;;;;45075:72;45277:1;45257:9;45251:23;:27;45247:108;;;45326:4;45332:9;45309:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45295:48;;;;;;45247:108;45374:23;45389:7;45374:14;:23::i;:::-;45367:30;;;;44726:679;;;;:::o;25290:305::-;25392:4;25444:25;25429:40;;;:11;:40;;;;:105;;;;25501:33;25486:48;;;:11;:48;;;;25429:105;:158;;;;25551:36;25575:11;25551:23;:36::i;:::-;25429:158;25409:178;;25290:305;;;:::o;46835:215::-;46997:45;47024:4;47030:2;47034:7;46997:26;:45::i;:::-;46835:215;;;:::o;35909:803::-;36064:4;36085:15;:2;:13;;;:15::i;:::-;36081:624;;;36137:2;36121:36;;;36158:12;:10;:12::i;:::-;36172:4;36178:7;36187:5;36121:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36117:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36384:1;36367:6;:13;:18;36363:272;;;36410:60;;;;;;;;;;:::i;:::-;;;;;;;;36363:272;36585:6;36579:13;36570:6;36566:2;36562:15;36555:38;36117:533;36254:45;;;36244:55;;;:6;:55;;;;36237:62;;;;;36081:624;36689:4;36682:11;;35909:803;;;;;;;:::o;47535:106::-;47587:13;47620;47613:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47535:106;:::o;26579:334::-;26652:13;26686:16;26694:7;26686;:16::i;:::-;26678:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;26767:21;26791:10;:8;:10::i;:::-;26767:34;;26843:1;26825:7;26819:21;:25;:86;;;;;;;;;;;;;;;;;26871:7;26880:18;:7;:16;:18::i;:::-;26854:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26819:86;26812:93;;;26579:334;;;:::o;6328:157::-;6413:4;6452:25;6437:40;;;:11;:40;;;;6430:47;;6328:157;;;:::o;39909:589::-;40053:45;40080:4;40086:2;40090:7;40053:26;:45::i;:::-;40131:1;40115:18;;:4;:18;;;40111:187;;;40150:40;40182:7;40150:31;:40::i;:::-;40111:187;;;40220:2;40212:10;;:4;:10;;;40208:90;;40239:47;40272:4;40278:7;40239:32;:47::i;:::-;40208:90;40111:187;40326:1;40312:16;;:2;:16;;;40308:183;;;40345:45;40382:7;40345:36;:45::i;:::-;40308:183;;;40418:4;40412:10;;:2;:10;;;40408:83;;40439:40;40467:2;40471:7;40439:27;:40::i;:::-;40408:83;40308:183;39909:589;;;:::o;9374:387::-;9434:4;9642:12;9709:7;9697:20;9689:28;;9752:1;9745:4;:8;9738:15;;;9374:387;;;:::o;6799:723::-;6855:13;7085:1;7076:5;:10;7072:53;;;7103:10;;;;;;;;;;;;;;;;;;;;;7072:53;7135:12;7150:5;7135:20;;7166:14;7191:78;7206:1;7198:4;:9;7191:78;;7224:8;;;;;:::i;:::-;;;;7255:2;7247:10;;;;;:::i;:::-;;;7191:78;;;7279:19;7311:6;7301:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7279:39;;7329:154;7345:1;7336:5;:10;7329:154;;7373:1;7363:11;;;;;:::i;:::-;;;7440:2;7432:5;:10;;;;:::i;:::-;7419:2;:24;;;;:::i;:::-;7406:39;;7389:6;7396;7389:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;7469:2;7460:11;;;;;:::i;:::-;;;7329:154;;;7507:6;7493:21;;;;;6799:723;;;;:::o;37284:126::-;;;;:::o;41221:164::-;41325:10;:17;;;;41298:15;:24;41314:7;41298:24;;;;;;;;;;;:44;;;;41353:10;41369:7;41353:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41221:164;:::o;42012:988::-;42278:22;42328:1;42303:22;42320:4;42303:16;:22::i;:::-;:26;;;;:::i;:::-;42278:51;;42340:18;42361:17;:26;42379:7;42361:26;;;;;;;;;;;;42340:47;;42508:14;42494:10;:28;42490:328;;42539:19;42561:12;:18;42574:4;42561:18;;;;;;;;;;;;;;;:34;42580:14;42561:34;;;;;;;;;;;;42539:56;;42645:11;42612:12;:18;42625:4;42612:18;;;;;;;;;;;;;;;:30;42631:10;42612:30;;;;;;;;;;;:44;;;;42762:10;42729:17;:30;42747:11;42729:30;;;;;;;;;;;:43;;;;42490:328;;42914:17;:26;42932:7;42914:26;;;;;;;;;;;42907:33;;;42958:12;:18;42971:4;42958:18;;;;;;;;;;;;;;;:34;42977:14;42958:34;;;;;;;;;;;42951:41;;;42012:988;;;;:::o;43295:1079::-;43548:22;43593:1;43573:10;:17;;;;:21;;;;:::i;:::-;43548:46;;43605:18;43626:15;:24;43642:7;43626:24;;;;;;;;;;;;43605:45;;43977:19;43999:10;44010:14;43999:26;;;;;;;;;;;;;;;;;;;;;;;;43977:48;;44063:11;44038:10;44049;44038:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;44174:10;44143:15;:28;44159:11;44143:28;;;;;;;;;;;:41;;;;44315:15;:24;44331:7;44315:24;;;;;;;;;;;44308:31;;;44350:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43295:1079;;;;:::o;40799:221::-;40884:14;40901:20;40918:2;40901:16;:20::i;:::-;40884:37;;40959:7;40932:12;:16;40945:2;40932:16;;;;;;;;;;;;;;;:24;40949:6;40932:24;;;;;;;;;;;:34;;;;41006:6;40977:17;:26;40995:7;40977:26;;;;;;;;;;;:35;;;;40799:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:135::-;;2091:6;2078:20;2069:29;;2107:31;2132:5;2107:31;:::i;:::-;2059:85;;;;:::o;2150:262::-;;2258:2;2246:9;2237:7;2233:23;2229:32;2226:2;;;2274:1;2271;2264:12;2226:2;2317:1;2342:53;2387:7;2378:6;2367:9;2363:22;2342:53;:::i;:::-;2332:63;;2288:117;2216:196;;;;:::o;2418:407::-;;;2543:2;2531:9;2522:7;2518:23;2514:32;2511:2;;;2559:1;2556;2549:12;2511:2;2602:1;2627:53;2672:7;2663:6;2652:9;2648:22;2627:53;:::i;:::-;2617:63;;2573:117;2729:2;2755:53;2800:7;2791:6;2780:9;2776:22;2755:53;:::i;:::-;2745:63;;2700:118;2501:324;;;;;:::o;2831:552::-;;;;2973:2;2961:9;2952:7;2948:23;2944:32;2941:2;;;2989:1;2986;2979:12;2941:2;3032:1;3057:53;3102:7;3093:6;3082:9;3078:22;3057:53;:::i;:::-;3047:63;;3003:117;3159:2;3185:53;3230:7;3221:6;3210:9;3206:22;3185:53;:::i;:::-;3175:63;;3130:118;3287:2;3313:53;3358:7;3349:6;3338:9;3334:22;3313:53;:::i;:::-;3303:63;;3258:118;2931:452;;;;;:::o;3389:809::-;;;;;3557:3;3545:9;3536:7;3532:23;3528:33;3525:2;;;3574:1;3571;3564:12;3525:2;3617:1;3642:53;3687:7;3678:6;3667:9;3663:22;3642:53;:::i;:::-;3632:63;;3588:117;3744:2;3770:53;3815:7;3806:6;3795:9;3791:22;3770:53;:::i;:::-;3760:63;;3715:118;3872:2;3898:53;3943:7;3934:6;3923:9;3919:22;3898:53;:::i;:::-;3888:63;;3843:118;4028:2;4017:9;4013:18;4000:32;4059:18;4051:6;4048:30;4045:2;;;4091:1;4088;4081:12;4045:2;4119:62;4173:7;4164:6;4153:9;4149:22;4119:62;:::i;:::-;4109:72;;3971:220;3515:683;;;;;;;:::o;4204:401::-;;;4326:2;4314:9;4305:7;4301:23;4297:32;4294:2;;;4342:1;4339;4332:12;4294:2;4385:1;4410:53;4455:7;4446:6;4435:9;4431:22;4410:53;:::i;:::-;4400:63;;4356:117;4512:2;4538:50;4580:7;4571:6;4560:9;4556:22;4538:50;:::i;:::-;4528:60;;4483:115;4284:321;;;;;:::o;4611:407::-;;;4736:2;4724:9;4715:7;4711:23;4707:32;4704:2;;;4752:1;4749;4742:12;4704:2;4795:1;4820:53;4865:7;4856:6;4845:9;4841:22;4820:53;:::i;:::-;4810:63;;4766:117;4922:2;4948:53;4993:7;4984:6;4973:9;4969:22;4948:53;:::i;:::-;4938:63;;4893:118;4694:324;;;;;:::o;5024:260::-;;5131:2;5119:9;5110:7;5106:23;5102:32;5099:2;;;5147:1;5144;5137:12;5099:2;5190:1;5215:52;5259:7;5250:6;5239:9;5235:22;5215:52;:::i;:::-;5205:62;;5161:116;5089:195;;;;:::o;5290:282::-;;5408:2;5396:9;5387:7;5383:23;5379:32;5376:2;;;5424:1;5421;5414:12;5376:2;5467:1;5492:63;5547:7;5538:6;5527:9;5523:22;5492:63;:::i;:::-;5482:73;;5438:127;5366:206;;;;:::o;5578:375::-;;5696:2;5684:9;5675:7;5671:23;5667:32;5664:2;;;5712:1;5709;5702:12;5664:2;5783:1;5772:9;5768:17;5755:31;5813:18;5805:6;5802:30;5799:2;;;5845:1;5842;5835:12;5799:2;5873:63;5928:7;5919:6;5908:9;5904:22;5873:63;:::i;:::-;5863:73;;5726:220;5654:299;;;;:::o;5959:262::-;;6067:2;6055:9;6046:7;6042:23;6038:32;6035:2;;;6083:1;6080;6073:12;6035:2;6126:1;6151:53;6196:7;6187:6;6176:9;6172:22;6151:53;:::i;:::-;6141:63;;6097:117;6025:196;;;;:::o;6227:258::-;;6333:2;6321:9;6312:7;6308:23;6304:32;6301:2;;;6349:1;6346;6339:12;6301:2;6392:1;6417:51;6460:7;6451:6;6440:9;6436:22;6417:51;:::i;:::-;6407:61;;6363:115;6291:194;;;;:::o;6491:118::-;6578:24;6596:5;6578:24;:::i;:::-;6573:3;6566:37;6556:53;;:::o;6615:109::-;6696:21;6711:5;6696:21;:::i;:::-;6691:3;6684:34;6674:50;;:::o;6730:360::-;;6844:38;6876:5;6844:38;:::i;:::-;6898:70;6961:6;6956:3;6898:70;:::i;:::-;6891:77;;6977:52;7022:6;7017:3;7010:4;7003:5;6999:16;6977:52;:::i;:::-;7054:29;7076:6;7054:29;:::i;:::-;7049:3;7045:39;7038:46;;6820:270;;;;;:::o;7096:364::-;;7212:39;7245:5;7212:39;:::i;:::-;7267:71;7331:6;7326:3;7267:71;:::i;:::-;7260:78;;7347:52;7392:6;7387:3;7380:4;7373:5;7369:16;7347:52;:::i;:::-;7424:29;7446:6;7424:29;:::i;:::-;7419:3;7415:39;7408:46;;7188:272;;;;;:::o;7466:377::-;;7600:39;7633:5;7600:39;:::i;:::-;7655:89;7737:6;7732:3;7655:89;:::i;:::-;7648:96;;7753:52;7798:6;7793:3;7786:4;7779:5;7775:16;7753:52;:::i;:::-;7830:6;7825:3;7821:16;7814:23;;7576:267;;;;;:::o;7849:366::-;;8012:67;8076:2;8071:3;8012:67;:::i;:::-;8005:74;;8088:93;8177:3;8088:93;:::i;:::-;8206:2;8201:3;8197:12;8190:19;;7995:220;;;:::o;8221:366::-;;8384:67;8448:2;8443:3;8384:67;:::i;:::-;8377:74;;8460:93;8549:3;8460:93;:::i;:::-;8578:2;8573:3;8569:12;8562:19;;8367:220;;;:::o;8593:366::-;;8756:67;8820:2;8815:3;8756:67;:::i;:::-;8749:74;;8832:93;8921:3;8832:93;:::i;:::-;8950:2;8945:3;8941:12;8934:19;;8739:220;;;:::o;8965:366::-;;9128:67;9192:2;9187:3;9128:67;:::i;:::-;9121:74;;9204:93;9293:3;9204:93;:::i;:::-;9322:2;9317:3;9313:12;9306:19;;9111:220;;;:::o;9337:366::-;;9500:67;9564:2;9559:3;9500:67;:::i;:::-;9493:74;;9576:93;9665:3;9576:93;:::i;:::-;9694:2;9689:3;9685:12;9678:19;;9483:220;;;:::o;9709:366::-;;9872:67;9936:2;9931:3;9872:67;:::i;:::-;9865:74;;9948:93;10037:3;9948:93;:::i;:::-;10066:2;10061:3;10057:12;10050:19;;9855:220;;;:::o;10081:366::-;;10244:67;10308:2;10303:3;10244:67;:::i;:::-;10237:74;;10320:93;10409:3;10320:93;:::i;:::-;10438:2;10433:3;10429:12;10422:19;;10227:220;;;:::o;10453:366::-;;10616:67;10680:2;10675:3;10616:67;:::i;:::-;10609:74;;10692:93;10781:3;10692:93;:::i;:::-;10810:2;10805:3;10801:12;10794:19;;10599:220;;;:::o;10825:366::-;;10988:67;11052:2;11047:3;10988:67;:::i;:::-;10981:74;;11064:93;11153:3;11064:93;:::i;:::-;11182:2;11177:3;11173:12;11166:19;;10971:220;;;:::o;11197:366::-;;11360:67;11424:2;11419:3;11360:67;:::i;:::-;11353:74;;11436:93;11525:3;11436:93;:::i;:::-;11554:2;11549:3;11545:12;11538:19;;11343:220;;;:::o;11569:366::-;;11732:67;11796:2;11791:3;11732:67;:::i;:::-;11725:74;;11808:93;11897:3;11808:93;:::i;:::-;11926:2;11921:3;11917:12;11910:19;;11715:220;;;:::o;11941:366::-;;12104:67;12168:2;12163:3;12104:67;:::i;:::-;12097:74;;12180:93;12269:3;12180:93;:::i;:::-;12298:2;12293:3;12289:12;12282:19;;12087:220;;;:::o;12313:366::-;;12476:67;12540:2;12535:3;12476:67;:::i;:::-;12469:74;;12552:93;12641:3;12552:93;:::i;:::-;12670:2;12665:3;12661:12;12654:19;;12459:220;;;:::o;12685:366::-;;12848:67;12912:2;12907:3;12848:67;:::i;:::-;12841:74;;12924:93;13013:3;12924:93;:::i;:::-;13042:2;13037:3;13033:12;13026:19;;12831:220;;;:::o;13057:366::-;;13220:67;13284:2;13279:3;13220:67;:::i;:::-;13213:74;;13296:93;13385:3;13296:93;:::i;:::-;13414:2;13409:3;13405:12;13398:19;;13203:220;;;:::o;13429:366::-;;13592:67;13656:2;13651:3;13592:67;:::i;:::-;13585:74;;13668:93;13757:3;13668:93;:::i;:::-;13786:2;13781:3;13777:12;13770:19;;13575:220;;;:::o;13801:366::-;;13964:67;14028:2;14023:3;13964:67;:::i;:::-;13957:74;;14040:93;14129:3;14040:93;:::i;:::-;14158:2;14153:3;14149:12;14142:19;;13947:220;;;:::o;14173:366::-;;14336:67;14400:2;14395:3;14336:67;:::i;:::-;14329:74;;14412:93;14501:3;14412:93;:::i;:::-;14530:2;14525:3;14521:12;14514:19;;14319:220;;;:::o;14545:366::-;;14708:67;14772:2;14767:3;14708:67;:::i;:::-;14701:74;;14784:93;14873:3;14784:93;:::i;:::-;14902:2;14897:3;14893:12;14886:19;;14691:220;;;:::o;14917:366::-;;15080:67;15144:2;15139:3;15080:67;:::i;:::-;15073:74;;15156:93;15245:3;15156:93;:::i;:::-;15274:2;15269:3;15265:12;15258:19;;15063:220;;;:::o;15289:366::-;;15452:67;15516:2;15511:3;15452:67;:::i;:::-;15445:74;;15528:93;15617:3;15528:93;:::i;:::-;15646:2;15641:3;15637:12;15630:19;;15435:220;;;:::o;15661:366::-;;15824:67;15888:2;15883:3;15824:67;:::i;:::-;15817:74;;15900:93;15989:3;15900:93;:::i;:::-;16018:2;16013:3;16009:12;16002:19;;15807:220;;;:::o;16033:366::-;;16196:67;16260:2;16255:3;16196:67;:::i;:::-;16189:74;;16272:93;16361:3;16272:93;:::i;:::-;16390:2;16385:3;16381:12;16374:19;;16179:220;;;:::o;16405:366::-;;16568:67;16632:2;16627:3;16568:67;:::i;:::-;16561:74;;16644:93;16733:3;16644:93;:::i;:::-;16762:2;16757:3;16753:12;16746:19;;16551:220;;;:::o;16777:398::-;;16957:83;17038:1;17033:3;16957:83;:::i;:::-;16950:90;;17049:93;17138:3;17049:93;:::i;:::-;17167:1;17162:3;17158:11;17151:18;;16940:235;;;:::o;17181:366::-;;17344:67;17408:2;17403:3;17344:67;:::i;:::-;17337:74;;17420:93;17509:3;17420:93;:::i;:::-;17538:2;17533:3;17529:12;17522:19;;17327:220;;;:::o;17553:366::-;;17716:67;17780:2;17775:3;17716:67;:::i;:::-;17709:74;;17792:93;17881:3;17792:93;:::i;:::-;17910:2;17905:3;17901:12;17894:19;;17699:220;;;:::o;17925:366::-;;18088:67;18152:2;18147:3;18088:67;:::i;:::-;18081:74;;18164:93;18253:3;18164:93;:::i;:::-;18282:2;18277:3;18273:12;18266:19;;18071:220;;;:::o;18297:115::-;18382:23;18399:5;18382:23;:::i;:::-;18377:3;18370:36;18360:52;;:::o;18418:118::-;18505:24;18523:5;18505:24;:::i;:::-;18500:3;18493:37;18483:53;;:::o;18542:115::-;18627:23;18644:5;18627:23;:::i;:::-;18622:3;18615:36;18605:52;;:::o;18663:112::-;18746:22;18762:5;18746:22;:::i;:::-;18741:3;18734:35;18724:51;;:::o;18781:435::-;;18983:95;19074:3;19065:6;18983:95;:::i;:::-;18976:102;;19095:95;19186:3;19177:6;19095:95;:::i;:::-;19088:102;;19207:3;19200:10;;18965:251;;;;;:::o;19222:379::-;;19428:147;19571:3;19428:147;:::i;:::-;19421:154;;19592:3;19585:10;;19410:191;;;:::o;19607:222::-;;19738:2;19727:9;19723:18;19715:26;;19751:71;19819:1;19808:9;19804:17;19795:6;19751:71;:::i;:::-;19705:124;;;;:::o;19835:640::-;;20068:3;20057:9;20053:19;20045:27;;20082:71;20150:1;20139:9;20135:17;20126:6;20082:71;:::i;:::-;20163:72;20231:2;20220:9;20216:18;20207:6;20163:72;:::i;:::-;20245;20313:2;20302:9;20298:18;20289:6;20245:72;:::i;:::-;20364:9;20358:4;20354:20;20349:2;20338:9;20334:18;20327:48;20392:76;20463:4;20454:6;20392:76;:::i;:::-;20384:84;;20035:440;;;;;;;:::o;20481:210::-;;20606:2;20595:9;20591:18;20583:26;;20619:65;20681:1;20670:9;20666:17;20657:6;20619:65;:::i;:::-;20573:118;;;;:::o;20697:313::-;;20848:2;20837:9;20833:18;20825:26;;20897:9;20891:4;20887:20;20883:1;20872:9;20868:17;20861:47;20925:78;20998:4;20989:6;20925:78;:::i;:::-;20917:86;;20815:195;;;;:::o;21016:419::-;;21220:2;21209:9;21205:18;21197:26;;21269:9;21263:4;21259:20;21255:1;21244:9;21240:17;21233:47;21297:131;21423:4;21297:131;:::i;:::-;21289:139;;21187:248;;;:::o;21441:419::-;;21645:2;21634:9;21630:18;21622:26;;21694:9;21688:4;21684:20;21680:1;21669:9;21665:17;21658:47;21722:131;21848:4;21722:131;:::i;:::-;21714:139;;21612:248;;;:::o;21866:419::-;;22070:2;22059:9;22055:18;22047:26;;22119:9;22113:4;22109:20;22105:1;22094:9;22090:17;22083:47;22147:131;22273:4;22147:131;:::i;:::-;22139:139;;22037:248;;;:::o;22291:419::-;;22495:2;22484:9;22480:18;22472:26;;22544:9;22538:4;22534:20;22530:1;22519:9;22515:17;22508:47;22572:131;22698:4;22572:131;:::i;:::-;22564:139;;22462:248;;;:::o;22716:419::-;;22920:2;22909:9;22905:18;22897:26;;22969:9;22963:4;22959:20;22955:1;22944:9;22940:17;22933:47;22997:131;23123:4;22997:131;:::i;:::-;22989:139;;22887:248;;;:::o;23141:419::-;;23345:2;23334:9;23330:18;23322:26;;23394:9;23388:4;23384:20;23380:1;23369:9;23365:17;23358:47;23422:131;23548:4;23422:131;:::i;:::-;23414:139;;23312:248;;;:::o;23566:419::-;;23770:2;23759:9;23755:18;23747:26;;23819:9;23813:4;23809:20;23805:1;23794:9;23790:17;23783:47;23847:131;23973:4;23847:131;:::i;:::-;23839:139;;23737:248;;;:::o;23991:419::-;;24195:2;24184:9;24180:18;24172:26;;24244:9;24238:4;24234:20;24230:1;24219:9;24215:17;24208:47;24272:131;24398:4;24272:131;:::i;:::-;24264:139;;24162:248;;;:::o;24416:419::-;;24620:2;24609:9;24605:18;24597:26;;24669:9;24663:4;24659:20;24655:1;24644:9;24640:17;24633:47;24697:131;24823:4;24697:131;:::i;:::-;24689:139;;24587:248;;;:::o;24841:419::-;;25045:2;25034:9;25030:18;25022:26;;25094:9;25088:4;25084:20;25080:1;25069:9;25065:17;25058:47;25122:131;25248:4;25122:131;:::i;:::-;25114:139;;25012:248;;;:::o;25266:419::-;;25470:2;25459:9;25455:18;25447:26;;25519:9;25513:4;25509:20;25505:1;25494:9;25490:17;25483:47;25547:131;25673:4;25547:131;:::i;:::-;25539:139;;25437:248;;;:::o;25691:419::-;;25895:2;25884:9;25880:18;25872:26;;25944:9;25938:4;25934:20;25930:1;25919:9;25915:17;25908:47;25972:131;26098:4;25972:131;:::i;:::-;25964:139;;25862:248;;;:::o;26116:419::-;;26320:2;26309:9;26305:18;26297:26;;26369:9;26363:4;26359:20;26355:1;26344:9;26340:17;26333:47;26397:131;26523:4;26397:131;:::i;:::-;26389:139;;26287:248;;;:::o;26541:419::-;;26745:2;26734:9;26730:18;26722:26;;26794:9;26788:4;26784:20;26780:1;26769:9;26765:17;26758:47;26822:131;26948:4;26822:131;:::i;:::-;26814:139;;26712:248;;;:::o;26966:419::-;;27170:2;27159:9;27155:18;27147:26;;27219:9;27213:4;27209:20;27205:1;27194:9;27190:17;27183:47;27247:131;27373:4;27247:131;:::i;:::-;27239:139;;27137:248;;;:::o;27391:419::-;;27595:2;27584:9;27580:18;27572:26;;27644:9;27638:4;27634:20;27630:1;27619:9;27615:17;27608:47;27672:131;27798:4;27672:131;:::i;:::-;27664:139;;27562:248;;;:::o;27816:419::-;;28020:2;28009:9;28005:18;27997:26;;28069:9;28063:4;28059:20;28055:1;28044:9;28040:17;28033:47;28097:131;28223:4;28097:131;:::i;:::-;28089:139;;27987:248;;;:::o;28241:419::-;;28445:2;28434:9;28430:18;28422:26;;28494:9;28488:4;28484:20;28480:1;28469:9;28465:17;28458:47;28522:131;28648:4;28522:131;:::i;:::-;28514:139;;28412:248;;;:::o;28666:419::-;;28870:2;28859:9;28855:18;28847:26;;28919:9;28913:4;28909:20;28905:1;28894:9;28890:17;28883:47;28947:131;29073:4;28947:131;:::i;:::-;28939:139;;28837:248;;;:::o;29091:419::-;;29295:2;29284:9;29280:18;29272:26;;29344:9;29338:4;29334:20;29330:1;29319:9;29315:17;29308:47;29372:131;29498:4;29372:131;:::i;:::-;29364:139;;29262:248;;;:::o;29516:419::-;;29720:2;29709:9;29705:18;29697:26;;29769:9;29763:4;29759:20;29755:1;29744:9;29740:17;29733:47;29797:131;29923:4;29797:131;:::i;:::-;29789:139;;29687:248;;;:::o;29941:419::-;;30145:2;30134:9;30130:18;30122:26;;30194:9;30188:4;30184:20;30180:1;30169:9;30165:17;30158:47;30222:131;30348:4;30222:131;:::i;:::-;30214:139;;30112:248;;;:::o;30366:419::-;;30570:2;30559:9;30555:18;30547:26;;30619:9;30613:4;30609:20;30605:1;30594:9;30590:17;30583:47;30647:131;30773:4;30647:131;:::i;:::-;30639:139;;30537:248;;;:::o;30791:419::-;;30995:2;30984:9;30980:18;30972:26;;31044:9;31038:4;31034:20;31030:1;31019:9;31015:17;31008:47;31072:131;31198:4;31072:131;:::i;:::-;31064:139;;30962:248;;;:::o;31216:419::-;;31420:2;31409:9;31405:18;31397:26;;31469:9;31463:4;31459:20;31455:1;31444:9;31440:17;31433:47;31497:131;31623:4;31497:131;:::i;:::-;31489:139;;31387:248;;;:::o;31641:419::-;;31845:2;31834:9;31830:18;31822:26;;31894:9;31888:4;31884:20;31880:1;31869:9;31865:17;31858:47;31922:131;32048:4;31922:131;:::i;:::-;31914:139;;31812:248;;;:::o;32066:419::-;;32270:2;32259:9;32255:18;32247:26;;32319:9;32313:4;32309:20;32305:1;32294:9;32290:17;32283:47;32347:131;32473:4;32347:131;:::i;:::-;32339:139;;32237:248;;;:::o;32491:218::-;;32620:2;32609:9;32605:18;32597:26;;32633:69;32699:1;32688:9;32684:17;32675:6;32633:69;:::i;:::-;32587:122;;;;:::o;32715:222::-;;32846:2;32835:9;32831:18;32823:26;;32859:71;32927:1;32916:9;32912:17;32903:6;32859:71;:::i;:::-;32813:124;;;;:::o;32943:218::-;;33072:2;33061:9;33057:18;33049:26;;33085:69;33151:1;33140:9;33136:17;33127:6;33085:69;:::i;:::-;33039:122;;;;:::o;33167:214::-;;33294:2;33283:9;33279:18;33271:26;;33307:67;33371:1;33360:9;33356:17;33347:6;33307:67;:::i;:::-;33261:120;;;;:::o;33387:129::-;;33448:20;;:::i;:::-;33438:30;;33477:33;33505:4;33497:6;33477:33;:::i;:::-;33428:88;;;:::o;33522:75::-;;33588:2;33582:9;33572:19;;33562:35;:::o;33603:307::-;;33754:18;33746:6;33743:30;33740:2;;;33776:18;;:::i;:::-;33740:2;33814:29;33836:6;33814:29;:::i;:::-;33806:37;;33898:4;33892;33888:15;33880:23;;33669:241;;;:::o;33916:308::-;;34068:18;34060:6;34057:30;34054:2;;;34090:18;;:::i;:::-;34054:2;34128:29;34150:6;34128:29;:::i;:::-;34120:37;;34212:4;34206;34202:15;34194:23;;33983:241;;;:::o;34230:98::-;;34315:5;34309:12;34299:22;;34288:40;;;:::o;34334:99::-;;34420:5;34414:12;34404:22;;34393:40;;;:::o;34439:168::-;;34556:6;34551:3;34544:19;34596:4;34591:3;34587:14;34572:29;;34534:73;;;;:::o;34613:147::-;;34751:3;34736:18;;34726:34;;;;:::o;34766:169::-;;34884:6;34879:3;34872:19;34924:4;34919:3;34915:14;34900:29;;34862:73;;;;:::o;34941:148::-;;35080:3;35065:18;;35055:34;;;;:::o;35095:305::-;;35154:20;35172:1;35154:20;:::i;:::-;35149:25;;35188:20;35206:1;35188:20;:::i;:::-;35183:25;;35342:1;35274:66;35270:74;35267:1;35264:81;35261:2;;;35348:18;;:::i;:::-;35261:2;35392:1;35389;35385:9;35378:16;;35139:261;;;;:::o;35406:185::-;;35463:20;35481:1;35463:20;:::i;:::-;35458:25;;35497:20;35515:1;35497:20;:::i;:::-;35492:25;;35536:1;35526:2;;35541:18;;:::i;:::-;35526:2;35583:1;35580;35576:9;35571:14;;35448:143;;;;:::o;35597:297::-;;35659:19;35676:1;35659:19;:::i;:::-;35654:24;;35692:19;35709:1;35692:19;:::i;:::-;35687:24;;35831:1;35811:18;35807:26;35804:1;35801:33;35796:1;35789:9;35782:17;35778:57;35775:2;;;35838:18;;:::i;:::-;35775:2;35886:1;35883;35879:9;35868:20;;35644:250;;;;:::o;35900:191::-;;35960:20;35978:1;35960:20;:::i;:::-;35955:25;;35994:20;36012:1;35994:20;:::i;:::-;35989:25;;36033:1;36030;36027:8;36024:2;;;36038:18;;:::i;:::-;36024:2;36083:1;36080;36076:9;36068:17;;35945:146;;;;:::o;36097:96::-;;36163:24;36181:5;36163:24;:::i;:::-;36152:35;;36142:51;;;:::o;36199:90::-;;36276:5;36269:13;36262:21;36251:32;;36241:48;;;:::o;36295:149::-;;36371:66;36364:5;36360:78;36349:89;;36339:105;;;:::o;36450:89::-;;36526:6;36519:5;36515:18;36504:29;;36494:45;;;:::o;36545:126::-;;36622:42;36615:5;36611:54;36600:65;;36590:81;;;:::o;36677:77::-;;36743:5;36732:16;;36722:32;;;:::o;36760:101::-;;36836:18;36829:5;36825:30;36814:41;;36804:57;;;:::o;36867:86::-;;36942:4;36935:5;36931:16;36920:27;;36910:43;;;:::o;36959:154::-;37043:6;37038:3;37033;37020:30;37105:1;37096:6;37091:3;37087:16;37080:27;37010:103;;;:::o;37119:307::-;37187:1;37197:113;37211:6;37208:1;37205:13;37197:113;;;37296:1;37291:3;37287:11;37281:18;37277:1;37272:3;37268:11;37261:39;37233:2;37230:1;37226:10;37221:15;;37197:113;;;37328:6;37325:1;37322:13;37319:2;;;37408:1;37399:6;37394:3;37390:16;37383:27;37319:2;37168:258;;;;:::o;37432:320::-;;37513:1;37507:4;37503:12;37493:22;;37560:1;37554:4;37550:12;37581:18;37571:2;;37637:4;37629:6;37625:17;37615:27;;37571:2;37699;37691:6;37688:14;37668:18;37665:38;37662:2;;;37718:18;;:::i;:::-;37662:2;37483:269;;;;:::o;37758:281::-;37841:27;37863:4;37841:27;:::i;:::-;37833:6;37829:40;37971:6;37959:10;37956:22;37935:18;37923:10;37920:34;37917:62;37914:2;;;37982:18;;:::i;:::-;37914:2;38022:10;38018:2;38011:22;37801:238;;;:::o;38045:233::-;;38107:24;38125:5;38107:24;:::i;:::-;38098:33;;38153:66;38146:5;38143:77;38140:2;;;38223:18;;:::i;:::-;38140:2;38270:1;38263:5;38259:13;38252:20;;38088:190;;;:::o;38284:167::-;;38344:22;38360:5;38344:22;:::i;:::-;38335:31;;38388:4;38381:5;38378:15;38375:2;;;38396:18;;:::i;:::-;38375:2;38443:1;38436:5;38432:13;38425:20;;38325:126;;;:::o;38457:176::-;;38506:20;38524:1;38506:20;:::i;:::-;38501:25;;38540:20;38558:1;38540:20;:::i;:::-;38535:25;;38579:1;38569:2;;38584:18;;:::i;:::-;38569:2;38625:1;38622;38618:9;38613:14;;38491:142;;;;:::o;38639:180::-;38687:77;38684:1;38677:88;38784:4;38781:1;38774:15;38808:4;38805:1;38798:15;38825:180;38873:77;38870:1;38863:88;38970:4;38967:1;38960:15;38994:4;38991:1;38984:15;39011:180;39059:77;39056:1;39049:88;39156:4;39153:1;39146:15;39180:4;39177:1;39170:15;39197:180;39245:77;39242:1;39235:88;39342:4;39339:1;39332:15;39366:4;39363:1;39356:15;39383:102;;39475:2;39471:7;39466:2;39459:5;39455:14;39451:28;39441:38;;39431:54;;;:::o;39491:230::-;39631:34;39627:1;39619:6;39615:14;39608:58;39700:13;39695:2;39687:6;39683:15;39676:38;39597:124;:::o;39727:231::-;39867:34;39863:1;39855:6;39851:14;39844:58;39936:14;39931:2;39923:6;39919:15;39912:39;39833:125;:::o;39964:237::-;40104:34;40100:1;40092:6;40088:14;40081:58;40173:20;40168:2;40160:6;40156:15;40149:45;40070:131;:::o;40207:225::-;40347:34;40343:1;40335:6;40331:14;40324:58;40416:8;40411:2;40403:6;40399:15;40392:33;40313:119;:::o;40438:178::-;40578:30;40574:1;40566:6;40562:14;40555:54;40544:72;:::o;40622:174::-;40762:26;40758:1;40750:6;40746:14;40739:50;40728:68;:::o;40802:248::-;40942:34;40938:1;40930:6;40926:14;40919:58;41011:31;41006:2;40998:6;40994:15;40987:56;40908:142;:::o;41056:223::-;41196:34;41192:1;41184:6;41180:14;41173:58;41265:6;41260:2;41252:6;41248:15;41241:31;41162:117;:::o;41285:175::-;41425:27;41421:1;41413:6;41409:14;41402:51;41391:69;:::o;41466:231::-;41606:34;41602:1;41594:6;41590:14;41583:58;41675:14;41670:2;41662:6;41658:15;41651:39;41572:125;:::o;41703:243::-;41843:34;41839:1;41831:6;41827:14;41820:58;41912:26;41907:2;41899:6;41895:15;41888:51;41809:137;:::o;41952:229::-;42092:34;42088:1;42080:6;42076:14;42069:58;42161:12;42156:2;42148:6;42144:15;42137:37;42058:123;:::o;42187:228::-;42327:34;42323:1;42315:6;42311:14;42304:58;42396:11;42391:2;42383:6;42379:15;42372:36;42293:122;:::o;42421:182::-;42561:34;42557:1;42549:6;42545:14;42538:58;42527:76;:::o;42609:236::-;42749:34;42745:1;42737:6;42733:14;42726:58;42818:19;42813:2;42805:6;42801:15;42794:44;42715:130;:::o;42851:231::-;42991:34;42987:1;42979:6;42975:14;42968:58;43060:14;43055:2;43047:6;43043:15;43036:39;42957:125;:::o;43088:182::-;43228:34;43224:1;43216:6;43212:14;43205:58;43194:76;:::o;43276:228::-;43416:34;43412:1;43404:6;43400:14;43393:58;43485:11;43480:2;43472:6;43468:15;43461:36;43382:122;:::o;43510:234::-;43650:34;43646:1;43638:6;43634:14;43627:58;43719:17;43714:2;43706:6;43702:15;43695:42;43616:128;:::o;43750:174::-;43890:26;43886:1;43878:6;43874:14;43867:50;43856:68;:::o;43930:220::-;44070:34;44066:1;44058:6;44054:14;44047:58;44139:3;44134:2;44126:6;44122:15;44115:28;44036:114;:::o;44156:172::-;44296:24;44292:1;44284:6;44280:14;44273:48;44262:66;:::o;44334:170::-;44474:22;44470:1;44462:6;44458:14;44451:46;44440:64;:::o;44510:166::-;44650:18;44646:1;44638:6;44634:14;44627:42;44616:60;:::o;44682:114::-;44788:8;:::o;44802:236::-;44942:34;44938:1;44930:6;44926:14;44919:58;45011:19;45006:2;44998:6;44994:15;44987:44;44908:130;:::o;45044:176::-;45184:28;45180:1;45172:6;45168:14;45161:52;45150:70;:::o;45226:231::-;45366:34;45362:1;45354:6;45350:14;45343:58;45435:14;45430:2;45422:6;45418:15;45411:39;45332:125;:::o;45463:122::-;45536:24;45554:5;45536:24;:::i;:::-;45529:5;45526:35;45516:2;;45575:1;45572;45565:12;45516:2;45506:79;:::o;45591:116::-;45661:21;45676:5;45661:21;:::i;:::-;45654:5;45651:32;45641:2;;45697:1;45694;45687:12;45641:2;45631:76;:::o;45713:120::-;45785:23;45802:5;45785:23;:::i;:::-;45778:5;45775:34;45765:2;;45823:1;45820;45813:12;45765:2;45755:78;:::o;45839:122::-;45912:24;45930:5;45912:24;:::i;:::-;45905:5;45902:35;45892:2;;45951:1;45948;45941:12;45892:2;45882:79;:::o;45967:118::-;46038:22;46054:5;46038:22;:::i;:::-;46031:5;46028:33;46018:2;;46075:1;46072;46065:12;46018:2;46008:77;:::o

Swarm Source

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