ETH Price: $3,375.08 (-2.40%)

Token

Fortune Cat (FC)
 

Overview

Max Total Supply

1,860 FC

Holders

930

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 FC
0x91c0cB05581648B9f10cfF7016779f0c0392A27d
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:
FC

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-24
*/

// SPDX-License-Identifier: MIT
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);
    }
}


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

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


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_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 {
        _transferOwnership(address(0));
    }

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

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


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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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


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


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

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

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

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

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

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

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

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

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

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

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

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


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


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

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

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



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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // 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;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        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 override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

        _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 {
        _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 {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        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 TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}




contract FC is ERC721A, Ownable {
    using Strings for uint256;
    uint256 public constant FREE_SUPPLY = 6666;
    Stage public stage = Stage.Start;
    string public baseURI;
    string internal baseExtension = ".json";
    uint256 freeSupply;
    enum Stage {
        Pause,
        Start
    }

    event StageChanged(Stage from, Stage to);

    constructor() ERC721A("Fortune Cat", "FC") {}

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "FC: not exist");
        string memory currentBaseURI = _baseURI();
        return (
            bytes(currentBaseURI).length > 0
                ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension))
                : ""
        );
    }

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

    function setStage(Stage _stage) external onlyOwner {
        require(stage != _stage, "FC: invalid stage.");
        Stage prevStage = stage;
        stage = _stage;
        emit StageChanged(prevStage, stage);
    }


    function setBaseURI(string memory _newBaseURI) external onlyOwner {
        baseURI = _newBaseURI;
    }

    function freeMint() external {
        require(stage == Stage.Start, "FC: mint is pause.");
        require(freeSupply < FREE_SUPPLY, "FC: free mint complete.");
        freeSupply += 1;
        _safeMint(msg.sender, 1);
    }

    function setBaseExtension(string memory _extension) external onlyOwner {
        baseExtension = _extension;
    }

    function withdrawAll() external onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0, "No money");
        (bool success, ) = payable(msg.sender).call{value: balance}("");
        require(success, "Transfer failed");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"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":false,"internalType":"enum FC.Stage","name":"from","type":"uint8"},{"indexed":false,"internalType":"enum FC.Stage","name":"to","type":"uint8"}],"name":"StageChanged","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":"FREE_SUPPLY","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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"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":"_extension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum FC.Stage","name":"_stage","type":"uint8"}],"name":"setStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stage","outputs":[{"internalType":"enum FC.Stage","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","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":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526001600860146101000a81548160ff021916908360018111156200002d576200002c62000323565b5b02179055506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a90805190602001906200007f9291906200023d565b503480156200008d57600080fd5b506040518060400160405280600b81526020017f466f7274756e65204361740000000000000000000000000000000000000000008152506040518060400160405280600281526020017f46430000000000000000000000000000000000000000000000000000000000008152508160029080519060200190620001129291906200023d565b5080600390805190602001906200012b9291906200023d565b506200013c6200016a60201b60201c565b600081905550505062000164620001586200016f60201b60201c565b6200017760201b60201c565b62000381565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200024b90620002ed565b90600052602060002090601f0160209004810192826200026f5760008555620002bb565b82601f106200028a57805160ff1916838001178555620002bb565b82800160010185558215620002bb579182015b82811115620002ba5782518255916020019190600101906200029d565b5b509050620002ca9190620002ce565b5090565b5b80821115620002e9576000816000905550600101620002cf565b5090565b600060028204905060018216806200030657607f821691505b602082108114156200031d576200031c62000352565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61356a80620003916000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c8063715018a6116100de578063b88d4fde11610097578063ce3cd99711610071578063ce3cd99714610400578063da3ef23f1461041c578063e985e9c514610438578063f2fde38b1461046857610173565b8063b88d4fde14610396578063c040e6b8146103b2578063c87b56dd146103d057610173565b8063715018a61461030c578063853828b6146103165780638da5cb5b1461032057806395d89b411461033e5780639858cf191461035c578063a22cb4651461037a57610173565b806342842e0e1161013057806342842e0e1461024c57806355f804b3146102685780635b70ea9f146102845780636352211e1461028e5780636c0360eb146102be57806370a08231146102dc57610173565b806301ffc9a71461017857806306fdde03146101a8578063081812fc146101c6578063095ea7b3146101f657806318160ddd1461021257806323b872dd14610230575b600080fd5b610192600480360381019061018d91906128c8565b610484565b60405161019f9190612d0b565b60405180910390f35b6101b0610566565b6040516101bd9190612d6a565b60405180910390f35b6101e060048036038101906101db9190612998565b6105f8565b6040516101ed9190612ca4565b60405180910390f35b610210600480360381019061020b9190612888565b610674565b005b61021a61077f565b6040516102279190612e8c565b60405180910390f35b61024a60048036038101906102459190612772565b610796565b005b61026660048036038101906102619190612772565b6107a6565b005b610282600480360381019061027d919061294f565b6107c6565b005b61028c61085c565b005b6102a860048036038101906102a39190612998565b61093e565b6040516102b59190612ca4565b60405180910390f35b6102c6610954565b6040516102d39190612d6a565b60405180910390f35b6102f660048036038101906102f19190612705565b6109e2565b6040516103039190612e8c565b60405180910390f35b610314610ab2565b005b61031e610b3a565b005b610328610cae565b6040516103359190612ca4565b60405180910390f35b610346610cd8565b6040516103539190612d6a565b60405180910390f35b610364610d6a565b6040516103719190612e8c565b60405180910390f35b610394600480360381019061038f9190612848565b610d70565b005b6103b060048036038101906103ab91906127c5565b610ee8565b005b6103ba610f64565b6040516103c79190612d26565b60405180910390f35b6103ea60048036038101906103e59190612998565b610f77565b6040516103f79190612d6a565b60405180910390f35b61041a60048036038101906104159190612922565b611021565b005b6104366004803603810190610431919061294f565b61119d565b005b610452600480360381019061044d9190612732565b611233565b60405161045f9190612d0b565b60405180910390f35b610482600480360381019061047d9190612705565b6112c7565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061054f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061055f575061055e826113bf565b5b9050919050565b60606002805461057590613127565b80601f01602080910402602001604051908101604052809291908181526020018280546105a190613127565b80156105ee5780601f106105c3576101008083540402835291602001916105ee565b820191906000526020600020905b8154815290600101906020018083116105d157829003601f168201915b5050505050905090565b600061060382611429565b610639576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061067f8261093e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106e7576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610706611477565b73ffffffffffffffffffffffffffffffffffffffff1614158015610738575061073681610731611477565b611233565b155b1561076f576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61077a83838361147f565b505050565b6000610789611531565b6001546000540303905090565b6107a1838383611536565b505050565b6107c183838360405180602001604052806000815250610ee8565b505050565b6107ce611477565b73ffffffffffffffffffffffffffffffffffffffff166107ec610cae565b73ffffffffffffffffffffffffffffffffffffffff1614610842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083990612e4c565b60405180910390fd5b80600990805190602001906108589291906124c1565b5050565b60018081111561086f5761086e613262565b5b600860149054906101000a900460ff16600181111561089157610890613262565b5b146108d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c890612e0c565b60405180910390fd5b611a0a600b5410610917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090e90612e2c565b60405180910390fd5b6001600b600082825461092a9190612f91565b9250508190555061093c3360016119ec565b565b600061094982611a0a565b600001519050919050565b6009805461096190613127565b80601f016020809104026020016040519081016040528092919081815260200182805461098d90613127565b80156109da5780601f106109af576101008083540402835291602001916109da565b820191906000526020600020905b8154815290600101906020018083116109bd57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a4a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610aba611477565b73ffffffffffffffffffffffffffffffffffffffff16610ad8610cae565b73ffffffffffffffffffffffffffffffffffffffff1614610b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2590612e4c565b60405180910390fd5b610b386000611c99565b565b610b42611477565b73ffffffffffffffffffffffffffffffffffffffff16610b60610cae565b73ffffffffffffffffffffffffffffffffffffffff1614610bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad90612e4c565b60405180910390fd5b600047905060008111610bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf590612dec565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1682604051610c2490612c8f565b60006040518083038185875af1925050503d8060008114610c61576040519150601f19603f3d011682016040523d82523d6000602084013e610c66565b606091505b5050905080610caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca190612dcc565b60405180910390fd5b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610ce790613127565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1390613127565b8015610d605780601f10610d3557610100808354040283529160200191610d60565b820191906000526020600020905b815481529060010190602001808311610d4357829003601f168201915b5050505050905090565b611a0a81565b610d78611477565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ddd576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610dea611477565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610e97611477565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610edc9190612d0b565b60405180910390a35050565b610ef3848484611536565b610f128373ffffffffffffffffffffffffffffffffffffffff16611d5f565b8015610f275750610f2584848484611d82565b155b15610f5e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600860149054906101000a900460ff1681565b6060610f8282611429565b610fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb890612d8c565b60405180910390fd5b6000610fcb611ee2565b90506000815111610feb5760405180602001604052806000815250611019565b80610ff584611f74565b600a60405160200161100993929190612c5e565b6040516020818303038152906040525b915050919050565b611029611477565b73ffffffffffffffffffffffffffffffffffffffff16611047610cae565b73ffffffffffffffffffffffffffffffffffffffff161461109d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109490612e4c565b60405180910390fd5b8060018111156110b0576110af613262565b5b600860149054906101000a900460ff1660018111156110d2576110d1613262565b5b1415611113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110a90612e6c565b60405180910390fd5b6000600860149054906101000a900460ff16905081600860146101000a81548160ff0219169083600181111561114c5761114b613262565b5b02179055507f0f63b8bffe147a0fe1362da0e6e3ae0fcffce5497482f4d438715fe53890acf181600860149054906101000a900460ff16604051611191929190612d41565b60405180910390a15050565b6111a5611477565b73ffffffffffffffffffffffffffffffffffffffff166111c3610cae565b73ffffffffffffffffffffffffffffffffffffffff1614611219576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121090612e4c565b60405180910390fd5b80600a908051906020019061122f9291906124c1565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112cf611477565b73ffffffffffffffffffffffffffffffffffffffff166112ed610cae565b73ffffffffffffffffffffffffffffffffffffffff1614611343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133a90612e4c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113aa90612dac565b60405180910390fd5b6113bc81611c99565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611434611531565b11158015611443575060005482105b8015611470575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061154182611a0a565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146115ac576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166115cd611477565b73ffffffffffffffffffffffffffffffffffffffff1614806115fc57506115fb856115f6611477565b611233565b5b80611641575061160a611477565b73ffffffffffffffffffffffffffffffffffffffff16611629846105f8565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061167a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156116e1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116ee85858560016120d5565b6116fa6000848761147f565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561197a57600054821461197957878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119e585858560016120db565b5050505050565b611a068282604051806020016040528060008152506120e1565b5050565b611a12612547565b600082905080611a20611531565b11158015611a2f575060005481105b15611c62576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611c6057600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611b44578092505050611c94565b5b600115611c5f57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611c5a578092505050611c94565b611b45565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611da8611477565b8786866040518563ffffffff1660e01b8152600401611dca9493929190612cbf565b602060405180830381600087803b158015611de457600080fd5b505af1925050508015611e1557506040513d601f19601f82011682018060405250810190611e1291906128f5565b60015b611e8f573d8060008114611e45576040519150601f19603f3d011682016040523d82523d6000602084013e611e4a565b606091505b50600081511415611e87576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611ef190613127565b80601f0160208091040260200160405190810160405280929190818152602001828054611f1d90613127565b8015611f6a5780601f10611f3f57610100808354040283529160200191611f6a565b820191906000526020600020905b815481529060010190602001808311611f4d57829003601f168201915b5050505050905090565b60606000821415611fbc576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120d0565b600082905060005b60008214611fee578080611fd79061318a565b915050600a82611fe79190612fe7565b9150611fc4565b60008167ffffffffffffffff81111561200a576120096132ef565b5b6040519080825280601f01601f19166020018201604052801561203c5781602001600182028036833780820191505090505b5090505b600085146120c9576001826120559190613018565b9150600a8561206491906131d3565b60306120709190612f91565b60f81b818381518110612086576120856132c0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120c29190612fe7565b9450612040565b8093505050505b919050565b50505050565b50505050565b6120ee83838360016120f3565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612160576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561219b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121a860008683876120d5565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561237257506123718773ffffffffffffffffffffffffffffffffffffffff16611d5f565b5b15612438575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123e76000888480600101955088611d82565b61241d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561237857826000541461243357600080fd5b6124a4565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612439575b8160008190555050506124ba60008683876120db565b5050505050565b8280546124cd90613127565b90600052602060002090601f0160209004810192826124ef5760008555612536565b82601f1061250857805160ff1916838001178555612536565b82800160010185558215612536579182015b8281111561253557825182559160200191906001019061251a565b5b509050612543919061258a565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156125a357600081600090555060010161258b565b5090565b60006125ba6125b584612ecc565b612ea7565b9050828152602081018484840111156125d6576125d5613323565b5b6125e18482856130e5565b509392505050565b60006125fc6125f784612efd565b612ea7565b90508281526020810184848401111561261857612617613323565b5b6126238482856130e5565b509392505050565b60008135905061263a816134c8565b92915050565b60008135905061264f816134df565b92915050565b600081359050612664816134f6565b92915050565b600081519050612679816134f6565b92915050565b600082601f8301126126945761269361331e565b5b81356126a48482602086016125a7565b91505092915050565b6000813590506126bc8161350d565b92915050565b600082601f8301126126d7576126d661331e565b5b81356126e78482602086016125e9565b91505092915050565b6000813590506126ff8161351d565b92915050565b60006020828403121561271b5761271a61332d565b5b60006127298482850161262b565b91505092915050565b600080604083850312156127495761274861332d565b5b60006127578582860161262b565b92505060206127688582860161262b565b9150509250929050565b60008060006060848603121561278b5761278a61332d565b5b60006127998682870161262b565b93505060206127aa8682870161262b565b92505060406127bb868287016126f0565b9150509250925092565b600080600080608085870312156127df576127de61332d565b5b60006127ed8782880161262b565b94505060206127fe8782880161262b565b935050604061280f878288016126f0565b925050606085013567ffffffffffffffff8111156128305761282f613328565b5b61283c8782880161267f565b91505092959194509250565b6000806040838503121561285f5761285e61332d565b5b600061286d8582860161262b565b925050602061287e85828601612640565b9150509250929050565b6000806040838503121561289f5761289e61332d565b5b60006128ad8582860161262b565b92505060206128be858286016126f0565b9150509250929050565b6000602082840312156128de576128dd61332d565b5b60006128ec84828501612655565b91505092915050565b60006020828403121561290b5761290a61332d565b5b60006129198482850161266a565b91505092915050565b6000602082840312156129385761293761332d565b5b6000612946848285016126ad565b91505092915050565b6000602082840312156129655761296461332d565b5b600082013567ffffffffffffffff81111561298357612982613328565b5b61298f848285016126c2565b91505092915050565b6000602082840312156129ae576129ad61332d565b5b60006129bc848285016126f0565b91505092915050565b6129ce8161304c565b82525050565b6129dd8161305e565b82525050565b60006129ee82612f43565b6129f88185612f59565b9350612a088185602086016130f4565b612a1181613332565b840191505092915050565b612a25816130d3565b82525050565b6000612a3682612f4e565b612a408185612f75565b9350612a508185602086016130f4565b612a5981613332565b840191505092915050565b6000612a6f82612f4e565b612a798185612f86565b9350612a898185602086016130f4565b80840191505092915050565b60008154612aa281613127565b612aac8186612f86565b94506001821660008114612ac75760018114612ad857612b0b565b60ff19831686528186019350612b0b565b612ae185612f2e565b60005b83811015612b0357815481890152600182019150602081019050612ae4565b838801955050505b50505092915050565b6000612b21600d83612f75565b9150612b2c82613343565b602082019050919050565b6000612b44602683612f75565b9150612b4f8261336c565b604082019050919050565b6000612b67600f83612f75565b9150612b72826133bb565b602082019050919050565b6000612b8a600883612f75565b9150612b95826133e4565b602082019050919050565b6000612bad601283612f75565b9150612bb88261340d565b602082019050919050565b6000612bd0601783612f75565b9150612bdb82613436565b602082019050919050565b6000612bf3602083612f75565b9150612bfe8261345f565b602082019050919050565b6000612c16600083612f6a565b9150612c2182613488565b600082019050919050565b6000612c39601283612f75565b9150612c448261348b565b602082019050919050565b612c58816130c9565b82525050565b6000612c6a8286612a64565b9150612c768285612a64565b9150612c828284612a95565b9150819050949350505050565b6000612c9a82612c09565b9150819050919050565b6000602082019050612cb960008301846129c5565b92915050565b6000608082019050612cd460008301876129c5565b612ce160208301866129c5565b612cee6040830185612c4f565b8181036060830152612d0081846129e3565b905095945050505050565b6000602082019050612d2060008301846129d4565b92915050565b6000602082019050612d3b6000830184612a1c565b92915050565b6000604082019050612d566000830185612a1c565b612d636020830184612a1c565b9392505050565b60006020820190508181036000830152612d848184612a2b565b905092915050565b60006020820190508181036000830152612da581612b14565b9050919050565b60006020820190508181036000830152612dc581612b37565b9050919050565b60006020820190508181036000830152612de581612b5a565b9050919050565b60006020820190508181036000830152612e0581612b7d565b9050919050565b60006020820190508181036000830152612e2581612ba0565b9050919050565b60006020820190508181036000830152612e4581612bc3565b9050919050565b60006020820190508181036000830152612e6581612be6565b9050919050565b60006020820190508181036000830152612e8581612c2c565b9050919050565b6000602082019050612ea16000830184612c4f565b92915050565b6000612eb1612ec2565b9050612ebd8282613159565b919050565b6000604051905090565b600067ffffffffffffffff821115612ee757612ee66132ef565b5b612ef082613332565b9050602081019050919050565b600067ffffffffffffffff821115612f1857612f176132ef565b5b612f2182613332565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612f9c826130c9565b9150612fa7836130c9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612fdc57612fdb613204565b5b828201905092915050565b6000612ff2826130c9565b9150612ffd836130c9565b92508261300d5761300c613233565b5b828204905092915050565b6000613023826130c9565b915061302e836130c9565b92508282101561304157613040613204565b5b828203905092915050565b6000613057826130a9565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008190506130a4826134b4565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006130de82613096565b9050919050565b82818337600083830152505050565b60005b838110156131125780820151818401526020810190506130f7565b83811115613121576000848401525b50505050565b6000600282049050600182168061313f57607f821691505b6020821081141561315357613152613291565b5b50919050565b61316282613332565b810181811067ffffffffffffffff82111715613181576131806132ef565b5b80604052505050565b6000613195826130c9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131c8576131c7613204565b5b600182019050919050565b60006131de826130c9565b91506131e9836130c9565b9250826131f9576131f8613233565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f46433a206e6f7420657869737400000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b7f4e6f206d6f6e6579000000000000000000000000000000000000000000000000600082015250565b7f46433a206d696e742069732070617573652e0000000000000000000000000000600082015250565b7f46433a2066726565206d696e7420636f6d706c6574652e000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f46433a20696e76616c69642073746167652e0000000000000000000000000000600082015250565b600281106134c5576134c4613262565b5b50565b6134d18161304c565b81146134dc57600080fd5b50565b6134e88161305e565b81146134f357600080fd5b50565b6134ff8161306a565b811461350a57600080fd5b50565b6002811061351a57600080fd5b50565b613526816130c9565b811461353157600080fd5b5056fea264697066735822122023ab73320c4b47c857c8dcd67d424a12f3d4a22d9fcf336bac48dd99cbbd68e164736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101735760003560e01c8063715018a6116100de578063b88d4fde11610097578063ce3cd99711610071578063ce3cd99714610400578063da3ef23f1461041c578063e985e9c514610438578063f2fde38b1461046857610173565b8063b88d4fde14610396578063c040e6b8146103b2578063c87b56dd146103d057610173565b8063715018a61461030c578063853828b6146103165780638da5cb5b1461032057806395d89b411461033e5780639858cf191461035c578063a22cb4651461037a57610173565b806342842e0e1161013057806342842e0e1461024c57806355f804b3146102685780635b70ea9f146102845780636352211e1461028e5780636c0360eb146102be57806370a08231146102dc57610173565b806301ffc9a71461017857806306fdde03146101a8578063081812fc146101c6578063095ea7b3146101f657806318160ddd1461021257806323b872dd14610230575b600080fd5b610192600480360381019061018d91906128c8565b610484565b60405161019f9190612d0b565b60405180910390f35b6101b0610566565b6040516101bd9190612d6a565b60405180910390f35b6101e060048036038101906101db9190612998565b6105f8565b6040516101ed9190612ca4565b60405180910390f35b610210600480360381019061020b9190612888565b610674565b005b61021a61077f565b6040516102279190612e8c565b60405180910390f35b61024a60048036038101906102459190612772565b610796565b005b61026660048036038101906102619190612772565b6107a6565b005b610282600480360381019061027d919061294f565b6107c6565b005b61028c61085c565b005b6102a860048036038101906102a39190612998565b61093e565b6040516102b59190612ca4565b60405180910390f35b6102c6610954565b6040516102d39190612d6a565b60405180910390f35b6102f660048036038101906102f19190612705565b6109e2565b6040516103039190612e8c565b60405180910390f35b610314610ab2565b005b61031e610b3a565b005b610328610cae565b6040516103359190612ca4565b60405180910390f35b610346610cd8565b6040516103539190612d6a565b60405180910390f35b610364610d6a565b6040516103719190612e8c565b60405180910390f35b610394600480360381019061038f9190612848565b610d70565b005b6103b060048036038101906103ab91906127c5565b610ee8565b005b6103ba610f64565b6040516103c79190612d26565b60405180910390f35b6103ea60048036038101906103e59190612998565b610f77565b6040516103f79190612d6a565b60405180910390f35b61041a60048036038101906104159190612922565b611021565b005b6104366004803603810190610431919061294f565b61119d565b005b610452600480360381019061044d9190612732565b611233565b60405161045f9190612d0b565b60405180910390f35b610482600480360381019061047d9190612705565b6112c7565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061054f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061055f575061055e826113bf565b5b9050919050565b60606002805461057590613127565b80601f01602080910402602001604051908101604052809291908181526020018280546105a190613127565b80156105ee5780601f106105c3576101008083540402835291602001916105ee565b820191906000526020600020905b8154815290600101906020018083116105d157829003601f168201915b5050505050905090565b600061060382611429565b610639576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061067f8261093e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106e7576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610706611477565b73ffffffffffffffffffffffffffffffffffffffff1614158015610738575061073681610731611477565b611233565b155b1561076f576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61077a83838361147f565b505050565b6000610789611531565b6001546000540303905090565b6107a1838383611536565b505050565b6107c183838360405180602001604052806000815250610ee8565b505050565b6107ce611477565b73ffffffffffffffffffffffffffffffffffffffff166107ec610cae565b73ffffffffffffffffffffffffffffffffffffffff1614610842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083990612e4c565b60405180910390fd5b80600990805190602001906108589291906124c1565b5050565b60018081111561086f5761086e613262565b5b600860149054906101000a900460ff16600181111561089157610890613262565b5b146108d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c890612e0c565b60405180910390fd5b611a0a600b5410610917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090e90612e2c565b60405180910390fd5b6001600b600082825461092a9190612f91565b9250508190555061093c3360016119ec565b565b600061094982611a0a565b600001519050919050565b6009805461096190613127565b80601f016020809104026020016040519081016040528092919081815260200182805461098d90613127565b80156109da5780601f106109af576101008083540402835291602001916109da565b820191906000526020600020905b8154815290600101906020018083116109bd57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a4a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610aba611477565b73ffffffffffffffffffffffffffffffffffffffff16610ad8610cae565b73ffffffffffffffffffffffffffffffffffffffff1614610b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2590612e4c565b60405180910390fd5b610b386000611c99565b565b610b42611477565b73ffffffffffffffffffffffffffffffffffffffff16610b60610cae565b73ffffffffffffffffffffffffffffffffffffffff1614610bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad90612e4c565b60405180910390fd5b600047905060008111610bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf590612dec565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1682604051610c2490612c8f565b60006040518083038185875af1925050503d8060008114610c61576040519150601f19603f3d011682016040523d82523d6000602084013e610c66565b606091505b5050905080610caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca190612dcc565b60405180910390fd5b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610ce790613127565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1390613127565b8015610d605780601f10610d3557610100808354040283529160200191610d60565b820191906000526020600020905b815481529060010190602001808311610d4357829003601f168201915b5050505050905090565b611a0a81565b610d78611477565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ddd576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610dea611477565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610e97611477565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610edc9190612d0b565b60405180910390a35050565b610ef3848484611536565b610f128373ffffffffffffffffffffffffffffffffffffffff16611d5f565b8015610f275750610f2584848484611d82565b155b15610f5e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600860149054906101000a900460ff1681565b6060610f8282611429565b610fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb890612d8c565b60405180910390fd5b6000610fcb611ee2565b90506000815111610feb5760405180602001604052806000815250611019565b80610ff584611f74565b600a60405160200161100993929190612c5e565b6040516020818303038152906040525b915050919050565b611029611477565b73ffffffffffffffffffffffffffffffffffffffff16611047610cae565b73ffffffffffffffffffffffffffffffffffffffff161461109d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109490612e4c565b60405180910390fd5b8060018111156110b0576110af613262565b5b600860149054906101000a900460ff1660018111156110d2576110d1613262565b5b1415611113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110a90612e6c565b60405180910390fd5b6000600860149054906101000a900460ff16905081600860146101000a81548160ff0219169083600181111561114c5761114b613262565b5b02179055507f0f63b8bffe147a0fe1362da0e6e3ae0fcffce5497482f4d438715fe53890acf181600860149054906101000a900460ff16604051611191929190612d41565b60405180910390a15050565b6111a5611477565b73ffffffffffffffffffffffffffffffffffffffff166111c3610cae565b73ffffffffffffffffffffffffffffffffffffffff1614611219576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121090612e4c565b60405180910390fd5b80600a908051906020019061122f9291906124c1565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112cf611477565b73ffffffffffffffffffffffffffffffffffffffff166112ed610cae565b73ffffffffffffffffffffffffffffffffffffffff1614611343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133a90612e4c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113aa90612dac565b60405180910390fd5b6113bc81611c99565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611434611531565b11158015611443575060005482105b8015611470575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061154182611a0a565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146115ac576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166115cd611477565b73ffffffffffffffffffffffffffffffffffffffff1614806115fc57506115fb856115f6611477565b611233565b5b80611641575061160a611477565b73ffffffffffffffffffffffffffffffffffffffff16611629846105f8565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061167a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156116e1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116ee85858560016120d5565b6116fa6000848761147f565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561197a57600054821461197957878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119e585858560016120db565b5050505050565b611a068282604051806020016040528060008152506120e1565b5050565b611a12612547565b600082905080611a20611531565b11158015611a2f575060005481105b15611c62576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611c6057600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611b44578092505050611c94565b5b600115611c5f57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611c5a578092505050611c94565b611b45565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611da8611477565b8786866040518563ffffffff1660e01b8152600401611dca9493929190612cbf565b602060405180830381600087803b158015611de457600080fd5b505af1925050508015611e1557506040513d601f19601f82011682018060405250810190611e1291906128f5565b60015b611e8f573d8060008114611e45576040519150601f19603f3d011682016040523d82523d6000602084013e611e4a565b606091505b50600081511415611e87576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611ef190613127565b80601f0160208091040260200160405190810160405280929190818152602001828054611f1d90613127565b8015611f6a5780601f10611f3f57610100808354040283529160200191611f6a565b820191906000526020600020905b815481529060010190602001808311611f4d57829003601f168201915b5050505050905090565b60606000821415611fbc576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120d0565b600082905060005b60008214611fee578080611fd79061318a565b915050600a82611fe79190612fe7565b9150611fc4565b60008167ffffffffffffffff81111561200a576120096132ef565b5b6040519080825280601f01601f19166020018201604052801561203c5781602001600182028036833780820191505090505b5090505b600085146120c9576001826120559190613018565b9150600a8561206491906131d3565b60306120709190612f91565b60f81b818381518110612086576120856132c0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120c29190612fe7565b9450612040565b8093505050505b919050565b50505050565b50505050565b6120ee83838360016120f3565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612160576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561219b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121a860008683876120d5565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561237257506123718773ffffffffffffffffffffffffffffffffffffffff16611d5f565b5b15612438575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123e76000888480600101955088611d82565b61241d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561237857826000541461243357600080fd5b6124a4565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612439575b8160008190555050506124ba60008683876120db565b5050505050565b8280546124cd90613127565b90600052602060002090601f0160209004810192826124ef5760008555612536565b82601f1061250857805160ff1916838001178555612536565b82800160010185558215612536579182015b8281111561253557825182559160200191906001019061251a565b5b509050612543919061258a565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156125a357600081600090555060010161258b565b5090565b60006125ba6125b584612ecc565b612ea7565b9050828152602081018484840111156125d6576125d5613323565b5b6125e18482856130e5565b509392505050565b60006125fc6125f784612efd565b612ea7565b90508281526020810184848401111561261857612617613323565b5b6126238482856130e5565b509392505050565b60008135905061263a816134c8565b92915050565b60008135905061264f816134df565b92915050565b600081359050612664816134f6565b92915050565b600081519050612679816134f6565b92915050565b600082601f8301126126945761269361331e565b5b81356126a48482602086016125a7565b91505092915050565b6000813590506126bc8161350d565b92915050565b600082601f8301126126d7576126d661331e565b5b81356126e78482602086016125e9565b91505092915050565b6000813590506126ff8161351d565b92915050565b60006020828403121561271b5761271a61332d565b5b60006127298482850161262b565b91505092915050565b600080604083850312156127495761274861332d565b5b60006127578582860161262b565b92505060206127688582860161262b565b9150509250929050565b60008060006060848603121561278b5761278a61332d565b5b60006127998682870161262b565b93505060206127aa8682870161262b565b92505060406127bb868287016126f0565b9150509250925092565b600080600080608085870312156127df576127de61332d565b5b60006127ed8782880161262b565b94505060206127fe8782880161262b565b935050604061280f878288016126f0565b925050606085013567ffffffffffffffff8111156128305761282f613328565b5b61283c8782880161267f565b91505092959194509250565b6000806040838503121561285f5761285e61332d565b5b600061286d8582860161262b565b925050602061287e85828601612640565b9150509250929050565b6000806040838503121561289f5761289e61332d565b5b60006128ad8582860161262b565b92505060206128be858286016126f0565b9150509250929050565b6000602082840312156128de576128dd61332d565b5b60006128ec84828501612655565b91505092915050565b60006020828403121561290b5761290a61332d565b5b60006129198482850161266a565b91505092915050565b6000602082840312156129385761293761332d565b5b6000612946848285016126ad565b91505092915050565b6000602082840312156129655761296461332d565b5b600082013567ffffffffffffffff81111561298357612982613328565b5b61298f848285016126c2565b91505092915050565b6000602082840312156129ae576129ad61332d565b5b60006129bc848285016126f0565b91505092915050565b6129ce8161304c565b82525050565b6129dd8161305e565b82525050565b60006129ee82612f43565b6129f88185612f59565b9350612a088185602086016130f4565b612a1181613332565b840191505092915050565b612a25816130d3565b82525050565b6000612a3682612f4e565b612a408185612f75565b9350612a508185602086016130f4565b612a5981613332565b840191505092915050565b6000612a6f82612f4e565b612a798185612f86565b9350612a898185602086016130f4565b80840191505092915050565b60008154612aa281613127565b612aac8186612f86565b94506001821660008114612ac75760018114612ad857612b0b565b60ff19831686528186019350612b0b565b612ae185612f2e565b60005b83811015612b0357815481890152600182019150602081019050612ae4565b838801955050505b50505092915050565b6000612b21600d83612f75565b9150612b2c82613343565b602082019050919050565b6000612b44602683612f75565b9150612b4f8261336c565b604082019050919050565b6000612b67600f83612f75565b9150612b72826133bb565b602082019050919050565b6000612b8a600883612f75565b9150612b95826133e4565b602082019050919050565b6000612bad601283612f75565b9150612bb88261340d565b602082019050919050565b6000612bd0601783612f75565b9150612bdb82613436565b602082019050919050565b6000612bf3602083612f75565b9150612bfe8261345f565b602082019050919050565b6000612c16600083612f6a565b9150612c2182613488565b600082019050919050565b6000612c39601283612f75565b9150612c448261348b565b602082019050919050565b612c58816130c9565b82525050565b6000612c6a8286612a64565b9150612c768285612a64565b9150612c828284612a95565b9150819050949350505050565b6000612c9a82612c09565b9150819050919050565b6000602082019050612cb960008301846129c5565b92915050565b6000608082019050612cd460008301876129c5565b612ce160208301866129c5565b612cee6040830185612c4f565b8181036060830152612d0081846129e3565b905095945050505050565b6000602082019050612d2060008301846129d4565b92915050565b6000602082019050612d3b6000830184612a1c565b92915050565b6000604082019050612d566000830185612a1c565b612d636020830184612a1c565b9392505050565b60006020820190508181036000830152612d848184612a2b565b905092915050565b60006020820190508181036000830152612da581612b14565b9050919050565b60006020820190508181036000830152612dc581612b37565b9050919050565b60006020820190508181036000830152612de581612b5a565b9050919050565b60006020820190508181036000830152612e0581612b7d565b9050919050565b60006020820190508181036000830152612e2581612ba0565b9050919050565b60006020820190508181036000830152612e4581612bc3565b9050919050565b60006020820190508181036000830152612e6581612be6565b9050919050565b60006020820190508181036000830152612e8581612c2c565b9050919050565b6000602082019050612ea16000830184612c4f565b92915050565b6000612eb1612ec2565b9050612ebd8282613159565b919050565b6000604051905090565b600067ffffffffffffffff821115612ee757612ee66132ef565b5b612ef082613332565b9050602081019050919050565b600067ffffffffffffffff821115612f1857612f176132ef565b5b612f2182613332565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612f9c826130c9565b9150612fa7836130c9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612fdc57612fdb613204565b5b828201905092915050565b6000612ff2826130c9565b9150612ffd836130c9565b92508261300d5761300c613233565b5b828204905092915050565b6000613023826130c9565b915061302e836130c9565b92508282101561304157613040613204565b5b828203905092915050565b6000613057826130a9565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008190506130a4826134b4565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006130de82613096565b9050919050565b82818337600083830152505050565b60005b838110156131125780820151818401526020810190506130f7565b83811115613121576000848401525b50505050565b6000600282049050600182168061313f57607f821691505b6020821081141561315357613152613291565b5b50919050565b61316282613332565b810181811067ffffffffffffffff82111715613181576131806132ef565b5b80604052505050565b6000613195826130c9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131c8576131c7613204565b5b600182019050919050565b60006131de826130c9565b91506131e9836130c9565b9250826131f9576131f8613233565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f46433a206e6f7420657869737400000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b7f4e6f206d6f6e6579000000000000000000000000000000000000000000000000600082015250565b7f46433a206d696e742069732070617573652e0000000000000000000000000000600082015250565b7f46433a2066726565206d696e7420636f6d706c6574652e000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f46433a20696e76616c69642073746167652e0000000000000000000000000000600082015250565b600281106134c5576134c4613262565b5b50565b6134d18161304c565b81146134dc57600080fd5b50565b6134e88161305e565b81146134f357600080fd5b50565b6134ff8161306a565b811461350a57600080fd5b50565b6002811061351a57600080fd5b50565b613526816130c9565b811461353157600080fd5b5056fea264697066735822122023ab73320c4b47c857c8dcd67d424a12f3d4a22d9fcf336bac48dd99cbbd68e164736f6c63430008070033

