ETH Price: $2,865.88 (-9.47%)
Gas: 10 Gwei

Token

V1 Phunks (V1PHNK)
 

Overview

Max Total Supply

9,500 V1PHNK

Holders

1,776

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
i-fomo.eth
Balance
6 V1PHNK
0x666ead4e3b944925419fe432cbd370aaeee87816
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:
V1Phunks

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-02-24
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: hardhat/console.sol


pragma solidity >= 0.4.22 <0.9.0;

library console {
	address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);

	function _sendLogPayload(bytes memory payload) private view {
		uint256 payloadLength = payload.length;
		address consoleAddress = CONSOLE_ADDRESS;
		assembly {
			let payloadStart := add(payload, 32)
			let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
		}
	}

	function log() internal view {
		_sendLogPayload(abi.encodeWithSignature("log()"));
	}

	function logInt(int p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(int)", p0));
	}

	function logUint(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
	}

	function logString(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function logBool(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function logAddress(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function logBytes(bytes memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
	}

	function logBytes1(bytes1 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
	}

	function logBytes2(bytes2 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
	}

	function logBytes3(bytes3 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
	}

	function logBytes4(bytes4 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
	}

	function logBytes5(bytes5 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
	}

	function logBytes6(bytes6 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
	}

	function logBytes7(bytes7 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
	}

	function logBytes8(bytes8 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
	}

	function logBytes9(bytes9 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
	}

	function logBytes10(bytes10 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
	}

	function logBytes11(bytes11 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
	}

	function logBytes12(bytes12 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
	}

	function logBytes13(bytes13 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
	}

	function logBytes14(bytes14 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
	}

	function logBytes15(bytes15 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
	}

	function logBytes16(bytes16 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
	}

	function logBytes17(bytes17 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
	}

	function logBytes18(bytes18 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
	}

	function logBytes19(bytes19 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
	}

	function logBytes20(bytes20 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
	}

	function logBytes21(bytes21 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
	}

	function logBytes22(bytes22 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
	}

	function logBytes23(bytes23 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
	}

	function logBytes24(bytes24 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
	}

	function logBytes25(bytes25 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
	}

	function logBytes26(bytes26 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
	}

	function logBytes27(bytes27 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
	}

	function logBytes28(bytes28 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
	}

	function logBytes29(bytes29 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
	}

	function logBytes30(bytes30 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
	}

	function logBytes31(bytes31 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
	}

	function logBytes32(bytes32 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
	}

	function log(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
	}

	function log(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function log(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function log(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function log(uint p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1));
	}

	function log(uint p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1));
	}

	function log(uint p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1));
	}

	function log(uint p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1));
	}

	function log(string memory p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1));
	}

	function log(string memory p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
	}

	function log(string memory p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
	}

	function log(string memory p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
	}

	function log(bool p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1));
	}

	function log(bool p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
	}

	function log(bool p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
	}

	function log(bool p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
	}

	function log(address p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1));
	}

	function log(address p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
	}

	function log(address p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
	}

	function log(address p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
	}

	function log(uint p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2));
	}

	function log(uint p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2));
	}

	function log(uint p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2));
	}

	function log(uint p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2));
	}

	function log(uint p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2));
	}

	function log(uint p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2));
	}

	function log(uint p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2));
	}

	function log(uint p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2));
	}

	function log(uint p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2));
	}

	function log(uint p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2));
	}

	function log(uint p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2));
	}

	function log(uint p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
	}

	function log(string memory p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2));
	}

	function log(string memory p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
	}

	function log(string memory p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
	}

	function log(string memory p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
	}

	function log(bool p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2));
	}

	function log(bool p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2));
	}

	function log(bool p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2));
	}

	function log(bool p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
	}

	function log(bool p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2));
	}

	function log(bool p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
	}

	function log(bool p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
	}

	function log(bool p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
	}

	function log(bool p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2));
	}

	function log(bool p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
	}

	function log(bool p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
	}

	function log(bool p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
	}

	function log(address p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2));
	}

	function log(address p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2));
	}

	function log(address p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2));
	}

	function log(address p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2));
	}

	function log(address p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2));
	}

	function log(address p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
	}

	function log(address p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
	}

	function log(address p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
	}

	function log(address p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2));
	}

	function log(address p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
	}

	function log(address p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
	}

	function log(address p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
	}

	function log(address p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2));
	}

	function log(address p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
	}

	function log(address p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
	}

	function log(address p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
	}

	function log(uint p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
	}

}

// File: v1phunks.sol



/** 

does NOT admit json extension in ipfs
*/

pragma solidity ^0.8.0;






contract V1Phunks is ERC721, Ownable {
    using Counters for Counters.Counter;
    using SafeMath for uint256;

    Counters.Counter private _tokenIds;
    uint256 public constant MAX_SUPPLY = 10000; //10.000 V1 Phunks
    uint256 public constant MAX_PER_MINT = 10;
    uint256 private constant MAX_RESERVED_MINTS = 500;

    uint256 public FREE_STAGE_MINTING= 250;

    uint256 private FREE_STAGE_PRICE= 0 ether;

    uint256 public PUBLIC_PRICE= 0.015 ether;

    uint256 private RESERVED_MINTS = 0;
    

    bool public paused = false;
    
    string public baseTokenURI = "ipfs://QmYxKmX5SXfGxwgrrfNvxxEXdbxaTQn9yy3JQx15p5cwgo/";

    constructor() ERC721("V1 Phunks", "V1PHNK") {
        setBaseURI(baseTokenURI);
        _mintSingleNFT();
    }

    function _baseURI() internal view virtual override returns (string memory) {
       return baseTokenURI;
    }
    
    function setBaseURI(string memory _baseTokenURI) public onlyOwner {
        baseTokenURI = _baseTokenURI;
    }

    function mintNFTs(uint _number) public payable {
        uint256 totalMinted = _tokenIds.current();
        require(!paused, "Sale Paused") ;
        require(totalMinted.add(_number) <= MAX_SUPPLY - MAX_RESERVED_MINTS, "Not enough V1 Phunks remaining!");
        require(_number > 0 && _number <= MAX_PER_MINT, "Cannot mint specified number of V1 Phunks.");
        require(msg.value >= Price() * _number, "Not enough ether to purchase V1 Phunks.");
        
        for (uint i = 0; i < _number; i++) {
            _mintSingleNFT();
        }
    }

    function _mintSingleNFT() private {
      uint newTokenID = _tokenIds.current();
      _safeMint(msg.sender, newTokenID);
      _tokenIds.increment();
    }
    
    //in case ETH price gets too high; expressed in ETH x 10^18
    function setPrice(uint256 _price) external onlyOwner {
        PUBLIC_PRICE = _price;
    }

   function Price() private view returns(uint256) {
        uint256 totalMinted = _tokenIds.current();
        if ( totalMinted < FREE_STAGE_MINTING) {
            return FREE_STAGE_PRICE;
        } else {
            return PUBLIC_PRICE;
        }
    }
    
    function setFreeMints(uint256 freeStageNum) external onlyOwner {
        FREE_STAGE_MINTING = freeStageNum;
    }

     function reserveNFTs(uint256 _number) public onlyOwner {
        uint256 totalMinted = _tokenIds.current();
        require((totalMinted.add(_number)) <= MAX_SUPPLY, "Exceeds V1 Phunks supply");
        require(RESERVED_MINTS + _number <= MAX_RESERVED_MINTS, "Exceeds reserved V1 Phunks supply");
        
        for (uint256 i = 0; i < _number; i++) {
            _mintSingleNFT();
        }
        RESERVED_MINTS = RESERVED_MINTS + _number;

    }

//Withdraw money in contract to Owner
    function withdraw() public payable onlyOwner {
     uint256 balance = address(this).balance;
     require(balance > 0, "No ether left to withdraw");

     (bool success, ) = (msg.sender).call{value: balance}("");

     require(success, "Transfer failed.");
    }

    function giveAway(address _to, uint256 _amount) external onlyOwner() {
        require( _amount + RESERVED_MINTS <= MAX_RESERVED_MINTS, "Exceeds reserved V1 Phunk supply" );
        uint newTokenID = _tokenIds.current();
        for(uint256 i; i < _amount; i++){
            _safeMint(_to, newTokenID);
            _tokenIds.increment();
        }

        RESERVED_MINTS += _amount;
    }

    function pause(bool _state) public onlyOwner {
        paused = _state;
    }

  function totalSupply() external view returns(uint256) {
        return _tokenIds.current() ;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"FREE_STAGE_MINTING","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_PRICE","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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"giveAway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_number","type":"uint256"}],"name":"mintNFTs","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_number","type":"uint256"}],"name":"reserveNFTs","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":"_baseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"freeStageNum","type":"uint256"}],"name":"setFreeMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

