ETH Price: $1,848.73 (-9.50%)

Transaction Decoder

Block:
21643282 at Jan-17-2025 09:20:59 AM +UTC
Transaction Fee:
0.001031236345844588 ETH $1.91
Gas Used:
161,254 Gas / 6.395105522 Gwei

Emitted Events:

12 0xca9de1f80df74331c5fcb7eee2d05e746d47bfb2.0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef( 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x000000000000000000000000ef1f6c5806051b371249821bf838beef9e6552cb, 00000000000000000000000000000000000000000000000000005aa0a302ee1b )
13 Diamond.0x66ff7c8f71ccc7c36152a41920d0d3b46ef3034359f76aa1498ed4478c204b5c( 0x66ff7c8f71ccc7c36152a41920d0d3b46ef3034359f76aa1498ed4478c204b5c, 0x000000000000000000000000ef1f6c5806051b371249821bf838beef9e6552cb, 00000000000000000000000000000000000000000000000000005af3107a4000 )

Account State Difference:

  Address   Before After State Difference Code
0x4315990D...03FA1126f 91.909565791539893943 Eth91.909665791539893943 Eth0.0001
(beaverbuild)
8.457332162847644901 Eth8.457488579228128663 Eth0.000156416380483762
0xCA9de1F8...46d47BFb2
0xef1f6c58...f9E6552Cb
0.00166825773211825 Eth
Nonce: 10
0.000537021386273662 Eth
Nonce: 11
0.001131236345844588

Execution Trace