Deployed Bytecode Sourcemap

45880:1910:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28129:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31242:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32745:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32308:371;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27378:303;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33610:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33851:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47047:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47161:231;;;:::i;:::-;;31050:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46039:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28498:206;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4373:103;;;:::i;:::-;;47524:263;;;:::i;:::-;;3722:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31411:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45951:42;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33021:287;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34107:369;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46000:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46298:394;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46816:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47400:116;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33379:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4631:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28129:305;28231:4;28283:25;28268:40;;;:11;:40;;;;:105;;;;28340:33;28325:48;;;:11;:48;;;;28268:105;:158;;;;28390:36;28414:11;28390:23;:36::i;:::-;28268:158;28248:178;;28129:305;;;:::o;31242:100::-;31296:13;31329:5;31322:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31242:100;:::o;32745:204::-;32813:7;32838:16;32846:7;32838;:16::i;:::-;32833:64;;32863:34;;;;;;;;;;;;;;32833:64;32917:15;:24;32933:7;32917:24;;;;;;;;;;;;;;;;;;;;;32910:31;;32745:204;;;:::o;32308:371::-;32381:13;32397:24;32413:7;32397:15;:24::i;:::-;32381:40;;32442:5;32436:11;;:2;:11;;;32432:48;;;32456:24;;;;;;;;;;;;;;32432:48;32513:5;32497:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;32523:37;32540:5;32547:12;:10;:12::i;:::-;32523:16;:37::i;:::-;32522:38;32497:63;32493:138;;;32584:35;;;;;;;;;;;;;;32493:138;32643:28;32652:2;32656:7;32665:5;32643:8;:28::i;:::-;32370:309;32308:371;;:::o;27378:303::-;27422:7;27647:15;:13;:15::i;:::-;27632:12;;27616:13;;:28;:46;27609:53;;27378:303;:::o;33610:170::-;33744:28;33754:4;33760:2;33764:7;33744:9;:28::i;:::-;33610:170;;;:::o;33851:185::-;33989:39;34006:4;34012:2;34016:7;33989:39;;;;;;;;;;;;:16;:39::i;:::-;33851:185;;;:::o;47047:106::-;3953:12;:10;:12::i;:::-;3942:23;;:7;:5;:7::i;:::-;:23;;;3934:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47134:11:::1;47124:7;:21;;;;;;;;;;;;:::i;:::-;;47047:106:::0;:::o;47161:231::-;47218:11;47209:20;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:20;;;;;;;;:::i;:::-;;;47201:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;45989:4;47271:10;;:24;47263:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;47348:1;47334:10;;:15;;;;;;;:::i;:::-;;;;;;;;47360:24;47370:10;47382:1;47360:9;:24::i;:::-;47161:231::o;31050:125::-;31114:7;31141:21;31154:7;31141:12;:21::i;:::-;:26;;;31134:33;;31050:125;;;:::o;46039:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28498:206::-;28562:7;28603:1;28586:19;;:5;:19;;;28582:60;;;28614:28;;;;;;;;;;;;;;28582:60;28668:12;:19;28681:5;28668:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;28660:36;;28653:43;;28498:206;;;:::o;4373:103::-;3953:12;:10;:12::i;:::-;3942:23;;:7;:5;:7::i;:::-;:23;;;3934:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4438:30:::1;4465:1;4438:18;:30::i;:::-;4373:103::o:0;47524:263::-;3953:12;:10;:12::i;:::-;3942:23;;:7;:5;:7::i;:::-;:23;;;3934:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47577:15:::1;47595:21;47577:39;;47645:1;47635:7;:11;47627:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;47671:12;47697:10;47689:24;;47721:7;47689:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47670:63;;;47752:7;47744:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;47566:221;;47524:263::o:0;3722:87::-;3768:7;3795:6;;;;;;;;;;;3788:13;;3722:87;:::o;31411:104::-;31467:13;31500:7;31493:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31411:104;:::o;45951:42::-;45989:4;45951:42;:::o;33021:287::-;33132:12;:10;:12::i;:::-;33120:24;;:8;:24;;;33116:54;;;33153:17;;;;;;;;;;;;;;33116:54;33228:8;33183:18;:32;33202:12;:10;:12::i;:::-;33183:32;;;;;;;;;;;;;;;:42;33216:8;33183:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;33281:8;33252:48;;33267:12;:10;:12::i;:::-;33252:48;;;33291:8;33252:48;;;;;;:::i;:::-;;;;;;;;33021:287;;:::o;34107:369::-;34274:28;34284:4;34290:2;34294:7;34274:9;:28::i;:::-;34317:15;:2;:13;;;:15::i;:::-;:76;;;;;34337:56;34368:4;34374:2;34378:7;34387:5;34337:30;:56::i;:::-;34336:57;34317:76;34313:156;;;34417:40;;;;;;;;;;;;;;34313:156;34107:369;;;;:::o;46000:32::-;;;;;;;;;;;;;:::o;46298:394::-;46371:13;46405:16;46413:7;46405;:16::i;:::-;46397:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;46450:28;46481:10;:8;:10::i;:::-;46450:41;;46555:1;46530:14;46524:28;:32;:149;;;;;;;;;;;;;;;;;46600:14;46616:18;:7;:16;:18::i;:::-;46636:13;46583:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46524:149;46502:182;;;46298:394;;;:::o;46816:221::-;3953:12;:10;:12::i;:::-;3942:23;;:7;:5;:7::i;:::-;:23;;;3934:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46895:6:::1;46886:15;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:15;;;;;;;;:::i;:::-;;;;46878:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;46935:15;46953:5;;;;;;;;;;;46935:23;;46977:6;46969:5;;:14;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;46999:30;47012:9;47023:5;;;;;;;;;;;46999:30;;;;;;;:::i;:::-;;;;;;;;46867:170;46816:221:::0;:::o;47400:116::-;3953:12;:10;:12::i;:::-;3942:23;;:7;:5;:7::i;:::-;:23;;;3934:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47498:10:::1;47482:13;:26;;;;;;;;;;;;:::i;:::-;;47400:116:::0;:::o;33379:164::-;33476:4;33500:18;:25;33519:5;33500:25;;;;;;;;;;;;;;;:35;33526:8;33500:35;;;;;;;;;;;;;;;;;;;;;;;;;33493:42;;33379:164;;;;:::o;4631:201::-;3953:12;:10;:12::i;:::-;3942:23;;:7;:5;:7::i;:::-;:23;;;3934:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4740:1:::1;4720:22;;:8;:22;;;;4712:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4796:28;4815:8;4796:18;:28::i;:::-;4631:201:::0;:::o;23792:157::-;23877:4;23916:25;23901:40;;;:11;:40;;;;23894:47;;23792:157;;;:::o;34731:174::-;34788:4;34831:7;34812:15;:13;:15::i;:::-;:26;;:53;;;;;34852:13;;34842:7;:23;34812:53;:85;;;;;34870:11;:20;34882:7;34870:20;;;;;;;;;;;:27;;;;;;;;;;;;34869:28;34812:85;34805:92;;34731:174;;;:::o;2587:98::-;2640:7;2667:10;2660:17;;2587:98;:::o;42888:196::-;43030:2;43003:15;:24;43019:7;43003:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;43068:7;43064:2;43048:28;;43057:5;43048:28;;;;;;;;;;;;42888:196;;;:::o;27152:92::-;27208:7;27152:92;:::o;37831:2130::-;37946:35;37984:21;37997:7;37984:12;:21::i;:::-;37946:59;;38044:4;38022:26;;:13;:18;;;:26;;;38018:67;;38057:28;;;;;;;;;;;;;;38018:67;38098:22;38140:4;38124:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;38161:36;38178:4;38184:12;:10;:12::i;:::-;38161:16;:36::i;:::-;38124:73;:126;;;;38238:12;:10;:12::i;:::-;38214:36;;:20;38226:7;38214:11;:20::i;:::-;:36;;;38124:126;38098:153;;38269:17;38264:66;;38295:35;;;;;;;;;;;;;;38264:66;38359:1;38345:16;;:2;:16;;;38341:52;;;38370:23;;;;;;;;;;;;;;38341:52;38406:43;38428:4;38434:2;38438:7;38447:1;38406:21;:43::i;:::-;38514:35;38531:1;38535:7;38544:4;38514:8;:35::i;:::-;38875:1;38845:12;:18;38858:4;38845:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38919:1;38891:12;:16;38904:2;38891:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38937:31;38971:11;:20;38983:7;38971:20;;;;;;;;;;;38937:54;;39022:2;39006:8;:13;;;:18;;;;;;;;;;;;;;;;;;39072:15;39039:8;:23;;;:49;;;;;;;;;;;;;;;;;;39340:19;39372:1;39362:7;:11;39340:33;;39388:31;39422:11;:24;39434:11;39422:24;;;;;;;;;;;39388:58;;39490:1;39465:27;;:8;:13;;;;;;;;;;;;:27;;;39461:384;;;39675:13;;39660:11;:28;39656:174;;39729:4;39713:8;:13;;;:20;;;;;;;;;;;;;;;;;;39782:13;:28;;;39756:8;:23;;;:54;;;;;;;;;;;;;;;;;;39656:174;39461:384;38820:1036;;;39892:7;39888:2;39873:27;;39882:4;39873:27;;;;;;;;;;;;39911:42;39932:4;39938:2;39942:7;39951:1;39911:20;:42::i;:::-;37935:2026;;37831:2130;;;:::o;34913:104::-;34982:27;34992:2;34996:8;34982:27;;;;;;;;;;;;:9;:27::i;:::-;34913:104;;:::o;29879:1109::-;29941:21;;:::i;:::-;29975:12;29990:7;29975:22;;30058:4;30039:15;:13;:15::i;:::-;:23;;:47;;;;;30073:13;;30066:4;:20;30039:47;30035:886;;;30107:31;30141:11;:17;30153:4;30141:17;;;;;;;;;;;30107:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30182:9;:16;;;30177:729;;30253:1;30227:28;;:9;:14;;;:28;;;30223:101;;30291:9;30284:16;;;;;;30223:101;30626:261;30633:4;30626:261;;;30666:6;;;;;;;;30711:11;:17;30723:4;30711:17;;;;;;;;;;;30699:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30785:1;30759:28;;:9;:14;;;:28;;;30755:109;;30827:9;30820:16;;;;;;30755:109;30626:261;;;30177:729;30088:833;30035:886;30949:31;;;;;;;;;;;;;;29879:1109;;;;:::o;4992:191::-;5066:16;5085:6;;;;;;;;;;;5066:25;;5111:8;5102:6;;:17;;;;;;;;;;;;;;;;;;5166:8;5135:40;;5156:8;5135:40;;;;;;;;;;;;5055:128;4992:191;:::o;15820:326::-;15880:4;16137:1;16115:7;:19;;;:23;16108:30;;15820:326;;;:::o;43576:667::-;43739:4;43776:2;43760:36;;;43797:12;:10;:12::i;:::-;43811:4;43817:7;43826:5;43760:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;43756:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44011:1;43994:6;:13;:18;43990:235;;;44040:40;;;;;;;;;;;;;;43990:235;44183:6;44177:13;44168:6;44164:2;44160:15;44153:38;43756:480;43889:45;;;43879:55;;;:6;:55;;;;43872:62;;;43576:667;;;;;;:::o;46700:108::-;46760:13;46793:7;46786:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46700:108;:::o;286:723::-;342:13;572:1;563:5;:10;559:53;;;590:10;;;;;;;;;;;;;;;;;;;;;559:53;622:12;637:5;622:20;;653:14;678:78;693:1;685:4;:9;678:78;;711:8;;;;;:::i;:::-;;;;742:2;734:10;;;;;:::i;:::-;;;678:78;;;766:19;798:6;788:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;766:39;;816:154;832:1;823:5;:10;816:154;;860:1;850:11;;;;;:::i;:::-;;;927:2;919:5;:10;;;;:::i;:::-;906:2;:24;;;;:::i;:::-;893:39;;876:6;883;876:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;956:2;947:11;;;;;:::i;:::-;;;816:154;;;994:6;980:21;;;;;286:723;;;;:::o;44891:159::-;;;;;:::o;45709:158::-;;;;;:::o;35380:163::-;35503:32;35509:2;35513:8;35523:5;35530:4;35503:5;:32::i;:::-;35380:163;;;:::o;35802:1775::-;35941:20;35964:13;;35941:36;;36006:1;35992:16;;:2;:16;;;35988:48;;;36017:19;;;;;;;;;;;;;;35988:48;36063:1;36051:8;:13;36047:44;;;36073:18;;;;;;;;;;;;;;36047:44;36104:61;36134:1;36138:2;36142:12;36156:8;36104:21;:61::i;:::-;36477:8;36442:12;:16;36455:2;36442:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36541:8;36501:12;:16;36514:2;36501:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36600:2;36567:11;:25;36579:12;36567:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;36667:15;36617:11;:25;36629:12;36617:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;36700:20;36723:12;36700:35;;36750:11;36779:8;36764:12;:23;36750:37;;36808:4;:23;;;;;36816:15;:2;:13;;;:15::i;:::-;36808:23;36804:641;;;36852:314;36908:12;36904:2;36883:38;;36900:1;36883:38;;;;;;;;;;;;36949:69;36988:1;36992:2;36996:14;;;;;;37012:5;36949:30;:69::i;:::-;36944:174;;37054:40;;;;;;;;;;;;;;36944:174;37161:3;37145:12;:19;;36852:314;;37247:12;37230:13;;:29;37226:43;;37261:8;;;37226:43;36804:641;;;37310:120;37366:14;;;;;;37362:2;37341:40;;37358:1;37341:40;;;;;;;;;;;;37425:3;37409:12;:19;;37310:120;;36804:641;37475:12;37459:13;:28;;;;36417:1082;;37509:60;37538:1;37542:2;37546:12;37560:8;37509:20;:60::i;:::-;35930:1647;35802:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;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:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1772:159::-;1828:5;1866:6;1853:20;1844:29;;1882:43;1919:5;1882:43;:::i;:::-;1772:159;;;;:::o;1951:340::-;2007:5;2056:3;2049:4;2041:6;2037:17;2033:27;2023:122;;2064:79;;:::i;:::-;2023:122;2181:6;2168:20;2206:79;2281:3;2273:6;2266:4;2258:6;2254:17;2206:79;:::i;:::-;2197:88;;2013:278;1951:340;;;;:::o;2297:139::-;2343:5;2381:6;2368:20;2359:29;;2397:33;2424:5;2397:33;:::i;:::-;2297:139;;;;:::o;2442:329::-;2501:6;2550:2;2538:9;2529:7;2525:23;2521:32;2518:119;;;2556:79;;:::i;:::-;2518:119;2676:1;2701:53;2746:7;2737:6;2726:9;2722:22;2701:53;:::i;:::-;2691:63;;2647:117;2442:329;;;;:::o;2777:474::-;2845:6;2853;2902:2;2890:9;2881:7;2877:23;2873:32;2870:119;;;2908:79;;:::i;:::-;2870:119;3028:1;3053:53;3098:7;3089:6;3078:9;3074:22;3053:53;:::i;:::-;3043:63;;2999:117;3155:2;3181:53;3226:7;3217:6;3206:9;3202:22;3181:53;:::i;:::-;3171:63;;3126:118;2777:474;;;;;:::o;3257:619::-;3334:6;3342;3350;3399:2;3387:9;3378:7;3374:23;3370:32;3367:119;;;3405:79;;:::i;:::-;3367:119;3525:1;3550:53;3595:7;3586:6;3575:9;3571:22;3550:53;:::i;:::-;3540:63;;3496:117;3652:2;3678:53;3723:7;3714:6;3703:9;3699:22;3678:53;:::i;:::-;3668:63;;3623:118;3780:2;3806:53;3851:7;3842:6;3831:9;3827:22;3806:53;:::i;:::-;3796:63;;3751:118;3257:619;;;;;:::o;3882:943::-;3977:6;3985;3993;4001;4050:3;4038:9;4029:7;4025:23;4021:33;4018:120;;;4057:79;;:::i;:::-;4018:120;4177:1;4202:53;4247:7;4238:6;4227:9;4223:22;4202:53;:::i;:::-;4192:63;;4148:117;4304:2;4330:53;4375:7;4366:6;4355:9;4351:22;4330:53;:::i;:::-;4320:63;;4275:118;4432:2;4458:53;4503:7;4494:6;4483:9;4479:22;4458:53;:::i;:::-;4448:63;;4403:118;4588:2;4577:9;4573:18;4560:32;4619:18;4611:6;4608:30;4605:117;;;4641:79;;:::i;:::-;4605:117;4746:62;4800:7;4791:6;4780:9;4776:22;4746:62;:::i;:::-;4736:72;;4531:287;3882:943;;;;;;;:::o;4831:468::-;4896:6;4904;4953:2;4941:9;4932:7;4928:23;4924:32;4921:119;;;4959:79;;:::i;:::-;4921:119;5079:1;5104:53;5149:7;5140:6;5129:9;5125:22;5104:53;:::i;:::-;5094:63;;5050:117;5206:2;5232:50;5274:7;5265:6;5254:9;5250:22;5232:50;:::i;:::-;5222:60;;5177:115;4831:468;;;;;:::o;5305:474::-;5373:6;5381;5430:2;5418:9;5409:7;5405:23;5401:32;5398:119;;;5436:79;;:::i;:::-;5398:119;5556:1;5581:53;5626:7;5617:6;5606:9;5602:22;5581:53;:::i;:::-;5571:63;;5527:117;5683:2;5709:53;5754:7;5745:6;5734:9;5730:22;5709:53;:::i;:::-;5699:63;;5654:118;5305:474;;;;;:::o;5785:327::-;5843:6;5892:2;5880:9;5871:7;5867:23;5863:32;5860:119;;;5898:79;;:::i;:::-;5860:119;6018:1;6043:52;6087:7;6078:6;6067:9;6063:22;6043:52;:::i;:::-;6033:62;;5989:116;5785:327;;;;:::o;6118:349::-;6187:6;6236:2;6224:9;6215:7;6211:23;6207:32;6204:119;;;6242:79;;:::i;:::-;6204:119;6362:1;6387:63;6442:7;6433:6;6422:9;6418:22;6387:63;:::i;:::-;6377:73;;6333:127;6118:349;;;;:::o;6473:::-;6542:6;6591:2;6579:9;6570:7;6566:23;6562:32;6559:119;;;6597:79;;:::i;:::-;6559:119;6717:1;6742:63;6797:7;6788:6;6777:9;6773:22;6742:63;:::i;:::-;6732:73;;6688:127;6473:349;;;;:::o;6828:509::-;6897:6;6946:2;6934:9;6925:7;6921:23;6917:32;6914:119;;;6952:79;;:::i;:::-;6914:119;7100:1;7089:9;7085:17;7072:31;7130:18;7122:6;7119:30;7116:117;;;7152:79;;:::i;:::-;7116:117;7257:63;7312:7;7303:6;7292:9;7288:22;7257:63;:::i;:::-;7247:73;;7043:287;6828:509;;;;:::o;7343:329::-;7402:6;7451:2;7439:9;7430:7;7426:23;7422:32;7419:119;;;7457:79;;:::i;:::-;7419:119;7577:1;7602:53;7647:7;7638:6;7627:9;7623:22;7602:53;:::i;:::-;7592:63;;7548:117;7343:329;;;;:::o;7678:118::-;7765:24;7783:5;7765:24;:::i;:::-;7760:3;7753:37;7678:118;;:::o;7802:109::-;7883:21;7898:5;7883:21;:::i;:::-;7878:3;7871:34;7802:109;;:::o;7917:360::-;8003:3;8031:38;8063:5;8031:38;:::i;:::-;8085:70;8148:6;8143:3;8085:70;:::i;:::-;8078:77;;8164:52;8209:6;8204:3;8197:4;8190:5;8186:16;8164:52;:::i;:::-;8241:29;8263:6;8241:29;:::i;:::-;8236:3;8232:39;8225:46;;8007:270;7917:360;;;;:::o;8283:147::-;8378:45;8417:5;8378:45;:::i;:::-;8373:3;8366:58;8283:147;;:::o;8436:364::-;8524:3;8552:39;8585:5;8552:39;:::i;:::-;8607:71;8671:6;8666:3;8607:71;:::i;:::-;8600:78;;8687:52;8732:6;8727:3;8720:4;8713:5;8709:16;8687:52;:::i;:::-;8764:29;8786:6;8764:29;:::i;:::-;8759:3;8755:39;8748:46;;8528:272;8436:364;;;;:::o;8806:377::-;8912:3;8940:39;8973:5;8940:39;:::i;:::-;8995:89;9077:6;9072:3;8995:89;:::i;:::-;8988:96;;9093:52;9138:6;9133:3;9126:4;9119:5;9115:16;9093:52;:::i;:::-;9170:6;9165:3;9161:16;9154:23;;8916:267;8806:377;;;;:::o;9213:845::-;9316:3;9353:5;9347:12;9382:36;9408:9;9382:36;:::i;:::-;9434:89;9516:6;9511:3;9434:89;:::i;:::-;9427:96;;9554:1;9543:9;9539:17;9570:1;9565:137;;;;9716:1;9711:341;;;;9532:520;;9565:137;9649:4;9645:9;9634;9630:25;9625:3;9618:38;9685:6;9680:3;9676:16;9669:23;;9565:137;;9711:341;9778:38;9810:5;9778:38;:::i;:::-;9838:1;9852:154;9866:6;9863:1;9860:13;9852:154;;;9940:7;9934:14;9930:1;9925:3;9921:11;9914:35;9990:1;9981:7;9977:15;9966:26;;9888:4;9885:1;9881:12;9876:17;;9852:154;;;10035:6;10030:3;10026:16;10019:23;;9718:334;;9532:520;;9320:738;;9213:845;;;;:::o;10064:366::-;10206:3;10227:67;10291:2;10286:3;10227:67;:::i;:::-;10220:74;;10303:93;10392:3;10303:93;:::i;:::-;10421:2;10416:3;10412:12;10405:19;;10064:366;;;:::o;10436:::-;10578:3;10599:67;10663:2;10658:3;10599:67;:::i;:::-;10592:74;;10675:93;10764:3;10675:93;:::i;:::-;10793:2;10788:3;10784:12;10777:19;;10436:366;;;:::o;10808:::-;10950:3;10971:67;11035:2;11030:3;10971:67;:::i;:::-;10964:74;;11047:93;11136:3;11047:93;:::i;:::-;11165:2;11160:3;11156:12;11149:19;;10808:366;;;:::o;11180:365::-;11322:3;11343:66;11407:1;11402:3;11343:66;:::i;:::-;11336:73;;11418:93;11507:3;11418:93;:::i;:::-;11536:2;11531:3;11527:12;11520:19;;11180:365;;;:::o;11551:366::-;11693:3;11714:67;11778:2;11773:3;11714:67;:::i;:::-;11707:74;;11790:93;11879:3;11790:93;:::i;:::-;11908:2;11903:3;11899:12;11892:19;;11551:366;;;:::o;11923:::-;12065:3;12086:67;12150:2;12145:3;12086:67;:::i;:::-;12079:74;;12162:93;12251:3;12162:93;:::i;:::-;12280:2;12275:3;12271:12;12264:19;;11923:366;;;:::o;12295:::-;12437:3;12458:67;12522:2;12517:3;12458:67;:::i;:::-;12451:74;;12534:93;12623:3;12534:93;:::i;:::-;12652:2;12647:3;12643:12;12636:19;;12295:366;;;:::o;12667:398::-;12826:3;12847:83;12928:1;12923:3;12847:83;:::i;:::-;12840:90;;12939:93;13028:3;12939:93;:::i;:::-;13057:1;13052:3;13048:11;13041:18;;12667:398;;;:::o;13071:366::-;13213:3;13234:67;13298:2;13293:3;13234:67;:::i;:::-;13227:74;;13310:93;13399:3;13310:93;:::i;:::-;13428:2;13423:3;13419:12;13412:19;;13071:366;;;:::o;13443:118::-;13530:24;13548:5;13530:24;:::i;:::-;13525:3;13518:37;13443:118;;:::o;13567:589::-;13792:3;13814:95;13905:3;13896:6;13814:95;:::i;:::-;13807:102;;13926:95;14017:3;14008:6;13926:95;:::i;:::-;13919:102;;14038:92;14126:3;14117:6;14038:92;:::i;:::-;14031:99;;14147:3;14140:10;;13567:589;;;;;;:::o;14162:379::-;14346:3;14368:147;14511:3;14368:147;:::i;:::-;14361:154;;14532:3;14525:10;;14162:379;;;:::o;14547:222::-;14640:4;14678:2;14667:9;14663:18;14655:26;;14691:71;14759:1;14748:9;14744:17;14735:6;14691:71;:::i;:::-;14547:222;;;;:::o;14775:640::-;14970:4;15008:3;14997:9;14993:19;14985:27;;15022:71;15090:1;15079:9;15075:17;15066:6;15022:71;:::i;:::-;15103:72;15171:2;15160:9;15156:18;15147:6;15103:72;:::i;:::-;15185;15253:2;15242:9;15238:18;15229:6;15185:72;:::i;:::-;15304:9;15298:4;15294:20;15289:2;15278:9;15274:18;15267:48;15332:76;15403:4;15394:6;15332:76;:::i;:::-;15324:84;;14775:640;;;;;;;:::o;15421:210::-;15508:4;15546:2;15535:9;15531:18;15523:26;;15559:65;15621:1;15610:9;15606:17;15597:6;15559:65;:::i;:::-;15421:210;;;;:::o;15637:238::-;15738:4;15776:2;15765:9;15761:18;15753:26;;15789:79;15865:1;15854:9;15850:17;15841:6;15789:79;:::i;:::-;15637:238;;;;:::o;15881:364::-;16018:4;16056:2;16045:9;16041:18;16033:26;;16069:79;16145:1;16134:9;16130:17;16121:6;16069:79;:::i;:::-;16158:80;16234:2;16223:9;16219:18;16210:6;16158:80;:::i;:::-;15881:364;;;;;:::o;16251:313::-;16364:4;16402:2;16391:9;16387:18;16379:26;;16451:9;16445:4;16441:20;16437:1;16426:9;16422:17;16415:47;16479:78;16552:4;16543:6;16479:78;:::i;:::-;16471:86;;16251:313;;;;:::o;16570:419::-;16736:4;16774:2;16763:9;16759:18;16751:26;;16823:9;16817:4;16813:20;16809:1;16798:9;16794:17;16787:47;16851:131;16977:4;16851:131;:::i;:::-;16843:139;;16570:419;;;:::o;16995:::-;17161:4;17199:2;17188:9;17184:18;17176:26;;17248:9;17242:4;17238:20;17234:1;17223:9;17219:17;17212:47;17276:131;17402:4;17276:131;:::i;:::-;17268:139;;16995:419;;;:::o;17420:::-;17586:4;17624:2;17613:9;17609:18;17601:26;;17673:9;17667:4;17663:20;17659:1;17648:9;17644:17;17637:47;17701:131;17827:4;17701:131;:::i;:::-;17693:139;;17420:419;;;:::o;17845:::-;18011:4;18049:2;18038:9;18034:18;18026:26;;18098:9;18092:4;18088:20;18084:1;18073:9;18069:17;18062:47;18126:131;18252:4;18126:131;:::i;:::-;18118:139;;17845:419;;;:::o;18270:::-;18436:4;18474:2;18463:9;18459:18;18451:26;;18523:9;18517:4;18513:20;18509:1;18498:9;18494:17;18487:47;18551:131;18677:4;18551:131;:::i;:::-;18543:139;;18270:419;;;:::o;18695:::-;18861:4;18899:2;18888:9;18884:18;18876:26;;18948:9;18942:4;18938:20;18934:1;18923:9;18919:17;18912:47;18976:131;19102:4;18976:131;:::i;:::-;18968:139;;18695:419;;;:::o;19120:::-;19286:4;19324:2;19313:9;19309:18;19301:26;;19373:9;19367:4;19363:20;19359:1;19348:9;19344:17;19337:47;19401:131;19527:4;19401:131;:::i;:::-;19393:139;;19120:419;;;:::o;19545:::-;19711:4;19749:2;19738:9;19734:18;19726:26;;19798:9;19792:4;19788:20;19784:1;19773:9;19769:17;19762:47;19826:131;19952:4;19826:131;:::i;:::-;19818:139;;19545:419;;;:::o;19970:222::-;20063:4;20101:2;20090:9;20086:18;20078:26;;20114:71;20182:1;20171:9;20167:17;20158:6;20114:71;:::i;:::-;19970:222;;;;:::o;20198:129::-;20232:6;20259:20;;:::i;:::-;20249:30;;20288:33;20316:4;20308:6;20288:33;:::i;:::-;20198:129;;;:::o;20333:75::-;20366:6;20399:2;20393:9;20383:19;;20333:75;:::o;20414:307::-;20475:4;20565:18;20557:6;20554:30;20551:56;;;20587:18;;:::i;:::-;20551:56;20625:29;20647:6;20625:29;:::i;:::-;20617:37;;20709:4;20703;20699:15;20691:23;;20414:307;;;:::o;20727:308::-;20789:4;20879:18;20871:6;20868:30;20865:56;;;20901:18;;:::i;:::-;20865:56;20939:29;20961:6;20939:29;:::i;:::-;20931:37;;21023:4;21017;21013:15;21005:23;;20727:308;;;:::o;21041:141::-;21090:4;21113:3;21105:11;;21136:3;21133:1;21126:14;21170:4;21167:1;21157:18;21149:26;;21041:141;;;:::o;21188:98::-;21239:6;21273:5;21267:12;21257:22;;21188:98;;;:::o;21292:99::-;21344:6;21378:5;21372:12;21362:22;;21292:99;;;:::o;21397:168::-;21480:11;21514:6;21509:3;21502:19;21554:4;21549:3;21545:14;21530:29;;21397:168;;;;:::o;21571:147::-;21672:11;21709:3;21694:18;;21571:147;;;;:::o;21724:169::-;21808:11;21842:6;21837:3;21830:19;21882:4;21877:3;21873:14;21858:29;;21724:169;;;;:::o;21899:148::-;22001:11;22038:3;22023:18;;21899:148;;;;:::o;22053:305::-;22093:3;22112:20;22130:1;22112:20;:::i;:::-;22107:25;;22146:20;22164:1;22146:20;:::i;:::-;22141:25;;22300:1;22232:66;22228:74;22225:1;22222:81;22219:107;;;22306:18;;:::i;:::-;22219:107;22350:1;22347;22343:9;22336:16;;22053:305;;;;:::o;22364:185::-;22404:1;22421:20;22439:1;22421:20;:::i;:::-;22416:25;;22455:20;22473:1;22455:20;:::i;:::-;22450:25;;22494:1;22484:35;;22499:18;;:::i;:::-;22484:35;22541:1;22538;22534:9;22529:14;;22364:185;;;;:::o;22555:191::-;22595:4;22615:20;22633:1;22615:20;:::i;:::-;22610:25;;22649:20;22667:1;22649:20;:::i;:::-;22644:25;;22688:1;22685;22682:8;22679:34;;;22693:18;;:::i;:::-;22679:34;22738:1;22735;22731:9;22723:17;;22555:191;;;;:::o;22752:96::-;22789:7;22818:24;22836:5;22818:24;:::i;:::-;22807:35;;22752:96;;;:::o;22854:90::-;22888:7;22931:5;22924:13;22917:21;22906:32;;22854:90;;;:::o;22950:149::-;22986:7;23026:66;23019:5;23015:78;23004:89;;22950:149;;;:::o;23105:131::-;23152:7;23181:5;23170:16;;23187:43;23224:5;23187:43;:::i;:::-;23105:131;;;:::o;23242:126::-;23279:7;23319:42;23312:5;23308:54;23297:65;;23242:126;;;:::o;23374:77::-;23411:7;23440:5;23429:16;;23374:77;;;:::o;23457:131::-;23515:9;23548:34;23576:5;23548:34;:::i;:::-;23535:47;;23457:131;;;:::o;23594:154::-;23678:6;23673:3;23668;23655:30;23740:1;23731:6;23726:3;23722:16;23715:27;23594:154;;;:::o;23754:307::-;23822:1;23832:113;23846:6;23843:1;23840:13;23832:113;;;23931:1;23926:3;23922:11;23916:18;23912:1;23907:3;23903:11;23896:39;23868:2;23865:1;23861:10;23856:15;;23832:113;;;23963:6;23960:1;23957:13;23954:101;;;24043:1;24034:6;24029:3;24025:16;24018:27;23954:101;23803:258;23754:307;;;:::o;24067:320::-;24111:6;24148:1;24142:4;24138:12;24128:22;;24195:1;24189:4;24185:12;24216:18;24206:81;;24272:4;24264:6;24260:17;24250:27;;24206:81;24334:2;24326:6;24323:14;24303:18;24300:38;24297:84;;;24353:18;;:::i;:::-;24297:84;24118:269;24067:320;;;:::o;24393:281::-;24476:27;24498:4;24476:27;:::i;:::-;24468:6;24464:40;24606:6;24594:10;24591:22;24570:18;24558:10;24555:34;24552:62;24549:88;;;24617:18;;:::i;:::-;24549:88;24657:10;24653:2;24646:22;24436:238;24393:281;;:::o;24680:233::-;24719:3;24742:24;24760:5;24742:24;:::i;:::-;24733:33;;24788:66;24781:5;24778:77;24775:103;;;24858:18;;:::i;:::-;24775:103;24905:1;24898:5;24894:13;24887:20;;24680:233;;;:::o;24919:176::-;24951:1;24968:20;24986:1;24968:20;:::i;:::-;24963:25;;25002:20;25020:1;25002:20;:::i;:::-;24997:25;;25041:1;25031:35;;25046:18;;:::i;:::-;25031:35;25087:1;25084;25080:9;25075:14;;24919:176;;;;:::o;25101:180::-;25149:77;25146:1;25139:88;25246:4;25243:1;25236:15;25270:4;25267:1;25260:15;25287:180;25335:77;25332:1;25325:88;25432:4;25429:1;25422:15;25456:4;25453:1;25446:15;25473:180;25521:77;25518:1;25511:88;25618:4;25615:1;25608:15;25642:4;25639:1;25632:15;25659:180;25707:77;25704:1;25697:88;25804:4;25801:1;25794:15;25828:4;25825:1;25818:15;25845:180;25893:77;25890:1;25883:88;25990:4;25987:1;25980:15;26014:4;26011:1;26004:15;26031:180;26079:77;26076:1;26069:88;26176:4;26173:1;26166:15;26200:4;26197:1;26190:15;26217:117;26326:1;26323;26316:12;26340:117;26449:1;26446;26439:12;26463:117;26572:1;26569;26562:12;26586:117;26695:1;26692;26685:12;26709:102;26750:6;26801:2;26797:7;26792:2;26785:5;26781:14;26777:28;26767:38;;26709:102;;;:::o;26817:163::-;26957:15;26953:1;26945:6;26941:14;26934:39;26817:163;:::o;26986:225::-;27126:34;27122:1;27114:6;27110:14;27103:58;27195:8;27190:2;27182:6;27178:15;27171:33;26986:225;:::o;27217:165::-;27357:17;27353:1;27345:6;27341:14;27334:41;27217:165;:::o;27388:158::-;27528:10;27524:1;27516:6;27512:14;27505:34;27388:158;:::o;27552:168::-;27692:20;27688:1;27680:6;27676:14;27669:44;27552:168;:::o;27726:173::-;27866:25;27862:1;27854:6;27850:14;27843:49;27726:173;:::o;27905:182::-;28045:34;28041:1;28033:6;28029:14;28022:58;27905:182;:::o;28093:114::-;;:::o;28213:168::-;28353:20;28349:1;28341:6;28337:14;28330:44;28213:168;:::o;28387:115::-;28470:1;28463:5;28460:12;28450:46;;28476:18;;:::i;:::-;28450:46;28387:115;:::o;28508:122::-;28581:24;28599:5;28581:24;:::i;:::-;28574:5;28571:35;28561:63;;28620:1;28617;28610:12;28561:63;28508:122;:::o;28636:116::-;28706:21;28721:5;28706:21;:::i;:::-;28699:5;28696:32;28686:60;;28742:1;28739;28732:12;28686:60;28636:116;:::o;28758:120::-;28830:23;28847:5;28830:23;:::i;:::-;28823:5;28820:34;28810:62;;28868:1;28865;28858:12;28810:62;28758:120;:::o;28884:109::-;28967:1;28960:5;28957:12;28947:40;;28983:1;28980;28973:12;28947:40;28884:109;:::o;28999:122::-;29072:24;29090:5;29072:24;:::i;:::-;29065:5;29062:35;29052:63;;29111:1;29108;29101:12;29052:63;28999:122;:::o

Swarm Source

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