608060405260fa600855600060095566354a6ba7a18000600a556000600b556000600c60006101000a81548160ff02191690831515021790555060405180606001604052806036815260200162004db360369139600d90805190602001906200006a929190620008e1565b503480156200007857600080fd5b506040518060400160405280600981526020017f5631205068756e6b7300000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f563150484e4b00000000000000000000000000000000000000000000000000008152508160009080519060200190620000fd929190620008e1565b50806001908051906020019062000116929190620008e1565b505050620001396200012d620001f260201b60201c565b620001fa60201b60201c565b620001dc600d80546200014c9062000cdf565b80601f01602080910402602001604051908101604052809291908181526020018280546200017a9062000cdf565b8015620001cb5780601f106200019f57610100808354040283529160200191620001cb565b820191906000526020600020905b815481529060010190602001808311620001ad57829003601f168201915b5050505050620002c060201b60201c565b620001ec6200036b60201b60201c565b62000e6d565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002d0620001f260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002f6620003b260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200034f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003469062000b93565b60405180910390fd5b80600d908051906020019062000367929190620008e1565b5050565b6000620003846007620003dc60201b620018b51760201c565b9050620003983382620003ea60201b60201c565b620003af60076200041060201b620018c31760201c565b50565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081600001549050919050565b6200040c8282604051806020016040528060008152506200042660201b60201c565b5050565b6001816000016000828254019250508190555050565b6200043883836200049460201b60201c565b6200044d60008484846200068e60201b60201c565b6200048f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004869062000b2d565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000507576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004fe9062000b71565b60405180910390fd5b62000518816200084860201b60201c565b156200055b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005529062000b4f565b60405180910390fd5b6200056f60008383620008b460201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620005c1919062000be2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46200068a60008383620008b960201b60201c565b5050565b6000620006bc8473ffffffffffffffffffffffffffffffffffffffff16620008be60201b620018d91760201c565b156200083b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620006ee620001f260201b60201c565b8786866040518563ffffffff1660e01b815260040162000712949392919062000ad9565b602060405180830381600087803b1580156200072d57600080fd5b505af19250505080156200076157506040513d601f19601f820116820180604052508101906200075e9190620009a8565b60015b620007ea573d806000811462000794576040519150601f19603f3d011682016040523d82523d6000602084013e62000799565b606091505b50600081511415620007e2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007d99062000b2d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062000840565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054620008ef9062000cdf565b90600052602060002090601f0160209004810192826200091357600085556200095f565b82601f106200092e57805160ff19168380011785556200095f565b828001600101855582156200095f579182015b828111156200095e57825182559160200191906001019062000941565b5b5090506200096e919062000972565b5090565b5b808211156200098d57600081600090555060010162000973565b5090565b600081519050620009a28162000e53565b92915050565b600060208284031215620009c157620009c062000d73565b5b6000620009d18482850162000991565b91505092915050565b620009e58162000c3f565b82525050565b6000620009f88262000bb5565b62000a04818562000bc0565b935062000a1681856020860162000ca9565b62000a218162000d78565b840191505092915050565b600062000a3b60328362000bd1565b915062000a488262000d89565b604082019050919050565b600062000a62601c8362000bd1565b915062000a6f8262000dd8565b602082019050919050565b600062000a8960208362000bd1565b915062000a968262000e01565b602082019050919050565b600062000ab060208362000bd1565b915062000abd8262000e2a565b602082019050919050565b62000ad38162000c9f565b82525050565b600060808201905062000af06000830187620009da565b62000aff6020830186620009da565b62000b0e604083018562000ac8565b818103606083015262000b228184620009eb565b905095945050505050565b6000602082019050818103600083015262000b488162000a2c565b9050919050565b6000602082019050818103600083015262000b6a8162000a53565b9050919050565b6000602082019050818103600083015262000b8c8162000a7a565b9050919050565b6000602082019050818103600083015262000bae8162000aa1565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600062000bef8262000c9f565b915062000bfc8362000c9f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000c345762000c3362000d15565b5b828201905092915050565b600062000c4c8262000c7f565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000cc957808201518184015260208101905062000cac565b8381111562000cd9576000848401525b50505050565b6000600282049050600182168062000cf857607f821691505b6020821081141562000d0f5762000d0e62000d44565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b62000e5e8162000c53565b811462000e6a57600080fd5b50565b613f368062000e7d6000396000f3fe6080604052600436106101d85760003560e01c8063611f3f1011610102578063b88d4fde11610095578063d547cfb711610064578063d547cfb714610668578063e7db8fb014610693578063e985e9c5146106bc578063f2fde38b146106f9576101d8565b8063b88d4fde146105b0578063bc7df091146105d9578063c87b56dd14610602578063ca8001441461063f576101d8565b80638da5cb5b116100d15780638da5cb5b1461050857806391b7f5ed1461053357806395d89b411461055c578063a22cb46514610587576101d8565b8063611f3f101461044c5780636352211e1461047757806370a08231146104b4578063715018a6146104f1576101d8565b806318160ddd1161017a5780633ccfd60b116101495780633ccfd60b146103c557806342842e0e146103cf57806355f804b3146103f85780635c975abb14610421576101d8565b806318160ddd1461032a57806323b872dd1461035557806332cb6b0c1461037e5780633b4b1381146103a9576101d8565b8063081812fc116101b6578063081812fc1461026e578063095ea7b3146102ab57806309d42b30146102d45780630daed107146102ff576101d8565b806301ffc9a7146101dd57806302329a291461021a57806306fdde0314610243575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612a93565b610722565b6040516102119190613061565b60405180910390f35b34801561022657600080fd5b50610241600480360381019061023c9190612a66565b610804565b005b34801561024f57600080fd5b5061025861089d565b604051610265919061307c565b60405180910390f35b34801561027a57600080fd5b5061029560048036038101906102909190612b36565b61092f565b6040516102a29190612ffa565b60405180910390f35b3480156102b757600080fd5b506102d260048036038101906102cd9190612a26565b6109b4565b005b3480156102e057600080fd5b506102e9610acc565b6040516102f691906133be565b60405180910390f35b34801561030b57600080fd5b50610314610ad1565b60405161032191906133be565b60405180910390f35b34801561033657600080fd5b5061033f610ad7565b60405161034c91906133be565b60405180910390f35b34801561036157600080fd5b5061037c60048036038101906103779190612910565b610ae8565b005b34801561038a57600080fd5b50610393610b48565b6040516103a091906133be565b60405180910390f35b6103c360048036038101906103be9190612b36565b610b4e565b005b6103cd610ce0565b005b3480156103db57600080fd5b506103f660048036038101906103f19190612910565b610e54565b005b34801561040457600080fd5b5061041f600480360381019061041a9190612aed565b610e74565b005b34801561042d57600080fd5b50610436610f0a565b6040516104439190613061565b60405180910390f35b34801561045857600080fd5b50610461610f1d565b60405161046e91906133be565b60405180910390f35b34801561048357600080fd5b5061049e60048036038101906104999190612b36565b610f23565b6040516104ab9190612ffa565b60405180910390f35b3480156104c057600080fd5b506104db60048036038101906104d691906128a3565b610fd5565b6040516104e891906133be565b60405180910390f35b3480156104fd57600080fd5b5061050661108d565b005b34801561051457600080fd5b5061051d611115565b60405161052a9190612ffa565b60405180910390f35b34801561053f57600080fd5b5061055a60048036038101906105559190612b36565b61113f565b005b34801561056857600080fd5b506105716111c5565b60405161057e919061307c565b60405180910390f35b34801561059357600080fd5b506105ae60048036038101906105a991906129e6565b611257565b005b3480156105bc57600080fd5b506105d760048036038101906105d29190612963565b61126d565b005b3480156105e557600080fd5b5061060060048036038101906105fb9190612b36565b6112cf565b005b34801561060e57600080fd5b5061062960048036038101906106249190612b36565b611441565b604051610636919061307c565b60405180910390f35b34801561064b57600080fd5b5061066660048036038101906106619190612a26565b6114e8565b005b34801561067457600080fd5b5061067d611615565b60405161068a919061307c565b60405180910390f35b34801561069f57600080fd5b506106ba60048036038101906106b59190612b36565b6116a3565b005b3480156106c857600080fd5b506106e360048036038101906106de91906128d0565b611729565b6040516106f09190613061565b60405180910390f35b34801561070557600080fd5b50610720600480360381019061071b91906128a3565b6117bd565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107ed57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107fd57506107fc826118fc565b5b9050919050565b61080c611966565b73ffffffffffffffffffffffffffffffffffffffff1661082a611115565b73ffffffffffffffffffffffffffffffffffffffff1614610880576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108779061329e565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b6060600080546108ac90613679565b80601f01602080910402602001604051908101604052809291908181526020018280546108d890613679565b80156109255780601f106108fa57610100808354040283529160200191610925565b820191906000526020600020905b81548152906001019060200180831161090857829003601f168201915b5050505050905090565b600061093a8261196e565b610979576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109709061327e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109bf82610f23565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a27906132fe565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a4f611966565b73ffffffffffffffffffffffffffffffffffffffff161480610a7e5750610a7d81610a78611966565b611729565b5b610abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab49061319e565b60405180910390fd5b610ac783836119da565b505050565b600a81565b60085481565b6000610ae360076118b5565b905090565b610af9610af3611966565b82611a93565b610b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2f9061337e565b60405180910390fd5b610b43838383611b71565b505050565b61271081565b6000610b5a60076118b5565b9050600c60009054906101000a900460ff1615610bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba39061325e565b60405180910390fd5b6101f4612710610bbc919061358f565b610bcf8383611dd890919063ffffffff16565b1115610c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c079061339e565b60405180910390fd5b600082118015610c215750600a8211155b610c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c57906131be565b60405180910390fd5b81610c69611dee565b610c739190613535565b341015610cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cac9061331e565b60405180910390fd5b60005b82811015610cdb57610cc8611e1c565b8080610cd3906136dc565b915050610cb8565b505050565b610ce8611966565b73ffffffffffffffffffffffffffffffffffffffff16610d06611115565b73ffffffffffffffffffffffffffffffffffffffff1614610d5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d539061329e565b60405180910390fd5b600047905060008111610da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b9061323e565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1682604051610dca90612fe5565b60006040518083038185875af1925050503d8060008114610e07576040519150601f19603f3d011682016040523d82523d6000602084013e610e0c565b606091505b5050905080610e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e479061335e565b60405180910390fd5b5050565b610e6f8383836040518060200160405280600081525061126d565b505050565b610e7c611966565b73ffffffffffffffffffffffffffffffffffffffff16610e9a611115565b73ffffffffffffffffffffffffffffffffffffffff1614610ef0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee79061329e565b60405180910390fd5b80600d9080519060200190610f069291906126b7565b5050565b600c60009054906101000a900460ff1681565b600a5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc3906131fe565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611046576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103d906131de565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611095611966565b73ffffffffffffffffffffffffffffffffffffffff166110b3611115565b73ffffffffffffffffffffffffffffffffffffffff1614611109576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111009061329e565b60405180910390fd5b6111136000611e41565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611147611966565b73ffffffffffffffffffffffffffffffffffffffff16611165611115565b73ffffffffffffffffffffffffffffffffffffffff16146111bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b29061329e565b60405180910390fd5b80600a8190555050565b6060600180546111d490613679565b80601f016020809104026020016040519081016040528092919081815260200182805461120090613679565b801561124d5780601f106112225761010080835404028352916020019161124d565b820191906000526020600020905b81548152906001019060200180831161123057829003601f168201915b5050505050905090565b611269611262611966565b8383611f07565b5050565b61127e611278611966565b83611a93565b6112bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b49061337e565b60405180910390fd5b6112c984848484612074565b50505050565b6112d7611966565b73ffffffffffffffffffffffffffffffffffffffff166112f5611115565b73ffffffffffffffffffffffffffffffffffffffff161461134b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113429061329e565b60405180910390fd5b600061135760076118b5565b905061271061136f8383611dd890919063ffffffff16565b11156113b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a79061333e565b60405180910390fd5b6101f482600b546113c191906134ae565b1115611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f99061311e565b60405180910390fd5b60005b8281101561142857611415611e1c565b8080611420906136dc565b915050611405565b5081600b5461143791906134ae565b600b819055505050565b606061144c8261196e565b61148b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611482906132be565b60405180910390fd5b60006114956120d0565b905060008151116114b557604051806020016040528060008152506114e0565b806114bf84612162565b6040516020016114d0929190612fc1565b6040516020818303038152906040525b915050919050565b6114f0611966565b73ffffffffffffffffffffffffffffffffffffffff1661150e611115565b73ffffffffffffffffffffffffffffffffffffffff1614611564576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155b9061329e565b60405180910390fd5b6101f4600b548261157591906134ae565b11156115b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ad906132de565b60405180910390fd5b60006115c260076118b5565b905060005b828110156115f6576115d984836122c3565b6115e360076118c3565b80806115ee906136dc565b9150506115c7565b5081600b600082825461160991906134ae565b92505081905550505050565b600d805461162290613679565b80601f016020809104026020016040519081016040528092919081815260200182805461164e90613679565b801561169b5780601f106116705761010080835404028352916020019161169b565b820191906000526020600020905b81548152906001019060200180831161167e57829003601f168201915b505050505081565b6116ab611966565b73ffffffffffffffffffffffffffffffffffffffff166116c9611115565b73ffffffffffffffffffffffffffffffffffffffff161461171f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117169061329e565b60405180910390fd5b8060088190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6117c5611966565b73ffffffffffffffffffffffffffffffffffffffff166117e3611115565b73ffffffffffffffffffffffffffffffffffffffff1614611839576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118309061329e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a0906130be565b60405180910390fd5b6118b281611e41565b50565b600081600001549050919050565b6001816000016000828254019250508190555050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a4d83610f23565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a9e8261196e565b611add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad49061317e565b60405180910390fd5b6000611ae883610f23565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b5757508373ffffffffffffffffffffffffffffffffffffffff16611b3f8461092f565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b685750611b678185611729565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b9182610f23565b73ffffffffffffffffffffffffffffffffffffffff1614611be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bde906130de565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4e9061313e565b60405180910390fd5b611c628383836122e1565b611c6d6000826119da565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cbd919061358f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d1491906134ae565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611dd38383836122e6565b505050565b60008183611de691906134ae565b905092915050565b600080611dfb60076118b5565b9050600854811015611e1257600954915050611e19565b600a549150505b90565b6000611e2860076118b5565b9050611e3433826122c3565b611e3e60076118c3565b50565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6d9061315e565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120679190613061565b60405180910390a3505050565b61207f848484611b71565b61208b848484846122eb565b6120ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c19061309e565b60405180910390fd5b50505050565b6060600d80546120df90613679565b80601f016020809104026020016040519081016040528092919081815260200182805461210b90613679565b80156121585780601f1061212d57610100808354040283529160200191612158565b820191906000526020600020905b81548152906001019060200180831161213b57829003601f168201915b5050505050905090565b606060008214156121aa576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506122be565b600082905060005b600082146121dc5780806121c5906136dc565b915050600a826121d59190613504565b91506121b2565b60008167ffffffffffffffff8111156121f8576121f7613812565b5b6040519080825280601f01601f19166020018201604052801561222a5781602001600182028036833780820191505090505b5090505b600085146122b757600182612243919061358f565b9150600a856122529190613725565b603061225e91906134ae565b60f81b818381518110612274576122736137e3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856122b09190613504565b945061222e565b8093505050505b919050565b6122dd828260405180602001604052806000815250612482565b5050565b505050565b505050565b600061230c8473ffffffffffffffffffffffffffffffffffffffff166118d9565b15612475578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612335611966565b8786866040518563ffffffff1660e01b81526004016123579493929190613015565b602060405180830381600087803b15801561237157600080fd5b505af19250505080156123a257506040513d601f19601f8201168201806040525081019061239f9190612ac0565b60015b612425573d80600081146123d2576040519150601f19603f3d011682016040523d82523d6000602084013e6123d7565b606091505b5060008151141561241d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124149061309e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061247a565b600190505b949350505050565b61248c83836124dd565b61249960008484846122eb565b6124d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124cf9061309e565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561254d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125449061321e565b60405180910390fd5b6125568161196e565b15612596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258d906130fe565b60405180910390fd5b6125a2600083836122e1565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125f291906134ae565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126b3600083836122e6565b5050565b8280546126c390613679565b90600052602060002090601f0160209004810192826126e5576000855561272c565b82601f106126fe57805160ff191683800117855561272c565b8280016001018555821561272c579182015b8281111561272b578251825591602001919060010190612710565b5b509050612739919061273d565b5090565b5b8082111561275657600081600090555060010161273e565b5090565b600061276d612768846133fe565b6133d9565b90508281526020810184848401111561278957612788613846565b5b612794848285613637565b509392505050565b60006127af6127aa8461342f565b6133d9565b9050828152602081018484840111156127cb576127ca613846565b5b6127d6848285613637565b509392505050565b6000813590506127ed81613ea4565b92915050565b60008135905061280281613ebb565b92915050565b60008135905061281781613ed2565b92915050565b60008151905061282c81613ed2565b92915050565b600082601f83011261284757612846613841565b5b813561285784826020860161275a565b91505092915050565b600082601f83011261287557612874613841565b5b813561288584826020860161279c565b91505092915050565b60008135905061289d81613ee9565b92915050565b6000602082840312156128b9576128b8613850565b5b60006128c7848285016127de565b91505092915050565b600080604083850312156128e7576128e6613850565b5b60006128f5858286016127de565b9250506020612906858286016127de565b9150509250929050565b60008060006060848603121561292957612928613850565b5b6000612937868287016127de565b9350506020612948868287016127de565b92505060406129598682870161288e565b9150509250925092565b6000806000806080858703121561297d5761297c613850565b5b600061298b878288016127de565b945050602061299c878288016127de565b93505060406129ad8782880161288e565b925050606085013567ffffffffffffffff8111156129ce576129cd61384b565b5b6129da87828801612832565b91505092959194509250565b600080604083850312156129fd576129fc613850565b5b6000612a0b858286016127de565b9250506020612a1c858286016127f3565b9150509250929050565b60008060408385031215612a3d57612a3c613850565b5b6000612a4b858286016127de565b9250506020612a5c8582860161288e565b9150509250929050565b600060208284031215612a7c57612a7b613850565b5b6000612a8a848285016127f3565b91505092915050565b600060208284031215612aa957612aa8613850565b5b6000612ab784828501612808565b91505092915050565b600060208284031215612ad657612ad5613850565b5b6000612ae48482850161281d565b91505092915050565b600060208284031215612b0357612b02613850565b5b600082013567ffffffffffffffff811115612b2157612b2061384b565b5b612b2d84828501612860565b91505092915050565b600060208284031215612b4c57612b4b613850565b5b6000612b5a8482850161288e565b91505092915050565b612b6c816135c3565b82525050565b612b7b816135d5565b82525050565b6000612b8c82613460565b612b968185613476565b9350612ba6818560208601613646565b612baf81613855565b840191505092915050565b6000612bc58261346b565b612bcf8185613492565b9350612bdf818560208601613646565b612be881613855565b840191505092915050565b6000612bfe8261346b565b612c0881856134a3565b9350612c18818560208601613646565b80840191505092915050565b6000612c31603283613492565b9150612c3c82613866565b604082019050919050565b6000612c54602683613492565b9150612c5f826138b5565b604082019050919050565b6000612c77602583613492565b9150612c8282613904565b604082019050919050565b6000612c9a601c83613492565b9150612ca582613953565b602082019050919050565b6000612cbd602183613492565b9150612cc88261397c565b604082019050919050565b6000612ce0602483613492565b9150612ceb826139cb565b604082019050919050565b6000612d03601983613492565b9150612d0e82613a1a565b602082019050919050565b6000612d26602c83613492565b9150612d3182613a43565b604082019050919050565b6000612d49603883613492565b9150612d5482613a92565b604082019050919050565b6000612d6c602a83613492565b9150612d7782613ae1565b604082019050919050565b6000612d8f602a83613492565b9150612d9a82613b30565b604082019050919050565b6000612db2602983613492565b9150612dbd82613b7f565b604082019050919050565b6000612dd5602083613492565b9150612de082613bce565b602082019050919050565b6000612df8601983613492565b9150612e0382613bf7565b602082019050919050565b6000612e1b600b83613492565b9150612e2682613c20565b602082019050919050565b6000612e3e602c83613492565b9150612e4982613c49565b604082019050919050565b6000612e61602083613492565b9150612e6c82613c98565b602082019050919050565b6000612e84602f83613492565b9150612e8f82613cc1565b604082019050919050565b6000612ea7602083613492565b9150612eb282613d10565b602082019050919050565b6000612eca602183613492565b9150612ed582613d39565b604082019050919050565b6000612eed602783613492565b9150612ef882613d88565b604082019050919050565b6000612f10601883613492565b9150612f1b82613dd7565b602082019050919050565b6000612f33600083613487565b9150612f3e82613e00565b600082019050919050565b6000612f56601083613492565b9150612f6182613e03565b602082019050919050565b6000612f79603183613492565b9150612f8482613e2c565b604082019050919050565b6000612f9c601f83613492565b9150612fa782613e7b565b602082019050919050565b612fbb8161362d565b82525050565b6000612fcd8285612bf3565b9150612fd98284612bf3565b91508190509392505050565b6000612ff082612f26565b9150819050919050565b600060208201905061300f6000830184612b63565b92915050565b600060808201905061302a6000830187612b63565b6130376020830186612b63565b6130446040830185612fb2565b81810360608301526130568184612b81565b905095945050505050565b60006020820190506130766000830184612b72565b92915050565b600060208201905081810360008301526130968184612bba565b905092915050565b600060208201905081810360008301526130b781612c24565b9050919050565b600060208201905081810360008301526130d781612c47565b9050919050565b600060208201905081810360008301526130f781612c6a565b9050919050565b6000602082019050818103600083015261311781612c8d565b9050919050565b6000602082019050818103600083015261313781612cb0565b9050919050565b6000602082019050818103600083015261315781612cd3565b9050919050565b6000602082019050818103600083015261317781612cf6565b9050919050565b6000602082019050818103600083015261319781612d19565b9050919050565b600060208201905081810360008301526131b781612d3c565b9050919050565b600060208201905081810360008301526131d781612d5f565b9050919050565b600060208201905081810360008301526131f781612d82565b9050919050565b6000602082019050818103600083015261321781612da5565b9050919050565b6000602082019050818103600083015261323781612dc8565b9050919050565b6000602082019050818103600083015261325781612deb565b9050919050565b6000602082019050818103600083015261327781612e0e565b9050919050565b6000602082019050818103600083015261329781612e31565b9050919050565b600060208201905081810360008301526132b781612e54565b9050919050565b600060208201905081810360008301526132d781612e77565b9050919050565b600060208201905081810360008301526132f781612e9a565b9050919050565b6000602082019050818103600083015261331781612ebd565b9050919050565b6000602082019050818103600083015261333781612ee0565b9050919050565b6000602082019050818103600083015261335781612f03565b9050919050565b6000602082019050818103600083015261337781612f49565b9050919050565b6000602082019050818103600083015261339781612f6c565b9050919050565b600060208201905081810360008301526133b781612f8f565b9050919050565b60006020820190506133d36000830184612fb2565b92915050565b60006133e36133f4565b90506133ef82826136ab565b919050565b6000604051905090565b600067ffffffffffffffff82111561341957613418613812565b5b61342282613855565b9050602081019050919050565b600067ffffffffffffffff82111561344a57613449613812565b5b61345382613855565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006134b98261362d565b91506134c48361362d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156134f9576134f8613756565b5b828201905092915050565b600061350f8261362d565b915061351a8361362d565b92508261352a57613529613785565b5b828204905092915050565b60006135408261362d565b915061354b8361362d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561358457613583613756565b5b828202905092915050565b600061359a8261362d565b91506135a58361362d565b9250828210156135b8576135b7613756565b5b828203905092915050565b60006135ce8261360d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613664578082015181840152602081019050613649565b83811115613673576000848401525b50505050565b6000600282049050600182168061369157607f821691505b602082108114156136a5576136a46137b4565b5b50919050565b6136b482613855565b810181811067ffffffffffffffff821117156136d3576136d2613812565b5b80604052505050565b60006136e78261362d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561371a57613719613756565b5b600182019050919050565b60006137308261362d565b915061373b8361362d565b92508261374b5761374a613785565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f45786365656473207265736572766564205631205068756e6b7320737570706c60008201527f7900000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f43616e6e6f74206d696e7420737065636966696564206e756d626572206f662060008201527f5631205068756e6b732e00000000000000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4e6f206574686572206c65667420746f20776974686472617700000000000000600082015250565b7f53616c6520506175736564000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f45786365656473207265736572766564205631205068756e6b20737570706c79600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820657468657220746f2070757263686173652056312060008201527f5068756e6b732e00000000000000000000000000000000000000000000000000602082015250565b7f45786365656473205631205068756e6b7320737570706c790000000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768205631205068756e6b732072656d61696e696e672100600082015250565b613ead816135c3565b8114613eb857600080fd5b50565b613ec4816135d5565b8114613ecf57600080fd5b50565b613edb816135e1565b8114613ee657600080fd5b50565b613ef28161362d565b8114613efd57600080fd5b5056fea26469706673582212205fe5b64f61079b7ae0ceda1bff1ab2a85268c421b06e0b4fd49121170883225764736f6c63430008070033697066733a2f2f516d59784b6d5835535866477877677272664e76787845586462786154516e397979334a5178313570356377676f2f