ETH 0.0001 Diamond.CALL( )
  • ETH 0.0001 VaultFacet.DELEGATECALL( )
    • 0xca9de1f80df74331c5fcb7eee2d05e746d47bfb2.STATICCALL( )
    • Diamond.13ef789e( )
      • InvestmentManagerFacet.getTotalAssetBalance( asset=0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE ) => ( totalBalance=887168016845762651515 )
        • Diamond.b0549676( )
          • InvestmentManagerFacet.delegateBySelf( providerAddress=0x23310B0523843c290bBaDAF0B8bBD321c3E39c62, callData=0x5373433F000000000000000000000000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE ) => ( 0x00000000000000000000000000000000000000000000002B1C6D38D311D78EC4 )
            • LidoProvider.getAssetBalance( asset=0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE ) => ( 795258351054222757572 )
            • 0xca9de1f80df74331c5fcb7eee2d05e746d47bfb2.40c10f19( )
              File 1 of 4: Diamond
              // SPDX-License-Identifier: Apache-2.0.
              pragma solidity ^0.8.24;
              import {LibDiamond} from "./libraries/LibDiamond.sol";
              import {IDiamondCut} from "./interfaces/IDiamondCut.sol";
              contract Diamond {
                constructor(address _contractOwner, address _diamondCutFacet) payable {
                  LibDiamond.setContractOwner(_contractOwner);
                  // Add the diamondCut external function from the diamondCutFacet
                  IDiamondCut.FacetCut[] memory cut = new IDiamondCut.FacetCut[](1);
                  bytes4[] memory functionSelectors = new bytes4[](1);
                  functionSelectors[0] = IDiamondCut.diamondCut.selector;
                  cut[0] = IDiamondCut.FacetCut({
                    facetAddress: _diamondCutFacet,
                    action: IDiamondCut.FacetCutAction.Add,
                    functionSelectors: functionSelectors
                  });
                  LibDiamond.diamondCut(cut, address(0), "");
                }
                // Find facet for function that is called and execute the
                // function if a facet is found and return any value.
                fallback() external payable {
                  LibDiamond.DiamondStorage storage ds;
                  bytes32 position = LibDiamond.DIAMOND_STORAGE_POSITION;
                  // get diamond storage
                  assembly {
                    ds.slot := position
                  }
                  // get facet from function selector
                  address facet = ds.selectorToFacetAndPosition[msg.sig].facetAddress;
                  require(facet != address(0), "Diamond: Function does not exist");
                  // Execute external function from facet using delegatecall and return any value.
                  assembly {
                    // copy function selector and any arguments
                    calldatacopy(0, 0, calldatasize())
                    // execute function call using the facet
                    let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0)
                    // get any return value
                    returndatacopy(0, 0, returndatasize())
                    // return any return value or error back to the caller
                    switch result
                    case 0 {
                      revert(0, returndatasize())
                    }
                    default {
                      return(0, returndatasize())
                    }
                  }
                }
                receive() external payable {}
              }
              // SPDX-License-Identifier: Apache-2.0.
              pragma solidity ^0.8.24;
              /******************************************************************************\\
              * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen)
              * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535
              /******************************************************************************/
              interface IDiamondCut {
                enum FacetCutAction {
                  Add,
                  Replace,
                  Remove
                }
                // Add=0, Replace=1, Remove=2
                struct FacetCut {
                  address facetAddress;
                  FacetCutAction action;
                  bytes4[] functionSelectors;
                }
                /// @notice Add/replace/remove any number of functions and optionally execute
                ///         a function with delegatecall
                /// @param _diamondCut Contains the facet addresses and function selectors
                /// @param _init The address of the contract or facet to execute _calldata
                /// @param _calldata A function call, including function selector and arguments
                ///                  _calldata is executed with delegatecall on _init
                function diamondCut(
                  FacetCut[] calldata _diamondCut,
                  address _init,
                  bytes calldata _calldata
                ) external;
                event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata);
              }
              // SPDX-License-Identifier: Apache-2.0.
              pragma solidity ^0.8.24;
              /******************************************************************************\\
              * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen)
              * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535
              /******************************************************************************/
              import {IDiamondCut} from "../interfaces/IDiamondCut.sol";
              // Remember to add the loupe functions from DiamondLoupeFacet to the diamond.
              // The loupe functions are required by the EIP2535 Diamonds standard
              error InitializationFunctionReverted(
                address _initializationContractAddress,
                bytes _calldata
              );
              library LibDiamond {
                bytes32 constant DIAMOND_STORAGE_POSITION =
                  keccak256("diamond.standard.diamond.storage");
                struct FacetAddressAndPosition {
                  address facetAddress;
                  uint96 functionSelectorPosition; // position in facetFunctionSelectors.functionSelectors array
                }
                struct FacetFunctionSelectors {
                  bytes4[] functionSelectors;
                  uint256 facetAddressPosition; // position of facetAddress in facetAddresses array
                }
                struct DiamondStorage {
                  // maps function selector to the facet address and
                  // the position of the selector in the facetFunctionSelectors.selectors array
                  mapping(bytes4 => FacetAddressAndPosition) selectorToFacetAndPosition;
                  // maps facet addresses to function selectors
                  mapping(address => FacetFunctionSelectors) facetFunctionSelectors;
                  // facet addresses
                  address[] facetAddresses;
                  // Used to query if a contract implements an interface.
                  // Used to implement ERC-165.
                  mapping(bytes4 => bool) supportedInterfaces;
                  // owner of the contract
                  address contractOwner;
                }
                function diamondStorage() internal pure returns (DiamondStorage storage ds) {
                  bytes32 position = DIAMOND_STORAGE_POSITION;
                  assembly {
                    ds.slot := position
                  }
                }
                event OwnershipTransferred(
                  address indexed previousOwner,
                  address indexed newOwner
                );
                function setContractOwner(address _newOwner) internal {
                  DiamondStorage storage ds = diamondStorage();
                  address previousOwner = ds.contractOwner;
                  ds.contractOwner = _newOwner;
                  emit OwnershipTransferred(previousOwner, _newOwner);
                }
                function contractOwner() internal view returns (address contractOwner_) {
                  contractOwner_ = diamondStorage().contractOwner;
                }
                function enforceIsContractOwner() internal view {
                  require(
                    msg.sender == diamondStorage().contractOwner,
                    "LibDiamond: Must be contract owner"
                  );
                }
                event DiamondCut(
                  IDiamondCut.FacetCut[] _diamondCut,
                  address _init,
                  bytes _calldata
                );
                // Internal function version of diamondCut
                function diamondCut(
                  IDiamondCut.FacetCut[] memory _diamondCut,
                  address _init,
                  bytes memory _calldata
                ) internal {
                  for (uint256 facetIndex; facetIndex < _diamondCut.length; facetIndex++) {
                    IDiamondCut.FacetCutAction action = _diamondCut[facetIndex].action;
                    if (action == IDiamondCut.FacetCutAction.Add) {
                      addFunctions(
                        _diamondCut[facetIndex].facetAddress,
                        _diamondCut[facetIndex].functionSelectors
                      );
                    } else if (action == IDiamondCut.FacetCutAction.Replace) {
                      replaceFunctions(
                        _diamondCut[facetIndex].facetAddress,
                        _diamondCut[facetIndex].functionSelectors
                      );
                    } else if (action == IDiamondCut.FacetCutAction.Remove) {
                      removeFunctions(
                        _diamondCut[facetIndex].facetAddress,
                        _diamondCut[facetIndex].functionSelectors
                      );
                    } else {
                      revert("LibDiamondCut: Incorrect FacetCutAction");
                    }
                  }
                  emit DiamondCut(_diamondCut, _init, _calldata);
                  initializeDiamondCut(_init, _calldata);
                }
                function addFunctions(
                  address _facetAddress,
                  bytes4[] memory _functionSelectors
                ) internal {
                  require(
                    _functionSelectors.length > 0,
                    "LibDiamondCut: No selectors in facet to cut"
                  );
                  DiamondStorage storage ds = diamondStorage();
                  require(
                    _facetAddress != address(0),
                    "LibDiamondCut: Add facet can't be address(0)"
                  );
                  uint96 selectorPosition = uint96(
                    ds.facetFunctionSelectors[_facetAddress].functionSelectors.length
                  );
                  // add new facet address if it does not exist
                  if (selectorPosition == 0) {
                    addFacet(ds, _facetAddress);
                  }
                  for (
                    uint256 selectorIndex;
                    selectorIndex < _functionSelectors.length;
                    selectorIndex++
                  ) {
                    bytes4 selector = _functionSelectors[selectorIndex];
                    address oldFacetAddress = ds
                      .selectorToFacetAndPosition[selector]
                      .facetAddress;
                    require(
                      oldFacetAddress == address(0),
                      "LibDiamondCut: Can't add function that already exists"
                    );
                    addFunction(ds, selector, selectorPosition, _facetAddress);
                    selectorPosition++;
                  }
                }
                function replaceFunctions(
                  address _facetAddress,
                  bytes4[] memory _functionSelectors
                ) internal {
                  require(
                    _functionSelectors.length > 0,
                    "LibDiamondCut: No selectors in facet to cut"
                  );
                  DiamondStorage storage ds = diamondStorage();
                  require(
                    _facetAddress != address(0),
                    "LibDiamondCut: Add facet can't be address(0)"
                  );
                  uint96 selectorPosition = uint96(
                    ds.facetFunctionSelectors[_facetAddress].functionSelectors.length
                  );
                  // add new facet address if it does not exist
                  if (selectorPosition == 0) {
                    addFacet(ds, _facetAddress);
                  }
                  for (
                    uint256 selectorIndex;
                    selectorIndex < _functionSelectors.length;
                    selectorIndex++
                  ) {
                    bytes4 selector = _functionSelectors[selectorIndex];
                    address oldFacetAddress = ds
                      .selectorToFacetAndPosition[selector]
                      .facetAddress;
                    require(
                      oldFacetAddress != _facetAddress,
                      "LibDiamondCut: Can't replace function with same function"
                    );
                    removeFunction(ds, oldFacetAddress, selector);
                    addFunction(ds, selector, selectorPosition, _facetAddress);
                    selectorPosition++;
                  }
                }
                function removeFunctions(
                  address _facetAddress,
                  bytes4[] memory _functionSelectors
                ) internal {
                  require(
                    _functionSelectors.length > 0,
                    "LibDiamondCut: No selectors in facet to cut"
                  );
                  DiamondStorage storage ds = diamondStorage();
                  // if function does not exist then do nothing and return
                  require(
                    _facetAddress == address(0),
                    "LibDiamondCut: Remove facet address must be address(0)"
                  );
                  for (
                    uint256 selectorIndex;
                    selectorIndex < _functionSelectors.length;
                    selectorIndex++
                  ) {
                    bytes4 selector = _functionSelectors[selectorIndex];
                    address oldFacetAddress = ds
                      .selectorToFacetAndPosition[selector]
                      .facetAddress;
                    removeFunction(ds, oldFacetAddress, selector);
                  }
                }
                function addFacet(DiamondStorage storage ds, address _facetAddress) internal {
                  enforceHasContractCode(
                    _facetAddress,
                    "LibDiamondCut: New facet has no code"
                  );
                  ds.facetFunctionSelectors[_facetAddress].facetAddressPosition = ds
                    .facetAddresses
                    .length;
                  ds.facetAddresses.push(_facetAddress);
                }
                function addFunction(
                  DiamondStorage storage ds,
                  bytes4 _selector,
                  uint96 _selectorPosition,
                  address _facetAddress
                ) internal {
                  ds
                    .selectorToFacetAndPosition[_selector]
                    .functionSelectorPosition = _selectorPosition;
                  ds.facetFunctionSelectors[_facetAddress].functionSelectors.push(_selector);
                  ds.selectorToFacetAndPosition[_selector].facetAddress = _facetAddress;
                }
                function removeFunction(
                  DiamondStorage storage ds,
                  address _facetAddress,
                  bytes4 _selector
                ) internal {
                  require(
                    _facetAddress != address(0),
                    "LibDiamondCut: Can't remove function that doesn't exist"
                  );
                  // an immutable function is a function defined directly in a diamond
                  require(
                    _facetAddress != address(this),
                    "LibDiamondCut: Can't remove immutable function"
                  );
                  // replace selector with last selector, then delete last selector
                  uint256 selectorPosition = ds
                    .selectorToFacetAndPosition[_selector]
                    .functionSelectorPosition;
                  uint256 lastSelectorPosition = ds
                    .facetFunctionSelectors[_facetAddress]
                    .functionSelectors
                    .length - 1;
                  // if not the same then replace _selector with lastSelector
                  if (selectorPosition != lastSelectorPosition) {
                    bytes4 lastSelector = ds
                      .facetFunctionSelectors[_facetAddress]
                      .functionSelectors[lastSelectorPosition];
                    ds.facetFunctionSelectors[_facetAddress].functionSelectors[
                      selectorPosition
                    ] = lastSelector;
                    ds
                      .selectorToFacetAndPosition[lastSelector]
                      .functionSelectorPosition = uint96(selectorPosition);
                  }
                  // delete the last selector
                  ds.facetFunctionSelectors[_facetAddress].functionSelectors.pop();
                  delete ds.selectorToFacetAndPosition[_selector];
                  // if no more selectors for facet address then delete the facet address
                  if (lastSelectorPosition == 0) {
                    // replace facet address with last facet address and delete last facet address
                    uint256 lastFacetAddressPosition = ds.facetAddresses.length - 1;
                    uint256 facetAddressPosition = ds
                      .facetFunctionSelectors[_facetAddress]
                      .facetAddressPosition;
                    if (facetAddressPosition != lastFacetAddressPosition) {
                      address lastFacetAddress = ds.facetAddresses[lastFacetAddressPosition];
                      ds.facetAddresses[facetAddressPosition] = lastFacetAddress;
                      ds
                        .facetFunctionSelectors[lastFacetAddress]
                        .facetAddressPosition = facetAddressPosition;
                    }
                    ds.facetAddresses.pop();
                    delete ds.facetFunctionSelectors[_facetAddress].facetAddressPosition;
                  }
                }
                function initializeDiamondCut(
                  address _init,
                  bytes memory _calldata
                ) internal {
                  if (_init == address(0)) {
                    return;
                  }
                  enforceHasContractCode(_init, "LibDiamondCut: _init address has no code");
                  (bool success, bytes memory error) = _init.delegatecall(_calldata);
                  if (!success) {
                    if (error.length > 0) {
                      // bubble up error
                      /// @solidity memory-safe-assembly
                      assembly {
                        let returndata_size := mload(error)
                        revert(add(32, error), returndata_size)
                      }
                    } else {
                      revert InitializationFunctionReverted(_init, _calldata);
                    }
                  }
                }
                function enforceHasContractCode(
                  address _contract,
                  string memory _errorMessage
                ) internal view {
                  uint256 contractSize;
                  assembly {
                    contractSize := extcodesize(_contract)
                  }
                  require(contractSize > 0, _errorMessage);
                }
              }
              

              File 2 of 4: VaultFacet
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
              pragma solidity ^0.8.20;
              import {Context} from "../utils/Context.sol";
              /**
               * @dev Contract module which provides a basic access control mechanism, where
               * there is an account (an owner) that can be granted exclusive access to
               * specific functions.
               *
               * The initial owner is set to the address provided by the deployer. 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;
                  /**
                   * @dev The caller account is not authorized to perform an operation.
                   */
                  error OwnableUnauthorizedAccount(address account);
                  /**
                   * @dev The owner is not a valid owner account. (eg. `address(0)`)
                   */
                  error OwnableInvalidOwner(address owner);
                  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
                  /**
                   * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
                   */
                  constructor(address initialOwner) {
                      if (initialOwner == address(0)) {
                          revert OwnableInvalidOwner(address(0));
                      }
                      _transferOwnership(initialOwner);
                  }
                  /**
                   * @dev Throws if called by any account other than the owner.
                   */
                  modifier onlyOwner() {
                      _checkOwner();
                      _;
                  }
                  /**
                   * @dev Returns the address of the current owner.
                   */
                  function owner() public view virtual returns (address) {
                      return _owner;
                  }
                  /**
                   * @dev Throws if the sender is not the owner.
                   */
                  function _checkOwner() internal view virtual {
                      if (owner() != _msgSender()) {
                          revert OwnableUnauthorizedAccount(_msgSender());
                      }
                  }
                  /**
                   * @dev Leaves the contract without owner. It will not be possible to call
                   * `onlyOwner` functions. Can only be called by the current owner.
                   *
                   * NOTE: Renouncing ownership will leave the contract without an owner,
                   * thereby disabling 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 {
                      if (newOwner == address(0)) {
                          revert OwnableInvalidOwner(address(0));
                      }
                      _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);
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
              pragma solidity ^0.8.20;
              /**
               * @dev Standard ERC20 Errors
               * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
               */
              interface IERC20Errors {
                  /**
                   * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
                   * @param sender Address whose tokens are being transferred.
                   * @param balance Current balance for the interacting account.
                   * @param needed Minimum amount required to perform a transfer.
                   */
                  error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
                  /**
                   * @dev Indicates a failure with the token `sender`. Used in transfers.
                   * @param sender Address whose tokens are being transferred.
                   */
                  error ERC20InvalidSender(address sender);
                  /**
                   * @dev Indicates a failure with the token `receiver`. Used in transfers.
                   * @param receiver Address to which tokens are being transferred.
                   */
                  error ERC20InvalidReceiver(address receiver);
                  /**
                   * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
                   * @param spender Address that may be allowed to operate on tokens without being their owner.
                   * @param allowance Amount of tokens a `spender` is allowed to operate with.
                   * @param needed Minimum amount required to perform a transfer.
                   */
                  error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
                  /**
                   * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
                   * @param approver Address initiating an approval operation.
                   */
                  error ERC20InvalidApprover(address approver);
                  /**
                   * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
                   * @param spender Address that may be allowed to operate on tokens without being their owner.
                   */
                  error ERC20InvalidSpender(address spender);
              }
              /**
               * @dev Standard ERC721 Errors
               * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
               */
              interface IERC721Errors {
                  /**
                   * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
                   * Used in balance queries.
                   * @param owner Address of the current owner of a token.
                   */
                  error ERC721InvalidOwner(address owner);
                  /**
                   * @dev Indicates a `tokenId` whose `owner` is the zero address.
                   * @param tokenId Identifier number of a token.
                   */
                  error ERC721NonexistentToken(uint256 tokenId);
                  /**
                   * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
                   * @param sender Address whose tokens are being transferred.
                   * @param tokenId Identifier number of a token.
                   * @param owner Address of the current owner of a token.
                   */
                  error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
                  /**
                   * @dev Indicates a failure with the token `sender`. Used in transfers.
                   * @param sender Address whose tokens are being transferred.
                   */
                  error ERC721InvalidSender(address sender);
                  /**
                   * @dev Indicates a failure with the token `receiver`. Used in transfers.
                   * @param receiver Address to which tokens are being transferred.
                   */
                  error ERC721InvalidReceiver(address receiver);
                  /**
                   * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
                   * @param operator Address that may be allowed to operate on tokens without being their owner.
                   * @param tokenId Identifier number of a token.
                   */
                  error ERC721InsufficientApproval(address operator, uint256 tokenId);
                  /**
                   * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
                   * @param approver Address initiating an approval operation.
                   */
                  error ERC721InvalidApprover(address approver);
                  /**
                   * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
                   * @param operator Address that may be allowed to operate on tokens without being their owner.
                   */
                  error ERC721InvalidOperator(address operator);
              }
              /**
               * @dev Standard ERC1155 Errors
               * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
               */
              interface IERC1155Errors {
                  /**
                   * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
                   * @param sender Address whose tokens are being transferred.
                   * @param balance Current balance for the interacting account.
                   * @param needed Minimum amount required to perform a transfer.
                   * @param tokenId Identifier number of a token.
                   */
                  error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
                  /**
                   * @dev Indicates a failure with the token `sender`. Used in transfers.
                   * @param sender Address whose tokens are being transferred.
                   */
                  error ERC1155InvalidSender(address sender);
                  /**
                   * @dev Indicates a failure with the token `receiver`. Used in transfers.
                   * @param receiver Address to which tokens are being transferred.
                   */
                  error ERC1155InvalidReceiver(address receiver);
                  /**
                   * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
                   * @param operator Address that may be allowed to operate on tokens without being their owner.
                   * @param owner Address of the current owner of a token.
                   */
                  error ERC1155MissingApprovalForAll(address operator, address owner);
                  /**
                   * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
                   * @param approver Address initiating an approval operation.
                   */
                  error ERC1155InvalidApprover(address approver);
                  /**
                   * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
                   * @param operator Address that may be allowed to operate on tokens without being their owner.
                   */
                  error ERC1155InvalidOperator(address operator);
                  /**
                   * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
                   * Used in batch transfers.
                   * @param idsLength Length of the array of token identifiers
                   * @param valuesLength Length of the array of token amounts
                   */
                  error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)
              pragma solidity ^0.8.20;
              import {IERC20} from "./IERC20.sol";
              import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
              import {Context} from "../../utils/Context.sol";
              import {IERC20Errors} from "../../interfaces/draft-IERC6093.sol";
              /**
               * @dev Implementation of the {IERC20} interface.
               *
               * This implementation is agnostic to the way tokens are created. This means
               * that a supply mechanism has to be added in a derived contract using {_mint}.
               *
               * TIP: For a detailed writeup see our guide
               * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
               * to implement supply mechanisms].
               *
               * The default value of {decimals} is 18. To change this, you should override
               * this function so it returns a different value.
               *
               * We have followed general OpenZeppelin Contracts guidelines: functions revert
               * instead returning `false` on failure. This behavior is nonetheless
               * conventional and does not conflict with the expectations of ERC20
               * applications.
               *
               * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
               * This allows applications to reconstruct the allowance for all accounts just
               * by listening to said events. Other implementations of the EIP may not emit
               * these events, as it isn't required by the specification.
               */
              abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
                  mapping(address account => uint256) private _balances;
                  mapping(address account => mapping(address spender => uint256)) private _allowances;
                  uint256 private _totalSupply;
                  string private _name;
                  string private _symbol;
                  /**
                   * @dev Sets the values for {name} and {symbol}.
                   *
                   * All two of these values are immutable: they can only be set once during
                   * construction.
                   */
                  constructor(string memory name_, string memory symbol_) {
                      _name = name_;
                      _symbol = symbol_;
                  }
                  /**
                   * @dev Returns the name of the token.
                   */
                  function name() public view virtual returns (string memory) {
                      return _name;
                  }
                  /**
                   * @dev Returns the symbol of the token, usually a shorter version of the
                   * name.
                   */
                  function symbol() public view virtual returns (string memory) {
                      return _symbol;
                  }
                  /**
                   * @dev Returns the number of decimals used to get its user representation.
                   * For example, if `decimals` equals `2`, a balance of `505` tokens should
                   * be displayed to a user as `5.05` (`505 / 10 ** 2`).
                   *
                   * Tokens usually opt for a value of 18, imitating the relationship between
                   * Ether and Wei. This is the default value returned by this function, unless
                   * it's overridden.
                   *
                   * NOTE: This information is only used for _display_ purposes: it in
                   * no way affects any of the arithmetic of the contract, including
                   * {IERC20-balanceOf} and {IERC20-transfer}.
                   */
                  function decimals() public view virtual returns (uint8) {
                      return 18;
                  }
                  /**
                   * @dev See {IERC20-totalSupply}.
                   */
                  function totalSupply() public view virtual returns (uint256) {
                      return _totalSupply;
                  }
                  /**
                   * @dev See {IERC20-balanceOf}.
                   */
                  function balanceOf(address account) public view virtual returns (uint256) {
                      return _balances[account];
                  }
                  /**
                   * @dev See {IERC20-transfer}.
                   *
                   * Requirements:
                   *
                   * - `to` cannot be the zero address.
                   * - the caller must have a balance of at least `value`.
                   */
                  function transfer(address to, uint256 value) public virtual returns (bool) {
                      address owner = _msgSender();
                      _transfer(owner, to, value);
                      return true;
                  }
                  /**
                   * @dev See {IERC20-allowance}.
                   */
                  function allowance(address owner, address spender) public view virtual returns (uint256) {
                      return _allowances[owner][spender];
                  }
                  /**
                   * @dev See {IERC20-approve}.
                   *
                   * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
                   * `transferFrom`. This is semantically equivalent to an infinite approval.
                   *
                   * Requirements:
                   *
                   * - `spender` cannot be the zero address.
                   */
                  function approve(address spender, uint256 value) public virtual returns (bool) {
                      address owner = _msgSender();
                      _approve(owner, spender, value);
                      return true;
                  }
                  /**
                   * @dev See {IERC20-transferFrom}.
                   *
                   * Emits an {Approval} event indicating the updated allowance. This is not
                   * required by the EIP. See the note at the beginning of {ERC20}.
                   *
                   * NOTE: Does not update the allowance if the current allowance
                   * is the maximum `uint256`.
                   *
                   * Requirements:
                   *
                   * - `from` and `to` cannot be the zero address.
                   * - `from` must have a balance of at least `value`.
                   * - the caller must have allowance for ``from``'s tokens of at least
                   * `value`.
                   */
                  function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
                      address spender = _msgSender();
                      _spendAllowance(from, spender, value);
                      _transfer(from, to, value);
                      return true;
                  }
                  /**
                   * @dev Moves a `value` amount of tokens from `from` to `to`.
                   *
                   * This internal function is equivalent to {transfer}, and can be used to
                   * e.g. implement automatic token fees, slashing mechanisms, etc.
                   *
                   * Emits a {Transfer} event.
                   *
                   * NOTE: This function is not virtual, {_update} should be overridden instead.
                   */
                  function _transfer(address from, address to, uint256 value) internal {
                      if (from == address(0)) {
                          revert ERC20InvalidSender(address(0));
                      }
                      if (to == address(0)) {
                          revert ERC20InvalidReceiver(address(0));
                      }
                      _update(from, to, value);
                  }
                  /**
                   * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
                   * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
                   * this function.
                   *
                   * Emits a {Transfer} event.
                   */
                  function _update(address from, address to, uint256 value) internal virtual {
                      if (from == address(0)) {
                          // Overflow check required: The rest of the code assumes that totalSupply never overflows
                          _totalSupply += value;
                      } else {
                          uint256 fromBalance = _balances[from];
                          if (fromBalance < value) {
                              revert ERC20InsufficientBalance(from, fromBalance, value);
                          }
                          unchecked {
                              // Overflow not possible: value <= fromBalance <= totalSupply.
                              _balances[from] = fromBalance - value;
                          }
                      }
                      if (to == address(0)) {
                          unchecked {
                              // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                              _totalSupply -= value;
                          }
                      } else {
                          unchecked {
                              // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                              _balances[to] += value;
                          }
                      }
                      emit Transfer(from, to, value);
                  }
                  /**
                   * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
                   * Relies on the `_update` mechanism
                   *
                   * Emits a {Transfer} event with `from` set to the zero address.
                   *
                   * NOTE: This function is not virtual, {_update} should be overridden instead.
                   */
                  function _mint(address account, uint256 value) internal {
                      if (account == address(0)) {
                          revert ERC20InvalidReceiver(address(0));
                      }
                      _update(address(0), account, value);
                  }
                  /**
                   * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
                   * Relies on the `_update` mechanism.
                   *
                   * Emits a {Transfer} event with `to` set to the zero address.
                   *
                   * NOTE: This function is not virtual, {_update} should be overridden instead
                   */
                  function _burn(address account, uint256 value) internal {
                      if (account == address(0)) {
                          revert ERC20InvalidSender(address(0));
                      }
                      _update(account, address(0), value);
                  }
                  /**
                   * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
                   *
                   * This internal function is equivalent to `approve`, and can be used to
                   * e.g. set automatic allowances for certain subsystems, etc.
                   *
                   * Emits an {Approval} event.
                   *
                   * Requirements:
                   *
                   * - `owner` cannot be the zero address.
                   * - `spender` cannot be the zero address.
                   *
                   * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
                   */
                  function _approve(address owner, address spender, uint256 value) internal {
                      _approve(owner, spender, value, true);
                  }
                  /**
                   * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
                   *
                   * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
                   * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
                   * `Approval` event during `transferFrom` operations.
                   *
                   * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
                   * true using the following override:
                   * ```
                   * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
                   *     super._approve(owner, spender, value, true);
                   * }
                   * ```
                   *
                   * Requirements are the same as {_approve}.
                   */
                  function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
                      if (owner == address(0)) {
                          revert ERC20InvalidApprover(address(0));
                      }
                      if (spender == address(0)) {
                          revert ERC20InvalidSpender(address(0));
                      }
                      _allowances[owner][spender] = value;
                      if (emitEvent) {
                          emit Approval(owner, spender, value);
                      }
                  }
                  /**
                   * @dev Updates `owner` s allowance for `spender` based on spent `value`.
                   *
                   * Does not update the allowance value in case of infinite allowance.
                   * Revert if not enough allowance is available.
                   *
                   * Does not emit an {Approval} event.
                   */
                  function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
                      uint256 currentAllowance = allowance(owner, spender);
                      if (currentAllowance != type(uint256).max) {
                          if (currentAllowance < value) {
                              revert ERC20InsufficientAllowance(spender, currentAllowance, value);
                          }
                          unchecked {
                              _approve(owner, spender, currentAllowance - value, false);
                          }
                      }
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)
              pragma solidity ^0.8.20;
              import {IERC20} from "../IERC20.sol";
              /**
               * @dev Interface for the optional metadata functions from the ERC20 standard.
               */
              interface IERC20Metadata is IERC20 {
                  /**
                   * @dev Returns the name of the token.
                   */
                  function name() external view returns (string memory);
                  /**
                   * @dev Returns the symbol of the token.
                   */
                  function symbol() external view returns (string memory);
                  /**
                   * @dev Returns the decimals places of the token.
                   */
                  function decimals() external view returns (uint8);
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)
              pragma solidity ^0.8.20;
              /**
               * @dev Interface of the ERC20 standard as defined in the EIP.
               */
              interface IERC20 {
                  /**
                   * @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);
                  /**
                   * @dev Returns the value of tokens in existence.
                   */
                  function totalSupply() external view returns (uint256);
                  /**
                   * @dev Returns the value of tokens owned by `account`.
                   */
                  function balanceOf(address account) external view returns (uint256);
                  /**
                   * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool);
                  /**
                   * @dev Moves a `value` amount of tokens from `from` to `to` using the
                   * allowance mechanism. `value` 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 value) external returns (bool);
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
              pragma solidity ^0.8.20;
              /**
               * @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;
                  }
                  function _contextSuffixLength() internal view virtual returns (uint256) {
                      return 0;
                  }
              }
              // SPDX-License-Identifier: Apache-2.0.
              pragma solidity ^0.8.24;
              import {Ownable} from "../../utils/Ownable.sol";
              import {IVTokenGenerator} from "../../interfaces/IVTokenGenerator.sol";
              import {VToken} from "./VToken.sol";
              import {IERC20Detailed} from "../../interfaces/IERC20Detailed.sol";
              import {IRegisterProxy} from "../../interfaces/IRegisterProxy.sol";
              import {LibAddress} from "../../libraries/LibAddress.sol";
              import {LibDiamond} from "../../libraries/LibDiamond.sol";
              import {IInvestmentManager} from "../../interfaces/IInvestmentManager.sol";
              import "hardhat/console.sol";
              contract VaultFacet is Ownable {
                using LibAddress for address;
                struct VtokenInfo {
                  uint256 id;
                  address owner;
                }
                event EthVTokenCreated(address indexed vTokenAddress);
                event Erc20VTokenCreated(
                  address indexed erc20Address,
                  address indexed vTokenAddress
                );
                event EthDeposited(
                  address indexed sender,
                  uint256 amount
                );
                event Erc20Deposited(
                  address sender,
                  address indexed erc20Address,
                  uint256 amount
                );
                event EthWithdrawn(address indexed receiver, uint256 amount);
                event Erc20Withdrawn(
                  address erc20Address,
                  address indexed receiver,
                  uint256 amount
                );
                string internal constant VTOKEN_NAME_PREFIX = "RedSonic Vault";
                string internal constant VTOKEN_SYMBOL_PREFIX = "rsv";
                address constant NATIVE_ETH_ADDRESS =
                  0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
                bytes4 internal constant ERC20_SELECTOR =
                  bytes4(keccak256("ERC20Token(address)"));
                uint256 internal constant MASK_250 =
                  0x03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
                uint256 constant TOKEN_CONTRACT_ADDRESS_OFFSET = 36;
                uint8 public constant ETH_DECIMALS = 18;
                uint256 public constant VTOKEN_VALUE_PRECISION = 1e18;
                bytes32 constant VAULTFACET_STORAGE_POSITION =
                  keccak256("diamond.standard.vaultFacet.storage");
                struct VaultStorage {    
                  address starkExAddress;
                  address registerHelperAddress;
                  address registerProxyAddress;
                  address ethVTokenAddress;
                  mapping(address => address) vTokenFromErc20;
                  mapping(address => address) erc20FromVToken;
                }
                function _vaultStorage() internal pure returns (VaultStorage storage ds) {
                  bytes32 position = VAULTFACET_STORAGE_POSITION;
                  assembly {
                    ds.slot := position
                  }
                }
                // Getters
                function ethVTokenAddress() public view returns (address) {
                  return _vaultStorage().ethVTokenAddress;
                }
                function vTokenFromErc20(address erc20Address) public view returns (address) {
                  return _vaultStorage().vTokenFromErc20[erc20Address];
                }
                function erc20FromVToken(address vTokenAddress)
                  public
                  view
                  returns (address)
                {
                  return _vaultStorage().erc20FromVToken[vTokenAddress];
                }
                function getEthPerVToken() public view returns (uint256) {
                  require(
                    ethVTokenAddress() != address(0),
                    "Vaults: eth vToken not registered"
                  );
                  uint256 totalSupply = VToken(ethVTokenAddress()).totalSupply();
                  uint256 ethTotalBalance = IInvestmentManager(address(this))
                    .getTotalAssetBalance(NATIVE_ETH_ADDRESS);
                  return
                    totalSupply > 0
                      ? (VTOKEN_VALUE_PRECISION * ethTotalBalance) / totalSupply
                      : VTOKEN_VALUE_PRECISION;
                }
                function _getEthPerVTokenDuringDeposit(uint256 depositAmount)
                  internal
                  view
                  returns (uint256)
                {
                  require(
                    ethVTokenAddress() != address(0),
                    "Vaults: eth vToken not registered"
                  );
                  uint256 totalSupply = VToken(ethVTokenAddress()).totalSupply();
                  uint256 ethTotalBalance = IInvestmentManager(address(this))
                    .getTotalAssetBalance(NATIVE_ETH_ADDRESS);
                  return
                    totalSupply > 0
                      ? (VTOKEN_VALUE_PRECISION * (ethTotalBalance - depositAmount)) /
                        totalSupply
                      : VTOKEN_VALUE_PRECISION;
                }
                function getErc20PerVToken(address erc20Address)
                  public
                  view
                  returns (uint256)
                {
                  address vTokenContract = vTokenFromErc20(erc20Address);
                  require(vTokenContract != address(0), "Vaults: vToken not registered");
                  uint256 totalSupply = VToken(vTokenContract).totalSupply();
                  uint256 erc20TotalBalance = IInvestmentManager(address(this))
                    .getTotalAssetBalance(erc20Address);
                  return
                    totalSupply > 0
                      ? (VTOKEN_VALUE_PRECISION * erc20TotalBalance) / totalSupply
                      : VTOKEN_VALUE_PRECISION;
                }
                function vTokenToEthAmount(uint256 vTokenAmount)
                  public
                  view
                  returns (uint256)
                {
                  uint256 ethPerVToken = getEthPerVToken();
                  return (ethPerVToken * vTokenAmount) / VTOKEN_VALUE_PRECISION;
                }
                function ethToVtokenAmount(uint256 ethAmount) public view returns (uint256) {
                  uint256 ethPerVToken = getEthPerVToken();
                  if (ethPerVToken == 0) {
                    return 0;
                  }
                  return (ethAmount * VTOKEN_VALUE_PRECISION) / ethPerVToken;
                }
                function ethToVtokenAmountDuringDeposit(uint256 ethAmount)
                  public
                  view
                  returns (uint256)
                {
                  uint256 ethPerVToken = _getEthPerVTokenDuringDeposit(ethAmount);
                  if (ethPerVToken == 0) {
                    return 0;
                  }
                  return (ethAmount * VTOKEN_VALUE_PRECISION) / ethPerVToken;
                }
                function vTokenToErc20Amount(address erc20Adress, uint256 vTokenAmount)
                  public
                  view
                  returns (uint256)
                {
                  uint256 erc20PerVToken = getErc20PerVToken(erc20Adress);
                  return (erc20PerVToken * vTokenAmount) / VTOKEN_VALUE_PRECISION;
                }
                function erc20ToVTokenAmount(address erc20Address, uint256 erc20Amount)
                  public
                  view
                  returns (uint256)
                {
                  uint256 erc20PerVToken = getErc20PerVToken(erc20Address);
                  if (erc20PerVToken == 0) {
                    return 0;
                  }
                  return (erc20Amount * VTOKEN_VALUE_PRECISION) / erc20PerVToken;
                }
                function getErc20AssetInfo(address tokenAddress)
                  public
                  pure
                  returns (bytes memory)
                {
                  bytes16 assetSelector = bytes16(ERC20_SELECTOR);
                  bytes memory assetInfo = abi.encodePacked(
                    abi.encodePacked(assetSelector),
                    abi.encodePacked(tokenAddress)
                  );
                  return assetInfo;
                }
                function getErc20AssetType(address tokenAddress, uint256 quantum)
                  public
                  pure
                  returns (uint256)
                {
                  bytes memory assetInfo = getErc20AssetInfo(tokenAddress);
                  bytes memory assetInfoWithQuantum = abi.encodePacked(assetInfo, quantum);
                  return uint256(keccak256(assetInfoWithQuantum)) & MASK_250;
                }
                function extractContractAddressFromAssetInfo(bytes memory assetInfo)
                  public
                  pure
                  returns (address)
                {
                  uint256 offset = TOKEN_CONTRACT_ADDRESS_OFFSET;
                  uint256 res;
                  assembly {
                    res := mload(add(assetInfo, offset))
                  }
                  return address(uint160(res));
                }
                function registerEth() external {
                  VaultStorage storage ds = _vaultStorage();
                  require(
                    ds.ethVTokenAddress == address(0),
                    "Vaults: eth vToken already registered"
                  );
                  ds.ethVTokenAddress = IVTokenGenerator(address(this)).createToken(
                    string(abi.encodePacked(VTOKEN_NAME_PREFIX, " ", "Ethereum")),
                    string(abi.encodePacked(VTOKEN_SYMBOL_PREFIX, "ETH")),
                    ETH_DECIMALS
                  );
                  emit EthVTokenCreated(ds.ethVTokenAddress);
                }
                function registerErc20(address erc20Address) external {
                  VaultStorage storage ds = _vaultStorage();
                  require(
                    ds.vTokenFromErc20[erc20Address] == address(0),
                    "Vaults: vToken already registered"
                  );
                  IERC20Detailed erc20Token = IERC20Detailed(erc20Address);
                  uint8 vErc20Decimals = erc20Token.decimals();
                  string memory name = string(
                    abi.encodePacked(VTOKEN_NAME_PREFIX, " ", erc20Token.name())
                  );
                  string memory symbol = string(
                    abi.encodePacked(VTOKEN_SYMBOL_PREFIX, erc20Token.symbol())
                  );
                  address erc20VTokenAddress = IVTokenGenerator(address(this)).createToken(
                    name,
                    symbol,
                    vErc20Decimals
                  );
                  ds.vTokenFromErc20[erc20Address] = erc20VTokenAddress;
                  ds.erc20FromVToken[erc20VTokenAddress] = erc20Address;
                  emit Erc20VTokenCreated(erc20Address, erc20VTokenAddress);
                }
                function depositEth() external payable {
                  require(
                    ethVTokenAddress() != address(0),
                    "Vaults: eth vToken should be registered"
                  );
                  VToken vToken = VToken(ethVTokenAddress());
                  
                  uint256 vTokenAmount = ethToVtokenAmountDuringDeposit(msg.value);
                  
                  vToken.mint(msg.sender, vTokenAmount); 
                  emit EthDeposited(msg.sender, msg.value);
                }
                function depositErc20(address erc20Address, uint256 erc20Amount) external {
                  address erc20VTokenAddress = vTokenFromErc20(erc20Address);
                  require(
                    erc20FromVToken(erc20VTokenAddress) != address(0),
                    "Vaults: erc20 vToken should be registered"
                  );
                  VToken vToken = VToken(erc20VTokenAddress);
                  
                  uint256 vTokenAmount = erc20ToVTokenAmount(erc20Address, erc20Amount);
                  vToken.mint(msg.sender, vTokenAmount);
                  require(
                    IERC20Detailed(erc20Address).balanceOf(msg.sender) >= erc20Amount,
                    "Vaults: Insufficient Erc20 Balance"
                  );
                  // Must transfer erc20 token at last
                  erc20Address.safeTokenTransferFrom(msg.sender, address(this), erc20Amount);
                  
                  emit Erc20Deposited(
                    msg.sender,
                    erc20Address,
                    erc20Amount
                  );
                }
                
                // function manualWithdraw(address vTokenAddress, uint256 vTokenAmount)
                //   external
                // {
                //   VToken vToken = VToken(vTokenAddress);
                //   if (vTokenAddress == ethVTokenAddress()) {
                //     uint256 ethAmount = vTokenToEthAmount(vTokenAmount);
                //     uint256 remainingBalance = IInvestmentManager(address(this))
                //       .getRemainingBalance(NATIVE_ETH_ADDRESS);
                    
                //     require(
                //       remainingBalance >= ethAmount,
                //       "Vaults: Amount exceeds remaining balance"
                //     );
                    
                //     payable(msg.sender).transfer(ethAmount);
                //     emit EthWithdrawn(msg.sender, ethAmount);
                //   } else {
                //     address erc20Address = erc20FromVToken(vTokenAddress);
                //     uint256 erc20Amount = vTokenToErc20Amount(erc20Address, vTokenAmount);
                //     uint256 remainingBalance = IInvestmentManager(address(this))
                //       .getRemainingBalance(erc20Address);
                //     require(
                //       remainingBalance >= erc20Amount,
                //       "Vaults: Amount exceeds remaining balance"
                //     );
                //     erc20Address.safeTokenTransfer(msg.sender, erc20Amount);
                //     emit Erc20Withdrawn(erc20Address, msg.sender, erc20Amount);
                //   }
                //   // Must burn token at last
                //   vToken.burn(msg.sender, vTokenAmount);
                // }
              }// SPDX-License-Identifier: Apache-2.0.
              pragma solidity ^0.8.24;
              import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
              import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
              contract VToken is ERC20, Ownable {
                uint8 private _decimals;
                constructor(
                  string memory name,
                  string memory symbol,
                  uint8 initDecimals,
                  address creator
                ) ERC20(name, symbol) Ownable(creator) {
                  _decimals = initDecimals;
                }
                function mint(address to, uint256 amount) external onlyOwner {
                  _mint(to, amount);
                }
                function burn(address from, uint256 amount) external onlyOwner {
                  _burn(from, amount);
                }
                function setDecimals(uint8 initDecimals) external onlyOwner {
                  _decimals = initDecimals;
                }
                function decimals() public view override returns (uint8) {
                  return _decimals;
                }
              }
              // SPDX-License-Identifier: Apache-2.0.
              pragma solidity ^0.8.24;
              /******************************************************************************\\
              * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen)
              * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535
              /******************************************************************************/
              interface IDiamondCut {
                enum FacetCutAction {
                  Add,
                  Replace,
                  Remove
                }
                // Add=0, Replace=1, Remove=2
                struct FacetCut {
                  address facetAddress;
                  FacetCutAction action;
                  bytes4[] functionSelectors;
                }
                /// @notice Add/replace/remove any number of functions and optionally execute
                ///         a function with delegatecall
                /// @param _diamondCut Contains the facet addresses and function selectors
                /// @param _init The address of the contract or facet to execute _calldata
                /// @param _calldata A function call, including function selector and arguments
                ///                  _calldata is executed with delegatecall on _init
                function diamondCut(
                  FacetCut[] calldata _diamondCut,
                  address _init,
                  bytes calldata _calldata
                ) external;
                event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata);
              }
              // SPDX-License-Identifier: Apache-2.0.
              pragma solidity ^0.8.24;
              import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
              interface IERC20Detailed is IERC20 {
                function name() external view returns (string memory);
                function symbol() external view returns (string memory);
                function decimals() external view returns (uint8);
                function allowance(
                  address owner,
                  address spender
                ) external view returns (uint256);
              }
              // SPDX-License-Identifier: Apache-2.0.
              pragma solidity ^0.8.24;
              import {ILiquidityProvider} from "../interfaces/ILiquidityProvider.sol";
              interface IInvestmentManager {
                event OperatorRegistered(address indexed operator);
                event OperatorRemoved(address indexed operator);
                event ProviderAdded(address indexed provider);
                event ProviderRemoved(address indexed provider);
                event AssetPoolsEnabled(address indexed provider, address[] assets);
                event AssetPoolsDisabled(address indexed provider, address[] assets);
                event MinimumReserveRatioUpdated(uint256 minimumReserveRatio);
                event InvestmentReserveRatioUpdated(uint256 investmentReserveRatio);
                // Getters
                function minimumReserveRatio() external view returns (uint256);
                function investmentReserveRatio() external view returns (uint256);
                function isInitialized() external view returns (bool);
                function isOperator(address operator) external view returns (bool);
                function providerIndexPlusOne(
                  address providerAddress
                ) external view returns (uint);
                function providers() external view returns (address[] memory);
                function providerByIndex(uint256 index) external view returns (address);
                function isAssetPoolEnabled(
                  address providerAddress,
                  address asset
                ) external view returns (bool);
                function getRemainingBalance(address asset) external view returns (uint256);
                function supportedAssets(
                  address providerAddress
                ) external view returns (address[] memory);
                function setSwapPriceCheckAmountForProvider(
                  address providerAddress,
                  address asset,
                  uint256 amount
                ) external;
                function getSwapPriceCheckAmount(
                  address providerAddress,
                  address asset
                ) external view returns (uint256);
                function setAssetSwapSlippageForProvider(address providerAddress,
                  address asset,
                  uint256 slippage) external;
                function getAssetSwapSlippage(
                  address providerAddress,
                  address asset
                ) external view returns (uint256);
                function canDirectlyWithdraw(
                  address providerAddress,
                  address asset
                ) external view returns (bool);
                function getWithdrawalData(
                  address providerAddress,
                  address asset
                ) external view returns (ILiquidityProvider.WithdrawalData memory);
                function getAssetBalance(
                  address providerAddress,
                  address asset
                ) external view returns (uint256);
                function getTotalAssetBalance(
                  address asset
                ) external view returns (uint256 totalBalance);
                function getEarnings(
                  address providerAddress,
                  address asset
                ) external view returns (uint256);
                function supportsEmergencyWithdraw(
                  address providerAddress,
                  address asset
                ) external view returns (bool);
                function supportsEarnings(
                  address providerAddress,
                  address asset
                ) external view returns (bool);
                // Setters
                function investmentManagerInit(
                  address operator,
                  uint256 _minimumReserveRatio,
                  uint256 _investmentReserveRatio
                ) external;
                function registerOperator(address operator) external;
                function unregisterOperator(address operator) external;
                function updateMinimumReserveRatio(uint256 _minimumReserveRatio) external;
                function updateInvestmentReserveRatio(
                  uint256 _investmentReserveRatio
                ) external;
                function addProvider(address providerAddress, bytes[] memory params) external;
                function removeProvider(address providerAddress) external;
                function enableAssetPoolsForProvider(
                  address providerAddress,
                  address[] memory assets
                ) external;
                function disableAssetPoolsForProvider(
                  address providerAddress,
                  address[] memory assets
                ) external;
                function invest(
                  address providerAddress,
                  address asset,
                  uint256 amount
                ) external;
                function prepareWithdrawal(
                  address providerAddress,
                  address asset,
                  uint256 amount
                ) external;
                function finishWithdrawal(address providerAddress, address asset) external;
                function directlyWithdraw(
                  address providerAddress,
                  address asset,
                  uint256 amount
                ) external;
                function emergencyWithdraw(
                  address providerAddress,
                  address asset,
                  uint256 amount
                ) external;
                function reinvest(
                  address providerAddress,
                  address asset,
                  uint256 amount
                ) external;
                function reinvestAllEarnings(address providerAddress, address asset) external;
                function rebalance(address providerAddress, address asset) external;
              }
              // SPDX-License-Identifier: Apache-2.0.
              pragma solidity ^0.8.24;
              interface ILiquidityProvider {
                struct WithdrawalData {
                  uint256 preparingAmount;
                  uint256 preparedAmount;
                }
                event Invested(
                  address indexed liquidity,
                  address indexed asset,
                  uint256 amount
                );
                event WithdrawalPrepared(
                  address indexed liquidity,
                  address indexed asset,
                  uint256 amount
                );
                event WithdrawalFinished(
                  address indexed liquidity,
                  address indexed asset,
                  uint256 amount
                );
                event Withdrawed(
                  address indexed liquidity,
                  address indexed asset,
                  uint256 amount
                );
                function isInitialized() external view returns (bool);
                function lidoLocatorAddress() external view returns (address);
                function initialize(bytes[] memory params) external;
                function supportedAssets() external view returns (address[] memory);
                function setAssetSwapSlippage(address asset, uint256 slippage) external;
                function getAssetSwapSlippage(address asset) external pure returns (uint256);
                function setSwapPriceCheckAmount(address asset, uint256 amount) external;
                function getSwapPriceCheckAmount(address asset) external pure returns (uint256);
                function canDirectlyWithdraw(address asset) external view returns (bool);
                // NATIVE_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
                function getWithdrawalData(address asset)
                  external
                  view
                  returns (WithdrawalData memory);
                function getAssetBalance(address asset) external view returns (uint256);
                function invest(address asset, uint256 amount) external payable;
                // Some liquidity pools require prepareWithdrawal before withdrawing funds.
                function prepareWithdrawal(address asset, uint256 amount) external;
                function finishWithdrawal(address asset) external;
                function directlyWithdraw(address asset, uint256 amount) external;
                function supportsEmergencyWithdraw(address asset)
                  external
                  pure
                  returns (bool);
                function emergencyWithdraw(address asset, uint256 amount) external;
                // Only supported in some liquidity pools
                event Reinvest(address indexed investor, address asset, uint256 amount);
                function getEarnings(address asset) external view returns (uint256);
                function supportsEarnings(address asset) external pure returns (bool);
                function reinvest(address asset, uint256 amount) external;
                function reinvestAllEarnings(address asset) external;
              }
              // SPDX-License-Identifier: Apache-2.0
              pragma solidity ^0.8.24;
              interface IRegisterProxy {
                function erc20Quantum(uint256 decimals) external pure returns (uint256);
              }
              // SPDX-License-Identifier: Apache-2.0
              pragma solidity ^0.8.24;
              interface IVTokenGenerator {
                event TokenCreated(address tokenAddress);
                function createToken(
                  string memory name,
                  string memory symbol,
                  uint8 decimals
                ) external returns (address);
              }
              // SPDX-License-Identifier: Apache-2.0.
              pragma solidity ^0.8.24;
              import {IERC20Detailed} from "../interfaces/IERC20Detailed.sol";
              library LibAddress {
                function isContract(address account) internal view returns (bool) {
                  uint256 size;
                  assembly {
                    size := extcodesize(account)
                  }
                  return size > 0;
                }
                function performEthTransfer(address recipient, uint256 amount) internal {
                  (bool success, ) = recipient.call{value: amount}(""); // NOLINT: low-level-calls.
                  require(success, "ETH_TRANSFER_FAILED");
                }
                /*
                    Safe wrapper around ERC20/ERC721 calls.
                    This is required because many deployed ERC20 contracts don't return a value.
                    See https://github.com/ethereum/solidity/issues/4116.
                  */
                function safeTokenContractCall(
                  address tokenAddress,
                  bytes memory callData
                ) internal {
                  require(isContract(tokenAddress), "BAD_TOKEN_ADDRESS");
                  // NOLINTNEXTLINE: low-level-calls.
                  (bool success, bytes memory returndata) = tokenAddress.call(callData);
                  require(success, string(returndata));
                  if (returndata.length > 0) {
                    require(abi.decode(returndata, (bool)), "TOKEN_OPERATION_FAILED");
                  }
                }
                function safeTokenTransfer(
                  address tokenAddress,
                  address recipient,
                  uint256 amount
                ) internal {
                  IERC20Detailed erc20Token = IERC20Detailed(tokenAddress);
                  bytes memory callData = abi.encodeWithSelector(
                    erc20Token.transfer.selector,
                    recipient,
                    amount
                  );
                  uint256 balanceBefore = erc20Token.balanceOf(recipient);
                  safeTokenContractCall(tokenAddress, callData);
                  uint256 balanceAfter = erc20Token.balanceOf(recipient);
                  require(
                    balanceAfter == balanceBefore + amount,
                    "SAFE_TOKEN_TRANSFER_FAILED"
                  );
                }
                function safeTokenTransferFrom(
                  address tokenAddress,
                  address sender,
                  address recipient,
                  uint256 amount
                ) internal {
                  IERC20Detailed erc20Token = IERC20Detailed(tokenAddress);
                  bytes memory callData = abi.encodeWithSelector(
                    erc20Token.transferFrom.selector,
                    sender,
                    recipient,
                    amount
                  );
                  uint256 balanceBefore = erc20Token.balanceOf(recipient);
                  safeTokenContractCall(tokenAddress, callData);
                  uint256 balanceAfter = erc20Token.balanceOf(recipient);
                  require(
                    balanceAfter == balanceBefore + amount,
                    "SAFE_TOKEN_TRANSFER_FAILED"
                  );
                }
                /*
                    Validates that the passed contract address is of a real contract,
                    and that its id hash (as infered fromn identify()) matched the expected one.
                  */
                function validateContractId(
                  address contractAddress,
                  bytes32 expectedIdHash
                ) internal {
                  require(isContract(contractAddress), "ADDRESS_NOT_CONTRACT");
                  (bool success, bytes memory returndata) = contractAddress.call( // NOLINT: low-level-calls.
                      abi.encodeWithSignature("identify()")
                    );
                  require(success, "FAILED_TO_IDENTIFY_CONTRACT");
                  string memory realContractId = abi.decode(returndata, (string));
                  require(
                    keccak256(abi.encodePacked(realContractId)) == expectedIdHash,
                    "UNEXPECTED_CONTRACT_IDENTIFIER"
                  );
                }
              }
              // SPDX-License-Identifier: Apache-2.0.
              pragma solidity ^0.8.24;
              /******************************************************************************\\
              * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen)
              * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535
              /******************************************************************************/
              import {IDiamondCut} from "../interfaces/IDiamondCut.sol";
              // Remember to add the loupe functions from DiamondLoupeFacet to the diamond.
              // The loupe functions are required by the EIP2535 Diamonds standard
              error InitializationFunctionReverted(
                address _initializationContractAddress,
                bytes _calldata
              );
              library LibDiamond {
                bytes32 constant DIAMOND_STORAGE_POSITION =
                  keccak256("diamond.standard.diamond.storage");
                struct FacetAddressAndPosition {
                  address facetAddress;
                  uint96 functionSelectorPosition; // position in facetFunctionSelectors.functionSelectors array
                }
                struct FacetFunctionSelectors {
                  bytes4[] functionSelectors;
                  uint256 facetAddressPosition; // position of facetAddress in facetAddresses array
                }
                struct DiamondStorage {
                  // maps function selector to the facet address and
                  // the position of the selector in the facetFunctionSelectors.selectors array
                  mapping(bytes4 => FacetAddressAndPosition) selectorToFacetAndPosition;
                  // maps facet addresses to function selectors
                  mapping(address => FacetFunctionSelectors) facetFunctionSelectors;
                  // facet addresses
                  address[] facetAddresses;
                  // Used to query if a contract implements an interface.
                  // Used to implement ERC-165.
                  mapping(bytes4 => bool) supportedInterfaces;
                  // owner of the contract
                  address contractOwner;
                }
                function diamondStorage() internal pure returns (DiamondStorage storage ds) {
                  bytes32 position = DIAMOND_STORAGE_POSITION;
                  assembly {
                    ds.slot := position
                  }
                }
                event OwnershipTransferred(
                  address indexed previousOwner,
                  address indexed newOwner
                );
                function setContractOwner(address _newOwner) internal {
                  DiamondStorage storage ds = diamondStorage();
                  address previousOwner = ds.contractOwner;
                  ds.contractOwner = _newOwner;
                  emit OwnershipTransferred(previousOwner, _newOwner);
                }
                function contractOwner() internal view returns (address contractOwner_) {
                  contractOwner_ = diamondStorage().contractOwner;
                }
                function enforceIsContractOwner() internal view {
                  require(
                    msg.sender == diamondStorage().contractOwner,
                    "LibDiamond: Must be contract owner"
                  );
                }
                event DiamondCut(
                  IDiamondCut.FacetCut[] _diamondCut,
                  address _init,
                  bytes _calldata
                );
                // Internal function version of diamondCut
                function diamondCut(
                  IDiamondCut.FacetCut[] memory _diamondCut,
                  address _init,
                  bytes memory _calldata
                ) internal {
                  for (uint256 facetIndex; facetIndex < _diamondCut.length; facetIndex++) {
                    IDiamondCut.FacetCutAction action = _diamondCut[facetIndex].action;
                    if (action == IDiamondCut.FacetCutAction.Add) {
                      addFunctions(
                        _diamondCut[facetIndex].facetAddress,
                        _diamondCut[facetIndex].functionSelectors
                      );
                    } else if (action == IDiamondCut.FacetCutAction.Replace) {
                      replaceFunctions(
                        _diamondCut[facetIndex].facetAddress,
                        _diamondCut[facetIndex].functionSelectors
                      );
                    } else if (action == IDiamondCut.FacetCutAction.Remove) {
                      removeFunctions(
                        _diamondCut[facetIndex].facetAddress,
                        _diamondCut[facetIndex].functionSelectors
                      );
                    } else {
                      revert("LibDiamondCut: Incorrect FacetCutAction");
                    }
                  }
                  emit DiamondCut(_diamondCut, _init, _calldata);
                  initializeDiamondCut(_init, _calldata);
                }
                function addFunctions(
                  address _facetAddress,
                  bytes4[] memory _functionSelectors
                ) internal {
                  require(
                    _functionSelectors.length > 0,
                    "LibDiamondCut: No selectors in facet to cut"
                  );
                  DiamondStorage storage ds = diamondStorage();
                  require(
                    _facetAddress != address(0),
                    "LibDiamondCut: Add facet can't be address(0)"
                  );
                  uint96 selectorPosition = uint96(
                    ds.facetFunctionSelectors[_facetAddress].functionSelectors.length
                  );
                  // add new facet address if it does not exist
                  if (selectorPosition == 0) {
                    addFacet(ds, _facetAddress);
                  }
                  for (
                    uint256 selectorIndex;
                    selectorIndex < _functionSelectors.length;
                    selectorIndex++
                  ) {
                    bytes4 selector = _functionSelectors[selectorIndex];
                    address oldFacetAddress = ds
                      .selectorToFacetAndPosition[selector]
                      .facetAddress;
                    require(
                      oldFacetAddress == address(0),
                      "LibDiamondCut: Can't add function that already exists"
                    );
                    addFunction(ds, selector, selectorPosition, _facetAddress);
                    selectorPosition++;
                  }
                }
                function replaceFunctions(
                  address _facetAddress,
                  bytes4[] memory _functionSelectors
                ) internal {
                  require(
                    _functionSelectors.length > 0,
                    "LibDiamondCut: No selectors in facet to cut"
                  );
                  DiamondStorage storage ds = diamondStorage();
                  require(
                    _facetAddress != address(0),
                    "LibDiamondCut: Add facet can't be address(0)"
                  );
                  uint96 selectorPosition = uint96(
                    ds.facetFunctionSelectors[_facetAddress].functionSelectors.length
                  );
                  // add new facet address if it does not exist
                  if (selectorPosition == 0) {
                    addFacet(ds, _facetAddress);
                  }
                  for (
                    uint256 selectorIndex;
                    selectorIndex < _functionSelectors.length;
                    selectorIndex++
                  ) {
                    bytes4 selector = _functionSelectors[selectorIndex];
                    address oldFacetAddress = ds
                      .selectorToFacetAndPosition[selector]
                      .facetAddress;
                    require(
                      oldFacetAddress != _facetAddress,
                      "LibDiamondCut: Can't replace function with same function"
                    );
                    removeFunction(ds, oldFacetAddress, selector);
                    addFunction(ds, selector, selectorPosition, _facetAddress);
                    selectorPosition++;
                  }
                }
                function removeFunctions(
                  address _facetAddress,
                  bytes4[] memory _functionSelectors
                ) internal {
                  require(
                    _functionSelectors.length > 0,
                    "LibDiamondCut: No selectors in facet to cut"
                  );
                  DiamondStorage storage ds = diamondStorage();
                  // if function does not exist then do nothing and return
                  require(
                    _facetAddress == address(0),
                    "LibDiamondCut: Remove facet address must be address(0)"
                  );
                  for (
                    uint256 selectorIndex;
                    selectorIndex < _functionSelectors.length;
                    selectorIndex++
                  ) {
                    bytes4 selector = _functionSelectors[selectorIndex];
                    address oldFacetAddress = ds
                      .selectorToFacetAndPosition[selector]
                      .facetAddress;
                    removeFunction(ds, oldFacetAddress, selector);
                  }
                }
                function addFacet(DiamondStorage storage ds, address _facetAddress) internal {
                  enforceHasContractCode(
                    _facetAddress,
                    "LibDiamondCut: New facet has no code"
                  );
                  ds.facetFunctionSelectors[_facetAddress].facetAddressPosition = ds
                    .facetAddresses
                    .length;
                  ds.facetAddresses.push(_facetAddress);
                }
                function addFunction(
                  DiamondStorage storage ds,
                  bytes4 _selector,
                  uint96 _selectorPosition,
                  address _facetAddress
                ) internal {
                  ds
                    .selectorToFacetAndPosition[_selector]
                    .functionSelectorPosition = _selectorPosition;
                  ds.facetFunctionSelectors[_facetAddress].functionSelectors.push(_selector);
                  ds.selectorToFacetAndPosition[_selector].facetAddress = _facetAddress;
                }
                function removeFunction(
                  DiamondStorage storage ds,
                  address _facetAddress,
                  bytes4 _selector
                ) internal {
                  require(
                    _facetAddress != address(0),
                    "LibDiamondCut: Can't remove function that doesn't exist"
                  );
                  // an immutable function is a function defined directly in a diamond
                  require(
                    _facetAddress != address(this),
                    "LibDiamondCut: Can't remove immutable function"
                  );
                  // replace selector with last selector, then delete last selector
                  uint256 selectorPosition = ds
                    .selectorToFacetAndPosition[_selector]
                    .functionSelectorPosition;
                  uint256 lastSelectorPosition = ds
                    .facetFunctionSelectors[_facetAddress]
                    .functionSelectors
                    .length - 1;
                  // if not the same then replace _selector with lastSelector
                  if (selectorPosition != lastSelectorPosition) {
                    bytes4 lastSelector = ds
                      .facetFunctionSelectors[_facetAddress]
                      .functionSelectors[lastSelectorPosition];
                    ds.facetFunctionSelectors[_facetAddress].functionSelectors[
                      selectorPosition
                    ] = lastSelector;
                    ds
                      .selectorToFacetAndPosition[lastSelector]
                      .functionSelectorPosition = uint96(selectorPosition);
                  }
                  // delete the last selector
                  ds.facetFunctionSelectors[_facetAddress].functionSelectors.pop();
                  delete ds.selectorToFacetAndPosition[_selector];
                  // if no more selectors for facet address then delete the facet address
                  if (lastSelectorPosition == 0) {
                    // replace facet address with last facet address and delete last facet address
                    uint256 lastFacetAddressPosition = ds.facetAddresses.length - 1;
                    uint256 facetAddressPosition = ds
                      .facetFunctionSelectors[_facetAddress]
                      .facetAddressPosition;
                    if (facetAddressPosition != lastFacetAddressPosition) {
                      address lastFacetAddress = ds.facetAddresses[lastFacetAddressPosition];
                      ds.facetAddresses[facetAddressPosition] = lastFacetAddress;
                      ds
                        .facetFunctionSelectors[lastFacetAddress]
                        .facetAddressPosition = facetAddressPosition;
                    }
                    ds.facetAddresses.pop();
                    delete ds.facetFunctionSelectors[_facetAddress].facetAddressPosition;
                  }
                }
                function initializeDiamondCut(
                  address _init,
                  bytes memory _calldata
                ) internal {
                  if (_init == address(0)) {
                    return;
                  }
                  enforceHasContractCode(_init, "LibDiamondCut: _init address has no code");
                  (bool success, bytes memory error) = _init.delegatecall(_calldata);
                  if (!success) {
                    if (error.length > 0) {
                      // bubble up error
                      /// @solidity memory-safe-assembly
                      assembly {
                        let returndata_size := mload(error)
                        revert(add(32, error), returndata_size)
                      }
                    } else {
                      revert InitializationFunctionReverted(_init, _calldata);
                    }
                  }
                }
                function enforceHasContractCode(
                  address _contract,
                  string memory _errorMessage
                ) internal view {
                  uint256 contractSize;
                  assembly {
                    contractSize := extcodesize(_contract)
                  }
                  require(contractSize > 0, _errorMessage);
                }
              }
              // SPDX-License-Identifier: Apache-2.0.
              pragma solidity ^0.8.24;
              import "../libraries/LibDiamond.sol";
              contract Ownable {
                modifier onlyOwner() {
                  LibDiamond.enforceIsContractOwner();
                  _;
                }
              }
              // SPDX-License-Identifier: MIT
              pragma solidity >=0.4.22 <0.9.0;
              library console {
                  address constant CONSOLE_ADDRESS =
                      0x000000000000000000636F6e736F6c652e6c6f67;
                  function _sendLogPayloadImplementation(bytes memory payload) internal view {
                      address consoleAddress = CONSOLE_ADDRESS;
                      /// @solidity memory-safe-assembly
                      assembly {
                          pop(
                              staticcall(
                                  gas(),
                                  consoleAddress,
                                  add(payload, 32),
                                  mload(payload),
                                  0,
                                  0
                              )
                          )
                      }
                  }
                  function _castToPure(
                    function(bytes memory) internal view fnIn
                  ) internal pure returns (function(bytes memory) pure fnOut) {
                      assembly {
                          fnOut := fnIn
                      }
                  }
                  function _sendLogPayload(bytes memory payload) internal pure {
                      _castToPure(_sendLogPayloadImplementation)(payload);
                  }
                  function log() internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log()"));
                  }
                  function logInt(int256 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
                  }
                  function logUint(uint256 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
                  }
                  function logString(string memory p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
                  }
                  function logBool(bool p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
                  }
                  function logAddress(address p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
                  }
                  function logBytes(bytes memory p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
                  }
                  function logBytes1(bytes1 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
                  }
                  function logBytes2(bytes2 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
                  }
                  function logBytes3(bytes3 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
                  }
                  function logBytes4(bytes4 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
                  }
                  function logBytes5(bytes5 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
                  }
                  function logBytes6(bytes6 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
                  }
                  function logBytes7(bytes7 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
                  }
                  function logBytes8(bytes8 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
                  }
                  function logBytes9(bytes9 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
                  }
                  function logBytes10(bytes10 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
                  }
                  function logBytes11(bytes11 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
                  }
                  function logBytes12(bytes12 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
                  }
                  function logBytes13(bytes13 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
                  }
                  function logBytes14(bytes14 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
                  }
                  function logBytes15(bytes15 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
                  }
                  function logBytes16(bytes16 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
                  }
                  function logBytes17(bytes17 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
                  }
                  function logBytes18(bytes18 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
                  }
                  function logBytes19(bytes19 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
                  }
                  function logBytes20(bytes20 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
                  }
                  function logBytes21(bytes21 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
                  }
                  function logBytes22(bytes22 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
                  }
                  function logBytes23(bytes23 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
                  }
                  function logBytes24(bytes24 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
                  }
                  function logBytes25(bytes25 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
                  }
                  function logBytes26(bytes26 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
                  }
                  function logBytes27(bytes27 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
                  }
                  function logBytes28(bytes28 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
                  }
                  function logBytes29(bytes29 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
                  }
                  function logBytes30(bytes30 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
                  }
                  function logBytes31(bytes31 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
                  }
                  function logBytes32(bytes32 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
                  }
                  function log(uint256 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
                  }
                  function log(string memory p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
                  }
                  function log(bool p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
                  }
                  function log(address p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
                  }
                  function log(uint256 p0, uint256 p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1));
                  }
                  function log(uint256 p0, string memory p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1));
                  }
                  function log(uint256 p0, bool p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1));
                  }
                  function log(uint256 p0, address p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1));
                  }
                  function log(string memory p0, uint256 p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
                  }
                  function log(string memory p0, string memory p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
                  }
                  function log(string memory p0, bool p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
                  }
                  function log(string memory p0, address p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
                  }
                  function log(bool p0, uint256 p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1));
                  }
                  function log(bool p0, string memory p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
                  }
                  function log(bool p0, bool p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
                  }
                  function log(bool p0, address p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
                  }
                  function log(address p0, uint256 p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1));
                  }
                  function log(address p0, string memory p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
                  }
                  function log(address p0, bool p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
                  }
                  function log(address p0, address p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
                  }
                  function log(uint256 p0, uint256 p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2));
                  }
                  function log(uint256 p0, uint256 p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2));
                  }
                  function log(uint256 p0, uint256 p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2));
                  }
                  function log(uint256 p0, uint256 p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2));
                  }
                  function log(uint256 p0, string memory p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2));
                  }
                  function log(uint256 p0, string memory p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2));
                  }
                  function log(uint256 p0, string memory p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2));
                  }
                  function log(uint256 p0, string memory p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2));
                  }
                  function log(uint256 p0, bool p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2));
                  }
                  function log(uint256 p0, bool p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2));
                  }
                  function log(uint256 p0, bool p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2));
                  }
                  function log(uint256 p0, bool p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2));
                  }
                  function log(uint256 p0, address p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2));
                  }
                  function log(uint256 p0, address p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2));
                  }
                  function log(uint256 p0, address p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2));
                  }
                  function log(uint256 p0, address p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2));
                  }
                  function log(string memory p0, uint256 p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2));
                  }
                  function log(string memory p0, uint256 p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2));
                  }
                  function log(string memory p0, uint256 p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2));
                  }
                  function log(string memory p0, uint256 p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2));
                  }
                  function log(string memory p0, string memory p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2));
                  }
                  function log(string memory p0, string memory p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
                  }
                  function log(string memory p0, string memory p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
                  }
                  function log(string memory p0, string memory p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
                  }
                  function log(string memory p0, bool p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2));
                  }
                  function log(string memory p0, bool p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
                  }
                  function log(string memory p0, bool p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
                  }
                  function log(string memory p0, bool p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
                  }
                  function log(string memory p0, address p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2));
                  }
                  function log(string memory p0, address p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
                  }
                  function log(string memory p0, address p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
                  }
                  function log(string memory p0, address p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
                  }
                  function log(bool p0, uint256 p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2));
                  }
                  function log(bool p0, uint256 p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2));
                  }
                  function log(bool p0, uint256 p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2));
                  }
                  function log(bool p0, uint256 p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2));
                  }
                  function log(bool p0, string memory p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2));
                  }
                  function log(bool p0, string memory p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
                  }
                  function log(bool p0, string memory p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
                  }
                  function log(bool p0, string memory p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
                  }
                  function log(bool p0, bool p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2));
                  }
                  function log(bool p0, bool p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
                  }
                  function log(bool p0, bool p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
                  }
                  function log(bool p0, bool p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
                  }
                  function log(bool p0, address p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2));
                  }
                  function log(bool p0, address p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
                  }
                  function log(bool p0, address p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
                  }
                  function log(bool p0, address p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
                  }
                  function log(address p0, uint256 p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2));
                  }
                  function log(address p0, uint256 p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2));
                  }
                  function log(address p0, uint256 p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2));
                  }
                  function log(address p0, uint256 p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2));
                  }
                  function log(address p0, string memory p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2));
                  }
                  function log(address p0, string memory p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
                  }
                  function log(address p0, string memory p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
                  }
                  function log(address p0, string memory p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
                  }
                  function log(address p0, bool p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2));
                  }
                  function log(address p0, bool p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
                  }
                  function log(address p0, bool p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
                  }
                  function log(address p0, bool p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
                  }
                  function log(address p0, address p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2));
                  }
                  function log(address p0, address p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
                  }
                  function log(address p0, address p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
                  }
                  function log(address p0, address p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
                  }
                  function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {
                      _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 pure {
                      _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 pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {
                      _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 pure {
                      _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 pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {
                      _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 pure {
                      _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 pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {
                      _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 pure {
                      _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 pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {
                      _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 pure {
                      _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 pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {
                      _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 pure {
                      _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 pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {
                      _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 pure {
                      _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 pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
                  }
              }
              

              File 3 of 4: InvestmentManagerFacet
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)
              pragma solidity ^0.8.20;
              /**
               * @dev Interface of the ERC20 standard as defined in the EIP.
               */
              interface IERC20 {
                  /**
                   * @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);
                  /**
                   * @dev Returns the value of tokens in existence.
                   */
                  function totalSupply() external view returns (uint256);
                  /**
                   * @dev Returns the value of tokens owned by `account`.
                   */
                  function balanceOf(address account) external view returns (uint256);
                  /**
                   * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool);
                  /**
                   * @dev Moves a `value` amount of tokens from `from` to `to` using the
                   * allowance mechanism. `value` 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 value) external returns (bool);
              }
              // SPDX-License-Identifier: Apache-2.0.
              pragma solidity ^0.8.24;
              import {Ownable} from "../../utils/Ownable.sol";
              import {LibAddress} from "../../libraries/LibAddress.sol";
              import {IERC20Detailed} from "../../interfaces/IERC20Detailed.sol";
              import {ILiquidityProvider} from "../../interfaces/ILiquidityProvider.sol";
              import {IInvestmentManagerDelegated} from "../../interfaces/IInvestmentManagerDelegated.sol";
              import "hardhat/console.sol";
              contract InvestmentManagerFacet is Ownable {
                using LibAddress for address;
                address constant NATIVE_ETH_ADDRESS =
                  0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
                event OperatorRegistered(address indexed operator);
                event OperatorRemoved(address indexed operator);
                event ProviderAdded(address indexed provider);
                event ProviderRemoved(address indexed provider);
                event AssetPoolsEnabled(address indexed provider, address[] assets);
                event AssetPoolsDisabled(address indexed provider, address[] assets);
                event MinimumReserveRatioUpdated(uint256 minimumReserveRatio);
                event investmentReserveRatioUpdated(uint256 investmentReserveRatio);
                bytes32 constant INVESTMENTMANAGERFACET_STORAGE_POSITION =
                  keccak256("diamond.standard.investmentManagerFacet.storage");
                struct IMStorage {
                  uint256 minimumReserveRatio;
                  uint256 investmentReserveRatio;
                  bool isInitialized;
                  mapping(address => bool) isOperator;
                  mapping(address => uint256) providerIndexPlusOne;
                  address[] providers;
                  mapping(address => mapping(address => bool)) isAssetPoolEnabled;
                }
                function _iMStorage() internal pure returns (IMStorage storage ds) {
                  bytes32 position = INVESTMENTMANAGERFACET_STORAGE_POSITION;
                  assembly {
                    ds.slot := position
                  }
                }
                function minimumReserveRatio() public view returns (uint256) {
                  return _iMStorage().minimumReserveRatio;
                }
                function investmentReserveRatio() public view returns (uint256) {
                  return _iMStorage().investmentReserveRatio;
                }
                function isInitialized() public view returns (bool) {
                  return _iMStorage().isInitialized;
                }
                function isOperator(address operator) public view returns (bool) {
                  return _iMStorage().isOperator[operator];
                }
                function providerIndexPlusOne(
                  address providerAddress
                ) public view returns (uint) {
                  return _iMStorage().providerIndexPlusOne[providerAddress];
                }
                function providers() public view returns (address[] memory) {
                  return _iMStorage().providers;
                }
                function providerByIndex(uint256 index) public view returns (address) {
                  return _iMStorage().providers[index];
                }
                function isAssetPoolEnabled(
                  address providerAddress,
                  address asset
                ) public view returns (bool) {
                  return _iMStorage().isAssetPoolEnabled[providerAddress][asset];
                }
                function investmentManagerInit(
                  address operator,
                  uint256 _minimumReserveRatio,
                  uint256 _investmentReserveRatio
                ) external onlyOwner {
                  IMStorage storage ds = _iMStorage();
                  require(!ds.isInitialized, "InvestmentManagerInit: Already initialized");
                  require(_investmentReserveRatio >= _minimumReserveRatio, "Invalid ratios");
                  ds.minimumReserveRatio = _minimumReserveRatio;
                  ds.investmentReserveRatio = _investmentReserveRatio;
                  ds.isOperator[operator] = true;
                  ds.isInitialized = true;
                }
                modifier onlyOperator() {
                  require(isOperator(msg.sender), "Caller is not an operator");
                  _;
                }
                modifier onlyAssetPoolEnabled(address providerAddress, address asset) {
                  require(
                    isAssetPoolEnabled(providerAddress, asset),
                    "Asset pool not enabled"
                  );
                  _;
                }
                function registerOperator(address operator) external onlyOwner {
                  IMStorage storage ds = _iMStorage();
                  ds.isOperator[operator] = true;
                  emit OperatorRegistered(operator);
                }
                function unregisterOperator(address operator) external onlyOwner {
                  IMStorage storage ds = _iMStorage();
                  ds.isOperator[operator] = false;
                  emit OperatorRemoved(operator);
                }
                function updateMinimumReserveRatio(
                  uint256 _minimumReserveRatio
                ) external onlyOwner {
                  IMStorage storage ds = _iMStorage();
                  require(
                    ds.investmentReserveRatio >= _minimumReserveRatio,
                    "Invalid ratios"
                  );
                  ds.minimumReserveRatio = _minimumReserveRatio;
                  emit MinimumReserveRatioUpdated(_minimumReserveRatio);
                }
                function updateInvestmentReserveRatio(
                  uint256 _investmentReserveRatio
                ) external onlyOwner {
                  IMStorage storage ds = _iMStorage();
                  require(
                    _investmentReserveRatio >= ds.minimumReserveRatio,
                    "Invalid ratios"
                  );
                  ds.investmentReserveRatio = _investmentReserveRatio;
                  emit investmentReserveRatioUpdated(_investmentReserveRatio);
                }
                function addProvider(
                  address providerAddress,
                  bytes[] memory params
                ) external onlyOwner {
                  IMStorage storage ds = _iMStorage();
                  require(
                    ds.providerIndexPlusOne[providerAddress] == 0,
                    "Provider already added"
                  );
                  bytes memory providerIsInitializedCallData = abi.encodeWithSelector(
                    ILiquidityProvider.isInitialized.selector
                  );
                  bool providerIsInitialized = abi.decode(
                    _delegateToProvider(providerAddress, providerIsInitializedCallData),
                    (bool)
                  );
                  if (!providerIsInitialized) {
                    bytes memory providerInitializeCallData = abi.encodeWithSelector(
                      ILiquidityProvider.initialize.selector,
                      params
                    );
                    _delegateToProvider(providerAddress, providerInitializeCallData);
                  }
                  ds.providers.push(providerAddress); // Add address to the array
                  ds.providerIndexPlusOne[providerAddress] = ds.providers.length; // Map to its index plus one
                  emit ProviderAdded(providerAddress);
                }
                function removeProvider(address providerAddress) external onlyOwner {
                  IMStorage storage ds = _iMStorage();
                  uint256 indexPlusOne = ds.providerIndexPlusOne[providerAddress];
                  require(indexPlusOne != 0, "Provider does not exist");
                  uint256 index = indexPlusOne - 1; // Subtract one to get the actual array index
                  if (index != ds.providers.length - 1) {
                    // If it is not the last element in the array
                    address lastProvider = ds.providers[ds.providers.length - 1];
                    ds.providers[index] = lastProvider; // Move the last element to the deleted element's position
                    ds.providerIndexPlusOne[lastProvider] = index + 1; // Update the mapping, adding one because we store index plus one
                  }
                  ds.providers.pop(); // Remove the last element of the array
                  delete ds.providerIndexPlusOne[providerAddress]; // Remove the element from the mapping
                  emit ProviderRemoved(providerAddress);
                }
                function isProvider(address providerAddress) public view returns (bool) {
                  return providerIndexPlusOne(providerAddress) != 0;
                }
                function enableAssetPoolsForProvider(
                  address providerAddress,
                  address[] memory assets
                ) external onlyOwner {
                  IMStorage storage ds = _iMStorage();
                  for (uint256 i = 0; i < assets.length; i++) {
                    ds.isAssetPoolEnabled[providerAddress][assets[i]] = true;
                  }
                  emit AssetPoolsEnabled(providerAddress, assets);
                }
                function disableAssetPoolsForProvider(
                  address providerAddress,
                  address[] memory assets
                ) external onlyOwner {
                  IMStorage storage ds = _iMStorage();
                  for (uint256 i = 0; i < assets.length; i++) {
                    ds.isAssetPoolEnabled[providerAddress][assets[i]] = false;
                  }
                  emit AssetPoolsDisabled(providerAddress, assets);
                }
                function getRemainingBalance(address asset) public view returns (uint256) {
                  if (asset == NATIVE_ETH_ADDRESS) {
                    return address(this).balance;
                  } else {
                    return IERC20Detailed(asset).balanceOf(address(this));
                  }
                }
                function _delegateToProvider(
                  address providerAddress,
                  bytes memory callData
                ) internal returns (bytes memory) {
                  (bool success, bytes memory returndata) = providerAddress.delegatecall(
                    callData
                  );
                  if (!success) {
                    if (returndata.length > 0) {
                      assembly {
                        let returndata_size := mload(returndata)
                        revert(add(32, returndata), returndata_size)
                      }
                    } else {
                      revert("delegatecall failed with no data");
                    }
                  }
                  return returndata;
                }
                function delegateBySelf(
                  address providerAddress,
                  bytes memory callData
                ) public returns (bytes memory) {
                  require(msg.sender == address(this), "Only InvestmentManager can call");
                  bytes memory returndata = _delegateToProvider(providerAddress, callData);
                  return returndata;
                }
                function _staticToProvider(
                  address providerAddress,
                  bytes memory callData
                ) internal view returns (bytes memory) {
                  bytes memory combinedData = abi.encodeWithSelector(
                    IInvestmentManagerDelegated.delegateBySelf.selector,
                    providerAddress,
                    callData
                  );
                  (bool success, bytes memory returndata) = address(this).staticcall(
                    combinedData
                  );
                  require(success, "Staticcall failed");
                  return abi.decode(returndata, (bytes));
                }
                function supportedAssets(
                  address providerAddress
                ) external view returns (address[] memory) {
                  ILiquidityProvider provider = ILiquidityProvider(providerAddress);
                  bytes memory callData = abi.encodeWithSelector(
                    provider.supportedAssets.selector
                  );
                  return
                    abi.decode(_staticToProvider(providerAddress, callData), (address[]));
                }
                function canDirectlyWithdraw(
                  address providerAddress,
                  address asset
                ) public view returns (bool) {
                  bytes memory callData = abi.encodeWithSelector(
                    ILiquidityProvider.canDirectlyWithdraw.selector,
                    asset
                  );
                  return abi.decode(_staticToProvider(providerAddress, callData), (bool));
                }
                function getWithdrawalData(
                  address providerAddress,
                  address asset
                ) public view returns (ILiquidityProvider.WithdrawalData memory) {
                  if (isAssetPoolEnabled(providerAddress, asset)) {
                    bytes memory callData = abi.encodeWithSelector(
                      ILiquidityProvider.getWithdrawalData.selector,
                      asset
                    );
                    return
                      abi.decode(
                        _staticToProvider(providerAddress, callData),
                        (ILiquidityProvider.WithdrawalData)
                      );
                  } else {
                    return ILiquidityProvider.WithdrawalData(0, 0);
                  }
                }
                function getAssetBalance(
                  address providerAddress,
                  address asset
                ) public view returns (uint256) {
                  if (isAssetPoolEnabled(providerAddress, asset)) {
                    bytes memory callData = abi.encodeWithSelector(
                      ILiquidityProvider.getAssetBalance.selector,
                      asset
                    );
                    return
                      abi.decode(_staticToProvider(providerAddress, callData), (uint256));
                  } else {
                    return 0;
                  }
                }
                // Function to get the total asset balance for all providers for a specific asset
                function getTotalAssetBalance(
                  address asset
                ) public view returns (uint256 totalBalance) {
                  uint256 totalInProviders = 0;
                  for (uint256 i = 0; i < providers().length; i++) {
                    address providerAddress = providerByIndex(i);
                    totalInProviders += getAssetBalance(providerAddress, asset);
                  }
                  return totalInProviders + getRemainingBalance(asset);
                }
                function invest(
                  address providerAddress,
                  address asset,
                  uint256 amount
                ) public onlyOperator onlyAssetPoolEnabled(providerAddress, asset) {
                  require(
                    getRemainingBalance(asset) >=
                      amount + (minimumReserveRatio() * getTotalAssetBalance(asset)) / 10000,
                    "Investment limit reached"
                  );
                  bytes memory data = abi.encodeWithSelector(
                    ILiquidityProvider.invest.selector,
                    asset,
                    amount
                  );
                  _delegateToProvider(providerAddress, data);
                }
                function prepareWithdrawal(
                  address providerAddress,
                  address asset,
                  uint256 amount
                ) public onlyOperator onlyAssetPoolEnabled(providerAddress, asset) {
                  require(
                    !canDirectlyWithdraw(providerAddress, asset),
                    "Should direct withdraw"
                  );
                  bytes memory data = abi.encodeWithSelector(
                    ILiquidityProvider.prepareWithdrawal.selector,
                    asset,
                    amount
                  );
                  _delegateToProvider(providerAddress, data);
                }
                function finishWithdrawal(
                  address providerAddress,
                  address asset
                ) public onlyOperator onlyAssetPoolEnabled(providerAddress, asset) {
                  require(
                    !canDirectlyWithdraw(providerAddress, asset),
                    "Should direct withdraw"
                  );
                  bytes memory data = abi.encodeWithSelector(
                    ILiquidityProvider.finishWithdrawal.selector,
                    asset
                  );
                  _delegateToProvider(providerAddress, data);
                }
                function directlyWithdraw(
                  address providerAddress,
                  address asset,
                  uint256 amount
                ) public onlyOperator onlyAssetPoolEnabled(providerAddress, asset) {
                  require(
                    canDirectlyWithdraw(providerAddress, asset),
                    "Direct withdraw not supported"
                  );
                  bytes memory data = abi.encodeWithSelector(
                    ILiquidityProvider.directlyWithdraw.selector,
                    asset,
                    amount
                  );
                  _delegateToProvider(providerAddress, data);
                }
                function emergencyWithdraw(
                  address providerAddress,
                  address asset,
                  uint256 amount
                ) external onlyOwner onlyAssetPoolEnabled(providerAddress, asset) {
                  require(
                    supportsEmergencyWithdraw(providerAddress, asset),
                    "Emergency withdraw not supported"
                  );
                  bytes memory data = abi.encodeWithSelector(
                    ILiquidityProvider.emergencyWithdraw.selector,
                    asset,
                    amount
                  );
                  _delegateToProvider(providerAddress, data);
                }
                function getEarnings(
                  address providerAddress,
                  address asset
                ) public view onlyAssetPoolEnabled(providerAddress, asset) returns (uint256) {
                  require(supportsEarnings(providerAddress, asset), "Earnings not supported");
                  bytes memory callData = abi.encodeWithSelector(
                    ILiquidityProvider.getEarnings.selector,
                    asset
                  );
                  return abi.decode(_staticToProvider(providerAddress, callData), (uint256));
                }
                function reinvest(
                  address providerAddress,
                  address asset,
                  uint256 amount
                ) external onlyOperator onlyAssetPoolEnabled(providerAddress, asset) {
                  require(supportsEarnings(providerAddress, asset), "Earnings not supported");
                  bytes memory data = abi.encodeWithSelector(
                    ILiquidityProvider.reinvest.selector,
                    asset,
                    amount
                  );
                  _delegateToProvider(providerAddress, data);
                }
                function reinvestAllEarnings(
                  address providerAddress,
                  address asset
                ) public onlyOperator onlyAssetPoolEnabled(providerAddress, asset) {
                  require(supportsEarnings(providerAddress, asset), "Earnings not supported");
                  bytes memory data = abi.encodeWithSelector(
                    ILiquidityProvider.reinvestAllEarnings.selector,
                    asset
                  );
                  _delegateToProvider(providerAddress, data);
                }
                function rebalance(
                  address providerAddress,
                  address asset
                ) external onlyAssetPoolEnabled(providerAddress, asset) {
                  uint256 totalBalance = getTotalAssetBalance(asset);
                  uint256 minimumReserve = (minimumReserveRatio() * totalBalance) / 10000;
                  uint256 investmentReserve = (investmentReserveRatio() * totalBalance) /
                    10000;
                  uint256 investmentThreshold = investmentReserve +
                    (investmentReserve - minimumReserve);
                  uint256 remainingBalance = getRemainingBalance(asset);
                  if (remainingBalance > investmentThreshold) {
                    uint256 amount = remainingBalance - investmentReserve;
                    invest(providerAddress, asset, amount);
                  } else if (remainingBalance < minimumReserve) {
                    uint256 amount = investmentReserve - remainingBalance;
                    if (canDirectlyWithdraw(providerAddress, asset)) {
                      directlyWithdraw(providerAddress, asset, amount);
                    } else {
                      ILiquidityProvider.WithdrawalData
                        memory withdrawalData = getWithdrawalData(providerAddress, asset);
                      uint256 preparingAmount = withdrawalData.preparingAmount;
                      uint256 preparedAmount = withdrawalData.preparedAmount;
                      if (preparedAmount > 0) {
                        amount -= preparedAmount;
                        finishWithdrawal(providerAddress, asset);
                      }
                      if (amount > preparingAmount) {
                        amount -= getWithdrawalData(providerAddress, asset).preparingAmount;
                        prepareWithdrawal(providerAddress, asset, amount);
                      }
                    }
                  }
                }
                function supportsEmergencyWithdraw(
                  address providerAddress,
                  address asset
                ) public view onlyAssetPoolEnabled(providerAddress, asset) returns (bool) {
                  bytes memory callData = abi.encodeWithSelector(
                    ILiquidityProvider.supportsEmergencyWithdraw.selector,
                    asset
                  );
                  return abi.decode(_staticToProvider(providerAddress, callData), (bool));
                }
                function supportsEarnings(
                  address providerAddress,
                  address asset
                ) public view returns (bool) {
                  bytes memory callData = abi.encodeWithSelector(
                    ILiquidityProvider.supportsEarnings.selector,
                    asset
                  );
                  return abi.decode(_staticToProvider(providerAddress, callData), (bool));
                }
              }
              // SPDX-License-Identifier: Apache-2.0.
              pragma solidity ^0.8.24;
              /******************************************************************************\\
              * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen)
              * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535
              /******************************************************************************/
              interface IDiamondCut {
                enum FacetCutAction {
                  Add,
                  Replace,
                  Remove
                }
                // Add=0, Replace=1, Remove=2
                struct FacetCut {
                  address facetAddress;
                  FacetCutAction action;
                  bytes4[] functionSelectors;
                }
                /// @notice Add/replace/remove any number of functions and optionally execute
                ///         a function with delegatecall
                /// @param _diamondCut Contains the facet addresses and function selectors
                /// @param _init The address of the contract or facet to execute _calldata
                /// @param _calldata A function call, including function selector and arguments
                ///                  _calldata is executed with delegatecall on _init
                function diamondCut(
                  FacetCut[] calldata _diamondCut,
                  address _init,
                  bytes calldata _calldata
                ) external;
                event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata);
              }
              // SPDX-License-Identifier: Apache-2.0.
              pragma solidity ^0.8.24;
              import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
              interface IERC20Detailed is IERC20 {
                function name() external view returns (string memory);
                function symbol() external view returns (string memory);
                function decimals() external view returns (uint8);
                function allowance(
                  address owner,
                  address spender
                ) external view returns (uint256);
              }
              // SPDX-License-Identifier: Apache-2.0.
              pragma solidity ^0.8.24;
              import {ILiquidityProvider} from "./ILiquidityProvider.sol";
              interface IInvestmentManagerDelegated {
                function delegateBySelf(
                  address providerAddress,
                  bytes memory callData
                ) external returns (bytes memory);
              }
              // SPDX-License-Identifier: Apache-2.0.
              pragma solidity ^0.8.24;
              interface ILiquidityProvider {
                struct WithdrawalData {
                  uint256 preparingAmount;
                  uint256 preparedAmount;
                }
                event Invested(
                  address indexed liquidity,
                  address indexed asset,
                  uint256 amount
                );
                event WithdrawalPrepared(
                  address indexed liquidity,
                  address indexed asset,
                  uint256 amount
                );
                event WithdrawalFinished(
                  address indexed liquidity,
                  address indexed asset,
                  uint256 amount
                );
                event Withdrawed(
                  address indexed liquidity,
                  address indexed asset,
                  uint256 amount
                );
                function isInitialized() external view returns (bool);
                function lidoLocatorAddress() external view returns (address);
                function initialize(bytes[] memory params) external;
                function supportedAssets() external view returns (address[] memory);
                function canDirectlyWithdraw(address asset) external pure returns (bool);
                // NATIVE_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
                function getWithdrawalData(
                  address asset
                ) external view returns (WithdrawalData memory);
                function getAssetBalance(address asset) external view returns (uint256);
                function invest(address asset, uint256 amount) external payable;
                // Some liquidity pools require prepareWithdrawal before withdrawing funds.
                function prepareWithdrawal(address asset, uint256 amount) external;
                function finishWithdrawal(address asset) external;
                function directlyWithdraw(address asset, uint256 amount) external;
                function supportsEmergencyWithdraw(
                  address asset
                ) external pure returns (bool);
                function emergencyWithdraw(address asset, uint256 amount) external;
                // Only supported in some liquidity pools
                event Reinvest(address indexed investor, address asset, uint256 amount);
                function getEarnings(address asset) external view returns (uint256);
                function supportsEarnings(address asset) external pure returns (bool);
                function reinvest(address asset, uint256 amount) external;
                function reinvestAllEarnings(address asset) external;
              }
              // SPDX-License-Identifier: Apache-2.0.
              pragma solidity ^0.8.24;
              import {IERC20Detailed} from "../interfaces/IERC20Detailed.sol";
              library LibAddress {
                function isContract(address account) internal view returns (bool) {
                  uint256 size;
                  assembly {
                    size := extcodesize(account)
                  }
                  return size > 0;
                }
                function performEthTransfer(address recipient, uint256 amount) internal {
                  (bool success, ) = recipient.call{value: amount}(""); // NOLINT: low-level-calls.
                  require(success, "ETH_TRANSFER_FAILED");
                }
                /*
                    Safe wrapper around ERC20/ERC721 calls.
                    This is required because many deployed ERC20 contracts don't return a value.
                    See https://github.com/ethereum/solidity/issues/4116.
                  */
                function safeTokenContractCall(
                  address tokenAddress,
                  bytes memory callData
                ) internal {
                  require(isContract(tokenAddress), "BAD_TOKEN_ADDRESS");
                  // NOLINTNEXTLINE: low-level-calls.
                  (bool success, bytes memory returndata) = tokenAddress.call(callData);
                  require(success, string(returndata));
                  if (returndata.length > 0) {
                    require(abi.decode(returndata, (bool)), "TOKEN_OPERATION_FAILED");
                  }
                }
                function safeTokenTransfer(
                  address tokenAddress,
                  address recipient,
                  uint256 amount
                ) internal {
                  IERC20Detailed erc20Token = IERC20Detailed(tokenAddress);
                  bytes memory callData = abi.encodeWithSelector(
                    erc20Token.transfer.selector,
                    recipient,
                    amount
                  );
                  uint256 balanceBefore = erc20Token.balanceOf(recipient);
                  safeTokenContractCall(tokenAddress, callData);
                  uint256 balanceAfter = erc20Token.balanceOf(recipient);
                  require(
                    balanceAfter == balanceBefore + amount,
                    "SAFE_TOKEN_TRANSFER_FAILED"
                  );
                }
                function safeTokenTransferFrom(
                  address tokenAddress,
                  address sender,
                  address recipient,
                  uint256 amount
                ) internal {
                  IERC20Detailed erc20Token = IERC20Detailed(tokenAddress);
                  bytes memory callData = abi.encodeWithSelector(
                    erc20Token.transferFrom.selector,
                    sender,
                    recipient,
                    amount
                  );
                  uint256 balanceBefore = erc20Token.balanceOf(recipient);
                  safeTokenContractCall(tokenAddress, callData);
                  uint256 balanceAfter = erc20Token.balanceOf(recipient);
                  require(
                    balanceAfter == balanceBefore + amount,
                    "SAFE_TOKEN_TRANSFER_FAILED"
                  );
                }
                /*
                    Validates that the passed contract address is of a real contract,
                    and that its id hash (as infered fromn identify()) matched the expected one.
                  */
                function validateContractId(
                  address contractAddress,
                  bytes32 expectedIdHash
                ) internal {
                  require(isContract(contractAddress), "ADDRESS_NOT_CONTRACT");
                  (bool success, bytes memory returndata) = contractAddress.call( // NOLINT: low-level-calls.
                      abi.encodeWithSignature("identify()")
                    );
                  require(success, "FAILED_TO_IDENTIFY_CONTRACT");
                  string memory realContractId = abi.decode(returndata, (string));
                  require(
                    keccak256(abi.encodePacked(realContractId)) == expectedIdHash,
                    "UNEXPECTED_CONTRACT_IDENTIFIER"
                  );
                }
              }
              // SPDX-License-Identifier: Apache-2.0.
              pragma solidity ^0.8.24;
              /******************************************************************************\\
              * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen)
              * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535
              /******************************************************************************/
              import {IDiamondCut} from "../interfaces/IDiamondCut.sol";
              // Remember to add the loupe functions from DiamondLoupeFacet to the diamond.
              // The loupe functions are required by the EIP2535 Diamonds standard
              error InitializationFunctionReverted(
                address _initializationContractAddress,
                bytes _calldata
              );
              library LibDiamond {
                bytes32 constant DIAMOND_STORAGE_POSITION =
                  keccak256("diamond.standard.diamond.storage");
                struct FacetAddressAndPosition {
                  address facetAddress;
                  uint96 functionSelectorPosition; // position in facetFunctionSelectors.functionSelectors array
                }
                struct FacetFunctionSelectors {
                  bytes4[] functionSelectors;
                  uint256 facetAddressPosition; // position of facetAddress in facetAddresses array
                }
                struct DiamondStorage {
                  // maps function selector to the facet address and
                  // the position of the selector in the facetFunctionSelectors.selectors array
                  mapping(bytes4 => FacetAddressAndPosition) selectorToFacetAndPosition;
                  // maps facet addresses to function selectors
                  mapping(address => FacetFunctionSelectors) facetFunctionSelectors;
                  // facet addresses
                  address[] facetAddresses;
                  // Used to query if a contract implements an interface.
                  // Used to implement ERC-165.
                  mapping(bytes4 => bool) supportedInterfaces;
                  // owner of the contract
                  address contractOwner;
                }
                function diamondStorage() internal pure returns (DiamondStorage storage ds) {
                  bytes32 position = DIAMOND_STORAGE_POSITION;
                  assembly {
                    ds.slot := position
                  }
                }
                event OwnershipTransferred(
                  address indexed previousOwner,
                  address indexed newOwner
                );
                function setContractOwner(address _newOwner) internal {
                  DiamondStorage storage ds = diamondStorage();
                  address previousOwner = ds.contractOwner;
                  ds.contractOwner = _newOwner;
                  emit OwnershipTransferred(previousOwner, _newOwner);
                }
                function contractOwner() internal view returns (address contractOwner_) {
                  contractOwner_ = diamondStorage().contractOwner;
                }
                function enforceIsContractOwner() internal view {
                  require(
                    msg.sender == diamondStorage().contractOwner,
                    "LibDiamond: Must be contract owner"
                  );
                }
                event DiamondCut(
                  IDiamondCut.FacetCut[] _diamondCut,
                  address _init,
                  bytes _calldata
                );
                // Internal function version of diamondCut
                function diamondCut(
                  IDiamondCut.FacetCut[] memory _diamondCut,
                  address _init,
                  bytes memory _calldata
                ) internal {
                  for (uint256 facetIndex; facetIndex < _diamondCut.length; facetIndex++) {
                    IDiamondCut.FacetCutAction action = _diamondCut[facetIndex].action;
                    if (action == IDiamondCut.FacetCutAction.Add) {
                      addFunctions(
                        _diamondCut[facetIndex].facetAddress,
                        _diamondCut[facetIndex].functionSelectors
                      );
                    } else if (action == IDiamondCut.FacetCutAction.Replace) {
                      replaceFunctions(
                        _diamondCut[facetIndex].facetAddress,
                        _diamondCut[facetIndex].functionSelectors
                      );
                    } else if (action == IDiamondCut.FacetCutAction.Remove) {
                      removeFunctions(
                        _diamondCut[facetIndex].facetAddress,
                        _diamondCut[facetIndex].functionSelectors
                      );
                    } else {
                      revert("LibDiamondCut: Incorrect FacetCutAction");
                    }
                  }
                  emit DiamondCut(_diamondCut, _init, _calldata);
                  initializeDiamondCut(_init, _calldata);
                }
                function addFunctions(
                  address _facetAddress,
                  bytes4[] memory _functionSelectors
                ) internal {
                  require(
                    _functionSelectors.length > 0,
                    "LibDiamondCut: No selectors in facet to cut"
                  );
                  DiamondStorage storage ds = diamondStorage();
                  require(
                    _facetAddress != address(0),
                    "LibDiamondCut: Add facet can't be address(0)"
                  );
                  uint96 selectorPosition = uint96(
                    ds.facetFunctionSelectors[_facetAddress].functionSelectors.length
                  );
                  // add new facet address if it does not exist
                  if (selectorPosition == 0) {
                    addFacet(ds, _facetAddress);
                  }
                  for (
                    uint256 selectorIndex;
                    selectorIndex < _functionSelectors.length;
                    selectorIndex++
                  ) {
                    bytes4 selector = _functionSelectors[selectorIndex];
                    address oldFacetAddress = ds
                      .selectorToFacetAndPosition[selector]
                      .facetAddress;
                    require(
                      oldFacetAddress == address(0),
                      "LibDiamondCut: Can't add function that already exists"
                    );
                    addFunction(ds, selector, selectorPosition, _facetAddress);
                    selectorPosition++;
                  }
                }
                function replaceFunctions(
                  address _facetAddress,
                  bytes4[] memory _functionSelectors
                ) internal {
                  require(
                    _functionSelectors.length > 0,
                    "LibDiamondCut: No selectors in facet to cut"
                  );
                  DiamondStorage storage ds = diamondStorage();
                  require(
                    _facetAddress != address(0),
                    "LibDiamondCut: Add facet can't be address(0)"
                  );
                  uint96 selectorPosition = uint96(
                    ds.facetFunctionSelectors[_facetAddress].functionSelectors.length
                  );
                  // add new facet address if it does not exist
                  if (selectorPosition == 0) {
                    addFacet(ds, _facetAddress);
                  }
                  for (
                    uint256 selectorIndex;
                    selectorIndex < _functionSelectors.length;
                    selectorIndex++
                  ) {
                    bytes4 selector = _functionSelectors[selectorIndex];
                    address oldFacetAddress = ds
                      .selectorToFacetAndPosition[selector]
                      .facetAddress;
                    require(
                      oldFacetAddress != _facetAddress,
                      "LibDiamondCut: Can't replace function with same function"
                    );
                    removeFunction(ds, oldFacetAddress, selector);
                    addFunction(ds, selector, selectorPosition, _facetAddress);
                    selectorPosition++;
                  }
                }
                function removeFunctions(
                  address _facetAddress,
                  bytes4[] memory _functionSelectors
                ) internal {
                  require(
                    _functionSelectors.length > 0,
                    "LibDiamondCut: No selectors in facet to cut"
                  );
                  DiamondStorage storage ds = diamondStorage();
                  // if function does not exist then do nothing and return
                  require(
                    _facetAddress == address(0),
                    "LibDiamondCut: Remove facet address must be address(0)"
                  );
                  for (
                    uint256 selectorIndex;
                    selectorIndex < _functionSelectors.length;
                    selectorIndex++
                  ) {
                    bytes4 selector = _functionSelectors[selectorIndex];
                    address oldFacetAddress = ds
                      .selectorToFacetAndPosition[selector]
                      .facetAddress;
                    removeFunction(ds, oldFacetAddress, selector);
                  }
                }
                function addFacet(DiamondStorage storage ds, address _facetAddress) internal {
                  enforceHasContractCode(
                    _facetAddress,
                    "LibDiamondCut: New facet has no code"
                  );
                  ds.facetFunctionSelectors[_facetAddress].facetAddressPosition = ds
                    .facetAddresses
                    .length;
                  ds.facetAddresses.push(_facetAddress);
                }
                function addFunction(
                  DiamondStorage storage ds,
                  bytes4 _selector,
                  uint96 _selectorPosition,
                  address _facetAddress
                ) internal {
                  ds
                    .selectorToFacetAndPosition[_selector]
                    .functionSelectorPosition = _selectorPosition;
                  ds.facetFunctionSelectors[_facetAddress].functionSelectors.push(_selector);
                  ds.selectorToFacetAndPosition[_selector].facetAddress = _facetAddress;
                }
                function removeFunction(
                  DiamondStorage storage ds,
                  address _facetAddress,
                  bytes4 _selector
                ) internal {
                  require(
                    _facetAddress != address(0),
                    "LibDiamondCut: Can't remove function that doesn't exist"
                  );
                  // an immutable function is a function defined directly in a diamond
                  require(
                    _facetAddress != address(this),
                    "LibDiamondCut: Can't remove immutable function"
                  );
                  // replace selector with last selector, then delete last selector
                  uint256 selectorPosition = ds
                    .selectorToFacetAndPosition[_selector]
                    .functionSelectorPosition;
                  uint256 lastSelectorPosition = ds
                    .facetFunctionSelectors[_facetAddress]
                    .functionSelectors
                    .length - 1;
                  // if not the same then replace _selector with lastSelector
                  if (selectorPosition != lastSelectorPosition) {
                    bytes4 lastSelector = ds
                      .facetFunctionSelectors[_facetAddress]
                      .functionSelectors[lastSelectorPosition];
                    ds.facetFunctionSelectors[_facetAddress].functionSelectors[
                      selectorPosition
                    ] = lastSelector;
                    ds
                      .selectorToFacetAndPosition[lastSelector]
                      .functionSelectorPosition = uint96(selectorPosition);
                  }
                  // delete the last selector
                  ds.facetFunctionSelectors[_facetAddress].functionSelectors.pop();
                  delete ds.selectorToFacetAndPosition[_selector];
                  // if no more selectors for facet address then delete the facet address
                  if (lastSelectorPosition == 0) {
                    // replace facet address with last facet address and delete last facet address
                    uint256 lastFacetAddressPosition = ds.facetAddresses.length - 1;
                    uint256 facetAddressPosition = ds
                      .facetFunctionSelectors[_facetAddress]
                      .facetAddressPosition;
                    if (facetAddressPosition != lastFacetAddressPosition) {
                      address lastFacetAddress = ds.facetAddresses[lastFacetAddressPosition];
                      ds.facetAddresses[facetAddressPosition] = lastFacetAddress;
                      ds
                        .facetFunctionSelectors[lastFacetAddress]
                        .facetAddressPosition = facetAddressPosition;
                    }
                    ds.facetAddresses.pop();
                    delete ds.facetFunctionSelectors[_facetAddress].facetAddressPosition;
                  }
                }
                function initializeDiamondCut(
                  address _init,
                  bytes memory _calldata
                ) internal {
                  if (_init == address(0)) {
                    return;
                  }
                  enforceHasContractCode(_init, "LibDiamondCut: _init address has no code");
                  (bool success, bytes memory error) = _init.delegatecall(_calldata);
                  if (!success) {
                    if (error.length > 0) {
                      // bubble up error
                      /// @solidity memory-safe-assembly
                      assembly {
                        let returndata_size := mload(error)
                        revert(add(32, error), returndata_size)
                      }
                    } else {
                      revert InitializationFunctionReverted(_init, _calldata);
                    }
                  }
                }
                function enforceHasContractCode(
                  address _contract,
                  string memory _errorMessage
                ) internal view {
                  uint256 contractSize;
                  assembly {
                    contractSize := extcodesize(_contract)
                  }
                  require(contractSize > 0, _errorMessage);
                }
              }
              // SPDX-License-Identifier: Apache-2.0.
              pragma solidity ^0.8.24;
              import "../libraries/LibDiamond.sol";
              contract Ownable {
                modifier onlyOwner() {
                  LibDiamond.enforceIsContractOwner();
                  _;
                }
              }
              // SPDX-License-Identifier: MIT
              pragma solidity >=0.4.22 <0.9.0;
              library console {
                  address constant CONSOLE_ADDRESS =
                      0x000000000000000000636F6e736F6c652e6c6f67;
                  function _sendLogPayloadImplementation(bytes memory payload) internal view {
                      address consoleAddress = CONSOLE_ADDRESS;
                      /// @solidity memory-safe-assembly
                      assembly {
                          pop(
                              staticcall(
                                  gas(),
                                  consoleAddress,
                                  add(payload, 32),
                                  mload(payload),
                                  0,
                                  0
                              )
                          )
                      }
                  }
                  function _castToPure(
                    function(bytes memory) internal view fnIn
                  ) internal pure returns (function(bytes memory) pure fnOut) {
                      assembly {
                          fnOut := fnIn
                      }
                  }
                  function _sendLogPayload(bytes memory payload) internal pure {
                      _castToPure(_sendLogPayloadImplementation)(payload);
                  }
                  function log() internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log()"));
                  }
                  function logInt(int256 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
                  }
                  function logUint(uint256 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
                  }
                  function logString(string memory p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
                  }
                  function logBool(bool p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
                  }
                  function logAddress(address p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
                  }
                  function logBytes(bytes memory p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
                  }
                  function logBytes1(bytes1 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
                  }
                  function logBytes2(bytes2 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
                  }
                  function logBytes3(bytes3 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
                  }
                  function logBytes4(bytes4 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
                  }
                  function logBytes5(bytes5 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
                  }
                  function logBytes6(bytes6 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
                  }
                  function logBytes7(bytes7 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
                  }
                  function logBytes8(bytes8 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
                  }
                  function logBytes9(bytes9 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
                  }
                  function logBytes10(bytes10 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
                  }
                  function logBytes11(bytes11 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
                  }
                  function logBytes12(bytes12 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
                  }
                  function logBytes13(bytes13 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
                  }
                  function logBytes14(bytes14 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
                  }
                  function logBytes15(bytes15 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
                  }
                  function logBytes16(bytes16 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
                  }
                  function logBytes17(bytes17 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
                  }
                  function logBytes18(bytes18 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
                  }
                  function logBytes19(bytes19 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
                  }
                  function logBytes20(bytes20 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
                  }
                  function logBytes21(bytes21 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
                  }
                  function logBytes22(bytes22 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
                  }
                  function logBytes23(bytes23 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
                  }
                  function logBytes24(bytes24 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
                  }
                  function logBytes25(bytes25 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
                  }
                  function logBytes26(bytes26 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
                  }
                  function logBytes27(bytes27 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
                  }
                  function logBytes28(bytes28 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
                  }
                  function logBytes29(bytes29 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
                  }
                  function logBytes30(bytes30 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
                  }
                  function logBytes31(bytes31 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
                  }
                  function logBytes32(bytes32 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
                  }
                  function log(uint256 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
                  }
                  function log(string memory p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
                  }
                  function log(bool p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
                  }
                  function log(address p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
                  }
                  function log(uint256 p0, uint256 p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1));
                  }
                  function log(uint256 p0, string memory p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1));
                  }
                  function log(uint256 p0, bool p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1));
                  }
                  function log(uint256 p0, address p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1));
                  }
                  function log(string memory p0, uint256 p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
                  }
                  function log(string memory p0, string memory p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
                  }
                  function log(string memory p0, bool p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
                  }
                  function log(string memory p0, address p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
                  }
                  function log(bool p0, uint256 p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1));
                  }
                  function log(bool p0, string memory p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
                  }
                  function log(bool p0, bool p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
                  }
                  function log(bool p0, address p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
                  }
                  function log(address p0, uint256 p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1));
                  }
                  function log(address p0, string memory p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
                  }
                  function log(address p0, bool p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
                  }
                  function log(address p0, address p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
                  }
                  function log(uint256 p0, uint256 p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2));
                  }
                  function log(uint256 p0, uint256 p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2));
                  }
                  function log(uint256 p0, uint256 p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2));
                  }
                  function log(uint256 p0, uint256 p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2));
                  }
                  function log(uint256 p0, string memory p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2));
                  }
                  function log(uint256 p0, string memory p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2));
                  }
                  function log(uint256 p0, string memory p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2));
                  }
                  function log(uint256 p0, string memory p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2));
                  }
                  function log(uint256 p0, bool p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2));
                  }
                  function log(uint256 p0, bool p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2));
                  }
                  function log(uint256 p0, bool p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2));
                  }
                  function log(uint256 p0, bool p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2));
                  }
                  function log(uint256 p0, address p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2));
                  }
                  function log(uint256 p0, address p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2));
                  }
                  function log(uint256 p0, address p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2));
                  }
                  function log(uint256 p0, address p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2));
                  }
                  function log(string memory p0, uint256 p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2));
                  }
                  function log(string memory p0, uint256 p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2));
                  }
                  function log(string memory p0, uint256 p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2));
                  }
                  function log(string memory p0, uint256 p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2));
                  }
                  function log(string memory p0, string memory p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2));
                  }
                  function log(string memory p0, string memory p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
                  }
                  function log(string memory p0, string memory p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
                  }
                  function log(string memory p0, string memory p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
                  }
                  function log(string memory p0, bool p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2));
                  }
                  function log(string memory p0, bool p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
                  }
                  function log(string memory p0, bool p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
                  }
                  function log(string memory p0, bool p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
                  }
                  function log(string memory p0, address p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2));
                  }
                  function log(string memory p0, address p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
                  }
                  function log(string memory p0, address p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
                  }
                  function log(string memory p0, address p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
                  }
                  function log(bool p0, uint256 p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2));
                  }
                  function log(bool p0, uint256 p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2));
                  }
                  function log(bool p0, uint256 p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2));
                  }
                  function log(bool p0, uint256 p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2));
                  }
                  function log(bool p0, string memory p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2));
                  }
                  function log(bool p0, string memory p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
                  }
                  function log(bool p0, string memory p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
                  }
                  function log(bool p0, string memory p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
                  }
                  function log(bool p0, bool p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2));
                  }
                  function log(bool p0, bool p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
                  }
                  function log(bool p0, bool p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
                  }
                  function log(bool p0, bool p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
                  }
                  function log(bool p0, address p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2));
                  }
                  function log(bool p0, address p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
                  }
                  function log(bool p0, address p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
                  }
                  function log(bool p0, address p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
                  }
                  function log(address p0, uint256 p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2));
                  }
                  function log(address p0, uint256 p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2));
                  }
                  function log(address p0, uint256 p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2));
                  }
                  function log(address p0, uint256 p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2));
                  }
                  function log(address p0, string memory p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2));
                  }
                  function log(address p0, string memory p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
                  }
                  function log(address p0, string memory p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
                  }
                  function log(address p0, string memory p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
                  }
                  function log(address p0, bool p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2));
                  }
                  function log(address p0, bool p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
                  }
                  function log(address p0, bool p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
                  }
                  function log(address p0, bool p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
                  }
                  function log(address p0, address p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2));
                  }
                  function log(address p0, address p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
                  }
                  function log(address p0, address p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
                  }
                  function log(address p0, address p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
                  }
                  function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {
                      _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 pure {
                      _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 pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {
                      _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 pure {
                      _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 pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {
                      _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 pure {
                      _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 pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {
                      _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 pure {
                      _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 pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {
                      _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 pure {
                      _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 pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {
                      _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 pure {
                      _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 pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {
                      _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 pure {
                      _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 pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
                  }
              }
              

              File 4 of 4: LidoProvider
              // SPDX-License-Identifier: Apache-2.0.
              pragma solidity ^0.8.24;
              interface ILido {
                function allowance(
                  address _owner,
                  address _spender
                ) external view returns (uint256);
                function approve(address _spender, uint256 _amount) external returns (bool);
                function balanceOf(address _account) external view returns (uint256);
                function isStakingPaused() external view returns (bool);
                function getCurrentStakeLimit() external view returns (uint256);
                function submit(address _referral) external payable returns (uint256);
                function getPooledEthByShares(
                  uint256 _sharesAmount
                ) external view returns (uint256);
                function getSharesByPooledEth(
                  uint256 _ethAmount
                ) external view returns (uint256);
              }
              // SPDX-License-Identifier: Apache-2.0.
              pragma solidity ^0.8.24;
              interface ILidoLocator {
                function lido() external view returns (address);
                function withdrawalQueue() external view returns (address);
              }
              // SPDX-License-Identifier: Apache-2.0.
              pragma solidity ^0.8.24;
              interface IWithdrawalQueue {
                struct WithdrawalRequestStatus {
                  uint256 amountOfStETH;
                  uint256 amountOfShares;
                  address owner;
                  uint256 timestamp;
                  bool isFinalized;
                  bool isClaimed;
                }
                function getWithdrawalRequests(
                  address _owner
                ) external view returns (uint256[] memory requestsIds);
                function getWithdrawalStatus(
                  uint256[] calldata _requestIds
                ) external view returns (WithdrawalRequestStatus[] memory statuses);
                function requestWithdrawals(
                  uint256[] calldata _amounts,
                  address _owner
                ) external returns (uint256[] memory requestIds);
                function getClaimableEther(
                  uint256[] calldata _requestIds,
                  uint256[] calldata _hints
                ) external view returns (uint256[] memory claimableEthValues);
                function claimWithdrawal(uint256 _requestId) external;
              }
              // SPDX-License-Identifier: Apache-2.0.
              pragma solidity ^0.8.24;
              import {ILido} from "../interfaces/lido/ILido.sol";
              import {ILidoLocator} from "../interfaces/lido/ILidoLocator.sol";
              import {IWithdrawalQueue} from "../interfaces/lido/IWithdrawalQueue.sol";
              import "hardhat/console.sol";
              interface IWstETH {
                function wrap(uint256 _stETHAmount) external returns (uint256);
                function unwrap(uint256 _wstETHAmount) external returns (uint256);
              }
              contract LidoProvider {
                address constant NATIVE_ETH_ADDRESS =
                  0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
                bytes32 constant LIDO_PROVIDER_STORAGE_POSITION =
                  keccak256("diamond.standard.lidoProvider.storage");
                uint256 constant MAX_WITHDRAWAL_SIZE = 1000 ether;
                struct LidoProviderStorage {
                  address lidoLocatorAddress;
                  bool isLidoProviderInitialized;
                }
                function _lidoProviderStorage()
                  internal
                  pure
                  returns (LidoProviderStorage storage ds)
                {
                  bytes32 position = LIDO_PROVIDER_STORAGE_POSITION;
                  assembly {
                    ds.slot := position
                  }
                }
                struct WithdrawalData {
                  uint256 preparingAmount;
                  uint256 preparedAmount;
                }
                event Invested(
                  address indexed liquidity,
                  address indexed asset,
                  uint256 amount
                );
                event WithdrawalPrepared(
                  address indexed liquidity,
                  address indexed asset,
                  uint256 amount
                );
                event WithdrawalFinished(
                  address indexed liquidity,
                  address indexed asset,
                  uint256 amount
                );
                function isInitialized() external view returns (bool) {
                  return _lidoProviderStorage().isLidoProviderInitialized;
                }
                function initialize(bytes[] memory params) external {
                  require(params.length > 0, "No params provided");
                  require(
                    !_lidoProviderStorage().isLidoProviderInitialized,
                    "Already initialized"
                  );
                  _lidoProviderStorage().lidoLocatorAddress = abi.decode(
                    params[0],
                    (address)
                  );
                  _lidoProviderStorage().isLidoProviderInitialized = true;
                }
                function lidoLocatorAddress() public view returns (address) {
                  return _lidoProviderStorage().lidoLocatorAddress;
                }
                modifier lidoLocatorCheck() {
                  require(lidoLocatorAddress() != address(0), "LidoLocator address not set");
                  _;
                }
                modifier assetCheck(address asset) {
                  require(asset == NATIVE_ETH_ADDRESS, "Asset must be ether");
                  _;
                }
                function _getLido() private view returns (ILido) {
                  address lidoAddress = ILidoLocator(lidoLocatorAddress()).lido();
                  return ILido(lidoAddress);
                }
                function _getWithdrawalQueue() private view returns (IWithdrawalQueue) {
                  address withdrawalQueueAddress = ILidoLocator(lidoLocatorAddress())
                    .withdrawalQueue();
                  return IWithdrawalQueue(withdrawalQueueAddress);
                }
                function supportedAssets() external pure returns (address[] memory) {
                  address[] memory assets = new address[](1);
                  assets[0] = NATIVE_ETH_ADDRESS;
                  return assets;
                }
                function canDirectlyWithdraw(
                  address asset
                ) external pure assetCheck(asset) returns (bool) {
                  return false;
                }
                function getWithdrawalData(
                  address asset
                )
                  public
                  view
                  lidoLocatorCheck
                  assetCheck(asset)
                  returns (WithdrawalData memory)
                {
                  IWithdrawalQueue withdrawalQueue = _getWithdrawalQueue();
                  uint256[] memory withdrawalRequests = withdrawalQueue.getWithdrawalRequests(
                    address(this)
                  );
                  IWithdrawalQueue.WithdrawalRequestStatus[] memory statuses = withdrawalQueue
                    .getWithdrawalStatus(withdrawalRequests);
                  uint256 totalPending = 0;
                  uint256 totalAvailable = 0;
                  for (uint256 i = 0; i < statuses.length; i++) {
                    if (!statuses[i].isFinalized) {
                      totalPending += statuses[i].amountOfStETH;
                    } else if (!statuses[i].isClaimed) {
                      totalAvailable += statuses[i].amountOfStETH;
                    }
                  }
                  return WithdrawalData(totalPending, totalAvailable);
                }
                function getAssetBalance(
                  address asset
                ) public view lidoLocatorCheck assetCheck(asset) returns (uint256) {
                  ILido lido = _getLido();
                  WithdrawalData memory withdrawalData = getWithdrawalData(asset);
                  uint256 totalInWithdrawals = withdrawalData.preparingAmount +
                    withdrawalData.preparedAmount;
                  return lido.balanceOf(address(this)) + totalInWithdrawals;
                }
                function invest(
                  address asset,
                  uint256 amount
                ) external payable lidoLocatorCheck assetCheck(asset) {
                  ILido lido = _getLido();
                  require(!lido.isStakingPaused(), "Staking is paused");
                  require(lido.getCurrentStakeLimit() > amount, "Amount exceeds stake limit");
                  lido.submit{value: amount}(address(0));
                  emit Invested(address(this), asset, amount);
                }
                function prepareWithdrawal(
                  address asset,
                  uint256 amount
                ) external lidoLocatorCheck assetCheck(asset) {
                  ILido lido = _getLido();
                  IWithdrawalQueue withdrawalQueue = _getWithdrawalQueue();
                  uint256 balance = lido.balanceOf(address(this));
                  require(balance >= amount, "Insufficient balance");
                  uint256 stEthAllowance = lido.allowance(
                    address(this),
                    address(withdrawalQueue)
                  );
                  if (stEthAllowance < amount) {
                    lido.approve(address(withdrawalQueue), amount - stEthAllowance);
                  }
                  uint256 numChunks = (amount + MAX_WITHDRAWAL_SIZE - 1) /
                    MAX_WITHDRAWAL_SIZE; // Calculate total number of chunks needed
                  uint256[] memory amounts = new uint256[](numChunks);
                  uint256 remainingAmount = amount;
                  for (uint256 i = 0; i < numChunks; i++) {
                    if (remainingAmount > MAX_WITHDRAWAL_SIZE) {
                      amounts[i] = MAX_WITHDRAWAL_SIZE;
                      remainingAmount -= MAX_WITHDRAWAL_SIZE;
                    } else {
                      amounts[i] = remainingAmount;
                      remainingAmount = 0;
                    }
                  }
                  withdrawalQueue.requestWithdrawals(amounts, address(this));
                  emit WithdrawalPrepared(address(this), asset, amount);
                }
                function finishWithdrawal(
                  address asset
                ) external lidoLocatorCheck assetCheck(asset) {
                  IWithdrawalQueue withdrawalQueue = _getWithdrawalQueue();
                  uint256[] memory withdrawalRequests = withdrawalQueue.getWithdrawalRequests(
                    address(this)
                  );
                  IWithdrawalQueue.WithdrawalRequestStatus[] memory statuses = withdrawalQueue
                    .getWithdrawalStatus(withdrawalRequests);
                  uint256 totalAvailable = 0;
                  for (uint256 i = 0; i < withdrawalRequests.length; i++) {
                    if (statuses[i].isFinalized && !statuses[i].isClaimed) {
                      withdrawalQueue.claimWithdrawal(withdrawalRequests[i]);
                      totalAvailable += statuses[i].amountOfStETH;
                    }
                  }
                  emit WithdrawalFinished(address(this), asset, totalAvailable);
                }
                function supportsEmergencyWithdraw(
                  address asset
                ) external pure assetCheck(asset) returns (bool) {
                  return false;
                }
                function supportsEarnings(
                  address asset
                ) external pure assetCheck(asset) returns (bool) {
                  return false;
                }
              }
              // SPDX-License-Identifier: MIT
              pragma solidity >=0.4.22 <0.9.0;
              library console {
                  address constant CONSOLE_ADDRESS =
                      0x000000000000000000636F6e736F6c652e6c6f67;
                  function _sendLogPayloadImplementation(bytes memory payload) internal view {
                      address consoleAddress = CONSOLE_ADDRESS;
                      /// @solidity memory-safe-assembly
                      assembly {
                          pop(
                              staticcall(
                                  gas(),
                                  consoleAddress,
                                  add(payload, 32),
                                  mload(payload),
                                  0,
                                  0
                              )
                          )
                      }
                  }
                  function _castToPure(
                    function(bytes memory) internal view fnIn
                  ) internal pure returns (function(bytes memory) pure fnOut) {
                      assembly {
                          fnOut := fnIn
                      }
                  }
                  function _sendLogPayload(bytes memory payload) internal pure {
                      _castToPure(_sendLogPayloadImplementation)(payload);
                  }
                  function log() internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log()"));
                  }
                  function logInt(int256 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
                  }
                  function logUint(uint256 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
                  }
                  function logString(string memory p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
                  }
                  function logBool(bool p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
                  }
                  function logAddress(address p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
                  }
                  function logBytes(bytes memory p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
                  }
                  function logBytes1(bytes1 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
                  }
                  function logBytes2(bytes2 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
                  }
                  function logBytes3(bytes3 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
                  }
                  function logBytes4(bytes4 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
                  }
                  function logBytes5(bytes5 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
                  }
                  function logBytes6(bytes6 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
                  }
                  function logBytes7(bytes7 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
                  }
                  function logBytes8(bytes8 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
                  }
                  function logBytes9(bytes9 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
                  }
                  function logBytes10(bytes10 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
                  }
                  function logBytes11(bytes11 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
                  }
                  function logBytes12(bytes12 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
                  }
                  function logBytes13(bytes13 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
                  }
                  function logBytes14(bytes14 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
                  }
                  function logBytes15(bytes15 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
                  }
                  function logBytes16(bytes16 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
                  }
                  function logBytes17(bytes17 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
                  }
                  function logBytes18(bytes18 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
                  }
                  function logBytes19(bytes19 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
                  }
                  function logBytes20(bytes20 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
                  }
                  function logBytes21(bytes21 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
                  }
                  function logBytes22(bytes22 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
                  }
                  function logBytes23(bytes23 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
                  }
                  function logBytes24(bytes24 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
                  }
                  function logBytes25(bytes25 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
                  }
                  function logBytes26(bytes26 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
                  }
                  function logBytes27(bytes27 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
                  }
                  function logBytes28(bytes28 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
                  }
                  function logBytes29(bytes29 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
                  }
                  function logBytes30(bytes30 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
                  }
                  function logBytes31(bytes31 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
                  }
                  function logBytes32(bytes32 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
                  }
                  function log(uint256 p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
                  }
                  function log(string memory p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
                  }
                  function log(bool p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
                  }
                  function log(address p0) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
                  }
                  function log(uint256 p0, uint256 p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1));
                  }
                  function log(uint256 p0, string memory p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1));
                  }
                  function log(uint256 p0, bool p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1));
                  }
                  function log(uint256 p0, address p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1));
                  }
                  function log(string memory p0, uint256 p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
                  }
                  function log(string memory p0, string memory p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
                  }
                  function log(string memory p0, bool p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
                  }
                  function log(string memory p0, address p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
                  }
                  function log(bool p0, uint256 p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1));
                  }
                  function log(bool p0, string memory p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
                  }
                  function log(bool p0, bool p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
                  }
                  function log(bool p0, address p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
                  }
                  function log(address p0, uint256 p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1));
                  }
                  function log(address p0, string memory p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
                  }
                  function log(address p0, bool p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
                  }
                  function log(address p0, address p1) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
                  }
                  function log(uint256 p0, uint256 p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2));
                  }
                  function log(uint256 p0, uint256 p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2));
                  }
                  function log(uint256 p0, uint256 p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2));
                  }
                  function log(uint256 p0, uint256 p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2));
                  }
                  function log(uint256 p0, string memory p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2));
                  }
                  function log(uint256 p0, string memory p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2));
                  }
                  function log(uint256 p0, string memory p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2));
                  }
                  function log(uint256 p0, string memory p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2));
                  }
                  function log(uint256 p0, bool p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2));
                  }
                  function log(uint256 p0, bool p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2));
                  }
                  function log(uint256 p0, bool p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2));
                  }
                  function log(uint256 p0, bool p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2));
                  }
                  function log(uint256 p0, address p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2));
                  }
                  function log(uint256 p0, address p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2));
                  }
                  function log(uint256 p0, address p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2));
                  }
                  function log(uint256 p0, address p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2));
                  }
                  function log(string memory p0, uint256 p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2));
                  }
                  function log(string memory p0, uint256 p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2));
                  }
                  function log(string memory p0, uint256 p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2));
                  }
                  function log(string memory p0, uint256 p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2));
                  }
                  function log(string memory p0, string memory p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2));
                  }
                  function log(string memory p0, string memory p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
                  }
                  function log(string memory p0, string memory p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
                  }
                  function log(string memory p0, string memory p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
                  }
                  function log(string memory p0, bool p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2));
                  }
                  function log(string memory p0, bool p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
                  }
                  function log(string memory p0, bool p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
                  }
                  function log(string memory p0, bool p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
                  }
                  function log(string memory p0, address p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2));
                  }
                  function log(string memory p0, address p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
                  }
                  function log(string memory p0, address p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
                  }
                  function log(string memory p0, address p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
                  }
                  function log(bool p0, uint256 p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2));
                  }
                  function log(bool p0, uint256 p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2));
                  }
                  function log(bool p0, uint256 p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2));
                  }
                  function log(bool p0, uint256 p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2));
                  }
                  function log(bool p0, string memory p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2));
                  }
                  function log(bool p0, string memory p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
                  }
                  function log(bool p0, string memory p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
                  }
                  function log(bool p0, string memory p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
                  }
                  function log(bool p0, bool p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2));
                  }
                  function log(bool p0, bool p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
                  }
                  function log(bool p0, bool p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
                  }
                  function log(bool p0, bool p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
                  }
                  function log(bool p0, address p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2));
                  }
                  function log(bool p0, address p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
                  }
                  function log(bool p0, address p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
                  }
                  function log(bool p0, address p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
                  }
                  function log(address p0, uint256 p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2));
                  }
                  function log(address p0, uint256 p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2));
                  }
                  function log(address p0, uint256 p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2));
                  }
                  function log(address p0, uint256 p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2));
                  }
                  function log(address p0, string memory p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2));
                  }
                  function log(address p0, string memory p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
                  }
                  function log(address p0, string memory p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
                  }
                  function log(address p0, string memory p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
                  }
                  function log(address p0, bool p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2));
                  }
                  function log(address p0, bool p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
                  }
                  function log(address p0, bool p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
                  }
                  function log(address p0, bool p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
                  }
                  function log(address p0, address p1, uint256 p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2));
                  }
                  function log(address p0, address p1, string memory p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
                  }
                  function log(address p0, address p1, bool p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
                  }
                  function log(address p0, address p1, address p2) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
                  }
                  function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, string memory p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, bool p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3));
                  }
                  function log(uint256 p0, address p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, uint256 p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {
                      _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 pure {
                      _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 pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {
                      _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 pure {
                      _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 pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {
                      _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 pure {
                      _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 pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {
                      _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 pure {
                      _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 pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, bool p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {
                      _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 pure {
                      _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 pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
                  }
                  function log(string memory p0, address p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, uint256 p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {
                      _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 pure {
                      _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 pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, string memory p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, bool p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
                  }
                  function log(bool p0, address p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, uint256 p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {
                      _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 pure {
                      _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 pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, string memory p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, bool p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, uint256 p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, uint256 p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, uint256 p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, string memory p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, string memory p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, string memory p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, string memory p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, bool p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, bool p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, bool p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, bool p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, address p2, uint256 p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, address p2, string memory p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, address p2, bool p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
                  }
                  function log(address p0, address p1, address p2, address p3) internal pure {
                      _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
                  }
              }