{
  "address": "0xf738870a8063a060f59E3754C89039663bA1b027",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "axlGateway",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "axlGasReceiver",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "lzEndpoint",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "isTestnet",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "requestId",
          "type": "uint256"
        }
      ],
      "name": "ALREADY_EXECUTED",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AlreadyInitialized",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "name": "BRIDGE_LIMITS",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "lzEndpoint",
          "type": "address"
        }
      ],
      "name": "INVALID_ENDPOINT",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "_srcAddress",
          "type": "bytes"
        }
      ],
      "name": "INVALID_SENDER",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "chainId",
          "type": "uint256"
        }
      ],
      "name": "INVALID_TARGET_OR_CHAINID",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidAddress",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidAddressString",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "required",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "sent",
          "type": "uint256"
        }
      ],
      "name": "LZ_FEE",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "MISSING_FEE",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "NOT_GUARDIAN",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotApprovedByGateway",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "TRANSFER",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "TRANSFER_FROM",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "chainId",
          "type": "uint256"
        }
      ],
      "name": "UNSUPPORTED_CHAIN",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "WRONG_TOKEN",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "previousAdmin",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "newAdmin",
          "type": "address"
        }
      ],
      "name": "AdminChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "beacon",
          "type": "address"
        }
      ],
      "name": "BeaconUpgraded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "targetChainId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "normalizedAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "timestamp",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "enum MessagePassingBridge.BridgeService",
          "name": "bridge",
          "type": "uint8"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        }
      ],
      "name": "BridgeRequest",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "normalizedAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "fee",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "sourceChainId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "enum MessagePassingBridge.BridgeService",
          "name": "bridge",
          "type": "uint8"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        }
      ],
      "name": "ExecutedTransfer",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "sourceChainId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "sourceAddress",
          "type": "address"
        }
      ],
      "name": "FalseSender",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "version",
          "type": "uint8"
        }
      ],
      "name": "Initialized",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint16",
          "name": "_srcChainId",
          "type": "uint16"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "_srcAddress",
          "type": "bytes"
        },
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "_nonce",
          "type": "uint64"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "_payload",
          "type": "bytes"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "_reason",
          "type": "bytes"
        }
      ],
      "name": "MessageFailed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint16",
          "name": "_srcChainId",
          "type": "uint16"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "_srcAddress",
          "type": "bytes"
        },
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "_nonce",
          "type": "uint64"
        },
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "_payloadHash",
          "type": "bytes32"
        }
      ],
      "name": "RetryMessageSuccess",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint16",
          "name": "_dstChainId",
          "type": "uint16"
        },
        {
          "indexed": false,
          "internalType": "uint16",
          "name": "_type",
          "type": "uint16"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_minDstGas",
          "type": "uint256"
        }
      ],
      "name": "SetMinDstGas",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "precrime",
          "type": "address"
        }
      ],
      "name": "SetPrecrime",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint16",
          "name": "_remoteChainId",
          "type": "uint16"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "_path",
          "type": "bytes"
        }
      ],
      "name": "SetTrustedRemote",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint16",
          "name": "_remoteChainId",
          "type": "uint16"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "_remoteAddress",
          "type": "bytes"
        }
      ],
      "name": "SetTrustedRemoteAddress",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "implementation",
          "type": "address"
        }
      ],
      "name": "Upgraded",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "DEFAULT_PAYLOAD_SIZE_LIMIT",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "TESTNET",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "accountsDailyLimit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "lastTransferReset",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "bridged24Hours",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "avatar",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "bridgeDailyLimit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "lastTransferReset",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "bridged24Hours",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "bridgeFees",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "minFee",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "maxFee",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "fee",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "bridgeLimits",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "dailyLimit",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "txLimit",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "accountDailyLimit",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "minAmount",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "onlyWhitelisted",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "targetChainId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "enum MessagePassingBridge.BridgeService",
          "name": "bridge",
          "type": "uint8"
        }
      ],
      "name": "bridgeTo",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "targetChainId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "bridgeToWithAxelar",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "targetChainId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "bridgeToWithLz",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "targetChainId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "adapterParams",
          "type": "bytes"
        }
      ],
      "name": "bridgeToWithLzAdapterParams",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "canBridge",
      "outputs": [
        {
          "internalType": "bool",
          "name": "isWithinLimit",
          "type": "bool"
        },
        {
          "internalType": "string",
          "name": "error",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "currentId",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "dao",
      "outputs": [
        {
          "internalType": "contract Controller",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "disabledSourceBridges",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_dstChainId",
          "type": "uint16"
        },
        {
          "internalType": "address",
          "name": "_fromAddress",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_toAddress",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_normalizedAmount",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "_useZro",
          "type": "bool"
        },
        {
          "internalType": "bytes",
          "name": "_adapterParams",
          "type": "bytes"
        }
      ],
      "name": "estimateSendFee",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "nativeFee",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "zroFee",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "commandId",
          "type": "bytes32"
        },
        {
          "internalType": "string",
          "name": "sourceChain",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "sourceAddress",
          "type": "string"
        },
        {
          "internalType": "bytes",
          "name": "payload",
          "type": "bytes"
        }
      ],
      "name": "execute",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "commandId",
          "type": "bytes32"
        },
        {
          "internalType": "string",
          "name": "sourceChain",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "sourceAddress",
          "type": "string"
        },
        {
          "internalType": "bytes",
          "name": "payload",
          "type": "bytes"
        },
        {
          "internalType": "string",
          "name": "tokenSymbol",
          "type": "string"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "executeWithToken",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "executedRequests",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        },
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        },
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "name": "failedMessages",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "faucet",
      "outputs": [
        {
          "internalType": "contract IFaucet",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_srcChainId",
          "type": "uint16"
        },
        {
          "internalType": "bytes",
          "name": "_srcAddress",
          "type": "bytes"
        }
      ],
      "name": "forceResumeReceive",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "gasService",
      "outputs": [
        {
          "internalType": "contract IAxelarGasService",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "gateway",
      "outputs": [
        {
          "internalType": "contract IAxelarGateway",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_version",
          "type": "uint16"
        },
        {
          "internalType": "uint16",
          "name": "_chainId",
          "type": "uint16"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_configType",
          "type": "uint256"
        }
      ],
      "name": "getConfig",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_remoteChainId",
          "type": "uint16"
        }
      ],
      "name": "getTrustedRemoteAddress",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "guardian",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract INameService",
          "name": "nameService",
          "type": "address"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "dailyLimit",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "txLimit",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "accountDailyLimit",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "minAmount",
              "type": "uint256"
            },
            {
              "internalType": "bool",
              "name": "onlyWhitelisted",
              "type": "bool"
            }
          ],
          "internalType": "struct MessagePassingBridge.BridgeLimits",
          "name": "limits",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "minFee",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "maxFee",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "fee",
              "type": "uint256"
            }
          ],
          "internalType": "struct MessagePassingBridge.BridgeFees",
          "name": "fees",
          "type": "tuple"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "isClosed",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_srcChainId",
          "type": "uint16"
        },
        {
          "internalType": "bytes",
          "name": "_srcAddress",
          "type": "bytes"
        }
      ],
      "name": "isTrustedRemote",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "lzChainIdsMapping",
      "outputs": [
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "lzEndpoint",
      "outputs": [
        {
          "internalType": "contract ILayerZeroEndpointUpgradeable",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "lzEndpoint_",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_srcChainId",
          "type": "uint16"
        },
        {
          "internalType": "bytes",
          "name": "_srcAddress",
          "type": "bytes"
        },
        {
          "internalType": "uint64",
          "name": "_nonce",
          "type": "uint64"
        },
        {
          "internalType": "bytes",
          "name": "_payload",
          "type": "bytes"
        }
      ],
      "name": "lzReceive",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        },
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        }
      ],
      "name": "minDstGasLookup",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "nameService",
      "outputs": [
        {
          "internalType": "contract INameService",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "nativeToken",
      "outputs": [
        {
          "internalType": "contract IGoodDollar",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_srcChainId",
          "type": "uint16"
        },
        {
          "internalType": "bytes",
          "name": "_srcAddress",
          "type": "bytes"
        },
        {
          "internalType": "uint64",
          "name": "_nonce",
          "type": "uint64"
        },
        {
          "internalType": "bytes",
          "name": "_payload",
          "type": "bytes"
        }
      ],
      "name": "nonblockingLzReceive",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "onTokenTransfer",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bool",
          "name": "isPaused",
          "type": "bool"
        }
      ],
      "name": "pauseBridge",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        }
      ],
      "name": "payloadSizeLimitLookup",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "precrime",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "proxiableUUID",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_srcChainId",
          "type": "uint16"
        },
        {
          "internalType": "bytes",
          "name": "_srcAddress",
          "type": "bytes"
        },
        {
          "internalType": "uint64",
          "name": "_nonce",
          "type": "uint64"
        },
        {
          "internalType": "bytes",
          "name": "_payload",
          "type": "bytes"
        }
      ],
      "name": "retryMessage",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "minFee",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "maxFee",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "fee",
              "type": "uint256"
            }
          ],
          "internalType": "struct MessagePassingBridge.BridgeFees",
          "name": "fees",
          "type": "tuple"
        }
      ],
      "name": "setBridgeFees",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "dailyLimit",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "txLimit",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "accountDailyLimit",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "minAmount",
              "type": "uint256"
            },
            {
              "internalType": "bool",
              "name": "onlyWhitelisted",
              "type": "bool"
            }
          ],
          "internalType": "struct MessagePassingBridge.BridgeLimits",
          "name": "limits",
          "type": "tuple"
        }
      ],
      "name": "setBridgeLimits",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_version",
          "type": "uint16"
        },
        {
          "internalType": "uint16",
          "name": "_chainId",
          "type": "uint16"
        },
        {
          "internalType": "uint256",
          "name": "_configType",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "_config",
          "type": "bytes"
        }
      ],
      "name": "setConfig",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32[]",
          "name": "bridgeKeys",
          "type": "bytes32[]"
        },
        {
          "internalType": "bool[]",
          "name": "disabled",
          "type": "bool[]"
        }
      ],
      "name": "setDisabledBridges",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IFaucet",
          "name": "_faucet",
          "type": "address"
        }
      ],
      "name": "setFaucet",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_guardian",
          "type": "address"
        }
      ],
      "name": "setGuardian",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_dstChainId",
          "type": "uint16"
        },
        {
          "internalType": "uint16",
          "name": "_packetType",
          "type": "uint16"
        },
        {
          "internalType": "uint256",
          "name": "_minGas",
          "type": "uint256"
        }
      ],
      "name": "setMinDstGas",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_dstChainId",
          "type": "uint16"
        },
        {
          "internalType": "uint256",
          "name": "_size",
          "type": "uint256"
        }
      ],
      "name": "setPayloadSizeLimit",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_precrime",
          "type": "address"
        }
      ],
      "name": "setPrecrime",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_version",
          "type": "uint16"
        }
      ],
      "name": "setReceiveVersion",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_version",
          "type": "uint16"
        }
      ],
      "name": "setSendVersion",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_srcChainId",
          "type": "uint16"
        },
        {
          "internalType": "bytes",
          "name": "_path",
          "type": "bytes"
        }
      ],
      "name": "setTrustedRemote",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_remoteChainId",
          "type": "uint16"
        },
        {
          "internalType": "bytes",
          "name": "_remoteAddress",
          "type": "bytes"
        }
      ],
      "name": "setTrustedRemoteAddress",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        }
      ],
      "name": "trustedRemoteLookup",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "updateAvatar",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newImplementation",
          "type": "address"
        }
      ],
      "name": "upgradeTo",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newImplementation",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "upgradeToAndCall",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "withdraw",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "transactionHash": "0x615c48af00190ba4c06872a3d3853f9fbacd32c11531e551c248cb6d39ff3459",
  "receipt": {
    "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C",
    "from": "0xdF3e980a175904a26A7BA627048a789Ae6A141cD",
    "contractAddress": null,
    "transactionIndex": 6,
    "gasUsed": "5171257",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0xc62843b470f39b9d612ae6f7cdbd5978e96d602de6d4676b6ac56adbedf49bf6",
    "transactionHash": "0x615c48af00190ba4c06872a3d3853f9fbacd32c11531e551c248cb6d39ff3459",
    "logs": [],
    "blockNumber": 9435217,
    "cumulativeGasUsed": "18007421",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "0xe432150cce91c13a887f7D836923d5597adD8E31",
    "0xbE406F0189A0B4cf3A05C286473D23791Dd44Cc6",
    "0xbfD2135BFfbb0B5378b56643c2Df8a87552Bfa23",
    true
  ],
  "numDeployments": 7,
  "solcInputHash": "4bcc3c4681296379b4f09f3c06afb13f",
  "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"axlGateway\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"axlGasReceiver\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"lzEndpoint\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isTestnet\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"name\":\"ALREADY_EXECUTED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AlreadyInitialized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"BRIDGE_LIMITS\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"lzEndpoint\",\"type\":\"address\"}],\"name\":\"INVALID_ENDPOINT\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_srcAddress\",\"type\":\"bytes\"}],\"name\":\"INVALID_SENDER\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"name\":\"INVALID_TARGET_OR_CHAINID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAddressString\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sent\",\"type\":\"uint256\"}],\"name\":\"LZ_FEE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MISSING_FEE\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"NOT_GUARDIAN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotApprovedByGateway\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TRANSFER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TRANSFER_FROM\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"name\":\"UNSUPPORTED_CHAIN\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"WRONG_TOKEN\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"targetChainId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"normalizedAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"enum MessagePassingBridge.BridgeService\",\"name\":\"bridge\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"BridgeRequest\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"normalizedAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"sourceChainId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"enum MessagePassingBridge.BridgeService\",\"name\":\"bridge\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"ExecutedTransfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"sourceChainId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sourceAddress\",\"type\":\"address\"}],\"name\":\"FalseSender\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"_srcChainId\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_srcAddress\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"_nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_payload\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"_srcChainId\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_srcAddress\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"_nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_payloadHash\",\"type\":\"bytes32\"}],\"name\":\"RetryMessageSuccess\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"_dstChainId\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"_type\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_minDstGas\",\"type\":\"uint256\"}],\"name\":\"SetMinDstGas\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"precrime\",\"type\":\"address\"}],\"name\":\"SetPrecrime\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"_remoteChainId\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_path\",\"type\":\"bytes\"}],\"name\":\"SetTrustedRemote\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"_remoteChainId\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_remoteAddress\",\"type\":\"bytes\"}],\"name\":\"SetTrustedRemoteAddress\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_PAYLOAD_SIZE_LIMIT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TESTNET\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"accountsDailyLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"lastTransferReset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"bridged24Hours\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"avatar\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bridgeDailyLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"lastTransferReset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"bridged24Hours\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bridgeFees\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"minFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bridgeLimits\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"dailyLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"txLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"accountDailyLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minAmount\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"onlyWhitelisted\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"targetChainId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"enum MessagePassingBridge.BridgeService\",\"name\":\"bridge\",\"type\":\"uint8\"}],\"name\":\"bridgeTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"targetChainId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"bridgeToWithAxelar\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"targetChainId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"bridgeToWithLz\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"targetChainId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"adapterParams\",\"type\":\"bytes\"}],\"name\":\"bridgeToWithLzAdapterParams\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"canBridge\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isWithinLimit\",\"type\":\"bool\"},{\"internalType\":\"string\",\"name\":\"error\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"dao\",\"outputs\":[{\"internalType\":\"contract Controller\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"disabledSourceBridges\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_dstChainId\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"_fromAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_toAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_normalizedAmount\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_useZro\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_adapterParams\",\"type\":\"bytes\"}],\"name\":\"estimateSendFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"nativeFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"zroFee\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"commandId\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"sourceChain\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"sourceAddress\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"commandId\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"sourceChain\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"sourceAddress\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"executeWithToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"executedRequests\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"failedMessages\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"faucet\",\"outputs\":[{\"internalType\":\"contract IFaucet\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_srcChainId\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"_srcAddress\",\"type\":\"bytes\"}],\"name\":\"forceResumeReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasService\",\"outputs\":[{\"internalType\":\"contract IAxelarGasService\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gateway\",\"outputs\":[{\"internalType\":\"contract IAxelarGateway\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_version\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"_chainId\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_configType\",\"type\":\"uint256\"}],\"name\":\"getConfig\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_remoteChainId\",\"type\":\"uint16\"}],\"name\":\"getTrustedRemoteAddress\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"guardian\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract INameService\",\"name\":\"nameService\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"dailyLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"txLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"accountDailyLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minAmount\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"onlyWhitelisted\",\"type\":\"bool\"}],\"internalType\":\"struct MessagePassingBridge.BridgeLimits\",\"name\":\"limits\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"minFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"}],\"internalType\":\"struct MessagePassingBridge.BridgeFees\",\"name\":\"fees\",\"type\":\"tuple\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isClosed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_srcChainId\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"_srcAddress\",\"type\":\"bytes\"}],\"name\":\"isTrustedRemote\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"lzChainIdsMapping\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lzEndpoint\",\"outputs\":[{\"internalType\":\"contract ILayerZeroEndpointUpgradeable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lzEndpoint_\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_srcChainId\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"_srcAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"_nonce\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"_payload\",\"type\":\"bytes\"}],\"name\":\"lzReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"name\":\"minDstGasLookup\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nameService\",\"outputs\":[{\"internalType\":\"contract INameService\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nativeToken\",\"outputs\":[{\"internalType\":\"contract IGoodDollar\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_srcChainId\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"_srcAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"_nonce\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"_payload\",\"type\":\"bytes\"}],\"name\":\"nonblockingLzReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onTokenTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"isPaused\",\"type\":\"bool\"}],\"name\":\"pauseBridge\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"name\":\"payloadSizeLimitLookup\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"precrime\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_srcChainId\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"_srcAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"_nonce\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"_payload\",\"type\":\"bytes\"}],\"name\":\"retryMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"minFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"}],\"internalType\":\"struct MessagePassingBridge.BridgeFees\",\"name\":\"fees\",\"type\":\"tuple\"}],\"name\":\"setBridgeFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"dailyLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"txLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"accountDailyLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minAmount\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"onlyWhitelisted\",\"type\":\"bool\"}],\"internalType\":\"struct MessagePassingBridge.BridgeLimits\",\"name\":\"limits\",\"type\":\"tuple\"}],\"name\":\"setBridgeLimits\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_version\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"_chainId\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"_configType\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_config\",\"type\":\"bytes\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"bridgeKeys\",\"type\":\"bytes32[]\"},{\"internalType\":\"bool[]\",\"name\":\"disabled\",\"type\":\"bool[]\"}],\"name\":\"setDisabledBridges\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IFaucet\",\"name\":\"_faucet\",\"type\":\"address\"}],\"name\":\"setFaucet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_guardian\",\"type\":\"address\"}],\"name\":\"setGuardian\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_dstChainId\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"_packetType\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"_minGas\",\"type\":\"uint256\"}],\"name\":\"setMinDstGas\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_dstChainId\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"_size\",\"type\":\"uint256\"}],\"name\":\"setPayloadSizeLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_precrime\",\"type\":\"address\"}],\"name\":\"setPrecrime\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_version\",\"type\":\"uint16\"}],\"name\":\"setReceiveVersion\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_version\",\"type\":\"uint16\"}],\"name\":\"setSendVersion\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_srcChainId\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"_path\",\"type\":\"bytes\"}],\"name\":\"setTrustedRemote\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_remoteChainId\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"_remoteAddress\",\"type\":\"bytes\"}],\"name\":\"setTrustedRemoteAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"name\":\"trustedRemoteLookup\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"updateAvatar\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"A contract for bridging assets between chains\",\"kind\":\"dev\",\"methods\":{\"canBridge(address,uint256)\":{\"details\":\"Function for checking if a bridge is possible\",\"params\":{\"amount\":\"The amount to bridge\",\"from\":\"The address of the sender\"},\"returns\":{\"error\":\"The error message, if any\",\"isWithinLimit\":\"Whether the bridge is within the limit\"}},\"constructor\":{\"details\":\"Constructor function for the AxelarBridge contract\",\"params\":{\"axlGasReceiver\":\"The address of the gas receiver contract\",\"axlGateway\":\"The address of the gateway contract\"}},\"initialize(address,(uint256,uint256,uint256,uint256,bool),(uint256,uint256,uint256))\":{\"details\":\"Function for initializing the contract\",\"params\":{\"nameService\":\"The address of the name service contract\"}},\"onTokenTransfer(address,uint256,bytes)\":{\"details\":\"Function for handling token transfers\",\"params\":{\"amount\":\"The amount to transfer\",\"data\":\"The data to decode of format (uint256 targetChainId, address target, BridgeService bridge, bytes memory lzAdapterParams)\",\"from\":\"The address of the sender\"},\"returns\":{\"_0\":\"Whether the transfer was successful or not\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"pauseBridge(bool)\":{\"details\":\"Function for pausing the bridge\",\"params\":{\"isPaused\":\"Whether to pause the bridge or not\"}},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setBridgeFees((uint256,uint256,uint256))\":{\"details\":\"Function for setting the bridge fees\",\"params\":{\"fees\":\"The bridge fees to set\"}},\"setBridgeLimits((uint256,uint256,uint256,uint256,bool))\":{\"details\":\"Function for setting the bridge limits\",\"params\":{\"limits\":\"The bridge limits to set\"}},\"setFaucet(address)\":{\"details\":\"Function for setting the faucet contract\",\"params\":{\"_faucet\":\"The faucet contract to set\"}},\"setGuardian(address)\":{\"details\":\"Function for setting the guardian contract\",\"params\":{\"_guardian\":\"The guardian to set\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"upgradeTo(address)\":{\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"withdraw(address,uint256)\":{\"details\":\"Function for withdrawing tokens\",\"params\":{\"amount\":\"The amount to withdraw\",\"token\":\"The address of the token to withdraw\"}}},\"title\":\"MessagePassingBridge\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/messagePassingBridge/MessagePassingBridge.sol\":\"MessagePassingBridge\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":0},\"remappings\":[]},\"sources\":{\"@axelar-network/axelar-gmp-sdk-solidity/contracts/executable/AxelarExecutable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport { IAxelarGateway } from '../interfaces/IAxelarGateway.sol';\\nimport { IAxelarExecutable } from '../interfaces/IAxelarExecutable.sol';\\n\\ncontract AxelarExecutable is IAxelarExecutable {\\n    IAxelarGateway public immutable gateway;\\n\\n    constructor(address gateway_) {\\n        if (gateway_ == address(0)) revert InvalidAddress();\\n\\n        gateway = IAxelarGateway(gateway_);\\n    }\\n\\n    function execute(\\n        bytes32 commandId,\\n        string calldata sourceChain,\\n        string calldata sourceAddress,\\n        bytes calldata payload\\n    ) external {\\n        bytes32 payloadHash = keccak256(payload);\\n\\n        if (!gateway.validateContractCall(commandId, sourceChain, sourceAddress, payloadHash))\\n            revert NotApprovedByGateway();\\n\\n        _execute(sourceChain, sourceAddress, payload);\\n    }\\n\\n    function executeWithToken(\\n        bytes32 commandId,\\n        string calldata sourceChain,\\n        string calldata sourceAddress,\\n        bytes calldata payload,\\n        string calldata tokenSymbol,\\n        uint256 amount\\n    ) external {\\n        bytes32 payloadHash = keccak256(payload);\\n\\n        if (\\n            !gateway.validateContractCallAndMint(\\n                commandId,\\n                sourceChain,\\n                sourceAddress,\\n                payloadHash,\\n                tokenSymbol,\\n                amount\\n            )\\n        ) revert NotApprovedByGateway();\\n\\n        _executeWithToken(sourceChain, sourceAddress, payload, tokenSymbol, amount);\\n    }\\n\\n    function _execute(\\n        string calldata sourceChain,\\n        string calldata sourceAddress,\\n        bytes calldata payload\\n    ) internal virtual {}\\n\\n    function _executeWithToken(\\n        string calldata sourceChain,\\n        string calldata sourceAddress,\\n        bytes calldata payload,\\n        string calldata tokenSymbol,\\n        uint256 amount\\n    ) internal virtual {}\\n}\\n\",\"keccak256\":\"0x2a88d046f9cdc664afc7b788d6c5b534d361b46fb45ab7abf721a58dd813359b\",\"license\":\"MIT\"},\"@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarExecutable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport { IAxelarGateway } from './IAxelarGateway.sol';\\n\\ninterface IAxelarExecutable {\\n    error InvalidAddress();\\n    error NotApprovedByGateway();\\n\\n    function gateway() external view returns (IAxelarGateway);\\n\\n    function execute(\\n        bytes32 commandId,\\n        string calldata sourceChain,\\n        string calldata sourceAddress,\\n        bytes calldata payload\\n    ) external;\\n\\n    function executeWithToken(\\n        bytes32 commandId,\\n        string calldata sourceChain,\\n        string calldata sourceAddress,\\n        bytes calldata payload,\\n        string calldata tokenSymbol,\\n        uint256 amount\\n    ) external;\\n}\\n\",\"keccak256\":\"0x4279ef3b4fe5e7082f39c665d4aeddc6d84fcc6fadaacd1d8ae604ba6146b8e6\",\"license\":\"MIT\"},\"@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGasService.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n// This should be owned by the microservice that is paying for gas.\\ninterface IAxelarGasService {\\n    error NothingReceived();\\n    error InvalidAddress();\\n    error NotCollector();\\n    error InvalidAmounts();\\n\\n    event GasPaidForContractCall(\\n        address indexed sourceAddress,\\n        string destinationChain,\\n        string destinationAddress,\\n        bytes32 indexed payloadHash,\\n        address gasToken,\\n        uint256 gasFeeAmount,\\n        address refundAddress\\n    );\\n\\n    event GasPaidForContractCallWithToken(\\n        address indexed sourceAddress,\\n        string destinationChain,\\n        string destinationAddress,\\n        bytes32 indexed payloadHash,\\n        string symbol,\\n        uint256 amount,\\n        address gasToken,\\n        uint256 gasFeeAmount,\\n        address refundAddress\\n    );\\n\\n    event NativeGasPaidForContractCall(\\n        address indexed sourceAddress,\\n        string destinationChain,\\n        string destinationAddress,\\n        bytes32 indexed payloadHash,\\n        uint256 gasFeeAmount,\\n        address refundAddress\\n    );\\n\\n    event NativeGasPaidForContractCallWithToken(\\n        address indexed sourceAddress,\\n        string destinationChain,\\n        string destinationAddress,\\n        bytes32 indexed payloadHash,\\n        string symbol,\\n        uint256 amount,\\n        uint256 gasFeeAmount,\\n        address refundAddress\\n    );\\n\\n    event GasPaidForExpressCallWithToken(\\n        address indexed sourceAddress,\\n        string destinationChain,\\n        string destinationAddress,\\n        bytes32 indexed payloadHash,\\n        string symbol,\\n        uint256 amount,\\n        address gasToken,\\n        uint256 gasFeeAmount,\\n        address refundAddress\\n    );\\n\\n    event NativeGasPaidForExpressCallWithToken(\\n        address indexed sourceAddress,\\n        string destinationChain,\\n        string destinationAddress,\\n        bytes32 indexed payloadHash,\\n        string symbol,\\n        uint256 amount,\\n        uint256 gasFeeAmount,\\n        address refundAddress\\n    );\\n\\n    event GasAdded(\\n        bytes32 indexed txHash,\\n        uint256 indexed logIndex,\\n        address gasToken,\\n        uint256 gasFeeAmount,\\n        address refundAddress\\n    );\\n\\n    event NativeGasAdded(bytes32 indexed txHash, uint256 indexed logIndex, uint256 gasFeeAmount, address refundAddress);\\n\\n    event ExpressGasAdded(\\n        bytes32 indexed txHash,\\n        uint256 indexed logIndex,\\n        address gasToken,\\n        uint256 gasFeeAmount,\\n        address refundAddress\\n    );\\n\\n    event NativeExpressGasAdded(\\n        bytes32 indexed txHash,\\n        uint256 indexed logIndex,\\n        uint256 gasFeeAmount,\\n        address refundAddress\\n    );\\n\\n    // This is called on the source chain before calling the gateway to execute a remote contract.\\n    function payGasForContractCall(\\n        address sender,\\n        string calldata destinationChain,\\n        string calldata destinationAddress,\\n        bytes calldata payload,\\n        address gasToken,\\n        uint256 gasFeeAmount,\\n        address refundAddress\\n    ) external;\\n\\n    // This is called on the source chain before calling the gateway to execute a remote contract.\\n    function payGasForContractCallWithToken(\\n        address sender,\\n        string calldata destinationChain,\\n        string calldata destinationAddress,\\n        bytes calldata payload,\\n        string calldata symbol,\\n        uint256 amount,\\n        address gasToken,\\n        uint256 gasFeeAmount,\\n        address refundAddress\\n    ) external;\\n\\n    // This is called on the source chain before calling the gateway to execute a remote contract.\\n    function payNativeGasForContractCall(\\n        address sender,\\n        string calldata destinationChain,\\n        string calldata destinationAddress,\\n        bytes calldata payload,\\n        address refundAddress\\n    ) external payable;\\n\\n    // This is called on the source chain before calling the gateway to execute a remote contract.\\n    function payNativeGasForContractCallWithToken(\\n        address sender,\\n        string calldata destinationChain,\\n        string calldata destinationAddress,\\n        bytes calldata payload,\\n        string calldata symbol,\\n        uint256 amount,\\n        address refundAddress\\n    ) external payable;\\n\\n    // This is called on the source chain before calling the gateway to execute a remote contract.\\n    function payGasForExpressCallWithToken(\\n        address sender,\\n        string calldata destinationChain,\\n        string calldata destinationAddress,\\n        bytes calldata payload,\\n        string calldata symbol,\\n        uint256 amount,\\n        address gasToken,\\n        uint256 gasFeeAmount,\\n        address refundAddress\\n    ) external;\\n\\n    // This is called on the source chain before calling the gateway to execute a remote contract.\\n    function payNativeGasForExpressCallWithToken(\\n        address sender,\\n        string calldata destinationChain,\\n        string calldata destinationAddress,\\n        bytes calldata payload,\\n        string calldata symbol,\\n        uint256 amount,\\n        address refundAddress\\n    ) external payable;\\n\\n    function addGas(\\n        bytes32 txHash,\\n        uint256 txIndex,\\n        address gasToken,\\n        uint256 gasFeeAmount,\\n        address refundAddress\\n    ) external;\\n\\n    function addNativeGas(\\n        bytes32 txHash,\\n        uint256 logIndex,\\n        address refundAddress\\n    ) external payable;\\n\\n    function addExpressGas(\\n        bytes32 txHash,\\n        uint256 txIndex,\\n        address gasToken,\\n        uint256 gasFeeAmount,\\n        address refundAddress\\n    ) external;\\n\\n    function addNativeExpressGas(\\n        bytes32 txHash,\\n        uint256 logIndex,\\n        address refundAddress\\n    ) external payable;\\n\\n    function collectFees(\\n        address payable receiver,\\n        address[] calldata tokens,\\n        uint256[] calldata amounts\\n    ) external;\\n\\n    function refund(\\n        address payable receiver,\\n        address token,\\n        uint256 amount\\n    ) external;\\n\\n    function gasCollector() external returns (address);\\n}\\n\",\"keccak256\":\"0xafab7fde3204bedcb81109a275dfb12f8999d190f0532e37d7e8c0f31dbf41de\",\"license\":\"MIT\"},\"@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGateway.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\ninterface IAxelarGateway {\\n    /**********\\\\\\n    |* Errors *|\\n    \\\\**********/\\n\\n    error NotSelf();\\n    error NotProxy();\\n    error InvalidCodeHash();\\n    error SetupFailed();\\n    error InvalidAuthModule();\\n    error InvalidTokenDeployer();\\n    error InvalidAmount();\\n    error InvalidChainId();\\n    error InvalidCommands();\\n    error TokenDoesNotExist(string symbol);\\n    error TokenAlreadyExists(string symbol);\\n    error TokenDeployFailed(string symbol);\\n    error TokenContractDoesNotExist(address token);\\n    error BurnFailed(string symbol);\\n    error MintFailed(string symbol);\\n    error InvalidSetMintLimitsParams();\\n    error ExceedMintLimit(string symbol);\\n\\n    /**********\\\\\\n    |* Events *|\\n    \\\\**********/\\n\\n    event TokenSent(\\n        address indexed sender,\\n        string destinationChain,\\n        string destinationAddress,\\n        string symbol,\\n        uint256 amount\\n    );\\n\\n    event ContractCall(\\n        address indexed sender,\\n        string destinationChain,\\n        string destinationContractAddress,\\n        bytes32 indexed payloadHash,\\n        bytes payload\\n    );\\n\\n    event ContractCallWithToken(\\n        address indexed sender,\\n        string destinationChain,\\n        string destinationContractAddress,\\n        bytes32 indexed payloadHash,\\n        bytes payload,\\n        string symbol,\\n        uint256 amount\\n    );\\n\\n    event Executed(bytes32 indexed commandId);\\n\\n    event TokenDeployed(string symbol, address tokenAddresses);\\n\\n    event ContractCallApproved(\\n        bytes32 indexed commandId,\\n        string sourceChain,\\n        string sourceAddress,\\n        address indexed contractAddress,\\n        bytes32 indexed payloadHash,\\n        bytes32 sourceTxHash,\\n        uint256 sourceEventIndex\\n    );\\n\\n    event ContractCallApprovedWithMint(\\n        bytes32 indexed commandId,\\n        string sourceChain,\\n        string sourceAddress,\\n        address indexed contractAddress,\\n        bytes32 indexed payloadHash,\\n        string symbol,\\n        uint256 amount,\\n        bytes32 sourceTxHash,\\n        uint256 sourceEventIndex\\n    );\\n\\n    event TokenMintLimitUpdated(string symbol, uint256 limit);\\n\\n    event OperatorshipTransferred(bytes newOperatorsData);\\n\\n    event Upgraded(address indexed implementation);\\n\\n    /********************\\\\\\n    |* Public Functions *|\\n    \\\\********************/\\n\\n    function sendToken(\\n        string calldata destinationChain,\\n        string calldata destinationAddress,\\n        string calldata symbol,\\n        uint256 amount\\n    ) external;\\n\\n    function callContract(\\n        string calldata destinationChain,\\n        string calldata contractAddress,\\n        bytes calldata payload\\n    ) external;\\n\\n    function callContractWithToken(\\n        string calldata destinationChain,\\n        string calldata contractAddress,\\n        bytes calldata payload,\\n        string calldata symbol,\\n        uint256 amount\\n    ) external;\\n\\n    function isContractCallApproved(\\n        bytes32 commandId,\\n        string calldata sourceChain,\\n        string calldata sourceAddress,\\n        address contractAddress,\\n        bytes32 payloadHash\\n    ) external view returns (bool);\\n\\n    function isContractCallAndMintApproved(\\n        bytes32 commandId,\\n        string calldata sourceChain,\\n        string calldata sourceAddress,\\n        address contractAddress,\\n        bytes32 payloadHash,\\n        string calldata symbol,\\n        uint256 amount\\n    ) external view returns (bool);\\n\\n    function validateContractCall(\\n        bytes32 commandId,\\n        string calldata sourceChain,\\n        string calldata sourceAddress,\\n        bytes32 payloadHash\\n    ) external returns (bool);\\n\\n    function validateContractCallAndMint(\\n        bytes32 commandId,\\n        string calldata sourceChain,\\n        string calldata sourceAddress,\\n        bytes32 payloadHash,\\n        string calldata symbol,\\n        uint256 amount\\n    ) external returns (bool);\\n\\n    /***********\\\\\\n    |* Getters *|\\n    \\\\***********/\\n\\n    function authModule() external view returns (address);\\n\\n    function tokenDeployer() external view returns (address);\\n\\n    function tokenMintLimit(string memory symbol) external view returns (uint256);\\n\\n    function tokenMintAmount(string memory symbol) external view returns (uint256);\\n\\n    function allTokensFrozen() external view returns (bool);\\n\\n    function implementation() external view returns (address);\\n\\n    function tokenAddresses(string memory symbol) external view returns (address);\\n\\n    function tokenFrozen(string memory symbol) external view returns (bool);\\n\\n    function isCommandExecuted(bytes32 commandId) external view returns (bool);\\n\\n    function adminEpoch() external view returns (uint256);\\n\\n    function adminThreshold(uint256 epoch) external view returns (uint256);\\n\\n    function admins(uint256 epoch) external view returns (address[] memory);\\n\\n    /*******************\\\\\\n    |* Admin Functions *|\\n    \\\\*******************/\\n\\n    function setTokenMintLimits(string[] calldata symbols, uint256[] calldata limits) external;\\n\\n    function upgrade(\\n        address newImplementation,\\n        bytes32 newImplementationCodeHash,\\n        bytes calldata setupParams\\n    ) external;\\n\\n    /**********************\\\\\\n    |* External Functions *|\\n    \\\\**********************/\\n\\n    function setup(bytes calldata params) external;\\n\\n    function execute(bytes calldata input) external;\\n}\\n\",\"keccak256\":\"0xae3d4598622e927639e3cba383618476562631bc8afafe68b16dfbd1db21fd78\",\"license\":\"MIT\"},\"@axelar-network/axelar-gmp-sdk-solidity/contracts/utils/AddressString.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nlibrary StringToAddress {\\n    error InvalidAddressString();\\n\\n    function toAddress(string memory addressString) internal pure returns (address) {\\n        bytes memory stringBytes = bytes(addressString);\\n        uint160 addressNumber = 0;\\n        uint8 stringByte;\\n\\n        if (stringBytes.length != 42 || stringBytes[0] != '0' || stringBytes[1] != 'x') revert InvalidAddressString();\\n\\n        for (uint256 i = 2; i < 42; ++i) {\\n            stringByte = uint8(stringBytes[i]);\\n\\n            if ((stringByte >= 97) && (stringByte <= 102)) stringByte -= 87;\\n            else if ((stringByte >= 65) && (stringByte <= 70)) stringByte -= 55;\\n            else if ((stringByte >= 48) && (stringByte <= 57)) stringByte -= 48;\\n            else revert InvalidAddressString();\\n\\n            addressNumber |= uint160(uint256(stringByte) << ((41 - i) << 2));\\n        }\\n        return address(addressNumber);\\n    }\\n}\\n\\nlibrary AddressToString {\\n    function toString(address addr) internal pure returns (string memory) {\\n        bytes memory addressBytes = abi.encodePacked(addr);\\n        uint256 length = addressBytes.length;\\n        bytes memory characters = '0123456789abcdef';\\n        bytes memory stringBytes = new bytes(2 + addressBytes.length * 2);\\n\\n        stringBytes[0] = '0';\\n        stringBytes[1] = 'x';\\n\\n        for (uint256 i; i < length; ++i) {\\n            stringBytes[2 + i * 2] = characters[uint8(addressBytes[i] >> 4)];\\n            stringBytes[3 + i * 2] = characters[uint8(addressBytes[i] & 0x0f)];\\n        }\\n        return string(stringBytes);\\n    }\\n}\\n\",\"keccak256\":\"0xefd5b5b2b0e9b26068d48f43bcd57464f3d89a195d512dc672736c9e7dd3eaf6\",\"license\":\"MIT\"},\"@gooddollar/goodprotocol/contracts/DAOStackInterfaces.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.0;\\n\\ninterface Avatar {\\n\\tfunction nativeToken() external view returns (address);\\n\\n\\tfunction nativeReputation() external view returns (address);\\n\\n\\tfunction owner() external view returns (address);\\n}\\n\\ninterface Controller {\\n\\tevent RegisterScheme(address indexed _sender, address indexed _scheme);\\n\\tevent UnregisterScheme(address indexed _sender, address indexed _scheme);\\n\\n\\tfunction genericCall(\\n\\t\\taddress _contract,\\n\\t\\tbytes calldata _data,\\n\\t\\taddress _avatar,\\n\\t\\tuint256 _value\\n\\t) external returns (bool, bytes memory);\\n\\n\\tfunction avatar() external view returns (address);\\n\\n\\tfunction unregisterScheme(address _scheme, address _avatar)\\n\\t\\texternal\\n\\t\\treturns (bool);\\n\\n\\tfunction unregisterSelf(address _avatar) external returns (bool);\\n\\n\\tfunction registerScheme(\\n\\t\\taddress _scheme,\\n\\t\\tbytes32 _paramsHash,\\n\\t\\tbytes4 _permissions,\\n\\t\\taddress _avatar\\n\\t) external returns (bool);\\n\\n\\tfunction isSchemeRegistered(address _scheme, address _avatar)\\n\\t\\texternal\\n\\t\\tview\\n\\t\\treturns (bool);\\n\\n\\tfunction getSchemePermissions(address _scheme, address _avatar)\\n\\t\\texternal\\n\\t\\tview\\n\\t\\treturns (bytes4);\\n\\n\\tfunction addGlobalConstraint(\\n\\t\\taddress _constraint,\\n\\t\\tbytes32 _paramHash,\\n\\t\\taddress _avatar\\n\\t) external returns (bool);\\n\\n\\tfunction mintTokens(\\n\\t\\tuint256 _amount,\\n\\t\\taddress _beneficiary,\\n\\t\\taddress _avatar\\n\\t) external returns (bool);\\n\\n\\tfunction externalTokenTransfer(\\n\\t\\taddress _token,\\n\\t\\taddress _recipient,\\n\\t\\tuint256 _amount,\\n\\t\\taddress _avatar\\n\\t) external returns (bool);\\n\\n\\tfunction sendEther(\\n\\t\\tuint256 _amountInWei,\\n\\t\\taddress payable _to,\\n\\t\\taddress _avatar\\n\\t) external returns (bool);\\n}\\n\\ninterface GlobalConstraintInterface {\\n\\tenum CallPhase {\\n\\t\\tPre,\\n\\t\\tPost,\\n\\t\\tPreAndPost\\n\\t}\\n\\n\\tfunction pre(\\n\\t\\taddress _scheme,\\n\\t\\tbytes32 _params,\\n\\t\\tbytes32 _method\\n\\t) external returns (bool);\\n\\n\\t/**\\n\\t * @dev when return if this globalConstraints is pre, post or both.\\n\\t * @return CallPhase enum indication  Pre, Post or PreAndPost.\\n\\t */\\n\\tfunction when() external returns (CallPhase);\\n}\\n\\ninterface ReputationInterface {\\n\\tfunction balanceOf(address _user) external view returns (uint256);\\n\\n\\tfunction balanceOfAt(address _user, uint256 _blockNumber)\\n\\t\\texternal\\n\\t\\tview\\n\\t\\treturns (uint256);\\n\\n\\tfunction getVotes(address _user) external view returns (uint256);\\n\\n\\tfunction getVotesAt(\\n\\t\\taddress _user,\\n\\t\\tbool _global,\\n\\t\\tuint256 _blockNumber\\n\\t) external view returns (uint256);\\n\\n\\tfunction totalSupply() external view returns (uint256);\\n\\n\\tfunction totalSupplyAt(uint256 _blockNumber)\\n\\t\\texternal\\n\\t\\tview\\n\\t\\treturns (uint256);\\n\\n\\tfunction delegateOf(address _user) external returns (address);\\n}\\n\\ninterface SchemeRegistrar {\\n\\tfunction proposeScheme(\\n\\t\\tAvatar _avatar,\\n\\t\\taddress _scheme,\\n\\t\\tbytes32 _parametersHash,\\n\\t\\tbytes4 _permissions,\\n\\t\\tstring memory _descriptionHash\\n\\t) external returns (bytes32);\\n\\n\\tevent NewSchemeProposal(\\n\\t\\taddress indexed _avatar,\\n\\t\\tbytes32 indexed _proposalId,\\n\\t\\taddress indexed _intVoteInterface,\\n\\t\\taddress _scheme,\\n\\t\\tbytes32 _parametersHash,\\n\\t\\tbytes4 _permissions,\\n\\t\\tstring _descriptionHash\\n\\t);\\n}\\n\\ninterface IntVoteInterface {\\n\\tevent NewProposal(\\n\\t\\tbytes32 indexed _proposalId,\\n\\t\\taddress indexed _organization,\\n\\t\\tuint256 _numOfChoices,\\n\\t\\taddress _proposer,\\n\\t\\tbytes32 _paramsHash\\n\\t);\\n\\n\\tevent ExecuteProposal(\\n\\t\\tbytes32 indexed _proposalId,\\n\\t\\taddress indexed _organization,\\n\\t\\tuint256 _decision,\\n\\t\\tuint256 _totalReputation\\n\\t);\\n\\n\\tevent VoteProposal(\\n\\t\\tbytes32 indexed _proposalId,\\n\\t\\taddress indexed _organization,\\n\\t\\taddress indexed _voter,\\n\\t\\tuint256 _vote,\\n\\t\\tuint256 _reputation\\n\\t);\\n\\n\\tevent CancelProposal(\\n\\t\\tbytes32 indexed _proposalId,\\n\\t\\taddress indexed _organization\\n\\t);\\n\\tevent CancelVoting(\\n\\t\\tbytes32 indexed _proposalId,\\n\\t\\taddress indexed _organization,\\n\\t\\taddress indexed _voter\\n\\t);\\n\\n\\t/**\\n\\t * @dev register a new proposal with the given parameters. Every proposal has a unique ID which is being\\n\\t * generated by calculating keccak256 of a incremented counter.\\n\\t * @param _numOfChoices number of voting choices\\n\\t * @param _proposalParameters defines the parameters of the voting machine used for this proposal\\n\\t * @param _proposer address\\n\\t * @param _organization address - if this address is zero the msg.sender will be used as the organization address.\\n\\t * @return proposal's id.\\n\\t */\\n\\tfunction propose(\\n\\t\\tuint256 _numOfChoices,\\n\\t\\tbytes32 _proposalParameters,\\n\\t\\taddress _proposer,\\n\\t\\taddress _organization\\n\\t) external returns (bytes32);\\n\\n\\tfunction vote(\\n\\t\\tbytes32 _proposalId,\\n\\t\\tuint256 _vote,\\n\\t\\tuint256 _rep,\\n\\t\\taddress _voter\\n\\t) external returns (bool);\\n\\n\\tfunction cancelVote(bytes32 _proposalId) external;\\n\\n\\tfunction getNumberOfChoices(bytes32 _proposalId)\\n\\t\\texternal\\n\\t\\tview\\n\\t\\treturns (uint256);\\n\\n\\tfunction isVotable(bytes32 _proposalId) external view returns (bool);\\n\\n\\t/**\\n\\t * @dev voteStatus returns the reputation voted for a proposal for a specific voting choice.\\n\\t * @param _proposalId the ID of the proposal\\n\\t * @param _choice the index in the\\n\\t * @return voted reputation for the given choice\\n\\t */\\n\\tfunction voteStatus(bytes32 _proposalId, uint256 _choice)\\n\\t\\texternal\\n\\t\\tview\\n\\t\\treturns (uint256);\\n\\n\\t/**\\n\\t * @dev isAbstainAllow returns if the voting machine allow abstain (0)\\n\\t * @return bool true or false\\n\\t */\\n\\tfunction isAbstainAllow() external pure returns (bool);\\n\\n\\t/**\\n     * @dev getAllowedRangeOfChoices returns the allowed range of choices for a voting machine.\\n     * @return min - minimum number of choices\\n               max - maximum number of choices\\n     */\\n\\tfunction getAllowedRangeOfChoices()\\n\\t\\texternal\\n\\t\\tpure\\n\\t\\treturns (uint256 min, uint256 max);\\n}\\n\",\"keccak256\":\"0x34e247b3a991a0d5f8e975c81df91199074eeb9d4999fcaac89bdf7787527b19\",\"license\":\"MIT\"},\"@gooddollar/goodprotocol/contracts/Interfaces.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\nimport { DataTypes } from \\\"./utils/DataTypes.sol\\\";\\npragma solidity >=0.8.0;\\n\\npragma experimental ABIEncoderV2;\\n\\ninterface ERC20 {\\n\\tfunction balanceOf(address addr) external view returns (uint256);\\n\\n\\tfunction transfer(address to, uint256 amount) external returns (bool);\\n\\n\\tfunction approve(address spender, uint256 amount) external returns (bool);\\n\\n\\tfunction decimals() external view returns (uint8);\\n\\n\\tfunction mint(address to, uint256 mintAmount) external returns (uint256);\\n\\n\\tfunction burn(uint256 amount) external;\\n\\n\\tfunction totalSupply() external view returns (uint256);\\n\\n\\tfunction allowance(\\n\\t\\taddress owner,\\n\\t\\taddress spender\\n\\t) external view returns (uint256);\\n\\n\\tfunction transferFrom(\\n\\t\\taddress sender,\\n\\t\\taddress recipient,\\n\\t\\tuint256 amount\\n\\t) external returns (bool);\\n\\n\\tfunction name() external view returns (string memory);\\n\\n\\tfunction symbol() external view returns (string memory);\\n\\n\\tevent Transfer(address indexed from, address indexed to, uint256 amount);\\n\\tevent Transfer(\\n\\t\\taddress indexed from,\\n\\t\\taddress indexed to,\\n\\t\\tuint256 amount,\\n\\t\\tbytes data\\n\\t);\\n}\\n\\ninterface cERC20 is ERC20 {\\n\\tfunction mint(uint256 mintAmount) external returns (uint256);\\n\\n\\tfunction redeemUnderlying(uint256 mintAmount) external returns (uint256);\\n\\n\\tfunction redeem(uint256 mintAmount) external returns (uint256);\\n\\n\\tfunction exchangeRateCurrent() external returns (uint256);\\n\\n\\tfunction exchangeRateStored() external view returns (uint256);\\n\\n\\tfunction underlying() external returns (address);\\n}\\n\\ninterface IGoodDollar is ERC20 {\\n\\t// view functions\\n\\tfunction feeRecipient() external view returns (address);\\n\\n\\tfunction getFees(\\n\\t\\tuint256 value,\\n\\t\\taddress sender,\\n\\t\\taddress recipient\\n\\t) external view returns (uint256 fee, bool senderPays);\\n\\n\\tfunction cap() external view returns (uint256);\\n\\n\\tfunction isPauser(address _pauser) external view returns (bool);\\n\\n\\tfunction getFees(uint256 value) external view returns (uint256, bool);\\n\\n\\tfunction isMinter(address minter) external view returns (bool);\\n\\n\\tfunction formula() external view returns (address);\\n\\n\\tfunction identity() external view returns (address);\\n\\n\\tfunction owner() external view returns (address);\\n\\n\\t// state changing functions\\n\\tfunction setFeeRecipient(address _feeRecipient) external;\\n\\n\\tfunction setFormula(address _formula) external;\\n\\n\\tfunction transferOwnership(address _owner) external;\\n\\n\\tfunction addPauser(address _pauser) external;\\n\\n\\tfunction pause() external;\\n\\n\\tfunction unpause() external;\\n\\n\\tfunction burn(uint256 amount) external;\\n\\n\\tfunction burnFrom(address account, uint256 amount) external;\\n\\n\\tfunction renounceMinter() external;\\n\\n\\tfunction addMinter(address minter) external;\\n\\n\\tfunction transferAndCall(\\n\\t\\taddress to,\\n\\t\\tuint256 value,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool);\\n\\n\\tfunction setIdentity(address identity) external;\\n}\\n\\ninterface IERC2917 is ERC20 {\\n\\t/// @dev This emit when interests amount per block is changed by the owner of the contract.\\n\\t/// It emits with the old interests amount and the new interests amount.\\n\\tevent InterestRatePerBlockChanged(uint256 oldValue, uint256 newValue);\\n\\n\\t/// @dev This emit when a users' productivity has changed\\n\\t/// It emits with the user's address and the the value after the change.\\n\\tevent ProductivityIncreased(address indexed user, uint256 value);\\n\\n\\t/// @dev This emit when a users' productivity has changed\\n\\t/// It emits with the user's address and the the value after the change.\\n\\tevent ProductivityDecreased(address indexed user, uint256 value);\\n\\n\\t/// @dev Return the current contract's interests rate per block.\\n\\t/// @return The amount of interests currently producing per each block.\\n\\tfunction interestsPerBlock() external view returns (uint256);\\n\\n\\t/// @notice Change the current contract's interests rate.\\n\\t/// @dev Note the best practice will be restrict the gross product provider's contract address to call this.\\n\\t/// @return The true/fase to notice that the value has successfully changed or not, when it succeed, it will emite the InterestRatePerBlockChanged event.\\n\\tfunction changeInterestRatePerBlock(uint256 value) external returns (bool);\\n\\n\\t/// @notice It will get the productivity of given user.\\n\\t/// @dev it will return 0 if user has no productivity proved in the contract.\\n\\t/// @return user's productivity and overall productivity.\\n\\tfunction getProductivity(\\n\\t\\taddress user\\n\\t) external view returns (uint256, uint256);\\n\\n\\t/// @notice increase a user's productivity.\\n\\t/// @dev Note the best practice will be restrict the callee to prove of productivity's contract address.\\n\\t/// @return true to confirm that the productivity added success.\\n\\tfunction increaseProductivity(\\n\\t\\taddress user,\\n\\t\\tuint256 value\\n\\t) external returns (bool);\\n\\n\\t/// @notice decrease a user's productivity.\\n\\t/// @dev Note the best practice will be restrict the callee to prove of productivity's contract address.\\n\\t/// @return true to confirm that the productivity removed success.\\n\\tfunction decreaseProductivity(\\n\\t\\taddress user,\\n\\t\\tuint256 value\\n\\t) external returns (bool);\\n\\n\\t/// @notice take() will return the interests that callee will get at current block height.\\n\\t/// @dev it will always calculated by block.number, so it will change when block height changes.\\n\\t/// @return amount of the interests that user are able to mint() at current block height.\\n\\tfunction take() external view returns (uint256);\\n\\n\\t/// @notice similar to take(), but with the block height joined to calculate return.\\n\\t/// @dev for instance, it returns (_amount, _block), which means at block height _block, the callee has accumulated _amount of interests.\\n\\t/// @return amount of interests and the block height.\\n\\tfunction takeWithBlock() external view returns (uint256, uint256);\\n\\n\\t/// @notice mint the avaiable interests to callee.\\n\\t/// @dev once it mint, the amount of interests will transfer to callee's address.\\n\\t/// @return the amount of interests minted.\\n\\tfunction mint() external returns (uint256);\\n}\\n\\ninterface Staking {\\n\\tstruct Staker {\\n\\t\\t// The staked DAI amount\\n\\t\\tuint256 stakedDAI;\\n\\t\\t// The latest block number which the\\n\\t\\t// staker has staked tokens\\n\\t\\tuint256 lastStake;\\n\\t}\\n\\n\\tfunction stakeDAI(uint256 amount) external;\\n\\n\\tfunction withdrawStake() external;\\n\\n\\tfunction stakers(address staker) external view returns (Staker memory);\\n}\\n\\ninterface Uniswap {\\n\\tfunction swapExactETHForTokens(\\n\\t\\tuint256 amountOutMin,\\n\\t\\taddress[] calldata path,\\n\\t\\taddress to,\\n\\t\\tuint256 deadline\\n\\t) external payable returns (uint256[] memory amounts);\\n\\n\\tfunction swapExactTokensForETH(\\n\\t\\tuint256 amountIn,\\n\\t\\tuint256 amountOutMin,\\n\\t\\taddress[] calldata path,\\n\\t\\taddress to,\\n\\t\\tuint256 deadline\\n\\t) external returns (uint256[] memory amounts);\\n\\n\\tfunction swapExactTokensForTokens(\\n\\t\\tuint256 amountIn,\\n\\t\\tuint256 amountOutMin,\\n\\t\\taddress[] calldata path,\\n\\t\\taddress to,\\n\\t\\tuint256 deadline\\n\\t) external returns (uint256[] memory amounts);\\n\\n\\tfunction WETH() external pure returns (address);\\n\\n\\tfunction factory() external pure returns (address);\\n\\n\\tfunction quote(\\n\\t\\tuint256 amountA,\\n\\t\\tuint256 reserveA,\\n\\t\\tuint256 reserveB\\n\\t) external pure returns (uint256 amountB);\\n\\n\\tfunction getAmountIn(\\n\\t\\tuint256 amountOut,\\n\\t\\tuint256 reserveIn,\\n\\t\\tuint256 reserveOut\\n\\t) external pure returns (uint256 amountIn);\\n\\n\\tfunction getAmountOut(\\n\\t\\tuint256 amountI,\\n\\t\\tuint256 reserveIn,\\n\\t\\tuint256 reserveOut\\n\\t) external pure returns (uint256 amountOut);\\n\\n\\tfunction getAmountsOut(\\n\\t\\tuint256 amountIn,\\n\\t\\taddress[] memory path\\n\\t) external pure returns (uint256[] memory amounts);\\n}\\n\\ninterface UniswapFactory {\\n\\tfunction getPair(\\n\\t\\taddress tokenA,\\n\\t\\taddress tokenB\\n\\t) external view returns (address);\\n}\\n\\ninterface UniswapPair {\\n\\tfunction getReserves()\\n\\t\\texternal\\n\\t\\tview\\n\\t\\treturns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);\\n\\n\\tfunction kLast() external view returns (uint256);\\n\\n\\tfunction token0() external view returns (address);\\n\\n\\tfunction token1() external view returns (address);\\n\\n\\tfunction totalSupply() external view returns (uint256);\\n\\n\\tfunction balanceOf(address owner) external view returns (uint256);\\n}\\n\\ninterface Reserve {\\n\\tfunction buy(\\n\\t\\taddress _buyWith,\\n\\t\\tuint256 _tokenAmount,\\n\\t\\tuint256 _minReturn\\n\\t) external returns (uint256);\\n}\\n\\ninterface IIdentity {\\n\\tfunction isWhitelisted(address user) external view returns (bool);\\n\\n\\tfunction addWhitelistedWithDID(address account, string memory did) external;\\n\\n\\tfunction removeWhitelisted(address account) external;\\n\\n\\tfunction addBlacklisted(address account) external;\\n\\n\\tfunction removeBlacklisted(address account) external;\\n\\n\\tfunction isBlacklisted(address user) external view returns (bool);\\n\\n\\tfunction addIdentityAdmin(address account) external returns (bool);\\n\\n\\tfunction setAvatar(address _avatar) external;\\n\\n\\tfunction isIdentityAdmin(address account) external view returns (bool);\\n\\n\\tfunction owner() external view returns (address);\\n\\n\\tfunction removeContract(address account) external;\\n\\n\\tfunction isDAOContract(address account) external view returns (bool);\\n\\n\\tfunction addrToDID(address account) external view returns (string memory);\\n\\n\\tfunction didHashToAddress(bytes32 hash) external view returns (address);\\n\\n\\tfunction lastAuthenticated(address account) external view returns (uint256);\\n\\n\\tevent WhitelistedAdded(address user);\\n}\\n\\ninterface IIdentityV2 is IIdentity {\\n\\tfunction addWhitelistedWithDIDAndChain(\\n\\t\\taddress account,\\n\\t\\tstring memory did,\\n\\t\\tuint256 orgChainId,\\n\\t\\tuint256 dateAuthenticated\\n\\t) external;\\n\\n\\tfunction getWhitelistedRoot(\\n\\t\\taddress account\\n\\t) external view returns (address root);\\n}\\n\\ninterface IUBIScheme {\\n\\tfunction currentDay() external view returns (uint256);\\n\\n\\tfunction periodStart() external view returns (uint256);\\n\\n\\tfunction hasClaimed(address claimer) external view returns (bool);\\n}\\n\\ninterface IFirstClaimPool {\\n\\tfunction awardUser(address user) external returns (uint256);\\n\\n\\tfunction claimAmount() external view returns (uint256);\\n\\n\\tfunction end() external;\\n}\\n\\ninterface ProxyAdmin {\\n\\tfunction getProxyImplementation(\\n\\t\\taddress proxy\\n\\t) external view returns (address);\\n\\n\\tfunction getProxyAdmin(address proxy) external view returns (address);\\n\\n\\tfunction upgrade(address proxy, address implementation) external;\\n\\n\\tfunction owner() external view returns (address);\\n\\n\\tfunction transferOwnership(address newOwner) external;\\n\\n\\tfunction upgradeAndCall(\\n\\t\\taddress proxy,\\n\\t\\taddress implementation,\\n\\t\\tbytes memory data\\n\\t) external;\\n}\\n\\n/**\\n * @dev Interface for chainlink oracles to obtain price datas\\n */\\ninterface AggregatorV3Interface {\\n\\tfunction decimals() external view returns (uint8);\\n\\n\\tfunction description() external view returns (string memory);\\n\\n\\tfunction version() external view returns (uint256);\\n\\n\\t// getRoundData and latestRoundData should both raise \\\"No data present\\\"\\n\\t// if they do not have data to report, instead of returning unset values\\n\\t// which could be misinterpreted as actual reported values.\\n\\tfunction getRoundData(\\n\\t\\tuint80 _roundId\\n\\t)\\n\\t\\texternal\\n\\t\\tview\\n\\t\\treturns (\\n\\t\\t\\tuint80 roundId,\\n\\t\\t\\tint256 answer,\\n\\t\\t\\tuint256 startedAt,\\n\\t\\t\\tuint256 updatedAt,\\n\\t\\t\\tuint80 answeredInRound\\n\\t\\t);\\n\\n\\tfunction latestAnswer() external view returns (int256);\\n}\\n\\n/**\\n\\t@dev interface for AAVE lending Pool\\n */\\ninterface ILendingPool {\\n\\t/**\\n\\t * @dev Deposits an `amount` of underlying asset into the reserve, receiving in return overlying aTokens.\\n\\t * - E.g. User deposits 100 USDC and gets in return 100 aUSDC\\n\\t * @param asset The address of the underlying asset to deposit\\n\\t * @param amount The amount to be deposited\\n\\t * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user\\n\\t *   wants to receive them on his own wallet, or a different address if the beneficiary of aTokens\\n\\t *   is a different wallet\\n\\t * @param referralCode Code used to register the integrator originating the operation, for potential rewards.\\n\\t *   0 if the action is executed directly by the user, without any middle-man\\n\\t **/\\n\\tfunction deposit(\\n\\t\\taddress asset,\\n\\t\\tuint256 amount,\\n\\t\\taddress onBehalfOf,\\n\\t\\tuint16 referralCode\\n\\t) external;\\n\\n\\t/**\\n\\t * @dev Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned\\n\\t * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC\\n\\t * @param asset The address of the underlying asset to withdraw\\n\\t * @param amount The underlying amount to be withdrawn\\n\\t *   - Send the value type(uint256).max in order to withdraw the whole aToken balance\\n\\t * @param to Address that will receive the underlying, same as msg.sender if the user\\n\\t *   wants to receive it on his own wallet, or a different address if the beneficiary is a\\n\\t *   different wallet\\n\\t * @return The final amount withdrawn\\n\\t **/\\n\\tfunction withdraw(\\n\\t\\taddress asset,\\n\\t\\tuint256 amount,\\n\\t\\taddress to\\n\\t) external returns (uint256);\\n\\n\\t/**\\n\\t * @dev Returns the state and configuration of the reserve\\n\\t * @param asset The address of the underlying asset of the reserve\\n\\t * @return The state of the reserve\\n\\t **/\\n\\tfunction getReserveData(\\n\\t\\taddress asset\\n\\t) external view returns (DataTypes.ReserveData memory);\\n}\\n\\ninterface IDonationStaking {\\n\\tfunction stakeDonations() external payable;\\n}\\n\\ninterface INameService {\\n\\tfunction getAddress(string memory _name) external view returns (address);\\n}\\n\\ninterface IAaveIncentivesController {\\n\\t/**\\n\\t * @dev Claims reward for an user, on all the assets of the lending pool, accumulating the pending rewards\\n\\t * @param amount Amount of rewards to claim\\n\\t * @param to Address that will be receiving the rewards\\n\\t * @return Rewards claimed\\n\\t **/\\n\\tfunction claimRewards(\\n\\t\\taddress[] calldata assets,\\n\\t\\tuint256 amount,\\n\\t\\taddress to\\n\\t) external returns (uint256);\\n\\n\\t/**\\n\\t * @dev Returns the total of rewards of an user, already accrued + not yet accrued\\n\\t * @param user The address of the user\\n\\t * @return The rewards\\n\\t **/\\n\\tfunction getRewardsBalance(\\n\\t\\taddress[] calldata assets,\\n\\t\\taddress user\\n\\t) external view returns (uint256);\\n}\\n\\ninterface IGoodStaking {\\n\\tfunction collectUBIInterest(\\n\\t\\taddress recipient\\n\\t) external returns (uint256, uint256, uint256);\\n\\n\\tfunction iToken() external view returns (address);\\n\\n\\tfunction currentGains(\\n\\t\\tbool _returnTokenBalanceInUSD,\\n\\t\\tbool _returnTokenGainsInUSD\\n\\t) external view returns (uint256, uint256, uint256, uint256, uint256);\\n\\n\\tfunction getRewardEarned(address user) external view returns (uint256);\\n\\n\\tfunction getGasCostForInterestTransfer() external view returns (uint256);\\n\\n\\tfunction rewardsMinted(\\n\\t\\taddress user,\\n\\t\\tuint256 rewardsPerBlock,\\n\\t\\tuint256 blockStart,\\n\\t\\tuint256 blockEnd\\n\\t) external returns (uint256);\\n}\\n\\ninterface IHasRouter {\\n\\tfunction getRouter() external view returns (Uniswap);\\n}\\n\\ninterface IAdminWallet {\\n\\tfunction addAdmins(address payable[] memory _admins) external;\\n\\n\\tfunction removeAdmins(address[] memory _admins) external;\\n\\n\\tfunction owner() external view returns (address);\\n\\n\\tfunction transferOwnership(address _owner) external;\\n}\\n\\ninterface IMultichainRouter {\\n\\t// Swaps `amount` `token` from this chain to `toChainID` chain with recipient `to`\\n\\tfunction anySwapOut(\\n\\t\\taddress token,\\n\\t\\taddress to,\\n\\t\\tuint256 amount,\\n\\t\\tuint256 toChainID\\n\\t) external;\\n\\n\\t// Swaps `amount` `token` from this chain to `toChainID` chain with recipient `to`\\n\\tfunction anySwapOutUnderlying(\\n\\t\\taddress token,\\n\\t\\taddress to,\\n\\t\\tuint256 amount,\\n\\t\\tuint256 toChainID\\n\\t) external;\\n}\\n\",\"keccak256\":\"0x57739a30eb70aac5df7ca4009a557931ccf13a4b8275bfb33dd45220aab15412\",\"license\":\"MIT\"},\"@gooddollar/goodprotocol/contracts/utils/DAOContract.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.0;\\n\\nimport \\\"../DAOStackInterfaces.sol\\\";\\nimport \\\"../Interfaces.sol\\\";\\n\\n/**\\n@title Simple contract that keeps DAO contracts registery\\n*/\\n\\ncontract DAOContract {\\n\\tController public dao;\\n\\n\\taddress public avatar;\\n\\n\\tINameService public nameService;\\n\\n\\tfunction _onlyAvatar() internal view {\\n\\t\\trequire(\\n\\t\\t\\taddress(dao.avatar()) == msg.sender,\\n\\t\\t\\t\\\"only avatar can call this method\\\"\\n\\t\\t);\\n\\t}\\n\\n\\tfunction setDAO(INameService _ns) internal {\\n\\t\\tnameService = _ns;\\n\\t\\tupdateAvatar();\\n\\t}\\n\\n\\tfunction updateAvatar() public {\\n\\t\\tdao = Controller(nameService.getAddress(\\\"CONTROLLER\\\"));\\n\\t\\tavatar = dao.avatar();\\n\\t}\\n\\n\\tfunction nativeToken() public view returns (IGoodDollar) {\\n\\t\\treturn IGoodDollar(nameService.getAddress(\\\"GOODDOLLAR\\\"));\\n\\t}\\n\\n\\tuint256[50] private gap;\\n}\\n\",\"keccak256\":\"0x82eb2588243e03c753d5e999514c50c01bb08aae30e4b025980dc4cb5b085b7b\",\"license\":\"MIT\"},\"@gooddollar/goodprotocol/contracts/utils/DAOUpgradeableContract.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\n\\nimport \\\"./DAOContract.sol\\\";\\n\\n/**\\n@title Simple contract that adds upgradability to DAOContract\\n*/\\n\\ncontract DAOUpgradeableContract is Initializable, UUPSUpgradeable, DAOContract {\\n\\tfunction _authorizeUpgrade(address) internal virtual override {\\n\\t\\t_onlyAvatar();\\n\\t}\\n}\\n\",\"keccak256\":\"0xecb2c36f87418eb33eb3877e0fab5711c1a9c2d6ceabfb0edeb2ad2b172ecdc2\",\"license\":\"MIT\"},\"@gooddollar/goodprotocol/contracts/utils/DataTypes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.0;\\n\\nlibrary DataTypes {\\n\\t// refer to the whitepaper, section 1.1 basic concepts for a formal description of these properties.\\n\\tstruct ReserveData {\\n\\t\\t//stores the reserve configuration\\n\\t\\tReserveConfigurationMap configuration;\\n\\t\\t//the liquidity index. Expressed in ray\\n\\t\\tuint128 liquidityIndex;\\n\\t\\t//variable borrow index. Expressed in ray\\n\\t\\tuint128 variableBorrowIndex;\\n\\t\\t//the current supply rate. Expressed in ray\\n\\t\\tuint128 currentLiquidityRate;\\n\\t\\t//the current variable borrow rate. Expressed in ray\\n\\t\\tuint128 currentVariableBorrowRate;\\n\\t\\t//the current stable borrow rate. Expressed in ray\\n\\t\\tuint128 currentStableBorrowRate;\\n\\t\\tuint40 lastUpdateTimestamp;\\n\\t\\t//tokens addresses\\n\\t\\taddress aTokenAddress;\\n\\t\\taddress stableDebtTokenAddress;\\n\\t\\taddress variableDebtTokenAddress;\\n\\t\\t//address of the interest rate strategy\\n\\t\\taddress interestRateStrategyAddress;\\n\\t\\t//the id of the reserve. Represents the position in the list of the active reserves\\n\\t\\tuint8 id;\\n\\t}\\n\\n\\tstruct ReserveConfigurationMap {\\n\\t\\t//bit 0-15: LTV\\n\\t\\t//bit 16-31: Liq. threshold\\n\\t\\t//bit 32-47: Liq. bonus\\n\\t\\t//bit 48-55: Decimals\\n\\t\\t//bit 56: Reserve is active\\n\\t\\t//bit 57: reserve is frozen\\n\\t\\t//bit 58: borrowing is enabled\\n\\t\\t//bit 59: stable rate borrowing enabled\\n\\t\\t//bit 60-63: reserved\\n\\t\\t//bit 64-79: reserve factor\\n\\t\\tuint256 data;\\n\\t}\\n\\tenum InterestRateMode { NONE, STABLE, VARIABLE }\\n}\\n\",\"keccak256\":\"0xbc0c2512438c5b8d92e7ecd3c4d0848edf24ef0bacaf51744048173f60a2114c\",\"license\":\"MIT\"},\"@gooddollar/goodprotocol/contracts/utils/ProxyFactory1967.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8;\\n\\nimport \\\"@openzeppelin/contracts/proxy/Proxy.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\n\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n\\t/**\\n\\t * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\\n\\t *\\n\\t * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\\n\\t * function call, and allows initializating the storage of the proxy like a Solidity constructor.\\n\\t */\\n\\tfunction initialize(address _logic, bytes calldata _data) external payable {\\n\\t\\trequire(_getImplementation() == address(0), \\\"initialized\\\");\\n\\t\\tassert(\\n\\t\\t\\t_IMPLEMENTATION_SLOT ==\\n\\t\\t\\t\\tbytes32(uint256(keccak256(\\\"eip1967.proxy.implementation\\\")) - 1)\\n\\t\\t);\\n\\t\\t_upgradeToAndCall(_logic, _data, false);\\n\\t}\\n\\n\\t/**\\n\\t * @dev Returns the current implementation address.\\n\\t */\\n\\tfunction _implementation()\\n\\t\\tinternal\\n\\t\\tview\\n\\t\\tvirtual\\n\\t\\toverride\\n\\t\\treturns (address impl)\\n\\t{\\n\\t\\treturn ERC1967Upgrade._getImplementation();\\n\\t}\\n}\\n\\ncontract ProxyFactory1967 {\\n\\tevent ProxyCreated(address proxy);\\n\\tevent ContractCreated(address addr);\\n\\n\\tbytes32 private contractCodeHash;\\n\\n\\tconstructor() {\\n\\t\\tcontractCodeHash = keccak256(type(ERC1967Proxy).creationCode);\\n\\t}\\n\\n\\tfunction deployMinimal(address _logic, bytes memory _data)\\n\\t\\tpublic\\n\\t\\treturns (address proxy)\\n\\t{\\n\\t\\t// Adapted from https://github.com/optionality/clone-factory/blob/32782f82dfc5a00d103a7e61a17a5dedbd1e8e9d/contracts/CloneFactory.sol\\n\\t\\tbytes20 targetBytes = bytes20(_logic);\\n\\t\\tassembly {\\n\\t\\t\\tlet clone := mload(0x40)\\n\\t\\t\\tmstore(\\n\\t\\t\\t\\tclone,\\n\\t\\t\\t\\t0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000\\n\\t\\t\\t)\\n\\t\\t\\tmstore(add(clone, 0x14), targetBytes)\\n\\t\\t\\tmstore(\\n\\t\\t\\t\\tadd(clone, 0x28),\\n\\t\\t\\t\\t0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000\\n\\t\\t\\t)\\n\\t\\t\\tproxy := create(0, clone, 0x37)\\n\\t\\t}\\n\\n\\t\\temit ProxyCreated(address(proxy));\\n\\n\\t\\tif (_data.length > 0) {\\n\\t\\t\\t(bool success, ) = proxy.call(_data);\\n\\t\\t\\trequire(success);\\n\\t\\t}\\n\\t}\\n\\n\\tfunction deployProxy(\\n\\t\\tuint256 _salt,\\n\\t\\taddress _logic,\\n\\t\\tbytes memory _data\\n\\t) public returns (address) {\\n\\t\\treturn _deployProxy(_salt, _logic, _data, msg.sender);\\n\\t}\\n\\n\\tfunction deployCode(uint256 _salt, bytes calldata _bytecode)\\n\\t\\texternal\\n\\t\\treturns (address)\\n\\t{\\n\\t\\taddress addr = _deployCode(_salt, msg.sender, _bytecode);\\n\\t\\temit ContractCreated(addr);\\n\\t\\treturn addr;\\n\\t}\\n\\n\\tfunction getDeploymentAddress(uint256 _salt, address _sender)\\n\\t\\tpublic\\n\\t\\tview\\n\\t\\treturns (address)\\n\\t{\\n\\t\\treturn getDeploymentAddress(_salt, _sender, contractCodeHash);\\n\\t}\\n\\n\\tfunction getDeploymentAddress(\\n\\t\\tuint256 _salt,\\n\\t\\taddress _sender,\\n\\t\\tbytes32 _contractCodeHash\\n\\t) public view returns (address) {\\n\\t\\t// Adapted from https://github.com/archanova/solidity/blob/08f8f6bedc6e71c24758d20219b7d0749d75919d/contracts/contractCreator/ContractCreator.sol\\n\\t\\tbytes32 salt = _getSalt(_salt, _sender);\\n\\t\\tbytes32 rawAddress = keccak256(\\n\\t\\t\\tabi.encodePacked(bytes1(0xff), address(this), salt, _contractCodeHash)\\n\\t\\t);\\n\\n\\t\\treturn address(bytes20(rawAddress << 96));\\n\\t}\\n\\n\\tfunction _deployProxy(\\n\\t\\tuint256 _salt,\\n\\t\\taddress _logic,\\n\\t\\tbytes memory _data,\\n\\t\\taddress _sender\\n\\t) internal returns (address) {\\n\\t\\tbytes memory code = type(ERC1967Proxy).creationCode;\\n\\n\\t\\taddress payable addr = _deployCode(_salt, _sender, code);\\n\\n\\t\\tERC1967Proxy proxy = ERC1967Proxy(addr);\\n\\n\\t\\tproxy.initialize(_logic, _data);\\n\\t\\temit ProxyCreated(address(proxy));\\n\\t\\treturn address(proxy);\\n\\t}\\n\\n\\tfunction _deployCode(\\n\\t\\tuint256 _salt,\\n\\t\\taddress _sender,\\n\\t\\tbytes memory _code\\n\\t) internal returns (address payable) {\\n\\t\\taddress payable addr;\\n\\t\\tbytes32 salt = _getSalt(_salt, _sender);\\n\\t\\tassembly {\\n\\t\\t\\taddr := create2(0, add(_code, 0x20), mload(_code), salt)\\n\\t\\t\\tif iszero(extcodesize(addr)) {\\n\\t\\t\\t\\trevert(0, 0)\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\treturn addr;\\n\\t}\\n\\n\\tfunction _getSalt(uint256 _salt, address _sender)\\n\\t\\tinternal\\n\\t\\tpure\\n\\t\\treturns (bytes32)\\n\\t{\\n\\t\\treturn keccak256(abi.encodePacked(_salt, _sender));\\n\\t}\\n}\\n\",\"keccak256\":\"0x960c991ccfea7d26caa754088740ed10fa9e5dc3a78b331449be318b644a1d3f\",\"license\":\"MIT\"},\"@layerzerolabs/solidity-examples/contracts/contracts-upgradable/interfaces/ILayerZeroEndpointUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"./ILayerZeroUserApplicationConfigUpgradeable.sol\\\";\\n\\ninterface ILayerZeroEndpointUpgradeable is ILayerZeroUserApplicationConfigUpgradeable {\\n    // @notice send a LayerZero message to the specified address at a LayerZero endpoint.\\n    // @param _dstChainId - the destination chain identifier\\n    // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains\\n    // @param _payload - a custom bytes payload to send to the destination contract\\n    // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address\\n    // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction\\n    // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination\\n    function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable;\\n\\n    // @notice used by the messaging library to publish verified payload\\n    // @param _srcChainId - the source chain identifier\\n    // @param _srcAddress - the source contract (as bytes) at the source chain\\n    // @param _dstAddress - the address on destination chain\\n    // @param _nonce - the unbound message ordering nonce\\n    // @param _gasLimit - the gas limit for external contract execution\\n    // @param _payload - verified payload to send to the destination contract\\n    function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external;\\n\\n    // @notice get the inboundNonce of a lzApp from a source chain which could be EVM or non-EVM chain\\n    // @param _srcChainId - the source chain identifier\\n    // @param _srcAddress - the source chain contract address\\n    function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64);\\n\\n    // @notice get the outboundNonce from this source chain which, consequently, is always an EVM\\n    // @param _srcAddress - the source chain contract address\\n    function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64);\\n\\n    // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery\\n    // @param _dstChainId - the destination chain identifier\\n    // @param _userApplication - the user app address on this EVM chain\\n    // @param _payload - the custom message to send over LayerZero\\n    // @param _payInZRO - if false, user app pays the protocol fee in native token\\n    // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain\\n    function estimateFees(uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee);\\n\\n    // @notice get this Endpoint's immutable source identifier\\n    function getChainId() external view returns (uint16);\\n\\n    // @notice the interface to retry failed message on this Endpoint destination\\n    // @param _srcChainId - the source chain identifier\\n    // @param _srcAddress - the source chain contract address\\n    // @param _payload - the payload to be retried\\n    function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external;\\n\\n    // @notice query if any STORED payload (message blocking) at the endpoint.\\n    // @param _srcChainId - the source chain identifier\\n    // @param _srcAddress - the source chain contract address\\n    function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool);\\n\\n    // @notice query if the _libraryAddress is valid for sending msgs.\\n    // @param _userApplication - the user app address on this EVM chain\\n    function getSendLibraryAddress(address _userApplication) external view returns (address);\\n\\n    // @notice query if the _libraryAddress is valid for receiving msgs.\\n    // @param _userApplication - the user app address on this EVM chain\\n    function getReceiveLibraryAddress(address _userApplication) external view returns (address);\\n\\n    // @notice query if the non-reentrancy guard for send() is on\\n    // @return true if the guard is on. false otherwise\\n    function isSendingPayload() external view returns (bool);\\n\\n    // @notice query if the non-reentrancy guard for receive() is on\\n    // @return true if the guard is on. false otherwise\\n    function isReceivingPayload() external view returns (bool);\\n\\n    // @notice get the configuration of the LayerZero messaging library of the specified version\\n    // @param _version - messaging library version\\n    // @param _chainId - the chainId for the pending config change\\n    // @param _userApplication - the contract address of the user application\\n    // @param _configType - type of configuration. every messaging library has its own convention.\\n    function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory);\\n\\n    // @notice get the send() LayerZero messaging library version\\n    // @param _userApplication - the contract address of the user application\\n    function getSendVersion(address _userApplication) external view returns (uint16);\\n\\n    // @notice get the lzReceive() LayerZero messaging library version\\n    // @param _userApplication - the contract address of the user application\\n    function getReceiveVersion(address _userApplication) external view returns (uint16);\\n}\\n\",\"keccak256\":\"0x748e7abf8908f264c6fff8ea7730b1766ab5a262be7962404f7d263066b41487\",\"license\":\"MIT\"},\"@layerzerolabs/solidity-examples/contracts/contracts-upgradable/interfaces/ILayerZeroReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.2;\\n\\ninterface ILayerZeroReceiverUpgradeable {\\n    // @notice LayerZero endpoint will invoke this function to deliver the message on the destination\\n    // @param _srcChainId - the source endpoint identifier\\n    // @param _srcAddress - the source sending contract address from the source chain\\n    // @param _nonce - the ordered message nonce\\n    // @param _payload - the signed payload is the UA bytes has encoded to be sent\\n    function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external;\\n}\\n\",\"keccak256\":\"0x6ce5593a1247719f7209cad8068573c249674b41b859c6379ace1baaea0ed2a3\",\"license\":\"MIT\"},\"@layerzerolabs/solidity-examples/contracts/contracts-upgradable/interfaces/ILayerZeroUserApplicationConfigUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.2;\\n\\ninterface ILayerZeroUserApplicationConfigUpgradeable {\\n    // @notice set the configuration of the LayerZero messaging library of the specified version\\n    // @param _version - messaging library version\\n    // @param _chainId - the chainId for the pending config change\\n    // @param _configType - type of configuration. every messaging library has its own convention.\\n    // @param _config - configuration in the bytes. can encode arbitrary content.\\n    function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external;\\n\\n    // @notice set the send() LayerZero messaging library version to _version\\n    // @param _version - new messaging library version\\n    function setSendVersion(uint16 _version) external;\\n\\n    // @notice set the lzReceive() LayerZero messaging library version to _version\\n    // @param _version - new messaging library version\\n    function setReceiveVersion(uint16 _version) external;\\n\\n    // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload\\n    // @param _srcChainId - the chainId of the source chain\\n    // @param _srcAddress - the contract address of the source contract at the source chain\\n    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external;\\n}\\n\",\"keccak256\":\"0xa808baa32db12c453b982320e0c9a8c07aec8c0f3bb36ac2ed26f3ad47476879\",\"license\":\"MIT\"},\"@layerzerolabs/solidity-examples/contracts/contracts-upgradable/lzApp/LzAppUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"../interfaces/ILayerZeroReceiverUpgradeable.sol\\\";\\nimport \\\"../interfaces/ILayerZeroUserApplicationConfigUpgradeable.sol\\\";\\nimport \\\"../interfaces/ILayerZeroEndpointUpgradeable.sol\\\";\\nimport \\\"../../util/BytesLib.sol\\\";\\n\\n/*\\n * a generic LzReceiver implementation\\n */\\nabstract contract LzAppUpgradeable is Initializable, OwnableUpgradeable, ILayerZeroReceiverUpgradeable, ILayerZeroUserApplicationConfigUpgradeable {\\n    using BytesLib for bytes;\\n\\n    // ua can not send payload larger than this by default, but it can be changed by the ua owner\\n    uint constant public DEFAULT_PAYLOAD_SIZE_LIMIT = 10000;\\n\\n    ILayerZeroEndpointUpgradeable public lzEndpoint;\\n    mapping(uint16 => bytes) public trustedRemoteLookup;\\n    mapping(uint16 => mapping(uint16 => uint)) public minDstGasLookup;\\n    mapping(uint16 => uint) public payloadSizeLimitLookup;\\n    address public precrime;\\n\\n    event SetPrecrime(address precrime);\\n    event SetTrustedRemote(uint16 _remoteChainId, bytes _path);\\n    event SetTrustedRemoteAddress(uint16 _remoteChainId, bytes _remoteAddress);\\n    event SetMinDstGas(uint16 _dstChainId, uint16 _type, uint _minDstGas);\\n\\n    function __LzAppUpgradeable_init(address _endpoint) internal onlyInitializing {\\n        __Ownable_init_unchained();\\n        __LzAppUpgradeable_init_unchained(_endpoint);\\n    }\\n\\n    function __LzAppUpgradeable_init_unchained(address _endpoint) internal onlyInitializing {\\n        lzEndpoint = ILayerZeroEndpointUpgradeable(_endpoint);\\n    }\\n\\n    function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public virtual override {\\n        // lzReceive must be called by the endpoint for security\\n        require(_msgSender() == address(lzEndpoint), \\\"LzApp: invalid endpoint caller\\\");\\n\\n        bytes memory trustedRemote = trustedRemoteLookup[_srcChainId];\\n        // if will still block the message pathway from (srcChainId, srcAddress). should not receive message from untrusted remote.\\n        require(_srcAddress.length == trustedRemote.length && trustedRemote.length > 0 && keccak256(_srcAddress) == keccak256(trustedRemote), \\\"LzApp: invalid source sending contract\\\");\\n\\n        _blockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);\\n    }\\n\\n    // abstract function - the default behaviour of LayerZero is blocking. See: NonblockingLzApp if you dont need to enforce ordered messaging\\n    function _blockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual;\\n\\n    function _lzSend(uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams, uint _nativeFee) internal virtual {\\n        bytes memory trustedRemote = trustedRemoteLookup[_dstChainId];\\n        require(trustedRemote.length != 0, \\\"LzApp: destination chain is not a trusted source\\\");\\n        _checkPayloadSize(_dstChainId, _payload.length);\\n        lzEndpoint.send{value: _nativeFee}(_dstChainId, trustedRemote, _payload, _refundAddress, _zroPaymentAddress, _adapterParams);\\n    }\\n\\n    function _checkGasLimit(uint16 _dstChainId, uint16 _type, bytes memory _adapterParams, uint _extraGas) internal view virtual {\\n        uint providedGasLimit = _getGasLimit(_adapterParams);\\n        uint minGasLimit = minDstGasLookup[_dstChainId][_type] + _extraGas;\\n        require(minGasLimit > 0, \\\"LzApp: minGasLimit not set\\\");\\n        require(providedGasLimit >= minGasLimit, \\\"LzApp: gas limit is too low\\\");\\n    }\\n\\n    function _getGasLimit(bytes memory _adapterParams) internal pure virtual returns (uint gasLimit) {\\n        require(_adapterParams.length >= 34, \\\"LzApp: invalid adapterParams\\\");\\n        assembly {\\n            gasLimit := mload(add(_adapterParams, 34))\\n        }\\n    }\\n\\n    function _checkPayloadSize(uint16 _dstChainId, uint _payloadSize) internal view virtual {\\n        uint payloadSizeLimit = payloadSizeLimitLookup[_dstChainId];\\n        if (payloadSizeLimit == 0) { // use default if not set\\n            payloadSizeLimit = DEFAULT_PAYLOAD_SIZE_LIMIT;\\n        }\\n        require(_payloadSize <= payloadSizeLimit, \\\"LzApp: payload size is too large\\\");\\n    }\\n\\n    //---------------------------UserApplication config----------------------------------------\\n    function getConfig(uint16 _version, uint16 _chainId, address, uint _configType) external view returns (bytes memory) {\\n        return lzEndpoint.getConfig(_version, _chainId, address(this), _configType);\\n    }\\n\\n    // generic config for LayerZero user Application\\n    function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external override onlyOwner {\\n        lzEndpoint.setConfig(_version, _chainId, _configType, _config);\\n    }\\n\\n    function setSendVersion(uint16 _version) external override onlyOwner {\\n        lzEndpoint.setSendVersion(_version);\\n    }\\n\\n    function setReceiveVersion(uint16 _version) external override onlyOwner {\\n        lzEndpoint.setReceiveVersion(_version);\\n    }\\n\\n    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override onlyOwner {\\n        lzEndpoint.forceResumeReceive(_srcChainId, _srcAddress);\\n    }\\n\\n    // _path = abi.encodePacked(remoteAddress, localAddress)\\n    // this function set the trusted path for the cross-chain communication\\n    function setTrustedRemote(uint16 _srcChainId, bytes calldata _path) external onlyOwner {\\n        trustedRemoteLookup[_srcChainId] = _path;\\n        emit SetTrustedRemote(_srcChainId, _path);\\n    }\\n\\n    function setTrustedRemoteAddress(uint16 _remoteChainId, bytes calldata _remoteAddress) external onlyOwner {\\n        trustedRemoteLookup[_remoteChainId] = abi.encodePacked(_remoteAddress, address(this));\\n        emit SetTrustedRemoteAddress(_remoteChainId, _remoteAddress);\\n    }\\n\\n    function getTrustedRemoteAddress(uint16 _remoteChainId) external view returns (bytes memory) {\\n        bytes memory path = trustedRemoteLookup[_remoteChainId];\\n        require(path.length != 0, \\\"LzApp: no trusted path record\\\");\\n        return path.slice(0, path.length - 20); // the last 20 bytes should be address(this)\\n    }\\n\\n    function setPrecrime(address _precrime) external onlyOwner {\\n        precrime = _precrime;\\n        emit SetPrecrime(_precrime);\\n    }\\n\\n    function setMinDstGas(uint16 _dstChainId, uint16 _packetType, uint _minGas) external onlyOwner {\\n        require(_minGas > 0, \\\"LzApp: invalid minGas\\\");\\n        minDstGasLookup[_dstChainId][_packetType] = _minGas;\\n        emit SetMinDstGas(_dstChainId, _packetType, _minGas);\\n    }\\n\\n    // if the size is 0, it means default size limit\\n    function setPayloadSizeLimit(uint16 _dstChainId, uint _size) external onlyOwner {\\n        payloadSizeLimitLookup[_dstChainId] = _size;\\n    }\\n\\n    //--------------------------- VIEW FUNCTION ----------------------------------------\\n    function isTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool) {\\n        bytes memory trustedSource = trustedRemoteLookup[_srcChainId];\\n        return keccak256(trustedSource) == keccak256(_srcAddress);\\n    }\\n\\n    /**\\n     * @dev This empty reserved space is put in place to allow future versions to add new\\n     * variables without shifting down storage in the inheritance chain.\\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n     */\\n    uint[45] private __gap;\\n}\\n\",\"keccak256\":\"0xdb4821e980d9ae21ed437cdcedbdac901253f2411f518704eaa1de9af250f4b0\",\"license\":\"MIT\"},\"@layerzerolabs/solidity-examples/contracts/contracts-upgradable/lzApp/NonblockingLzAppUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"./LzAppUpgradeable.sol\\\";\\nimport \\\"../../util/ExcessivelySafeCall.sol\\\";\\n\\n/*\\n * the default LayerZero messaging behaviour is blocking, i.e. any failed message will block the channel\\n * this abstract class try-catch all fail messages and store locally for future retry. hence, non-blocking\\n * NOTE: if the srcAddress is not configured properly, it will still block the message pathway from (srcChainId, srcAddress)\\n */\\nabstract contract NonblockingLzAppUpgradeable is Initializable, LzAppUpgradeable {\\n    using ExcessivelySafeCall for address;\\n\\n    function __NonblockingLzAppUpgradeable_init(address _endpoint) internal onlyInitializing {\\n        __Ownable_init_unchained();\\n        __LzAppUpgradeable_init_unchained(_endpoint);\\n    }\\n\\n    function __NonblockingLzAppUpgradeable_init_unchained(address _endpoint) internal onlyInitializing {}\\n\\n    mapping(uint16 => mapping(bytes => mapping(uint64 => bytes32))) public failedMessages;\\n\\n    event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload, bytes _reason);\\n    event RetryMessageSuccess(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes32 _payloadHash);\\n\\n    // overriding the virtual function in LzReceiver\\n    function _blockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual override {\\n        (bool success, bytes memory reason) = address(this).excessivelySafeCall(gasleft(), 150, abi.encodeWithSelector(this.nonblockingLzReceive.selector, _srcChainId, _srcAddress, _nonce, _payload));\\n        // try-catch all errors/exceptions\\n        if (!success) {\\n            _storeFailedMessage(_srcChainId, _srcAddress, _nonce, _payload, reason);\\n        }\\n    }\\n\\n    function _storeFailedMessage(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload, bytes memory _reason) internal virtual {\\n        failedMessages[_srcChainId][_srcAddress][_nonce] = keccak256(_payload);\\n        emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload, _reason);\\n    }\\n\\n    function nonblockingLzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public virtual {\\n        // only internal transaction\\n        require(_msgSender() == address(this), \\\"NonblockingLzApp: caller must be LzApp\\\");\\n        _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);\\n    }\\n\\n    //@notice override this function\\n    function _nonblockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual;\\n\\n    function retryMessage(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public payable virtual {\\n        // assert there is message to retry\\n        bytes32 payloadHash = failedMessages[_srcChainId][_srcAddress][_nonce];\\n        require(payloadHash != bytes32(0), \\\"NonblockingLzApp: no stored message\\\");\\n        require(keccak256(_payload) == payloadHash, \\\"NonblockingLzApp: invalid payload\\\");\\n        // clear the stored message\\n        failedMessages[_srcChainId][_srcAddress][_nonce] = bytes32(0);\\n        // execute the message. revert if it fails again\\n        _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);\\n        emit RetryMessageSuccess(_srcChainId, _srcAddress, _nonce, payloadHash);\\n    }\\n\\n    /**\\n     * @dev This empty reserved space is put in place to allow future versions to add new\\n     * variables without shifting down storage in the inheritance chain.\\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n     */\\n    uint[49] private __gap;\\n}\\n\",\"keccak256\":\"0x128f7c8d0d1d04c147cea7a2a6c2244387bef408f2a6f0a9c2a01cf54a66eea3\",\"license\":\"MIT\"},\"@layerzerolabs/solidity-examples/contracts/util/BytesLib.sol\":{\"content\":\"// SPDX-License-Identifier: Unlicense\\n/*\\n * @title Solidity Bytes Arrays Utils\\n * @author Gon\\u00e7alo S\\u00e1 <goncalo.sa@consensys.net>\\n *\\n * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.\\n *      The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.\\n */\\npragma solidity >=0.8.0 <0.9.0;\\n\\n\\nlibrary BytesLib {\\n    function concat(\\n        bytes memory _preBytes,\\n        bytes memory _postBytes\\n    )\\n    internal\\n    pure\\n    returns (bytes memory)\\n    {\\n        bytes memory tempBytes;\\n\\n        assembly {\\n        // Get a location of some free memory and store it in tempBytes as\\n        // Solidity does for memory variables.\\n            tempBytes := mload(0x40)\\n\\n        // Store the length of the first bytes array at the beginning of\\n        // the memory for tempBytes.\\n            let length := mload(_preBytes)\\n            mstore(tempBytes, length)\\n\\n        // Maintain a memory counter for the current write location in the\\n        // temp bytes array by adding the 32 bytes for the array length to\\n        // the starting location.\\n            let mc := add(tempBytes, 0x20)\\n        // Stop copying when the memory counter reaches the length of the\\n        // first bytes array.\\n            let end := add(mc, length)\\n\\n            for {\\n            // Initialize a copy counter to the start of the _preBytes data,\\n            // 32 bytes into its memory.\\n                let cc := add(_preBytes, 0x20)\\n            } lt(mc, end) {\\n            // Increase both counters by 32 bytes each iteration.\\n                mc := add(mc, 0x20)\\n                cc := add(cc, 0x20)\\n            } {\\n            // Write the _preBytes data into the tempBytes memory 32 bytes\\n            // at a time.\\n                mstore(mc, mload(cc))\\n            }\\n\\n        // Add the length of _postBytes to the current length of tempBytes\\n        // and store it as the new length in the first 32 bytes of the\\n        // tempBytes memory.\\n            length := mload(_postBytes)\\n            mstore(tempBytes, add(length, mload(tempBytes)))\\n\\n        // Move the memory counter back from a multiple of 0x20 to the\\n        // actual end of the _preBytes data.\\n            mc := end\\n        // Stop copying when the memory counter reaches the new combined\\n        // length of the arrays.\\n            end := add(mc, length)\\n\\n            for {\\n                let cc := add(_postBytes, 0x20)\\n            } lt(mc, end) {\\n                mc := add(mc, 0x20)\\n                cc := add(cc, 0x20)\\n            } {\\n                mstore(mc, mload(cc))\\n            }\\n\\n        // Update the free-memory pointer by padding our last write location\\n        // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\\n        // next 32 byte block, then round down to the nearest multiple of\\n        // 32. If the sum of the length of the two arrays is zero then add\\n        // one before rounding down to leave a blank 32 bytes (the length block with 0).\\n            mstore(0x40, and(\\n            add(add(end, iszero(add(length, mload(_preBytes)))), 31),\\n            not(31) // Round down to the nearest 32 bytes.\\n            ))\\n        }\\n\\n        return tempBytes;\\n    }\\n\\n    function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal {\\n        assembly {\\n        // Read the first 32 bytes of _preBytes storage, which is the length\\n        // of the array. (We don't need to use the offset into the slot\\n        // because arrays use the entire slot.)\\n            let fslot := sload(_preBytes.slot)\\n        // Arrays of 31 bytes or less have an even value in their slot,\\n        // while longer arrays have an odd value. The actual length is\\n        // the slot divided by two for odd values, and the lowest order\\n        // byte divided by two for even values.\\n        // If the slot is even, bitwise and the slot with 255 and divide by\\n        // two to get the length. If the slot is odd, bitwise and the slot\\n        // with -1 and divide by two.\\n            let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\\n            let mlength := mload(_postBytes)\\n            let newlength := add(slength, mlength)\\n        // slength can contain both the length and contents of the array\\n        // if length < 32 bytes so let's prepare for that\\n        // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\\n            switch add(lt(slength, 32), lt(newlength, 32))\\n            case 2 {\\n            // Since the new array still fits in the slot, we just need to\\n            // update the contents of the slot.\\n            // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length\\n                sstore(\\n                _preBytes.slot,\\n                // all the modifications to the slot are inside this\\n                // next block\\n                add(\\n                // we can just add to the slot contents because the\\n                // bytes we want to change are the LSBs\\n                fslot,\\n                add(\\n                mul(\\n                div(\\n                // load the bytes from memory\\n                mload(add(_postBytes, 0x20)),\\n                // zero all bytes to the right\\n                exp(0x100, sub(32, mlength))\\n                ),\\n                // and now shift left the number of bytes to\\n                // leave space for the length in the slot\\n                exp(0x100, sub(32, newlength))\\n                ),\\n                // increase length by the double of the memory\\n                // bytes length\\n                mul(mlength, 2)\\n                )\\n                )\\n                )\\n            }\\n            case 1 {\\n            // The stored value fits in the slot, but the combined value\\n            // will exceed it.\\n            // get the keccak hash to get the contents of the array\\n                mstore(0x0, _preBytes.slot)\\n                let sc := add(keccak256(0x0, 0x20), div(slength, 32))\\n\\n            // save new length\\n                sstore(_preBytes.slot, add(mul(newlength, 2), 1))\\n\\n            // The contents of the _postBytes array start 32 bytes into\\n            // the structure. Our first read should obtain the `submod`\\n            // bytes that can fit into the unused space in the last word\\n            // of the stored array. To get this, we read 32 bytes starting\\n            // from `submod`, so the data we read overlaps with the array\\n            // contents by `submod` bytes. Masking the lowest-order\\n            // `submod` bytes allows us to add that value directly to the\\n            // stored value.\\n\\n                let submod := sub(32, slength)\\n                let mc := add(_postBytes, submod)\\n                let end := add(_postBytes, mlength)\\n                let mask := sub(exp(0x100, submod), 1)\\n\\n                sstore(\\n                sc,\\n                add(\\n                and(\\n                fslot,\\n                0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00\\n                ),\\n                and(mload(mc), mask)\\n                )\\n                )\\n\\n                for {\\n                    mc := add(mc, 0x20)\\n                    sc := add(sc, 1)\\n                } lt(mc, end) {\\n                    sc := add(sc, 1)\\n                    mc := add(mc, 0x20)\\n                } {\\n                    sstore(sc, mload(mc))\\n                }\\n\\n                mask := exp(0x100, sub(mc, end))\\n\\n                sstore(sc, mul(div(mload(mc), mask), mask))\\n            }\\n            default {\\n            // get the keccak hash to get the contents of the array\\n                mstore(0x0, _preBytes.slot)\\n            // Start copying to the last used word of the stored array.\\n                let sc := add(keccak256(0x0, 0x20), div(slength, 32))\\n\\n            // save new length\\n                sstore(_preBytes.slot, add(mul(newlength, 2), 1))\\n\\n            // Copy over the first `submod` bytes of the new data as in\\n            // case 1 above.\\n                let slengthmod := mod(slength, 32)\\n                let mlengthmod := mod(mlength, 32)\\n                let submod := sub(32, slengthmod)\\n                let mc := add(_postBytes, submod)\\n                let end := add(_postBytes, mlength)\\n                let mask := sub(exp(0x100, submod), 1)\\n\\n                sstore(sc, add(sload(sc), and(mload(mc), mask)))\\n\\n                for {\\n                    sc := add(sc, 1)\\n                    mc := add(mc, 0x20)\\n                } lt(mc, end) {\\n                    sc := add(sc, 1)\\n                    mc := add(mc, 0x20)\\n                } {\\n                    sstore(sc, mload(mc))\\n                }\\n\\n                mask := exp(0x100, sub(mc, end))\\n\\n                sstore(sc, mul(div(mload(mc), mask), mask))\\n            }\\n        }\\n    }\\n\\n    function slice(\\n        bytes memory _bytes,\\n        uint256 _start,\\n        uint256 _length\\n    )\\n    internal\\n    pure\\n    returns (bytes memory)\\n    {\\n        require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n        require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n        bytes memory tempBytes;\\n\\n        assembly {\\n            switch iszero(_length)\\n            case 0 {\\n            // Get a location of some free memory and store it in tempBytes as\\n            // Solidity does for memory variables.\\n                tempBytes := mload(0x40)\\n\\n            // The first word of the slice result is potentially a partial\\n            // word read from the original array. To read it, we calculate\\n            // the length of that partial word and start copying that many\\n            // bytes into the array. The first word we copy will start with\\n            // data we don't care about, but the last `lengthmod` bytes will\\n            // land at the beginning of the contents of the new array. When\\n            // we're done copying, we overwrite the full first word with\\n            // the actual length of the slice.\\n                let lengthmod := and(_length, 31)\\n\\n            // The multiplication in the next line is necessary\\n            // because when slicing multiples of 32 bytes (lengthmod == 0)\\n            // the following copy loop was copying the origin's length\\n            // and then ending prematurely not copying everything it should.\\n                let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n                let end := add(mc, _length)\\n\\n                for {\\n                // The multiplication in the next line has the same exact purpose\\n                // as the one above.\\n                    let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n                } lt(mc, end) {\\n                    mc := add(mc, 0x20)\\n                    cc := add(cc, 0x20)\\n                } {\\n                    mstore(mc, mload(cc))\\n                }\\n\\n                mstore(tempBytes, _length)\\n\\n            //update free-memory pointer\\n            //allocating the array padded to 32 bytes like the compiler does now\\n                mstore(0x40, and(add(mc, 31), not(31)))\\n            }\\n            //if we want a zero-length slice let's just return a zero-length array\\n            default {\\n                tempBytes := mload(0x40)\\n            //zero out the 32 bytes slice we are about to return\\n            //we need to do it because Solidity does not garbage collect\\n                mstore(tempBytes, 0)\\n\\n                mstore(0x40, add(tempBytes, 0x20))\\n            }\\n        }\\n\\n        return tempBytes;\\n    }\\n\\n    function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n        require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n        address tempAddress;\\n\\n        assembly {\\n            tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n        }\\n\\n        return tempAddress;\\n    }\\n\\n    function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n        require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n        uint8 tempUint;\\n\\n        assembly {\\n            tempUint := mload(add(add(_bytes, 0x1), _start))\\n        }\\n\\n        return tempUint;\\n    }\\n\\n    function toUint16(bytes memory _bytes, uint256 _start) internal pure returns (uint16) {\\n        require(_bytes.length >= _start + 2, \\\"toUint16_outOfBounds\\\");\\n        uint16 tempUint;\\n\\n        assembly {\\n            tempUint := mload(add(add(_bytes, 0x2), _start))\\n        }\\n\\n        return tempUint;\\n    }\\n\\n    function toUint32(bytes memory _bytes, uint256 _start) internal pure returns (uint32) {\\n        require(_bytes.length >= _start + 4, \\\"toUint32_outOfBounds\\\");\\n        uint32 tempUint;\\n\\n        assembly {\\n            tempUint := mload(add(add(_bytes, 0x4), _start))\\n        }\\n\\n        return tempUint;\\n    }\\n\\n    function toUint64(bytes memory _bytes, uint256 _start) internal pure returns (uint64) {\\n        require(_bytes.length >= _start + 8, \\\"toUint64_outOfBounds\\\");\\n        uint64 tempUint;\\n\\n        assembly {\\n            tempUint := mload(add(add(_bytes, 0x8), _start))\\n        }\\n\\n        return tempUint;\\n    }\\n\\n    function toUint96(bytes memory _bytes, uint256 _start) internal pure returns (uint96) {\\n        require(_bytes.length >= _start + 12, \\\"toUint96_outOfBounds\\\");\\n        uint96 tempUint;\\n\\n        assembly {\\n            tempUint := mload(add(add(_bytes, 0xc), _start))\\n        }\\n\\n        return tempUint;\\n    }\\n\\n    function toUint128(bytes memory _bytes, uint256 _start) internal pure returns (uint128) {\\n        require(_bytes.length >= _start + 16, \\\"toUint128_outOfBounds\\\");\\n        uint128 tempUint;\\n\\n        assembly {\\n            tempUint := mload(add(add(_bytes, 0x10), _start))\\n        }\\n\\n        return tempUint;\\n    }\\n\\n    function toUint256(bytes memory _bytes, uint256 _start) internal pure returns (uint256) {\\n        require(_bytes.length >= _start + 32, \\\"toUint256_outOfBounds\\\");\\n        uint256 tempUint;\\n\\n        assembly {\\n            tempUint := mload(add(add(_bytes, 0x20), _start))\\n        }\\n\\n        return tempUint;\\n    }\\n\\n    function toBytes32(bytes memory _bytes, uint256 _start) internal pure returns (bytes32) {\\n        require(_bytes.length >= _start + 32, \\\"toBytes32_outOfBounds\\\");\\n        bytes32 tempBytes32;\\n\\n        assembly {\\n            tempBytes32 := mload(add(add(_bytes, 0x20), _start))\\n        }\\n\\n        return tempBytes32;\\n    }\\n\\n    function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) {\\n        bool success = true;\\n\\n        assembly {\\n            let length := mload(_preBytes)\\n\\n        // if lengths don't match the arrays are not equal\\n            switch eq(length, mload(_postBytes))\\n            case 1 {\\n            // cb is a circuit breaker in the for loop since there's\\n            //  no said feature for inline assembly loops\\n            // cb = 1 - don't breaker\\n            // cb = 0 - break\\n                let cb := 1\\n\\n                let mc := add(_preBytes, 0x20)\\n                let end := add(mc, length)\\n\\n                for {\\n                    let cc := add(_postBytes, 0x20)\\n                // the next line is the loop condition:\\n                // while(uint256(mc < end) + cb == 2)\\n                } eq(add(lt(mc, end), cb), 2) {\\n                    mc := add(mc, 0x20)\\n                    cc := add(cc, 0x20)\\n                } {\\n                // if any of these checks fails then arrays are not equal\\n                    if iszero(eq(mload(mc), mload(cc))) {\\n                    // unsuccess:\\n                        success := 0\\n                        cb := 0\\n                    }\\n                }\\n            }\\n            default {\\n            // unsuccess:\\n                success := 0\\n            }\\n        }\\n\\n        return success;\\n    }\\n\\n    function equalStorage(\\n        bytes storage _preBytes,\\n        bytes memory _postBytes\\n    )\\n    internal\\n    view\\n    returns (bool)\\n    {\\n        bool success = true;\\n\\n        assembly {\\n        // we know _preBytes_offset is 0\\n            let fslot := sload(_preBytes.slot)\\n        // Decode the length of the stored array like in concatStorage().\\n            let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\\n            let mlength := mload(_postBytes)\\n\\n        // if lengths don't match the arrays are not equal\\n            switch eq(slength, mlength)\\n            case 1 {\\n            // slength can contain both the length and contents of the array\\n            // if length < 32 bytes so let's prepare for that\\n            // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\\n                if iszero(iszero(slength)) {\\n                    switch lt(slength, 32)\\n                    case 1 {\\n                    // blank the last byte which is the length\\n                        fslot := mul(div(fslot, 0x100), 0x100)\\n\\n                        if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) {\\n                        // unsuccess:\\n                            success := 0\\n                        }\\n                    }\\n                    default {\\n                    // cb is a circuit breaker in the for loop since there's\\n                    //  no said feature for inline assembly loops\\n                    // cb = 1 - don't breaker\\n                    // cb = 0 - break\\n                        let cb := 1\\n\\n                    // get the keccak hash to get the contents of the array\\n                        mstore(0x0, _preBytes.slot)\\n                        let sc := keccak256(0x0, 0x20)\\n\\n                        let mc := add(_postBytes, 0x20)\\n                        let end := add(mc, mlength)\\n\\n                    // the next line is the loop condition:\\n                    // while(uint256(mc < end) + cb == 2)\\n                        for {} eq(add(lt(mc, end), cb), 2) {\\n                            sc := add(sc, 1)\\n                            mc := add(mc, 0x20)\\n                        } {\\n                            if iszero(eq(sload(sc), mload(mc))) {\\n                            // unsuccess:\\n                                success := 0\\n                                cb := 0\\n                            }\\n                        }\\n                    }\\n                }\\n            }\\n            default {\\n            // unsuccess:\\n                success := 0\\n            }\\n        }\\n\\n        return success;\\n    }\\n}\\n\",\"keccak256\":\"0x2255aadad70e87ed42b158776330175644b07fbbc7e77ed32cd6330974abbcee\",\"license\":\"Unlicense\"},\"@layerzerolabs/solidity-examples/contracts/util/ExcessivelySafeCall.sol\":{\"content\":\"// SPDX-License-Identifier: MIT OR Apache-2.0\\npragma solidity >=0.7.6;\\n\\nlibrary ExcessivelySafeCall {\\n    uint256 constant LOW_28_MASK =\\n    0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff;\\n\\n    /// @notice Use when you _really_ really _really_ don't trust the called\\n    /// contract. This prevents the called contract from causing reversion of\\n    /// the caller in as many ways as we can.\\n    /// @dev The main difference between this and a solidity low-level call is\\n    /// that we limit the number of bytes that the callee can cause to be\\n    /// copied to caller memory. This prevents stupid things like malicious\\n    /// contracts returning 10,000,000 bytes causing a local OOG when copying\\n    /// to memory.\\n    /// @param _target The address to call\\n    /// @param _gas The amount of gas to forward to the remote contract\\n    /// @param _maxCopy The maximum number of bytes of returndata to copy\\n    /// to memory.\\n    /// @param _calldata The data to send to the remote contract\\n    /// @return success and returndata, as `.call()`. Returndata is capped to\\n    /// `_maxCopy` bytes.\\n    function excessivelySafeCall(\\n        address _target,\\n        uint256 _gas,\\n        uint16 _maxCopy,\\n        bytes memory _calldata\\n    ) internal returns (bool, bytes memory) {\\n        // set up for assembly call\\n        uint256 _toCopy;\\n        bool _success;\\n        bytes memory _returnData = new bytes(_maxCopy);\\n        // dispatch message to recipient\\n        // by assembly calling \\\"handle\\\" function\\n        // we call via assembly to avoid memcopying a very large returndata\\n        // returned by a malicious contract\\n        assembly {\\n            _success := call(\\n            _gas, // gas\\n            _target, // recipient\\n            0, // ether value\\n            add(_calldata, 0x20), // inloc\\n            mload(_calldata), // inlen\\n            0, // outloc\\n            0 // outlen\\n            )\\n        // limit our copy to 256 bytes\\n            _toCopy := returndatasize()\\n            if gt(_toCopy, _maxCopy) {\\n                _toCopy := _maxCopy\\n            }\\n        // Store the length of the copied bytes\\n            mstore(_returnData, _toCopy)\\n        // copy the bytes from returndata[0:_toCopy]\\n            returndatacopy(add(_returnData, 0x20), 0, _toCopy)\\n        }\\n        return (_success, _returnData);\\n    }\\n\\n    /// @notice Use when you _really_ really _really_ don't trust the called\\n    /// contract. This prevents the called contract from causing reversion of\\n    /// the caller in as many ways as we can.\\n    /// @dev The main difference between this and a solidity low-level call is\\n    /// that we limit the number of bytes that the callee can cause to be\\n    /// copied to caller memory. This prevents stupid things like malicious\\n    /// contracts returning 10,000,000 bytes causing a local OOG when copying\\n    /// to memory.\\n    /// @param _target The address to call\\n    /// @param _gas The amount of gas to forward to the remote contract\\n    /// @param _maxCopy The maximum number of bytes of returndata to copy\\n    /// to memory.\\n    /// @param _calldata The data to send to the remote contract\\n    /// @return success and returndata, as `.call()`. Returndata is capped to\\n    /// `_maxCopy` bytes.\\n    function excessivelySafeStaticCall(\\n        address _target,\\n        uint256 _gas,\\n        uint16 _maxCopy,\\n        bytes memory _calldata\\n    ) internal view returns (bool, bytes memory) {\\n        // set up for assembly call\\n        uint256 _toCopy;\\n        bool _success;\\n        bytes memory _returnData = new bytes(_maxCopy);\\n        // dispatch message to recipient\\n        // by assembly calling \\\"handle\\\" function\\n        // we call via assembly to avoid memcopying a very large returndata\\n        // returned by a malicious contract\\n        assembly {\\n            _success := staticcall(\\n            _gas, // gas\\n            _target, // recipient\\n            add(_calldata, 0x20), // inloc\\n            mload(_calldata), // inlen\\n            0, // outloc\\n            0 // outlen\\n            )\\n        // limit our copy to 256 bytes\\n            _toCopy := returndatasize()\\n            if gt(_toCopy, _maxCopy) {\\n                _toCopy := _maxCopy\\n            }\\n        // Store the length of the copied bytes\\n            mstore(_returnData, _toCopy)\\n        // copy the bytes from returndata[0:_toCopy]\\n            returndatacopy(add(_returnData, 0x20), 0, _toCopy)\\n        }\\n        return (_success, _returnData);\\n    }\\n\\n    /**\\n     * @notice Swaps function selectors in encoded contract calls\\n     * @dev Allows reuse of encoded calldata for functions with identical\\n     * argument types but different names. It simply swaps out the first 4 bytes\\n     * for the new selector. This function modifies memory in place, and should\\n     * only be used with caution.\\n     * @param _newSelector The new 4-byte selector\\n     * @param _buf The encoded contract args\\n     */\\n    function swapSelector(bytes4 _newSelector, bytes memory _buf)\\n    internal\\n    pure\\n    {\\n        require(_buf.length >= 4);\\n        uint256 _mask = LOW_28_MASK;\\n        assembly {\\n        // load the first word of\\n            let _word := mload(add(_buf, 0x20))\\n        // mask out the top 4 bytes\\n        // /x\\n            _word := and(_word, _mask)\\n            _word := or(_newSelector, _word)\\n            mstore(add(_buf, 0x20), _word)\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x23942250ddd277c443fa27c6b4ab51e6b3b5e654548b6b9e8d785a88ebec4dfe\",\"license\":\"MIT OR Apache-2.0\"},\"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControlUpgradeable.sol\\\";\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../utils/StringsUpgradeable.sol\\\";\\nimport \\\"../utils/introspection/ERC165Upgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n *     require(hasRole(MY_ROLE, msg.sender));\\n *     ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable {\\n    function __AccessControl_init() internal onlyInitializing {\\n    }\\n\\n    function __AccessControl_init_unchained() internal onlyInitializing {\\n    }\\n    struct RoleData {\\n        mapping(address => bool) members;\\n        bytes32 adminRole;\\n    }\\n\\n    mapping(bytes32 => RoleData) private _roles;\\n\\n    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n    /**\\n     * @dev Modifier that checks that an account has a specific role. Reverts\\n     * with a standardized message including the required role.\\n     *\\n     * The format of the revert reason is given by the following regular expression:\\n     *\\n     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n     *\\n     * _Available since v4.1._\\n     */\\n    modifier onlyRole(bytes32 role) {\\n        _checkRole(role);\\n        _;\\n    }\\n\\n    /**\\n     * @dev See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n        return interfaceId == type(IAccessControlUpgradeable).interfaceId || super.supportsInterface(interfaceId);\\n    }\\n\\n    /**\\n     * @dev Returns `true` if `account` has been granted `role`.\\n     */\\n    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n        return _roles[role].members[account];\\n    }\\n\\n    /**\\n     * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n     * Overriding this function changes the behavior of the {onlyRole} modifier.\\n     *\\n     * Format of the revert message is described in {_checkRole}.\\n     *\\n     * _Available since v4.6._\\n     */\\n    function _checkRole(bytes32 role) internal view virtual {\\n        _checkRole(role, _msgSender());\\n    }\\n\\n    /**\\n     * @dev Revert with a standard message if `account` is missing `role`.\\n     *\\n     * The format of the revert reason is given by the following regular expression:\\n     *\\n     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n     */\\n    function _checkRole(bytes32 role, address account) internal view virtual {\\n        if (!hasRole(role, account)) {\\n            revert(\\n                string(\\n                    abi.encodePacked(\\n                        \\\"AccessControl: account \\\",\\n                        StringsUpgradeable.toHexString(account),\\n                        \\\" is missing role \\\",\\n                        StringsUpgradeable.toHexString(uint256(role), 32)\\n                    )\\n                )\\n            );\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\\n     * {revokeRole}.\\n     *\\n     * To change a role's admin, use {_setRoleAdmin}.\\n     */\\n    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n        return _roles[role].adminRole;\\n    }\\n\\n    /**\\n     * @dev Grants `role` to `account`.\\n     *\\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\\n     * event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must have ``role``'s admin role.\\n     *\\n     * May emit a {RoleGranted} event.\\n     */\\n    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n        _grantRole(role, account);\\n    }\\n\\n    /**\\n     * @dev Revokes `role` from `account`.\\n     *\\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must have ``role``'s admin role.\\n     *\\n     * May emit a {RoleRevoked} event.\\n     */\\n    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n        _revokeRole(role, account);\\n    }\\n\\n    /**\\n     * @dev Revokes `role` from the calling account.\\n     *\\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n     * purpose is to provide a mechanism for accounts to lose their privileges\\n     * if they are compromised (such as when a trusted device is misplaced).\\n     *\\n     * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n     * event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must be `account`.\\n     *\\n     * May emit a {RoleRevoked} event.\\n     */\\n    function renounceRole(bytes32 role, address account) public virtual override {\\n        require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n        _revokeRole(role, account);\\n    }\\n\\n    /**\\n     * @dev Grants `role` to `account`.\\n     *\\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\\n     * event. Note that unlike {grantRole}, this function doesn't perform any\\n     * checks on the calling account.\\n     *\\n     * May emit a {RoleGranted} event.\\n     *\\n     * [WARNING]\\n     * ====\\n     * This function should only be called from the constructor when setting\\n     * up the initial roles for the system.\\n     *\\n     * Using this function in any other way is effectively circumventing the admin\\n     * system imposed by {AccessControl}.\\n     * ====\\n     *\\n     * NOTE: This function is deprecated in favor of {_grantRole}.\\n     */\\n    function _setupRole(bytes32 role, address account) internal virtual {\\n        _grantRole(role, account);\\n    }\\n\\n    /**\\n     * @dev Sets `adminRole` as ``role``'s admin role.\\n     *\\n     * Emits a {RoleAdminChanged} event.\\n     */\\n    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n        bytes32 previousAdminRole = getRoleAdmin(role);\\n        _roles[role].adminRole = adminRole;\\n        emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n    }\\n\\n    /**\\n     * @dev Grants `role` to `account`.\\n     *\\n     * Internal function without access restriction.\\n     *\\n     * May emit a {RoleGranted} event.\\n     */\\n    function _grantRole(bytes32 role, address account) internal virtual {\\n        if (!hasRole(role, account)) {\\n            _roles[role].members[account] = true;\\n            emit RoleGranted(role, account, _msgSender());\\n        }\\n    }\\n\\n    /**\\n     * @dev Revokes `role` from `account`.\\n     *\\n     * Internal function without access restriction.\\n     *\\n     * May emit a {RoleRevoked} event.\\n     */\\n    function _revokeRole(bytes32 role, address account) internal virtual {\\n        if (hasRole(role, account)) {\\n            _roles[role].members[account] = false;\\n            emit RoleRevoked(role, account, _msgSender());\\n        }\\n    }\\n\\n    /**\\n     * @dev This empty reserved space is put in place to allow future versions to add new\\n     * variables without shifting down storage in the inheritance chain.\\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n     */\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xe8f27a3e3e25067334e76799f03d4de6d8f8535c3fc4806468228a9ebd5de51a\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControlUpgradeable {\\n    /**\\n     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n     *\\n     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n     * {RoleAdminChanged} not being emitted signaling this.\\n     *\\n     * _Available since v3.1._\\n     */\\n    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n    /**\\n     * @dev Emitted when `account` is granted `role`.\\n     *\\n     * `sender` is the account that originated the contract call, an admin role\\n     * bearer except when using {AccessControl-_setupRole}.\\n     */\\n    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n    /**\\n     * @dev Emitted when `account` is revoked `role`.\\n     *\\n     * `sender` is the account that originated the contract call:\\n     *   - if using `revokeRole`, it is the admin role bearer\\n     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n     */\\n    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n    /**\\n     * @dev Returns `true` if `account` has been granted `role`.\\n     */\\n    function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n    /**\\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\\n     * {revokeRole}.\\n     *\\n     * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n     */\\n    function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n    /**\\n     * @dev Grants `role` to `account`.\\n     *\\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\\n     * event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must have ``role``'s admin role.\\n     */\\n    function grantRole(bytes32 role, address account) external;\\n\\n    /**\\n     * @dev Revokes `role` from `account`.\\n     *\\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must have ``role``'s admin role.\\n     */\\n    function revokeRole(bytes32 role, address account) external;\\n\\n    /**\\n     * @dev Revokes `role` from the calling account.\\n     *\\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n     * purpose is to provide a mechanism for accounts to lose their privileges\\n     * if they are compromised (such as when a trusted device is misplaced).\\n     *\\n     * If the calling account had been granted `role`, emits a {RoleRevoked}\\n     * event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must be `account`.\\n     */\\n    function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0xb8f5302f12138c5561362e88a78d061573e6298b7a1a5afe84a1e2c8d4d5aeaa\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal onlyInitializing {\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal onlyInitializing {\\n        _transferOwnership(_msgSender());\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        _checkOwner();\\n        _;\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if the sender is not the owner.\\n     */\\n    function _checkOwner() internal view virtual {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        _transferOwnership(address(0));\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        _transferOwnership(newOwner);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Internal function without access restriction.\\n     */\\n    function _transferOwnership(address newOwner) internal virtual {\\n        address oldOwner = _owner;\\n        _owner = newOwner;\\n        emit OwnershipTransferred(oldOwner, newOwner);\\n    }\\n\\n    /**\\n     * @dev This empty reserved space is put in place to allow future versions to add new\\n     * variables without shifting down storage in the inheritance chain.\\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n     */\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x247c62047745915c0af6b955470a72d1696ebad4352d7d3011aef1a2463cd888\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822ProxiableUpgradeable {\\n    /**\\n     * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n     * address.\\n     *\\n     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n     * function revert if invoked through a proxy.\\n     */\\n    function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x77c89f893e403efc6929ba842b7ccf6534d4ffe03afe31670b4a528c0ad78c0f\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeaconUpgradeable.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\nimport \\\"../../utils/StorageSlotUpgradeable.sol\\\";\\nimport \\\"../utils/Initializable.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967UpgradeUpgradeable is Initializable {\\n    function __ERC1967Upgrade_init() internal onlyInitializing {\\n    }\\n\\n    function __ERC1967Upgrade_init_unchained() internal onlyInitializing {\\n    }\\n    // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n    bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n    /**\\n     * @dev Storage slot with the address of the current implementation.\\n     * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n     * validated in the constructor.\\n     */\\n    bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n    /**\\n     * @dev Emitted when the implementation is upgraded.\\n     */\\n    event Upgraded(address indexed implementation);\\n\\n    /**\\n     * @dev Returns the current implementation address.\\n     */\\n    function _getImplementation() internal view returns (address) {\\n        return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n    }\\n\\n    /**\\n     * @dev Stores a new address in the EIP1967 implementation slot.\\n     */\\n    function _setImplementation(address newImplementation) private {\\n        require(AddressUpgradeable.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n        StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n    }\\n\\n    /**\\n     * @dev Perform implementation upgrade\\n     *\\n     * Emits an {Upgraded} event.\\n     */\\n    function _upgradeTo(address newImplementation) internal {\\n        _setImplementation(newImplementation);\\n        emit Upgraded(newImplementation);\\n    }\\n\\n    /**\\n     * @dev Perform implementation upgrade with additional setup call.\\n     *\\n     * Emits an {Upgraded} event.\\n     */\\n    function _upgradeToAndCall(\\n        address newImplementation,\\n        bytes memory data,\\n        bool forceCall\\n    ) internal {\\n        _upgradeTo(newImplementation);\\n        if (data.length > 0 || forceCall) {\\n            _functionDelegateCall(newImplementation, data);\\n        }\\n    }\\n\\n    /**\\n     * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n     *\\n     * Emits an {Upgraded} event.\\n     */\\n    function _upgradeToAndCallUUPS(\\n        address newImplementation,\\n        bytes memory data,\\n        bool forceCall\\n    ) internal {\\n        // Upgrades from old implementations will perform a rollback test. This test requires the new\\n        // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n        // this special case will break upgrade paths from old UUPS implementation to new ones.\\n        if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n            _setImplementation(newImplementation);\\n        } else {\\n            try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n                require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n            } catch {\\n                revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n            }\\n            _upgradeToAndCall(newImplementation, data, forceCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Storage slot with the admin of the contract.\\n     * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n     * validated in the constructor.\\n     */\\n    bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n    /**\\n     * @dev Emitted when the admin account has changed.\\n     */\\n    event AdminChanged(address previousAdmin, address newAdmin);\\n\\n    /**\\n     * @dev Returns the current admin.\\n     */\\n    function _getAdmin() internal view returns (address) {\\n        return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;\\n    }\\n\\n    /**\\n     * @dev Stores a new address in the EIP1967 admin slot.\\n     */\\n    function _setAdmin(address newAdmin) private {\\n        require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n        StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n    }\\n\\n    /**\\n     * @dev Changes the admin of the proxy.\\n     *\\n     * Emits an {AdminChanged} event.\\n     */\\n    function _changeAdmin(address newAdmin) internal {\\n        emit AdminChanged(_getAdmin(), newAdmin);\\n        _setAdmin(newAdmin);\\n    }\\n\\n    /**\\n     * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n     * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n     */\\n    bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n    /**\\n     * @dev Emitted when the beacon is upgraded.\\n     */\\n    event BeaconUpgraded(address indexed beacon);\\n\\n    /**\\n     * @dev Returns the current beacon.\\n     */\\n    function _getBeacon() internal view returns (address) {\\n        return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;\\n    }\\n\\n    /**\\n     * @dev Stores a new beacon in the EIP1967 beacon slot.\\n     */\\n    function _setBeacon(address newBeacon) private {\\n        require(AddressUpgradeable.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n        require(\\n            AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),\\n            \\\"ERC1967: beacon implementation is not a contract\\\"\\n        );\\n        StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n    }\\n\\n    /**\\n     * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n     * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n     *\\n     * Emits a {BeaconUpgraded} event.\\n     */\\n    function _upgradeBeaconToAndCall(\\n        address newBeacon,\\n        bytes memory data,\\n        bool forceCall\\n    ) internal {\\n        _setBeacon(newBeacon);\\n        emit BeaconUpgraded(newBeacon);\\n        if (data.length > 0 || forceCall) {\\n            _functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);\\n        }\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a delegate call.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function _functionDelegateCall(address target, bytes memory data) private returns (bytes memory) {\\n        require(AddressUpgradeable.isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return AddressUpgradeable.verifyCallResult(success, returndata, \\\"Address: low-level delegate call failed\\\");\\n    }\\n\\n    /**\\n     * @dev This empty reserved space is put in place to allow future versions to add new\\n     * variables without shifting down storage in the inheritance chain.\\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n     */\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x315887e846f1e5f8d8fa535a229d318bb9290aaa69485117f1ee8a9a6b3be823\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeaconUpgradeable {\\n    /**\\n     * @dev Must return an address that can be used as a delegate call target.\\n     *\\n     * {BeaconProxy} will check that this address is a contract.\\n     */\\n    function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0x24b86ac8c005b8c654fbf6ac34a5a4f61580d7273541e83e013e89d66fbf0908\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n *     function initialize() initializer public {\\n *         __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n *     }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n *     function initializeV2() reinitializer(2) public {\\n *         __ERC20Permit_init(\\\"MyToken\\\");\\n *     }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n *     _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     * @custom:oz-retyped-from bool\\n     */\\n    uint8 private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Triggered when the contract has been initialized or reinitialized.\\n     */\\n    event Initialized(uint8 version);\\n\\n    /**\\n     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n     * `onlyInitializing` functions can be used to initialize parent contracts.\\n     *\\n     * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\\n     * constructor.\\n     *\\n     * Emits an {Initialized} event.\\n     */\\n    modifier initializer() {\\n        bool isTopLevelCall = !_initializing;\\n        require(\\n            (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\\n            \\\"Initializable: contract is already initialized\\\"\\n        );\\n        _initialized = 1;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n        }\\n        _;\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n            emit Initialized(1);\\n        }\\n    }\\n\\n    /**\\n     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n     * used to initialize parent contracts.\\n     *\\n     * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n     * are added through upgrades and that require initialization.\\n     *\\n     * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n     * cannot be nested. If one is invoked in the context of another, execution will revert.\\n     *\\n     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n     * a contract, executing them in the right order is up to the developer or operator.\\n     *\\n     * WARNING: setting the version to 255 will prevent any future reinitialization.\\n     *\\n     * Emits an {Initialized} event.\\n     */\\n    modifier reinitializer(uint8 version) {\\n        require(!_initializing && _initialized < version, \\\"Initializable: contract is already initialized\\\");\\n        _initialized = version;\\n        _initializing = true;\\n        _;\\n        _initializing = false;\\n        emit Initialized(version);\\n    }\\n\\n    /**\\n     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n     * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n     */\\n    modifier onlyInitializing() {\\n        require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n     * through proxies.\\n     *\\n     * Emits an {Initialized} event the first time it is successfully executed.\\n     */\\n    function _disableInitializers() internal virtual {\\n        require(!_initializing, \\\"Initializable: contract is initializing\\\");\\n        if (_initialized < type(uint8).max) {\\n            _initialized = type(uint8).max;\\n            emit Initialized(type(uint8).max);\\n        }\\n    }\\n\\n    /**\\n     * @dev Internal function that returns the initialized version. Returns `_initialized`\\n     */\\n    function _getInitializedVersion() internal view returns (uint8) {\\n        return _initialized;\\n    }\\n\\n    /**\\n     * @dev Internal function that returns the initialized version. Returns `_initializing`\\n     */\\n    function _isInitializing() internal view returns (bool) {\\n        return _initializing;\\n    }\\n}\\n\",\"keccak256\":\"0xe798cadb41e2da274913e4b3183a80f50fb057a42238fe8467e077268100ec27\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../ERC1967/ERC1967UpgradeUpgradeable.sol\\\";\\nimport \\\"./Initializable.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable {\\n    function __UUPSUpgradeable_init() internal onlyInitializing {\\n    }\\n\\n    function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\\n    }\\n    /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n    address private immutable __self = address(this);\\n\\n    /**\\n     * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n     * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n     * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n     * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n     * fail.\\n     */\\n    modifier onlyProxy() {\\n        require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n        require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n     * callable on the implementing contract but not through proxies.\\n     */\\n    modifier notDelegated() {\\n        require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n     * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n     *\\n     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n     * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n     */\\n    function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n        return _IMPLEMENTATION_SLOT;\\n    }\\n\\n    /**\\n     * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n     *\\n     * Calls {_authorizeUpgrade}.\\n     *\\n     * Emits an {Upgraded} event.\\n     */\\n    function upgradeTo(address newImplementation) external virtual onlyProxy {\\n        _authorizeUpgrade(newImplementation);\\n        _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n    }\\n\\n    /**\\n     * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n     * encoded in `data`.\\n     *\\n     * Calls {_authorizeUpgrade}.\\n     *\\n     * Emits an {Upgraded} event.\\n     */\\n    function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy {\\n        _authorizeUpgrade(newImplementation);\\n        _upgradeToAndCallUUPS(newImplementation, data, true);\\n    }\\n\\n    /**\\n     * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n     * {upgradeTo} and {upgradeToAndCall}.\\n     *\\n     * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n     *\\n     * ```solidity\\n     * function _authorizeUpgrade(address) internal override onlyOwner {}\\n     * ```\\n     */\\n    function _authorizeUpgrade(address newImplementation) internal virtual;\\n\\n    /**\\n     * @dev This empty reserved space is put in place to allow future versions to add new\\n     * variables without shifting down storage in the inheritance chain.\\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n     */\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x7967d130887c4b40666cd88f8744691d4527039a1b2a38aa0de41481ef646778\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n     *\\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n     * constructor.\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize/address.code.length, which returns 0\\n        // for contracts in construction, since the code is only stored at the end\\n        // of the constructor execution.\\n\\n        return account.code.length > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain `call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(\\n        address target,\\n        bytes memory data,\\n        uint256 value\\n    ) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(\\n        address target,\\n        bytes memory data,\\n        uint256 value,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n     *\\n     * _Available since v4.8._\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata,\\n        string memory errorMessage\\n    ) internal view returns (bytes memory) {\\n        if (success) {\\n            if (returndata.length == 0) {\\n                // only check isContract if the call was successful and the return data is empty\\n                // otherwise we already know that it was a contract\\n                require(isContract(target), \\\"Address: call to non-contract\\\");\\n            }\\n            return returndata;\\n        } else {\\n            _revert(returndata, errorMessage);\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n     * revert reason or using the provided one.\\n     *\\n     * _Available since v4.3._\\n     */\\n    function verifyCallResult(\\n        bool success,\\n        bytes memory returndata,\\n        string memory errorMessage\\n    ) internal pure returns (bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            _revert(returndata, errorMessage);\\n        }\\n    }\\n\\n    function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n        // Look for revert reason and bubble it up if present\\n        if (returndata.length > 0) {\\n            // The easiest way to bubble the revert reason is using memory via assembly\\n            /// @solidity memory-safe-assembly\\n            assembly {\\n                let returndata_size := mload(returndata)\\n                revert(add(32, returndata), returndata_size)\\n            }\\n        } else {\\n            revert(errorMessage);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x2edcb41c121abc510932e8d83ff8b82cf9cdde35e7c297622f5c29ef0af25183\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal onlyInitializing {\\n    }\\n\\n    function __Context_init_unchained() internal onlyInitializing {\\n    }\\n    function _msgSender() internal view virtual returns (address) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        return msg.data;\\n    }\\n\\n    /**\\n     * @dev This empty reserved space is put in place to allow future versions to add new\\n     * variables without shifting down storage in the inheritance chain.\\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n     */\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n *     function _getImplementation() internal view returns (address) {\\n *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n *     }\\n *\\n *     function _setImplementation(address newImplementation) internal {\\n *         require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary StorageSlotUpgradeable {\\n    struct AddressSlot {\\n        address value;\\n    }\\n\\n    struct BooleanSlot {\\n        bool value;\\n    }\\n\\n    struct Bytes32Slot {\\n        bytes32 value;\\n    }\\n\\n    struct Uint256Slot {\\n        uint256 value;\\n    }\\n\\n    /**\\n     * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n     */\\n    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n        /// @solidity memory-safe-assembly\\n        assembly {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        /// @solidity memory-safe-assembly\\n        assembly {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        /// @solidity memory-safe-assembly\\n        assembly {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        /// @solidity memory-safe-assembly\\n        assembly {\\n            r.slot := slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x09864aea84f01e39313375b5610c73a3c1c68abbdc51e5ccdd25ff977fdadf9a\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/MathUpgradeable.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary StringsUpgradeable {\\n    bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n    uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n    /**\\n     * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n     */\\n    function toString(uint256 value) internal pure returns (string memory) {\\n        unchecked {\\n            uint256 length = MathUpgradeable.log10(value) + 1;\\n            string memory buffer = new string(length);\\n            uint256 ptr;\\n            /// @solidity memory-safe-assembly\\n            assembly {\\n                ptr := add(buffer, add(32, length))\\n            }\\n            while (true) {\\n                ptr--;\\n                /// @solidity memory-safe-assembly\\n                assembly {\\n                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n                }\\n                value /= 10;\\n                if (value == 0) break;\\n            }\\n            return buffer;\\n        }\\n    }\\n\\n    /**\\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n     */\\n    function toHexString(uint256 value) internal pure returns (string memory) {\\n        unchecked {\\n            return toHexString(value, MathUpgradeable.log256(value) + 1);\\n        }\\n    }\\n\\n    /**\\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n     */\\n    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n        bytes memory buffer = new bytes(2 * length + 2);\\n        buffer[0] = \\\"0\\\";\\n        buffer[1] = \\\"x\\\";\\n        for (uint256 i = 2 * length + 1; i > 1; --i) {\\n            buffer[i] = _SYMBOLS[value & 0xf];\\n            value >>= 4;\\n        }\\n        require(value == 0, \\\"Strings: hex length insufficient\\\");\\n        return string(buffer);\\n    }\\n\\n    /**\\n     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n     */\\n    function toHexString(address addr) internal pure returns (string memory) {\\n        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n    }\\n}\\n\",\"keccak256\":\"0x6b9a5d35b744b25529a2856a8093e7c03fb35a34b1c4fb5499e560f8ade140da\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165Upgradeable.sol\\\";\\nimport \\\"../../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable {\\n    function __ERC165_init() internal onlyInitializing {\\n    }\\n\\n    function __ERC165_init_unchained() internal onlyInitializing {\\n    }\\n    /**\\n     * @dev See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n        return interfaceId == type(IERC165Upgradeable).interfaceId;\\n    }\\n\\n    /**\\n     * @dev This empty reserved space is put in place to allow future versions to add new\\n     * variables without shifting down storage in the inheritance chain.\\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n     */\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x9a3b990bd56d139df3e454a9edf1c64668530b5a77fc32eb063bc206f958274a\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xc6cef87559d0aeffdf0a99803de655938a7779ec0a3cd5d4383483ad85565a09\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary MathUpgradeable {\\n    enum Rounding {\\n        Down, // Toward negative infinity\\n        Up, // Toward infinity\\n        Zero // Toward zero\\n    }\\n\\n    /**\\n     * @dev Returns the largest of two numbers.\\n     */\\n    function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a > b ? a : b;\\n    }\\n\\n    /**\\n     * @dev Returns the smallest of two numbers.\\n     */\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a < b ? a : b;\\n    }\\n\\n    /**\\n     * @dev Returns the average of two numbers. The result is rounded towards\\n     * zero.\\n     */\\n    function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // (a + b) / 2 can overflow.\\n        return (a & b) + (a ^ b) / 2;\\n    }\\n\\n    /**\\n     * @dev Returns the ceiling of the division of two numbers.\\n     *\\n     * This differs from standard division with `/` in that it rounds up instead\\n     * of rounding down.\\n     */\\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // (a + b - 1) / b can overflow on addition, so we distribute.\\n        return a == 0 ? 0 : (a - 1) / b + 1;\\n    }\\n\\n    /**\\n     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n     * with further edits by Uniswap Labs also under MIT license.\\n     */\\n    function mulDiv(\\n        uint256 x,\\n        uint256 y,\\n        uint256 denominator\\n    ) internal pure returns (uint256 result) {\\n        unchecked {\\n            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n            // variables such that product = prod1 * 2^256 + prod0.\\n            uint256 prod0; // Least significant 256 bits of the product\\n            uint256 prod1; // Most significant 256 bits of the product\\n            assembly {\\n                let mm := mulmod(x, y, not(0))\\n                prod0 := mul(x, y)\\n                prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n            }\\n\\n            // Handle non-overflow cases, 256 by 256 division.\\n            if (prod1 == 0) {\\n                return prod0 / denominator;\\n            }\\n\\n            // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n            require(denominator > prod1);\\n\\n            ///////////////////////////////////////////////\\n            // 512 by 256 division.\\n            ///////////////////////////////////////////////\\n\\n            // Make division exact by subtracting the remainder from [prod1 prod0].\\n            uint256 remainder;\\n            assembly {\\n                // Compute remainder using mulmod.\\n                remainder := mulmod(x, y, denominator)\\n\\n                // Subtract 256 bit number from 512 bit number.\\n                prod1 := sub(prod1, gt(remainder, prod0))\\n                prod0 := sub(prod0, remainder)\\n            }\\n\\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n            // See https://cs.stackexchange.com/q/138556/92363.\\n\\n            // Does not overflow because the denominator cannot be zero at this stage in the function.\\n            uint256 twos = denominator & (~denominator + 1);\\n            assembly {\\n                // Divide denominator by twos.\\n                denominator := div(denominator, twos)\\n\\n                // Divide [prod1 prod0] by twos.\\n                prod0 := div(prod0, twos)\\n\\n                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n                twos := add(div(sub(0, twos), twos), 1)\\n            }\\n\\n            // Shift in bits from prod1 into prod0.\\n            prod0 |= prod1 * twos;\\n\\n            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n            // four bits. That is, denominator * inv = 1 mod 2^4.\\n            uint256 inverse = (3 * denominator) ^ 2;\\n\\n            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n            // in modular arithmetic, doubling the correct bits in each step.\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n            // is no longer required.\\n            result = prod0 * inverse;\\n            return result;\\n        }\\n    }\\n\\n    /**\\n     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n     */\\n    function mulDiv(\\n        uint256 x,\\n        uint256 y,\\n        uint256 denominator,\\n        Rounding rounding\\n    ) internal pure returns (uint256) {\\n        uint256 result = mulDiv(x, y, denominator);\\n        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n            result += 1;\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n     *\\n     * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n     */\\n    function sqrt(uint256 a) internal pure returns (uint256) {\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n        //\\n        // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n        //\\n        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n        // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n        // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n        //\\n        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n        uint256 result = 1 << (log2(a) >> 1);\\n\\n        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n        // into the expected uint128 result.\\n        unchecked {\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            return min(result, a / result);\\n        }\\n    }\\n\\n    /**\\n     * @notice Calculates sqrt(a), following the selected rounding direction.\\n     */\\n    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n        unchecked {\\n            uint256 result = sqrt(a);\\n            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 2, rounded down, of a positive value.\\n     * Returns 0 if given 0.\\n     */\\n    function log2(uint256 value) internal pure returns (uint256) {\\n        uint256 result = 0;\\n        unchecked {\\n            if (value >> 128 > 0) {\\n                value >>= 128;\\n                result += 128;\\n            }\\n            if (value >> 64 > 0) {\\n                value >>= 64;\\n                result += 64;\\n            }\\n            if (value >> 32 > 0) {\\n                value >>= 32;\\n                result += 32;\\n            }\\n            if (value >> 16 > 0) {\\n                value >>= 16;\\n                result += 16;\\n            }\\n            if (value >> 8 > 0) {\\n                value >>= 8;\\n                result += 8;\\n            }\\n            if (value >> 4 > 0) {\\n                value >>= 4;\\n                result += 4;\\n            }\\n            if (value >> 2 > 0) {\\n                value >>= 2;\\n                result += 2;\\n            }\\n            if (value >> 1 > 0) {\\n                result += 1;\\n            }\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n     * Returns 0 if given 0.\\n     */\\n    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n        unchecked {\\n            uint256 result = log2(value);\\n            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 10, rounded down, of a positive value.\\n     * Returns 0 if given 0.\\n     */\\n    function log10(uint256 value) internal pure returns (uint256) {\\n        uint256 result = 0;\\n        unchecked {\\n            if (value >= 10**64) {\\n                value /= 10**64;\\n                result += 64;\\n            }\\n            if (value >= 10**32) {\\n                value /= 10**32;\\n                result += 32;\\n            }\\n            if (value >= 10**16) {\\n                value /= 10**16;\\n                result += 16;\\n            }\\n            if (value >= 10**8) {\\n                value /= 10**8;\\n                result += 8;\\n            }\\n            if (value >= 10**4) {\\n                value /= 10**4;\\n                result += 4;\\n            }\\n            if (value >= 10**2) {\\n                value /= 10**2;\\n                result += 2;\\n            }\\n            if (value >= 10**1) {\\n                result += 1;\\n            }\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n     * Returns 0 if given 0.\\n     */\\n    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n        unchecked {\\n            uint256 result = log10(value);\\n            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 256, rounded down, of a positive value.\\n     * Returns 0 if given 0.\\n     *\\n     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n     */\\n    function log256(uint256 value) internal pure returns (uint256) {\\n        uint256 result = 0;\\n        unchecked {\\n            if (value >> 128 > 0) {\\n                value >>= 128;\\n                result += 16;\\n            }\\n            if (value >> 64 > 0) {\\n                value >>= 64;\\n                result += 8;\\n            }\\n            if (value >> 32 > 0) {\\n                value >>= 32;\\n                result += 4;\\n            }\\n            if (value >> 16 > 0) {\\n                value >>= 16;\\n                result += 2;\\n            }\\n            if (value >> 8 > 0) {\\n                result += 1;\\n            }\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n     * Returns 0 if given 0.\\n     */\\n    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n        unchecked {\\n            uint256 result = log256(value);\\n            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xc1bd5b53319c68f84e3becd75694d941e8f4be94049903232cd8bc7c535aaa5a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n    /**\\n     * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n     * address.\\n     *\\n     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n     * function revert if invoked through a proxy.\\n     */\\n    function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n    // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n    bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n    /**\\n     * @dev Storage slot with the address of the current implementation.\\n     * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n     * validated in the constructor.\\n     */\\n    bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n    /**\\n     * @dev Emitted when the implementation is upgraded.\\n     */\\n    event Upgraded(address indexed implementation);\\n\\n    /**\\n     * @dev Returns the current implementation address.\\n     */\\n    function _getImplementation() internal view returns (address) {\\n        return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n    }\\n\\n    /**\\n     * @dev Stores a new address in the EIP1967 implementation slot.\\n     */\\n    function _setImplementation(address newImplementation) private {\\n        require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n        StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n    }\\n\\n    /**\\n     * @dev Perform implementation upgrade\\n     *\\n     * Emits an {Upgraded} event.\\n     */\\n    function _upgradeTo(address newImplementation) internal {\\n        _setImplementation(newImplementation);\\n        emit Upgraded(newImplementation);\\n    }\\n\\n    /**\\n     * @dev Perform implementation upgrade with additional setup call.\\n     *\\n     * Emits an {Upgraded} event.\\n     */\\n    function _upgradeToAndCall(\\n        address newImplementation,\\n        bytes memory data,\\n        bool forceCall\\n    ) internal {\\n        _upgradeTo(newImplementation);\\n        if (data.length > 0 || forceCall) {\\n            Address.functionDelegateCall(newImplementation, data);\\n        }\\n    }\\n\\n    /**\\n     * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n     *\\n     * Emits an {Upgraded} event.\\n     */\\n    function _upgradeToAndCallUUPS(\\n        address newImplementation,\\n        bytes memory data,\\n        bool forceCall\\n    ) internal {\\n        // Upgrades from old implementations will perform a rollback test. This test requires the new\\n        // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n        // this special case will break upgrade paths from old UUPS implementation to new ones.\\n        if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n            _setImplementation(newImplementation);\\n        } else {\\n            try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n                require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n            } catch {\\n                revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n            }\\n            _upgradeToAndCall(newImplementation, data, forceCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Storage slot with the admin of the contract.\\n     * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n     * validated in the constructor.\\n     */\\n    bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n    /**\\n     * @dev Emitted when the admin account has changed.\\n     */\\n    event AdminChanged(address previousAdmin, address newAdmin);\\n\\n    /**\\n     * @dev Returns the current admin.\\n     */\\n    function _getAdmin() internal view returns (address) {\\n        return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n    }\\n\\n    /**\\n     * @dev Stores a new address in the EIP1967 admin slot.\\n     */\\n    function _setAdmin(address newAdmin) private {\\n        require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n        StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n    }\\n\\n    /**\\n     * @dev Changes the admin of the proxy.\\n     *\\n     * Emits an {AdminChanged} event.\\n     */\\n    function _changeAdmin(address newAdmin) internal {\\n        emit AdminChanged(_getAdmin(), newAdmin);\\n        _setAdmin(newAdmin);\\n    }\\n\\n    /**\\n     * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n     * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n     */\\n    bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n    /**\\n     * @dev Emitted when the beacon is upgraded.\\n     */\\n    event BeaconUpgraded(address indexed beacon);\\n\\n    /**\\n     * @dev Returns the current beacon.\\n     */\\n    function _getBeacon() internal view returns (address) {\\n        return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n    }\\n\\n    /**\\n     * @dev Stores a new beacon in the EIP1967 beacon slot.\\n     */\\n    function _setBeacon(address newBeacon) private {\\n        require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n        require(\\n            Address.isContract(IBeacon(newBeacon).implementation()),\\n            \\\"ERC1967: beacon implementation is not a contract\\\"\\n        );\\n        StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n    }\\n\\n    /**\\n     * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n     * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n     *\\n     * Emits a {BeaconUpgraded} event.\\n     */\\n    function _upgradeBeaconToAndCall(\\n        address newBeacon,\\n        bytes memory data,\\n        bool forceCall\\n    ) internal {\\n        _setBeacon(newBeacon);\\n        emit BeaconUpgraded(newBeacon);\\n        if (data.length > 0 || forceCall) {\\n            Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xabf3f59bc0e5423eae45e459dbe92e7052c6983628d39008590edc852a62f94a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n    /**\\n     * @dev Delegates the current call to `implementation`.\\n     *\\n     * This function does not return to its internal call site, it will return directly to the external caller.\\n     */\\n    function _delegate(address implementation) internal virtual {\\n        assembly {\\n            // Copy msg.data. We take full control of memory in this inline assembly\\n            // block because it will not return to Solidity code. We overwrite the\\n            // Solidity scratch pad at memory position 0.\\n            calldatacopy(0, 0, calldatasize())\\n\\n            // Call the implementation.\\n            // out and outsize are 0 because we don't know the size yet.\\n            let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n            // Copy the returned data.\\n            returndatacopy(0, 0, returndatasize())\\n\\n            switch result\\n            // delegatecall returns 0 on error.\\n            case 0 {\\n                revert(0, returndatasize())\\n            }\\n            default {\\n                return(0, returndatasize())\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\\n     * and {_fallback} should delegate.\\n     */\\n    function _implementation() internal view virtual returns (address);\\n\\n    /**\\n     * @dev Delegates the current call to the address returned by `_implementation()`.\\n     *\\n     * This function does not return to its internal call site, it will return directly to the external caller.\\n     */\\n    function _fallback() internal virtual {\\n        _beforeFallback();\\n        _delegate(_implementation());\\n    }\\n\\n    /**\\n     * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n     * function in the contract matches the call data.\\n     */\\n    fallback() external payable virtual {\\n        _fallback();\\n    }\\n\\n    /**\\n     * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n     * is empty.\\n     */\\n    receive() external payable virtual {\\n        _fallback();\\n    }\\n\\n    /**\\n     * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n     * call, or as part of the Solidity `fallback` or `receive` functions.\\n     *\\n     * If overridden should call `super._beforeFallback()`.\\n     */\\n    function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xc130fe33f1b2132158531a87734153293f6d07bc263ff4ac90e85da9c82c0e27\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n    /**\\n     * @dev Must return an address that can be used as a delegate call target.\\n     *\\n     * {BeaconProxy} will check that this address is a contract.\\n     */\\n    function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `from` to `to` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() external view returns (string memory);\\n\\n    /**\\n     * @dev Returns the symbol of the token.\\n     */\\n    function symbol() external view returns (string memory);\\n\\n    /**\\n     * @dev Returns the decimals places of the token.\\n     */\\n    function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n     *\\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n     * constructor.\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize/address.code.length, which returns 0\\n        // for contracts in construction, since the code is only stored at the end\\n        // of the constructor execution.\\n\\n        return account.code.length > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain `call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(\\n        address target,\\n        bytes memory data,\\n        uint256 value\\n    ) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(\\n        address target,\\n        bytes memory data,\\n        uint256 value,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a delegate call.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function functionDelegateCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n     *\\n     * _Available since v4.8._\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata,\\n        string memory errorMessage\\n    ) internal view returns (bytes memory) {\\n        if (success) {\\n            if (returndata.length == 0) {\\n                // only check isContract if the call was successful and the return data is empty\\n                // otherwise we already know that it was a contract\\n                require(isContract(target), \\\"Address: call to non-contract\\\");\\n            }\\n            return returndata;\\n        } else {\\n            _revert(returndata, errorMessage);\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n     * revert reason or using the provided one.\\n     *\\n     * _Available since v4.3._\\n     */\\n    function verifyCallResult(\\n        bool success,\\n        bytes memory returndata,\\n        string memory errorMessage\\n    ) internal pure returns (bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            _revert(returndata, errorMessage);\\n        }\\n    }\\n\\n    function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n        // Look for revert reason and bubble it up if present\\n        if (returndata.length > 0) {\\n            // The easiest way to bubble the revert reason is using memory via assembly\\n            /// @solidity memory-safe-assembly\\n            assembly {\\n                let returndata_size := mload(returndata)\\n                revert(add(32, returndata), returndata_size)\\n            }\\n        } else {\\n            revert(errorMessage);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n *     function _getImplementation() internal view returns (address) {\\n *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n *     }\\n *\\n *     function _setImplementation(address newImplementation) internal {\\n *         require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary StorageSlot {\\n    struct AddressSlot {\\n        address value;\\n    }\\n\\n    struct BooleanSlot {\\n        bool value;\\n    }\\n\\n    struct Bytes32Slot {\\n        bytes32 value;\\n    }\\n\\n    struct Uint256Slot {\\n        uint256 value;\\n    }\\n\\n    /**\\n     * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n     */\\n    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n        /// @solidity memory-safe-assembly\\n        assembly {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        /// @solidity memory-safe-assembly\\n        assembly {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        /// @solidity memory-safe-assembly\\n        assembly {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        /// @solidity memory-safe-assembly\\n        assembly {\\n            r.slot := slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xd5c50c54bf02740ebd122ff06832546cb5fa84486d52695a9ccfd11666e0c81d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n    bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n    uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n    /**\\n     * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n     */\\n    function toString(uint256 value) internal pure returns (string memory) {\\n        unchecked {\\n            uint256 length = Math.log10(value) + 1;\\n            string memory buffer = new string(length);\\n            uint256 ptr;\\n            /// @solidity memory-safe-assembly\\n            assembly {\\n                ptr := add(buffer, add(32, length))\\n            }\\n            while (true) {\\n                ptr--;\\n                /// @solidity memory-safe-assembly\\n                assembly {\\n                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n                }\\n                value /= 10;\\n                if (value == 0) break;\\n            }\\n            return buffer;\\n        }\\n    }\\n\\n    /**\\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n     */\\n    function toHexString(uint256 value) internal pure returns (string memory) {\\n        unchecked {\\n            return toHexString(value, Math.log256(value) + 1);\\n        }\\n    }\\n\\n    /**\\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n     */\\n    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n        bytes memory buffer = new bytes(2 * length + 2);\\n        buffer[0] = \\\"0\\\";\\n        buffer[1] = \\\"x\\\";\\n        for (uint256 i = 2 * length + 1; i > 1; --i) {\\n            buffer[i] = _SYMBOLS[value & 0xf];\\n            value >>= 4;\\n        }\\n        require(value == 0, \\\"Strings: hex length insufficient\\\");\\n        return string(buffer);\\n    }\\n\\n    /**\\n     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n     */\\n    function toHexString(address addr) internal pure returns (string memory) {\\n        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n    }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n    enum RecoverError {\\n        NoError,\\n        InvalidSignature,\\n        InvalidSignatureLength,\\n        InvalidSignatureS,\\n        InvalidSignatureV // Deprecated in v4.8\\n    }\\n\\n    function _throwError(RecoverError error) private pure {\\n        if (error == RecoverError.NoError) {\\n            return; // no error: do nothing\\n        } else if (error == RecoverError.InvalidSignature) {\\n            revert(\\\"ECDSA: invalid signature\\\");\\n        } else if (error == RecoverError.InvalidSignatureLength) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        } else if (error == RecoverError.InvalidSignatureS) {\\n            revert(\\\"ECDSA: invalid signature 's' value\\\");\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature` or error string. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     *\\n     * Documentation for signature generation:\\n     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n     *\\n     * _Available since v4.3._\\n     */\\n    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n        if (signature.length == 65) {\\n            bytes32 r;\\n            bytes32 s;\\n            uint8 v;\\n            // ecrecover takes the signature parameters, and the only way to get them\\n            // currently is to use assembly.\\n            /// @solidity memory-safe-assembly\\n            assembly {\\n                r := mload(add(signature, 0x20))\\n                s := mload(add(signature, 0x40))\\n                v := byte(0, mload(add(signature, 0x60)))\\n            }\\n            return tryRecover(hash, v, r, s);\\n        } else {\\n            return (address(0), RecoverError.InvalidSignatureLength);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        (address recovered, RecoverError error) = tryRecover(hash, signature);\\n        _throwError(error);\\n        return recovered;\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n     *\\n     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n     *\\n     * _Available since v4.3._\\n     */\\n    function tryRecover(\\n        bytes32 hash,\\n        bytes32 r,\\n        bytes32 vs\\n    ) internal pure returns (address, RecoverError) {\\n        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n        uint8 v = uint8((uint256(vs) >> 255) + 27);\\n        return tryRecover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n     *\\n     * _Available since v4.2._\\n     */\\n    function recover(\\n        bytes32 hash,\\n        bytes32 r,\\n        bytes32 vs\\n    ) internal pure returns (address) {\\n        (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n        _throwError(error);\\n        return recovered;\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     *\\n     * _Available since v4.3._\\n     */\\n    function tryRecover(\\n        bytes32 hash,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) internal pure returns (address, RecoverError) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n            return (address(0), RecoverError.InvalidSignatureS);\\n        }\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        if (signer == address(0)) {\\n            return (address(0), RecoverError.InvalidSignature);\\n        }\\n\\n        return (signer, RecoverError.NoError);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(\\n        bytes32 hash,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) internal pure returns (address) {\\n        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n        _throwError(error);\\n        return recovered;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * produces hash corresponding to the one signed with the\\n     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n     * JSON-RPC method as part of EIP-191.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from `s`. This\\n     * produces hash corresponding to the one signed with the\\n     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n     * JSON-RPC method as part of EIP-191.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Typed Data, created from a\\n     * `domainSeparator` and a `structHash`. This produces hash corresponding\\n     * to the one signed with the\\n     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n     * JSON-RPC method as part of EIP-712.\\n     *\\n     * See {recover}.\\n     */\\n    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n    }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n    enum Rounding {\\n        Down, // Toward negative infinity\\n        Up, // Toward infinity\\n        Zero // Toward zero\\n    }\\n\\n    /**\\n     * @dev Returns the largest of two numbers.\\n     */\\n    function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a > b ? a : b;\\n    }\\n\\n    /**\\n     * @dev Returns the smallest of two numbers.\\n     */\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a < b ? a : b;\\n    }\\n\\n    /**\\n     * @dev Returns the average of two numbers. The result is rounded towards\\n     * zero.\\n     */\\n    function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // (a + b) / 2 can overflow.\\n        return (a & b) + (a ^ b) / 2;\\n    }\\n\\n    /**\\n     * @dev Returns the ceiling of the division of two numbers.\\n     *\\n     * This differs from standard division with `/` in that it rounds up instead\\n     * of rounding down.\\n     */\\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // (a + b - 1) / b can overflow on addition, so we distribute.\\n        return a == 0 ? 0 : (a - 1) / b + 1;\\n    }\\n\\n    /**\\n     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n     * with further edits by Uniswap Labs also under MIT license.\\n     */\\n    function mulDiv(\\n        uint256 x,\\n        uint256 y,\\n        uint256 denominator\\n    ) internal pure returns (uint256 result) {\\n        unchecked {\\n            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n            // variables such that product = prod1 * 2^256 + prod0.\\n            uint256 prod0; // Least significant 256 bits of the product\\n            uint256 prod1; // Most significant 256 bits of the product\\n            assembly {\\n                let mm := mulmod(x, y, not(0))\\n                prod0 := mul(x, y)\\n                prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n            }\\n\\n            // Handle non-overflow cases, 256 by 256 division.\\n            if (prod1 == 0) {\\n                return prod0 / denominator;\\n            }\\n\\n            // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n            require(denominator > prod1);\\n\\n            ///////////////////////////////////////////////\\n            // 512 by 256 division.\\n            ///////////////////////////////////////////////\\n\\n            // Make division exact by subtracting the remainder from [prod1 prod0].\\n            uint256 remainder;\\n            assembly {\\n                // Compute remainder using mulmod.\\n                remainder := mulmod(x, y, denominator)\\n\\n                // Subtract 256 bit number from 512 bit number.\\n                prod1 := sub(prod1, gt(remainder, prod0))\\n                prod0 := sub(prod0, remainder)\\n            }\\n\\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n            // See https://cs.stackexchange.com/q/138556/92363.\\n\\n            // Does not overflow because the denominator cannot be zero at this stage in the function.\\n            uint256 twos = denominator & (~denominator + 1);\\n            assembly {\\n                // Divide denominator by twos.\\n                denominator := div(denominator, twos)\\n\\n                // Divide [prod1 prod0] by twos.\\n                prod0 := div(prod0, twos)\\n\\n                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n                twos := add(div(sub(0, twos), twos), 1)\\n            }\\n\\n            // Shift in bits from prod1 into prod0.\\n            prod0 |= prod1 * twos;\\n\\n            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n            // four bits. That is, denominator * inv = 1 mod 2^4.\\n            uint256 inverse = (3 * denominator) ^ 2;\\n\\n            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n            // in modular arithmetic, doubling the correct bits in each step.\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n            // is no longer required.\\n            result = prod0 * inverse;\\n            return result;\\n        }\\n    }\\n\\n    /**\\n     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n     */\\n    function mulDiv(\\n        uint256 x,\\n        uint256 y,\\n        uint256 denominator,\\n        Rounding rounding\\n    ) internal pure returns (uint256) {\\n        uint256 result = mulDiv(x, y, denominator);\\n        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n            result += 1;\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n     *\\n     * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n     */\\n    function sqrt(uint256 a) internal pure returns (uint256) {\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n        //\\n        // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n        //\\n        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n        // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n        // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n        //\\n        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n        uint256 result = 1 << (log2(a) >> 1);\\n\\n        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n        // into the expected uint128 result.\\n        unchecked {\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            return min(result, a / result);\\n        }\\n    }\\n\\n    /**\\n     * @notice Calculates sqrt(a), following the selected rounding direction.\\n     */\\n    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n        unchecked {\\n            uint256 result = sqrt(a);\\n            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 2, rounded down, of a positive value.\\n     * Returns 0 if given 0.\\n     */\\n    function log2(uint256 value) internal pure returns (uint256) {\\n        uint256 result = 0;\\n        unchecked {\\n            if (value >> 128 > 0) {\\n                value >>= 128;\\n                result += 128;\\n            }\\n            if (value >> 64 > 0) {\\n                value >>= 64;\\n                result += 64;\\n            }\\n            if (value >> 32 > 0) {\\n                value >>= 32;\\n                result += 32;\\n            }\\n            if (value >> 16 > 0) {\\n                value >>= 16;\\n                result += 16;\\n            }\\n            if (value >> 8 > 0) {\\n                value >>= 8;\\n                result += 8;\\n            }\\n            if (value >> 4 > 0) {\\n                value >>= 4;\\n                result += 4;\\n            }\\n            if (value >> 2 > 0) {\\n                value >>= 2;\\n                result += 2;\\n            }\\n            if (value >> 1 > 0) {\\n                result += 1;\\n            }\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n     * Returns 0 if given 0.\\n     */\\n    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n        unchecked {\\n            uint256 result = log2(value);\\n            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 10, rounded down, of a positive value.\\n     * Returns 0 if given 0.\\n     */\\n    function log10(uint256 value) internal pure returns (uint256) {\\n        uint256 result = 0;\\n        unchecked {\\n            if (value >= 10**64) {\\n                value /= 10**64;\\n                result += 64;\\n            }\\n            if (value >= 10**32) {\\n                value /= 10**32;\\n                result += 32;\\n            }\\n            if (value >= 10**16) {\\n                value /= 10**16;\\n                result += 16;\\n            }\\n            if (value >= 10**8) {\\n                value /= 10**8;\\n                result += 8;\\n            }\\n            if (value >= 10**4) {\\n                value /= 10**4;\\n                result += 4;\\n            }\\n            if (value >= 10**2) {\\n                value /= 10**2;\\n                result += 2;\\n            }\\n            if (value >= 10**1) {\\n                result += 1;\\n            }\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n     * Returns 0 if given 0.\\n     */\\n    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n        unchecked {\\n            uint256 result = log10(value);\\n            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 256, rounded down, of a positive value.\\n     * Returns 0 if given 0.\\n     *\\n     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n     */\\n    function log256(uint256 value) internal pure returns (uint256) {\\n        uint256 result = 0;\\n        unchecked {\\n            if (value >> 128 > 0) {\\n                value >>= 128;\\n                result += 16;\\n            }\\n            if (value >> 64 > 0) {\\n                value >>= 64;\\n                result += 8;\\n            }\\n            if (value >> 32 > 0) {\\n                value >>= 32;\\n                result += 4;\\n            }\\n            if (value >> 16 > 0) {\\n                value >>= 16;\\n                result += 2;\\n            }\\n            if (value >> 8 > 0) {\\n                result += 1;\\n            }\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n     * Returns 0 if given 0.\\n     */\\n    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n        unchecked {\\n            uint256 result = log256(value);\\n            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"contracts/messagePassingBridge/AxelarHandlerUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.0;\\n\\nimport {IAxelarGasService} from '@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGasService.sol';\\nimport {AxelarExecutable} from '@axelar-network/axelar-gmp-sdk-solidity/contracts/executable/AxelarExecutable.sol';\\nimport {StringToAddress, AddressToString} from '@axelar-network/axelar-gmp-sdk-solidity/contracts/utils/AddressString.sol';\\nimport '@openzeppelin/contracts/utils/Strings.sol';\\n\\n/**\\n * @title AxelarHandlerUpgradeable\\n * @dev A contract for using axelar for bridging\\n */\\nabstract contract AxelarHandlerUpgradeable is AxelarExecutable {\\n    using StringToAddress for string;\\n    using AddressToString for address;\\n\\n    // An interface for the gas service contract\\n    IAxelarGasService public immutable gasService;\\n\\n    constructor(address gateway, address gasReceiver) AxelarExecutable(gateway) {\\n        gasService = IAxelarGasService(gasReceiver);\\n    }\\n\\n    function _axelarBridgeTo(bytes memory payload, string memory targetChainId) internal virtual {\\n        string memory stringAddress = address(this).toString();\\n        gasService.payNativeGasForContractCall{value: msg.value}(\\n            address(this),\\n            targetChainId,\\n            stringAddress,\\n            payload,\\n            msg.sender\\n        );\\n        gateway.callContract(targetChainId, stringAddress, payload);\\n    }\\n\\n    /**\\n     * @dev Executes a transfer, override axelar execute\\n     * @param sourceChain The chain the transfer is coming from\\n     * @param sourceAddress The address the transfer is coming from\\n     * @param payload The payload of the transfer\\n     */\\n    function _execute(\\n        string calldata sourceChain,\\n        string calldata sourceAddress,\\n        bytes calldata payload\\n    ) internal override {\\n        // the message should come from same contract on other chains\\n        address source = sourceAddress.toAddress();\\n        (address from, address to, uint256 amount, uint256 id) = abi.decode(\\n            payload,\\n            (address, address, uint256, uint256)\\n        );\\n        _axelarBridgeFrom(sourceChain, source, from, to, amount, id);\\n    }\\n\\n    function _axelarBridgeFrom(\\n        string memory sourceChain,\\n        address sourceAddress,\\n        address from,\\n        address to,\\n        uint normalizedAmount,\\n        uint requestId\\n    ) internal virtual;\\n}\\n\",\"keccak256\":\"0x012cb8b4481c78209e043652a81778dd1420dafdaf39774e3bbb530f3a7ea8bc\",\"license\":\"MIT\"},\"contracts/messagePassingBridge/BridgeHelperLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.0;\\n\\nlibrary BridgeHelperLibrary {\\n    /**\\n     * @dev Function for normalizing token amounts to 18 decimals\\n     * @param amount The amount to normalize\\n     * @return normalized amount\\n     */\\n    function normalizeFromTokenTo18Decimals(uint256 amount, uint8 decimals) internal pure returns (uint256 normalized) {\\n        normalized = amount;\\n        if (decimals < 18) {\\n            uint256 diff = 18 - decimals;\\n            normalized = amount * 10 ** diff;\\n        } else if (decimals > 18) {\\n            uint256 diff = decimals - 18;\\n            normalized = amount / 10 ** diff;\\n        }\\n    }\\n\\n    /**\\n     * @dev Function for normalizing token amounts from 18 decimals\\n     * @param amount The amount to normalize\\n     * @return normalized amount\\n     */\\n    function normalizeFrom18ToTokenDecimals(uint256 amount, uint8 decimals) internal pure returns (uint256 normalized) {\\n        normalized = amount;\\n        if (decimals < 18) {\\n            uint256 diff = 18 - decimals;\\n            normalized = amount / 10 ** diff;\\n        } else if (decimals > 18) {\\n            uint256 diff = decimals - 18;\\n            normalized = amount * 10 ** diff;\\n        } else normalized = amount;\\n    }\\n}\\n\",\"keccak256\":\"0x78c8207485230fa963893ef59151ba7c7035f76b0d04036f48403dab69cfcf58\",\"license\":\"MIT\"},\"contracts/messagePassingBridge/LZHandlerUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.2;\\n\\nimport '@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol';\\nimport '@layerzerolabs/solidity-examples/contracts/contracts-upgradable/lzApp/NonblockingLzAppUpgradeable.sol';\\n\\nabstract contract LZHandlerUpgradeable is Initializable, NonblockingLzAppUpgradeable {\\n    using BytesLib for bytes;\\n\\n    error INVALID_SENDER(bytes _srcAddress);\\n    error INVALID_ENDPOINT(address lzEndpoint);\\n\\n    function __LZHandlerUpgradeable_init(address _lzEndpoint) internal onlyInitializing {\\n        __Ownable_init_unchained();\\n        __LzAppUpgradeable_init_unchained(_lzEndpoint);\\n    }\\n\\n    function __LZHandlerUpgradeable_init_unchained() internal onlyInitializing {}\\n\\n    //override lzReceive for simpler trustedRemote handling\\n    function lzReceive(\\n        uint16 _srcChainId,\\n        bytes calldata _srcAddress,\\n        uint64 _nonce,\\n        bytes calldata _payload\\n    ) public virtual override {\\n        // lzReceive must be called by the endpoint for security\\n        if (_msgSender() != address(lzEndpoint)) revert INVALID_ENDPOINT(_msgSender());\\n\\n        bytes memory trustedRemote = abi.encodePacked(address(this), address(this)); //we assume all bridges have same address\\n        // if will still block the message pathway from (srcChainId, srcAddress). should not receive message from untrusted remote.\\n        if (\\n            _srcAddress.length != trustedRemote.length ||\\n            trustedRemote.length == 0 ||\\n            keccak256(_srcAddress) != keccak256(trustedRemote)\\n        ) revert INVALID_SENDER(_srcAddress);\\n\\n        _blockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);\\n    }\\n\\n    function estimateSendFee(\\n        uint16 _dstChainId,\\n        address _fromAddress,\\n        address _toAddress,\\n        uint _normalizedAmount,\\n        bool _useZro,\\n        bytes memory _adapterParams\\n    ) public view virtual returns (uint nativeFee, uint zroFee) {\\n        bytes memory payload = abi.encode(_fromAddress, _toAddress, _normalizedAmount, 0); //fake request id as 0, just for fee estimation, shouldnt make a difference\\n        return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams);\\n    }\\n\\n    function _nonblockingLzReceive(\\n        uint16 _srcChainId,\\n        bytes memory /*_srcAddress*/,\\n        uint64 _nonce,\\n        bytes memory _payload\\n    ) internal virtual override {\\n        (address from, address to, uint normalizedAmount, uint requestId) = abi.decode(\\n            _payload,\\n            (address, address, uint, uint)\\n        );\\n\\n        address sourceAddress = address(this); //lzreceive already validates sourceAddress\\n\\n        _lzBridgeFrom(_srcChainId, sourceAddress, _nonce, from, to, normalizedAmount, requestId);\\n    }\\n\\n    function _lzBridgeTo(\\n        bytes memory _payload,\\n        uint16 _dstChainId,\\n        address payable _refundAddress,\\n        address _zroPaymentAddress,\\n        bytes memory _adapterParams\\n    ) internal virtual {\\n        trustedRemoteLookup[_dstChainId] = abi.encodePacked(address(this), address(this)); //make sure we are a trusted remote, tokens will be sent to same contract address on target chain\\n        _lzSend(_dstChainId, _payload, _refundAddress, _zroPaymentAddress, _adapterParams, msg.value);\\n    }\\n\\n    function _lzBridgeFrom(\\n        uint16 _srcChainId,\\n        address _srcAddress,\\n        uint64 _nonce,\\n        address _from,\\n        address _to,\\n        uint _normalizedAmount,\\n        uint _requestId\\n    ) internal virtual;\\n\\n    /**\\n     * @dev This empty reserved space is put in place to allow future versions to add new\\n     * variables without shifting down storage in the inheritance chain.\\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n     */\\n    uint[49] private __gap;\\n}\\n\",\"keccak256\":\"0x40b29a6a17852883cd9b9ea1688dcc5e182e4765e357863d96dffbf304872eeb\",\"license\":\"MIT\"},\"contracts/messagePassingBridge/MessagePassingBridge.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.0;\\nimport '@gooddollar/goodprotocol/contracts/utils/ProxyFactory1967.sol'; //imported so it is compiled and available in hardhat deploy\\nimport {IAxelarGateway} from '@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGateway.sol';\\nimport {IAxelarGasService} from '@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGasService.sol';\\nimport {DAOUpgradeableContract, INameService} from '@gooddollar/goodprotocol/contracts/utils/DAOUpgradeableContract.sol';\\nimport {AxelarExecutable} from '@axelar-network/axelar-gmp-sdk-solidity/contracts/executable/AxelarExecutable.sol';\\nimport {StringToAddress, AddressToString} from '@axelar-network/axelar-gmp-sdk-solidity/contracts/utils/AddressString.sol';\\nimport {AccessControlUpgradeable} from '@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol';\\nimport '@openzeppelin/contracts/utils/Strings.sol';\\nimport '@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol';\\nimport './LZHandlerUpgradeable.sol';\\nimport './AxelarHandlerUpgradeable.sol';\\nimport './BridgeHelperLibrary.sol';\\n\\ninterface IFaucet {\\n    function canTop(address) external view returns (bool);\\n\\n    function topWallet(address) external;\\n}\\n\\ninterface IIdentity {\\n    function isWhitelisted(address) external view returns (bool);\\n}\\n\\ninterface IMinter {\\n    function mint(address to, uint256 amount) external returns (bool);\\n}\\n\\n/**\\n * @title MessagePassingBridge\\n * @dev A contract for bridging assets between chains\\n */\\ncontract MessagePassingBridge is DAOUpgradeableContract, LZHandlerUpgradeable, AxelarHandlerUpgradeable {\\n    using StringToAddress for string;\\n    using AddressToString for address;\\n\\n    enum BridgeService {\\n        AXELAR,\\n        LZ\\n    }\\n\\n    address public immutable lzEndpoint_;\\n    bool public immutable TESTNET;\\n\\n    // // A constant for the guardian role\\n    // bytes32 public constant GUARDIAN_ROLE = keccak256('GUARDIAN_ROLE');\\n\\n    // An error message for when the contract is already initialized\\n    error AlreadyInitialized();\\n\\n    // An error message for when the caller is not a guardian\\n    error NOT_GUARDIAN(address sender);\\n\\n    error WRONG_TOKEN(address token);\\n    error INVALID_TARGET_OR_CHAINID(address target, uint256 chainId);\\n    error BRIDGE_LIMITS(string);\\n    error TRANSFER_FROM();\\n    error TRANSFER();\\n    error ALREADY_EXECUTED(uint256 requestId);\\n    error MISSING_FEE();\\n    error UNSUPPORTED_CHAIN(uint256 chainId);\\n    error LZ_FEE(uint256 required, uint256 sent);\\n\\n    // An event emitted when a bridge request is made\\n    event BridgeRequest(\\n        address indexed from,\\n        address indexed to,\\n        uint256 targetChainId,\\n        uint256 normalizedAmount,\\n        uint256 timestamp,\\n        BridgeService bridge,\\n        uint256 indexed id\\n    );\\n\\n    // An event emitted when a transfer is executed\\n    event ExecutedTransfer(\\n        address indexed from,\\n        address indexed to,\\n        uint256 normalizedAmount,\\n        uint256 fee,\\n        uint256 sourceChainId,\\n        BridgeService bridge,\\n        uint256 indexed id\\n    );\\n\\n    event FalseSender(uint256 sourceChainId, address sourceAddress);\\n\\n    // A struct for storing bridge fees\\n    struct BridgeFees {\\n        uint256 minFee;\\n        uint256 maxFee;\\n        uint256 fee;\\n    }\\n\\n    // A struct for storing bridge limits\\n    struct BridgeLimits {\\n        uint256 dailyLimit;\\n        uint256 txLimit;\\n        uint256 accountDailyLimit;\\n        uint256 minAmount;\\n        bool onlyWhitelisted;\\n    }\\n\\n    // A struct for storing account limits\\n    struct AccountLimit {\\n        uint256 lastTransferReset;\\n        uint256 bridged24Hours;\\n    }\\n\\n    // A struct for storing bridge daily limits\\n    struct BridgeDailyLimit {\\n        uint256 lastTransferReset;\\n        uint256 bridged24Hours;\\n    }\\n\\n    address public guardian;\\n\\n    // A mapping for executed requests\\n    mapping(uint256 => bool) public executedRequests;\\n\\n    // A mapping for disabled source bridges (key is hash(sourceChainId,bridgeservice))\\n    mapping(bytes32 => bool) public disabledSourceBridges;\\n\\n    // A boolean for whether the bridge is closed\\n    bool public isClosed;\\n\\n    // A variable for storing bridge fees\\n    BridgeFees public bridgeFees;\\n\\n    // A variable for storing bridge limits\\n    BridgeLimits public bridgeLimits;\\n\\n    // A variable for storing bridge daily limits\\n    BridgeDailyLimit public bridgeDailyLimit;\\n\\n    // A mapping for storing account limits\\n    mapping(address => AccountLimit) public accountsDailyLimit;\\n\\n    // An interface for the faucet contract\\n    IFaucet public faucet;\\n\\n    // A variable for storing the current ID\\n    uint256 public currentId;\\n\\n    mapping(uint256 => uint16) public lzChainIdsMapping;\\n    /**\\n     * @dev Modifier that allows only the owner or guardian to call a function\\n     */\\n    modifier onlyOwnerOrGuardian() {\\n        if ((guardian == msg.sender || avatar == msg.sender || owner() == msg.sender) == false)\\n            revert NOT_GUARDIAN(msg.sender);\\n        _;\\n    }\\n\\n    /**\\n     * @dev Constructor function for the AxelarBridge contract\\n     * @param axlGateway The address of the gateway contract\\n     * @param axlGasReceiver The address of the gas receiver contract\\n     */\\n    constructor(\\n        address axlGateway,\\n        address axlGasReceiver,\\n        address lzEndpoint,\\n        bool isTestnet\\n    ) AxelarHandlerUpgradeable(axlGateway, axlGasReceiver) {\\n        lzEndpoint_ = lzEndpoint;\\n        TESTNET = isTestnet;\\n    }\\n\\n    function _authorizeUpgrade(address impl) internal virtual override onlyOwner {}\\n\\n    /**\\n     * @dev Function for initializing the contract\\n     * @param nameService The address of the name service contract\\n     */\\n    function initialize(\\n        INameService nameService,\\n        BridgeLimits memory limits,\\n        BridgeFees memory fees\\n    ) public initializer {\\n        setDAO(nameService);\\n        __LZHandlerUpgradeable_init(lzEndpoint_);\\n        guardian = msg.sender;\\n        transferOwnership(avatar);\\n        bridgeLimits = limits;\\n        bridgeFees = fees;\\n    }\\n\\n    /**\\n     * @dev Function for setting the bridge limits\\n     * @param limits The bridge limits to set\\n     */\\n    function setBridgeLimits(BridgeLimits memory limits) external onlyOwnerOrGuardian {\\n        bridgeLimits = limits;\\n    }\\n\\n    /**\\n     * @dev Function for setting the bridge fees\\n     * @param fees The bridge fees to set\\n     */\\n    function setBridgeFees(BridgeFees memory fees) external onlyOwnerOrGuardian {\\n        bridgeFees = fees;\\n    }\\n\\n    function setDisabledBridges(bytes32[] memory bridgeKeys, bool[] memory disabled) external onlyOwnerOrGuardian {\\n        for (uint256 i = 0; i < bridgeKeys.length; i++) disabledSourceBridges[bridgeKeys[i]] = disabled[i];\\n    }\\n\\n    /**\\n     * @dev Function for setting the faucet contract\\n     * @param _faucet The faucet contract to set\\n     */\\n    function setFaucet(IFaucet _faucet) external onlyOwnerOrGuardian {\\n        faucet = _faucet;\\n    }\\n\\n    /**\\n     * @dev Function for setting the guardian contract\\n     * @param _guardian The guardian to set\\n     */\\n    function setGuardian(address _guardian) external onlyOwnerOrGuardian {\\n        guardian = _guardian;\\n    }\\n\\n    /**\\n     * @dev Function for checking if a bridge is possible\\n     * @param from The address of the sender\\n     * @param amount The amount to bridge\\n     * @return isWithinLimit Whether the bridge is within the limit\\n     * @return error The error message, if any\\n     */\\n    function canBridge(address from, uint256 amount) public view returns (bool isWithinLimit, string memory error) {\\n        if (isClosed) return (false, 'closed');\\n\\n        if (amount < bridgeLimits.minAmount) return (false, 'minAmount');\\n\\n        uint256 account24hours = accountsDailyLimit[from].bridged24Hours;\\n        if (accountsDailyLimit[from].lastTransferReset < block.timestamp - 1 days) {\\n            account24hours = amount;\\n        } else {\\n            account24hours += amount;\\n        }\\n\\n        if (bridgeLimits.onlyWhitelisted && address(nameService) != address(0)) {\\n            IIdentity id = IIdentity(nameService.getAddress('IDENTITY'));\\n            if (address(id) != address(0))\\n                if (id.isWhitelisted(from) == false) return (false, 'not whitelisted');\\n        }\\n\\n        if (account24hours > bridgeLimits.accountDailyLimit) return (false, 'accountDailyLimit');\\n\\n        if (amount > bridgeLimits.txLimit) return (false, 'txLimit');\\n\\n        if (bridgeDailyLimit.lastTransferReset < block.timestamp - 1 days) {} else {\\n            if (bridgeDailyLimit.bridged24Hours + amount > bridgeLimits.dailyLimit) return (false, 'dailyLimit');\\n        }\\n\\n        return (true, '');\\n    }\\n\\n    /**\\n     * @dev Function for withdrawing tokens\\n     * @param token The address of the token to withdraw\\n     * @param amount The amount to withdraw\\n     */\\n    function withdraw(address token, uint256 amount) external onlyOwner {\\n        if (amount == 0) amount = IERC20(token).balanceOf(address(this));\\n        IERC20(token).transfer(msg.sender, amount);\\n    }\\n\\n    /**\\n     * @dev Function for pausing the bridge\\n     * @param isPaused Whether to pause the bridge or not\\n     */\\n    function pauseBridge(bool isPaused) external onlyOwnerOrGuardian {\\n        isClosed = isPaused;\\n    }\\n\\n    /**\\n     * @dev Function for handling token transfers\\n     * @param from The address of the sender\\n     * @param amount The amount to transfer\\n     * @param data The data to decode of format (uint256 targetChainId, address target, BridgeService bridge, bytes memory lzAdapterParams)\\n     * @return Whether the transfer was successful or not\\n     */\\n    function onTokenTransfer(address from, uint256 amount, bytes calldata data) external payable returns (bool) {\\n        if (msg.sender != address(nativeToken())) revert WRONG_TOKEN(msg.sender);\\n\\n        (uint256 targetChainId, address target, BridgeService bridge, bytes memory lzAdapterParams) = abi.decode(\\n            data,\\n            (uint256, address, BridgeService, bytes)\\n        );\\n\\n        _bridgeTo(from, target, targetChainId, amount, true, bridge, lzAdapterParams);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Enforces transfer limits and checks if the transfer is valid\\n     * @param from The address to transfer from\\n     * @param target The address to transfer to\\n     * @param amount The amount to transfer\\n     * @param targetChainId The chain ID of the target chain\\n     */\\n    function _enforceLimits(address from, address target, uint256 amount, uint256 targetChainId) internal virtual {\\n        if (target == address(0) || targetChainId == 0) revert INVALID_TARGET_OR_CHAINID(target, targetChainId);\\n\\n        if (bridgeDailyLimit.lastTransferReset < block.timestamp - 1 days) {\\n            bridgeDailyLimit.lastTransferReset = block.timestamp;\\n            bridgeDailyLimit.bridged24Hours = 0;\\n        }\\n\\n        if (accountsDailyLimit[from].lastTransferReset < block.timestamp - 1 days) {\\n            accountsDailyLimit[from].lastTransferReset = block.timestamp;\\n            accountsDailyLimit[from].bridged24Hours = 0;\\n        }\\n        (bool isValid, string memory reason) = canBridge(from, amount);\\n        if (isValid == false) revert BRIDGE_LIMITS(reason);\\n\\n        bridgeDailyLimit.bridged24Hours += amount;\\n        accountsDailyLimit[from].bridged24Hours += amount;\\n    }\\n\\n    function bridgeTo(address target, uint256 targetChainId, uint256 amount, BridgeService bridge) external payable {\\n        _bridgeTo(msg.sender, target, targetChainId, amount, false, bridge, '');\\n    }\\n\\n    function bridgeToWithLz(address target, uint256 targetChainId, uint256 amount) external payable {\\n        _bridgeTo(msg.sender, target, targetChainId, amount, false, BridgeService.LZ, '');\\n    }\\n\\n    function bridgeToWithLzAdapterParams(\\n        address target,\\n        uint256 targetChainId,\\n        uint256 amount,\\n        bytes calldata adapterParams\\n    ) external payable {\\n        _bridgeTo(msg.sender, target, targetChainId, amount, false, BridgeService.LZ, adapterParams);\\n    }\\n\\n    function bridgeToWithAxelar(address target, uint256 targetChainId, uint256 amount) external payable {\\n        _bridgeTo(msg.sender, target, targetChainId, amount, false, BridgeService.AXELAR, '');\\n    }\\n\\n    /**\\n     * @dev Bridges tokens from one chain to another, this performs burning or locking\\n     * @param from The address to bridge tokens from\\n     * @param target The address to bridge tokens to\\n     * @param targetChainId The chain ID of the target chain\\n     * @param amount The amount of tokens to bridge\\n     * @param isOnTokenTransfer Whether the transfer is on token transfer\\n     */\\n    function _bridgeTo(\\n        address from,\\n        address target,\\n        uint256 targetChainId,\\n        uint256 amount,\\n        bool isOnTokenTransfer,\\n        BridgeService bridge,\\n        bytes memory lzAdapterParams\\n    ) internal {\\n        if (isClosed) revert BRIDGE_LIMITS('closed');\\n\\n        if (isOnTokenTransfer == false) {\\n            // lock on mainnet, burn on other chains\\n            if (_chainId() == 1 || _chainId() == 5) {\\n                if (nativeToken().transferFrom(from, address(this), amount) == false) revert TRANSFER_FROM();\\n            } else nativeToken().burnFrom(from, amount);\\n        }\\n        //ontokentransfer we already have the tokens, so burn them\\n        else {\\n            if (_chainId() != 1 && _chainId() != 5) nativeToken().burn(amount);\\n        }\\n\\n        uint256 normalizedAmount = BridgeHelperLibrary.normalizeFromTokenTo18Decimals(amount, nativeToken().decimals()); //on bridge request we normalize amount from source chain decimals to 18 decimals\\n\\n        if (msg.value == 0) revert MISSING_FEE();\\n\\n        uint256 requestId = uint256(keccak256(abi.encode(address(this), _chainId(), currentId++)));\\n        bytes memory payload = abi.encode(from, target, normalizedAmount, requestId);\\n\\n        if (bridge == BridgeService.AXELAR) {\\n            string memory chainId = _toAxelarChainId(targetChainId);\\n            if (bytes(chainId).length == 0) revert UNSUPPORTED_CHAIN(targetChainId);\\n            _axelarBridgeTo(payload, chainId);\\n        } else if (bridge == BridgeService.LZ) {\\n            uint16 chainId = _toLzChainId(targetChainId);\\n            if (chainId == 0) revert UNSUPPORTED_CHAIN(targetChainId);\\n            (uint256 nativeFee, ) = estimateSendFee(chainId, from, target, normalizedAmount, false, lzAdapterParams);\\n            if (nativeFee > msg.value) revert LZ_FEE(nativeFee, msg.value);\\n            _lzBridgeTo(payload, chainId, payable(from), address(0), lzAdapterParams);\\n        }\\n\\n        emit BridgeRequest(from, target, targetChainId, normalizedAmount, block.timestamp, bridge, requestId);\\n    }\\n\\n    /**\\n     * @dev Takes a fee from the amount being transferred\\n     * @param amount The amount being transferred\\n     * @return fee amount\\n     */\\n    function _takeFee(uint256 amount) internal view returns (uint256 fee) {\\n        fee = (amount * bridgeFees.fee) / 10000;\\n    }\\n\\n    /**\\n     * we override the callback that is triggered when a message is received\\n     * @param sourceChainId the source chain\\n     * @param sourceAddress the source contract\\n     * @param from sender\\n     * @param to recipient\\n     * @param normalizedAmount amount in 18 decimals\\n     * @param requestId request id\\n     */\\n    function _axelarBridgeFrom(\\n        string memory sourceChainId,\\n        address sourceAddress,\\n        address from,\\n        address to,\\n        uint256 normalizedAmount,\\n        uint256 requestId\\n    ) internal virtual override {\\n        uint256 chainId = _fromAxelarChainId(sourceChainId);\\n        if (sourceAddress != address(this)) {\\n            emit FalseSender(chainId, sourceAddress);\\n            return;\\n        }\\n        _bridgeFrom(from, to, normalizedAmount, chainId, requestId, BridgeService.AXELAR);\\n    }\\n\\n    /**\\n     * we override the callback that is triggered when a message is received\\n     * @param sourceChainId source chain\\n     * @param sourceAddress source contract\\n     * @param from sender\\n     * @param to recipient\\n     * @param normalizedAmount amount in 18 decimals\\n     * @param requestId request id\\n     */\\n    function _lzBridgeFrom(\\n        uint16 sourceChainId,\\n        address sourceAddress,\\n        uint64 /*nonce*/,\\n        address from,\\n        address to,\\n        uint256 normalizedAmount,\\n        uint256 requestId\\n    ) internal virtual override {\\n        uint256 chainId = _fromLzChainId(sourceChainId);\\n        if (sourceAddress != address(this)) {\\n            emit FalseSender(chainId, sourceAddress);\\n            return;\\n        }\\n        _bridgeFrom(from, to, normalizedAmount, chainId, requestId, BridgeService.LZ);\\n    }\\n\\n    /**\\n     * @dev Bridges tokens from one chain to another, this performs minting or unlock\\n     * @param from The address to bridge tokens from\\n     * @param target The address to bridge tokens to\\n     * @param normalizedAmount The amount of tokens to bridge\\n     * @param sourceChainId The chain ID of the source chain\\n     * @param id The ID of the transfer\\n     */\\n    function _bridgeFrom(\\n        address from,\\n        address target,\\n        uint256 normalizedAmount,\\n        uint256 sourceChainId,\\n        uint256 id,\\n        BridgeService bridge\\n    ) internal {\\n        if (_toLzChainId(sourceChainId) == 0) revert UNSUPPORTED_CHAIN(sourceChainId);\\n        if (disabledSourceBridges[keccak256(abi.encode(sourceChainId, bridge))])\\n            revert BRIDGE_LIMITS('source disabled');\\n\\n        if (executedRequests[id]) revert ALREADY_EXECUTED(id);\\n\\n        _enforceLimits(from, target, normalizedAmount, _chainId());\\n        uint256 tokenAmount = BridgeHelperLibrary.normalizeFrom18ToTokenDecimals(\\n            normalizedAmount,\\n            nativeToken().decimals()\\n        ); //on transfer we normalize the request which is in 18 decimals back to local chain token decimals\\n\\n        uint256 fee = _takeFee(tokenAmount);\\n\\n        //make it easier to find out for relayers about the status\\n        executedRequests[id] = true;\\n        _topGas(target);\\n\\n        //unlock on mainnet mint on other chains\\n        if (_chainId() == 1 || _chainId() == 5) {\\n            if (nativeToken().transfer(target, tokenAmount - fee) == false) revert TRANSFER();\\n        } else IMinter(nameService.getAddress('MINTBURN_WRAPPER')).mint(target, tokenAmount);\\n\\n        emit ExecutedTransfer(from, target, normalizedAmount, fee, sourceChainId, bridge, id);\\n    }\\n\\n    /**\\n     * @dev Tops up gas for a wallet\\n     * @param target The address of the wallet to top up gas for\\n     */\\n    function _topGas(address target) internal {\\n        if (address(faucet) != address(0) && faucet.canTop(target)) {\\n            try faucet.topWallet(target) {} catch {}\\n        }\\n    }\\n\\n    /**\\n     * @dev Gets the chain ID of the current chain\\n     * @return chainId The chain ID\\n     */\\n    function _chainId() internal view virtual returns (uint256 chainId) {\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    function _toLzChainId(uint256 chainId) internal pure returns (uint16 lzChainId) {\\n        if (chainId == 1) return 10001;\\n        if (chainId == 5) return 10121;\\n        if (chainId == 42220) return 125;\\n        if (chainId == 44787) return 10125;\\n        if (chainId == 122) return 138;\\n    }\\n\\n    function _fromLzChainId(uint16 lzChainId) internal pure returns (uint256 chainId) {\\n        if (lzChainId == 10001) return 1;\\n        if (lzChainId == 10121) return 5;\\n        if (lzChainId == 125) return 42220;\\n        if (lzChainId == 10125) return 44787;\\n        if (lzChainId == 138) return 122;\\n    }\\n\\n    function _toAxelarChainId(uint256 chainId) internal pure returns (string memory axlChainId) {\\n        if (chainId == 1) return 'Ethereum';\\n        if (chainId == 5) return 'ethereum-2';\\n        if (chainId == 42220) return 'celo';\\n        if (chainId == 44787) return 'celo';\\n    }\\n\\n    function _fromAxelarChainId(string memory axlChainId) internal view returns (uint256 chainId) {\\n        bytes32 chainHash = keccak256(bytes(axlChainId));\\n        if (chainHash == keccak256('Ethereum')) return 1;\\n        if (chainHash == keccak256('ethereum-2')) return 5;\\n        if (chainHash == keccak256('celo'))\\n            if (TESTNET) return 44787;\\n            else return 42220;\\n    }\\n}\\n\",\"keccak256\":\"0xffd23b321efcf82c08a9eef85820b441a71ff513569b10cb3a12aa9fb5ab8583\",\"license\":\"MIT\"}},\"version\":1}",
  "bytecode": "0x610120604052306080523480156200001657600080fd5b5060405162005deb38038062005deb8339810160408190526200003991620000ac565b8383816001600160a01b038116620000645760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0390811660a05290811660c0529290921660e052151561010052506200010f915050565b80516001600160a01b0381168114620000a757600080fd5b919050565b60008060008060808587031215620000c357600080fd5b620000ce856200008f565b9350620000de602086016200008f565b9250620000ee604086016200008f565b9150606085015180151581146200010457600080fd5b939692955090935050565b60805160a05160c05160e05161010051615c516200019a600039600081816107a80152613e94015260008181610316015261275a01526000818161075f015261341501526000818161040801528181610fbe015281816117c401526134ae01526000818161157a015281816115ba01528181611886015281816118c601526119420152615c516000f3fe6080604052600436106102dd5760003560e01c80621d3567146102e2578063020051cf1461030457806305fead151461034e57806307e0db17146103835780630d187dd4146103a35780630df37483146103b657806310ddb137146103d6578063116191b6146103f65780631a3947951461042a5780631a98b2e01461044a5780631b3c90a81461046a5780631fec5c5c1461047f57806329b70872146104925780633095634a146104b25780633659cfe6146104e05780633d8b38f6146105005780633e6326fc146105305780633f1f4fa4146105505780633fa4d7db1461058c5780634162169f1461059f578063425cfb53146105bf57806342d65a8d146105f0578063452a93201461061057806349160658146106315780634f1ef2861461065157806352d1902d146106645780635551b979146106795780635aef7de61461068c5780635b8c41e6146106ac57806366ad5c8a146106fc57806369c20d361461071c5780636a22d8cc1461074d578063715018a61461078157806372891b2d146107965780637533d788146107ca5780637b0240c0146107f757806382dc737d146108345780638a0dac4a146108545780638cfd8f5c146108745780638da5cb5b146108ad578063950c8a74146108c25780639f38369a146108e3578063a4c0ed3614610903578063a6c3d16514610916578063b2f7667f14610936578063b353aaa714610953578063b5569f1814610973578063baf3292d146109b2578063c2b6b58c146109d2578063c4461834146109ed578063c6dd812f14610a03578063c78ab88214610a5c578063cbed8b9c14610a7c578063d1deba1f14610a9c578063d422794714610aaf578063d8b31c7714610ae4578063de5f72fd14610b04578063df2a5b3b14610b25578063e00dd16114610b45578063e1758bd814610b5c578063eb8d72b714610b71578063f2fde38b14610b91578063f3fef3a314610bb1578063f5ecbdbc14610bd1578063fad16abe14610bf1575b600080fd5b3480156102ee57600080fd5b506103026102fd3660046147a1565b610c11565b005b34801561031057600080fd5b506103387f000000000000000000000000000000000000000000000000000000000000000081565b6040516103459190614834565b60405180910390f35b34801561035a57600080fd5b5061036e61036936600461492e565b610d50565b60408051928352602083019190915201610345565b34801561038f57600080fd5b5061030261039e3660046149bb565b610e10565b6103026103b13660046149d6565b610e7d565b3480156103c257600080fd5b506103026103d1366004614a3f565b610ec4565b3480156103e257600080fd5b506103026103f13660046149bb565b610ee4565b34801561040257600080fd5b506103387f000000000000000000000000000000000000000000000000000000000000000081565b34801561043657600080fd5b50610302610445366004614a69565b610f1c565b34801561045657600080fd5b50610302610465366004614a86565b610f8d565b34801561047657600080fd5b50610302611070565b61030261048d366004614b6e565b611197565b34801561049e57600080fd5b506103026104ad366004614c2f565b6111bc565b3480156104be57600080fd5b506104d26104cd366004614c4b565b611252565b604051610345929190614cc1565b3480156104ec57600080fd5b506103026104fb366004614ce4565b61156f565b34801561050c57600080fd5b5061052061051b366004614d01565b611638565b6040519015158152602001610345565b34801561053c57600080fd5b50606754610338906001600160a01b031681565b34801561055c57600080fd5b5061057e61056b3660046149bb565b6101016020526000908152604090205481565b604051908152602001610345565b61030261059a366004614d53565b611705565b3480156105ab57600080fd5b50606554610338906001600160a01b031681565b3480156105cb57600080fd5b506105206105da366004614d88565b6101946020526000908152604090205460ff1681565b3480156105fc57600080fd5b5061030261060b366004614d01565b611729565b34801561061c57600080fd5b5061019354610338906001600160a01b031681565b34801561063d57600080fd5b5061030261064c366004614da1565b611793565b61030261065f366004614e44565b61187b565b34801561067057600080fd5b5061057e611935565b610302610687366004614d53565b6119e3565b34801561069857600080fd5b50606654610338906001600160a01b031681565b3480156106b857600080fd5b5061057e6106c7366004614e93565b610130602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b34801561070857600080fd5b506103026107173660046147a1565b611a03565b34801561072857600080fd5b50610520610737366004614d88565b6101956020526000908152604090205460ff1681565b34801561075957600080fd5b506103387f000000000000000000000000000000000000000000000000000000000000000081565b34801561078d57600080fd5b50610302611adf565b3480156107a257600080fd5b506105207f000000000000000000000000000000000000000000000000000000000000000081565b3480156107d657600080fd5b506107ea6107e53660046149bb565b611af3565b6040516103459190614ef0565b34801561080357600080fd5b5061019754610198546101995461081992919083565b60408051938452602084019290925290820152606001610345565b34801561084057600080fd5b5061030261084f366004614f5e565b611b8d565b34801561086057600080fd5b5061030261086f366004614ce4565b611c03565b34801561088057600080fd5b5061057e61088f366004614f7a565b61010060209081526000928352604080842090915290825290205481565b3480156108b957600080fd5b50610338611c83565b3480156108ce57600080fd5b5061010254610338906001600160a01b031681565b3480156108ef57600080fd5b506107ea6108fe3660046149bb565b611c92565b610520610911366004614fad565b611da2565b34801561092257600080fd5b50610302610931366004614d01565b611e17565b34801561094257600080fd5b5061019f546101a05461036e919082565b34801561095f57600080fd5b5060fe54610338906001600160a01b031681565b34801561097f57600080fd5b506109a561098e366004614d88565b6101a46020526000908152604090205461ffff1681565b6040516103459190615008565b3480156109be57600080fd5b506103026109cd366004614ce4565b611eaa565b3480156109de57600080fd5b50610196546105209060ff1681565b3480156109f957600080fd5b5061057e61271081565b348015610a0f57600080fd5b5061019a5461019b5461019c5461019d5461019e54610a32949392919060ff1685565b6040805195865260208601949094529284019190915260608301521515608082015260a001610345565b348015610a6857600080fd5b50610302610a773660046150a9565b611f09565b348015610a8857600080fd5b50610302610a97366004615157565b611fe3565b610302610aaa3660046147a1565b61205c565b348015610abb57600080fd5b5061036e610aca366004614ce4565b6101a1602052600090815260409020805460019091015482565b348015610af057600080fd5b50610302610aff366004614ce4565b612274565b348015610b1057600080fd5b506101a254610338906001600160a01b031681565b348015610b3157600080fd5b50610302610b403660046151a8565b6122f4565b348015610b5157600080fd5b5061057e6101a35481565b348015610b6857600080fd5b506103386123a7565b348015610b7d57600080fd5b50610302610b8c366004614d01565b612434565b348015610b9d57600080fd5b50610302610bac366004614ce4565b61248e565b348015610bbd57600080fd5b50610302610bcc366004614c4b565b612504565b348015610bdd57600080fd5b506107ea610bec3660046151e4565b6125f2565b348015610bfd57600080fd5b50610302610c0c366004615231565b612685565b60fe546001600160a01b0316336001600160a01b031614610c505733604051634a43969960e11b8152600401610c479190614834565b60405180910390fd5b60003030604051602001610c65929190615270565b60408051601f19818403018152919052805190915085141580610c8757508051155b80610caf575080516020820120604051610ca49088908890615292565b604051809103902014155b15610cd15785856040516306543c8960e31b8152600401610c479291906152cb565b610d478787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a018190048102820181019092528881528a93509150889088908190840183828082843760009201919091525061284092505050565b50505050505050565b604080516001600160a01b0387811660208301528681168284015260608201869052600060808084018290528451808503909101815260a084019485905260fe5463040a7bb160e41b90955290938493919216906340a7bb1090610dc0908c90309086908b908b9060a4016152df565b6040805180830381865afa158015610ddc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e009190615333565b9250925050965096945050505050565b610e186128b9565b60fe546040516307e0db1760e01b81526001600160a01b03909116906307e0db1790610e48908490600401615008565b600060405180830381600087803b158015610e6257600080fd5b505af1158015610e76573d6000803e3d6000fd5b5050505050565b610e76338686866000600188888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061291892505050565b610ecc6128b9565b61ffff90911660009081526101016020526040902055565b610eec6128b9565b60fe546040516310ddb13760e01b81526001600160a01b03909116906310ddb13790610e48908490600401615008565b610193546001600160a01b0316331480610f4057506066546001600160a01b031633145b80610f5a575033610f4f611c83565b6001600160a01b0316145b610f79573360405163b63b5ad960e01b8152600401610c479190614834565b610196805460ff1916911515919091179055565b60008585604051610f9f929190615292565b604051908190038120631876eed960e01b825291506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631876eed990611003908e908e908e908e908e9089908d908d908d90600401615357565b6020604051808303816000875af1158015611022573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104691906153b6565b61106357604051631403112d60e21b815260040160405180910390fd5b5050505050505050505050565b60675460405163bf40fac160e01b815260206004820152600a60248201526921a7a72a2927a62622a960b11b60448201526001600160a01b039091169063bf40fac190606401602060405180830381865afa1580156110d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f791906153d3565b606580546001600160a01b0319166001600160a01b0392909216918217905560408051632d77bef360e11b81529051635aef7de6916004808201926020929091908290030181865afa158015611151573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117591906153d3565b606680546001600160a01b0319166001600160a01b0392909216919091179055565b6111b63385858560008660405180602001604052806000815250612918565b50505050565b610193546001600160a01b03163314806111e057506066546001600160a01b031633145b806111fa5750336111ef611c83565b6001600160a01b0316145b611219573360405163b63b5ad960e01b8152600401610c479190614834565b805161019a55602081015161019b55604081015161019c55606081015161019d556080015161019e805460ff1916911515919091179055565b6101965460009060609060ff161561128b57505060408051808201909152600681526518db1bdcd95960d21b6020820152600090611568565b61019d548310156112c05750506040805180820190915260098152681b5a5b905b5bdd5b9d60ba1b6020820152600090611568565b6001600160a01b03841660009081526101a160205260409020600101546112ea6201518042615406565b6001600160a01b03861660009081526101a16020526040902054101561131157508261131e565b61131b848261541d565b90505b61019e5460ff16801561133b57506067546001600160a01b031615155b1561147f5760675460405163bf40fac160e01b81526020600482015260086024820152674944454e5449545960c01b60448201526000916001600160a01b03169063bf40fac190606401602060405180830381865afa1580156113a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c691906153d3565b90506001600160a01b0381161561147d57604051633af32abf60e01b81526001600160a01b03821690633af32abf90611403908990600401614834565b602060405180830381865afa158015611420573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144491906153b6565b61147d5760006040518060400160405280600f81526020016e1b9bdd081dda1a5d195b1a5cdd1959608a1b815250935093505050611568565b505b61019c548111156114bd5750506040805180820190915260118152701858d8dbdd5b9d11185a5b1e531a5b5a5d607a1b602082015260009150611568565b61019b548411156114f15750506040805180820190915260078152661d1e131a5b5a5d60ca1b602082015260009150611568565b6114fe6201518042615406565b61019f54101561150d57611552565b61019a546101a05461152090869061541d565b111561155257505060408051808201909152600a81526919185a5b1e531a5b5a5d60b21b602082015260009150611568565b5050604080516020810190915260008152600191505b9250929050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156115b85760405162461bcd60e51b8152600401610c4790615435565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166115ea612d80565b6001600160a01b0316146116105760405162461bcd60e51b8152600401610c479061546f565b61161981612d9c565b6040805160008082526020820190925261163591839190612da4565b50565b61ffff8316600090815260ff602052604081208054829190611659906154a9565b80601f0160208091040260200160405190810160405280929190818152602001828054611685906154a9565b80156116d25780601f106116a7576101008083540402835291602001916116d2565b820191906000526020600020905b8154815290600101906020018083116116b557829003601f168201915b5050505050905083836040516116e9929190615292565b60405180910390208180519060200120149150505b9392505050565b6117243384848460008060405180602001604052806000815250612918565b505050565b6117316128b9565b60fe546040516342d65a8d60e01b81526001600160a01b03909116906342d65a8d90611765908690869086906004016154de565b600060405180830381600087803b15801561177f57600080fd5b505af1158015610d47573d6000803e3d6000fd5b600082826040516117a5929190615292565b604051908190038120635f6970c360e01b825291506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635f6970c390611803908b908b908b908b908b9089906004016154fc565b6020604051808303816000875af1158015611822573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184691906153b6565b61186357604051631403112d60e21b815260040160405180910390fd5b611871878787878787612f0f565b5050505050505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156118c45760405162461bcd60e51b8152600401610c4790615435565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166118f6612d80565b6001600160a01b03161461191c5760405162461bcd60e51b8152600401610c479061546f565b61192582612d9c565b61193182826001612da4565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146119d05760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c6044820152771b1959081d1a1c9bdd59da0819195b1959d85d1958d85b1b60421b6064820152608401610c47565b50600080516020615bb583398151915290565b611724338484846000600160405180602001604052806000815250612918565b333014611a615760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b6064820152608401610c47565b611ad78686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f890181900481028201810190925287815289935091508790879081908401838280828437600092019190915250612fb192505050565b505050505050565b611ae76128b9565b611af16000612fe5565b565b60ff6020526000908152604090208054611b0c906154a9565b80601f0160208091040260200160405190810160405280929190818152602001828054611b38906154a9565b8015611b855780601f10611b5a57610100808354040283529160200191611b85565b820191906000526020600020905b815481529060010190602001808311611b6857829003601f168201915b505050505081565b610193546001600160a01b0316331480611bb157506066546001600160a01b031633145b80611bcb575033611bc0611c83565b6001600160a01b0316145b611bea573360405163b63b5ad960e01b8152600401610c479190614834565b8051610197556020810151610198556040015161019955565b610193546001600160a01b0316331480611c2757506066546001600160a01b031633145b80611c41575033611c36611c83565b6001600160a01b0316145b611c60573360405163b63b5ad960e01b8152600401610c479190614834565b61019380546001600160a01b0319166001600160a01b0392909216919091179055565b60cc546001600160a01b031690565b61ffff8116600090815260ff6020526040812080546060929190611cb5906154a9565b80601f0160208091040260200160405190810160405280929190818152602001828054611ce1906154a9565b8015611d2e5780601f10611d0357610100808354040283529160200191611d2e565b820191906000526020600020905b815481529060010190602001808311611d1157829003601f168201915b50505050509050805160001415611d875760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f72640000006044820152606401610c47565b6116fe600060148351611d9a9190615406565b839190613037565b6000611dac6123a7565b6001600160a01b0316336001600160a01b031614611ddf573360405163077e7d6560e01b8152600401610c479190614834565b6000808080611df08688018861553d565b9350935093509350611e088984868b60018787612918565b50600198975050505050505050565b611e1f6128b9565b818130604051602001611e34939291906155a6565b60408051601f1981840301815291815261ffff8516600090815260ff60209081529190208251611e699391929091019061462a565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce838383604051611e9d939291906154de565b60405180910390a1505050565b611eb26128b9565b61010280546001600160a01b0319166001600160a01b0383161790556040517f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b90611efe908390614834565b60405180910390a150565b610193546001600160a01b0316331480611f2d57506066546001600160a01b031633145b80611f47575033611f3c611c83565b6001600160a01b0316145b611f66573360405163b63b5ad960e01b8152600401610c479190614834565b60005b825181101561172457818181518110611f8457611f846155c7565b60200260200101516101956000858481518110611fa357611fa36155c7565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611fdb906155dd565b915050611f69565b611feb6128b9565b60fe546040516332fb62e760e21b81526001600160a01b039091169063cbed8b9c9061202390889088908890889088906004016155f8565b600060405180830381600087803b15801561203d57600080fd5b505af1158015612051573d6000803e3d6000fd5b505050505050505050565b61ffff86166000908152610130602052604080822090516120809088908890615292565b90815260408051602092819003830190206001600160401b038716600090815292529020549050806121005760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b6064820152608401610c47565b808383604051612111929190615292565b6040518091039020146121705760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b6064820152608401610c47565b61ffff87166000908152610130602052604080822090516121949089908990615292565b90815260408051602092819003830181206001600160401b038916600090815290845282902093909355601f8801829004820283018201905286825261222c918991899089908190840183828082843760009201919091525050604080516020601f8a018190048102820181019092528881528a935091508890889081908401838280828437600092019190915250612fb192505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051612263959493929190615631565b60405180910390a150505050505050565b610193546001600160a01b031633148061229857506066546001600160a01b031633145b806122b25750336122a7611c83565b6001600160a01b0316145b6122d1573360405163b63b5ad960e01b8152600401610c479190614834565b6101a280546001600160a01b0319166001600160a01b0392909216919091179055565b6122fc6128b9565b600081116123445760405162461bcd60e51b81526020600482015260156024820152744c7a4170703a20696e76616c6964206d696e47617360581b6044820152606401610c47565b61ffff8381166000818152610100602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac090606001611e9d565b60675460405163bf40fac160e01b815260206004820152600a60248201526923a7a7a22227a62620a960b11b60448201526000916001600160a01b03169063bf40fac190606401602060405180830381865afa15801561240b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242f91906153d3565b905090565b61243c6128b9565b61ffff8316600090815260ff6020526040902061245a9083836146ae565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab838383604051611e9d939291906154de565b6124966128b9565b6001600160a01b0381166124fb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c47565b61163581612fe5565b61250c6128b9565b80612581576040516370a0823160e01b81526001600160a01b038316906370a082319061253d903090600401614834565b602060405180830381865afa15801561255a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257e919061566c565b90505b60405163a9059cbb60e01b81526001600160a01b0383169063a9059cbb906125af9033908590600401615685565b6020604051808303816000875af11580156125ce573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172491906153b6565b60fe54604051633d7b2f6f60e21b815261ffff808716600483015285166024820152306044820152606481018390526060916001600160a01b03169063f5ecbdbc90608401600060405180830381865afa158015612654573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261267c919081019061569e565b95945050505050565b600054610100900460ff16158080156126a55750600054600160ff909116105b806126c657506126b430613144565b1580156126c6575060005460ff166001145b6127295760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610c47565b6000805460ff19166001179055801561274c576000805461ff0019166101001790555b61275584613153565b61277e7f0000000000000000000000000000000000000000000000000000000000000000613176565b61019380546001600160a01b031916331790556066546127a6906001600160a01b031661248e565b825161019a5560208084015161019b5560408085015161019c55606085015161019d55608085015161019e805460ff191691151591909117905583516101975590830151610198558201516101995580156111b6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b6000806128a35a60966366ad5c8a60e01b89898989604051602401612868949392919061570b565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152309291906131ae565b9150915081611ad757611ad78686868685613238565b336128c2611c83565b6001600160a01b031614611af15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c47565b6101965460ff16156129565760405163c5426f8d60e01b815260206004820152600660248201526518db1bdcd95960d21b6044820152606401610c47565b82612a8057466001148061296a5750466005145b15612a14576129776123a7565b6040516323b872dd60e01b81526001600160a01b0389811660048301523060248301526044820187905291909116906323b872dd906064016020604051808303816000875af11580156129ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129f291906153b6565b612a0f576040516316431e9360e11b815260040160405180910390fd5b612aff565b612a1c6123a7565b6001600160a01b03166379cc679088866040518363ffffffff1660e01b8152600401612a49929190615685565b600060405180830381600087803b158015612a6357600080fd5b505af1158015612a77573d6000803e3d6000fd5b50505050612aff565b46600114158015612a92575046600514155b15612aff57612a9f6123a7565b6001600160a01b03166342966c68856040518263ffffffff1660e01b8152600401612acc91815260200190565b600060405180830381600087803b158015612ae657600080fd5b505af1158015612afa573d6000803e3d6000fd5b505050505b6000612b7385612b0d6123a7565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6e9190615749565b6132d6565b905034612b9357604051630ba4e53360e21b815260040160405180910390fd5b600030466101a38054906000612ba8836155dd565b90915550604080516001600160a01b039094166020850152830191909152606082015260800160408051808303601f1901815282825280516020918201206001600160a01b03808e1692850192909252908b16918301919091526060820184905260808201819052915060009060a00160408051601f1981840301815291905290506000856001811115612c3e57612c3e61576c565b1415612c87576000612c4f8961334f565b9050805160001415612c775760405163068a505360e01b8152600481018a9052602401610c47565b612c818282613406565b50612d22565b6001856001811115612c9b57612c9b61576c565b1415612d22576000612cac896134ea565b905061ffff8116612cd35760405163068a505360e01b8152600481018a9052602401610c47565b6000612ce4828d8d8860008b610d50565b50905034811115612d11576040516324a89fab60e21b815260048101829052346024820152604401610c47565b612d1f83838e60008a613546565b50505b81896001600160a01b03168b6001600160a01b03167fabeeb7182c7294cd8efcd40e9ff952c1b759c2165b3634aac589429de5d55ad08b87428b604051612d6c94939291906157a4565b60405180910390a450505050505050505050565b600080516020615bb5833981519152546001600160a01b031690565b6116356128b9565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615612dd7576117248361359d565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612e31575060408051601f3d908101601f19168201909252612e2e9181019061566c565b60015b612e945760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610c47565b600080516020615bb58339815191528114612f035760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610c47565b50611724838383613637565b6000612f5085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061365c92505050565b90506000808080612f63868801886157c6565b93509350935093506110638b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525089925088915087905086866137db565b60008060008084806020019051810190612fcb919061580c565b929650909450925090503061205189828988888888613834565b60cc80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60608161304581601f61541d565b10156130845760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610c47565b61308e828461541d565b845110156130d25760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610c47565b6060821580156130f1576040519150600082526020820160405261313b565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561312a578051835260209283019201613112565b5050858452601f01601f1916604052505b50949350505050565b6001600160a01b03163b151590565b606780546001600160a01b0319166001600160a01b038316179055611635611070565b600054610100900460ff1661319d5760405162461bcd60e51b8152600401610c4790615854565b6131a561388d565b611635816138bd565b6000606060008060008661ffff166001600160401b038111156131d3576131d361486b565b6040519080825280601f01601f1916602001820160405280156131fd576020820181803683370190505b50905060008087516020890160008d8df191503d92508683111561321f578692505b828152826000602083013e909890975095505050505050565b818051906020012061013060008761ffff1661ffff1681526020019081526020016000208560405161326a919061589f565b9081526040805191829003602090810183206001600160401b0388166000908152915220919091557fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c906132c790879087908790879087906158bb565b60405180910390a15050505050565b81601260ff831610156133125760006132f083601261590d565b60ff16905061330081600a615a14565b61330a9085615a20565b915050613349565b60128260ff16111561334957600061332b60128461590d565b60ff16905061333b81600a615a14565b6133459085615a3f565b9150505b92915050565b6060816001141561337e575050604080518082019091526008815267457468657265756d60c01b602082015290565b81600514156133ad57505060408051808201909152600a81526932ba3432b932bab6969960b11b602082015290565b8161a4ec14156133d757505060408051808201909152600481526363656c6f60e01b602082015290565b8161aef3141561340157505060408051808201909152600481526363656c6f60e01b602082015290565b919050565b600061341130613906565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630c93e3bb3430858588336040518763ffffffff1660e01b8152600401613468959493929190615a61565b6000604051808303818588803b15801561348157600080fd5b505af1158015613495573d6000803e3d6000fd5b5050604051631c92115f60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169350631c92115f92506117659150859085908890600401615abf565b600081600114156134fe5750612711919050565b81600514156135105750612789919050565b8161a4ec14156135225750607d919050565b8161aef31415613535575061278d919050565b81607a14156134015750608a919050565b3030604051602001613559929190615270565b60408051601f1981840301815291815261ffff8616600090815260ff6020908152919020825161358e9391929091019061462a565b50610e76848685858534613b4b565b6135a681613144565b6136085760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610c47565b600080516020615bb583398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61364083613cd5565b60008251118061364d5750805b15611724576111b68383613d15565b6000808290506000808251602a14158061369c575082600081518110613684576136846155c7565b6020910101516001600160f81b031916600360fc1b14155b806136cd5750826001815181106136b5576136b56155c7565b6020910101516001600160f81b031916600f60fb1b14155b156136eb57604051636fa478cf60e11b815260040160405180910390fd5b60025b602a8110156137d157838181518110613709576137096155c7565b016020015160f81c915060618210801590613728575060668260ff1611155b1561373f5761373860578361590d565b91506137a8565b60418260ff1610158015613757575060468260ff1611155b156137675761373860378361590d565b60308260ff161015801561377f575060398260ff1611155b1561378f5761373860308361590d565b604051636fa478cf60e11b815260040160405180910390fd5b60026137b5826029615406565b60ff8416911b1b92909217916137ca816155dd565b90506136ee565b5090949350505050565b60006137e687613dfe565b90506001600160a01b038616301461382557600080516020615bd58339815191528187604051613817929190615b02565b60405180910390a150611ad7565b610d4785858584866000613ed2565b600061383f88614278565b90506001600160a01b038716301461387e57600080516020615bd58339815191528188604051613870929190615b02565b60405180910390a150610d47565b61187185858584866001613ed2565b600054610100900460ff166138b45760405162461bcd60e51b8152600401610c4790615854565b611af133612fe5565b600054610100900460ff166138e45760405162461bcd60e51b8152600401610c4790615854565b60fe80546001600160a01b0319166001600160a01b0392909216919091179055565b604051606082811b6001600160601b03191660208301529060009060340160408051601f198184030181528282528051838301909252601083526f181899199a1a9b1b9c1cb0b131b232b360811b6020840152805190935090919060009061396f906002615a20565b61397a90600261541d565b6001600160401b038111156139915761399161486b565b6040519080825280601f01601f1916602001820160405280156139bb576020820181803683370190505b509050600360fc1b816000815181106139d6576139d66155c7565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110613a0557613a056155c7565b60200101906001600160f81b031916908160001a90535060005b83811015613b4157826004868381518110613a3c57613a3c6155c7565b016020015182516001600160f81b031990911690911c60f81c908110613a6457613a646155c7565b01602001516001600160f81b03191682613a7f836002615a20565b613a8a90600261541d565b81518110613a9a57613a9a6155c7565b60200101906001600160f81b031916908160001a90535082858281518110613ac457613ac46155c7565b602091010151815160f89190911c600f16908110613ae457613ae46155c7565b01602001516001600160f81b03191682613aff836002615a20565b613b0a90600361541d565b81518110613b1a57613b1a6155c7565b60200101906001600160f81b031916908160001a905350613b3a816155dd565b9050613a1f565b5095945050505050565b61ffff8616600090815260ff602052604081208054613b69906154a9565b80601f0160208091040260200160405190810160405280929190818152602001828054613b95906154a9565b8015613be25780601f10613bb757610100808354040283529160200191613be2565b820191906000526020600020905b815481529060010190602001808311613bc557829003601f168201915b50505050509050805160001415613c545760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b6064820152608401610c47565b613c5f8787516142e8565b60fe5460405162c5803160e81b81526001600160a01b039091169063c5803100908490613c9a908b9086908c908c908c908c90600401615b19565b6000604051808303818588803b158015613cb357600080fd5b505af1158015613cc7573d6000803e3d6000fd5b505050505050505050505050565b613cde8161359d565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060613d2083613144565b613d7b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610c47565b600080846001600160a01b031684604051613d96919061589f565b600060405180830381855af49150503d8060008114613dd1576040519150601f19603f3d011682016040523d82523d6000602084013e613dd6565b606091505b509150915061267c8282604051806060016040528060278152602001615bf560279139614357565b805160208201206000907f564ccaf7594d66b1eaaea24fe01f0585bf52ee70852af4eac0cc4b04711cd0e2811415613e395750600192915050565b7f43ab905ae53adfdd46d0850022d385a6c09c15bfde5206c98fa0fc8dc340c3f8811415613e6a5750600592915050565b7f2ab2bf4c5cabc3000e2502e33470a863db2755809d7561237424a0eb373154c2811415613ecc577f000000000000000000000000000000000000000000000000000000000000000015613ec2575061aef392915050565b5061a4ec92915050565b50919050565b613edb836134ea565b61ffff16613eff5760405163068a505360e01b815260048101849052602401610c47565b61019560008483604051602001613f17929190615b80565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff1615613f805760405163c5426f8d60e01b815260206004820152600f60248201526e1cdbdd5c98d948191a5cd8589b1959608a1b6044820152606401610c47565b6000828152610194602052604090205460ff1615613fb457604051636e91c2f160e11b815260048101839052602401610c47565b613fc086868646614370565b600061403485613fce6123a7565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561400b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061402f9190615749565b61449d565b90506000614041826144f1565b600085815261019460205260409020805460ff19166001179055905061406687614510565b46600114806140755750466005145b1561411d576140826123a7565b6001600160a01b031663a9059cbb8861409b8486615406565b6040518363ffffffff1660e01b81526004016140b8929190615685565b6020604051808303816000875af11580156140d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140fb91906153b6565b614118576040516376420e1d60e01b815260040160405180910390fd5b61421c565b60675460405163bf40fac160e01b815260206004820152601060248201526f26a4a72a212aa9272faba920a82822a960811b60448201526001600160a01b039091169063bf40fac190606401602060405180830381865afa158015614186573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141aa91906153d3565b6001600160a01b03166340c10f1988846040518363ffffffff1660e01b81526004016141d7929190615685565b6020604051808303816000875af11580156141f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061421a91906153b6565b505b83876001600160a01b0316896001600160a01b03167f6cf712ce908185c8c38a073b7315f79687e7440fb057d9d1ca76a2509a1282ee89858a8960405161426694939291906157a4565b60405180910390a45050505050505050565b60008161ffff16612711141561429057506001919050565b8161ffff1661278914156142a657506005919050565b8161ffff16607d14156142bc575061a4ec919050565b8161ffff1661278d14156142d3575061aef3919050565b8161ffff16608a14156134015750607a919050565b61ffff8216600090815261010160205260409020548061430757506127105b808211156117245760405162461bcd60e51b815260206004820181905260248201527f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c617267656044820152606401610c47565b606083156143665750816116fe565b6116fe8383614600565b6001600160a01b0383161580614384575080155b156143a65782816040516314b2a5c360e31b8152600401610c47929190615685565b6143b36201518042615406565b61019f5410156143c9574261019f5560006101a0555b6143d66201518042615406565b6001600160a01b03851660009081526101a160205260409020541015614417576001600160a01b03841660009081526101a160205260408120428155600101555b6000806144248685611252565b909250905081614449578060405163c5426f8d60e01b8152600401610c479190614ef0565b8361019f600101600082825461445f919061541d565b90915550506001600160a01b03861660009081526101a160205260408120600101805486929061449090849061541d565b9091555050505050505050565b81601260ff831610156144d15760006144b783601261590d565b60ff1690506144c781600a615a14565b61330a9085615a3f565b60128260ff1611156144ea5760006132f060128461590d565b5090919050565b61019954600090612710906145069084615a20565b6133499190615a3f565b6101a2546001600160a01b03161580159061459857506101a2546040516374bf77e960e11b81526001600160a01b039091169063e97eefd290614557908490600401614834565b602060405180830381865afa158015614574573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061459891906153b6565b15611635576101a2546040516306ee3b9f60e31b81526001600160a01b0390911690633771dcf8906145ce908490600401614834565b600060405180830381600087803b1580156145e857600080fd5b505af19250505080156145f9575060015b6116355750565b8151156146105781518083602001fd5b8060405162461bcd60e51b8152600401610c479190614ef0565b828054614636906154a9565b90600052602060002090601f016020900481019282614658576000855561469e565b82601f1061467157805160ff191683800117855561469e565b8280016001018555821561469e579182015b8281111561469e578251825591602001919060010190614683565b506146aa929150614722565b5090565b8280546146ba906154a9565b90600052602060002090601f0160209004810192826146dc576000855561469e565b82601f106146f55782800160ff1982351617855561469e565b8280016001018555821561469e579182015b8281111561469e578235825591602001919060010190614707565b5b808211156146aa5760008155600101614723565b803561ffff8116811461340157600080fd5b60008083601f84011261475b57600080fd5b5081356001600160401b0381111561477257600080fd5b60208301915083602082850101111561156857600080fd5b80356001600160401b038116811461340157600080fd5b600080600080600080608087890312156147ba57600080fd5b6147c387614737565b955060208701356001600160401b03808211156147df57600080fd5b6147eb8a838b01614749565b90975095508591506147ff60408a0161478a565b9450606089013591508082111561481557600080fd5b5061482289828a01614749565b979a9699509497509295939492505050565b6001600160a01b0391909116815260200190565b6001600160a01b038116811461163557600080fd5b801515811461163557600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156148a9576148a961486b565b604052919050565b60006001600160401b038211156148ca576148ca61486b565b50601f01601f191660200190565b600082601f8301126148e957600080fd5b81356148fc6148f7826148b1565b614881565b81815284602083860101111561491157600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561494757600080fd5b61495087614737565b9550602087013561496081614848565b9450604087013561497081614848565b93506060870135925060808701356149878161485d565b915060a08701356001600160401b038111156149a257600080fd5b6149ae89828a016148d8565b9150509295509295509295565b6000602082840312156149cd57600080fd5b6116fe82614737565b6000806000806000608086880312156149ee57600080fd5b85356149f981614848565b9450602086013593506040860135925060608601356001600160401b03811115614a2257600080fd5b614a2e88828901614749565b969995985093965092949392505050565b60008060408385031215614a5257600080fd5b614a5b83614737565b946020939093013593505050565b600060208284031215614a7b57600080fd5b81356116fe8161485d565b60008060008060008060008060008060c08b8d031215614aa557600080fd5b8a35995060208b01356001600160401b0380821115614ac357600080fd5b614acf8e838f01614749565b909b50995060408d0135915080821115614ae857600080fd5b614af48e838f01614749565b909950975060608d0135915080821115614b0d57600080fd5b614b198e838f01614749565b909750955060808d0135915080821115614b3257600080fd5b50614b3f8d828e01614749565b9150809450508092505060a08b013590509295989b9194979a5092959850565b80356002811061340157600080fd5b60008060008060808587031215614b8457600080fd5b8435614b8f81614848565b93506020850135925060408501359150614bab60608601614b5f565b905092959194509250565b600060a08284031215614bc857600080fd5b60405160a081016001600160401b0381118282101715614bea57614bea61486b565b8060405250809150823581526020830135602082015260408301356040820152606083013560608201526080830135614c228161485d565b6080919091015292915050565b600060a08284031215614c4157600080fd5b6116fe8383614bb6565b60008060408385031215614c5e57600080fd5b8235614a5b81614848565b60005b83811015614c84578181015183820152602001614c6c565b838111156111b65750506000910152565b60008151808452614cad816020860160208601614c69565b601f01601f19169290920160200192915050565b8215158152604060208201526000614cdc6040830184614c95565b949350505050565b600060208284031215614cf657600080fd5b81356116fe81614848565b600080600060408486031215614d1657600080fd5b614d1f84614737565b925060208401356001600160401b03811115614d3a57600080fd5b614d4686828701614749565b9497909650939450505050565b600080600060608486031215614d6857600080fd5b8335614d7381614848565b95602085013595506040909401359392505050565b600060208284031215614d9a57600080fd5b5035919050565b60008060008060008060006080888a031215614dbc57600080fd5b8735965060208801356001600160401b0380821115614dda57600080fd5b614de68b838c01614749565b909850965060408a0135915080821115614dff57600080fd5b614e0b8b838c01614749565b909650945060608a0135915080821115614e2457600080fd5b50614e318a828b01614749565b989b979a50959850939692959293505050565b60008060408385031215614e5757600080fd5b8235614e6281614848565b915060208301356001600160401b03811115614e7d57600080fd5b614e89858286016148d8565b9150509250929050565b600080600060608486031215614ea857600080fd5b614eb184614737565b925060208401356001600160401b03811115614ecc57600080fd5b614ed8868287016148d8565b925050614ee76040850161478a565b90509250925092565b6020815260006116fe6020830184614c95565b600060608284031215614f1557600080fd5b604051606081016001600160401b0381118282101715614f3757614f3761486b565b80604052508091508235815260208301356020820152604083013560408201525092915050565b600060608284031215614f7057600080fd5b6116fe8383614f03565b60008060408385031215614f8d57600080fd5b614f9683614737565b9150614fa460208401614737565b90509250929050565b60008060008060608587031215614fc357600080fd5b8435614fce81614848565b93506020850135925060408501356001600160401b03811115614ff057600080fd5b614ffc87828801614749565b95989497509550505050565b61ffff91909116815260200190565b60006001600160401b038211156150305761503061486b565b5060051b60200190565b600082601f83011261504b57600080fd5b8135602061505b6148f783615017565b82815260059290921b8401810191818101908684111561507a57600080fd5b8286015b8481101561509e5780356150918161485d565b835291830191830161507e565b509695505050505050565b600080604083850312156150bc57600080fd5b82356001600160401b03808211156150d357600080fd5b818501915085601f8301126150e757600080fd5b813560206150f76148f783615017565b82815260059290921b8401810191818101908984111561511657600080fd5b948201945b838610156151345785358252948201949082019061511b565b9650508601359250508082111561514a57600080fd5b50614e898582860161503a565b60008060008060006080868803121561516f57600080fd5b61517886614737565b945061518660208701614737565b93506040860135925060608601356001600160401b03811115614a2257600080fd5b6000806000606084860312156151bd57600080fd5b6151c684614737565b92506151d460208501614737565b9150604084013590509250925092565b600080600080608085870312156151fa57600080fd5b61520385614737565b935061521160208601614737565b9250604085013561522181614848565b9396929550929360600135925050565b6000806000610120848603121561524757600080fd5b833561525281614848565b92506152618560208601614bb6565b9150614ee78560c08601614f03565b6001600160601b0319606093841b811682529190921b16601482015260280190565b8183823760009101908152919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000614cdc6020830184866152a2565b61ffff861681526001600160a01b038516602082015260a06040820181905260009061530d90830186614c95565b841515606084015282810360808401526153278185614c95565b98975050505050505050565b6000806040838503121561534657600080fd5b505080516020909101519092909150565b89815260c06020820152600061537160c083018a8c6152a2565b828103604084015261538481898b6152a2565b9050866060840152828103608084015261539f8186886152a2565b9150508260a08301529a9950505050505050505050565b6000602082840312156153c857600080fd5b81516116fe8161485d565b6000602082840312156153e557600080fd5b81516116fe81614848565b634e487b7160e01b600052601160045260246000fd5b600082821015615418576154186153f0565b500390565b60008219821115615430576154306153f0565b500190565b6020808252602c90820152600080516020615b9583398151915260408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c90820152600080516020615b9583398151915260408201526b6163746976652070726f787960a01b606082015260800190565b600181811c908216806154bd57607f821691505b60208210811415613ecc57634e487b7160e01b600052602260045260246000fd5b61ffff8416815260406020820152600061267c6040830184866152a2565b8681526080602082015260006155166080830187896152a2565b82810360408401526155298186886152a2565b915050826060830152979650505050505050565b6000806000806080858703121561555357600080fd5b84359350602085013561556581614848565b925061557360408601614b5f565b915060608501356001600160401b0381111561558e57600080fd5b61559a878288016148d8565b91505092959194509250565b8284823760609190911b6001600160601b0319169101908152601401919050565b634e487b7160e01b600052603260045260246000fd5b60006000198214156155f1576155f16153f0565b5060010190565b600061ffff8088168352808716602084015250846040830152608060608301526156266080830184866152a2565b979650505050505050565b61ffff8616815260806020820152600061564f6080830186886152a2565b6001600160401b0394909416604083015250606001529392505050565b60006020828403121561567e57600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b6000602082840312156156b057600080fd5b81516001600160401b038111156156c657600080fd5b8201601f810184136156d757600080fd5b80516156e56148f7826148b1565b8181528560208385010111156156fa57600080fd5b61267c826020830160208601614c69565b61ffff851681526080602082015260006157286080830186614c95565b6001600160401b038516604084015282810360608401526156268185614c95565b60006020828403121561575b57600080fd5b815160ff811681146116fe57600080fd5b634e487b7160e01b600052602160045260246000fd5b600281106157a057634e487b7160e01b600052602160045260246000fd5b9052565b84815260208101849052604081018390526080810161267c6060830184615782565b600080600080608085870312156157dc57600080fd5b84356157e781614848565b935060208501356157f781614848565b93969395505050506040820135916060013590565b6000806000806080858703121561582257600080fd5b845161582d81614848565b602086015190945061583e81614848565b6040860151606090960151949790965092505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600082516158b1818460208701614c69565b9190910192915050565b61ffff8616815260a0602082015260006158d860a0830187614c95565b6001600160401b038616604084015282810360608401526158f98186614c95565b905082810360808401526153278185614c95565b600060ff821660ff841680821015615927576159276153f0565b90039392505050565b600181815b8085111561596b578160001904821115615951576159516153f0565b8085161561595e57918102915b93841c9390800290615935565b509250929050565b60008261598257506001613349565b8161598f57506000613349565b81600181146159a557600281146159af576159cb565b6001915050613349565b60ff8411156159c0576159c06153f0565b50506001821b613349565b5060208310610133831016604e8410600b84101617156159ee575081810a613349565b6159f88383615930565b8060001904821115615a0c57615a0c6153f0565b029392505050565b60006116fe8383615973565b6000816000190483118215151615615a3a57615a3a6153f0565b500290565b600082615a5c57634e487b7160e01b600052601260045260246000fd5b500490565b600060018060a01b03808816835260a06020840152615a8360a0840188614c95565b8381036040850152615a958188614c95565b90508381036060850152615aa98187614c95565b9250508084166080840152509695505050505050565b606081526000615ad26060830186614c95565b8281036020840152615ae48186614c95565b90508281036040840152615af88185614c95565b9695505050505050565b9182526001600160a01b0316602082015260400190565b61ffff8716815260c060208201526000615b3660c0830188614c95565b8281036040840152615b488188614c95565b6001600160a01b0387811660608601528616608085015283810360a08501529050615b738185614c95565b9998505050505050505050565b828152604081016116fe602083018461578256fe46756e6374696f6e206d7573742062652063616c6c6564207468726f75676820360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc1eafb58197ea0dc76b9278ccad47f61a239f00b017d89a19081a89321cce213d416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212203606c6f5e03028c3497f70e677d6c79604b498cbe61683bc31847e0c747ffdf964736f6c634300080a0033",
  "deployedBytecode": "0x6080604052600436106102dd5760003560e01c80621d3567146102e2578063020051cf1461030457806305fead151461034e57806307e0db17146103835780630d187dd4146103a35780630df37483146103b657806310ddb137146103d6578063116191b6146103f65780631a3947951461042a5780631a98b2e01461044a5780631b3c90a81461046a5780631fec5c5c1461047f57806329b70872146104925780633095634a146104b25780633659cfe6146104e05780633d8b38f6146105005780633e6326fc146105305780633f1f4fa4146105505780633fa4d7db1461058c5780634162169f1461059f578063425cfb53146105bf57806342d65a8d146105f0578063452a93201461061057806349160658146106315780634f1ef2861461065157806352d1902d146106645780635551b979146106795780635aef7de61461068c5780635b8c41e6146106ac57806366ad5c8a146106fc57806369c20d361461071c5780636a22d8cc1461074d578063715018a61461078157806372891b2d146107965780637533d788146107ca5780637b0240c0146107f757806382dc737d146108345780638a0dac4a146108545780638cfd8f5c146108745780638da5cb5b146108ad578063950c8a74146108c25780639f38369a146108e3578063a4c0ed3614610903578063a6c3d16514610916578063b2f7667f14610936578063b353aaa714610953578063b5569f1814610973578063baf3292d146109b2578063c2b6b58c146109d2578063c4461834146109ed578063c6dd812f14610a03578063c78ab88214610a5c578063cbed8b9c14610a7c578063d1deba1f14610a9c578063d422794714610aaf578063d8b31c7714610ae4578063de5f72fd14610b04578063df2a5b3b14610b25578063e00dd16114610b45578063e1758bd814610b5c578063eb8d72b714610b71578063f2fde38b14610b91578063f3fef3a314610bb1578063f5ecbdbc14610bd1578063fad16abe14610bf1575b600080fd5b3480156102ee57600080fd5b506103026102fd3660046147a1565b610c11565b005b34801561031057600080fd5b506103387f000000000000000000000000000000000000000000000000000000000000000081565b6040516103459190614834565b60405180910390f35b34801561035a57600080fd5b5061036e61036936600461492e565b610d50565b60408051928352602083019190915201610345565b34801561038f57600080fd5b5061030261039e3660046149bb565b610e10565b6103026103b13660046149d6565b610e7d565b3480156103c257600080fd5b506103026103d1366004614a3f565b610ec4565b3480156103e257600080fd5b506103026103f13660046149bb565b610ee4565b34801561040257600080fd5b506103387f000000000000000000000000000000000000000000000000000000000000000081565b34801561043657600080fd5b50610302610445366004614a69565b610f1c565b34801561045657600080fd5b50610302610465366004614a86565b610f8d565b34801561047657600080fd5b50610302611070565b61030261048d366004614b6e565b611197565b34801561049e57600080fd5b506103026104ad366004614c2f565b6111bc565b3480156104be57600080fd5b506104d26104cd366004614c4b565b611252565b604051610345929190614cc1565b3480156104ec57600080fd5b506103026104fb366004614ce4565b61156f565b34801561050c57600080fd5b5061052061051b366004614d01565b611638565b6040519015158152602001610345565b34801561053c57600080fd5b50606754610338906001600160a01b031681565b34801561055c57600080fd5b5061057e61056b3660046149bb565b6101016020526000908152604090205481565b604051908152602001610345565b61030261059a366004614d53565b611705565b3480156105ab57600080fd5b50606554610338906001600160a01b031681565b3480156105cb57600080fd5b506105206105da366004614d88565b6101946020526000908152604090205460ff1681565b3480156105fc57600080fd5b5061030261060b366004614d01565b611729565b34801561061c57600080fd5b5061019354610338906001600160a01b031681565b34801561063d57600080fd5b5061030261064c366004614da1565b611793565b61030261065f366004614e44565b61187b565b34801561067057600080fd5b5061057e611935565b610302610687366004614d53565b6119e3565b34801561069857600080fd5b50606654610338906001600160a01b031681565b3480156106b857600080fd5b5061057e6106c7366004614e93565b610130602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b34801561070857600080fd5b506103026107173660046147a1565b611a03565b34801561072857600080fd5b50610520610737366004614d88565b6101956020526000908152604090205460ff1681565b34801561075957600080fd5b506103387f000000000000000000000000000000000000000000000000000000000000000081565b34801561078d57600080fd5b50610302611adf565b3480156107a257600080fd5b506105207f000000000000000000000000000000000000000000000000000000000000000081565b3480156107d657600080fd5b506107ea6107e53660046149bb565b611af3565b6040516103459190614ef0565b34801561080357600080fd5b5061019754610198546101995461081992919083565b60408051938452602084019290925290820152606001610345565b34801561084057600080fd5b5061030261084f366004614f5e565b611b8d565b34801561086057600080fd5b5061030261086f366004614ce4565b611c03565b34801561088057600080fd5b5061057e61088f366004614f7a565b61010060209081526000928352604080842090915290825290205481565b3480156108b957600080fd5b50610338611c83565b3480156108ce57600080fd5b5061010254610338906001600160a01b031681565b3480156108ef57600080fd5b506107ea6108fe3660046149bb565b611c92565b610520610911366004614fad565b611da2565b34801561092257600080fd5b50610302610931366004614d01565b611e17565b34801561094257600080fd5b5061019f546101a05461036e919082565b34801561095f57600080fd5b5060fe54610338906001600160a01b031681565b34801561097f57600080fd5b506109a561098e366004614d88565b6101a46020526000908152604090205461ffff1681565b6040516103459190615008565b3480156109be57600080fd5b506103026109cd366004614ce4565b611eaa565b3480156109de57600080fd5b50610196546105209060ff1681565b3480156109f957600080fd5b5061057e61271081565b348015610a0f57600080fd5b5061019a5461019b5461019c5461019d5461019e54610a32949392919060ff1685565b6040805195865260208601949094529284019190915260608301521515608082015260a001610345565b348015610a6857600080fd5b50610302610a773660046150a9565b611f09565b348015610a8857600080fd5b50610302610a97366004615157565b611fe3565b610302610aaa3660046147a1565b61205c565b348015610abb57600080fd5b5061036e610aca366004614ce4565b6101a1602052600090815260409020805460019091015482565b348015610af057600080fd5b50610302610aff366004614ce4565b612274565b348015610b1057600080fd5b506101a254610338906001600160a01b031681565b348015610b3157600080fd5b50610302610b403660046151a8565b6122f4565b348015610b5157600080fd5b5061057e6101a35481565b348015610b6857600080fd5b506103386123a7565b348015610b7d57600080fd5b50610302610b8c366004614d01565b612434565b348015610b9d57600080fd5b50610302610bac366004614ce4565b61248e565b348015610bbd57600080fd5b50610302610bcc366004614c4b565b612504565b348015610bdd57600080fd5b506107ea610bec3660046151e4565b6125f2565b348015610bfd57600080fd5b50610302610c0c366004615231565b612685565b60fe546001600160a01b0316336001600160a01b031614610c505733604051634a43969960e11b8152600401610c479190614834565b60405180910390fd5b60003030604051602001610c65929190615270565b60408051601f19818403018152919052805190915085141580610c8757508051155b80610caf575080516020820120604051610ca49088908890615292565b604051809103902014155b15610cd15785856040516306543c8960e31b8152600401610c479291906152cb565b610d478787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a018190048102820181019092528881528a93509150889088908190840183828082843760009201919091525061284092505050565b50505050505050565b604080516001600160a01b0387811660208301528681168284015260608201869052600060808084018290528451808503909101815260a084019485905260fe5463040a7bb160e41b90955290938493919216906340a7bb1090610dc0908c90309086908b908b9060a4016152df565b6040805180830381865afa158015610ddc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e009190615333565b9250925050965096945050505050565b610e186128b9565b60fe546040516307e0db1760e01b81526001600160a01b03909116906307e0db1790610e48908490600401615008565b600060405180830381600087803b158015610e6257600080fd5b505af1158015610e76573d6000803e3d6000fd5b5050505050565b610e76338686866000600188888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061291892505050565b610ecc6128b9565b61ffff90911660009081526101016020526040902055565b610eec6128b9565b60fe546040516310ddb13760e01b81526001600160a01b03909116906310ddb13790610e48908490600401615008565b610193546001600160a01b0316331480610f4057506066546001600160a01b031633145b80610f5a575033610f4f611c83565b6001600160a01b0316145b610f79573360405163b63b5ad960e01b8152600401610c479190614834565b610196805460ff1916911515919091179055565b60008585604051610f9f929190615292565b604051908190038120631876eed960e01b825291506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631876eed990611003908e908e908e908e908e9089908d908d908d90600401615357565b6020604051808303816000875af1158015611022573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104691906153b6565b61106357604051631403112d60e21b815260040160405180910390fd5b5050505050505050505050565b60675460405163bf40fac160e01b815260206004820152600a60248201526921a7a72a2927a62622a960b11b60448201526001600160a01b039091169063bf40fac190606401602060405180830381865afa1580156110d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f791906153d3565b606580546001600160a01b0319166001600160a01b0392909216918217905560408051632d77bef360e11b81529051635aef7de6916004808201926020929091908290030181865afa158015611151573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117591906153d3565b606680546001600160a01b0319166001600160a01b0392909216919091179055565b6111b63385858560008660405180602001604052806000815250612918565b50505050565b610193546001600160a01b03163314806111e057506066546001600160a01b031633145b806111fa5750336111ef611c83565b6001600160a01b0316145b611219573360405163b63b5ad960e01b8152600401610c479190614834565b805161019a55602081015161019b55604081015161019c55606081015161019d556080015161019e805460ff1916911515919091179055565b6101965460009060609060ff161561128b57505060408051808201909152600681526518db1bdcd95960d21b6020820152600090611568565b61019d548310156112c05750506040805180820190915260098152681b5a5b905b5bdd5b9d60ba1b6020820152600090611568565b6001600160a01b03841660009081526101a160205260409020600101546112ea6201518042615406565b6001600160a01b03861660009081526101a16020526040902054101561131157508261131e565b61131b848261541d565b90505b61019e5460ff16801561133b57506067546001600160a01b031615155b1561147f5760675460405163bf40fac160e01b81526020600482015260086024820152674944454e5449545960c01b60448201526000916001600160a01b03169063bf40fac190606401602060405180830381865afa1580156113a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c691906153d3565b90506001600160a01b0381161561147d57604051633af32abf60e01b81526001600160a01b03821690633af32abf90611403908990600401614834565b602060405180830381865afa158015611420573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144491906153b6565b61147d5760006040518060400160405280600f81526020016e1b9bdd081dda1a5d195b1a5cdd1959608a1b815250935093505050611568565b505b61019c548111156114bd5750506040805180820190915260118152701858d8dbdd5b9d11185a5b1e531a5b5a5d607a1b602082015260009150611568565b61019b548411156114f15750506040805180820190915260078152661d1e131a5b5a5d60ca1b602082015260009150611568565b6114fe6201518042615406565b61019f54101561150d57611552565b61019a546101a05461152090869061541d565b111561155257505060408051808201909152600a81526919185a5b1e531a5b5a5d60b21b602082015260009150611568565b5050604080516020810190915260008152600191505b9250929050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156115b85760405162461bcd60e51b8152600401610c4790615435565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166115ea612d80565b6001600160a01b0316146116105760405162461bcd60e51b8152600401610c479061546f565b61161981612d9c565b6040805160008082526020820190925261163591839190612da4565b50565b61ffff8316600090815260ff602052604081208054829190611659906154a9565b80601f0160208091040260200160405190810160405280929190818152602001828054611685906154a9565b80156116d25780601f106116a7576101008083540402835291602001916116d2565b820191906000526020600020905b8154815290600101906020018083116116b557829003601f168201915b5050505050905083836040516116e9929190615292565b60405180910390208180519060200120149150505b9392505050565b6117243384848460008060405180602001604052806000815250612918565b505050565b6117316128b9565b60fe546040516342d65a8d60e01b81526001600160a01b03909116906342d65a8d90611765908690869086906004016154de565b600060405180830381600087803b15801561177f57600080fd5b505af1158015610d47573d6000803e3d6000fd5b600082826040516117a5929190615292565b604051908190038120635f6970c360e01b825291506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635f6970c390611803908b908b908b908b908b9089906004016154fc565b6020604051808303816000875af1158015611822573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184691906153b6565b61186357604051631403112d60e21b815260040160405180910390fd5b611871878787878787612f0f565b5050505050505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156118c45760405162461bcd60e51b8152600401610c4790615435565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166118f6612d80565b6001600160a01b03161461191c5760405162461bcd60e51b8152600401610c479061546f565b61192582612d9c565b61193182826001612da4565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146119d05760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c6044820152771b1959081d1a1c9bdd59da0819195b1959d85d1958d85b1b60421b6064820152608401610c47565b50600080516020615bb583398151915290565b611724338484846000600160405180602001604052806000815250612918565b333014611a615760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b6064820152608401610c47565b611ad78686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f890181900481028201810190925287815289935091508790879081908401838280828437600092019190915250612fb192505050565b505050505050565b611ae76128b9565b611af16000612fe5565b565b60ff6020526000908152604090208054611b0c906154a9565b80601f0160208091040260200160405190810160405280929190818152602001828054611b38906154a9565b8015611b855780601f10611b5a57610100808354040283529160200191611b85565b820191906000526020600020905b815481529060010190602001808311611b6857829003601f168201915b505050505081565b610193546001600160a01b0316331480611bb157506066546001600160a01b031633145b80611bcb575033611bc0611c83565b6001600160a01b0316145b611bea573360405163b63b5ad960e01b8152600401610c479190614834565b8051610197556020810151610198556040015161019955565b610193546001600160a01b0316331480611c2757506066546001600160a01b031633145b80611c41575033611c36611c83565b6001600160a01b0316145b611c60573360405163b63b5ad960e01b8152600401610c479190614834565b61019380546001600160a01b0319166001600160a01b0392909216919091179055565b60cc546001600160a01b031690565b61ffff8116600090815260ff6020526040812080546060929190611cb5906154a9565b80601f0160208091040260200160405190810160405280929190818152602001828054611ce1906154a9565b8015611d2e5780601f10611d0357610100808354040283529160200191611d2e565b820191906000526020600020905b815481529060010190602001808311611d1157829003601f168201915b50505050509050805160001415611d875760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f72640000006044820152606401610c47565b6116fe600060148351611d9a9190615406565b839190613037565b6000611dac6123a7565b6001600160a01b0316336001600160a01b031614611ddf573360405163077e7d6560e01b8152600401610c479190614834565b6000808080611df08688018861553d565b9350935093509350611e088984868b60018787612918565b50600198975050505050505050565b611e1f6128b9565b818130604051602001611e34939291906155a6565b60408051601f1981840301815291815261ffff8516600090815260ff60209081529190208251611e699391929091019061462a565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce838383604051611e9d939291906154de565b60405180910390a1505050565b611eb26128b9565b61010280546001600160a01b0319166001600160a01b0383161790556040517f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b90611efe908390614834565b60405180910390a150565b610193546001600160a01b0316331480611f2d57506066546001600160a01b031633145b80611f47575033611f3c611c83565b6001600160a01b0316145b611f66573360405163b63b5ad960e01b8152600401610c479190614834565b60005b825181101561172457818181518110611f8457611f846155c7565b60200260200101516101956000858481518110611fa357611fa36155c7565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611fdb906155dd565b915050611f69565b611feb6128b9565b60fe546040516332fb62e760e21b81526001600160a01b039091169063cbed8b9c9061202390889088908890889088906004016155f8565b600060405180830381600087803b15801561203d57600080fd5b505af1158015612051573d6000803e3d6000fd5b505050505050505050565b61ffff86166000908152610130602052604080822090516120809088908890615292565b90815260408051602092819003830190206001600160401b038716600090815292529020549050806121005760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b6064820152608401610c47565b808383604051612111929190615292565b6040518091039020146121705760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b6064820152608401610c47565b61ffff87166000908152610130602052604080822090516121949089908990615292565b90815260408051602092819003830181206001600160401b038916600090815290845282902093909355601f8801829004820283018201905286825261222c918991899089908190840183828082843760009201919091525050604080516020601f8a018190048102820181019092528881528a935091508890889081908401838280828437600092019190915250612fb192505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051612263959493929190615631565b60405180910390a150505050505050565b610193546001600160a01b031633148061229857506066546001600160a01b031633145b806122b25750336122a7611c83565b6001600160a01b0316145b6122d1573360405163b63b5ad960e01b8152600401610c479190614834565b6101a280546001600160a01b0319166001600160a01b0392909216919091179055565b6122fc6128b9565b600081116123445760405162461bcd60e51b81526020600482015260156024820152744c7a4170703a20696e76616c6964206d696e47617360581b6044820152606401610c47565b61ffff8381166000818152610100602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac090606001611e9d565b60675460405163bf40fac160e01b815260206004820152600a60248201526923a7a7a22227a62620a960b11b60448201526000916001600160a01b03169063bf40fac190606401602060405180830381865afa15801561240b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242f91906153d3565b905090565b61243c6128b9565b61ffff8316600090815260ff6020526040902061245a9083836146ae565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab838383604051611e9d939291906154de565b6124966128b9565b6001600160a01b0381166124fb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c47565b61163581612fe5565b61250c6128b9565b80612581576040516370a0823160e01b81526001600160a01b038316906370a082319061253d903090600401614834565b602060405180830381865afa15801561255a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257e919061566c565b90505b60405163a9059cbb60e01b81526001600160a01b0383169063a9059cbb906125af9033908590600401615685565b6020604051808303816000875af11580156125ce573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172491906153b6565b60fe54604051633d7b2f6f60e21b815261ffff808716600483015285166024820152306044820152606481018390526060916001600160a01b03169063f5ecbdbc90608401600060405180830381865afa158015612654573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261267c919081019061569e565b95945050505050565b600054610100900460ff16158080156126a55750600054600160ff909116105b806126c657506126b430613144565b1580156126c6575060005460ff166001145b6127295760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610c47565b6000805460ff19166001179055801561274c576000805461ff0019166101001790555b61275584613153565b61277e7f0000000000000000000000000000000000000000000000000000000000000000613176565b61019380546001600160a01b031916331790556066546127a6906001600160a01b031661248e565b825161019a5560208084015161019b5560408085015161019c55606085015161019d55608085015161019e805460ff191691151591909117905583516101975590830151610198558201516101995580156111b6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b6000806128a35a60966366ad5c8a60e01b89898989604051602401612868949392919061570b565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152309291906131ae565b9150915081611ad757611ad78686868685613238565b336128c2611c83565b6001600160a01b031614611af15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c47565b6101965460ff16156129565760405163c5426f8d60e01b815260206004820152600660248201526518db1bdcd95960d21b6044820152606401610c47565b82612a8057466001148061296a5750466005145b15612a14576129776123a7565b6040516323b872dd60e01b81526001600160a01b0389811660048301523060248301526044820187905291909116906323b872dd906064016020604051808303816000875af11580156129ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129f291906153b6565b612a0f576040516316431e9360e11b815260040160405180910390fd5b612aff565b612a1c6123a7565b6001600160a01b03166379cc679088866040518363ffffffff1660e01b8152600401612a49929190615685565b600060405180830381600087803b158015612a6357600080fd5b505af1158015612a77573d6000803e3d6000fd5b50505050612aff565b46600114158015612a92575046600514155b15612aff57612a9f6123a7565b6001600160a01b03166342966c68856040518263ffffffff1660e01b8152600401612acc91815260200190565b600060405180830381600087803b158015612ae657600080fd5b505af1158015612afa573d6000803e3d6000fd5b505050505b6000612b7385612b0d6123a7565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6e9190615749565b6132d6565b905034612b9357604051630ba4e53360e21b815260040160405180910390fd5b600030466101a38054906000612ba8836155dd565b90915550604080516001600160a01b039094166020850152830191909152606082015260800160408051808303601f1901815282825280516020918201206001600160a01b03808e1692850192909252908b16918301919091526060820184905260808201819052915060009060a00160408051601f1981840301815291905290506000856001811115612c3e57612c3e61576c565b1415612c87576000612c4f8961334f565b9050805160001415612c775760405163068a505360e01b8152600481018a9052602401610c47565b612c818282613406565b50612d22565b6001856001811115612c9b57612c9b61576c565b1415612d22576000612cac896134ea565b905061ffff8116612cd35760405163068a505360e01b8152600481018a9052602401610c47565b6000612ce4828d8d8860008b610d50565b50905034811115612d11576040516324a89fab60e21b815260048101829052346024820152604401610c47565b612d1f83838e60008a613546565b50505b81896001600160a01b03168b6001600160a01b03167fabeeb7182c7294cd8efcd40e9ff952c1b759c2165b3634aac589429de5d55ad08b87428b604051612d6c94939291906157a4565b60405180910390a450505050505050505050565b600080516020615bb5833981519152546001600160a01b031690565b6116356128b9565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615612dd7576117248361359d565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612e31575060408051601f3d908101601f19168201909252612e2e9181019061566c565b60015b612e945760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610c47565b600080516020615bb58339815191528114612f035760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610c47565b50611724838383613637565b6000612f5085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061365c92505050565b90506000808080612f63868801886157c6565b93509350935093506110638b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525089925088915087905086866137db565b60008060008084806020019051810190612fcb919061580c565b929650909450925090503061205189828988888888613834565b60cc80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60608161304581601f61541d565b10156130845760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610c47565b61308e828461541d565b845110156130d25760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610c47565b6060821580156130f1576040519150600082526020820160405261313b565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561312a578051835260209283019201613112565b5050858452601f01601f1916604052505b50949350505050565b6001600160a01b03163b151590565b606780546001600160a01b0319166001600160a01b038316179055611635611070565b600054610100900460ff1661319d5760405162461bcd60e51b8152600401610c4790615854565b6131a561388d565b611635816138bd565b6000606060008060008661ffff166001600160401b038111156131d3576131d361486b565b6040519080825280601f01601f1916602001820160405280156131fd576020820181803683370190505b50905060008087516020890160008d8df191503d92508683111561321f578692505b828152826000602083013e909890975095505050505050565b818051906020012061013060008761ffff1661ffff1681526020019081526020016000208560405161326a919061589f565b9081526040805191829003602090810183206001600160401b0388166000908152915220919091557fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c906132c790879087908790879087906158bb565b60405180910390a15050505050565b81601260ff831610156133125760006132f083601261590d565b60ff16905061330081600a615a14565b61330a9085615a20565b915050613349565b60128260ff16111561334957600061332b60128461590d565b60ff16905061333b81600a615a14565b6133459085615a3f565b9150505b92915050565b6060816001141561337e575050604080518082019091526008815267457468657265756d60c01b602082015290565b81600514156133ad57505060408051808201909152600a81526932ba3432b932bab6969960b11b602082015290565b8161a4ec14156133d757505060408051808201909152600481526363656c6f60e01b602082015290565b8161aef3141561340157505060408051808201909152600481526363656c6f60e01b602082015290565b919050565b600061341130613906565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630c93e3bb3430858588336040518763ffffffff1660e01b8152600401613468959493929190615a61565b6000604051808303818588803b15801561348157600080fd5b505af1158015613495573d6000803e3d6000fd5b5050604051631c92115f60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169350631c92115f92506117659150859085908890600401615abf565b600081600114156134fe5750612711919050565b81600514156135105750612789919050565b8161a4ec14156135225750607d919050565b8161aef31415613535575061278d919050565b81607a14156134015750608a919050565b3030604051602001613559929190615270565b60408051601f1981840301815291815261ffff8616600090815260ff6020908152919020825161358e9391929091019061462a565b50610e76848685858534613b4b565b6135a681613144565b6136085760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610c47565b600080516020615bb583398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61364083613cd5565b60008251118061364d5750805b15611724576111b68383613d15565b6000808290506000808251602a14158061369c575082600081518110613684576136846155c7565b6020910101516001600160f81b031916600360fc1b14155b806136cd5750826001815181106136b5576136b56155c7565b6020910101516001600160f81b031916600f60fb1b14155b156136eb57604051636fa478cf60e11b815260040160405180910390fd5b60025b602a8110156137d157838181518110613709576137096155c7565b016020015160f81c915060618210801590613728575060668260ff1611155b1561373f5761373860578361590d565b91506137a8565b60418260ff1610158015613757575060468260ff1611155b156137675761373860378361590d565b60308260ff161015801561377f575060398260ff1611155b1561378f5761373860308361590d565b604051636fa478cf60e11b815260040160405180910390fd5b60026137b5826029615406565b60ff8416911b1b92909217916137ca816155dd565b90506136ee565b5090949350505050565b60006137e687613dfe565b90506001600160a01b038616301461382557600080516020615bd58339815191528187604051613817929190615b02565b60405180910390a150611ad7565b610d4785858584866000613ed2565b600061383f88614278565b90506001600160a01b038716301461387e57600080516020615bd58339815191528188604051613870929190615b02565b60405180910390a150610d47565b61187185858584866001613ed2565b600054610100900460ff166138b45760405162461bcd60e51b8152600401610c4790615854565b611af133612fe5565b600054610100900460ff166138e45760405162461bcd60e51b8152600401610c4790615854565b60fe80546001600160a01b0319166001600160a01b0392909216919091179055565b604051606082811b6001600160601b03191660208301529060009060340160408051601f198184030181528282528051838301909252601083526f181899199a1a9b1b9c1cb0b131b232b360811b6020840152805190935090919060009061396f906002615a20565b61397a90600261541d565b6001600160401b038111156139915761399161486b565b6040519080825280601f01601f1916602001820160405280156139bb576020820181803683370190505b509050600360fc1b816000815181106139d6576139d66155c7565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110613a0557613a056155c7565b60200101906001600160f81b031916908160001a90535060005b83811015613b4157826004868381518110613a3c57613a3c6155c7565b016020015182516001600160f81b031990911690911c60f81c908110613a6457613a646155c7565b01602001516001600160f81b03191682613a7f836002615a20565b613a8a90600261541d565b81518110613a9a57613a9a6155c7565b60200101906001600160f81b031916908160001a90535082858281518110613ac457613ac46155c7565b602091010151815160f89190911c600f16908110613ae457613ae46155c7565b01602001516001600160f81b03191682613aff836002615a20565b613b0a90600361541d565b81518110613b1a57613b1a6155c7565b60200101906001600160f81b031916908160001a905350613b3a816155dd565b9050613a1f565b5095945050505050565b61ffff8616600090815260ff602052604081208054613b69906154a9565b80601f0160208091040260200160405190810160405280929190818152602001828054613b95906154a9565b8015613be25780601f10613bb757610100808354040283529160200191613be2565b820191906000526020600020905b815481529060010190602001808311613bc557829003601f168201915b50505050509050805160001415613c545760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b6064820152608401610c47565b613c5f8787516142e8565b60fe5460405162c5803160e81b81526001600160a01b039091169063c5803100908490613c9a908b9086908c908c908c908c90600401615b19565b6000604051808303818588803b158015613cb357600080fd5b505af1158015613cc7573d6000803e3d6000fd5b505050505050505050505050565b613cde8161359d565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060613d2083613144565b613d7b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610c47565b600080846001600160a01b031684604051613d96919061589f565b600060405180830381855af49150503d8060008114613dd1576040519150601f19603f3d011682016040523d82523d6000602084013e613dd6565b606091505b509150915061267c8282604051806060016040528060278152602001615bf560279139614357565b805160208201206000907f564ccaf7594d66b1eaaea24fe01f0585bf52ee70852af4eac0cc4b04711cd0e2811415613e395750600192915050565b7f43ab905ae53adfdd46d0850022d385a6c09c15bfde5206c98fa0fc8dc340c3f8811415613e6a5750600592915050565b7f2ab2bf4c5cabc3000e2502e33470a863db2755809d7561237424a0eb373154c2811415613ecc577f000000000000000000000000000000000000000000000000000000000000000015613ec2575061aef392915050565b5061a4ec92915050565b50919050565b613edb836134ea565b61ffff16613eff5760405163068a505360e01b815260048101849052602401610c47565b61019560008483604051602001613f17929190615b80565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff1615613f805760405163c5426f8d60e01b815260206004820152600f60248201526e1cdbdd5c98d948191a5cd8589b1959608a1b6044820152606401610c47565b6000828152610194602052604090205460ff1615613fb457604051636e91c2f160e11b815260048101839052602401610c47565b613fc086868646614370565b600061403485613fce6123a7565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561400b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061402f9190615749565b61449d565b90506000614041826144f1565b600085815261019460205260409020805460ff19166001179055905061406687614510565b46600114806140755750466005145b1561411d576140826123a7565b6001600160a01b031663a9059cbb8861409b8486615406565b6040518363ffffffff1660e01b81526004016140b8929190615685565b6020604051808303816000875af11580156140d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140fb91906153b6565b614118576040516376420e1d60e01b815260040160405180910390fd5b61421c565b60675460405163bf40fac160e01b815260206004820152601060248201526f26a4a72a212aa9272faba920a82822a960811b60448201526001600160a01b039091169063bf40fac190606401602060405180830381865afa158015614186573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141aa91906153d3565b6001600160a01b03166340c10f1988846040518363ffffffff1660e01b81526004016141d7929190615685565b6020604051808303816000875af11580156141f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061421a91906153b6565b505b83876001600160a01b0316896001600160a01b03167f6cf712ce908185c8c38a073b7315f79687e7440fb057d9d1ca76a2509a1282ee89858a8960405161426694939291906157a4565b60405180910390a45050505050505050565b60008161ffff16612711141561429057506001919050565b8161ffff1661278914156142a657506005919050565b8161ffff16607d14156142bc575061a4ec919050565b8161ffff1661278d14156142d3575061aef3919050565b8161ffff16608a14156134015750607a919050565b61ffff8216600090815261010160205260409020548061430757506127105b808211156117245760405162461bcd60e51b815260206004820181905260248201527f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c617267656044820152606401610c47565b606083156143665750816116fe565b6116fe8383614600565b6001600160a01b0383161580614384575080155b156143a65782816040516314b2a5c360e31b8152600401610c47929190615685565b6143b36201518042615406565b61019f5410156143c9574261019f5560006101a0555b6143d66201518042615406565b6001600160a01b03851660009081526101a160205260409020541015614417576001600160a01b03841660009081526101a160205260408120428155600101555b6000806144248685611252565b909250905081614449578060405163c5426f8d60e01b8152600401610c479190614ef0565b8361019f600101600082825461445f919061541d565b90915550506001600160a01b03861660009081526101a160205260408120600101805486929061449090849061541d565b9091555050505050505050565b81601260ff831610156144d15760006144b783601261590d565b60ff1690506144c781600a615a14565b61330a9085615a3f565b60128260ff1611156144ea5760006132f060128461590d565b5090919050565b61019954600090612710906145069084615a20565b6133499190615a3f565b6101a2546001600160a01b03161580159061459857506101a2546040516374bf77e960e11b81526001600160a01b039091169063e97eefd290614557908490600401614834565b602060405180830381865afa158015614574573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061459891906153b6565b15611635576101a2546040516306ee3b9f60e31b81526001600160a01b0390911690633771dcf8906145ce908490600401614834565b600060405180830381600087803b1580156145e857600080fd5b505af19250505080156145f9575060015b6116355750565b8151156146105781518083602001fd5b8060405162461bcd60e51b8152600401610c479190614ef0565b828054614636906154a9565b90600052602060002090601f016020900481019282614658576000855561469e565b82601f1061467157805160ff191683800117855561469e565b8280016001018555821561469e579182015b8281111561469e578251825591602001919060010190614683565b506146aa929150614722565b5090565b8280546146ba906154a9565b90600052602060002090601f0160209004810192826146dc576000855561469e565b82601f106146f55782800160ff1982351617855561469e565b8280016001018555821561469e579182015b8281111561469e578235825591602001919060010190614707565b5b808211156146aa5760008155600101614723565b803561ffff8116811461340157600080fd5b60008083601f84011261475b57600080fd5b5081356001600160401b0381111561477257600080fd5b60208301915083602082850101111561156857600080fd5b80356001600160401b038116811461340157600080fd5b600080600080600080608087890312156147ba57600080fd5b6147c387614737565b955060208701356001600160401b03808211156147df57600080fd5b6147eb8a838b01614749565b90975095508591506147ff60408a0161478a565b9450606089013591508082111561481557600080fd5b5061482289828a01614749565b979a9699509497509295939492505050565b6001600160a01b0391909116815260200190565b6001600160a01b038116811461163557600080fd5b801515811461163557600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156148a9576148a961486b565b604052919050565b60006001600160401b038211156148ca576148ca61486b565b50601f01601f191660200190565b600082601f8301126148e957600080fd5b81356148fc6148f7826148b1565b614881565b81815284602083860101111561491157600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561494757600080fd5b61495087614737565b9550602087013561496081614848565b9450604087013561497081614848565b93506060870135925060808701356149878161485d565b915060a08701356001600160401b038111156149a257600080fd5b6149ae89828a016148d8565b9150509295509295509295565b6000602082840312156149cd57600080fd5b6116fe82614737565b6000806000806000608086880312156149ee57600080fd5b85356149f981614848565b9450602086013593506040860135925060608601356001600160401b03811115614a2257600080fd5b614a2e88828901614749565b969995985093965092949392505050565b60008060408385031215614a5257600080fd5b614a5b83614737565b946020939093013593505050565b600060208284031215614a7b57600080fd5b81356116fe8161485d565b60008060008060008060008060008060c08b8d031215614aa557600080fd5b8a35995060208b01356001600160401b0380821115614ac357600080fd5b614acf8e838f01614749565b909b50995060408d0135915080821115614ae857600080fd5b614af48e838f01614749565b909950975060608d0135915080821115614b0d57600080fd5b614b198e838f01614749565b909750955060808d0135915080821115614b3257600080fd5b50614b3f8d828e01614749565b9150809450508092505060a08b013590509295989b9194979a5092959850565b80356002811061340157600080fd5b60008060008060808587031215614b8457600080fd5b8435614b8f81614848565b93506020850135925060408501359150614bab60608601614b5f565b905092959194509250565b600060a08284031215614bc857600080fd5b60405160a081016001600160401b0381118282101715614bea57614bea61486b565b8060405250809150823581526020830135602082015260408301356040820152606083013560608201526080830135614c228161485d565b6080919091015292915050565b600060a08284031215614c4157600080fd5b6116fe8383614bb6565b60008060408385031215614c5e57600080fd5b8235614a5b81614848565b60005b83811015614c84578181015183820152602001614c6c565b838111156111b65750506000910152565b60008151808452614cad816020860160208601614c69565b601f01601f19169290920160200192915050565b8215158152604060208201526000614cdc6040830184614c95565b949350505050565b600060208284031215614cf657600080fd5b81356116fe81614848565b600080600060408486031215614d1657600080fd5b614d1f84614737565b925060208401356001600160401b03811115614d3a57600080fd5b614d4686828701614749565b9497909650939450505050565b600080600060608486031215614d6857600080fd5b8335614d7381614848565b95602085013595506040909401359392505050565b600060208284031215614d9a57600080fd5b5035919050565b60008060008060008060006080888a031215614dbc57600080fd5b8735965060208801356001600160401b0380821115614dda57600080fd5b614de68b838c01614749565b909850965060408a0135915080821115614dff57600080fd5b614e0b8b838c01614749565b909650945060608a0135915080821115614e2457600080fd5b50614e318a828b01614749565b989b979a50959850939692959293505050565b60008060408385031215614e5757600080fd5b8235614e6281614848565b915060208301356001600160401b03811115614e7d57600080fd5b614e89858286016148d8565b9150509250929050565b600080600060608486031215614ea857600080fd5b614eb184614737565b925060208401356001600160401b03811115614ecc57600080fd5b614ed8868287016148d8565b925050614ee76040850161478a565b90509250925092565b6020815260006116fe6020830184614c95565b600060608284031215614f1557600080fd5b604051606081016001600160401b0381118282101715614f3757614f3761486b565b80604052508091508235815260208301356020820152604083013560408201525092915050565b600060608284031215614f7057600080fd5b6116fe8383614f03565b60008060408385031215614f8d57600080fd5b614f9683614737565b9150614fa460208401614737565b90509250929050565b60008060008060608587031215614fc357600080fd5b8435614fce81614848565b93506020850135925060408501356001600160401b03811115614ff057600080fd5b614ffc87828801614749565b95989497509550505050565b61ffff91909116815260200190565b60006001600160401b038211156150305761503061486b565b5060051b60200190565b600082601f83011261504b57600080fd5b8135602061505b6148f783615017565b82815260059290921b8401810191818101908684111561507a57600080fd5b8286015b8481101561509e5780356150918161485d565b835291830191830161507e565b509695505050505050565b600080604083850312156150bc57600080fd5b82356001600160401b03808211156150d357600080fd5b818501915085601f8301126150e757600080fd5b813560206150f76148f783615017565b82815260059290921b8401810191818101908984111561511657600080fd5b948201945b838610156151345785358252948201949082019061511b565b9650508601359250508082111561514a57600080fd5b50614e898582860161503a565b60008060008060006080868803121561516f57600080fd5b61517886614737565b945061518660208701614737565b93506040860135925060608601356001600160401b03811115614a2257600080fd5b6000806000606084860312156151bd57600080fd5b6151c684614737565b92506151d460208501614737565b9150604084013590509250925092565b600080600080608085870312156151fa57600080fd5b61520385614737565b935061521160208601614737565b9250604085013561522181614848565b9396929550929360600135925050565b6000806000610120848603121561524757600080fd5b833561525281614848565b92506152618560208601614bb6565b9150614ee78560c08601614f03565b6001600160601b0319606093841b811682529190921b16601482015260280190565b8183823760009101908152919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000614cdc6020830184866152a2565b61ffff861681526001600160a01b038516602082015260a06040820181905260009061530d90830186614c95565b841515606084015282810360808401526153278185614c95565b98975050505050505050565b6000806040838503121561534657600080fd5b505080516020909101519092909150565b89815260c06020820152600061537160c083018a8c6152a2565b828103604084015261538481898b6152a2565b9050866060840152828103608084015261539f8186886152a2565b9150508260a08301529a9950505050505050505050565b6000602082840312156153c857600080fd5b81516116fe8161485d565b6000602082840312156153e557600080fd5b81516116fe81614848565b634e487b7160e01b600052601160045260246000fd5b600082821015615418576154186153f0565b500390565b60008219821115615430576154306153f0565b500190565b6020808252602c90820152600080516020615b9583398151915260408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c90820152600080516020615b9583398151915260408201526b6163746976652070726f787960a01b606082015260800190565b600181811c908216806154bd57607f821691505b60208210811415613ecc57634e487b7160e01b600052602260045260246000fd5b61ffff8416815260406020820152600061267c6040830184866152a2565b8681526080602082015260006155166080830187896152a2565b82810360408401526155298186886152a2565b915050826060830152979650505050505050565b6000806000806080858703121561555357600080fd5b84359350602085013561556581614848565b925061557360408601614b5f565b915060608501356001600160401b0381111561558e57600080fd5b61559a878288016148d8565b91505092959194509250565b8284823760609190911b6001600160601b0319169101908152601401919050565b634e487b7160e01b600052603260045260246000fd5b60006000198214156155f1576155f16153f0565b5060010190565b600061ffff8088168352808716602084015250846040830152608060608301526156266080830184866152a2565b979650505050505050565b61ffff8616815260806020820152600061564f6080830186886152a2565b6001600160401b0394909416604083015250606001529392505050565b60006020828403121561567e57600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b6000602082840312156156b057600080fd5b81516001600160401b038111156156c657600080fd5b8201601f810184136156d757600080fd5b80516156e56148f7826148b1565b8181528560208385010111156156fa57600080fd5b61267c826020830160208601614c69565b61ffff851681526080602082015260006157286080830186614c95565b6001600160401b038516604084015282810360608401526156268185614c95565b60006020828403121561575b57600080fd5b815160ff811681146116fe57600080fd5b634e487b7160e01b600052602160045260246000fd5b600281106157a057634e487b7160e01b600052602160045260246000fd5b9052565b84815260208101849052604081018390526080810161267c6060830184615782565b600080600080608085870312156157dc57600080fd5b84356157e781614848565b935060208501356157f781614848565b93969395505050506040820135916060013590565b6000806000806080858703121561582257600080fd5b845161582d81614848565b602086015190945061583e81614848565b6040860151606090960151949790965092505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600082516158b1818460208701614c69565b9190910192915050565b61ffff8616815260a0602082015260006158d860a0830187614c95565b6001600160401b038616604084015282810360608401526158f98186614c95565b905082810360808401526153278185614c95565b600060ff821660ff841680821015615927576159276153f0565b90039392505050565b600181815b8085111561596b578160001904821115615951576159516153f0565b8085161561595e57918102915b93841c9390800290615935565b509250929050565b60008261598257506001613349565b8161598f57506000613349565b81600181146159a557600281146159af576159cb565b6001915050613349565b60ff8411156159c0576159c06153f0565b50506001821b613349565b5060208310610133831016604e8410600b84101617156159ee575081810a613349565b6159f88383615930565b8060001904821115615a0c57615a0c6153f0565b029392505050565b60006116fe8383615973565b6000816000190483118215151615615a3a57615a3a6153f0565b500290565b600082615a5c57634e487b7160e01b600052601260045260246000fd5b500490565b600060018060a01b03808816835260a06020840152615a8360a0840188614c95565b8381036040850152615a958188614c95565b90508381036060850152615aa98187614c95565b9250508084166080840152509695505050505050565b606081526000615ad26060830186614c95565b8281036020840152615ae48186614c95565b90508281036040840152615af88185614c95565b9695505050505050565b9182526001600160a01b0316602082015260400190565b61ffff8716815260c060208201526000615b3660c0830188614c95565b8281036040840152615b488188614c95565b6001600160a01b0387811660608601528616608085015283810360a08501529050615b738185614c95565b9998505050505050505050565b828152604081016116fe602083018461578256fe46756e6374696f6e206d7573742062652063616c6c6564207468726f75676820360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc1eafb58197ea0dc76b9278ccad47f61a239f00b017d89a19081a89321cce213d416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212203606c6f5e03028c3497f70e677d6c79604b498cbe61683bc31847e0c747ffdf964736f6c634300080a0033",
  "devdoc": {
    "details": "A contract for bridging assets between chains",
    "kind": "dev",
    "methods": {
      "canBridge(address,uint256)": {
        "details": "Function for checking if a bridge is possible",
        "params": {
          "amount": "The amount to bridge",
          "from": "The address of the sender"
        },
        "returns": {
          "error": "The error message, if any",
          "isWithinLimit": "Whether the bridge is within the limit"
        }
      },
      "constructor": {
        "details": "Constructor function for the AxelarBridge contract",
        "params": {
          "axlGasReceiver": "The address of the gas receiver contract",
          "axlGateway": "The address of the gateway contract"
        }
      },
      "initialize(address,(uint256,uint256,uint256,uint256,bool),(uint256,uint256,uint256))": {
        "details": "Function for initializing the contract",
        "params": {
          "nameService": "The address of the name service contract"
        }
      },
      "onTokenTransfer(address,uint256,bytes)": {
        "details": "Function for handling token transfers",
        "params": {
          "amount": "The amount to transfer",
          "data": "The data to decode of format (uint256 targetChainId, address target, BridgeService bridge, bytes memory lzAdapterParams)",
          "from": "The address of the sender"
        },
        "returns": {
          "_0": "Whether the transfer was successful or not"
        }
      },
      "owner()": {
        "details": "Returns the address of the current owner."
      },
      "pauseBridge(bool)": {
        "details": "Function for pausing the bridge",
        "params": {
          "isPaused": "Whether to pause the bridge or not"
        }
      },
      "proxiableUUID()": {
        "details": "Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."
      },
      "renounceOwnership()": {
        "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
      },
      "setBridgeFees((uint256,uint256,uint256))": {
        "details": "Function for setting the bridge fees",
        "params": {
          "fees": "The bridge fees to set"
        }
      },
      "setBridgeLimits((uint256,uint256,uint256,uint256,bool))": {
        "details": "Function for setting the bridge limits",
        "params": {
          "limits": "The bridge limits to set"
        }
      },
      "setFaucet(address)": {
        "details": "Function for setting the faucet contract",
        "params": {
          "_faucet": "The faucet contract to set"
        }
      },
      "setGuardian(address)": {
        "details": "Function for setting the guardian contract",
        "params": {
          "_guardian": "The guardian to set"
        }
      },
      "transferOwnership(address)": {
        "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
      },
      "upgradeTo(address)": {
        "details": "Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."
      },
      "upgradeToAndCall(address,bytes)": {
        "details": "Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."
      },
      "withdraw(address,uint256)": {
        "details": "Function for withdrawing tokens",
        "params": {
          "amount": "The amount to withdraw",
          "token": "The address of the token to withdraw"
        }
      }
    },
    "title": "MessagePassingBridge",
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 5302,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "_initialized",
        "offset": 0,
        "slot": "0",
        "type": "t_uint8"
      },
      {
        "astId": 5305,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "_initializing",
        "offset": 1,
        "slot": "0",
        "type": "t_bool"
      },
      {
        "astId": 5284,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "__gap",
        "offset": 0,
        "slot": "1",
        "type": "t_array(t_uint256)50_storage"
      },
      {
        "astId": 5599,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "__gap",
        "offset": 0,
        "slot": "51",
        "type": "t_array(t_uint256)50_storage"
      },
      {
        "astId": 2441,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "dao",
        "offset": 0,
        "slot": "101",
        "type": "t_contract(Controller)1248"
      },
      {
        "astId": 2443,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "avatar",
        "offset": 0,
        "slot": "102",
        "type": "t_address"
      },
      {
        "astId": 2446,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "nameService",
        "offset": 0,
        "slot": "103",
        "type": "t_contract(INameService)2296"
      },
      {
        "astId": 2514,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "gap",
        "offset": 0,
        "slot": "104",
        "type": "t_array(t_uint256)50_storage"
      },
      {
        "astId": 5925,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "__gap",
        "offset": 0,
        "slot": "154",
        "type": "t_array(t_uint256)50_storage"
      },
      {
        "astId": 4785,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "_owner",
        "offset": 0,
        "slot": "204",
        "type": "t_address"
      },
      {
        "astId": 4905,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "__gap",
        "offset": 0,
        "slot": "205",
        "type": "t_array(t_uint256)49_storage"
      },
      {
        "astId": 3124,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "lzEndpoint",
        "offset": 0,
        "slot": "254",
        "type": "t_contract(ILayerZeroEndpointUpgradeable)3055"
      },
      {
        "astId": 3128,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "trustedRemoteLookup",
        "offset": 0,
        "slot": "255",
        "type": "t_mapping(t_uint16,t_bytes_storage)"
      },
      {
        "astId": 3134,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "minDstGasLookup",
        "offset": 0,
        "slot": "256",
        "type": "t_mapping(t_uint16,t_mapping(t_uint16,t_uint256))"
      },
      {
        "astId": 3138,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "payloadSizeLimitLookup",
        "offset": 0,
        "slot": "257",
        "type": "t_mapping(t_uint16,t_uint256)"
      },
      {
        "astId": 3140,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "precrime",
        "offset": 0,
        "slot": "258",
        "type": "t_address"
      },
      {
        "astId": 3672,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "__gap",
        "offset": 0,
        "slot": "259",
        "type": "t_array(t_uint256)45_storage"
      },
      {
        "astId": 3715,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "failedMessages",
        "offset": 0,
        "slot": "304",
        "type": "t_mapping(t_uint16,t_mapping(t_bytes_memory_ptr,t_mapping(t_uint64,t_bytes32)))"
      },
      {
        "astId": 3934,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "__gap",
        "offset": 0,
        "slot": "305",
        "type": "t_array(t_uint256)49_storage"
      },
      {
        "astId": 9891,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "__gap",
        "offset": 0,
        "slot": "354",
        "type": "t_array(t_uint256)49_storage"
      },
      {
        "astId": 10075,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "guardian",
        "offset": 0,
        "slot": "403",
        "type": "t_address"
      },
      {
        "astId": 10079,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "executedRequests",
        "offset": 0,
        "slot": "404",
        "type": "t_mapping(t_uint256,t_bool)"
      },
      {
        "astId": 10083,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "disabledSourceBridges",
        "offset": 0,
        "slot": "405",
        "type": "t_mapping(t_bytes32,t_bool)"
      },
      {
        "astId": 10085,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "isClosed",
        "offset": 0,
        "slot": "406",
        "type": "t_bool"
      },
      {
        "astId": 10088,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "bridgeFees",
        "offset": 0,
        "slot": "407",
        "type": "t_struct(BridgeFees)10052_storage"
      },
      {
        "astId": 10091,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "bridgeLimits",
        "offset": 0,
        "slot": "410",
        "type": "t_struct(BridgeLimits)10063_storage"
      },
      {
        "astId": 10094,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "bridgeDailyLimit",
        "offset": 0,
        "slot": "415",
        "type": "t_struct(BridgeDailyLimit)10073_storage"
      },
      {
        "astId": 10099,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "accountsDailyLimit",
        "offset": 0,
        "slot": "417",
        "type": "t_mapping(t_address,t_struct(AccountLimit)10068_storage)"
      },
      {
        "astId": 10102,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "faucet",
        "offset": 0,
        "slot": "418",
        "type": "t_contract(IFaucet)9927"
      },
      {
        "astId": 10104,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "currentId",
        "offset": 0,
        "slot": "419",
        "type": "t_uint256"
      },
      {
        "astId": 10108,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "lzChainIdsMapping",
        "offset": 0,
        "slot": "420",
        "type": "t_mapping(t_uint256,t_uint16)"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_array(t_uint256)45_storage": {
        "base": "t_uint256",
        "encoding": "inplace",
        "label": "uint256[45]",
        "numberOfBytes": "1440"
      },
      "t_array(t_uint256)49_storage": {
        "base": "t_uint256",
        "encoding": "inplace",
        "label": "uint256[49]",
        "numberOfBytes": "1568"
      },
      "t_array(t_uint256)50_storage": {
        "base": "t_uint256",
        "encoding": "inplace",
        "label": "uint256[50]",
        "numberOfBytes": "1600"
      },
      "t_bool": {
        "encoding": "inplace",
        "label": "bool",
        "numberOfBytes": "1"
      },
      "t_bytes32": {
        "encoding": "inplace",
        "label": "bytes32",
        "numberOfBytes": "32"
      },
      "t_bytes_memory_ptr": {
        "encoding": "bytes",
        "label": "bytes",
        "numberOfBytes": "32"
      },
      "t_bytes_storage": {
        "encoding": "bytes",
        "label": "bytes",
        "numberOfBytes": "32"
      },
      "t_contract(Controller)1248": {
        "encoding": "inplace",
        "label": "contract Controller",
        "numberOfBytes": "20"
      },
      "t_contract(IFaucet)9927": {
        "encoding": "inplace",
        "label": "contract IFaucet",
        "numberOfBytes": "20"
      },
      "t_contract(ILayerZeroEndpointUpgradeable)3055": {
        "encoding": "inplace",
        "label": "contract ILayerZeroEndpointUpgradeable",
        "numberOfBytes": "20"
      },
      "t_contract(INameService)2296": {
        "encoding": "inplace",
        "label": "contract INameService",
        "numberOfBytes": "20"
      },
      "t_mapping(t_address,t_struct(AccountLimit)10068_storage)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => struct MessagePassingBridge.AccountLimit)",
        "numberOfBytes": "32",
        "value": "t_struct(AccountLimit)10068_storage"
      },
      "t_mapping(t_bytes32,t_bool)": {
        "encoding": "mapping",
        "key": "t_bytes32",
        "label": "mapping(bytes32 => bool)",
        "numberOfBytes": "32",
        "value": "t_bool"
      },
      "t_mapping(t_bytes_memory_ptr,t_mapping(t_uint64,t_bytes32))": {
        "encoding": "mapping",
        "key": "t_bytes_memory_ptr",
        "label": "mapping(bytes => mapping(uint64 => bytes32))",
        "numberOfBytes": "32",
        "value": "t_mapping(t_uint64,t_bytes32)"
      },
      "t_mapping(t_uint16,t_bytes_storage)": {
        "encoding": "mapping",
        "key": "t_uint16",
        "label": "mapping(uint16 => bytes)",
        "numberOfBytes": "32",
        "value": "t_bytes_storage"
      },
      "t_mapping(t_uint16,t_mapping(t_bytes_memory_ptr,t_mapping(t_uint64,t_bytes32)))": {
        "encoding": "mapping",
        "key": "t_uint16",
        "label": "mapping(uint16 => mapping(bytes => mapping(uint64 => bytes32)))",
        "numberOfBytes": "32",
        "value": "t_mapping(t_bytes_memory_ptr,t_mapping(t_uint64,t_bytes32))"
      },
      "t_mapping(t_uint16,t_mapping(t_uint16,t_uint256))": {
        "encoding": "mapping",
        "key": "t_uint16",
        "label": "mapping(uint16 => mapping(uint16 => uint256))",
        "numberOfBytes": "32",
        "value": "t_mapping(t_uint16,t_uint256)"
      },
      "t_mapping(t_uint16,t_uint256)": {
        "encoding": "mapping",
        "key": "t_uint16",
        "label": "mapping(uint16 => uint256)",
        "numberOfBytes": "32",
        "value": "t_uint256"
      },
      "t_mapping(t_uint256,t_bool)": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => bool)",
        "numberOfBytes": "32",
        "value": "t_bool"
      },
      "t_mapping(t_uint256,t_uint16)": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => uint16)",
        "numberOfBytes": "32",
        "value": "t_uint16"
      },
      "t_mapping(t_uint64,t_bytes32)": {
        "encoding": "mapping",
        "key": "t_uint64",
        "label": "mapping(uint64 => bytes32)",
        "numberOfBytes": "32",
        "value": "t_bytes32"
      },
      "t_struct(AccountLimit)10068_storage": {
        "encoding": "inplace",
        "label": "struct MessagePassingBridge.AccountLimit",
        "members": [
          {
            "astId": 10065,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "lastTransferReset",
            "offset": 0,
            "slot": "0",
            "type": "t_uint256"
          },
          {
            "astId": 10067,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "bridged24Hours",
            "offset": 0,
            "slot": "1",
            "type": "t_uint256"
          }
        ],
        "numberOfBytes": "64"
      },
      "t_struct(BridgeDailyLimit)10073_storage": {
        "encoding": "inplace",
        "label": "struct MessagePassingBridge.BridgeDailyLimit",
        "members": [
          {
            "astId": 10070,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "lastTransferReset",
            "offset": 0,
            "slot": "0",
            "type": "t_uint256"
          },
          {
            "astId": 10072,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "bridged24Hours",
            "offset": 0,
            "slot": "1",
            "type": "t_uint256"
          }
        ],
        "numberOfBytes": "64"
      },
      "t_struct(BridgeFees)10052_storage": {
        "encoding": "inplace",
        "label": "struct MessagePassingBridge.BridgeFees",
        "members": [
          {
            "astId": 10047,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "minFee",
            "offset": 0,
            "slot": "0",
            "type": "t_uint256"
          },
          {
            "astId": 10049,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "maxFee",
            "offset": 0,
            "slot": "1",
            "type": "t_uint256"
          },
          {
            "astId": 10051,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "fee",
            "offset": 0,
            "slot": "2",
            "type": "t_uint256"
          }
        ],
        "numberOfBytes": "96"
      },
      "t_struct(BridgeLimits)10063_storage": {
        "encoding": "inplace",
        "label": "struct MessagePassingBridge.BridgeLimits",
        "members": [
          {
            "astId": 10054,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "dailyLimit",
            "offset": 0,
            "slot": "0",
            "type": "t_uint256"
          },
          {
            "astId": 10056,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "txLimit",
            "offset": 0,
            "slot": "1",
            "type": "t_uint256"
          },
          {
            "astId": 10058,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "accountDailyLimit",
            "offset": 0,
            "slot": "2",
            "type": "t_uint256"
          },
          {
            "astId": 10060,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "minAmount",
            "offset": 0,
            "slot": "3",
            "type": "t_uint256"
          },
          {
            "astId": 10062,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "onlyWhitelisted",
            "offset": 0,
            "slot": "4",
            "type": "t_bool"
          }
        ],
        "numberOfBytes": "160"
      },
      "t_uint16": {
        "encoding": "inplace",
        "label": "uint16",
        "numberOfBytes": "2"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      },
      "t_uint64": {
        "encoding": "inplace",
        "label": "uint64",
        "numberOfBytes": "8"
      },
      "t_uint8": {
        "encoding": "inplace",
        "label": "uint8",
        "numberOfBytes": "1"
      }
    }
  }
}