Deployed Bytecode

0x6080604052600436106101d85760003560e01c8063611f3f1011610102578063b88d4fde11610095578063d547cfb711610064578063d547cfb714610668578063e7db8fb014610693578063e985e9c5146106bc578063f2fde38b146106f9576101d8565b8063b88d4fde146105b0578063bc7df091146105d9578063c87b56dd14610602578063ca8001441461063f576101d8565b80638da5cb5b116100d15780638da5cb5b1461050857806391b7f5ed1461053357806395d89b411461055c578063a22cb46514610587576101d8565b8063611f3f101461044c5780636352211e1461047757806370a08231146104b4578063715018a6146104f1576101d8565b806318160ddd1161017a5780633ccfd60b116101495780633ccfd60b146103c557806342842e0e146103cf57806355f804b3146103f85780635c975abb14610421576101d8565b806318160ddd1461032a57806323b872dd1461035557806332cb6b0c1461037e5780633b4b1381146103a9576101d8565b8063081812fc116101b6578063081812fc1461026e578063095ea7b3146102ab57806309d42b30146102d45780630daed107146102ff576101d8565b806301ffc9a7146101dd57806302329a291461021a57806306fdde0314610243575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612a93565b610722565b6040516102119190613061565b60405180910390f35b34801561022657600080fd5b50610241600480360381019061023c9190612a66565b610804565b005b34801561024f57600080fd5b5061025861089d565b604051610265919061307c565b60405180910390f35b34801561027a57600080fd5b5061029560048036038101906102909190612b36565b61092f565b6040516102a29190612ffa565b60405180910390f35b3480156102b757600080fd5b506102d260048036038101906102cd9190612a26565b6109b4565b005b3480156102e057600080fd5b506102e9610acc565b6040516102f691906133be565b60405180910390f35b34801561030b57600080fd5b50610314610ad1565b60405161032191906133be565b60405180910390f35b34801561033657600080fd5b5061033f610ad7565b60405161034c91906133be565b60405180910390f35b34801561036157600080fd5b5061037c60048036038101906103779190612910565b610ae8565b005b34801561038a57600080fd5b50610393610b48565b6040516103a091906133be565b60405180910390f35b6103c360048036038101906103be9190612b36565b610b4e565b005b6103cd610ce0565b005b3480156103db57600080fd5b506103f660048036038101906103f19190612910565b610e54565b005b34801561040457600080fd5b5061041f600480360381019061041a9190612aed565b610e74565b005b34801561042d57600080fd5b50610436610f0a565b6040516104439190613061565b60405180910390f35b34801561045857600080fd5b50610461610f1d565b60405161046e91906133be565b60405180910390f35b34801561048357600080fd5b5061049e60048036038101906104999190612b36565b610f23565b6040516104ab9190612ffa565b60405180910390f35b3480156104c057600080fd5b506104db60048036038101906104d691906128a3565b610fd5565b6040516104e891906133be565b60405180910390f35b3480156104fd57600080fd5b5061050661108d565b005b34801561051457600080fd5b5061051d611115565b60405161052a9190612ffa565b60405180910390f35b34801561053f57600080fd5b5061055a60048036038101906105559190612b36565b61113f565b005b34801561056857600080fd5b506105716111c5565b60405161057e919061307c565b60405180910390f35b34801561059357600080fd5b506105ae60048036038101906105a991906129e6565b611257565b005b3480156105bc57600080fd5b506105d760048036038101906105d29190612963565b61126d565b005b3480156105e557600080fd5b5061060060048036038101906105fb9190612b36565b6112cf565b005b34801561060e57600080fd5b5061062960048036038101906106249190612b36565b611441565b604051610636919061307c565b60405180910390f35b34801561064b57600080fd5b5061066660048036038101906106619190612a26565b6114e8565b005b34801561067457600080fd5b5061067d611615565b60405161068a919061307c565b60405180910390f35b34801561069f57600080fd5b506106ba60048036038101906106b59190612b36565b6116a3565b005b3480156106c857600080fd5b506106e360048036038101906106de91906128d0565b611729565b6040516106f09190613061565b60405180910390f35b34801561070557600080fd5b50610720600480360381019061071b91906128a3565b6117bd565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107ed57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107fd57506107fc826118fc565b5b9050919050565b61080c611966565b73ffffffffffffffffffffffffffffffffffffffff1661082a611115565b73ffffffffffffffffffffffffffffffffffffffff1614610880576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108779061329e565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b6060600080546108ac90613679565b80601f01602080910402602001604051908101604052809291908181526020018280546108d890613679565b80156109255780601f106108fa57610100808354040283529160200191610925565b820191906000526020600020905b81548152906001019060200180831161090857829003601f168201915b5050505050905090565b600061093a8261196e565b610979576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109709061327e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109bf82610f23565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a27906132fe565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a4f611966565b73ffffffffffffffffffffffffffffffffffffffff161480610a7e5750610a7d81610a78611966565b611729565b5b610abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab49061319e565b60405180910390fd5b610ac783836119da565b505050565b600a81565b60085481565b6000610ae360076118b5565b905090565b610af9610af3611966565b82611a93565b610b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2f9061337e565b60405180910390fd5b610b43838383611b71565b505050565b61271081565b6000610b5a60076118b5565b9050600c60009054906101000a900460ff1615610bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba39061325e565b60405180910390fd5b6101f4612710610bbc919061358f565b610bcf8383611dd890919063ffffffff16565b1115610c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c079061339e565b60405180910390fd5b600082118015610c215750600a8211155b610c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c57906131be565b60405180910390fd5b81610c69611dee565b610c739190613535565b341015610cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cac9061331e565b60405180910390fd5b60005b82811015610cdb57610cc8611e1c565b8080610cd3906136dc565b915050610cb8565b505050565b610ce8611966565b73ffffffffffffffffffffffffffffffffffffffff16610d06611115565b73ffffffffffffffffffffffffffffffffffffffff1614610d5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d539061329e565b60405180910390fd5b600047905060008111610da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b9061323e565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1682604051610dca90612fe5565b60006040518083038185875af1925050503d8060008114610e07576040519150601f19603f3d011682016040523d82523d6000602084013e610e0c565b606091505b5050905080610e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e479061335e565b60405180910390fd5b5050565b610e6f8383836040518060200160405280600081525061126d565b505050565b610e7c611966565b73ffffffffffffffffffffffffffffffffffffffff16610e9a611115565b73ffffffffffffffffffffffffffffffffffffffff1614610ef0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee79061329e565b60405180910390fd5b80600d9080519060200190610f069291906126b7565b5050565b600c60009054906101000a900460ff1681565b600a5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc3906131fe565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611046576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103d906131de565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611095611966565b73ffffffffffffffffffffffffffffffffffffffff166110b3611115565b73ffffffffffffffffffffffffffffffffffffffff1614611109576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111009061329e565b60405180910390fd5b6111136000611e41565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611147611966565b73ffffffffffffffffffffffffffffffffffffffff16611165611115565b73ffffffffffffffffffffffffffffffffffffffff16146111bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b29061329e565b60405180910390fd5b80600a8190555050565b6060600180546111d490613679565b80601f016020809104026020016040519081016040528092919081815260200182805461120090613679565b801561124d5780601f106112225761010080835404028352916020019161124d565b820191906000526020600020905b81548152906001019060200180831161123057829003601f168201915b5050505050905090565b611269611262611966565b8383611f07565b5050565b61127e611278611966565b83611a93565b6112bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b49061337e565b60405180910390fd5b6112c984848484612074565b50505050565b6112d7611966565b73ffffffffffffffffffffffffffffffffffffffff166112f5611115565b73ffffffffffffffffffffffffffffffffffffffff161461134b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113429061329e565b60405180910390fd5b600061135760076118b5565b905061271061136f8383611dd890919063ffffffff16565b11156113b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a79061333e565b60405180910390fd5b6101f482600b546113c191906134ae565b1115611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f99061311e565b60405180910390fd5b60005b8281101561142857611415611e1c565b8080611420906136dc565b915050611405565b5081600b5461143791906134ae565b600b819055505050565b606061144c8261196e565b61148b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611482906132be565b60405180910390fd5b60006114956120d0565b905060008151116114b557604051806020016040528060008152506114e0565b806114bf84612162565b6040516020016114d0929190612fc1565b6040516020818303038152906040525b915050919050565b6114f0611966565b73ffffffffffffffffffffffffffffffffffffffff1661150e611115565b73ffffffffffffffffffffffffffffffffffffffff1614611564576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155b9061329e565b60405180910390fd5b6101f4600b548261157591906134ae565b11156115b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ad906132de565b60405180910390fd5b60006115c260076118b5565b905060005b828110156115f6576115d984836122c3565b6115e360076118c3565b80806115ee906136dc565b9150506115c7565b5081600b600082825461160991906134ae565b92505081905550505050565b600d805461162290613679565b80601f016020809104026020016040519081016040528092919081815260200182805461164e90613679565b801561169b5780601f106116705761010080835404028352916020019161169b565b820191906000526020600020905b81548152906001019060200180831161167e57829003601f168201915b505050505081565b6116ab611966565b73ffffffffffffffffffffffffffffffffffffffff166116c9611115565b73ffffffffffffffffffffffffffffffffffffffff161461171f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117169061329e565b60405180910390fd5b8060088190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6117c5611966565b73ffffffffffffffffffffffffffffffffffffffff166117e3611115565b73ffffffffffffffffffffffffffffffffffffffff1614611839576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118309061329e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a0906130be565b60405180910390fd5b6118b281611e41565b50565b600081600001549050919050565b6001816000016000828254019250508190555050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a4d83610f23565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a9e8261196e565b611add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad49061317e565b60405180910390fd5b6000611ae883610f23565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b5757508373ffffffffffffffffffffffffffffffffffffffff16611b3f8461092f565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b685750611b678185611729565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b9182610f23565b73ffffffffffffffffffffffffffffffffffffffff1614611be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bde906130de565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4e9061313e565b60405180910390fd5b611c628383836122e1565b611c6d6000826119da565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cbd919061358f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d1491906134ae565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611dd38383836122e6565b505050565b60008183611de691906134ae565b905092915050565b600080611dfb60076118b5565b9050600854811015611e1257600954915050611e19565b600a549150505b90565b6000611e2860076118b5565b9050611e3433826122c3565b611e3e60076118c3565b50565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6d9061315e565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120679190613061565b60405180910390a3505050565b61207f848484611b71565b61208b848484846122eb565b6120ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c19061309e565b60405180910390fd5b50505050565b6060600d80546120df90613679565b80601f016020809104026020016040519081016040528092919081815260200182805461210b90613679565b80156121585780601f1061212d57610100808354040283529160200191612158565b820191906000526020600020905b81548152906001019060200180831161213b57829003601f168201915b5050505050905090565b606060008214156121aa576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506122be565b600082905060005b600082146121dc5780806121c5906136dc565b915050600a826121d59190613504565b91506121b2565b60008167ffffffffffffffff8111156121f8576121f7613812565b5b6040519080825280601f01601f19166020018201604052801561222a5781602001600182028036833780820191505090505b5090505b600085146122b757600182612243919061358f565b9150600a856122529190613725565b603061225e91906134ae565b60f81b818381518110612274576122736137e3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856122b09190613504565b945061222e565b8093505050505b919050565b6122dd828260405180602001604052806000815250612482565b5050565b505050565b505050565b600061230c8473ffffffffffffffffffffffffffffffffffffffff166118d9565b15612475578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612335611966565b8786866040518563ffffffff1660e01b81526004016123579493929190613015565b602060405180830381600087803b15801561237157600080fd5b505af19250505080156123a257506040513d601f19601f8201168201806040525081019061239f9190612ac0565b60015b612425573d80600081146123d2576040519150601f19603f3d011682016040523d82523d6000602084013e6123d7565b606091505b5060008151141561241d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124149061309e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061247a565b600190505b949350505050565b61248c83836124dd565b61249960008484846122eb565b6124d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124cf9061309e565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561254d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125449061321e565b60405180910390fd5b6125568161196e565b15612596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258d906130fe565b60405180910390fd5b6125a2600083836122e1565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125f291906134ae565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126b3600083836122e6565b5050565b8280546126c390613679565b90600052602060002090601f0160209004810192826126e5576000855561272c565b82601f106126fe57805160ff191683800117855561272c565b8280016001018555821561272c579182015b8281111561272b578251825591602001919060010190612710565b5b509050612739919061273d565b5090565b5b8082111561275657600081600090555060010161273e565b5090565b600061276d612768846133fe565b6133d9565b90508281526020810184848401111561278957612788613846565b5b612794848285613637565b509392505050565b60006127af6127aa8461342f565b6133d9565b9050828152602081018484840111156127cb576127ca613846565b5b6127d6848285613637565b509392505050565b6000813590506127ed81613ea4565b92915050565b60008135905061280281613ebb565b92915050565b60008135905061281781613ed2565b92915050565b60008151905061282c81613ed2565b92915050565b600082601f83011261284757612846613841565b5b813561285784826020860161275a565b91505092915050565b600082601f83011261287557612874613841565b5b813561288584826020860161279c565b91505092915050565b60008135905061289d81613ee9565b92915050565b6000602082840312156128b9576128b8613850565b5b60006128c7848285016127de565b91505092915050565b600080604083850312156128e7576128e6613850565b5b60006128f5858286016127de565b9250506020612906858286016127de565b9150509250929050565b60008060006060848603121561292957612928613850565b5b6000612937868287016127de565b9350506020612948868287016127de565b92505060406129598682870161288e565b9150509250925092565b6000806000806080858703121561297d5761297c613850565b5b600061298b878288016127de565b945050602061299c878288016127de565b93505060406129ad8782880161288e565b925050606085013567ffffffffffffffff8111156129ce576129cd61384b565b5b6129da87828801612832565b91505092959194509250565b600080604083850312156129fd576129fc613850565b5b6000612a0b858286016127de565b9250506020612a1c858286016127f3565b9150509250929050565b60008060408385031215612a3d57612a3c613850565b5b6000612a4b858286016127de565b9250506020612a5c8582860161288e565b9150509250929050565b600060208284031215612a7c57612a7b613850565b5b6000612a8a848285016127f3565b91505092915050565b600060208284031215612aa957612aa8613850565b5b6000612ab784828501612808565b91505092915050565b600060208284031215612ad657612ad5613850565b5b6000612ae48482850161281d565b91505092915050565b600060208284031215612b0357612b02613850565b5b600082013567ffffffffffffffff811115612b2157612b2061384b565b5b612b2d84828501612860565b91505092915050565b600060208284031215612b4c57612b4b613850565b5b6000612b5a8482850161288e565b91505092915050565b612b6c816135c3565b82525050565b612b7b816135d5565b82525050565b6000612b8c82613460565b612b968185613476565b9350612ba6818560208601613646565b612baf81613855565b840191505092915050565b6000612bc58261346b565b612bcf8185613492565b9350612bdf818560208601613646565b612be881613855565b840191505092915050565b6000612bfe8261346b565b612c0881856134a3565b9350612c18818560208601613646565b80840191505092915050565b6000612c31603283613492565b9150612c3c82613866565b604082019050919050565b6000612c54602683613492565b9150612c5f826138b5565b604082019050919050565b6000612c77602583613492565b9150612c8282613904565b604082019050919050565b6000612c9a601c83613492565b9150612ca582613953565b602082019050919050565b6000612cbd602183613492565b9150612cc88261397c565b604082019050919050565b6000612ce0602483613492565b9150612ceb826139cb565b604082019050919050565b6000612d03601983613492565b9150612d0e82613a1a565b602082019050919050565b6000612d26602c83613492565b9150612d3182613a43565b604082019050919050565b6000612d49603883613492565b9150612d5482613a92565b604082019050919050565b6000612d6c602a83613492565b9150612d7782613ae1565b604082019050919050565b6000612d8f602a83613492565b9150612d9a82613b30565b604082019050919050565b6000612db2602983613492565b9150612dbd82613b7f565b604082019050919050565b6000612dd5602083613492565b9150612de082613bce565b602082019050919050565b6000612df8601983613492565b9150612e0382613bf7565b602082019050919050565b6000612e1b600b83613492565b9150612e2682613c20565b602082019050919050565b6000612e3e602c83613492565b9150612e4982613c49565b604082019050919050565b6000612e61602083613492565b9150612e6c82613c98565b602082019050919050565b6000612e84602f83613492565b9150612e8f82613cc1565b604082019050919050565b6000612ea7602083613492565b9150612eb282613d10565b602082019050919050565b6000612eca602183613492565b9150612ed582613d39565b604082019050919050565b6000612eed602783613492565b9150612ef882613d88565b604082019050919050565b6000612f10601883613492565b9150612f1b82613dd7565b602082019050919050565b6000612f33600083613487565b9150612f3e82613e00565b600082019050919050565b6000612f56601083613492565b9150612f6182613e03565b602082019050919050565b6000612f79603183613492565b9150612f8482613e2c565b604082019050919050565b6000612f9c601f83613492565b9150612fa782613e7b565b602082019050919050565b612fbb8161362d565b82525050565b6000612fcd8285612bf3565b9150612fd98284612bf3565b91508190509392505050565b6000612ff082612f26565b9150819050919050565b600060208201905061300f6000830184612b63565b92915050565b600060808201905061302a6000830187612b63565b6130376020830186612b63565b6130446040830185612fb2565b81810360608301526130568184612b81565b905095945050505050565b60006020820190506130766000830184612b72565b92915050565b600060208201905081810360008301526130968184612bba565b905092915050565b600060208201905081810360008301526130b781612c24565b9050919050565b600060208201905081810360008301526130d781612c47565b9050919050565b600060208201905081810360008301526130f781612c6a565b9050919050565b6000602082019050818103600083015261311781612c8d565b9050919050565b6000602082019050818103600083015261313781612cb0565b9050919050565b6000602082019050818103600083015261315781612cd3565b9050919050565b6000602082019050818103600083015261317781612cf6565b9050919050565b6000602082019050818103600083015261319781612d19565b9050919050565b600060208201905081810360008301526131b781612d3c565b9050919050565b600060208201905081810360008301526131d781612d5f565b9050919050565b600060208201905081810360008301526131f781612d82565b9050919050565b6000602082019050818103600083015261321781612da5565b9050919050565b6000602082019050818103600083015261323781612dc8565b9050919050565b6000602082019050818103600083015261325781612deb565b9050919050565b6000602082019050818103600083015261327781612e0e565b9050919050565b6000602082019050818103600083015261329781612e31565b9050919050565b600060208201905081810360008301526132b781612e54565b9050919050565b600060208201905081810360008301526132d781612e77565b9050919050565b600060208201905081810360008301526132f781612e9a565b9050919050565b6000602082019050818103600083015261331781612ebd565b9050919050565b6000602082019050818103600083015261333781612ee0565b9050919050565b6000602082019050818103600083015261335781612f03565b9050919050565b6000602082019050818103600083015261337781612f49565b9050919050565b6000602082019050818103600083015261339781612f6c565b9050919050565b600060208201905081810360008301526133b781612f8f565b9050919050565b60006020820190506133d36000830184612fb2565b92915050565b60006133e36133f4565b90506133ef82826136ab565b919050565b6000604051905090565b600067ffffffffffffffff82111561341957613418613812565b5b61342282613855565b9050602081019050919050565b600067ffffffffffffffff82111561344a57613449613812565b5b61345382613855565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006134b98261362d565b91506134c48361362d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156134f9576134f8613756565b5b828201905092915050565b600061350f8261362d565b915061351a8361362d565b92508261352a57613529613785565b5b828204905092915050565b60006135408261362d565b915061354b8361362d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561358457613583613756565b5b828202905092915050565b600061359a8261362d565b91506135a58361362d565b9250828210156135b8576135b7613756565b5b828203905092915050565b60006135ce8261360d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613664578082015181840152602081019050613649565b83811115613673576000848401525b50505050565b6000600282049050600182168061369157607f821691505b602082108114156136a5576136a46137b4565b5b50919050565b6136b482613855565b810181811067ffffffffffffffff821117156136d3576136d2613812565b5b80604052505050565b60006136e78261362d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561371a57613719613756565b5b600182019050919050565b60006137308261362d565b915061373b8361362d565b92508261374b5761374a613785565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f45786365656473207265736572766564205631205068756e6b7320737570706c60008201527f7900000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f43616e6e6f74206d696e7420737065636966696564206e756d626572206f662060008201527f5631205068756e6b732e00000000000000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4e6f206574686572206c65667420746f20776974686472617700000000000000600082015250565b7f53616c6520506175736564000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f45786365656473207265736572766564205631205068756e6b20737570706c79600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820657468657220746f2070757263686173652056312060008201527f5068756e6b732e00000000000000000000000000000000000000000000000000602082015250565b7f45786365656473205631205068756e6b7320737570706c790000000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768205631205068756e6b732072656d61696e696e672100600082015250565b613ead816135c3565b8114613eb857600080fd5b50565b613ec4816135d5565b8114613ecf57600080fd5b50565b613edb816135e1565b8114613ee657600080fd5b50565b613ef28161362d565b8114613efd57600080fd5b5056fea26469706673582212205fe5b64f61079b7ae0ceda1bff1ab2a85268c421b06e0b4fd49121170883225764736f6c63430008070033

