Overview
ETH Balance
0.005 ETH
Eth Value
$16.48 (@ $3,296.38/ETH)More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 137 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Revealed | 16602787 | 678 days ago | IN | 0 ETH | 0.00047301 | ||||
Set Not Revealed... | 16602787 | 678 days ago | IN | 0 ETH | 0.00064604 | ||||
Set Approval For... | 16532661 | 688 days ago | IN | 0 ETH | 0.00108522 | ||||
Set Approval For... | 16451578 | 699 days ago | IN | 0 ETH | 0.00132847 | ||||
Set Approval For... | 16329483 | 716 days ago | IN | 0 ETH | 0.00118497 | ||||
Set Approval For... | 16300781 | 720 days ago | IN | 0 ETH | 0.00180272 | ||||
Public Sales Min... | 16299554 | 720 days ago | IN | 0.005 ETH | 0.00199867 | ||||
Set Approval For... | 16281781 | 723 days ago | IN | 0 ETH | 0.0007885 | ||||
Set Approval For... | 16281038 | 723 days ago | IN | 0 ETH | 0.00076409 | ||||
Set Approval For... | 16280559 | 723 days ago | IN | 0 ETH | 0.00103177 | ||||
Set Approval For... | 16278999 | 723 days ago | IN | 0 ETH | 0.00133937 | ||||
Set Approval For... | 16278998 | 723 days ago | IN | 0 ETH | 0.00134096 | ||||
Set Revealed | 16278636 | 723 days ago | IN | 0 ETH | 0.00045238 | ||||
Set Approval For... | 16278485 | 723 days ago | IN | 0 ETH | 0.00096839 | ||||
Set Approval For... | 16278221 | 723 days ago | IN | 0 ETH | 0.0010389 | ||||
Set Base Token U... | 16276677 | 723 days ago | IN | 0 ETH | 0.00125283 | ||||
Withdraw | 16235538 | 729 days ago | IN | 0 ETH | 0.00035825 | ||||
Public Sales Min... | 16212850 | 732 days ago | IN | 0.01 ETH | 0.00154762 | ||||
Public Sales Min... | 16212808 | 732 days ago | IN | 0.015 ETH | 0.00164048 | ||||
Set Approval For... | 16212805 | 732 days ago | IN | 0 ETH | 0.0008961 | ||||
Public Sales Min... | 16212803 | 732 days ago | IN | 0.01 ETH | 0.0015541 | ||||
Set Approval For... | 16212799 | 732 days ago | IN | 0 ETH | 0.00077716 | ||||
Public Sales Min... | 16212793 | 732 days ago | IN | 0.005 ETH | 0.00154779 | ||||
Public Sales Min... | 16212791 | 732 days ago | IN | 0.015 ETH | 0.00157443 | ||||
Public Sales Min... | 16212787 | 732 days ago | IN | 0.015 ETH | 0.00172643 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
16235538 | 729 days ago | 1.279 ETH |
Loading...
Loading
Contract Name:
Crockz
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-11-23 */ // File: contracts/opensea/IOperatorFilterRegistry.sol pragma solidity ^0.8.13; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } // File: contracts/opensea/OperatorFilterer.sol pragma solidity ^0.8.13; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } } // File: contracts/opensea/DefaultOperatorFilterer.sol pragma solidity ^0.8.13; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {} } // 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/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/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // 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/cryptography/ECDSA.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File: @openzeppelin/contracts/utils/cryptography/draft-EIP712.sol // OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol) pragma solidity ^0.8.0; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; address private immutable _CACHED_THIS; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _CACHED_THIS = address(this); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } } // 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: @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: erc721a/contracts/ERC721A.sol // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev This is equivalent to _burn(tokenId, false) */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: @openzeppelin/contracts/finance/PaymentSplitter.sol // OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol) pragma solidity ^0.8.0; /** * @title PaymentSplitter * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware * that the Ether will be split in this way, since it is handled transparently by the contract. * * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim * an amount proportional to the percentage of total shares they were assigned. * * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} * function. * * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you * to run tests before sending real value to this contract. */ contract PaymentSplitter is Context { event PayeeAdded(address account, uint256 shares); event PaymentReleased(address to, uint256 amount); event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount); event PaymentReceived(address from, uint256 amount); uint256 private _totalShares; uint256 private _totalReleased; mapping(address => uint256) private _shares; mapping(address => uint256) private _released; address[] private _payees; mapping(IERC20 => uint256) private _erc20TotalReleased; mapping(IERC20 => mapping(address => uint256)) private _erc20Released; /** * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at * the matching position in the `shares` array. * * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no * duplicates in `payees`. */ constructor(address[] memory payees, uint256[] memory shares_) payable { require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch"); require(payees.length > 0, "PaymentSplitter: no payees"); for (uint256 i = 0; i < payees.length; i++) { _addPayee(payees[i], shares_[i]); } } /** * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the * reliability of the events, and not the actual splitting of Ether. * * To learn more about this see the Solidity documentation for * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback * functions]. */ receive() external payable virtual { emit PaymentReceived(_msgSender(), msg.value); } /** * @dev Getter for the total shares held by payees. */ function totalShares() public view returns (uint256) { return _totalShares; } /** * @dev Getter for the total amount of Ether already released. */ function totalReleased() public view returns (uint256) { return _totalReleased; } /** * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20 * contract. */ function totalReleased(IERC20 token) public view returns (uint256) { return _erc20TotalReleased[token]; } /** * @dev Getter for the amount of shares held by an account. */ function shares(address account) public view returns (uint256) { return _shares[account]; } /** * @dev Getter for the amount of Ether already released to a payee. */ function released(address account) public view returns (uint256) { return _released[account]; } /** * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an * IERC20 contract. */ function released(IERC20 token, address account) public view returns (uint256) { return _erc20Released[token][account]; } /** * @dev Getter for the address of the payee number `index`. */ function payee(uint256 index) public view returns (address) { return _payees[index]; } /** * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the * total shares and their previous withdrawals. */ function release(address payable account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = address(this).balance + totalReleased(); uint256 payment = _pendingPayment(account, totalReceived, released(account)); require(payment != 0, "PaymentSplitter: account is not due payment"); _released[account] += payment; _totalReleased += payment; Address.sendValue(account, payment); emit PaymentReleased(account, payment); } /** * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20 * contract. */ function release(IERC20 token, address account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token); uint256 payment = _pendingPayment(account, totalReceived, released(token, account)); require(payment != 0, "PaymentSplitter: account is not due payment"); _erc20Released[token][account] += payment; _erc20TotalReleased[token] += payment; SafeERC20.safeTransfer(token, account, payment); emit ERC20PaymentReleased(token, account, payment); } /** * @dev internal logic for computing the pending payment of an `account` given the token historical balances and * already released amounts. */ function _pendingPayment( address account, uint256 totalReceived, uint256 alreadyReleased ) private view returns (uint256) { return (totalReceived * _shares[account]) / _totalShares - alreadyReleased; } /** * @dev Add a new payee to the contract. * @param account The address of the payee to add. * @param shares_ The number of shares owned by the payee. */ function _addPayee(address account, uint256 shares_) private { require(account != address(0), "PaymentSplitter: account is the zero address"); require(shares_ > 0, "PaymentSplitter: shares are 0"); require(_shares[account] == 0, "PaymentSplitter: account already has shares"); _payees.push(account); _shares[account] = shares_; _totalShares = _totalShares + shares_; emit PayeeAdded(account, shares_); } } // 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: contracts/WhiteList.sol pragma solidity ^0.8.0; contract WhiteList is Ownable, EIP712 { bytes32 constant public MINT_CALL_HASH_TYPE = keccak256("mint(address receiver)"); address public whitelistSigner; constructor() EIP712("CrockzWhiteList", "1") {} function setWhitelistSigner(address _address) external onlyOwner { whitelistSigner = _address; } function recoverSigner(address sender, bytes memory signature) public view returns (address) { return ECDSA.recover(getDigest(sender), signature); } function getDigest(address sender) public view returns (bytes32) { bytes32 messageDigest = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", ECDSA.toTypedDataHash(_domainSeparatorV4(), keccak256(abi.encode(MINT_CALL_HASH_TYPE, sender)) ))); return messageDigest; } modifier isUserWhileList(address sender, bytes memory signature) { require(recoverSigner(sender, signature) == whitelistSigner , "User is not on whitelist" ); _; } function getDomainSeparatorV4() external view onlyOwner returns (bytes32) { return _domainSeparatorV4(); } } // File: contracts/PreSales.sol pragma solidity ^0.8.0; contract PreSales is Ownable { uint256 public preSalesStartTime; uint256 public preSalesEndTime; modifier isPreSalesActive() { require( isPreSalesActivated(), "PreSalesActivation: Sale is not activated" ); _; } constructor() { //22-11-23 11:00:00 EST == 22-11-23 13:00:00 GMT-3 at this site https://www.epochconverter.com/ preSalesStartTime = 1669219200; //22-11-23 13:59:59 EST == 22-11-23 15:59:59 GMT-3 at this site https://www.epochconverter.com/ preSalesEndTime = 1669229999; } function isPreSalesActivated() public view returns (bool) { return preSalesStartTime > 0 && preSalesEndTime > 0 && block.timestamp >= preSalesStartTime && block.timestamp <= preSalesEndTime; } // 1645365600: start time at 20 Feb 2022 09:00:00 EST in seconds // 1645408799: end time at 20 Feb 2022 20:59:59 EST in seconds function setPreSalesTime(uint256 _startTime, uint256 _endTime) external onlyOwner { require( _endTime >= _startTime, "PreSalesActivation: End time should be later than start time" ); preSalesStartTime = _startTime; preSalesEndTime = _endTime; } } // File: contracts/PublicSales.sol pragma solidity ^0.8.0; contract PublicSales is Ownable { uint256 public publicSalesStartTime; modifier isPublicSalesActive() { require( isPublicSalesActivated(), "PublicSalesActivation: Sale is not activated" ); _; } constructor() { //22-11-23 14:00:00 EST == 22-11-23 16:00:00 GMT-3 at this site https://www.epochconverter.com/ publicSalesStartTime = 1669230000; } function isPublicSalesActivated() public view returns (bool) { return publicSalesStartTime > 0 && block.timestamp >= publicSalesStartTime; } // 1644069600: start time at 05 Feb 2022 (2 PM UTC+0) in seconds function setPublicSalesTime(uint256 _startTime) external onlyOwner { publicSalesStartTime = _startTime; } } // File: contracts/Crockz.sol //SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract Crockz is Ownable, PublicSales, PreSales, WhiteList, ERC721A, PaymentSplitter, DefaultOperatorFilterer{ //FOR PRODUCTION uint256 public constant TOTAL_MAX_QTY = 5555; uint256 public constant PRESALES_MAX_QTY = 5000; uint256 public constant GIFT_MAX_QTY = 25; uint256 public constant SALES_MAX_QTY = TOTAL_MAX_QTY - GIFT_MAX_QTY; uint256 public constant PRE_SALES_PRICE = 0.022 ether; uint256 public constant PUBLIC_SALES_PRICE = 0.033 ether; uint256 public constant MAX_QTY_PER_MINTER = 3; uint256 public constant MAX_QTY_PER_MINT = 3; uint256 public constant MAX_QTY_PER_MINTER_PRE_SALES = 2; address[] private addressList = [ 0x766Eae81E10E9c8D9945Eda44bFE7D1bC81989cC, 0x02A8D960944aC47e655198171093E22570A48188 ]; uint256[] private shareList = [15,85]; uint256 public preSalesMintedQty = 0; uint256 public publicSalesMintedQty = 0; uint256 public giftedQty = 0; mapping(address => uint256) public preSalesFreeMinterToTokenQty; mapping(address => uint256) public preSalesMinterToTokenQty; mapping(address => uint256) public publicSalesMinterToTokenQty; bool public canRenounceOwnership = false; bool public paused = false; bool public revealed = false; bool public customPrice = false; uint256 public custom_price = 0.033 ether; bool public customPriceWl = false; uint256 public custom_price_wl = 0.022 ether; string private baseTokenURI; string private notRevealedUri; constructor(string memory _notRevealedUri) ERC721A("Crockz", "CROCKZ") PaymentSplitter( addressList, shareList) { notRevealedUri = _notRevealedUri; } function getPrice() public view returns (uint256) { if (isPublicSalesActivated()) { if(customPrice){ return custom_price; }else{ return PUBLIC_SALES_PRICE; } }else{ if(customPriceWl){ return custom_price_wl; }else{ return PRE_SALES_PRICE; } } } function preSalesMint( uint256 _mintQty, bytes memory signature ) external payable isPreSalesActive isUserWhileList(msg.sender, signature ) { require( preSalesMintedQty + publicSalesMintedQty + _mintQty <= TOTAL_MAX_QTY, "Exceed sales max limit" ); require( preSalesMintedQty + _mintQty <= PRESALES_MAX_QTY, "Exceed pre-sales max limit" ); require( preSalesMinterToTokenQty[msg.sender] + _mintQty <= MAX_QTY_PER_MINTER_PRE_SALES, "Exceed signed quantity" ); require(tx.origin == msg.sender,"CONTRACTS_NOT_ALLOWED_TO_MINT"); require(!paused, "The contract is paused!"); require(msg.value >= _mintQty * getPrice(), "Incorrect ETH"); preSalesMinterToTokenQty[msg.sender] += _mintQty; preSalesMintedQty += _mintQty; _safeMint(msg.sender, _mintQty); } function publicSalesMint(uint256 _mintQty) external payable isPublicSalesActive { require( preSalesMintedQty + publicSalesMintedQty + _mintQty <= SALES_MAX_QTY, "Exceed sales max limit" ); require(_mintQty <= MAX_QTY_PER_MINT, "Exceed max mint per mint."); require( publicSalesMinterToTokenQty[msg.sender] + _mintQty <= MAX_QTY_PER_MINTER, "Exceed max mint per minter" ); require(tx.origin == msg.sender,"CONTRACTS_NOT_ALLOWED_TO_MINT"); require(!paused, "The contract is paused!"); require(msg.value >= _mintQty * getPrice(), "Incorrect ETH"); publicSalesMinterToTokenQty[msg.sender] += _mintQty; publicSalesMintedQty += _mintQty; _safeMint(msg.sender, _mintQty); } function gift(address[] calldata receivers) external onlyOwner { require( giftedQty + receivers.length <= GIFT_MAX_QTY, "Exceed gift max limit" ); giftedQty += receivers.length; for (uint256 i = 0; i < receivers.length; i++) { _safeMint(receivers[i], 1); } } function setCustomPriceWl(bool isCustomPriceWl, uint256 priceWl) external onlyOwner { customPriceWl = isCustomPriceWl; custom_price_wl = priceWl; } function setCustomPrice(bool isCustomPrice, uint256 price) external onlyOwner { customPrice = isCustomPrice; custom_price = price; } function setNotRevealedURI(string memory _notRevealedURI) external onlyOwner { notRevealedUri = _notRevealedURI; } function setBaseTokenURI(string memory _baseTokenURI) external onlyOwner { baseTokenURI = _baseTokenURI; } function _baseURI() internal view override virtual returns (string memory) { return baseTokenURI; } function setRevealed(bool _state) external onlyOwner { revealed = _state; } function setPaused(bool _state) external onlyOwner { paused = _state; } function setCanRenounceOwnership(bool _state) external onlyOwner { canRenounceOwnership = _state; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); if(!revealed) { return notRevealedUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, Strings.toString(tokenId))) : ""; } function renounceOwnership() override public onlyOwner{ require(canRenounceOwnership,"Not the time to Renounce Ownership"); _transferOwnership(address(0)); } function withdraw() public payable onlyOwner { (bool success, ) = payable(msg.sender).call{value: address(this).balance}(""); require(success); } function withdrawSplit() public onlyOwner { for (uint256 i = 0; i < addressList.length; i++) { address payable wallet = payable(addressList[i]); release(wallet); } } //implemetation for opensea function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_notRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","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":"GIFT_MAX_QTY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_QTY_PER_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_QTY_PER_MINTER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_QTY_PER_MINTER_PRE_SALES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_CALL_HASH_TYPE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALES_MAX_QTY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRE_SALES_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALES_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALES_MAX_QTY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_MAX_QTY","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":"canRenounceOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"customPrice","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"customPriceWl","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"custom_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"custom_price_wl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeparatorV4","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"giftedQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPreSalesActivated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSalesActivated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSalesEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"preSalesFreeMinterToTokenQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintQty","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"preSalesMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"preSalesMintedQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"preSalesMinterToTokenQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSalesStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintQty","type":"uint256"}],"name":"publicSalesMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSalesMintedQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicSalesMinterToTokenQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSalesStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"recoverSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setCanRenounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isCustomPrice","type":"bool"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setCustomPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isCustomPriceWl","type":"bool"},{"internalType":"uint256","name":"priceWl","type":"uint256"}],"name":"setCustomPriceWl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"}],"name":"setPreSalesTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"}],"name":"setPublicSalesTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setWhitelistSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"whitelistSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawSplit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
61018060405273766eae81e10e9c8d9945eda44bfe7d1bc81989cc6101409081527302a8d960944ac47e655198171093e22570a481886101605262000049906014906002620007f3565b5060408051808201909152600f8152605560208201526200006f9060159060026200085d565b50600060168190556017819055601855601c805463ffffffff1916905566753d533d968000601d55601e805460ff19169055664e28e2290f0000601f55348015620000b957600080fd5b506040516200483338038062004833833981016040819052620000dc916200094a565b733cc6cdda760b79bafa08df41ecfa224f810dceb6600160148054806020026020016040519081016040528092919081815260200182805480156200014b57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116200012c575b505050505060158054806020026020016040519081016040528092919081815260200182805480156200019e57602002820191906000526020600020905b81548152602001906001019080831162000189575b50505050506040518060400160405280600681526020016521b937b1b5bd60d11b8152506040518060400160405280600681526020016521a927a1a5ad60d11b8152506040518060400160405280600f81526020016e10dc9bd8dade95da1a5d19531a5cdd608a1b815250604051806040016040528060018152602001603160f81b8152506200023d62000237620005b160201b60201c565b620005b5565b63637e6db060015563637e438060025563637e6daf600355815160208084019190912082518383012060e08290526101008190524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81880181905281830187905260608201869052608082019490945230818401528151808203909301835260c00190528051940193909320919290916080523060c0526101205250508351620002fb9250600791506020850190620008a0565b50805162000311906008906020840190620008a0565b506000600555505080518251146200038b5760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620003de5760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f20706179656573000000000000604482015260640162000382565b60005b82518110156200044a576200043583828151811062000404576200040462000a26565b602002602001015183838151811062000421576200042162000a26565b60200260200101516200060560201b60201c565b80620004418162000a52565b915050620003e1565b5050506daaeb6d7670e522a718067333cd4e3b1562000592578015620004e057604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b158015620004c157600080fd5b505af1158015620004d6573d6000803e3d6000fd5b5050505062000592565b6001600160a01b03821615620005315760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401620004a6565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200057857600080fd5b505af11580156200058d573d6000803e3d6000fd5b505050505b50508051620005a9906021906020840190620008a0565b505062000ac5565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216620006725760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b606482015260840162000382565b60008111620006c45760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a20736861726573206172652030000000604482015260640162000382565b6001600160a01b0382166000908152600f602052604090205415620007405760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b606482015260840162000382565b60118054600181019091557f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c680180546001600160a01b0319166001600160a01b0384169081179091556000908152600f60205260409020819055600d54620007aa90829062000a6e565b600d55604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b8280548282559060005260206000209081019282156200084b579160200282015b828111156200084b57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000814565b50620008599291506200091d565b5090565b8280548282559060005260206000209081019282156200084b579160200282015b828111156200084b578251829060ff169055916020019190600101906200087e565b828054620008ae9062000a89565b90600052602060002090601f016020900481019282620008d257600085556200084b565b82601f10620008ed57805160ff19168380011785556200084b565b828001600101855582156200084b579182015b828111156200084b57825182559160200191906001019062000900565b5b808211156200085957600081556001016200091e565b634e487b7160e01b600052604160045260246000fd5b600060208083850312156200095e57600080fd5b82516001600160401b03808211156200097657600080fd5b818501915085601f8301126200098b57600080fd5b815181811115620009a057620009a062000934565b604051601f8201601f19908116603f01168101908382118183101715620009cb57620009cb62000934565b816040528281528886848701011115620009e457600080fd5b600093505b8284101562000a085784840186015181850187015292850192620009e9565b8284111562000a1a5760008684830101525b98975050505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820162000a675762000a6762000a3c565b5060010190565b6000821982111562000a845762000a8462000a3c565b500190565b600181811c9082168062000a9e57607f821691505b60208210810362000abf57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e0516101005161012051613d1e62000b15600039600061240701526000612456015260006124310152600061238a015260006123b4015260006123de0152613d1e6000f3fe60806040526004361061043f5760003560e01c806382afe55011610234578063c642c9331161012e578063dee816e6116100b6578063e985e9c51161007a578063e985e9c514610ccd578063ed39039b14610d16578063ef81b4d414610d36578063f2c4ce1e14610d56578063f2fde38b14610d7657600080fd5b8063dee816e614610c4c578063e0a8085314610c62578063e33b7de314610c82578063e53e3a0414610c97578063e6c3819c14610cb757600080fd5b8063d1ca131f116100fd578063d1ca131f14610b9b578063d338143814610bbb578063d506992414610bdb578063d6eec46a14610bfb578063d79779b214610c1657600080fd5b8063c642c93314610af1578063c688387f14610b11578063c87b56dd14610b45578063ce7c2ac214610b6557600080fd5b80639e47efb8116101bc578063ac501c4111610180578063ac501c4114610577578063ae4384f114610a91578063b7329d2b14610aa6578063b88d4fde14610abb578063bd34fc5714610adb57600080fd5b80639e47efb814610a12578063a22cb46514610a25578063a43c653614610a45578063a50e89ff14610a66578063a78a673f14610a7b57600080fd5b8063951cddd011610203578063951cddd01461096f57806395d89b411461099c5780639852595c146109b157806398d5fdca146109e75780639c123661146109fc57600080fd5b806382afe550146108e95780638b83209b146109045780638da5cb5b146109245780638f7be8f21461094257600080fd5b80633a98ef391161034557806351830227116102cd57806370a082311161029157806370a0823114610853578063715018a61461087357806373a62b5a14610888578063791eef07146108a25780637b2ca386146108cf57600080fd5b806351830227146107be5780635c975abb146107de5780635dcb46fb146107fd57806360869d9b146108135780636352211e1461083357600080fd5b806342842e0e1161031457806342842e0e1461073557806347fc6e761461075557806348b750441461076b5780634d192b831461078b5780634def4d1a1461079e57600080fd5b80633a98ef39146106b05780633ccfd60b146106c5578063406072a9146106cd57806341f434341461071357600080fd5b806316787758116103c857806323b872dd1161039757806323b872dd1461062f57806330176e131461064f5780633354fe341461066f578063397d0c0c146106845780633a4087c71461069a57600080fd5b806316787758146105c157806316c38b3c146105d657806318160ddd146105f6578063191655871461060f57600080fd5b8063081812fc1161040f578063081812fc1461051d578063095ea7b314610555578063122be4a31461057757806313c65a6e1461058c578063163e1e61146105a157600080fd5b806226275e1461048d57806301e3b436146104b557806301ffc9a7146104cb57806306fdde03146104fb57600080fd5b36610488577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561049957600080fd5b506104a2610d96565b6040519081526020015b60405180910390f35b3480156104c157600080fd5b506104a260165481565b3480156104d757600080fd5b506104eb6104e63660046135c3565b610da6565b60405190151581526020016104ac565b34801561050757600080fd5b50610510610df8565b6040516104ac9190613638565b34801561052957600080fd5b5061053d61053836600461364b565b610e8a565b6040516001600160a01b0390911681526020016104ac565b34801561056157600080fd5b50610575610570366004613679565b610ece565b005b34801561058357600080fd5b506104a2600381565b34801561059857600080fd5b506104a2610f5b565b3480156105ad57600080fd5b506105756105bc3660046136a5565b610f9c565b3480156105cd57600080fd5b506104a2600281565b3480156105e257600080fd5b506105756105f1366004613727565b611086565b34801561060257600080fd5b50600654600554036104a2565b34801561061b57600080fd5b5061057561062a366004613744565b6110ca565b34801561063b57600080fd5b5061057561064a366004613761565b6111fb565b34801561065b57600080fd5b5061057561066a36600461382d565b611226565b34801561067b57600080fd5b506104a2601981565b34801561069057600080fd5b506104a260025481565b3480156106a657600080fd5b506104a2601d5481565b3480156106bc57600080fd5b50600d546104a2565b610575611266565b3480156106d957600080fd5b506104a26106e8366004613875565b6001600160a01b03918216600090815260136020908152604080832093909416825291909152205490565b34801561071f57600080fd5b5061053d6daaeb6d7670e522a718067333cd4e81565b34801561074157600080fd5b50610575610750366004613761565b6112e8565b34801561076157600080fd5b506104a261138881565b34801561077757600080fd5b50610575610786366004613875565b61130d565b61057561079936600461364b565b6114e9565b3480156107aa57600080fd5b506105756107b9366004613727565b6117b8565b3480156107ca57600080fd5b50601c546104eb9062010000900460ff1681565b3480156107ea57600080fd5b50601c546104eb90610100900460ff1681565b34801561080957600080fd5b506104a2601f5481565b34801561081f57600080fd5b5061057561082e36600461364b565b6117f5565b34801561083f57600080fd5b5061053d61084e36600461364b565b611824565b34801561085f57600080fd5b506104a261086e366004613744565b611836565b34801561087f57600080fd5b50610575611884565b34801561089457600080fd5b50601e546104eb9060ff1681565b3480156108ae57600080fd5b506104a26108bd366004613744565b601a6020526000908152604090205481565b3480156108db57600080fd5b50601c546104eb9060ff1681565b3480156108f557600080fd5b506104a2664e28e2290f000081565b34801561091057600080fd5b5061053d61091f36600461364b565b611917565b34801561093057600080fd5b506000546001600160a01b031661053d565b34801561094e57600080fd5b506104a261095d366004613744565b601b6020526000908152604090205481565b34801561097b57600080fd5b506104a261098a366004613744565b60196020526000908152604090205481565b3480156109a857600080fd5b50610510611947565b3480156109bd57600080fd5b506104a26109cc366004613744565b6001600160a01b031660009081526010602052604090205490565b3480156109f357600080fd5b506104a2611956565b348015610a0857600080fd5b506104a260175481565b610575610a203660046138ce565b6119a8565b348015610a3157600080fd5b50610575610a40366004613914565b611ce1565b348015610a5157600080fd5b50601c546104eb906301000000900460ff1681565b348015610a7257600080fd5b50610575611cf5565b348015610a8757600080fd5b506104a260035481565b348015610a9d57600080fd5b506104eb611d74565b348015610ab257600080fd5b506104eb611d8c565b348015610ac757600080fd5b50610575610ad6366004613942565b611dc0565b348015610ae757600080fd5b506104a260185481565b348015610afd57600080fd5b50610575610b0c3660046139ad565b611ded565b348015610b1d57600080fd5b506104a27ff59780ff8f4ba89ed09d6c9fc5aec79093994c7234326cb09aafc9bf724f074181565b348015610b5157600080fd5b50610510610b6036600461364b565b611e2e565b348015610b7157600080fd5b506104a2610b80366004613744565b6001600160a01b03166000908152600f602052604090205490565b348015610ba757600080fd5b506104a2610bb6366004613744565b611f9b565b348015610bc757600080fd5b50610575610bd6366004613744565b612083565b348015610be757600080fd5b50610575610bf63660046139ad565b6120cf565b348015610c0757600080fd5b506104a266753d533d96800081565b348015610c2257600080fd5b506104a2610c31366004613744565b6001600160a01b031660009081526012602052604090205490565b348015610c5857600080fd5b506104a26115b381565b348015610c6e57600080fd5b50610575610c7d366004613727565b61211b565b348015610c8e57600080fd5b50600e546104a2565b348015610ca357600080fd5b5061053d610cb23660046139cb565b612161565b348015610cc357600080fd5b506104a260015481565b348015610cd957600080fd5b506104eb610ce8366004613875565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205460ff1690565b348015610d2257600080fd5b50610575610d31366004613a04565b612175565b348015610d4257600080fd5b5060045461053d906001600160a01b031681565b348015610d6257600080fd5b50610575610d7136600461382d565b612220565b348015610d8257600080fd5b50610575610d91366004613744565b61225d565b610da360196115b3613a3c565b81565b60006001600160e01b031982166380ac58cd60e01b1480610dd757506001600160e01b03198216635b5e139f60e01b145b80610df257506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060078054610e0790613a53565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3390613a53565b8015610e805780601f10610e5557610100808354040283529160200191610e80565b820191906000526020600020905b815481529060010190602001808311610e6357829003601f168201915b5050505050905090565b6000610e95826122f5565b610eb2576040516333d1c03960e21b815260040160405180910390fd5b506000908152600b60205260409020546001600160a01b031690565b6000610ed982611824565b9050806001600160a01b0316836001600160a01b031603610f0d5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610f2d5750610f2b8133610ce8565b155b15610f4b576040516367d9dca160e11b815260040160405180910390fd5b610f56838383612321565b505050565b600080546001600160a01b03163314610f8f5760405162461bcd60e51b8152600401610f8690613a8d565b60405180910390fd5b610f9761237d565b905090565b6000546001600160a01b03163314610fc65760405162461bcd60e51b8152600401610f8690613a8d565b601854601990610fd7908390613ac2565b111561101d5760405162461bcd60e51b8152602060048201526015602482015274115e18d959590819da599d081b585e081b1a5b5a5d605a1b6044820152606401610f86565b81819050601860008282546110329190613ac2565b90915550600090505b81811015610f565761107483838381811061105857611058613ada565b905060200201602081019061106d9190613744565b60016124a4565b8061107e81613af0565b91505061103b565b6000546001600160a01b031633146110b05760405162461bcd60e51b8152600401610f8690613a8d565b601c80549115156101000261ff0019909216919091179055565b6001600160a01b0381166000908152600f60205260409020546110ff5760405162461bcd60e51b8152600401610f8690613b09565b600061110a600e5490565b6111149047613ac2565b90506000611141838361113c866001600160a01b031660009081526010602052604090205490565b6124be565b9050806000036111635760405162461bcd60e51b8152600401610f8690613b4f565b6001600160a01b0383166000908152601060205260408120805483929061118b908490613ac2565b9250508190555080600e60008282546111a49190613ac2565b909155506111b490508382612504565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b826001600160a01b0381163314611215576112153361261d565b6112208484846126d6565b50505050565b6000546001600160a01b031633146112505760405162461bcd60e51b8152600401610f8690613a8d565b80516112629060209081840190613514565b5050565b6000546001600160a01b031633146112905760405162461bcd60e51b8152600401610f8690613a8d565b604051600090339047908381818185875af1925050503d80600081146112d2576040519150601f19603f3d011682016040523d82523d6000602084013e6112d7565b606091505b50509050806112e557600080fd5b50565b826001600160a01b0381163314611302576113023361261d565b6112208484846126e1565b6001600160a01b0381166000908152600f60205260409020546113425760405162461bcd60e51b8152600401610f8690613b09565b6001600160a01b0382166000908152601260205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa15801561139f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c39190613b9a565b6113cd9190613ac2565b90506000611406838361113c87876001600160a01b03918216600090815260136020908152604080832093909416825291909152205490565b9050806000036114285760405162461bcd60e51b8152600401610f8690613b4f565b6001600160a01b0380851660009081526013602090815260408083209387168352929052908120805483929061145f908490613ac2565b90915550506001600160a01b0384166000908152601260205260408120805483929061148c908490613ac2565b9091555061149d90508484836126fc565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b6114f1611d74565b6115525760405162461bcd60e51b815260206004820152602c60248201527f5075626c696353616c657341637469766174696f6e3a2053616c65206973206e60448201526b1bdd081858dd1a5d985d195960a21b6064820152608401610f86565b61155f60196115b3613a3c565b816017546016546115709190613ac2565b61157a9190613ac2565b11156115c15760405162461bcd60e51b8152602060048201526016602482015275115e18d95959081cd85b195cc81b585e081b1a5b5a5d60521b6044820152606401610f86565b60038111156116125760405162461bcd60e51b815260206004820152601960248201527f457863656564206d6178206d696e7420706572206d696e742e000000000000006044820152606401610f86565b336000908152601b6020526040902054600390611630908390613ac2565b111561167e5760405162461bcd60e51b815260206004820152601a60248201527f457863656564206d6178206d696e7420706572206d696e7465720000000000006044820152606401610f86565b3233146116cd5760405162461bcd60e51b815260206004820152601d60248201527f434f4e5452414354535f4e4f545f414c4c4f5745445f544f5f4d494e540000006044820152606401610f86565b601c54610100900460ff161561171f5760405162461bcd60e51b815260206004820152601760248201527654686520636f6e7472616374206973207061757365642160481b6044820152606401610f86565b611727611956565b6117319082613bb3565b3410156117705760405162461bcd60e51b815260206004820152600d60248201526c092dcc6dee4e4cac6e8408aa89609b1b6044820152606401610f86565b336000908152601b60205260408120805483929061178f908490613ac2565b9250508190555080601760008282546117a89190613ac2565b909155506112e5905033826124a4565b6000546001600160a01b031633146117e25760405162461bcd60e51b8152600401610f8690613a8d565b601c805460ff1916911515919091179055565b6000546001600160a01b0316331461181f5760405162461bcd60e51b8152600401610f8690613a8d565b600155565b600061182f8261274e565b5192915050565b60006001600160a01b03821661185f576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600a60205260409020546001600160401b031690565b6000546001600160a01b031633146118ae5760405162461bcd60e51b8152600401610f8690613a8d565b601c5460ff1661190b5760405162461bcd60e51b815260206004820152602260248201527f4e6f74207468652074696d6520746f2052656e6f756e6365204f776e65727368604482015261069760f41b6064820152608401610f86565b6119156000612868565b565b60006011828154811061192c5761192c613ada565b6000918252602090912001546001600160a01b031692915050565b606060088054610e0790613a53565b6000611960611d74565b1561198a57601c546301000000900460ff161561197e5750601d5490565b5066753d533d96800090565b601e5460ff161561199c5750601f5490565b50664e28e2290f000090565b6119b0611d8c565b611a0e5760405162461bcd60e51b815260206004820152602960248201527f50726553616c657341637469766174696f6e3a2053616c65206973206e6f74206044820152681858dd1a5d985d195960ba1b6064820152608401610f86565b600454339082906001600160a01b0316611a288383612161565b6001600160a01b031614611a7e5760405162461bcd60e51b815260206004820152601860248201527f55736572206973206e6f74206f6e2077686974656c69737400000000000000006044820152606401610f86565b6115b384601754601654611a929190613ac2565b611a9c9190613ac2565b1115611ae35760405162461bcd60e51b8152602060048201526016602482015275115e18d95959081cd85b195cc81b585e081b1a5b5a5d60521b6044820152606401610f86565b61138884601654611af49190613ac2565b1115611b425760405162461bcd60e51b815260206004820152601a60248201527f457863656564207072652d73616c6573206d6178206c696d69740000000000006044820152606401610f86565b336000908152601a6020526040902054600290611b60908690613ac2565b1115611ba75760405162461bcd60e51b8152602060048201526016602482015275457863656564207369676e6564207175616e7469747960501b6044820152606401610f86565b323314611bf65760405162461bcd60e51b815260206004820152601d60248201527f434f4e5452414354535f4e4f545f414c4c4f5745445f544f5f4d494e540000006044820152606401610f86565b601c54610100900460ff1615611c485760405162461bcd60e51b815260206004820152601760248201527654686520636f6e7472616374206973207061757365642160481b6044820152606401610f86565b611c50611956565b611c5a9085613bb3565b341015611c995760405162461bcd60e51b815260206004820152600d60248201526c092dcc6dee4e4cac6e8408aa89609b1b6044820152606401610f86565b336000908152601a602052604081208054869290611cb8908490613ac2565b925050819055508360166000828254611cd19190613ac2565b90915550611220905033856124a4565b81611ceb8161261d565b610f5683836128b8565b6000546001600160a01b03163314611d1f5760405162461bcd60e51b8152600401610f8690613a8d565b60005b6014548110156112e557600060148281548110611d4157611d41613ada565b6000918252602090912001546001600160a01b03169050611d61816110ca565b5080611d6c81613af0565b915050611d22565b600080600154118015610f9757505060015442101590565b600080600254118015611da157506000600354115b8015611daf57506002544210155b8015610f9757505060035442111590565b836001600160a01b0381163314611dda57611dda3361261d565b611de68585858561294d565b5050505050565b6000546001600160a01b03163314611e175760405162461bcd60e51b8152600401610f8690613a8d565b601e805460ff191692151592909217909155601f55565b6060611e39826122f5565b611e9d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610f86565b601c5462010000900460ff16611f3f5760218054611eba90613a53565b80601f0160208091040260200160405190810160405280929190818152602001828054611ee690613a53565b8015611f335780601f10611f0857610100808354040283529160200191611f33565b820191906000526020600020905b815481529060010190602001808311611f1657829003601f168201915b50505050509050919050565b6000611f49612998565b90506000815111611f695760405180602001604052806000815250611f94565b80611f73846129a7565b604051602001611f84929190613bd2565b6040516020818303038152906040525b9392505050565b600080612030611fa961237d565b604080517ff59780ff8f4ba89ed09d6c9fc5aec79093994c7234326cb09aafc9bf724f07416020808301919091526001600160a01b0388168284015282518083038401815260608301845280519082012061190160f01b6080840152608283019490945260a2808301949094528251808303909401845260c2909101909152815191012090565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c810191909152605c0160408051601f1981840301815291905280516020909101209392505050565b6000546001600160a01b031633146120ad5760405162461bcd60e51b8152600401610f8690613a8d565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146120f95760405162461bcd60e51b8152600401610f8690613a8d565b601c805492151563010000000263ff0000001990931692909217909155601d55565b6000546001600160a01b031633146121455760405162461bcd60e51b8152600401610f8690613a8d565b601c8054911515620100000262ff000019909216919091179055565b6000611f9461216f84611f9b565b83612aa7565b6000546001600160a01b0316331461219f5760405162461bcd60e51b8152600401610f8690613a8d565b818110156122155760405162461bcd60e51b815260206004820152603c60248201527f50726553616c657341637469766174696f6e3a20456e642074696d652073686f60448201527f756c64206265206c61746572207468616e2073746172742074696d65000000006064820152608401610f86565b600291909155600355565b6000546001600160a01b0316331461224a5760405162461bcd60e51b8152600401610f8690613a8d565b8051611262906021906020840190613514565b6000546001600160a01b031633146122875760405162461bcd60e51b8152600401610f8690613a8d565b6001600160a01b0381166122ec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f86565b6112e581612868565b600060055482108015610df2575050600090815260096020526040902054600160e01b900460ff161590565b6000828152600b602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156123d657507f000000000000000000000000000000000000000000000000000000000000000046145b1561240057507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b611262828260405180602001604052806000815250612acb565b600d546001600160a01b0384166000908152600f6020526040812054909183916124e89086613bb3565b6124f29190613c17565b6124fc9190613a3c565b949350505050565b804710156125545760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610f86565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146125a1576040519150601f19603f3d011682016040523d82523d6000602084013e6125a6565b606091505b5050905080610f565760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610f86565b6daaeb6d7670e522a718067333cd4e3b156112e557604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa15801561268a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ae9190613c2b565b6112e557604051633b79c77360e21b81526001600160a01b0382166004820152602401610f86565b610f56838383612ad8565b610f5683838360405180602001604052806000815250611dc0565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610f56908490612cc3565b60408051606081018252600080825260208201819052918101919091528160055481101561284f57600081815260096020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615159181018290529061284d5780516001600160a01b0316156127e4579392505050565b5060001901600081815260096020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612848579392505050565b6127e4565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b336001600160a01b038316036128e15760405163b06307db60e01b815260040160405180910390fd5b336000818152600c602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b612958848484612ad8565b6001600160a01b0383163b1515801561297a575061297884848484612d95565b155b15611220576040516368d2bf6b60e11b815260040160405180910390fd5b606060208054610e0790613a53565b6060816000036129ce5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156129f857806129e281613af0565b91506129f19050600a83613c17565b91506129d2565b6000816001600160401b03811115612a1257612a126137a2565b6040519080825280601f01601f191660200182016040528015612a3c576020820181803683370190505b5090505b84156124fc57612a51600183613a3c565b9150612a5e600a86613c48565b612a69906030613ac2565b60f81b818381518110612a7e57612a7e613ada565b60200101906001600160f81b031916908160001a905350612aa0600a86613c17565b9450612a40565b6000806000612ab68585612e80565b91509150612ac381612eee565b509392505050565b610f5683838360016130a4565b6000612ae38261274e565b9050836001600160a01b031681600001516001600160a01b031614612b1a5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480612b385750612b388533610ce8565b80612b53575033612b4884610e8a565b6001600160a01b0316145b905080612b7357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416612b9a57604051633a954ecd60e21b815260040160405180910390fd5b612ba660008487612321565b6001600160a01b038581166000908152600a60209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600990945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116612c7a576005548214612c7a57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611de6565b6000612d18826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166132759092919063ffffffff16565b805190915015610f565780806020019051810190612d369190613c2b565b610f565760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610f86565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612dca903390899088908890600401613c5c565b6020604051808303816000875af1925050508015612e05575060408051601f3d908101601f19168201909252612e0291810190613c99565b60015b612e63573d808015612e33576040519150601f19603f3d011682016040523d82523d6000602084013e612e38565b606091505b508051600003612e5b576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000808251604103612eb65760208301516040840151606085015160001a612eaa87828585613284565b94509450505050612ee7565b8251604003612edf5760208301516040840151612ed4868383613371565b935093505050612ee7565b506000905060025b9250929050565b6000816004811115612f0257612f02613cb6565b03612f0a5750565b6001816004811115612f1e57612f1e613cb6565b03612f6b5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610f86565b6002816004811115612f7f57612f7f613cb6565b03612fcc5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610f86565b6003816004811115612fe057612fe0613cb6565b036130385760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610f86565b600481600481111561304c5761304c613cb6565b036112e55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610f86565b6005546001600160a01b0385166130cd57604051622e076360e81b815260040160405180910390fd5b836000036130ee5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b0385166000818152600a6020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600990925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561319f57506001600160a01b0387163b15155b15613227575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46131f06000888480600101955088612d95565b61320d576040516368d2bf6b60e11b815260040160405180910390fd5b8082036131a557826005541461322257600080fd5b61326c565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808203613228575b50600555611de6565b60606124fc84846000856133aa565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156132bb5750600090506003613368565b8460ff16601b141580156132d357508460ff16601c14155b156132e45750600090506004613368565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613338573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661336157600060019250925050613368565b9150600090505b94509492505050565b6000806001600160ff1b0383168161338e60ff86901c601b613ac2565b905061339c87828885613284565b935093505050935093915050565b60608247101561340b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610f86565b6001600160a01b0385163b6134625760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610f86565b600080866001600160a01b0316858760405161347e9190613ccc565b60006040518083038185875af1925050503d80600081146134bb576040519150601f19603f3d011682016040523d82523d6000602084013e6134c0565b606091505b50915091506134d08282866134db565b979650505050505050565b606083156134ea575081611f94565b8251156134fa5782518084602001fd5b8160405162461bcd60e51b8152600401610f869190613638565b82805461352090613a53565b90600052602060002090601f0160209004810192826135425760008555613588565b82601f1061355b57805160ff1916838001178555613588565b82800160010185558215613588579182015b8281111561358857825182559160200191906001019061356d565b50613594929150613598565b5090565b5b808211156135945760008155600101613599565b6001600160e01b0319811681146112e557600080fd5b6000602082840312156135d557600080fd5b8135611f94816135ad565b60005b838110156135fb5781810151838201526020016135e3565b838111156112205750506000910152565b600081518084526136248160208601602086016135e0565b601f01601f19169290920160200192915050565b602081526000611f94602083018461360c565b60006020828403121561365d57600080fd5b5035919050565b6001600160a01b03811681146112e557600080fd5b6000806040838503121561368c57600080fd5b823561369781613664565b946020939093013593505050565b600080602083850312156136b857600080fd5b82356001600160401b03808211156136cf57600080fd5b818501915085601f8301126136e357600080fd5b8135818111156136f257600080fd5b8660208260051b850101111561370757600080fd5b60209290920196919550909350505050565b80151581146112e557600080fd5b60006020828403121561373957600080fd5b8135611f9481613719565b60006020828403121561375657600080fd5b8135611f9481613664565b60008060006060848603121561377657600080fd5b833561378181613664565b9250602084013561379181613664565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b03808411156137d2576137d26137a2565b604051601f8501601f19908116603f011681019082821181831017156137fa576137fa6137a2565b8160405280935085815286868601111561381357600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561383f57600080fd5b81356001600160401b0381111561385557600080fd5b8201601f8101841361386657600080fd5b6124fc848235602084016137b8565b6000806040838503121561388857600080fd5b823561389381613664565b915060208301356138a381613664565b809150509250929050565b600082601f8301126138bf57600080fd5b611f94838335602085016137b8565b600080604083850312156138e157600080fd5b8235915060208301356001600160401b038111156138fe57600080fd5b61390a858286016138ae565b9150509250929050565b6000806040838503121561392757600080fd5b823561393281613664565b915060208301356138a381613719565b6000806000806080858703121561395857600080fd5b843561396381613664565b9350602085013561397381613664565b92506040850135915060608501356001600160401b0381111561399557600080fd5b6139a1878288016138ae565b91505092959194509250565b600080604083850312156139c057600080fd5b823561369781613719565b600080604083850312156139de57600080fd5b82356139e981613664565b915060208301356001600160401b038111156138fe57600080fd5b60008060408385031215613a1757600080fd5b50508035926020909101359150565b634e487b7160e01b600052601160045260246000fd5b600082821015613a4e57613a4e613a26565b500390565b600181811c90821680613a6757607f821691505b602082108103613a8757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115613ad557613ad5613a26565b500190565b634e487b7160e01b600052603260045260246000fd5b600060018201613b0257613b02613a26565b5060010190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b600060208284031215613bac57600080fd5b5051919050565b6000816000190483118215151615613bcd57613bcd613a26565b500290565b60008351613be48184602088016135e0565b835190830190613bf88183602088016135e0565b01949350505050565b634e487b7160e01b600052601260045260246000fd5b600082613c2657613c26613c01565b500490565b600060208284031215613c3d57600080fd5b8151611f9481613719565b600082613c5757613c57613c01565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613c8f9083018461360c565b9695505050505050565b600060208284031215613cab57600080fd5b8151611f94816135ad565b634e487b7160e01b600052602160045260246000fd5b60008251613cde8184602087016135e0565b919091019291505056fea264697066735822122073b75b2203dc91cb8a4d30f21f1fca79122293ec9a1ed9f8e57496c108e3554864736f6c634300080d00330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005368747470733a2f2f6e66742d646174612e6d7970696e6174612e636c6f75642f697066732f516d50706668415a79416a5535313774633837756a566d6f5033696f4455444b376a43624c366a7256446b45556900000000000000000000000000
Deployed Bytecode
0x60806040526004361061043f5760003560e01c806382afe55011610234578063c642c9331161012e578063dee816e6116100b6578063e985e9c51161007a578063e985e9c514610ccd578063ed39039b14610d16578063ef81b4d414610d36578063f2c4ce1e14610d56578063f2fde38b14610d7657600080fd5b8063dee816e614610c4c578063e0a8085314610c62578063e33b7de314610c82578063e53e3a0414610c97578063e6c3819c14610cb757600080fd5b8063d1ca131f116100fd578063d1ca131f14610b9b578063d338143814610bbb578063d506992414610bdb578063d6eec46a14610bfb578063d79779b214610c1657600080fd5b8063c642c93314610af1578063c688387f14610b11578063c87b56dd14610b45578063ce7c2ac214610b6557600080fd5b80639e47efb8116101bc578063ac501c4111610180578063ac501c4114610577578063ae4384f114610a91578063b7329d2b14610aa6578063b88d4fde14610abb578063bd34fc5714610adb57600080fd5b80639e47efb814610a12578063a22cb46514610a25578063a43c653614610a45578063a50e89ff14610a66578063a78a673f14610a7b57600080fd5b8063951cddd011610203578063951cddd01461096f57806395d89b411461099c5780639852595c146109b157806398d5fdca146109e75780639c123661146109fc57600080fd5b806382afe550146108e95780638b83209b146109045780638da5cb5b146109245780638f7be8f21461094257600080fd5b80633a98ef391161034557806351830227116102cd57806370a082311161029157806370a0823114610853578063715018a61461087357806373a62b5a14610888578063791eef07146108a25780637b2ca386146108cf57600080fd5b806351830227146107be5780635c975abb146107de5780635dcb46fb146107fd57806360869d9b146108135780636352211e1461083357600080fd5b806342842e0e1161031457806342842e0e1461073557806347fc6e761461075557806348b750441461076b5780634d192b831461078b5780634def4d1a1461079e57600080fd5b80633a98ef39146106b05780633ccfd60b146106c5578063406072a9146106cd57806341f434341461071357600080fd5b806316787758116103c857806323b872dd1161039757806323b872dd1461062f57806330176e131461064f5780633354fe341461066f578063397d0c0c146106845780633a4087c71461069a57600080fd5b806316787758146105c157806316c38b3c146105d657806318160ddd146105f6578063191655871461060f57600080fd5b8063081812fc1161040f578063081812fc1461051d578063095ea7b314610555578063122be4a31461057757806313c65a6e1461058c578063163e1e61146105a157600080fd5b806226275e1461048d57806301e3b436146104b557806301ffc9a7146104cb57806306fdde03146104fb57600080fd5b36610488577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561049957600080fd5b506104a2610d96565b6040519081526020015b60405180910390f35b3480156104c157600080fd5b506104a260165481565b3480156104d757600080fd5b506104eb6104e63660046135c3565b610da6565b60405190151581526020016104ac565b34801561050757600080fd5b50610510610df8565b6040516104ac9190613638565b34801561052957600080fd5b5061053d61053836600461364b565b610e8a565b6040516001600160a01b0390911681526020016104ac565b34801561056157600080fd5b50610575610570366004613679565b610ece565b005b34801561058357600080fd5b506104a2600381565b34801561059857600080fd5b506104a2610f5b565b3480156105ad57600080fd5b506105756105bc3660046136a5565b610f9c565b3480156105cd57600080fd5b506104a2600281565b3480156105e257600080fd5b506105756105f1366004613727565b611086565b34801561060257600080fd5b50600654600554036104a2565b34801561061b57600080fd5b5061057561062a366004613744565b6110ca565b34801561063b57600080fd5b5061057561064a366004613761565b6111fb565b34801561065b57600080fd5b5061057561066a36600461382d565b611226565b34801561067b57600080fd5b506104a2601981565b34801561069057600080fd5b506104a260025481565b3480156106a657600080fd5b506104a2601d5481565b3480156106bc57600080fd5b50600d546104a2565b610575611266565b3480156106d957600080fd5b506104a26106e8366004613875565b6001600160a01b03918216600090815260136020908152604080832093909416825291909152205490565b34801561071f57600080fd5b5061053d6daaeb6d7670e522a718067333cd4e81565b34801561074157600080fd5b50610575610750366004613761565b6112e8565b34801561076157600080fd5b506104a261138881565b34801561077757600080fd5b50610575610786366004613875565b61130d565b61057561079936600461364b565b6114e9565b3480156107aa57600080fd5b506105756107b9366004613727565b6117b8565b3480156107ca57600080fd5b50601c546104eb9062010000900460ff1681565b3480156107ea57600080fd5b50601c546104eb90610100900460ff1681565b34801561080957600080fd5b506104a2601f5481565b34801561081f57600080fd5b5061057561082e36600461364b565b6117f5565b34801561083f57600080fd5b5061053d61084e36600461364b565b611824565b34801561085f57600080fd5b506104a261086e366004613744565b611836565b34801561087f57600080fd5b50610575611884565b34801561089457600080fd5b50601e546104eb9060ff1681565b3480156108ae57600080fd5b506104a26108bd366004613744565b601a6020526000908152604090205481565b3480156108db57600080fd5b50601c546104eb9060ff1681565b3480156108f557600080fd5b506104a2664e28e2290f000081565b34801561091057600080fd5b5061053d61091f36600461364b565b611917565b34801561093057600080fd5b506000546001600160a01b031661053d565b34801561094e57600080fd5b506104a261095d366004613744565b601b6020526000908152604090205481565b34801561097b57600080fd5b506104a261098a366004613744565b60196020526000908152604090205481565b3480156109a857600080fd5b50610510611947565b3480156109bd57600080fd5b506104a26109cc366004613744565b6001600160a01b031660009081526010602052604090205490565b3480156109f357600080fd5b506104a2611956565b348015610a0857600080fd5b506104a260175481565b610575610a203660046138ce565b6119a8565b348015610a3157600080fd5b50610575610a40366004613914565b611ce1565b348015610a5157600080fd5b50601c546104eb906301000000900460ff1681565b348015610a7257600080fd5b50610575611cf5565b348015610a8757600080fd5b506104a260035481565b348015610a9d57600080fd5b506104eb611d74565b348015610ab257600080fd5b506104eb611d8c565b348015610ac757600080fd5b50610575610ad6366004613942565b611dc0565b348015610ae757600080fd5b506104a260185481565b348015610afd57600080fd5b50610575610b0c3660046139ad565b611ded565b348015610b1d57600080fd5b506104a27ff59780ff8f4ba89ed09d6c9fc5aec79093994c7234326cb09aafc9bf724f074181565b348015610b5157600080fd5b50610510610b6036600461364b565b611e2e565b348015610b7157600080fd5b506104a2610b80366004613744565b6001600160a01b03166000908152600f602052604090205490565b348015610ba757600080fd5b506104a2610bb6366004613744565b611f9b565b348015610bc757600080fd5b50610575610bd6366004613744565b612083565b348015610be757600080fd5b50610575610bf63660046139ad565b6120cf565b348015610c0757600080fd5b506104a266753d533d96800081565b348015610c2257600080fd5b506104a2610c31366004613744565b6001600160a01b031660009081526012602052604090205490565b348015610c5857600080fd5b506104a26115b381565b348015610c6e57600080fd5b50610575610c7d366004613727565b61211b565b348015610c8e57600080fd5b50600e546104a2565b348015610ca357600080fd5b5061053d610cb23660046139cb565b612161565b348015610cc357600080fd5b506104a260015481565b348015610cd957600080fd5b506104eb610ce8366004613875565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205460ff1690565b348015610d2257600080fd5b50610575610d31366004613a04565b612175565b348015610d4257600080fd5b5060045461053d906001600160a01b031681565b348015610d6257600080fd5b50610575610d7136600461382d565b612220565b348015610d8257600080fd5b50610575610d91366004613744565b61225d565b610da360196115b3613a3c565b81565b60006001600160e01b031982166380ac58cd60e01b1480610dd757506001600160e01b03198216635b5e139f60e01b145b80610df257506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060078054610e0790613a53565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3390613a53565b8015610e805780601f10610e5557610100808354040283529160200191610e80565b820191906000526020600020905b815481529060010190602001808311610e6357829003601f168201915b5050505050905090565b6000610e95826122f5565b610eb2576040516333d1c03960e21b815260040160405180910390fd5b506000908152600b60205260409020546001600160a01b031690565b6000610ed982611824565b9050806001600160a01b0316836001600160a01b031603610f0d5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610f2d5750610f2b8133610ce8565b155b15610f4b576040516367d9dca160e11b815260040160405180910390fd5b610f56838383612321565b505050565b600080546001600160a01b03163314610f8f5760405162461bcd60e51b8152600401610f8690613a8d565b60405180910390fd5b610f9761237d565b905090565b6000546001600160a01b03163314610fc65760405162461bcd60e51b8152600401610f8690613a8d565b601854601990610fd7908390613ac2565b111561101d5760405162461bcd60e51b8152602060048201526015602482015274115e18d959590819da599d081b585e081b1a5b5a5d605a1b6044820152606401610f86565b81819050601860008282546110329190613ac2565b90915550600090505b81811015610f565761107483838381811061105857611058613ada565b905060200201602081019061106d9190613744565b60016124a4565b8061107e81613af0565b91505061103b565b6000546001600160a01b031633146110b05760405162461bcd60e51b8152600401610f8690613a8d565b601c80549115156101000261ff0019909216919091179055565b6001600160a01b0381166000908152600f60205260409020546110ff5760405162461bcd60e51b8152600401610f8690613b09565b600061110a600e5490565b6111149047613ac2565b90506000611141838361113c866001600160a01b031660009081526010602052604090205490565b6124be565b9050806000036111635760405162461bcd60e51b8152600401610f8690613b4f565b6001600160a01b0383166000908152601060205260408120805483929061118b908490613ac2565b9250508190555080600e60008282546111a49190613ac2565b909155506111b490508382612504565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b826001600160a01b0381163314611215576112153361261d565b6112208484846126d6565b50505050565b6000546001600160a01b031633146112505760405162461bcd60e51b8152600401610f8690613a8d565b80516112629060209081840190613514565b5050565b6000546001600160a01b031633146112905760405162461bcd60e51b8152600401610f8690613a8d565b604051600090339047908381818185875af1925050503d80600081146112d2576040519150601f19603f3d011682016040523d82523d6000602084013e6112d7565b606091505b50509050806112e557600080fd5b50565b826001600160a01b0381163314611302576113023361261d565b6112208484846126e1565b6001600160a01b0381166000908152600f60205260409020546113425760405162461bcd60e51b8152600401610f8690613b09565b6001600160a01b0382166000908152601260205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa15801561139f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c39190613b9a565b6113cd9190613ac2565b90506000611406838361113c87876001600160a01b03918216600090815260136020908152604080832093909416825291909152205490565b9050806000036114285760405162461bcd60e51b8152600401610f8690613b4f565b6001600160a01b0380851660009081526013602090815260408083209387168352929052908120805483929061145f908490613ac2565b90915550506001600160a01b0384166000908152601260205260408120805483929061148c908490613ac2565b9091555061149d90508484836126fc565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b6114f1611d74565b6115525760405162461bcd60e51b815260206004820152602c60248201527f5075626c696353616c657341637469766174696f6e3a2053616c65206973206e60448201526b1bdd081858dd1a5d985d195960a21b6064820152608401610f86565b61155f60196115b3613a3c565b816017546016546115709190613ac2565b61157a9190613ac2565b11156115c15760405162461bcd60e51b8152602060048201526016602482015275115e18d95959081cd85b195cc81b585e081b1a5b5a5d60521b6044820152606401610f86565b60038111156116125760405162461bcd60e51b815260206004820152601960248201527f457863656564206d6178206d696e7420706572206d696e742e000000000000006044820152606401610f86565b336000908152601b6020526040902054600390611630908390613ac2565b111561167e5760405162461bcd60e51b815260206004820152601a60248201527f457863656564206d6178206d696e7420706572206d696e7465720000000000006044820152606401610f86565b3233146116cd5760405162461bcd60e51b815260206004820152601d60248201527f434f4e5452414354535f4e4f545f414c4c4f5745445f544f5f4d494e540000006044820152606401610f86565b601c54610100900460ff161561171f5760405162461bcd60e51b815260206004820152601760248201527654686520636f6e7472616374206973207061757365642160481b6044820152606401610f86565b611727611956565b6117319082613bb3565b3410156117705760405162461bcd60e51b815260206004820152600d60248201526c092dcc6dee4e4cac6e8408aa89609b1b6044820152606401610f86565b336000908152601b60205260408120805483929061178f908490613ac2565b9250508190555080601760008282546117a89190613ac2565b909155506112e5905033826124a4565b6000546001600160a01b031633146117e25760405162461bcd60e51b8152600401610f8690613a8d565b601c805460ff1916911515919091179055565b6000546001600160a01b0316331461181f5760405162461bcd60e51b8152600401610f8690613a8d565b600155565b600061182f8261274e565b5192915050565b60006001600160a01b03821661185f576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600a60205260409020546001600160401b031690565b6000546001600160a01b031633146118ae5760405162461bcd60e51b8152600401610f8690613a8d565b601c5460ff1661190b5760405162461bcd60e51b815260206004820152602260248201527f4e6f74207468652074696d6520746f2052656e6f756e6365204f776e65727368604482015261069760f41b6064820152608401610f86565b6119156000612868565b565b60006011828154811061192c5761192c613ada565b6000918252602090912001546001600160a01b031692915050565b606060088054610e0790613a53565b6000611960611d74565b1561198a57601c546301000000900460ff161561197e5750601d5490565b5066753d533d96800090565b601e5460ff161561199c5750601f5490565b50664e28e2290f000090565b6119b0611d8c565b611a0e5760405162461bcd60e51b815260206004820152602960248201527f50726553616c657341637469766174696f6e3a2053616c65206973206e6f74206044820152681858dd1a5d985d195960ba1b6064820152608401610f86565b600454339082906001600160a01b0316611a288383612161565b6001600160a01b031614611a7e5760405162461bcd60e51b815260206004820152601860248201527f55736572206973206e6f74206f6e2077686974656c69737400000000000000006044820152606401610f86565b6115b384601754601654611a929190613ac2565b611a9c9190613ac2565b1115611ae35760405162461bcd60e51b8152602060048201526016602482015275115e18d95959081cd85b195cc81b585e081b1a5b5a5d60521b6044820152606401610f86565b61138884601654611af49190613ac2565b1115611b425760405162461bcd60e51b815260206004820152601a60248201527f457863656564207072652d73616c6573206d6178206c696d69740000000000006044820152606401610f86565b336000908152601a6020526040902054600290611b60908690613ac2565b1115611ba75760405162461bcd60e51b8152602060048201526016602482015275457863656564207369676e6564207175616e7469747960501b6044820152606401610f86565b323314611bf65760405162461bcd60e51b815260206004820152601d60248201527f434f4e5452414354535f4e4f545f414c4c4f5745445f544f5f4d494e540000006044820152606401610f86565b601c54610100900460ff1615611c485760405162461bcd60e51b815260206004820152601760248201527654686520636f6e7472616374206973207061757365642160481b6044820152606401610f86565b611c50611956565b611c5a9085613bb3565b341015611c995760405162461bcd60e51b815260206004820152600d60248201526c092dcc6dee4e4cac6e8408aa89609b1b6044820152606401610f86565b336000908152601a602052604081208054869290611cb8908490613ac2565b925050819055508360166000828254611cd19190613ac2565b90915550611220905033856124a4565b81611ceb8161261d565b610f5683836128b8565b6000546001600160a01b03163314611d1f5760405162461bcd60e51b8152600401610f8690613a8d565b60005b6014548110156112e557600060148281548110611d4157611d41613ada565b6000918252602090912001546001600160a01b03169050611d61816110ca565b5080611d6c81613af0565b915050611d22565b600080600154118015610f9757505060015442101590565b600080600254118015611da157506000600354115b8015611daf57506002544210155b8015610f9757505060035442111590565b836001600160a01b0381163314611dda57611dda3361261d565b611de68585858561294d565b5050505050565b6000546001600160a01b03163314611e175760405162461bcd60e51b8152600401610f8690613a8d565b601e805460ff191692151592909217909155601f55565b6060611e39826122f5565b611e9d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610f86565b601c5462010000900460ff16611f3f5760218054611eba90613a53565b80601f0160208091040260200160405190810160405280929190818152602001828054611ee690613a53565b8015611f335780601f10611f0857610100808354040283529160200191611f33565b820191906000526020600020905b815481529060010190602001808311611f1657829003601f168201915b50505050509050919050565b6000611f49612998565b90506000815111611f695760405180602001604052806000815250611f94565b80611f73846129a7565b604051602001611f84929190613bd2565b6040516020818303038152906040525b9392505050565b600080612030611fa961237d565b604080517ff59780ff8f4ba89ed09d6c9fc5aec79093994c7234326cb09aafc9bf724f07416020808301919091526001600160a01b0388168284015282518083038401815260608301845280519082012061190160f01b6080840152608283019490945260a2808301949094528251808303909401845260c2909101909152815191012090565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c810191909152605c0160408051601f1981840301815291905280516020909101209392505050565b6000546001600160a01b031633146120ad5760405162461bcd60e51b8152600401610f8690613a8d565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146120f95760405162461bcd60e51b8152600401610f8690613a8d565b601c805492151563010000000263ff0000001990931692909217909155601d55565b6000546001600160a01b031633146121455760405162461bcd60e51b8152600401610f8690613a8d565b601c8054911515620100000262ff000019909216919091179055565b6000611f9461216f84611f9b565b83612aa7565b6000546001600160a01b0316331461219f5760405162461bcd60e51b8152600401610f8690613a8d565b818110156122155760405162461bcd60e51b815260206004820152603c60248201527f50726553616c657341637469766174696f6e3a20456e642074696d652073686f60448201527f756c64206265206c61746572207468616e2073746172742074696d65000000006064820152608401610f86565b600291909155600355565b6000546001600160a01b0316331461224a5760405162461bcd60e51b8152600401610f8690613a8d565b8051611262906021906020840190613514565b6000546001600160a01b031633146122875760405162461bcd60e51b8152600401610f8690613a8d565b6001600160a01b0381166122ec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f86565b6112e581612868565b600060055482108015610df2575050600090815260096020526040902054600160e01b900460ff161590565b6000828152600b602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000306001600160a01b037f0000000000000000000000000112329508c09e5112b0ddf881b87804632f44a9161480156123d657507f000000000000000000000000000000000000000000000000000000000000000146145b1561240057507f85e603ab8654166dc2e5a530fe5b5be4f193efe59ca6117af44bcff3d281a4b690565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f4658db52adc6b127ac9e06bf55664db4da19bab070ea37bd8e900279d072f0df828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b611262828260405180602001604052806000815250612acb565b600d546001600160a01b0384166000908152600f6020526040812054909183916124e89086613bb3565b6124f29190613c17565b6124fc9190613a3c565b949350505050565b804710156125545760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610f86565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146125a1576040519150601f19603f3d011682016040523d82523d6000602084013e6125a6565b606091505b5050905080610f565760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610f86565b6daaeb6d7670e522a718067333cd4e3b156112e557604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa15801561268a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ae9190613c2b565b6112e557604051633b79c77360e21b81526001600160a01b0382166004820152602401610f86565b610f56838383612ad8565b610f5683838360405180602001604052806000815250611dc0565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610f56908490612cc3565b60408051606081018252600080825260208201819052918101919091528160055481101561284f57600081815260096020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615159181018290529061284d5780516001600160a01b0316156127e4579392505050565b5060001901600081815260096020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612848579392505050565b6127e4565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b336001600160a01b038316036128e15760405163b06307db60e01b815260040160405180910390fd5b336000818152600c602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b612958848484612ad8565b6001600160a01b0383163b1515801561297a575061297884848484612d95565b155b15611220576040516368d2bf6b60e11b815260040160405180910390fd5b606060208054610e0790613a53565b6060816000036129ce5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156129f857806129e281613af0565b91506129f19050600a83613c17565b91506129d2565b6000816001600160401b03811115612a1257612a126137a2565b6040519080825280601f01601f191660200182016040528015612a3c576020820181803683370190505b5090505b84156124fc57612a51600183613a3c565b9150612a5e600a86613c48565b612a69906030613ac2565b60f81b818381518110612a7e57612a7e613ada565b60200101906001600160f81b031916908160001a905350612aa0600a86613c17565b9450612a40565b6000806000612ab68585612e80565b91509150612ac381612eee565b509392505050565b610f5683838360016130a4565b6000612ae38261274e565b9050836001600160a01b031681600001516001600160a01b031614612b1a5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480612b385750612b388533610ce8565b80612b53575033612b4884610e8a565b6001600160a01b0316145b905080612b7357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416612b9a57604051633a954ecd60e21b815260040160405180910390fd5b612ba660008487612321565b6001600160a01b038581166000908152600a60209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600990945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116612c7a576005548214612c7a57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611de6565b6000612d18826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166132759092919063ffffffff16565b805190915015610f565780806020019051810190612d369190613c2b565b610f565760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610f86565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612dca903390899088908890600401613c5c565b6020604051808303816000875af1925050508015612e05575060408051601f3d908101601f19168201909252612e0291810190613c99565b60015b612e63573d808015612e33576040519150601f19603f3d011682016040523d82523d6000602084013e612e38565b606091505b508051600003612e5b576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000808251604103612eb65760208301516040840151606085015160001a612eaa87828585613284565b94509450505050612ee7565b8251604003612edf5760208301516040840151612ed4868383613371565b935093505050612ee7565b506000905060025b9250929050565b6000816004811115612f0257612f02613cb6565b03612f0a5750565b6001816004811115612f1e57612f1e613cb6565b03612f6b5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610f86565b6002816004811115612f7f57612f7f613cb6565b03612fcc5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610f86565b6003816004811115612fe057612fe0613cb6565b036130385760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610f86565b600481600481111561304c5761304c613cb6565b036112e55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610f86565b6005546001600160a01b0385166130cd57604051622e076360e81b815260040160405180910390fd5b836000036130ee5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b0385166000818152600a6020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600990925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561319f57506001600160a01b0387163b15155b15613227575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46131f06000888480600101955088612d95565b61320d576040516368d2bf6b60e11b815260040160405180910390fd5b8082036131a557826005541461322257600080fd5b61326c565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808203613228575b50600555611de6565b60606124fc84846000856133aa565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156132bb5750600090506003613368565b8460ff16601b141580156132d357508460ff16601c14155b156132e45750600090506004613368565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613338573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661336157600060019250925050613368565b9150600090505b94509492505050565b6000806001600160ff1b0383168161338e60ff86901c601b613ac2565b905061339c87828885613284565b935093505050935093915050565b60608247101561340b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610f86565b6001600160a01b0385163b6134625760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610f86565b600080866001600160a01b0316858760405161347e9190613ccc565b60006040518083038185875af1925050503d80600081146134bb576040519150601f19603f3d011682016040523d82523d6000602084013e6134c0565b606091505b50915091506134d08282866134db565b979650505050505050565b606083156134ea575081611f94565b8251156134fa5782518084602001fd5b8160405162461bcd60e51b8152600401610f869190613638565b82805461352090613a53565b90600052602060002090601f0160209004810192826135425760008555613588565b82601f1061355b57805160ff1916838001178555613588565b82800160010185558215613588579182015b8281111561358857825182559160200191906001019061356d565b50613594929150613598565b5090565b5b808211156135945760008155600101613599565b6001600160e01b0319811681146112e557600080fd5b6000602082840312156135d557600080fd5b8135611f94816135ad565b60005b838110156135fb5781810151838201526020016135e3565b838111156112205750506000910152565b600081518084526136248160208601602086016135e0565b601f01601f19169290920160200192915050565b602081526000611f94602083018461360c565b60006020828403121561365d57600080fd5b5035919050565b6001600160a01b03811681146112e557600080fd5b6000806040838503121561368c57600080fd5b823561369781613664565b946020939093013593505050565b600080602083850312156136b857600080fd5b82356001600160401b03808211156136cf57600080fd5b818501915085601f8301126136e357600080fd5b8135818111156136f257600080fd5b8660208260051b850101111561370757600080fd5b60209290920196919550909350505050565b80151581146112e557600080fd5b60006020828403121561373957600080fd5b8135611f9481613719565b60006020828403121561375657600080fd5b8135611f9481613664565b60008060006060848603121561377657600080fd5b833561378181613664565b9250602084013561379181613664565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b03808411156137d2576137d26137a2565b604051601f8501601f19908116603f011681019082821181831017156137fa576137fa6137a2565b8160405280935085815286868601111561381357600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561383f57600080fd5b81356001600160401b0381111561385557600080fd5b8201601f8101841361386657600080fd5b6124fc848235602084016137b8565b6000806040838503121561388857600080fd5b823561389381613664565b915060208301356138a381613664565b809150509250929050565b600082601f8301126138bf57600080fd5b611f94838335602085016137b8565b600080604083850312156138e157600080fd5b8235915060208301356001600160401b038111156138fe57600080fd5b61390a858286016138ae565b9150509250929050565b6000806040838503121561392757600080fd5b823561393281613664565b915060208301356138a381613719565b6000806000806080858703121561395857600080fd5b843561396381613664565b9350602085013561397381613664565b92506040850135915060608501356001600160401b0381111561399557600080fd5b6139a1878288016138ae565b91505092959194509250565b600080604083850312156139c057600080fd5b823561369781613719565b600080604083850312156139de57600080fd5b82356139e981613664565b915060208301356001600160401b038111156138fe57600080fd5b60008060408385031215613a1757600080fd5b50508035926020909101359150565b634e487b7160e01b600052601160045260246000fd5b600082821015613a4e57613a4e613a26565b500390565b600181811c90821680613a6757607f821691505b602082108103613a8757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115613ad557613ad5613a26565b500190565b634e487b7160e01b600052603260045260246000fd5b600060018201613b0257613b02613a26565b5060010190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b600060208284031215613bac57600080fd5b5051919050565b6000816000190483118215151615613bcd57613bcd613a26565b500290565b60008351613be48184602088016135e0565b835190830190613bf88183602088016135e0565b01949350505050565b634e487b7160e01b600052601260045260246000fd5b600082613c2657613c26613c01565b500490565b600060208284031215613c3d57600080fd5b8151611f9481613719565b600082613c5757613c57613c01565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613c8f9083018461360c565b9695505050505050565b600060208284031215613cab57600080fd5b8151611f94816135ad565b634e487b7160e01b600052602160045260246000fd5b60008251613cde8184602087016135e0565b919091019291505056fea264697066735822122073b75b2203dc91cb8a4d30f21f1fca79122293ec9a1ed9f8e57496c108e3554864736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005368747470733a2f2f6e66742d646174612e6d7970696e6174612e636c6f75642f697066732f516d50706668415a79416a5535313774633837756a566d6f5033696f4455444b376a43624c366a7256446b45556900000000000000000000000000
-----Decoded View---------------
Arg [0] : _notRevealedUri (string): https://nft-data.mypinata.cloud/ipfs/QmPpfhAZyAjU517tc87ujVmoP3ioDUDK7jCbL6jrVDkEUi
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000053
Arg [2] : 68747470733a2f2f6e66742d646174612e6d7970696e6174612e636c6f75642f
Arg [3] : 697066732f516d50706668415a79416a5535313774633837756a566d6f503369
Arg [4] : 6f4455444b376a43624c366a7256446b45556900000000000000000000000000
Deployed Bytecode Sourcemap
150640:7485:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;140046:40;114653:10;140046:40;;;-1:-1:-1;;;;;206:32:1;;;188:51;;140076:9:0;270:2:1;255:18;;248:34;161:18;140046:40:0;;;;;;;150640:7485;;;;;150937:68;;;;;;;;;;;;;:::i;:::-;;;439:25:1;;;427:2;412:18;150937:68:0;;;;;;;;151496:36;;;;;;;;;;;;;;;;119057:305;;;;;;;;;;-1:-1:-1;119057:305:0;;;;;:::i;:::-;;:::i;:::-;;;1026:14:1;;1019:22;1001:41;;989:2;974:18;119057:305:0;861:187:1;122170:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;123673:204::-;;;;;;;;;;-1:-1:-1;123673:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2153:32:1;;;2135:51;;2123:2;2108:18;123673:204:0;1989:203:1;123236:371:0;;;;;;;;;;-1:-1:-1;123236:371:0;;;;;:::i;:::-;;:::i;:::-;;151188:44;;;;;;;;;;;;151231:1;151188:44;;148097:120;;;;;;;;;;;;;:::i;154776:351::-;;;;;;;;;;-1:-1:-1;154776:351:0;;;;;:::i;:::-;;:::i;151239:56::-;;;;;;;;;;;;151294:1;151239:56;;155964:86;;;;;;;;;;-1:-1:-1;155964:86:0;;;;;:::i;:::-;;:::i;118306:303::-;;;;;;;;;;-1:-1:-1;118560:12:0;;118544:13;;:28;118306:303;;141832:566;;;;;;;;;;-1:-1:-1;141832:566:0;;;;;:::i;:::-;;:::i;157542:163::-;;;;;;;;;;-1:-1:-1;157542:163:0;;;;;:::i;:::-;;:::i;155612:120::-;;;;;;;;;;-1:-1:-1;155612:120:0;;;;;:::i;:::-;;:::i;150887:41::-;;;;;;;;;;;;150926:2;150887:41;;148324:32;;;;;;;;;;;;;;;;151982:41;;;;;;;;;;;;;;;;140177:91;;;;;;;;;;-1:-1:-1;140248:12:0;;140177:91;;156927:168;;;:::i;141306:135::-;;;;;;;;;;-1:-1:-1;141306:135:0;;;;;:::i;:::-;-1:-1:-1;;;;;141403:21:0;;;141376:7;141403:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;141306:135;2905:143;;;;;;;;;;;;3005:42;2905:143;;157713:171;;;;;;;;;;-1:-1:-1;157713:171:0;;;;;:::i;:::-;;:::i;150833:47::-;;;;;;;;;;;;150876:4;150833:47;;142666:641;;;;;;;;;;-1:-1:-1;142666:641:0;;;;;:::i;:::-;;:::i;153844:924::-;;;;;;:::i;:::-;;:::i;156058:114::-;;;;;;;;;;-1:-1:-1;156058:114:0;;;;;:::i;:::-;;:::i;151909:28::-;;;;;;;;;;-1:-1:-1;151909:28:0;;;;;;;;;;;151876:26;;;;;;;;;;-1:-1:-1;151876:26:0;;;;;;;;;;;152070:44;;;;;;;;;;;;;;;;150408:119;;;;;;;;;;-1:-1:-1;150408:119:0;;;;;:::i;:::-;;:::i;121978:125::-;;;;;;;;;;-1:-1:-1;121978:125:0;;;;;:::i;:::-;;:::i;119426:206::-;;;;;;;;;;-1:-1:-1;119426:206:0;;;;;:::i;:::-;;:::i;156739:180::-;;;;;;;;;;;;;:::i;152030:33::-;;;;;;;;;;-1:-1:-1;152030:33:0;;;;;;;;151692:59;;;;;;;;;;-1:-1:-1;151692:59:0;;;;;:::i;:::-;;;;;;;;;;;;;;151829:40;;;;;;;;;;-1:-1:-1;151829:40:0;;;;;;;;151012:53;;;;;;;;;;;;151054:11;151012:53;;141532:100;;;;;;;;;;-1:-1:-1;141532:100:0;;;;;:::i;:::-;;:::i;145467:87::-;;;;;;;;;;-1:-1:-1;145513:7:0;145540:6;-1:-1:-1;;;;;145540:6:0;145467:87;;151758:62;;;;;;;;;;-1:-1:-1;151758:62:0;;;;;:::i;:::-;;;;;;;;;;;;;;151622:63;;;;;;;;;;-1:-1:-1;151622:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;122339:104;;;;;;;;;;;;;:::i;141028:109::-;;;;;;;;;;-1:-1:-1;141028:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;141111:18:0;141084:7;141111:18;;;:9;:18;;;;;;;141028:109;152366:422;;;;;;;;;;;;;:::i;151539:39::-;;;;;;;;;;;;;;;;152796:1040;;;;;;:::i;:::-;;:::i;157358:176::-;;;;;;;;;;-1:-1:-1;157358:176:0;;;;;:::i;:::-;;:::i;151944:31::-;;;;;;;;;;-1:-1:-1;151944:31:0;;;;;;;;;;;157103:214;;;;;;;;;;;;;:::i;148363:30::-;;;;;;;;;;;;;;;;150163:167;;;;;;;;;;;;;:::i;148901:258::-;;;;;;;;;;;;;:::i;157892:228::-;;;;;;;;;;-1:-1:-1;157892:228:0;;;;;:::i;:::-;;:::i;151585:28::-;;;;;;;;;;;;;;;;155135:170;;;;;;;;;;-1:-1:-1;155135:170:0;;;;;:::i;:::-;;:::i;147055:81::-;;;;;;;;;;;;147101:35;147055:81;;156180:551;;;;;;;;;;-1:-1:-1;156180:551:0;;;;;:::i;:::-;;:::i;140824:105::-;;;;;;;;;;-1:-1:-1;140824:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;140905:16:0;140878:7;140905:16;;;:7;:16;;;;;;;140824:105;147527:333;;;;;;;;;;-1:-1:-1;147527:333:0;;;;;:::i;:::-;;:::i;147239:110::-;;;;;;;;;;-1:-1:-1;147239:110:0;;;;;:::i;:::-;;:::i;155313:155::-;;;;;;;;;;-1:-1:-1;155313:155:0;;;;;:::i;:::-;;:::i;151072:56::-;;;;;;;;;;;;151117:11;151072:56;;140614:119;;;;;;;;;;-1:-1:-1;140614:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;140699:26:0;140672:7;140699:26;;;:19;:26;;;;;;;140614:119;150782:44;;;;;;;;;;;;150822:4;150782:44;;155865:90;;;;;;;;;;-1:-1:-1;155865:90:0;;;;;:::i;:::-;;:::i;140362:95::-;;;;;;;;;;-1:-1:-1;140435:14:0;;140362:95;;147357:162;;;;;;;;;;-1:-1:-1;147357:162:0;;;;;:::i;:::-;;:::i;149752:35::-;;;;;;;;;;;;;;;;124307:164;;;;;;;;;;-1:-1:-1;124307:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;124428:25:0;;;124404:4;124428:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;124307:164;149305:334;;;;;;;;;;-1:-1:-1;149305:334:0;;;;;:::i;:::-;;:::i;147145:30::-;;;;;;;;;;-1:-1:-1;147145:30:0;;;;-1:-1:-1;;;;;147145:30:0;;;155476:128;;;;;;;;;;-1:-1:-1;155476:128:0;;;;;:::i;:::-;;:::i;146376:201::-;;;;;;;;;;-1:-1:-1;146376:201:0;;;;;:::i;:::-;;:::i;150937:68::-;150977:28;150926:2;150822:4;150977:28;:::i;:::-;150937:68;:::o;119057:305::-;119159:4;-1:-1:-1;;;;;;119196:40:0;;-1:-1:-1;;;119196:40:0;;:105;;-1:-1:-1;;;;;;;119253:48:0;;-1:-1:-1;;;119253:48:0;119196:105;:158;;;-1:-1:-1;;;;;;;;;;8318:40:0;;;119318:36;119176:178;119057:305;-1:-1:-1;;119057:305:0:o;122170:100::-;122224:13;122257:5;122250:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;122170:100;:::o;123673:204::-;123741:7;123766:16;123774:7;123766;:16::i;:::-;123761:64;;123791:34;;-1:-1:-1;;;123791:34:0;;;;;;;;;;;123761:64;-1:-1:-1;123845:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;123845:24:0;;123673:204::o;123236:371::-;123309:13;123325:24;123341:7;123325:15;:24::i;:::-;123309:40;;123370:5;-1:-1:-1;;;;;123364:11:0;:2;-1:-1:-1;;;;;123364:11:0;;123360:48;;123384:24;;-1:-1:-1;;;123384:24:0;;;;;;;;;;;123360:48;114653:10;-1:-1:-1;;;;;123425:21:0;;;;;;:63;;-1:-1:-1;123451:37:0;123468:5;114653:10;124307:164;:::i;123451:37::-;123450:38;123425:63;123421:138;;;123512:35;;-1:-1:-1;;;123512:35:0;;;;;;;;;;;123421:138;123571:28;123580:2;123584:7;123593:5;123571:8;:28::i;:::-;123298:309;123236:371;;:::o;148097:120::-;148162:7;145540:6;;-1:-1:-1;;;;;145540:6:0;114653:10;145687:23;145679:68;;;;-1:-1:-1;;;145679:68:0;;;;;;;:::i;:::-;;;;;;;;;148189:20:::1;:18;:20::i;:::-;148182:27;;148097:120:::0;:::o;154776:351::-;145513:7;145540:6;-1:-1:-1;;;;;145540:6:0;114653:10;145687:23;145679:68;;;;-1:-1:-1;;;145679:68:0;;;;;;;:::i;:::-;154872:9:::1;::::0;150926:2:::1;::::0;154872:28:::1;::::0;154884:9;;154872:28:::1;:::i;:::-;:44;;154850:115;;;::::0;-1:-1:-1;;;154850:115:0;;11373:2:1;154850:115:0::1;::::0;::::1;11355:21:1::0;11412:2;11392:18;;;11385:30;-1:-1:-1;;;11431:18:1;;;11424:51;11492:18;;154850:115:0::1;11171:345:1::0;154850:115:0::1;154991:9;;:16;;154978:9;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;155025:9:0::1;::::0;-1:-1:-1;155020:100:0::1;155040:20:::0;;::::1;155020:100;;;155082:26;155092:9;;155102:1;155092:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;155106:1;155082:9;:26::i;:::-;155062:3:::0;::::1;::::0;::::1;:::i;:::-;;;;155020:100;;155964:86:::0;145513:7;145540:6;-1:-1:-1;;;;;145540:6:0;114653:10;145687:23;145679:68;;;;-1:-1:-1;;;145679:68:0;;;;;;;:::i;:::-;156027:6:::1;:15:::0;;;::::1;;;;-1:-1:-1::0;;156027:15:0;;::::1;::::0;;;::::1;::::0;;155964:86::o;141832:566::-;-1:-1:-1;;;;;141908:16:0;;141927:1;141908:16;;;:7;:16;;;;;;141900:71;;;;-1:-1:-1;;;141900:71:0;;;;;;;:::i;:::-;141984:21;142032:15;140435:14;;;140362:95;142032:15;142008:39;;:21;:39;:::i;:::-;141984:63;;142058:15;142076:58;142092:7;142101:13;142116:17;142125:7;-1:-1:-1;;;;;141111:18:0;141084:7;141111:18;;;:9;:18;;;;;;;141028:109;142116:17;142076:15;:58::i;:::-;142058:76;;142155:7;142166:1;142155:12;142147:68;;;;-1:-1:-1;;;142147:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;142228:18:0;;;;;;:9;:18;;;;;:29;;142250:7;;142228:18;:29;;142250:7;;142228:29;:::i;:::-;;;;;;;;142286:7;142268:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;142306:35:0;;-1:-1:-1;142324:7:0;142333;142306:17;:35::i;:::-;142357:33;;;-1:-1:-1;;;;;206:32:1;;188:51;;270:2;255:18;;248:34;;;142357:33:0;;161:18:1;142357:33:0;;;;;;;141889:509;;141832:566;:::o;157542:163::-;157643:4;-1:-1:-1;;;;;4246:18:0;;4254:10;4246:18;4242:83;;4281:32;4302:10;4281:20;:32::i;:::-;157660:37:::1;157679:4;157685:2;157689:7;157660:18;:37::i;:::-;157542:163:::0;;;;:::o;155612:120::-;145513:7;145540:6;-1:-1:-1;;;;;145540:6:0;114653:10;145687:23;145679:68;;;;-1:-1:-1;;;145679:68:0;;;;;;;:::i;:::-;155696:28;;::::1;::::0;:12:::1;::::0;:28;;::::1;::::0;::::1;:::i;:::-;;155612:120:::0;:::o;156927:168::-;145513:7;145540:6;-1:-1:-1;;;;;145540:6:0;114653:10;145687:23;145679:68;;;;-1:-1:-1;;;145679:68:0;;;;;;;:::i;:::-;157002:58:::1;::::0;156984:12:::1;::::0;157010:10:::1;::::0;157034:21:::1;::::0;156984:12;157002:58;156984:12;157002:58;157034:21;157010:10;157002:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;156983:77;;;157079:7;157071:16;;;::::0;::::1;;156972:123;156927:168::o:0;157713:171::-;157818:4;-1:-1:-1;;;;;4246:18:0;;4254:10;4246:18;4242:83;;4281:32;4302:10;4281:20;:32::i;:::-;157835:41:::1;157858:4;157864:2;157868:7;157835:22;:41::i;142666:641::-:0;-1:-1:-1;;;;;142748:16:0;;142767:1;142748:16;;;:7;:16;;;;;;142740:71;;;;-1:-1:-1;;;142740:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;140699:26:0;;142824:21;140699:26;;;:19;:26;;;;;;142848:30;;-1:-1:-1;;;142848:30:0;;142872:4;142848:30;;;2135:51:1;-1:-1:-1;;;;;142848:15:0;;;;;2108:18:1;;142848:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;142824:77;;142912:15;142930:65;142946:7;142955:13;142970:24;142979:5;142986:7;-1:-1:-1;;;;;141403:21:0;;;141376:7;141403:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;141306:135;142930:65;142912:83;;143016:7;143027:1;143016:12;143008:68;;;;-1:-1:-1;;;143008:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;143089:21:0;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;143123:7;;143089:21;:41;;143123:7;;143089:41;:::i;:::-;;;;-1:-1:-1;;;;;;;143141:26:0;;;;;;:19;:26;;;;;:37;;143171:7;;143141:26;:37;;143171:7;;143141:37;:::i;:::-;;;;-1:-1:-1;143191:47:0;;-1:-1:-1;143214:5:0;143221:7;143230;143191:22;:47::i;:::-;143254:45;;;-1:-1:-1;;;;;206:32:1;;;188:51;;270:2;255:18;;248:34;;;143254:45:0;;;;;161:18:1;143254:45:0;;;;;;;142729:578;;142666:641;;:::o;153844:924::-;149860:24;:22;:24::i;:::-;149838:118;;;;-1:-1:-1;;;149838:118:0;;13500:2:1;149838:118:0;;;13482:21:1;13539:2;13519:18;;;13512:30;13578:34;13558:18;;;13551:62;-1:-1:-1;;;13629:18:1;;;13622:42;13681:19;;149838:118:0;13298:408:1;149838:118:0;150977:28:::1;150926:2;150822:4;150977:28;:::i;:::-;154038:8;154015:20;;153995:17;;:40;;;;:::i;:::-;:51;;;;:::i;:::-;:85;;153973:157;;;::::0;-1:-1:-1;;;153973:157:0;;13913:2:1;153973:157:0::1;::::0;::::1;13895:21:1::0;13952:2;13932:18;;;13925:30;-1:-1:-1;;;13971:18:1;;;13964:52;14033:18;;153973:157:0::1;13711:346:1::0;153973:157:0::1;151231:1;154149:8;:28;;154141:76;;;::::0;-1:-1:-1;;;154141:76:0;;14264:2:1;154141:76:0::1;::::0;::::1;14246:21:1::0;14303:2;14283:18;;;14276:30;14342:27;14322:18;;;14315:55;14387:18;;154141:76:0::1;14062:349:1::0;154141:76:0::1;154280:10;154252:39;::::0;;;:27:::1;:39;::::0;;;;;151180:1:::1;::::0;154252:50:::1;::::0;154294:8;;154252:50:::1;:::i;:::-;:89;;154230:165;;;::::0;-1:-1:-1;;;154230:165:0;;14618:2:1;154230:165:0::1;::::0;::::1;14600:21:1::0;14657:2;14637:18;;;14630:30;14696:28;14676:18;;;14669:56;14742:18;;154230:165:0::1;14416:350:1::0;154230:165:0::1;154416:9;154429:10;154416:23;154408:64;;;::::0;-1:-1:-1;;;154408:64:0;;14973:2:1;154408:64:0::1;::::0;::::1;14955:21:1::0;15012:2;14992:18;;;14985:30;15051:31;15031:18;;;15024:59;15100:18;;154408:64:0::1;14771:353:1::0;154408:64:0::1;154494:6;::::0;::::1;::::0;::::1;;;154493:7;154485:43;;;::::0;-1:-1:-1;;;154485:43:0;;15331:2:1;154485:43:0::1;::::0;::::1;15313:21:1::0;15370:2;15350:18;;;15343:30;-1:-1:-1;;;15389:18:1;;;15382:53;15452:18;;154485:43:0::1;15129:347:1::0;154485:43:0::1;154581:10;:8;:10::i;:::-;154570:21;::::0;:8;:21:::1;:::i;:::-;154557:9;:34;;154549:60;;;::::0;-1:-1:-1;;;154549:60:0;;15856:2:1;154549:60:0::1;::::0;::::1;15838:21:1::0;15895:2;15875:18;;;15868:30;-1:-1:-1;;;15914:18:1;;;15907:43;15967:18;;154549:60:0::1;15654:337:1::0;154549:60:0::1;154650:10;154622:39;::::0;;;:27:::1;:39;::::0;;;;:51;;154665:8;;154622:39;:51:::1;::::0;154665:8;;154622:51:::1;:::i;:::-;;;;;;;;154708:8;154684:20;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;154729:31:0::1;::::0;-1:-1:-1;154739:10:0::1;154751:8:::0;154729:9:::1;:31::i;156058:114::-:0;145513:7;145540:6;-1:-1:-1;;;;;145540:6:0;114653:10;145687:23;145679:68;;;;-1:-1:-1;;;145679:68:0;;;;;;;:::i;:::-;156135:20:::1;:29:::0;;-1:-1:-1;;156135:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;156058:114::o;150408:119::-;145513:7;145540:6;-1:-1:-1;;;;;145540:6:0;114653:10;145687:23;145679:68;;;;-1:-1:-1;;;145679:68:0;;;;;;;:::i;:::-;150486:20:::1;:33:::0;150408:119::o;121978:125::-;122042:7;122069:21;122082:7;122069:12;:21::i;:::-;:26;;121978:125;-1:-1:-1;;121978:125:0:o;119426:206::-;119490:7;-1:-1:-1;;;;;119514:19:0;;119510:60;;119542:28;;-1:-1:-1;;;119542:28:0;;;;;;;;;;;119510:60;-1:-1:-1;;;;;;119596:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;119596:27:0;;119426:206::o;156739:180::-;145513:7;145540:6;-1:-1:-1;;;;;145540:6:0;114653:10;145687:23;145679:68;;;;-1:-1:-1;;;145679:68:0;;;;;;;:::i;:::-;156812:20:::1;::::0;::::1;;156804:66;;;::::0;-1:-1:-1;;;156804:66:0;;16198:2:1;156804:66:0::1;::::0;::::1;16180:21:1::0;16237:2;16217:18;;;16210:30;16276:34;16256:18;;;16249:62;-1:-1:-1;;;16327:18:1;;;16320:32;16369:19;;156804:66:0::1;15996:398:1::0;156804:66:0::1;156881:30;156908:1;156881:18;:30::i;:::-;156739:180::o:0;141532:100::-;141583:7;141610;141618:5;141610:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;141610:14:0;;141532:100;-1:-1:-1;;141532:100:0:o;122339:104::-;122395:13;122428:7;122421:14;;;;;:::i;152366:422::-;152407:7;152431:24;:22;:24::i;:::-;152427:354;;;152475:11;;;;;;;152472:133;;;-1:-1:-1;152513:12:0;;;152366:422::o;152472:133::-;-1:-1:-1;151117:11:0;;152366:422::o;152427:354::-;152638:13;;;;152635:135;;;-1:-1:-1;152678:15:0;;;152366:422::o;152635:135::-;-1:-1:-1;151054:11:0;;152366:422::o;152796:1040::-;148463:21;:19;:21::i;:::-;148441:112;;;;-1:-1:-1;;;148441:112:0;;16601:2:1;148441:112:0;;;16583:21:1;16640:2;16620:18;;;16613:30;16679:34;16659:18;;;16652:62;-1:-1:-1;;;16730:18:1;;;16723:39;16779:19;;148441:112:0;16399:405:1;148441:112:0;147988:15:::1;::::0;152971:10:::1;::::0;152983:9;;-1:-1:-1;;;;;147988:15:0::1;147952:32;152971:10:::0;152983:9;147952:13:::1;:32::i;:::-;-1:-1:-1::0;;;;;147952:51:0::1;;147944:125;;;::::0;-1:-1:-1;;;147944:125:0;;17011:2:1;147944:125:0::1;::::0;::::1;16993:21:1::0;17050:2;17030:18;;;17023:30;17089:26;17069:18;;;17062:54;17133:18;;147944:125:0::1;16809:348:1::0;147944:125:0::1;150822:4:::2;153076:8;153053:20;;153033:17;;:40;;;;:::i;:::-;:51;;;;:::i;:::-;:85;;153011:157;;;::::0;-1:-1:-1;;;153011:157:0;;13913:2:1;153011:157:0::2;::::0;::::2;13895:21:1::0;13952:2;13932:18;;;13925:30;-1:-1:-1;;;13971:18:1;;;13964:52;14033:18;;153011:157:0::2;13711:346:1::0;153011:157:0::2;150876:4;153223:8;153203:17;;:28;;;;:::i;:::-;:48;;153181:124;;;::::0;-1:-1:-1;;;153181:124:0;;17364:2:1;153181:124:0::2;::::0;::::2;17346:21:1::0;17403:2;17383:18;;;17376:30;17442:28;17422:18;;;17415:56;17488:18;;153181:124:0::2;17162:350:1::0;153181:124:0::2;153365:10;153340:36;::::0;;;:24:::2;:36;::::0;;;;;151294:1:::2;::::0;153340:47:::2;::::0;153379:8;;153340:47:::2;:::i;:::-;:79;;153318:151;;;::::0;-1:-1:-1;;;153318:151:0;;17719:2:1;153318:151:0::2;::::0;::::2;17701:21:1::0;17758:2;17738:18;;;17731:30;-1:-1:-1;;;17777:18:1;;;17770:52;17839:18;;153318:151:0::2;17517:346:1::0;153318:151:0::2;153490:9;153503:10;153490:23;153482:64;;;::::0;-1:-1:-1;;;153482:64:0;;14973:2:1;153482:64:0::2;::::0;::::2;14955:21:1::0;15012:2;14992:18;;;14985:30;15051:31;15031:18;;;15024:59;15100:18;;153482:64:0::2;14771:353:1::0;153482:64:0::2;153568:6;::::0;::::2;::::0;::::2;;;153567:7;153559:43;;;::::0;-1:-1:-1;;;153559:43:0;;15331:2:1;153559:43:0::2;::::0;::::2;15313:21:1::0;15370:2;15350:18;;;15343:30;-1:-1:-1;;;15389:18:1;;;15382:53;15452:18;;153559:43:0::2;15129:347:1::0;153559:43:0::2;153655:10;:8;:10::i;:::-;153644:21;::::0;:8;:21:::2;:::i;:::-;153631:9;:34;;153623:60;;;::::0;-1:-1:-1;;;153623:60:0;;15856:2:1;153623:60:0::2;::::0;::::2;15838:21:1::0;15895:2;15875:18;;;15868:30;-1:-1:-1;;;15914:18:1;;;15907:43;15967:18;;153623:60:0::2;15654:337:1::0;153623:60:0::2;153721:10;153696:36;::::0;;;:24:::2;:36;::::0;;;;:48;;153736:8;;153696:36;:48:::2;::::0;153736:8;;153696:48:::2;:::i;:::-;;;;;;;;153776:8;153755:17;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;153797:31:0::2;::::0;-1:-1:-1;153807:10:0::2;153819:8:::0;153797:9:::2;:31::i;157358:176::-:0;157462:8;4426:30;4447:8;4426:20;:30::i;:::-;157483:43:::1;157507:8;157517;157483:23;:43::i;157103:214::-:0;145513:7;145540:6;-1:-1:-1;;;;;145540:6:0;114653:10;145687:23;145679:68;;;;-1:-1:-1;;;145679:68:0;;;;;;;:::i;:::-;157161:9:::1;157156:154;157180:11;:18:::0;157176:22;::::1;157156:154;;;157220:22;157253:11;157265:1;157253:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;157253:14:0::1;::::0;-1:-1:-1;157283:15:0::1;157253:14:::0;157283:7:::1;:15::i;:::-;-1:-1:-1::0;157200:3:0;::::1;::::0;::::1;:::i;:::-;;;;157156:154;;150163:167:::0;150218:4;150278:1;150255:20;;:24;:67;;;;-1:-1:-1;;150302:20:0;;150283:15;:39;;;150163:167::o;148901:258::-;148953:4;149010:1;148990:17;;:21;:57;;;;;149046:1;149028:15;;:19;148990:57;:110;;;;;149083:17;;149064:15;:36;;148990:110;:161;;;;-1:-1:-1;;149136:15:0;;149117;:34;;;148901:258::o;157892:228::-;158043:4;-1:-1:-1;;;;;4246:18:0;;4254:10;4246:18;4242:83;;4281:32;4302:10;4281:20;:32::i;:::-;158065:47:::1;158088:4;158094:2;158098:7;158107:4;158065:22;:47::i;:::-;157892:228:::0;;;;;:::o;155135:170::-;145513:7;145540:6;-1:-1:-1;;;;;145540:6:0;114653:10;145687:23;145679:68;;;;-1:-1:-1;;;145679:68:0;;;;;;;:::i;:::-;155230:13:::1;:31:::0;;-1:-1:-1;;155230:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;155272:15:::1;:25:::0;155135:170::o;156180:551::-;156298:13;156347:16;156355:7;156347;:16::i;:::-;156329:105;;;;-1:-1:-1;;;156329:105:0;;18070:2:1;156329:105:0;;;18052:21:1;18109:2;18089:18;;;18082:30;18148:34;18128:18;;;18121:62;-1:-1:-1;;;18199:18:1;;;18192:45;18254:19;;156329:105:0;17868:411:1;156329:105:0;156459:8;;;;;;;156455:62;;156491:14;156484:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;156180:551;;;:::o;156455:62::-;156529:28;156560:10;:8;:10::i;:::-;156529:41;;156621:1;156596:14;156590:28;:32;:133;;;;;;;;;;;;;;;;;156662:14;156678:25;156695:7;156678:16;:25::i;:::-;156645:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;156590:133;156583:140;156180:551;-1:-1:-1;;;156180:551:0:o;147527:333::-;147583:7;147602:21;147701:120;147723:20;:18;:20::i;:::-;147771:39;;;147101:35;147771:39;;;;18933:25:1;;;;-1:-1:-1;;;;;18994:32:1;;18974:18;;;18967:60;147771:39:0;;;;;;;;;18906:18:1;;;147771:39:0;;147761:50;;;;;;-1:-1:-1;;;41008:57:0;;;22235:27:1;22278:11;;;22271:27;;;;22314:12;;;;22307:28;;;;41008:57:0;;;;;;;;;;22351:12:1;;;;41008:57:0;;;40998:68;;;;;;40878:196;147701:120;147636:186;;19280:66:1;147636:186:0;;;19268:79:1;19363:12;;;19356:28;;;;19400:12;;147636:186:0;;;-1:-1:-1;;147636:186:0;;;;;;;;;147626:197;;147636:186;147626:197;;;;;147527:333;-1:-1:-1;;;147527:333:0:o;147239:110::-;145513:7;145540:6;-1:-1:-1;;;;;145540:6:0;114653:10;145687:23;145679:68;;;;-1:-1:-1;;;145679:68:0;;;;;;;:::i;:::-;147315:15:::1;:26:::0;;-1:-1:-1;;;;;;147315:26:0::1;-1:-1:-1::0;;;;;147315:26:0;;;::::1;::::0;;;::::1;::::0;;147239:110::o;155313:155::-;145513:7;145540:6;-1:-1:-1;;;;;145540:6:0;114653:10;145687:23;145679:68;;;;-1:-1:-1;;;145679:68:0;;;;;;;:::i;:::-;155402:11:::1;:27:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;155402:27:0;;::::1;::::0;;;::::1;::::0;;;155440:12:::1;:20:::0;155313:155::o;155865:90::-;145513:7;145540:6;-1:-1:-1;;;;;145540:6:0;114653:10;145687:23;145679:68;;;;-1:-1:-1;;;145679:68:0;;;;;;;:::i;:::-;155930:8:::1;:17:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;155930:17:0;;::::1;::::0;;;::::1;::::0;;155865:90::o;147357:162::-;147441:7;147468:43;147482:17;147492:6;147482:9;:17::i;:::-;147501:9;147468:13;:43::i;149305:334::-;145513:7;145540:6;-1:-1:-1;;;;;145540:6:0;114653:10;145687:23;145679:68;;;;-1:-1:-1;;;145679:68:0;;;;;;;:::i;:::-;149455:10:::1;149443:8;:22;;149421:132;;;::::0;-1:-1:-1;;;149421:132:0;;19625:2:1;149421:132:0::1;::::0;::::1;19607:21:1::0;19664:2;19644:18;;;19637:30;19703:34;19683:18;;;19676:62;19774:30;19754:18;;;19747:58;19822:19;;149421:132:0::1;19423:424:1::0;149421:132:0::1;149564:17;:30:::0;;;;149605:15:::1;:26:::0;149305:334::o;155476:128::-;145513:7;145540:6;-1:-1:-1;;;;;145540:6:0;114653:10;145687:23;145679:68;;;;-1:-1:-1;;;145679:68:0;;;;;;;:::i;:::-;155564:32;;::::1;::::0;:14:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;146376:201::-:0;145513:7;145540:6;-1:-1:-1;;;;;145540:6:0;114653:10;145687:23;145679:68;;;;-1:-1:-1;;;145679:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;146465:22:0;::::1;146457:73;;;::::0;-1:-1:-1;;;146457:73:0;;20054:2:1;146457:73:0::1;::::0;::::1;20036:21:1::0;20093:2;20073:18;;;20066:30;20132:34;20112:18;;;20105:62;-1:-1:-1;;;20183:18:1;;;20176:36;20229:19;;146457:73:0::1;19852:402:1::0;146457:73:0::1;146541:28;146560:8;146541:18;:28::i;125659:174::-:0;125716:4;125780:13;;125770:7;:23;125740:85;;;;-1:-1:-1;;125798:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;125798:27:0;;;;125797:28;;125659:174::o;133816:196::-;133931:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;133931:29:0;-1:-1:-1;;;;;133931:29:0;;;;;;;;;133976:28;;133931:24;;133976:28;;;;;;;133816:196;;;:::o;44311:314::-;44364:7;44396:4;-1:-1:-1;;;;;44405:12:0;44388:29;;:66;;;;;44438:16;44421:13;:33;44388:66;44384:234;;;-1:-1:-1;44478:24:0;;44311:314::o;44384:234::-;-1:-1:-1;44814:73:0;;;44564:10;44814:73;;;;22633:25:1;;;;44576:12:0;22674:18:1;;;22667:34;44590:15:0;22717:18:1;;;22710:34;44858:13:0;22760:18:1;;;22753:34;44881:4:0;22803:19:1;;;;22796:61;;;;44814:73:0;;;;;;;;;;22605:19:1;;;;44814:73:0;;;44804:84;;;;;;148097:120::o;125841:104::-;125910:27;125920:2;125924:8;125910:27;;;;;;;;;;;;:9;:27::i;143485:248::-;143695:12;;-1:-1:-1;;;;;143675:16:0;;143631:7;143675:16;;;:7;:16;;;;;;143631:7;;143710:15;;143659:32;;:13;:32;:::i;:::-;143658:49;;;;:::i;:::-;:67;;;;:::i;:::-;143651:74;143485:248;-1:-1:-1;;;;143485:248:0:o;16542:317::-;16657:6;16632:21;:31;;16624:73;;;;-1:-1:-1;;;16624:73:0;;20718:2:1;16624:73:0;;;20700:21:1;20757:2;20737:18;;;20730:30;20796:31;20776:18;;;20769:59;20845:18;;16624:73:0;20516:353:1;16624:73:0;16711:12;16729:9;-1:-1:-1;;;;;16729:14:0;16751:6;16729:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16710:52;;;16781:7;16773:78;;;;-1:-1:-1;;;16773:78:0;;21076:2:1;16773:78:0;;;21058:21:1;21115:2;21095:18;;;21088:30;21154:34;21134:18;;;21127:62;21225:28;21205:18;;;21198:56;21271:19;;16773:78:0;20874:422:1;4488:419:0;3005:42;4679:45;:49;4675:225;;4750:67;;-1:-1:-1;;;4750:67:0;;4801:4;4750:67;;;21513:34:1;-1:-1:-1;;;;;21583:15:1;;21563:18;;;21556:43;3005:42:0;;4750;;21448:18:1;;4750:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4745:144;;4845:28;;-1:-1:-1;;;4845:28:0;;-1:-1:-1;;;;;2153:32:1;;4845:28:0;;;2135:51:1;2108:18;;4845:28:0;1989:203:1;124538:170:0;124672:28;124682:4;124688:2;124692:7;124672:9;:28::i;124779:185::-;124917:39;124934:4;124940:2;124944:7;124917:39;;;;;;;;;;;;:16;:39::i;26127:211::-;26271:58;;;-1:-1:-1;;;;;206:32:1;;26271:58:0;;;188:51:1;255:18;;;;248:34;;;26271:58:0;;;;;;;;;;161:18:1;;;;26271:58:0;;;;;;;;-1:-1:-1;;;;;26271:58:0;-1:-1:-1;;;26271:58:0;;;26244:86;;26264:5;;26244:19;:86::i;120807:1109::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;120918:7:0;121001:13;;120994:4;:20;120963:886;;;121035:31;121069:17;;;:11;:17;;;;;;;;;121035:51;;;;;;;;;-1:-1:-1;;;;;121035:51:0;;;;-1:-1:-1;;;121035:51:0;;-1:-1:-1;;;;;121035:51:0;;;;;;;;-1:-1:-1;;;121035:51:0;;;;;;;;;;;;;;121105:729;;121155:14;;-1:-1:-1;;;;;121155:28:0;;121151:101;;121219:9;120807:1109;-1:-1:-1;;;120807:1109:0:o;121151:101::-;-1:-1:-1;;;121594:6:0;121639:17;;;;:11;:17;;;;;;;;;121627:29;;;;;;;;;-1:-1:-1;;;;;121627:29:0;;;;;-1:-1:-1;;;121627:29:0;;-1:-1:-1;;;;;121627:29:0;;;;;;;;-1:-1:-1;;;121627:29:0;;;;;;;;;;;;;121687:28;121683:109;;121755:9;120807:1109;-1:-1:-1;;;120807:1109:0:o;121683:109::-;121554:261;;;121016:833;120963:886;121877:31;;-1:-1:-1;;;121877:31:0;;;;;;;;;;;146737:191;146811:16;146830:6;;-1:-1:-1;;;;;146847:17:0;;;-1:-1:-1;;;;;;146847:17:0;;;;;;146880:40;;146830:6;;;;;;;146880:40;;146811:16;146880:40;146800:128;146737:191;:::o;123949:287::-;114653:10;-1:-1:-1;;;;;124048:24:0;;;124044:54;;124081:17;;-1:-1:-1;;;124081:17:0;;;;;;;;;;;124044:54;114653:10;124111:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;124111:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;124111:53:0;;;;;;;;;;124180:48;;1001:41:1;;;124111:42:0;;114653:10;124180:48;;974:18:1;124180:48:0;;;;;;;123949:287;;:::o;125035:369::-;125202:28;125212:4;125218:2;125222:7;125202:9;:28::i;:::-;-1:-1:-1;;;;;125245:13:0;;15576:19;:23;;125245:76;;;;;125265:56;125296:4;125302:2;125306:7;125315:5;125265:30;:56::i;:::-;125264:57;125245:76;125241:156;;;125345:40;;-1:-1:-1;;;125345:40:0;;;;;;;;;;;155741:113;155801:13;155834:12;155827:19;;;;;:::i;29788:723::-;29844:13;30065:5;30074:1;30065:10;30061:53;;-1:-1:-1;;30092:10:0;;;;;;;;;;;;-1:-1:-1;;;30092:10:0;;;;;29788:723::o;30061:53::-;30139:5;30124:12;30180:78;30187:9;;30180:78;;30213:8;;;;:::i;:::-;;-1:-1:-1;30236:10:0;;-1:-1:-1;30244:2:0;30236:10;;:::i;:::-;;;30180:78;;;30268:19;30300:6;-1:-1:-1;;;;;30290:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30290:17:0;;30268:39;;30318:154;30325:10;;30318:154;;30352:11;30362:1;30352:11;;:::i;:::-;;-1:-1:-1;30421:10:0;30429:2;30421:5;:10;:::i;:::-;30408:24;;:2;:24;:::i;:::-;30395:39;;30378:6;30385;30378:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;30378:56:0;;;;;;;;-1:-1:-1;30449:11:0;30458:2;30449:11;;:::i;:::-;;;30318:154;;35964:231;36042:7;36063:17;36082:18;36104:27;36115:4;36121:9;36104:10;:27::i;:::-;36062:69;;;;36142:18;36154:5;36142:11;:18::i;:::-;-1:-1:-1;36178:9:0;35964:231;-1:-1:-1;;;35964:231:0:o;126308:163::-;126431:32;126437:2;126441:8;126451:5;126458:4;126431:5;:32::i;128759:2130::-;128874:35;128912:21;128925:7;128912:12;:21::i;:::-;128874:59;;128972:4;-1:-1:-1;;;;;128950:26:0;:13;:18;;;-1:-1:-1;;;;;128950:26:0;;128946:67;;128985:28;;-1:-1:-1;;;128985:28:0;;;;;;;;;;;128946:67;129026:22;114653:10;-1:-1:-1;;;;;129052:20:0;;;;:73;;-1:-1:-1;129089:36:0;129106:4;114653:10;124307:164;:::i;129089:36::-;129052:126;;;-1:-1:-1;114653:10:0;129142:20;129154:7;129142:11;:20::i;:::-;-1:-1:-1;;;;;129142:36:0;;129052:126;129026:153;;129197:17;129192:66;;129223:35;;-1:-1:-1;;;129223:35:0;;;;;;;;;;;129192:66;-1:-1:-1;;;;;129273:16:0;;129269:52;;129298:23;;-1:-1:-1;;;129298:23:0;;;;;;;;;;;129269:52;129442:35;129459:1;129463:7;129472:4;129442:8;:35::i;:::-;-1:-1:-1;;;;;129773:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;129773:31:0;;;-1:-1:-1;;;;;129773:31:0;;;-1:-1:-1;;129773:31:0;;;;;;;129819:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;129819:29:0;;;;;;;;;;;129899:20;;;:11;:20;;;;;;129934:18;;-1:-1:-1;;;;;;129967:49:0;;;;-1:-1:-1;;;130000:15:0;129967:49;;;;;;;;;;130290:11;;130350:24;;;;;130393:13;;129899:20;;130350:24;;130393:13;130389:384;;130603:13;;130588:11;:28;130584:174;;130641:20;;130710:28;;;;-1:-1:-1;;;;;130684:54:0;-1:-1:-1;;;130684:54:0;-1:-1:-1;;;;;;130684:54:0;;;-1:-1:-1;;;;;130641:20:0;;130684:54;;;;130584:174;129748:1036;;;130820:7;130816:2;-1:-1:-1;;;;;130801:27:0;130810:4;-1:-1:-1;;;;;130801:27:0;;;;;;;;;;;130839:42;157542:163;28700:716;29124:23;29150:69;29178:4;29150:69;;;;;;;;;;;;;;;;;29158:5;-1:-1:-1;;;;;29150:27:0;;;:69;;;;;:::i;:::-;29234:17;;29124:95;;-1:-1:-1;29234:21:0;29230:179;;29331:10;29320:30;;;;;;;;;;;;:::i;:::-;29312:85;;;;-1:-1:-1;;;29312:85:0;;23070:2:1;29312:85:0;;;23052:21:1;23109:2;23089:18;;;23082:30;23148:34;23128:18;;;23121:62;-1:-1:-1;;;23199:18:1;;;23192:40;23249:19;;29312:85:0;22868:406:1;134504:667:0;134688:72;;-1:-1:-1;;;134688:72:0;;134667:4;;-1:-1:-1;;;;;134688:36:0;;;;;:72;;114653:10;;134739:4;;134745:7;;134754:5;;134688:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;134688:72:0;;;;;;;;-1:-1:-1;;134688:72:0;;;;;;;;;;;;:::i;:::-;;;134684:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;134922:6;:13;134939:1;134922:18;134918:235;;134968:40;;-1:-1:-1;;;134968:40:0;;;;;;;;;;;134918:235;135111:6;135105:13;135096:6;135092:2;135088:15;135081:38;134684:480;-1:-1:-1;;;;;;134807:55:0;-1:-1:-1;;;134807:55:0;;-1:-1:-1;134504:667:0;;;;;;:::o;33854:1308::-;33935:7;33944:12;34169:9;:16;34189:2;34169:22;34165:990;;34465:4;34450:20;;34444:27;34515:4;34500:20;;34494:27;34573:4;34558:20;;34552:27;34208:9;34544:36;34616:25;34627:4;34544:36;34444:27;34494;34616:10;:25::i;:::-;34609:32;;;;;;;;;34165:990;34663:9;:16;34683:2;34663:22;34659:496;;34938:4;34923:20;;34917:27;34989:4;34974:20;;34968:27;35031:23;35042:4;34917:27;34968;35031:10;:23::i;:::-;35024:30;;;;;;;;34659:496;-1:-1:-1;35103:1:0;;-1:-1:-1;35107:35:0;34659:496;33854:1308;;;;;:::o;32125:643::-;32203:20;32194:5;:29;;;;;;;;:::i;:::-;;32190:571;;32125:643;:::o;32190:571::-;32301:29;32292:5;:38;;;;;;;;:::i;:::-;;32288:473;;32347:34;;-1:-1:-1;;;32347:34:0;;24361:2:1;32347:34:0;;;24343:21:1;24400:2;24380:18;;;24373:30;24439:26;24419:18;;;24412:54;24483:18;;32347:34:0;24159:348:1;32288:473:0;32412:35;32403:5;:44;;;;;;;;:::i;:::-;;32399:362;;32464:41;;-1:-1:-1;;;32464:41:0;;24714:2:1;32464:41:0;;;24696:21:1;24753:2;24733:18;;;24726:30;24792:33;24772:18;;;24765:61;24843:18;;32464:41:0;24512:355:1;32399:362:0;32536:30;32527:5;:39;;;;;;;;:::i;:::-;;32523:238;;32583:44;;-1:-1:-1;;;32583:44:0;;25074:2:1;32583:44:0;;;25056:21:1;25113:2;25093:18;;;25086:30;25152:34;25132:18;;;25125:62;-1:-1:-1;;;25203:18:1;;;25196:32;25245:19;;32583:44:0;24872:398:1;32523:238:0;32658:30;32649:5;:39;;;;;;;;:::i;:::-;;32645:116;;32705:44;;-1:-1:-1;;;32705:44:0;;25477:2:1;32705:44:0;;;25459:21:1;25516:2;25496:18;;;25489:30;25555:34;25535:18;;;25528:62;-1:-1:-1;;;25606:18:1;;;25599:32;25648:19;;32705:44:0;25275:398:1;126730:1775:0;126892:13;;-1:-1:-1;;;;;126920:16:0;;126916:48;;126945:19;;-1:-1:-1;;;126945:19:0;;;;;;;;;;;126916:48;126979:8;126991:1;126979:13;126975:44;;127001:18;;-1:-1:-1;;;127001:18:0;;;;;;;;;;;126975:44;-1:-1:-1;;;;;127370:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;127429:49:0;;-1:-1:-1;;;;;127370:44:0;;;;;;;127429:49;;;;-1:-1:-1;;127370:44:0;;;;;;127429:49;;;;;;;;;;;;;;;;127495:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;127545:66:0;;;;-1:-1:-1;;;127595:15:0;127545:66;;;;;;;;;;127495:25;127692:23;;;127736:4;:23;;;;-1:-1:-1;;;;;;127744:13:0;;15576:19;:23;;127744:15;127732:641;;;127780:314;127811:38;;127836:12;;-1:-1:-1;;;;;127811:38:0;;;127828:1;;127811:38;;127828:1;;127811:38;127877:69;127916:1;127920:2;127924:14;;;;;;127940:5;127877:30;:69::i;:::-;127872:174;;127982:40;;-1:-1:-1;;;127982:40:0;;;;;;;;;;;127872:174;128089:3;128073:12;:19;127780:314;;128175:12;128158:13;;:29;128154:43;;128189:8;;;128154:43;127732:641;;;128238:120;128269:40;;128294:14;;;;;-1:-1:-1;;;;;128269:40:0;;;128286:1;;128269:40;;128286:1;;128269:40;128353:3;128337:12;:19;128238:120;;127732:641;-1:-1:-1;128387:13:0;:28;128437:60;157542:163;18026:229;18163:12;18195:52;18217:6;18225:4;18231:1;18234:12;18195:21;:52::i;37416:1632::-;37547:7;;38481:66;38468:79;;38464:163;;;-1:-1:-1;38580:1:0;;-1:-1:-1;38584:30:0;38564:51;;38464:163;38641:1;:7;;38646:2;38641:7;;:18;;;;;38652:1;:7;;38657:2;38652:7;;38641:18;38637:102;;;-1:-1:-1;38692:1:0;;-1:-1:-1;38696:30:0;38676:51;;38637:102;38853:24;;;38836:14;38853:24;;;;;;;;;25905:25:1;;;25978:4;25966:17;;25946:18;;;25939:45;;;;26000:18;;;25993:34;;;26043:18;;;26036:34;;;38853:24:0;;25877:19:1;;38853:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38853:24:0;;-1:-1:-1;;38853:24:0;;;-1:-1:-1;;;;;;;38892:20:0;;38888:103;;38945:1;38949:29;38929:50;;;;;;;38888:103;39011:6;-1:-1:-1;39019:20:0;;-1:-1:-1;37416:1632:0;;;;;;;;:::o;36458:344::-;36572:7;;-1:-1:-1;;;;;36618:80:0;;36572:7;36725:25;36741:3;36726:18;;;36748:2;36725:25;:::i;:::-;36709:42;;36769:25;36780:4;36786:1;36789;36792;36769:10;:25::i;:::-;36762:32;;;;;;36458:344;;;;;;:::o;19146:510::-;19316:12;19374:5;19349:21;:30;;19341:81;;;;-1:-1:-1;;;19341:81:0;;26283:2:1;19341:81:0;;;26265:21:1;26322:2;26302:18;;;26295:30;26361:34;26341:18;;;26334:62;-1:-1:-1;;;26412:18:1;;;26405:36;26458:19;;19341:81:0;26081:402:1;19341:81:0;-1:-1:-1;;;;;15576:19:0;;;19433:60;;;;-1:-1:-1;;;19433:60:0;;26690:2:1;19433:60:0;;;26672:21:1;26729:2;26709:18;;;26702:30;26768:31;26748:18;;;26741:59;26817:18;;19433:60:0;26488:353:1;19433:60:0;19507:12;19521:23;19548:6;-1:-1:-1;;;;;19548:11:0;19567:5;19574:4;19548:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19506:73;;;;19597:51;19614:7;19623:10;19635:12;19597:16;:51::i;:::-;19590:58;19146:510;-1:-1:-1;;;;;;;19146:510:0:o;21832:712::-;21982:12;22011:7;22007:530;;;-1:-1:-1;22042:10:0;22035:17;;22007:530;22156:17;;:21;22152:374;;22354:10;22348:17;22415:15;22402:10;22398:2;22394:19;22387:44;22152:374;22497:12;22490:20;;-1:-1:-1;;;22490:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;475:131:1;-1:-1:-1;;;;;;549:32:1;;539:43;;529:71;;596:1;593;586:12;611:245;669:6;722:2;710:9;701:7;697:23;693:32;690:52;;;738:1;735;728:12;690:52;777:9;764:23;796:30;820:5;796:30;:::i;1053:258::-;1125:1;1135:113;1149:6;1146:1;1143:13;1135:113;;;1225:11;;;1219:18;1206:11;;;1199:39;1171:2;1164:10;1135:113;;;1266:6;1263:1;1260:13;1257:48;;;-1:-1:-1;;1301:1:1;1283:16;;1276:27;1053:258::o;1316:::-;1358:3;1396:5;1390:12;1423:6;1418:3;1411:19;1439:63;1495:6;1488:4;1483:3;1479:14;1472:4;1465:5;1461:16;1439:63;:::i;:::-;1556:2;1535:15;-1:-1:-1;;1531:29:1;1522:39;;;;1563:4;1518:50;;1316:258;-1:-1:-1;;1316:258:1:o;1579:220::-;1728:2;1717:9;1710:21;1691:4;1748:45;1789:2;1778:9;1774:18;1766:6;1748:45;:::i;1804:180::-;1863:6;1916:2;1904:9;1895:7;1891:23;1887:32;1884:52;;;1932:1;1929;1922:12;1884:52;-1:-1:-1;1955:23:1;;1804:180;-1:-1:-1;1804:180:1:o;2197:131::-;-1:-1:-1;;;;;2272:31:1;;2262:42;;2252:70;;2318:1;2315;2308:12;2333:315;2401:6;2409;2462:2;2450:9;2441:7;2437:23;2433:32;2430:52;;;2478:1;2475;2468:12;2430:52;2517:9;2504:23;2536:31;2561:5;2536:31;:::i;:::-;2586:5;2638:2;2623:18;;;;2610:32;;-1:-1:-1;;;2333:315:1:o;2835:615::-;2921:6;2929;2982:2;2970:9;2961:7;2957:23;2953:32;2950:52;;;2998:1;2995;2988:12;2950:52;3038:9;3025:23;-1:-1:-1;;;;;3108:2:1;3100:6;3097:14;3094:34;;;3124:1;3121;3114:12;3094:34;3162:6;3151:9;3147:22;3137:32;;3207:7;3200:4;3196:2;3192:13;3188:27;3178:55;;3229:1;3226;3219:12;3178:55;3269:2;3256:16;3295:2;3287:6;3284:14;3281:34;;;3311:1;3308;3301:12;3281:34;3364:7;3359:2;3349:6;3346:1;3342:14;3338:2;3334:23;3330:32;3327:45;3324:65;;;3385:1;3382;3375:12;3324:65;3416:2;3408:11;;;;;3438:6;;-1:-1:-1;2835:615:1;;-1:-1:-1;;;;2835:615:1:o;3455:118::-;3541:5;3534:13;3527:21;3520:5;3517:32;3507:60;;3563:1;3560;3553:12;3578:241;3634:6;3687:2;3675:9;3666:7;3662:23;3658:32;3655:52;;;3703:1;3700;3693:12;3655:52;3742:9;3729:23;3761:28;3783:5;3761:28;:::i;3824:255::-;3891:6;3944:2;3932:9;3923:7;3919:23;3915:32;3912:52;;;3960:1;3957;3950:12;3912:52;3999:9;3986:23;4018:31;4043:5;4018:31;:::i;4084:456::-;4161:6;4169;4177;4230:2;4218:9;4209:7;4205:23;4201:32;4198:52;;;4246:1;4243;4236:12;4198:52;4285:9;4272:23;4304:31;4329:5;4304:31;:::i;:::-;4354:5;-1:-1:-1;4411:2:1;4396:18;;4383:32;4424:33;4383:32;4424:33;:::i;:::-;4084:456;;4476:7;;-1:-1:-1;;;4530:2:1;4515:18;;;;4502:32;;4084:456::o;4545:127::-;4606:10;4601:3;4597:20;4594:1;4587:31;4637:4;4634:1;4627:15;4661:4;4658:1;4651:15;4677:632;4742:5;-1:-1:-1;;;;;4813:2:1;4805:6;4802:14;4799:40;;;4819:18;;:::i;:::-;4894:2;4888:9;4862:2;4948:15;;-1:-1:-1;;4944:24:1;;;4970:2;4940:33;4936:42;4924:55;;;4994:18;;;5014:22;;;4991:46;4988:72;;;5040:18;;:::i;:::-;5080:10;5076:2;5069:22;5109:6;5100:15;;5139:6;5131;5124:22;5179:3;5170:6;5165:3;5161:16;5158:25;5155:45;;;5196:1;5193;5186:12;5155:45;5246:6;5241:3;5234:4;5226:6;5222:17;5209:44;5301:1;5294:4;5285:6;5277;5273:19;5269:30;5262:41;;;;4677:632;;;;;:::o;5314:451::-;5383:6;5436:2;5424:9;5415:7;5411:23;5407:32;5404:52;;;5452:1;5449;5442:12;5404:52;5492:9;5479:23;-1:-1:-1;;;;;5517:6:1;5514:30;5511:50;;;5557:1;5554;5547:12;5511:50;5580:22;;5633:4;5625:13;;5621:27;-1:-1:-1;5611:55:1;;5662:1;5659;5652:12;5611:55;5685:74;5751:7;5746:2;5733:16;5728:2;5724;5720:11;5685:74;:::i;5770:402::-;5852:6;5860;5913:2;5901:9;5892:7;5888:23;5884:32;5881:52;;;5929:1;5926;5919:12;5881:52;5968:9;5955:23;5987:31;6012:5;5987:31;:::i;:::-;6037:5;-1:-1:-1;6094:2:1;6079:18;;6066:32;6107:33;6066:32;6107:33;:::i;:::-;6159:7;6149:17;;;5770:402;;;;;:::o;6668:221::-;6710:5;6763:3;6756:4;6748:6;6744:17;6740:27;6730:55;;6781:1;6778;6771:12;6730:55;6803:80;6879:3;6870:6;6857:20;6850:4;6842:6;6838:17;6803:80;:::i;6894:388::-;6971:6;6979;7032:2;7020:9;7011:7;7007:23;7003:32;7000:52;;;7048:1;7045;7038:12;7000:52;7084:9;7071:23;7061:33;;7145:2;7134:9;7130:18;7117:32;-1:-1:-1;;;;;7164:6:1;7161:30;7158:50;;;7204:1;7201;7194:12;7158:50;7227:49;7268:7;7259:6;7248:9;7244:22;7227:49;:::i;:::-;7217:59;;;6894:388;;;;;:::o;7287:382::-;7352:6;7360;7413:2;7401:9;7392:7;7388:23;7384:32;7381:52;;;7429:1;7426;7419:12;7381:52;7468:9;7455:23;7487:31;7512:5;7487:31;:::i;:::-;7537:5;-1:-1:-1;7594:2:1;7579:18;;7566:32;7607:30;7566:32;7607:30;:::i;7674:665::-;7769:6;7777;7785;7793;7846:3;7834:9;7825:7;7821:23;7817:33;7814:53;;;7863:1;7860;7853:12;7814:53;7902:9;7889:23;7921:31;7946:5;7921:31;:::i;:::-;7971:5;-1:-1:-1;8028:2:1;8013:18;;8000:32;8041:33;8000:32;8041:33;:::i;:::-;8093:7;-1:-1:-1;8147:2:1;8132:18;;8119:32;;-1:-1:-1;8202:2:1;8187:18;;8174:32;-1:-1:-1;;;;;8218:30:1;;8215:50;;;8261:1;8258;8251:12;8215:50;8284:49;8325:7;8316:6;8305:9;8301:22;8284:49;:::i;:::-;8274:59;;;7674:665;;;;;;;:::o;8344:309::-;8409:6;8417;8470:2;8458:9;8449:7;8445:23;8441:32;8438:52;;;8486:1;8483;8476:12;8438:52;8525:9;8512:23;8544:28;8566:5;8544:28;:::i;8924:455::-;9001:6;9009;9062:2;9050:9;9041:7;9037:23;9033:32;9030:52;;;9078:1;9075;9068:12;9030:52;9117:9;9104:23;9136:31;9161:5;9136:31;:::i;:::-;9186:5;-1:-1:-1;9242:2:1;9227:18;;9214:32;-1:-1:-1;;;;;9258:30:1;;9255:50;;;9301:1;9298;9291:12;9777:248;9845:6;9853;9906:2;9894:9;9885:7;9881:23;9877:32;9874:52;;;9922:1;9919;9912:12;9874:52;-1:-1:-1;;9945:23:1;;;10015:2;10000:18;;;9987:32;;-1:-1:-1;9777:248:1:o;10030:127::-;10091:10;10086:3;10082:20;10079:1;10072:31;10122:4;10119:1;10112:15;10146:4;10143:1;10136:15;10162:125;10202:4;10230:1;10227;10224:8;10221:34;;;10235:18;;:::i;:::-;-1:-1:-1;10272:9:1;;10162:125::o;10292:380::-;10371:1;10367:12;;;;10414;;;10435:61;;10489:4;10481:6;10477:17;10467:27;;10435:61;10542:2;10534:6;10531:14;10511:18;10508:38;10505:161;;10588:10;10583:3;10579:20;10576:1;10569:31;10623:4;10620:1;10613:15;10651:4;10648:1;10641:15;10505:161;;10292:380;;;:::o;10677:356::-;10879:2;10861:21;;;10898:18;;;10891:30;10957:34;10952:2;10937:18;;10930:62;11024:2;11009:18;;10677:356::o;11038:128::-;11078:3;11109:1;11105:6;11102:1;11099:13;11096:39;;;11115:18;;:::i;:::-;-1:-1:-1;11151:9:1;;11038:128::o;11521:127::-;11582:10;11577:3;11573:20;11570:1;11563:31;11613:4;11610:1;11603:15;11637:4;11634:1;11627:15;11653:135;11692:3;11713:17;;;11710:43;;11733:18;;:::i;:::-;-1:-1:-1;11780:1:1;11769:13;;11653:135::o;11793:402::-;11995:2;11977:21;;;12034:2;12014:18;;;12007:30;12073:34;12068:2;12053:18;;12046:62;-1:-1:-1;;;12139:2:1;12124:18;;12117:36;12185:3;12170:19;;11793:402::o;12200:407::-;12402:2;12384:21;;;12441:2;12421:18;;;12414:30;12480:34;12475:2;12460:18;;12453:62;-1:-1:-1;;;12546:2:1;12531:18;;12524:41;12597:3;12582:19;;12200:407::o;13109:184::-;13179:6;13232:2;13220:9;13211:7;13207:23;13203:32;13200:52;;;13248:1;13245;13238:12;13200:52;-1:-1:-1;13271:16:1;;13109:184;-1:-1:-1;13109:184:1:o;15481:168::-;15521:7;15587:1;15583;15579:6;15575:14;15572:1;15569:21;15564:1;15557:9;15550:17;15546:45;15543:71;;;15594:18;;:::i;:::-;-1:-1:-1;15634:9:1;;15481:168::o;18284:470::-;18463:3;18501:6;18495:13;18517:53;18563:6;18558:3;18551:4;18543:6;18539:17;18517:53;:::i;:::-;18633:13;;18592:16;;;;18655:57;18633:13;18592:16;18689:4;18677:17;;18655:57;:::i;:::-;18728:20;;18284:470;-1:-1:-1;;;;18284:470:1:o;20259:127::-;20320:10;20315:3;20311:20;20308:1;20301:31;20351:4;20348:1;20341:15;20375:4;20372:1;20365:15;20391:120;20431:1;20457;20447:35;;20462:18;;:::i;:::-;-1:-1:-1;20496:9:1;;20391:120::o;21610:245::-;21677:6;21730:2;21718:9;21709:7;21705:23;21701:32;21698:52;;;21746:1;21743;21736:12;21698:52;21778:9;21772:16;21797:28;21819:5;21797:28;:::i;21860:112::-;21892:1;21918;21908:35;;21923:18;;:::i;:::-;-1:-1:-1;21957:9:1;;21860:112::o;23279:489::-;-1:-1:-1;;;;;23548:15:1;;;23530:34;;23600:15;;23595:2;23580:18;;23573:43;23647:2;23632:18;;23625:34;;;23695:3;23690:2;23675:18;;23668:31;;;23473:4;;23716:46;;23742:19;;23734:6;23716:46;:::i;:::-;23708:54;23279:489;-1:-1:-1;;;;;;23279:489:1:o;23773:249::-;23842:6;23895:2;23883:9;23874:7;23870:23;23866:32;23863:52;;;23911:1;23908;23901:12;23863:52;23943:9;23937:16;23962:30;23986:5;23962:30;:::i;24027:127::-;24088:10;24083:3;24079:20;24076:1;24069:31;24119:4;24116:1;24109:15;24143:4;24140:1;24133:15;26846:274;26975:3;27013:6;27007:13;27029:53;27075:6;27070:3;27063:4;27055:6;27051:17;27029:53;:::i;:::-;27098:16;;;;;26846:274;-1:-1:-1;;26846:274:1:o
Swarm Source
ipfs://73b75b2203dc91cb8a4d30f21f1fca79122293ec9a1ed9f8e57496c108e35548
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,289.39 | 0.005 | $16.45 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.