Deployed Bytecode Sourcemap

109417:3710:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28606:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;112937:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29551:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31110:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30633:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;109647:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109753:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;113022:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31860:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;109579:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;110448:559;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;112254:269;;;:::i;:::-;;32270:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;110327:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;109948:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109850:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29245:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28975:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43433:103;;;;;;;;;;;;;:::i;:::-;;42782:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;111252:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29720:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31403:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32526:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;111746:461;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29895:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;112531:398;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;109987:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;111622:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31629:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43691:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28606:305;28708:4;28760:25;28745:40;;;:11;:40;;;;:105;;;;28817:33;28802:48;;;:11;:48;;;;28745:105;:158;;;;28867:36;28891:11;28867:23;:36::i;:::-;28745:158;28725:178;;28606:305;;;:::o;112937:79::-;43013:12;:10;:12::i;:::-;43002:23;;:7;:5;:7::i;:::-;:23;;;42994:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;113002:6:::1;112993;;:15;;;;;;;;;;;;;;;;;;112937:79:::0;:::o;29551:100::-;29605:13;29638:5;29631:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29551:100;:::o;31110:221::-;31186:7;31214:16;31222:7;31214;:16::i;:::-;31206:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31299:15;:24;31315:7;31299:24;;;;;;;;;;;;;;;;;;;;;31292:31;;31110:221;;;:::o;30633:411::-;30714:13;30730:23;30745:7;30730:14;:23::i;:::-;30714:39;;30778:5;30772:11;;:2;:11;;;;30764:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;30872:5;30856:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;30881:37;30898:5;30905:12;:10;:12::i;:::-;30881:16;:37::i;:::-;30856:62;30834:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;31015:21;31024:2;31028:7;31015:8;:21::i;:::-;30703:341;30633:411;;:::o;109647:41::-;109686:2;109647:41;:::o;109753:38::-;;;;:::o;113022:100::-;113067:7;113094:19;:9;:17;:19::i;:::-;113087:26;;113022:100;:::o;31860:339::-;32055:41;32074:12;:10;:12::i;:::-;32088:7;32055:18;:41::i;:::-;32047:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32163:28;32173:4;32179:2;32183:7;32163:9;:28::i;:::-;31860:339;;;:::o;109579:42::-;109616:5;109579:42;:::o;110448:559::-;110506:19;110528;:9;:17;:19::i;:::-;110506:41;;110567:6;;;;;;;;;;;110566:7;110558:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;109741:3;109616:5;110637:31;;;;:::i;:::-;110609:24;110625:7;110609:11;:15;;:24;;;;:::i;:::-;:59;;110601:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;110733:1;110723:7;:11;:38;;;;;109686:2;110738:7;:23;;110723:38;110715:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;110850:7;110840;:5;:7::i;:::-;:17;;;;:::i;:::-;110827:9;:30;;110819:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;110927:6;110922:78;110943:7;110939:1;:11;110922:78;;;110972:16;:14;:16::i;:::-;110952:3;;;;;:::i;:::-;;;;110922:78;;;;110495:512;110448:559;:::o;112254:269::-;43013:12;:10;:12::i;:::-;43002:23;;:7;:5;:7::i;:::-;:23;;;42994:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;112307:15:::1;112325:21;112307:39;;112372:1;112362:7;:11;112354:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;112414:12;112433:10;112432:17;;112457:7;112432:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;112413:56;;;112487:7;112479:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;112299:224;;112254:269::o:0;32270:185::-;32408:39;32425:4;32431:2;32435:7;32408:39;;;;;;;;;;;;:16;:39::i;:::-;32270:185;;;:::o;110327:113::-;43013:12;:10;:12::i;:::-;43002:23;;:7;:5;:7::i;:::-;:23;;;42994:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;110419:13:::1;110404:12;:28;;;;;;;;;;;;:::i;:::-;;110327:113:::0;:::o;109948:26::-;;;;;;;;;;;;;:::o;109850:40::-;;;;:::o;29245:239::-;29317:7;29337:13;29353:7;:16;29361:7;29353:16;;;;;;;;;;;;;;;;;;;;;29337:32;;29405:1;29388:19;;:5;:19;;;;29380:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29471:5;29464:12;;;29245:239;;;:::o;28975:208::-;29047:7;29092:1;29075:19;;:5;:19;;;;29067:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;29159:9;:16;29169:5;29159:16;;;;;;;;;;;;;;;;29152:23;;28975:208;;;:::o;43433:103::-;43013:12;:10;:12::i;:::-;43002:23;;:7;:5;:7::i;:::-;:23;;;42994:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43498:30:::1;43525:1;43498:18;:30::i;:::-;43433:103::o:0;42782:87::-;42828:7;42855:6;;;;;;;;;;;42848:13;;42782:87;:::o;111252:93::-;43013:12;:10;:12::i;:::-;43002:23;;:7;:5;:7::i;:::-;:23;;;42994:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;111331:6:::1;111316:12;:21;;;;111252:93:::0;:::o;29720:104::-;29776:13;29809:7;29802:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29720:104;:::o;31403:155::-;31498:52;31517:12;:10;:12::i;:::-;31531:8;31541;31498:18;:52::i;:::-;31403:155;;:::o;32526:328::-;32701:41;32720:12;:10;:12::i;:::-;32734:7;32701:18;:41::i;:::-;32693:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32807:39;32821:4;32827:2;32831:7;32840:5;32807:13;:39::i;:::-;32526:328;;;;:::o;111746:461::-;43013:12;:10;:12::i;:::-;43002:23;;:7;:5;:7::i;:::-;:23;;;42994:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;111812:19:::1;111834;:9;:17;:19::i;:::-;111812:41;;109616:5;111873:24;111889:7;111873:11;:15;;:24;;;;:::i;:::-;111872:40;;111864:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;109741:3;111977:7;111960:14;;:24;;;;:::i;:::-;:46;;111952:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;112070:9;112065:81;112089:7;112085:1;:11;112065:81;;;112118:16;:14;:16::i;:::-;112098:3;;;;;:::i;:::-;;;;112065:81;;;;112190:7;112173:14;;:24;;;;:::i;:::-;112156:14;:41;;;;111801:406;111746:461:::0;:::o;29895:334::-;29968:13;30002:16;30010:7;30002;:16::i;:::-;29994:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;30083:21;30107:10;:8;:10::i;:::-;30083:34;;30159:1;30141:7;30135:21;:25;:86;;;;;;;;;;;;;;;;;30187:7;30196:18;:7;:16;:18::i;:::-;30170:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;30135:86;30128:93;;;29895:334;;;:::o;112531:398::-;43013:12;:10;:12::i;:::-;43002:23;;:7;:5;:7::i;:::-;:23;;;42994:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;109741:3:::1;112630:14;;112620:7;:24;;;;:::i;:::-;:46;;112611:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;112715:15;112733:19;:9;:17;:19::i;:::-;112715:37;;112767:9;112763:121;112782:7;112778:1;:11;112763:121;;;112810:26;112820:3;112825:10;112810:9;:26::i;:::-;112851:21;:9;:19;:21::i;:::-;112791:3;;;;;:::i;:::-;;;;112763:121;;;;112914:7;112896:14;;:25;;;;;;;:::i;:::-;;;;;;;;112600:329;112531:398:::0;;:::o;109987:85::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;111622:115::-;43013:12;:10;:12::i;:::-;43002:23;;:7;:5;:7::i;:::-;:23;;;42994:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;111717:12:::1;111696:18;:33;;;;111622:115:::0;:::o;31629:164::-;31726:4;31750:18;:25;31769:5;31750:25;;;;;;;;;;;;;;;:35;31776:8;31750:35;;;;;;;;;;;;;;;;;;;;;;;;;31743:42;;31629:164;;;;:::o;43691:201::-;43013:12;:10;:12::i;:::-;43002:23;;:7;:5;:7::i;:::-;:23;;;42994:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43800:1:::1;43780:22;;:8;:22;;;;43772:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43856:28;43875:8;43856:18;:28::i;:::-;43691:201:::0;:::o;45122:114::-;45187:7;45214;:14;;;45207:21;;45122:114;;;:::o;45244:127::-;45351:1;45333:7;:14;;;:19;;;;;;;;;;;45244:127;:::o;3357:326::-;3417:4;3674:1;3652:7;:19;;;:23;3645:30;;3357:326;;;:::o;13440:157::-;13525:4;13564:25;13549:40;;;:11;:40;;;;13542:47;;13440:157;;;:::o;26985:98::-;27038:7;27065:10;27058:17;;26985:98;:::o;34364:127::-;34429:4;34481:1;34453:30;;:7;:16;34461:7;34453:16;;;;;;;;;;;;;;;;;;;;;:30;;;;34446:37;;34364:127;;;:::o;38510:174::-;38612:2;38585:15;:24;38601:7;38585:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;38668:7;38664:2;38630:46;;38639:23;38654:7;38639:14;:23::i;:::-;38630:46;;;;;;;;;;;;38510:174;;:::o;34658:348::-;34751:4;34776:16;34784:7;34776;:16::i;:::-;34768:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34852:13;34868:23;34883:7;34868:14;:23::i;:::-;34852:39;;34921:5;34910:16;;:7;:16;;;:51;;;;34954:7;34930:31;;:20;34942:7;34930:11;:20::i;:::-;:31;;;34910:51;:87;;;;34965:32;34982:5;34989:7;34965:16;:32::i;:::-;34910:87;34902:96;;;34658:348;;;;:::o;37767:625::-;37926:4;37899:31;;:23;37914:7;37899:14;:23::i;:::-;:31;;;37891:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;38005:1;37991:16;;:2;:16;;;;37983:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;38061:39;38082:4;38088:2;38092:7;38061:20;:39::i;:::-;38165:29;38182:1;38186:7;38165:8;:29::i;:::-;38226:1;38207:9;:15;38217:4;38207:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;38255:1;38238:9;:13;38248:2;38238:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38286:2;38267:7;:16;38275:7;38267:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38325:7;38321:2;38306:27;;38315:4;38306:27;;;;;;;;;;;;38346:38;38366:4;38372:2;38376:7;38346:19;:38::i;:::-;37767:625;;;:::o;22141:98::-;22199:7;22230:1;22226;:5;;;;:::i;:::-;22219:12;;22141:98;;;;:::o;111352:258::-;111390:7;111410:19;111432;:9;:17;:19::i;:::-;111410:41;;111481:18;;111467:11;:32;111462:141;;;111523:16;;111516:23;;;;;111462:141;111579:12;;111572:19;;;111352:258;;:::o;111015:160::-;111058:15;111076:19;:9;:17;:19::i;:::-;111058:37;;111104:33;111114:10;111126;111104:9;:33::i;:::-;111146:21;:9;:19;:21::i;:::-;111049:126;111015:160::o;44052:191::-;44126:16;44145:6;;;;;;;;;;;44126:25;;44171:8;44162:6;;:17;;;;;;;;;;;;;;;;;;44226:8;44195:40;;44216:8;44195:40;;;;;;;;;;;;44115:128;44052:191;:::o;38826:315::-;38981:8;38972:17;;:5;:17;;;;38964:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;39068:8;39030:18;:25;39049:5;39030:25;;;;;;;;;;;;;;;:35;39056:8;39030:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;39114:8;39092:41;;39107:5;39092:41;;;39124:8;39092:41;;;;;;:::i;:::-;;;;;;;;38826:315;;;:::o;33736:::-;33893:28;33903:4;33909:2;33913:7;33893:9;:28::i;:::-;33940:48;33963:4;33969:2;33973:7;33982:5;33940:22;:48::i;:::-;33932:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;33736:315;;;;:::o;110203:112::-;110263:13;110295:12;110288:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;110203:112;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;35348:110::-;35424:26;35434:2;35438:7;35424:26;;;;;;;;;;;;:9;:26::i;:::-;35348:110;;:::o;41077:126::-;;;;:::o;41588:125::-;;;;:::o;39706:799::-;39861:4;39882:15;:2;:13;;;:15::i;:::-;39878:620;;;39934:2;39918:36;;;39955:12;:10;:12::i;:::-;39969:4;39975:7;39984:5;39918:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39914:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40177:1;40160:6;:13;:18;40156:272;;;40203:60;;;;;;;;;;:::i;:::-;;;;;;;;40156:272;40378:6;40372:13;40363:6;40359:2;40355:15;40348:38;39914:529;40051:41;;;40041:51;;;:6;:51;;;;40034:58;;;;;39878:620;40482:4;40475:11;;39706:799;;;;;;;:::o;35685:321::-;35815:18;35821:2;35825:7;35815:5;:18::i;:::-;35866:54;35897:1;35901:2;35905:7;35914:5;35866:22;:54::i;:::-;35844:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;35685:321;;;:::o;36342:439::-;36436:1;36422:16;;:2;:16;;;;36414:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;36495:16;36503:7;36495;:16::i;:::-;36494:17;36486:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;36557:45;36586:1;36590:2;36594:7;36557:20;:45::i;:::-;36632:1;36615:9;:13;36625:2;36615:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36663:2;36644:7;:16;36652:7;36644:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36708:7;36704:2;36683:33;;36700:1;36683:33;;;;;;;;;;;;36729:44;36757:1;36761:2;36765:7;36729:19;:44::i;:::-;36342:439;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::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;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:118::-;7574:24;7592:5;7574:24;:::i;:::-;7569:3;7562:37;7487:118;;:::o;7611:109::-;7692:21;7707:5;7692:21;:::i;:::-;7687:3;7680:34;7611:109;;:::o;7726:360::-;7812:3;7840:38;7872:5;7840:38;:::i;:::-;7894:70;7957:6;7952:3;7894:70;:::i;:::-;7887:77;;7973:52;8018:6;8013:3;8006:4;7999:5;7995:16;7973:52;:::i;:::-;8050:29;8072:6;8050:29;:::i;:::-;8045:3;8041:39;8034:46;;7816:270;7726:360;;;;:::o;8092:364::-;8180:3;8208:39;8241:5;8208:39;:::i;:::-;8263:71;8327:6;8322:3;8263:71;:::i;:::-;8256:78;;8343:52;8388:6;8383:3;8376:4;8369:5;8365:16;8343:52;:::i;:::-;8420:29;8442:6;8420:29;:::i;:::-;8415:3;8411:39;8404:46;;8184:272;8092:364;;;;:::o;8462:377::-;8568:3;8596:39;8629:5;8596:39;:::i;:::-;8651:89;8733:6;8728:3;8651:89;:::i;:::-;8644:96;;8749:52;8794:6;8789:3;8782:4;8775:5;8771:16;8749:52;:::i;:::-;8826:6;8821:3;8817:16;8810:23;;8572:267;8462:377;;;;:::o;8845:366::-;8987:3;9008:67;9072:2;9067:3;9008:67;:::i;:::-;9001:74;;9084:93;9173:3;9084:93;:::i;:::-;9202:2;9197:3;9193:12;9186:19;;8845:366;;;:::o;9217:::-;9359:3;9380:67;9444:2;9439:3;9380:67;:::i;:::-;9373:74;;9456:93;9545:3;9456:93;:::i;:::-;9574:2;9569:3;9565:12;9558:19;;9217:366;;;:::o;9589:::-;9731:3;9752:67;9816:2;9811:3;9752:67;:::i;:::-;9745:74;;9828:93;9917:3;9828:93;:::i;:::-;9946:2;9941:3;9937:12;9930:19;;9589:366;;;:::o;9961:::-;10103:3;10124:67;10188:2;10183:3;10124:67;:::i;:::-;10117:74;;10200:93;10289:3;10200:93;:::i;:::-;10318:2;10313:3;10309:12;10302:19;;9961:366;;;:::o;10333:::-;10475:3;10496:67;10560:2;10555:3;10496:67;:::i;:::-;10489:74;;10572:93;10661:3;10572:93;:::i;:::-;10690:2;10685:3;10681:12;10674:19;;10333:366;;;:::o;10705:::-;10847:3;10868:67;10932:2;10927:3;10868:67;:::i;:::-;10861:74;;10944:93;11033:3;10944:93;:::i;:::-;11062:2;11057:3;11053:12;11046:19;;10705:366;;;:::o;11077:::-;11219:3;11240:67;11304:2;11299:3;11240:67;:::i;:::-;11233:74;;11316:93;11405:3;11316:93;:::i;:::-;11434:2;11429:3;11425:12;11418:19;;11077:366;;;:::o;11449:::-;11591:3;11612:67;11676:2;11671:3;11612:67;:::i;:::-;11605:74;;11688:93;11777:3;11688:93;:::i;:::-;11806:2;11801:3;11797:12;11790:19;;11449:366;;;:::o;11821:::-;11963:3;11984:67;12048:2;12043:3;11984:67;:::i;:::-;11977:74;;12060:93;12149:3;12060:93;:::i;:::-;12178:2;12173:3;12169:12;12162:19;;11821:366;;;:::o;12193:::-;12335:3;12356:67;12420:2;12415:3;12356:67;:::i;:::-;12349:74;;12432:93;12521:3;12432:93;:::i;:::-;12550:2;12545:3;12541:12;12534:19;;12193:366;;;:::o;12565:::-;12707:3;12728:67;12792:2;12787:3;12728:67;:::i;:::-;12721:74;;12804:93;12893:3;12804:93;:::i;:::-;12922:2;12917:3;12913:12;12906:19;;12565:366;;;:::o;12937:::-;13079:3;13100:67;13164:2;13159:3;13100:67;:::i;:::-;13093:74;;13176:93;13265:3;13176:93;:::i;:::-;13294:2;13289:3;13285:12;13278:19;;12937:366;;;:::o;13309:::-;13451:3;13472:67;13536:2;13531:3;13472:67;:::i;:::-;13465:74;;13548:93;13637:3;13548:93;:::i;:::-;13666:2;13661:3;13657:12;13650:19;;13309:366;;;:::o;13681:::-;13823:3;13844:67;13908:2;13903:3;13844:67;:::i;:::-;13837:74;;13920:93;14009:3;13920:93;:::i;:::-;14038:2;14033:3;14029:12;14022:19;;13681:366;;;:::o;14053:::-;14195:3;14216:67;14280:2;14275:3;14216:67;:::i;:::-;14209:74;;14292:93;14381:3;14292:93;:::i;:::-;14410:2;14405:3;14401:12;14394:19;;14053:366;;;:::o;14425:::-;14567:3;14588:67;14652:2;14647:3;14588:67;:::i;:::-;14581:74;;14664:93;14753:3;14664:93;:::i;:::-;14782:2;14777:3;14773:12;14766:19;;14425:366;;;:::o;14797:::-;14939:3;14960:67;15024:2;15019:3;14960:67;:::i;:::-;14953:74;;15036:93;15125:3;15036:93;:::i;:::-;15154:2;15149:3;15145:12;15138:19;;14797:366;;;:::o;15169:::-;15311:3;15332:67;15396:2;15391:3;15332:67;:::i;:::-;15325:74;;15408:93;15497:3;15408:93;:::i;:::-;15526:2;15521:3;15517:12;15510:19;;15169:366;;;:::o;15541:::-;15683:3;15704:67;15768:2;15763:3;15704:67;:::i;:::-;15697:74;;15780:93;15869:3;15780:93;:::i;:::-;15898:2;15893:3;15889:12;15882:19;;15541:366;;;:::o;15913:::-;16055:3;16076:67;16140:2;16135:3;16076:67;:::i;:::-;16069:74;;16152:93;16241:3;16152:93;:::i;:::-;16270:2;16265:3;16261:12;16254:19;;15913:366;;;:::o;16285:::-;16427:3;16448:67;16512:2;16507:3;16448:67;:::i;:::-;16441:74;;16524:93;16613:3;16524:93;:::i;:::-;16642:2;16637:3;16633:12;16626:19;;16285:366;;;:::o;16657:::-;16799:3;16820:67;16884:2;16879:3;16820:67;:::i;:::-;16813:74;;16896:93;16985:3;16896:93;:::i;:::-;17014:2;17009:3;17005:12;16998:19;;16657:366;;;:::o;17029:398::-;17188:3;17209:83;17290:1;17285:3;17209:83;:::i;:::-;17202:90;;17301:93;17390:3;17301:93;:::i;:::-;17419:1;17414:3;17410:11;17403:18;;17029:398;;;:::o;17433:366::-;17575:3;17596:67;17660:2;17655:3;17596:67;:::i;:::-;17589:74;;17672:93;17761:3;17672:93;:::i;:::-;17790:2;17785:3;17781:12;17774:19;;17433:366;;;:::o;17805:::-;17947:3;17968:67;18032:2;18027:3;17968:67;:::i;:::-;17961:74;;18044:93;18133:3;18044:93;:::i;:::-;18162:2;18157:3;18153:12;18146:19;;17805:366;;;:::o;18177:::-;18319:3;18340:67;18404:2;18399:3;18340:67;:::i;:::-;18333:74;;18416:93;18505:3;18416:93;:::i;:::-;18534:2;18529:3;18525:12;18518:19;;18177:366;;;:::o;18549:118::-;18636:24;18654:5;18636:24;:::i;:::-;18631:3;18624:37;18549:118;;:::o;18673:435::-;18853:3;18875:95;18966:3;18957:6;18875:95;:::i;:::-;18868:102;;18987:95;19078:3;19069:6;18987:95;:::i;:::-;18980:102;;19099:3;19092:10;;18673:435;;;;;:::o;19114:379::-;19298:3;19320:147;19463:3;19320:147;:::i;:::-;19313:154;;19484:3;19477:10;;19114:379;;;:::o;19499:222::-;19592:4;19630:2;19619:9;19615:18;19607:26;;19643:71;19711:1;19700:9;19696:17;19687:6;19643:71;:::i;:::-;19499:222;;;;:::o;19727:640::-;19922:4;19960:3;19949:9;19945:19;19937:27;;19974:71;20042:1;20031:9;20027:17;20018:6;19974:71;:::i;:::-;20055:72;20123:2;20112:9;20108:18;20099:6;20055:72;:::i;:::-;20137;20205:2;20194:9;20190:18;20181:6;20137:72;:::i;:::-;20256:9;20250:4;20246:20;20241:2;20230:9;20226:18;20219:48;20284:76;20355:4;20346:6;20284:76;:::i;:::-;20276:84;;19727:640;;;;;;;:::o;20373:210::-;20460:4;20498:2;20487:9;20483:18;20475:26;;20511:65;20573:1;20562:9;20558:17;20549:6;20511:65;:::i;:::-;20373:210;;;;:::o;20589:313::-;20702:4;20740:2;20729:9;20725:18;20717:26;;20789:9;20783:4;20779:20;20775:1;20764:9;20760:17;20753:47;20817:78;20890:4;20881:6;20817:78;:::i;:::-;20809:86;;20589:313;;;;:::o;20908:419::-;21074:4;21112:2;21101:9;21097:18;21089:26;;21161:9;21155:4;21151:20;21147:1;21136:9;21132:17;21125:47;21189:131;21315:4;21189:131;:::i;:::-;21181:139;;20908:419;;;:::o;21333:::-;21499:4;21537:2;21526:9;21522:18;21514:26;;21586:9;21580:4;21576:20;21572:1;21561:9;21557:17;21550:47;21614:131;21740:4;21614:131;:::i;:::-;21606:139;;21333:419;;;:::o;21758:::-;21924:4;21962:2;21951:9;21947:18;21939:26;;22011:9;22005:4;22001:20;21997:1;21986:9;21982:17;21975:47;22039:131;22165:4;22039:131;:::i;:::-;22031:139;;21758:419;;;:::o;22183:::-;22349:4;22387:2;22376:9;22372:18;22364:26;;22436:9;22430:4;22426:20;22422:1;22411:9;22407:17;22400:47;22464:131;22590:4;22464:131;:::i;:::-;22456:139;;22183:419;;;:::o;22608:::-;22774:4;22812:2;22801:9;22797:18;22789:26;;22861:9;22855:4;22851:20;22847:1;22836:9;22832:17;22825:47;22889:131;23015:4;22889:131;:::i;:::-;22881:139;;22608:419;;;:::o;23033:::-;23199:4;23237:2;23226:9;23222:18;23214:26;;23286:9;23280:4;23276:20;23272:1;23261:9;23257:17;23250:47;23314:131;23440:4;23314:131;:::i;:::-;23306:139;;23033:419;;;:::o;23458:::-;23624:4;23662:2;23651:9;23647:18;23639:26;;23711:9;23705:4;23701:20;23697:1;23686:9;23682:17;23675:47;23739:131;23865:4;23739:131;:::i;:::-;23731:139;;23458:419;;;:::o;23883:::-;24049:4;24087:2;24076:9;24072:18;24064:26;;24136:9;24130:4;24126:20;24122:1;24111:9;24107:17;24100:47;24164:131;24290:4;24164:131;:::i;:::-;24156:139;;23883:419;;;:::o;24308:::-;24474:4;24512:2;24501:9;24497:18;24489:26;;24561:9;24555:4;24551:20;24547:1;24536:9;24532:17;24525:47;24589:131;24715:4;24589:131;:::i;:::-;24581:139;;24308:419;;;:::o;24733:::-;24899:4;24937:2;24926:9;24922:18;24914:26;;24986:9;24980:4;24976:20;24972:1;24961:9;24957:17;24950:47;25014:131;25140:4;25014:131;:::i;:::-;25006:139;;24733:419;;;:::o;25158:::-;25324:4;25362:2;25351:9;25347:18;25339:26;;25411:9;25405:4;25401:20;25397:1;25386:9;25382:17;25375:47;25439:131;25565:4;25439:131;:::i;:::-;25431:139;;25158:419;;;:::o;25583:::-;25749:4;25787:2;25776:9;25772:18;25764:26;;25836:9;25830:4;25826:20;25822:1;25811:9;25807:17;25800:47;25864:131;25990:4;25864:131;:::i;:::-;25856:139;;25583:419;;;:::o;26008:::-;26174:4;26212:2;26201:9;26197:18;26189:26;;26261:9;26255:4;26251:20;26247:1;26236:9;26232:17;26225:47;26289:131;26415:4;26289:131;:::i;:::-;26281:139;;26008:419;;;:::o;26433:::-;26599:4;26637:2;26626:9;26622:18;26614:26;;26686:9;26680:4;26676:20;26672:1;26661:9;26657:17;26650:47;26714:131;26840:4;26714:131;:::i;:::-;26706:139;;26433:419;;;:::o;26858:::-;27024:4;27062:2;27051:9;27047:18;27039:26;;27111:9;27105:4;27101:20;27097:1;27086:9;27082:17;27075:47;27139:131;27265:4;27139:131;:::i;:::-;27131:139;;26858:419;;;:::o;27283:::-;27449:4;27487:2;27476:9;27472:18;27464:26;;27536:9;27530:4;27526:20;27522:1;27511:9;27507:17;27500:47;27564:131;27690:4;27564:131;:::i;:::-;27556:139;;27283:419;;;:::o;27708:::-;27874:4;27912:2;27901:9;27897:18;27889:26;;27961:9;27955:4;27951:20;27947:1;27936:9;27932:17;27925:47;27989:131;28115:4;27989:131;:::i;:::-;27981:139;;27708:419;;;:::o;28133:::-;28299:4;28337:2;28326:9;28322:18;28314:26;;28386:9;28380:4;28376:20;28372:1;28361:9;28357:17;28350:47;28414:131;28540:4;28414:131;:::i;:::-;28406:139;;28133:419;;;:::o;28558:::-;28724:4;28762:2;28751:9;28747:18;28739:26;;28811:9;28805:4;28801:20;28797:1;28786:9;28782:17;28775:47;28839:131;28965:4;28839:131;:::i;:::-;28831:139;;28558:419;;;:::o;28983:::-;29149:4;29187:2;29176:9;29172:18;29164:26;;29236:9;29230:4;29226:20;29222:1;29211:9;29207:17;29200:47;29264:131;29390:4;29264:131;:::i;:::-;29256:139;;28983:419;;;:::o;29408:::-;29574:4;29612:2;29601:9;29597:18;29589:26;;29661:9;29655:4;29651:20;29647:1;29636:9;29632:17;29625:47;29689:131;29815:4;29689:131;:::i;:::-;29681:139;;29408:419;;;:::o;29833:::-;29999:4;30037:2;30026:9;30022:18;30014:26;;30086:9;30080:4;30076:20;30072:1;30061:9;30057:17;30050:47;30114:131;30240:4;30114:131;:::i;:::-;30106:139;;29833:419;;;:::o;30258:::-;30424:4;30462:2;30451:9;30447:18;30439:26;;30511:9;30505:4;30501:20;30497:1;30486:9;30482:17;30475:47;30539:131;30665:4;30539:131;:::i;:::-;30531:139;;30258:419;;;:::o;30683:::-;30849:4;30887:2;30876:9;30872:18;30864:26;;30936:9;30930:4;30926:20;30922:1;30911:9;30907:17;30900:47;30964:131;31090:4;30964:131;:::i;:::-;30956:139;;30683:419;;;:::o;31108:::-;31274:4;31312:2;31301:9;31297:18;31289:26;;31361:9;31355:4;31351:20;31347:1;31336:9;31332:17;31325:47;31389:131;31515:4;31389:131;:::i;:::-;31381:139;;31108:419;;;:::o;31533:222::-;31626:4;31664:2;31653:9;31649:18;31641:26;;31677:71;31745:1;31734:9;31730:17;31721:6;31677:71;:::i;:::-;31533:222;;;;:::o;31761:129::-;31795:6;31822:20;;:::i;:::-;31812:30;;31851:33;31879:4;31871:6;31851:33;:::i;:::-;31761:129;;;:::o;31896:75::-;31929:6;31962:2;31956:9;31946:19;;31896:75;:::o;31977:307::-;32038:4;32128:18;32120:6;32117:30;32114:56;;;32150:18;;:::i;:::-;32114:56;32188:29;32210:6;32188:29;:::i;:::-;32180:37;;32272:4;32266;32262:15;32254:23;;31977:307;;;:::o;32290:308::-;32352:4;32442:18;32434:6;32431:30;32428:56;;;32464:18;;:::i;:::-;32428:56;32502:29;32524:6;32502:29;:::i;:::-;32494:37;;32586:4;32580;32576:15;32568:23;;32290:308;;;:::o;32604:98::-;32655:6;32689:5;32683:12;32673:22;;32604:98;;;:::o;32708:99::-;32760:6;32794:5;32788:12;32778:22;;32708:99;;;:::o;32813:168::-;32896:11;32930:6;32925:3;32918:19;32970:4;32965:3;32961:14;32946:29;;32813:168;;;;:::o;32987:147::-;33088:11;33125:3;33110:18;;32987:147;;;;:::o;33140:169::-;33224:11;33258:6;33253:3;33246:19;33298:4;33293:3;33289:14;33274:29;;33140:169;;;;:::o;33315:148::-;33417:11;33454:3;33439:18;;33315:148;;;;:::o;33469:305::-;33509:3;33528:20;33546:1;33528:20;:::i;:::-;33523:25;;33562:20;33580:1;33562:20;:::i;:::-;33557:25;;33716:1;33648:66;33644:74;33641:1;33638:81;33635:107;;;33722:18;;:::i;:::-;33635:107;33766:1;33763;33759:9;33752:16;;33469:305;;;;:::o;33780:185::-;33820:1;33837:20;33855:1;33837:20;:::i;:::-;33832:25;;33871:20;33889:1;33871:20;:::i;:::-;33866:25;;33910:1;33900:35;;33915:18;;:::i;:::-;33900:35;33957:1;33954;33950:9;33945:14;;33780:185;;;;:::o;33971:348::-;34011:7;34034:20;34052:1;34034:20;:::i;:::-;34029:25;;34068:20;34086:1;34068:20;:::i;:::-;34063:25;;34256:1;34188:66;34184:74;34181:1;34178:81;34173:1;34166:9;34159:17;34155:105;34152:131;;;34263:18;;:::i;:::-;34152:131;34311:1;34308;34304:9;34293:20;;33971:348;;;;:::o;34325:191::-;34365:4;34385:20;34403:1;34385:20;:::i;:::-;34380:25;;34419:20;34437:1;34419:20;:::i;:::-;34414:25;;34458:1;34455;34452:8;34449:34;;;34463:18;;:::i;:::-;34449:34;34508:1;34505;34501:9;34493:17;;34325:191;;;;:::o;34522:96::-;34559:7;34588:24;34606:5;34588:24;:::i;:::-;34577:35;;34522:96;;;:::o;34624:90::-;34658:7;34701:5;34694:13;34687:21;34676:32;;34624:90;;;:::o;34720:149::-;34756:7;34796:66;34789:5;34785:78;34774:89;;34720:149;;;:::o;34875:126::-;34912:7;34952:42;34945:5;34941:54;34930:65;;34875:126;;;:::o;35007:77::-;35044:7;35073:5;35062:16;;35007:77;;;:::o;35090:154::-;35174:6;35169:3;35164;35151:30;35236:1;35227:6;35222:3;35218:16;35211:27;35090:154;;;:::o;35250:307::-;35318:1;35328:113;35342:6;35339:1;35336:13;35328:113;;;35427:1;35422:3;35418:11;35412:18;35408:1;35403:3;35399:11;35392:39;35364:2;35361:1;35357:10;35352:15;;35328:113;;;35459:6;35456:1;35453:13;35450:101;;;35539:1;35530:6;35525:3;35521:16;35514:27;35450:101;35299:258;35250:307;;;:::o;35563:320::-;35607:6;35644:1;35638:4;35634:12;35624:22;;35691:1;35685:4;35681:12;35712:18;35702:81;;35768:4;35760:6;35756:17;35746:27;;35702:81;35830:2;35822:6;35819:14;35799:18;35796:38;35793:84;;;35849:18;;:::i;:::-;35793:84;35614:269;35563:320;;;:::o;35889:281::-;35972:27;35994:4;35972:27;:::i;:::-;35964:6;35960:40;36102:6;36090:10;36087:22;36066:18;36054:10;36051:34;36048:62;36045:88;;;36113:18;;:::i;:::-;36045:88;36153:10;36149:2;36142:22;35932:238;35889:281;;:::o;36176:233::-;36215:3;36238:24;36256:5;36238:24;:::i;:::-;36229:33;;36284:66;36277:5;36274:77;36271:103;;;36354:18;;:::i;:::-;36271:103;36401:1;36394:5;36390:13;36383:20;;36176:233;;;:::o;36415:176::-;36447:1;36464:20;36482:1;36464:20;:::i;:::-;36459:25;;36498:20;36516:1;36498:20;:::i;:::-;36493:25;;36537:1;36527:35;;36542:18;;:::i;:::-;36527:35;36583:1;36580;36576:9;36571:14;;36415:176;;;;:::o;36597:180::-;36645:77;36642:1;36635:88;36742:4;36739:1;36732:15;36766:4;36763:1;36756:15;36783:180;36831:77;36828:1;36821:88;36928:4;36925:1;36918:15;36952:4;36949:1;36942:15;36969:180;37017:77;37014:1;37007:88;37114:4;37111:1;37104:15;37138:4;37135:1;37128:15;37155:180;37203:77;37200:1;37193:88;37300:4;37297:1;37290:15;37324:4;37321:1;37314:15;37341:180;37389:77;37386:1;37379:88;37486:4;37483:1;37476:15;37510:4;37507:1;37500:15;37527:117;37636:1;37633;37626:12;37650:117;37759:1;37756;37749:12;37773:117;37882:1;37879;37872:12;37896:117;38005:1;38002;37995:12;38019:102;38060:6;38111:2;38107:7;38102:2;38095:5;38091:14;38087:28;38077:38;;38019:102;;;:::o;38127:237::-;38267:34;38263:1;38255:6;38251:14;38244:58;38336:20;38331:2;38323:6;38319:15;38312:45;38127:237;:::o;38370:225::-;38510:34;38506:1;38498:6;38494:14;38487:58;38579:8;38574:2;38566:6;38562:15;38555:33;38370:225;:::o;38601:224::-;38741:34;38737:1;38729:6;38725:14;38718:58;38810:7;38805:2;38797:6;38793:15;38786:32;38601:224;:::o;38831:178::-;38971:30;38967:1;38959:6;38955:14;38948:54;38831:178;:::o;39015:220::-;39155:34;39151:1;39143:6;39139:14;39132:58;39224:3;39219:2;39211:6;39207:15;39200:28;39015:220;:::o;39241:223::-;39381:34;39377:1;39369:6;39365:14;39358:58;39450:6;39445:2;39437:6;39433:15;39426:31;39241:223;:::o;39470:175::-;39610:27;39606:1;39598:6;39594:14;39587:51;39470:175;:::o;39651:231::-;39791:34;39787:1;39779:6;39775:14;39768:58;39860:14;39855:2;39847:6;39843:15;39836:39;39651:231;:::o;39888:243::-;40028:34;40024:1;40016:6;40012:14;40005:58;40097:26;40092:2;40084:6;40080:15;40073:51;39888:243;:::o;40137:229::-;40277:34;40273:1;40265:6;40261:14;40254:58;40346:12;40341:2;40333:6;40329:15;40322:37;40137:229;:::o;40372:::-;40512:34;40508:1;40500:6;40496:14;40489:58;40581:12;40576:2;40568:6;40564:15;40557:37;40372:229;:::o;40607:228::-;40747:34;40743:1;40735:6;40731:14;40724:58;40816:11;40811:2;40803:6;40799:15;40792:36;40607:228;:::o;40841:182::-;40981:34;40977:1;40969:6;40965:14;40958:58;40841:182;:::o;41029:175::-;41169:27;41165:1;41157:6;41153:14;41146:51;41029:175;:::o;41210:161::-;41350:13;41346:1;41338:6;41334:14;41327:37;41210:161;:::o;41377:231::-;41517:34;41513:1;41505:6;41501:14;41494:58;41586:14;41581:2;41573:6;41569:15;41562:39;41377:231;:::o;41614:182::-;41754:34;41750:1;41742:6;41738:14;41731:58;41614:182;:::o;41802:234::-;41942:34;41938:1;41930:6;41926:14;41919:58;42011:17;42006:2;41998:6;41994:15;41987:42;41802:234;:::o;42042:182::-;42182:34;42178:1;42170:6;42166:14;42159:58;42042:182;:::o;42230:220::-;42370:34;42366:1;42358:6;42354:14;42347:58;42439:3;42434:2;42426:6;42422:15;42415:28;42230:220;:::o;42456:226::-;42596:34;42592:1;42584:6;42580:14;42573:58;42665:9;42660:2;42652:6;42648:15;42641:34;42456:226;:::o;42688:174::-;42828:26;42824:1;42816:6;42812:14;42805:50;42688:174;:::o;42868:114::-;;:::o;42988:166::-;43128:18;43124:1;43116:6;43112:14;43105:42;42988:166;:::o;43160:236::-;43300:34;43296:1;43288:6;43284:14;43277:58;43369:19;43364:2;43356:6;43352:15;43345:44;43160:236;:::o;43402:181::-;43542:33;43538:1;43530:6;43526:14;43519:57;43402:181;:::o;43589:122::-;43662:24;43680:5;43662:24;:::i;:::-;43655:5;43652:35;43642:63;;43701:1;43698;43691:12;43642:63;43589:122;:::o;43717:116::-;43787:21;43802:5;43787:21;:::i;:::-;43780:5;43777:32;43767:60;;43823:1;43820;43813:12;43767:60;43717:116;:::o;43839:120::-;43911:23;43928:5;43911:23;:::i;:::-;43904:5;43901:34;43891:62;;43949:1;43946;43939:12;43891:62;43839:120;:::o;43965:122::-;44038:24;44056:5;44038:24;:::i;:::-;44031:5;44028:35;44018:63;;44077:1;44074;44067:12;44018:63;43965:122;:::o

Swarm Source

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