{
  "address": "0x6f252280eB53df085eAD27BBe55d615741A8268D",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "axlGateway",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "axlGasReceiver",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "lzEndpoint",
          "type": "address"
        },
        {
          "internalType": "uint32",
          "name": "homeChainId",
          "type": "uint32"
        }
      ],
      "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 IMessagePassingBridge.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 IMessagePassingBridge.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": "HOME_CHAIN_ID",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "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": [
        {
          "internalType": "uint16",
          "name": "lzChainId",
          "type": "uint16"
        },
        {
          "internalType": "uint256",
          "name": "chainId",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "remote",
          "type": "address"
        }
      ],
      "name": "addLzChainSupport",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        }
      ],
      "name": "approveRequest",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "approvedRequests",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "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 IMessagePassingBridge.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"
        },
        {
          "internalType": "address",
          "name": "gasRefundAddress",
          "type": "address"
        }
      ],
      "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"
        },
        {
          "internalType": "bytes",
          "name": "adapterParams",
          "type": "bytes"
        }
      ],
      "name": "bridgeToWithLz",
      "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": [],
      "name": "feeRecipient",
      "outputs": [
        {
          "internalType": "address",
          "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": [
        {
          "internalType": "string",
          "name": "axlChainId",
          "type": "string"
        }
      ],
      "name": "fromAxelarChainId",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "chainId",
          "type": "uint256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "lzChainId",
          "type": "uint16"
        }
      ],
      "name": "fromLzChainId",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "chainId",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "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 IMessagePassingBridge.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 IMessagePassingBridge.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": [
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        }
      ],
      "name": "lzChainToIdsMapping",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "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": [],
      "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": [
        {
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        }
      ],
      "name": "preventRequest",
      "outputs": [],
      "stateMutability": "nonpayable",
      "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 IMessagePassingBridge.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 IMessagePassingBridge.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": "address",
          "name": "_faucet",
          "type": "address"
        }
      ],
      "name": "setFaucet",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        }
      ],
      "name": "setFeeRecipient",
      "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": "uint256",
          "name": "chainId",
          "type": "uint256"
        }
      ],
      "name": "toAxelarChainId",
      "outputs": [
        {
          "internalType": "string",
          "name": "axlChainId",
          "type": "string"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "chainId",
          "type": "uint256"
        }
      ],
      "name": "toLzChainId",
      "outputs": [
        {
          "internalType": "uint16",
          "name": "lzChainId",
          "type": "uint16"
        }
      ],
      "stateMutability": "view",
      "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": [],
      "name": "upgrade",
      "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": "0x5852233a697fa8e73d460c3c033fef77e6e6f9978808f1bba20833ce041265c8",
  "receipt": {
    "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C",
    "from": "0x5128E3C1f8846724cc1007Af9b4189713922E4BB",
    "contractAddress": null,
    "transactionIndex": 0,
    "gasUsed": "5136036",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0x835f261affa3b264ab8f14a6086370bd43d61b5edf2b6145095f725e48a6e923",
    "transactionHash": "0x5852233a697fa8e73d460c3c033fef77e6e6f9978808f1bba20833ce041265c8",
    "logs": [],
    "blockNumber": 38592754,
    "cumulativeGasUsed": "5136036",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "0xe432150cce91c13a887f7D836923d5597adD8E31",
    "0xbE406F0189A0B4cf3A05C286473D23791Dd44Cc6",
    "0x9740FF91F1985D8d2B71494aE1A2f723bb3Ed9E4",
    42220
  ],
  "numDeployments": 3,
  "solcInputHash": "595d53fb80738e254ef68ce23dd0c53b",
  "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\":\"uint32\",\"name\":\"homeChainId\",\"type\":\"uint32\"}],\"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 IMessagePassingBridge.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 IMessagePassingBridge.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\":\"HOME_CHAIN_ID\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"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\":[{\"internalType\":\"uint16\",\"name\":\"lzChainId\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"remote\",\"type\":\"address\"}],\"name\":\"addLzChainSupport\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"approveRequest\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"approvedRequests\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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 IMessagePassingBridge.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\"},{\"internalType\":\"address\",\"name\":\"gasRefundAddress\",\"type\":\"address\"}],\"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\"},{\"internalType\":\"bytes\",\"name\":\"adapterParams\",\"type\":\"bytes\"}],\"name\":\"bridgeToWithLz\",\"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\":[],\"name\":\"feeRecipient\",\"outputs\":[{\"internalType\":\"address\",\"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\":[{\"internalType\":\"string\",\"name\":\"axlChainId\",\"type\":\"string\"}],\"name\":\"fromAxelarChainId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"lzChainId\",\"type\":\"uint16\"}],\"name\":\"fromLzChainId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"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 IMessagePassingBridge.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 IMessagePassingBridge.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\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"name\":\"lzChainToIdsMapping\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"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\":[],\"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\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"preventRequest\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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 IMessagePassingBridge.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 IMessagePassingBridge.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\":\"address\",\"name\":\"_faucet\",\"type\":\"address\"}],\"name\":\"setFaucet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"setFeeRecipient\",\"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\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"name\":\"toAxelarChainId\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"axlChainId\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"name\":\"toLzChainId\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"lzChainId\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"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\":[],\"name\":\"upgrade\",\"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\":{\"addLzChainSupport(uint16,uint256,address)\":{\"details\":\"function for adding lz chaind support\"},\"approveRequest(uint256)\":{\"details\":\"Function for approving requests above limits\",\"params\":{\"id\":\"The bridgerequest id\"}},\"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\"}},\"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\"}},\"preventRequest(uint256)\":{\"details\":\"Function for prevent a request by marking it as executed\",\"params\":{\"id\":\"The bridgerequest id\"}},\"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\"}},\"setFeeRecipient(address)\":{\"details\":\"Function for setting the fee recipient\",\"params\":{\"recipient\":\"The fee recipient 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\\n// @uniswap/v3-core\\ninterface ISwapRouter {\\n\\tstruct ExactInputSingleParams {\\n\\t\\taddress tokenIn;\\n\\t\\taddress tokenOut;\\n\\t\\tuint24 fee;\\n\\t\\taddress recipient;\\n\\t\\tuint256 amountIn;\\n\\t\\tuint256 amountOutMinimum;\\n\\t\\tuint160 sqrtPriceLimitX96;\\n\\t}\\n\\n\\t/// @notice Swaps `amountIn` of one token for as much as possible of another token\\n\\t/// @dev Setting `amountIn` to 0 will cause the contract to look up its own balance,\\n\\t/// and swap the entire amount, enabling contracts to send tokens before calling this function.\\n\\t/// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata\\n\\t/// @return amountOut The amount of the received token\\n\\tfunction exactInputSingle(\\n\\t\\tExactInputSingleParams calldata params\\n\\t) external payable returns (uint256 amountOut);\\n\\n\\tstruct ExactInputParams {\\n\\t\\tbytes path;\\n\\t\\taddress recipient;\\n\\t\\tuint256 amountIn;\\n\\t\\tuint256 amountOutMinimum;\\n\\t}\\n\\n\\t/// @notice Swaps `amountIn` of one token for as much as possible of another along the specified path\\n\\t/// @dev Setting `amountIn` to 0 will cause the contract to look up its own balance,\\n\\t/// and swap the entire amount, enabling contracts to send tokens before calling this function.\\n\\t/// @param params The parameters necessary for the multi-hop swap, encoded as `ExactInputParams` in calldata\\n\\t/// @return amountOut The amount of the received token\\n\\tfunction exactInput(\\n\\t\\tExactInputParams calldata params\\n\\t) external payable returns (uint256 amountOut);\\n\\n\\tstruct ExactOutputSingleParams {\\n\\t\\taddress tokenIn;\\n\\t\\taddress tokenOut;\\n\\t\\tuint24 fee;\\n\\t\\taddress recipient;\\n\\t\\tuint256 amountOut;\\n\\t\\tuint256 amountInMaximum;\\n\\t\\tuint160 sqrtPriceLimitX96;\\n\\t}\\n\\n\\t/// @notice Swaps as little as possible of one token for `amountOut` of another token\\n\\t/// that may remain in the router after the swap.\\n\\t/// @param params The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata\\n\\t/// @return amountIn The amount of the input token\\n\\tfunction exactOutputSingle(\\n\\t\\tExactOutputSingleParams calldata params\\n\\t) external payable returns (uint256 amountIn);\\n\\n\\tstruct ExactOutputParams {\\n\\t\\tbytes path;\\n\\t\\taddress recipient;\\n\\t\\tuint256 amountOut;\\n\\t\\tuint256 amountInMaximum;\\n\\t}\\n\\n\\t/// @notice Swaps as little as possible of one token for `amountOut` of another along the specified path (reversed)\\n\\t/// that may remain in the router after the swap.\\n\\t/// @param params The parameters necessary for the multi-hop swap, encoded as `ExactOutputParams` in calldata\\n\\t/// @return amountIn The amount of the input token\\n\\tfunction exactOutput(\\n\\t\\tExactOutputParams calldata params\\n\\t) external payable returns (uint256 amountIn);\\n}\\n\\ninterface IQuoterV2 {\\n\\t/// @notice Returns the amount out received for a given exact input swap without executing the swap\\n\\t/// @param path The path of the swap, i.e. each token pair and the pool fee\\n\\t/// @param amountIn The amount of the first token to swap\\n\\t/// @return amountOut The amount of the last token that would be received\\n\\t/// @return sqrtPriceX96AfterList List of the sqrt price after the swap for each pool in the path\\n\\t/// @return initializedTicksCrossedList List of the initialized ticks that the swap crossed for each pool in the path\\n\\t/// @return gasEstimate The estimate of the gas that the swap consumes\\n\\tfunction quoteExactInput(\\n\\t\\tbytes memory path,\\n\\t\\tuint256 amountIn\\n\\t)\\n\\t\\texternal\\n\\t\\treturns (\\n\\t\\t\\tuint256 amountOut,\\n\\t\\t\\tuint160[] memory sqrtPriceX96AfterList,\\n\\t\\t\\tuint32[] memory initializedTicksCrossedList,\\n\\t\\t\\tuint256 gasEstimate\\n\\t\\t);\\n\\n\\tstruct QuoteExactInputSingleParams {\\n\\t\\taddress tokenIn;\\n\\t\\taddress tokenOut;\\n\\t\\tuint256 amountIn;\\n\\t\\tuint24 fee;\\n\\t\\tuint160 sqrtPriceLimitX96;\\n\\t}\\n\\n\\t/// @notice Returns the amount out received for a given exact input but for a swap of a single pool\\n\\t/// @param params The params for the quote, encoded as `QuoteExactInputSingleParams`\\n\\t/// tokenIn The token being swapped in\\n\\t/// tokenOut The token being swapped out\\n\\t/// fee The fee of the token pool to consider for the pair\\n\\t/// amountIn The desired input amount\\n\\t/// sqrtPriceLimitX96 The price limit of the pool that cannot be exceeded by the swap\\n\\t/// @return amountOut The amount of `tokenOut` that would be received\\n\\t/// @return sqrtPriceX96After The sqrt price of the pool after the swap\\n\\t/// @return initializedTicksCrossed The number of initialized ticks that the swap crossed\\n\\t/// @return gasEstimate The estimate of the gas that the swap consumes\\n\\tfunction quoteExactInputSingle(\\n\\t\\tQuoteExactInputSingleParams memory params\\n\\t)\\n\\t\\texternal\\n\\t\\treturns (\\n\\t\\t\\tuint256 amountOut,\\n\\t\\t\\tuint160 sqrtPriceX96After,\\n\\t\\t\\tuint32 initializedTicksCrossed,\\n\\t\\t\\tuint256 gasEstimate\\n\\t\\t);\\n}\\n\",\"keccak256\":\"0xcd7659c3f640ba6d550def777a1ce0b5b33693ba62bd2be054c0890ca18f5e7c\",\"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\"},\"@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/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/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/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    //Gap array\\n    uint256[50] _gap;\\n\\n    constructor(address gateway, address gasReceiver) AxelarExecutable(gateway) {\\n        gasService = IAxelarGasService(gasReceiver);\\n    }\\n\\n    function _axelarBridgeTo(\\n        bytes memory payload,\\n        string memory targetChainId,\\n        address refundAddress\\n    ) 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            refundAddress\\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\":\"0x1e8d27b11b3aaf0ece5cb05f38a833d1287cc86c1b7c220d1726896020dc2a52\",\"license\":\"MIT\"},\"contracts/messagePassingBridge/BridgeHelperLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.0;\\nimport {INameService} from '@gooddollar/goodprotocol/contracts/utils/DAOUpgradeableContract.sol';\\nimport './IMessagePassingBridge.sol';\\n\\ninterface IIdentity {\\n    function isWhitelisted(address) external view returns (bool);\\n}\\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) external 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) external 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 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(\\n        IMessagePassingBridge.BridgeLimits memory bridgeLimits,\\n        IMessagePassingBridge.AccountLimit memory accountDailyLimit,\\n        IMessagePassingBridge.BridgeDailyLimit memory bridgeDailyLimit,\\n        INameService nameService,\\n        bool isClosed,\\n        address from,\\n        uint256 amount\\n    ) 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 = accountDailyLimit.bridged24Hours;\\n        if (accountDailyLimit.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) {\\n            if (amount > bridgeLimits.dailyLimit) return (false, 'dailyLimit');\\n        } else {\\n            if (bridgeDailyLimit.bridged24Hours + amount > bridgeLimits.dailyLimit) return (false, 'dailyLimit');\\n        }\\n\\n        return (true, '');\\n    }\\n}\\n\",\"keccak256\":\"0x813ebf4ef30b4d4e7ea0fa6cb9298ad513b1c2ae5b6b390896f986542b799eac\",\"license\":\"MIT\"},\"contracts/messagePassingBridge/IMessagePassingBridge.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.0;\\n\\ninterface ILayerZeroFeeEstimator {\\n    function estimateSendFee(\\n        uint16 _dstChainId,\\n        address _fromAddress,\\n        address _toAddress,\\n        uint _normalizedAmount,\\n        bool _useZro,\\n        bytes memory _adapterParams\\n    ) external view returns (uint nativeFee, uint zroFee);\\n}\\n\\ninterface IMessagePassingBridge {\\n    enum BridgeService {\\n        AXELAR,\\n        LZ\\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    // 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    function lzEndpoint_() external view returns (address);\\n\\n    function guardian() external view returns (address);\\n\\n    function bridgeFees() external view returns (uint256 minFee, uint256 maxFee, uint256 fee);\\n\\n    function bridgeLimits()\\n        external\\n        view\\n        returns (\\n            uint256 dailyLimit,\\n            uint256 txLimit,\\n            uint256 accountDailyLimit,\\n            uint256 minAmount,\\n            bool onlyWhitelisted\\n        );\\n\\n    function bridgeDailyLimit() external view returns (uint256 lastTransferReset, uint256 bridged24Hours);\\n\\n    function feeRecipient() external view returns (address);\\n\\n    function toLzChainId(uint256 chainId) external view returns (uint16 lzChainId);\\n\\n    function setFeeRecipient(address recipient) external;\\n\\n    function setBridgeLimits(BridgeLimits memory _limits) external;\\n\\n    function setBridgeFees(BridgeFees memory _fees) external;\\n\\n    function setDisabledBridges(bytes32[] memory bridgeKeys, bool[] memory disabled) external;\\n\\n    function setFaucet(address _faucet) external;\\n\\n    function setGuardian(address _guardian) external;\\n\\n    function canBridge(address from, uint256 amount) external view returns (bool isWithinLimit, string memory error);\\n\\n    function withdraw(address token, uint256 amount) external;\\n\\n    function pauseBridge(bool isPaused) external;\\n\\n    function bridgeTo(address target, uint256 targetChainId, uint256 amount, BridgeService bridge) external payable;\\n\\n    function bridgeToWithLz(\\n        address target,\\n        uint256 targetChainId,\\n        uint256 amount,\\n        bytes calldata adapterParams\\n    ) external payable;\\n\\n    function bridgeToWithAxelar(\\n        address target,\\n        uint256 targetChainId,\\n        uint256 amount,\\n        address gasRefundAddress\\n    ) external payable;\\n\\n    function executedRequests(uint256 id) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xd0f2da3bc2141fe38d1a6f06e3c789befa1efa6d7cb2e653957034a940dee390\",\"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        _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        try lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams) returns (\\n            uint nativeFee,\\n            uint zroFee\\n        ) {\\n            return (nativeFee, zroFee);\\n        } catch {\\n            return (0, 0);\\n        }\\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;\\n        assembly {\\n            sourceAddress := mload(add(_srcAddress, 20))\\n        }\\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        _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\":\"0xddbcbe856b1b867f1494b99550a6139e2a8bf9c20900a703ae2b212ec8fd2009\",\"license\":\"MIT\"},\"contracts/messagePassingBridge/MessagePassingBridge.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.0;\\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';\\nimport './IMessagePassingBridge.sol';\\n\\ninterface IFaucet {\\n    function canTop(address) external view returns (bool);\\n\\n    function topWallet(address) external;\\n}\\n\\n/**\\n * @title MessagePassingBridge\\n * @dev A contract for bridging assets between chains\\n */\\ncontract MessagePassingBridge is\\n    IMessagePassingBridge,\\n    DAOUpgradeableContract,\\n    LZHandlerUpgradeable,\\n    AxelarHandlerUpgradeable\\n{\\n    using StringToAddress for string;\\n    using AddressToString for address;\\n\\n    address public immutable lzEndpoint_;\\n    uint32 public immutable HOME_CHAIN_ID;\\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    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    address public feeRecipient;\\n\\n    // A mapping for approved requests above limits\\n    mapping(uint256 => bool) public approvedRequests;\\n\\n    mapping(uint16 => uint256) public lzChainToIdsMapping;\\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        uint32 homeChainId\\n    ) AxelarHandlerUpgradeable(axlGateway, axlGasReceiver) {\\n        lzEndpoint_ = lzEndpoint;\\n        HOME_CHAIN_ID = homeChainId;\\n    }\\n\\n    function _authorizeUpgrade(address impl) internal virtual override onlyOwner {}\\n\\n    function _onlyOwnerOrGuardian() internal view {\\n        if ((guardian == msg.sender || avatar == msg.sender || owner() == msg.sender) == false)\\n            revert NOT_GUARDIAN(msg.sender);\\n    }\\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        bridgeLimits = limits;\\n        bridgeFees = fees;\\n        feeRecipient = nameService.getAddress('UBISCHEME');\\n        if (feeRecipient == address(0)) feeRecipient = avatar;\\n\\n        // trust celo/eth/fuse we assume they are all deployed together at same address\\n        // if they are not deployed at the same time there's a risk of a malicious actor deploying the proxy at the same address\\n        // with modified malicious implementation\\n        addLzChainSupport(101, 1, address(this)); // eth\\n        addLzChainSupport(125, 42220, address(this)); // celo\\n        addLzChainSupport(138, 122, address(this)); // fuse\\n        addLzChainSupport(365, 50, address(this)); // xdc\\n    }\\n\\n    function upgrade() public reinitializer(2) {\\n        _addLzChainSupport(101, 1, address(this)); // eth\\n        _addLzChainSupport(125, 42220, address(this)); // celo\\n        _addLzChainSupport(138, 122, address(this)); // fuse\\n        _addLzChainSupport(365, 50, address(this)); // xdc\\n    }\\n\\n    /**\\n     *\\n     * @dev function for adding lz chaind support\\n     */\\n    function addLzChainSupport(uint16 lzChainId, uint256 chainId, address remote) public {\\n        _onlyOwnerOrGuardian();\\n        _addLzChainSupport(lzChainId, chainId, remote);\\n    }\\n\\n    function _addLzChainSupport(uint16 lzChainId, uint256 chainId, address remote) internal {\\n        if (lzChainToIdsMapping[lzChainId] != 0) revert AlreadyInitialized();\\n        lzChainToIdsMapping[lzChainId] = chainId;\\n        lzChainIdsMapping[chainId] = lzChainId;\\n        trustedRemoteLookup[lzChainId] = abi.encodePacked(remote, address(this));\\n    }\\n\\n    /**\\n     * @dev Function for approving requests above limits\\n     * @param id The bridgerequest id\\n     */\\n    function approveRequest(uint256 id) external {\\n        _onlyOwnerOrGuardian();\\n        approvedRequests[id] = true;\\n    }\\n\\n    /**\\n     * @dev Function for prevent a request by marking it as executed\\n     * @param id The bridgerequest id\\n     */\\n    function preventRequest(uint256 id) external {\\n        _onlyOwnerOrGuardian();\\n        executedRequests[id] = true;\\n    }\\n\\n    /**\\n     * @dev Function for setting the fee recipient\\n     * @param recipient The fee recipient to set\\n     */\\n    function setFeeRecipient(address recipient) external {\\n        _onlyOwnerOrGuardian();\\n        feeRecipient = recipient;\\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 {\\n        _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 {\\n        _onlyOwnerOrGuardian();\\n        bridgeFees = fees;\\n    }\\n\\n    function setDisabledBridges(bytes32[] memory bridgeKeys, bool[] memory disabled) external {\\n        _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(address _faucet) external {\\n        _onlyOwnerOrGuardian();\\n        faucet = IFaucet(_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 {\\n        _onlyOwnerOrGuardian();\\n        guardian = _guardian;\\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 {\\n        _onlyAvatar();\\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 {\\n        _onlyOwnerOrGuardian();\\n        isClosed = isPaused;\\n    }\\n\\n    function canBridge(address from, uint256 amount) public view returns (bool isWithinLimit, string memory error) {\\n        return\\n            BridgeHelperLibrary.canBridge(\\n                bridgeLimits,\\n                accountsDailyLimit[from],\\n                bridgeDailyLimit,\\n                nameService,\\n                isClosed,\\n                from,\\n                amount\\n            );\\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    //TODO: this wouldnt work as onTokenTransfer doesnt support value passing\\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, address(0));\\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, bridge, '', address(0));\\n    }\\n\\n    function bridgeToWithLz(\\n        address target,\\n        uint256 targetChainId,\\n        uint256 amount,\\n        bytes calldata adapterParams\\n    ) external payable {\\n        _bridgeTo(msg.sender, target, targetChainId, amount, BridgeService.LZ, adapterParams, address(0));\\n    }\\n\\n    function bridgeToWithAxelar(\\n        address target,\\n        uint256 targetChainId,\\n        uint256 amount,\\n        address gasRefundAddress\\n    ) external payable {\\n        _bridgeTo(msg.sender, target, targetChainId, amount, BridgeService.AXELAR, '', gasRefundAddress);\\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 lzAdapterParams extra params for lz\\n     * @param axelarGasRefundAddress gas refund address to axelar (default to msg.sender if 0)\\n     */\\n    function _bridgeTo(\\n        address from,\\n        address target,\\n        uint256 targetChainId,\\n        uint256 amount,\\n        BridgeService bridge,\\n        bytes memory lzAdapterParams,\\n        address axelarGasRefundAddress\\n    ) internal {\\n        if (isClosed) revert BRIDGE_LIMITS('closed');\\n\\n        // if (_chainId() == HOME_CHAIN_ID) {\\n        //     if (nativeToken().transferFrom(from, address(this), amount) == false) revert TRANSFER_FROM();\\n        // } else {}\\n\\n        // burn/mint on all chains\\n        nativeToken().burnFrom(from, amount);\\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(\\n                payload,\\n                chainId,\\n                axelarGasRefundAddress == address(0) ? msg.sender : axelarGasRefundAddress\\n            );\\n        } else if (bridge == BridgeService.LZ) {\\n            if (lzAdapterParams.length == 0) {\\n                lzAdapterParams = abi.encodePacked(uint16(1), uint256(400000)); //default 400k gas estimate for bridge tx https://layerzero.gitbook.io/docs/evm-guides/advanced/relayer-adapter-parameters\\n            }\\n            uint16 chainId = toLzChainId(targetChainId);\\n\\n            if (chainId == 0) revert UNSUPPORTED_CHAIN(targetChainId);\\n            (uint256 nativeFee, ) = estimateSendFee(chainId, from, target, normalizedAmount, false, lzAdapterParams);\\n\\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        //since we can't set axelar gateway to 0x0 we use address(1) as a flag for not set\\n        if (address(gateway) == address(1)) revert BRIDGE_LIMITS('axelar gateway not set');\\n        uint256 chainId = fromAxelarChainId(sourceChainId);\\n\\n        _bridgeFrom(from, to, normalizedAmount, chainId, sourceAddress, 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\\n        _bridgeFrom(from, to, normalizedAmount, chainId, sourceAddress, 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        address sourceContract,\\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        //verify that we trust the source (using lz format)\\n        bytes memory trustedRemote = trustedRemoteLookup[toLzChainId(sourceChainId)];\\n        bytes memory sourceUA = abi.encodePacked(sourceContract, address(this));\\n        // if will still block the message pathway from (srcChainId, srcAddress). should not receive message from untrusted remote.\\n        if (\\n            sourceUA.length != trustedRemote.length ||\\n            trustedRemote.length == 0 ||\\n            keccak256(sourceUA) != keccak256(trustedRemote)\\n        ) {\\n            emit FalseSender(sourceChainId, sourceContract);\\n            return;\\n        }\\n\\n        //skip limits for manually approved/stuck TXs\\n        if (approvedRequests[id] == false) _enforceLimits(from, target, normalizedAmount, _chainId());\\n\\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        // if (_chainId() == HOME_CHAIN_ID) {\\n        //     if (nativeToken().transfer(target, tokenAmount - fee) == false) revert TRANSFER();\\n        //     if (fee > 0 && feeRecipient == address(0)) nativeToken().burn(fee);\\n        //     else if (fee > 0) nativeToken().transfer(feeRecipient, fee);\\n        // } else {\\n        // }\\n\\n        //burn/mint on all chains\\n        dao.mintTokens(tokenAmount - fee, target, avatar);\\n        if (fee > 0) dao.mintTokens(fee, feeRecipient, avatar);\\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) public view returns (uint16 lzChainId) {\\n        return lzChainIdsMapping[chainId];\\n    }\\n\\n    function fromLzChainId(uint16 lzChainId) public view returns (uint256 chainId) {\\n        return lzChainToIdsMapping[lzChainId];\\n    }\\n\\n    function toAxelarChainId(uint256 chainId) public 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) public pure 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')) return 42220;\\n    }\\n}\\n\",\"keccak256\":\"0x2c0be4de3d5426fa92370e530d8b8c0892c24e8b38e7d3930af3b89b5e59ffd8\",\"license\":\"MIT\"}},\"version\":1}",
  "bytecode": "0x610120604052306080523480156200001657600080fd5b5060405162005d5138038062005d518339810160408190526200003991620000b0565b8383816001600160a01b038116620000645760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0390811660a05290811660c0529290921660e05263ffffffff16610100525062000117915050565b80516001600160a01b0381168114620000ab57600080fd5b919050565b60008060008060808587031215620000c757600080fd5b620000d28562000093565b9350620000e26020860162000093565b9250620000f26040860162000093565b9150606085015163ffffffff811681146200010c57600080fd5b939692955090935050565b60805160a05160c05160e05161010051615baf620001a260003960006109d5015260008181610384015261266a015260008181610866015261341c0152600081816104a4015281816110b901528181611616015281816134b5015261376d0152600081816113c801528181611408015281816116d80152818161171801526117940152615baf6000f3fe60806040526004361061034b5760003560e01c80621d356714610350578063020051cf1461037257806305fead15146103bc57806307e0db17146103f15780630dce292e146104115780630df374831461045257806310ddb13714610472578063116191b61461049257806316ad5512146104c65780631a394795146104f45780631a98b2e0146105145780631b3c90a8146105345780631fec5c5c1461054957806329b708721461055c5780633095634a1461057c5780633659cfe6146105aa5780633d8b38f6146105ca5780633e6326fc146105ea5780633f1f4fa41461060a57806340a00aaf146106385780634162169f1461064b578063425cfb531461066b57806342d65a8d1461069c578063452a9320146106bc57806346904840146106dd57806349160658146106fe5780634f1ef2861461071e57806352d1902d1461073157806356026f37146107465780635aef7de6146107665780635b23a990146107865780635b8c41e6146107b357806366ad5c8a1461080357806369c20d36146108235780636a22d8cc14610854578063715018a61461088857806373800fc41461089d5780637533d788146108cb5780637b0240c0146108f857806382dc737d146109355780638a0dac4a146109555780638cfd8f5c146109755780638da5cb5b146109ae5780638f65be85146109c3578063950c8a7414610a0c5780639a9ee08114610a2d5780639f38369a14610a4d578063a6c3d16514610a6d578063b2f7667f14610a8d578063b353aaa714610aaa578063b5569f1814610aca578063baf3292d14610afc578063c01c812314610b1c578063c2b6b58c14610b3c578063c446183414610b57578063c56bbdd914610b6d578063c612f9ea14610b80578063c6dd812f14610ba0578063c78ab88214610bf9578063cbed8b9c14610c19578063d1deba1f14610c39578063d422794714610c4c578063d55ec69714610c81578063d7d1bbdb14610c96578063d8b31c7714610cb6578063de5f72fd14610cd6578063df2a5b3b14610cf7578063e00dd16114610d17578063e1758bd814610d2e578063e74b981b14610d43578063eb8d72b714610d63578063f2fde38b14610d83578063f3fef3a314610da3578063f5ecbdbc14610dc3578063fad16abe14610de3575b600080fd5b34801561035c57600080fd5b5061037061036b3660046146de565b610e03565b005b34801561037e57600080fd5b506103a67f000000000000000000000000000000000000000000000000000000000000000081565b6040516103b3919061477e565b60405180910390f35b3480156103c857600080fd5b506103dc6103d7366004614880565b610ec0565b604080519283526020830191909152016103b3565b3480156103fd57600080fd5b5061037061040c36600461490d565b610f90565b34801561041d57600080fd5b5061044261042c366004614928565b6101d86020526000908152604090205460ff1681565b60405190151581526020016103b3565b34801561045e57600080fd5b5061037061046d366004614941565b610ffd565b34801561047e57600080fd5b5061037061048d36600461490d565b61101d565b34801561049e57600080fd5b506103a67f000000000000000000000000000000000000000000000000000000000000000081565b3480156104d257600080fd5b506104e66104e136600461490d565b611055565b6040519081526020016103b3565b34801561050057600080fd5b5061037061050f36600461496b565b61106c565b34801561052057600080fd5b5061037061052f366004614988565b611088565b34801561054057600080fd5b5061037061116b565b610370610557366004614a61565b611292565b34801561056857600080fd5b50610370610577366004614b28565b6112b7565b34801561058857600080fd5b5061059c610597366004614b44565b6112f8565b6040516103b3929190614bba565b3480156105b657600080fd5b506103706105c5366004614bdd565b6113bd565b3480156105d657600080fd5b506104426105e5366004614bfa565b611486565b3480156105f657600080fd5b506067546103a6906001600160a01b031681565b34801561061657600080fd5b506104e661062536600461490d565b6101016020526000908152604090205481565b610370610646366004614c4c565b611553565b34801561065757600080fd5b506065546103a6906001600160a01b031681565b34801561067757600080fd5b50610442610686366004614928565b6101c66020526000908152604090205460ff1681565b3480156106a857600080fd5b506103706106b7366004614bfa565b611572565b3480156106c857600080fd5b506101c5546103a6906001600160a01b031681565b3480156106e957600080fd5b506101d7546103a6906001600160a01b031681565b34801561070a57600080fd5b50610370610719366004614c8b565b6115e5565b61037061072c366004614d2e565b6116cd565b34801561073d57600080fd5b506104e6611787565b34801561075257600080fd5b506104e6610761366004614d7d565b611835565b34801561077257600080fd5b506066546103a6906001600160a01b031681565b34801561079257600080fd5b506107a66107a1366004614928565b6118d9565b6040516103b39190614dc5565b3480156107bf57600080fd5b506104e66107ce366004614dd4565b610130602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b34801561080f57600080fd5b5061037061081e3660046146de565b6118f0565b34801561082f57600080fd5b5061044261083e366004614928565b6101c76020526000908152604090205460ff1681565b34801561086057600080fd5b506103a67f000000000000000000000000000000000000000000000000000000000000000081565b34801561089457600080fd5b506103706119c4565b3480156108a957600080fd5b506104e66108b836600461490d565b6101d96020526000908152604090205481565b3480156108d757600080fd5b506108eb6108e636600461490d565b6119d8565b6040516103b39190614e31565b34801561090457600080fd5b506101c9546101ca546101cb5461091a92919083565b604080519384526020840192909252908201526060016103b3565b34801561094157600080fd5b50610370610950366004614e9f565b611a72565b34801561096157600080fd5b50610370610970366004614bdd565b611a93565b34801561098157600080fd5b506104e6610990366004614ebb565b61010060209081526000928352604080842090915290825290205481565b3480156109ba57600080fd5b506103a6611abe565b3480156109cf57600080fd5b506109f77f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103b3565b348015610a1857600080fd5b50610102546103a6906001600160a01b031681565b348015610a3957600080fd5b506108eb610a48366004614928565b611acd565b348015610a5957600080fd5b506108eb610a6836600461490d565b611b84565b348015610a7957600080fd5b50610370610a88366004614bfa565b611c94565b348015610a9957600080fd5b506101d1546101d2546103dc919082565b348015610ab657600080fd5b5060fe546103a6906001600160a01b031681565b348015610ad657600080fd5b506107a6610ae5366004614928565b6101d66020526000908152604090205461ffff1681565b348015610b0857600080fd5b50610370610b17366004614bdd565b611d27565b348015610b2857600080fd5b50610370610b37366004614eee565b611d86565b348015610b4857600080fd5b506101c8546104429060ff1681565b348015610b6357600080fd5b506104e661271081565b610370610b7b366004614f2e565b611d9e565b348015610b8c57600080fd5b50610370610b9b366004614928565b611de3565b348015610bac57600080fd5b506101cc546101cd546101ce546101cf546101d054610bcf949392919060ff1685565b6040805195865260208601949094529284019190915260608301521515608082015260a0016103b3565b348015610c0557600080fd5b50610370610c14366004615029565b611e07565b348015610c2557600080fd5b50610370610c343660046150d7565b611e8c565b610370610c473660046146de565b611f05565b348015610c5857600080fd5b506103dc610c67366004614bdd565b6101d3602052600090815260409020805460019091015482565b348015610c8d57600080fd5b5061037061211d565b348015610ca257600080fd5b50610370610cb1366004614928565b6121d1565b348015610cc257600080fd5b50610370610cd1366004614bdd565b6121f5565b348015610ce257600080fd5b506101d4546103a6906001600160a01b031681565b348015610d0357600080fd5b50610370610d12366004615128565b612220565b348015610d2357600080fd5b506104e66101d55481565b348015610d3a57600080fd5b506103a66122d3565b348015610d4f57600080fd5b50610370610d5e366004614bdd565b612360565b348015610d6f57600080fd5b50610370610d7e366004614bfa565b61238b565b348015610d8f57600080fd5b50610370610d9e366004614bdd565b6123e5565b348015610daf57600080fd5b50610370610dbe366004614b44565b61245b565b348015610dcf57600080fd5b506108eb610dde366004615164565b612549565b348015610def57600080fd5b50610370610dfe3660046151b1565b6125dc565b60fe546001600160a01b0316336001600160a01b031614610e425733604051634a43969960e11b8152600401610e39919061477e565b60405180910390fd5b610eb88686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f89018190048102820181019092528781528993509150879087908190840183828082843760009201919091525061282b92505050565b505050505050565b604080516001600160a01b0387811660208301528681168284015260608201869052600060808084018290528451808503909101815260a084019485905260fe5463040a7bb160e41b90955290938493919216906340a7bb1090610f30908c90309086908b908b9060a4016151f0565b6040805180830381865afa925050508015610f68575060408051601f3d908101601f19168201909252610f6591810190615244565b60015b610f79576000809250925050610f85565b9093509150610f859050565b965096945050505050565b610f986128a4565b60fe546040516307e0db1760e01b81526001600160a01b03909116906307e0db1790610fc8908490600401614dc5565b600060405180830381600087803b158015610fe257600080fd5b505af1158015610ff6573d6000803e3d6000fd5b5050505050565b6110056128a4565b61ffff90911660009081526101016020526040902055565b6110256128a4565b60fe546040516310ddb13760e01b81526001600160a01b03909116906310ddb13790610fc8908490600401614dc5565b61ffff1660009081526101d9602052604090205490565b611074612903565b6101c8805460ff1916911515919091179055565b6000858560405161109a929190615268565b604051908190038120631876eed960e01b825291506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631876eed9906110fe908e908e908e908e908e9089908d908d908d906004016152a1565b6020604051808303816000875af115801561111d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111419190615300565b61115e57604051631403112d60e21b815260040160405180910390fd5b5050505050505050505050565b60675460405163bf40fac160e01b815260206004820152600a60248201526921a7a72a2927a62622a960b11b60448201526001600160a01b039091169063bf40fac190606401602060405180830381865afa1580156111ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f2919061531d565b606580546001600160a01b0319166001600160a01b0392909216918217905560408051632d77bef360e11b81529051635aef7de6916004808201926020929091908290030181865afa15801561124c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611270919061531d565b606680546001600160a01b0319166001600160a01b0392909216919091179055565b6112b13385858585604051806020016040528060008152506000612960565b50505050565b6112bf612903565b80516101cc5560208101516101cd5560408101516101ce5560608101516101cf55608001516101d0805460ff1916911515919091179055565b6001600160a01b0380831660009081526101d360205260408082206067546101c8549251633de4799760e11b8152939460609473dEE49F247c8B567273437F41CC326A2fA1e9cC3D94637bc8f32e9461136c946101cc9491936101d193919092169160ff909116908c908c9060040161533a565b600060405180830381865af4158015611389573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113b191908101906153fa565b915091505b9250929050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156114065760405162461bcd60e51b8152600401610e3990615454565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611438612d47565b6001600160a01b03161461145e5760405162461bcd60e51b8152600401610e399061548e565b61146781612d63565b6040805160008082526020820190925261148391839190612d6b565b50565b61ffff8316600090815260ff6020526040812080548291906114a7906154c8565b80601f01602080910402602001604051908101604052809291908181526020018280546114d3906154c8565b80156115205780601f106114f557610100808354040283529160200191611520565b820191906000526020600020905b81548152906001019060200180831161150357829003601f168201915b505050505090508383604051611537929190615268565b60405180910390208180519060200120149150505b9392505050565b6112b13385858560006040518060200160405280600081525087612960565b61157a6128a4565b60fe546040516342d65a8d60e01b81526001600160a01b03909116906342d65a8d906115ae908690869086906004016154fd565b600060405180830381600087803b1580156115c857600080fd5b505af11580156115dc573d6000803e3d6000fd5b50505050505050565b600082826040516115f7929190615268565b604051908190038120635f6970c360e01b825291506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635f6970c390611655908b908b908b908b908b90899060040161551b565b6020604051808303816000875af1158015611674573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116989190615300565b6116b557604051631403112d60e21b815260040160405180910390fd5b6116c3878787878787612ed6565b5050505050505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156117165760405162461bcd60e51b8152600401610e3990615454565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611748612d47565b6001600160a01b03161461176e5760405162461bcd60e51b8152600401610e399061548e565b61177782612d63565b61178382826001612d6b565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146118225760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c6044820152771b1959081d1a1c9bdd59da0819195b1959d85d1958d85b1b60421b6064820152608401610e39565b50600080516020615b1383398151915290565b805160208201206000907f564ccaf7594d66b1eaaea24fe01f0585bf52ee70852af4eac0cc4b04711cd0e28114156118705750600192915050565b7f43ab905ae53adfdd46d0850022d385a6c09c15bfde5206c98fa0fc8dc340c3f88114156118a15750600592915050565b7f2ab2bf4c5cabc3000e2502e33470a863db2755809d7561237424a0eb373154c28114156118d3575061a4ec92915050565b50919050565b60009081526101d6602052604090205461ffff1690565b33301461194e5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b6064820152608401610e39565b610eb88686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f890181900481028201810190925287815289935091508790879081908401838280828437600092019190915250612f7892505050565b6119cc6128a4565b6119d66000612fb0565b565b60ff60205260009081526040902080546119f1906154c8565b80601f0160208091040260200160405190810160405280929190818152602001828054611a1d906154c8565b8015611a6a5780601f10611a3f57610100808354040283529160200191611a6a565b820191906000526020600020905b815481529060010190602001808311611a4d57829003601f168201915b505050505081565b611a7a612903565b80516101c95560208101516101ca55604001516101cb55565b611a9b612903565b6101c580546001600160a01b0319166001600160a01b0392909216919091179055565b60cc546001600160a01b031690565b60608160011415611afc575050604080518082019091526008815267457468657265756d60c01b602082015290565b8160051415611b2b57505060408051808201909152600a81526932ba3432b932bab6969960b11b602082015290565b8161a4ec1415611b5557505060408051808201909152600481526363656c6f60e01b602082015290565b8161aef31415611b7f57505060408051808201909152600481526363656c6f60e01b602082015290565b919050565b61ffff8116600090815260ff6020526040812080546060929190611ba7906154c8565b80601f0160208091040260200160405190810160405280929190818152602001828054611bd3906154c8565b8015611c205780601f10611bf557610100808354040283529160200191611c20565b820191906000526020600020905b815481529060010190602001808311611c0357829003601f168201915b50505050509050805160001415611c795760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f72640000006044820152606401610e39565b61154c600060148351611c8c9190615572565b839190613002565b611c9c6128a4565b818130604051602001611cb193929190615589565b60408051601f1981840301815291815261ffff8516600090815260ff60209081529190208251611ce693919290910190614567565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce838383604051611d1a939291906154fd565b60405180910390a1505050565b611d2f6128a4565b61010280546001600160a01b0319166001600160a01b0383161790556040517f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b90611d7b90839061477e565b60405180910390a150565b611d8e612903565b611d9983838361310f565b505050565b610ff633868686600187878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509250612960915050565b611deb612903565b60009081526101c660205260409020805460ff19166001179055565b611e0f612903565b60005b8251811015611d9957818181518110611e2d57611e2d6155aa565b60200260200101516101c76000858481518110611e4c57611e4c6155aa565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611e84906155c0565b915050611e12565b611e946128a4565b60fe546040516332fb62e760e21b81526001600160a01b039091169063cbed8b9c90611ecc90889088908890889088906004016155db565b600060405180830381600087803b158015611ee657600080fd5b505af1158015611efa573d6000803e3d6000fd5b505050505050505050565b61ffff8616600090815261013060205260408082209051611f299088908890615268565b90815260408051602092819003830190206001600160401b03871660009081529252902054905080611fa95760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b6064820152608401610e39565b808383604051611fba929190615268565b6040518091039020146120195760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b6064820152608401610e39565b61ffff871660009081526101306020526040808220905161203d9089908990615268565b90815260408051602092819003830181206001600160401b038916600090815290845282902093909355601f880182900482028301820190528682526120d5918991899089908190840183828082843760009201919091525050604080516020601f8a018190048102820181019092528881528a935091508890889081908401838280828437600092019190915250612f7892505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e5878787878560405161210c959493929190615614565b60405180910390a150505050505050565b600054600290610100900460ff1615801561213f575060005460ff8083169116105b61215b5760405162461bcd60e51b8152600401610e399061564f565b6000805461ffff191660ff83161761010017905561217c606560013061310f565b61218a607d61a4ec3061310f565b612197608a607a3061310f565b6121a561016d60323061310f565b6000805461ff001916905560405160ff82168152600080516020615b3383398151915290602001611d7b565b6121d9612903565b60009081526101d860205260409020805460ff19166001179055565b6121fd612903565b6101d480546001600160a01b0319166001600160a01b0392909216919091179055565b6122286128a4565b600081116122705760405162461bcd60e51b81526020600482015260156024820152744c7a4170703a20696e76616c6964206d696e47617360581b6044820152606401610e39565b61ffff8381166000818152610100602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac090606001611d1a565b60675460405163bf40fac160e01b815260206004820152600a60248201526923a7a7a22227a62620a960b11b60448201526000916001600160a01b03169063bf40fac190606401602060405180830381865afa158015612337573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235b919061531d565b905090565b612368612903565b6101d780546001600160a01b0319166001600160a01b0392909216919091179055565b6123936128a4565b61ffff8316600090815260ff602052604090206123b19083836145eb565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab838383604051611d1a939291906154fd565b6123ed6128a4565b6001600160a01b0381166124525760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e39565b61148381612fb0565b6124636131b8565b806124d8576040516370a0823160e01b81526001600160a01b038316906370a082319061249490309060040161477e565b602060405180830381865afa1580156124b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124d5919061569d565b90505b60405163a9059cbb60e01b81526001600160a01b0383169063a9059cbb9061250690339085906004016156b6565b6020604051808303816000875af1158015612525573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d999190615300565b60fe54604051633d7b2f6f60e21b815261ffff808716600483015285166024820152306044820152606481018390526060916001600160a01b03169063f5ecbdbc90608401600060405180830381865afa1580156125ab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526125d391908101906156cf565b95945050505050565b600054610100900460ff16158080156125fc5750600054600160ff909116105b8061261d575061260b3061327b565b15801561261d575060005460ff166001145b6126395760405162461bcd60e51b8152600401610e399061564f565b6000805460ff19166001179055801561265c576000805461ff0019166101001790555b6126658461328a565b61268e7f00000000000000000000000000000000000000000000000000000000000000006132ad565b6101c58054336001600160a01b031990911617905582516101cc556020808401516101cd556040808501516101ce5560608501516101cf5560808501516101d0805460ff191691151591909117905583516101c955838201516101ca55838101516101cb555163bf40fac160e01b815260048101919091526009602482015268554249534348454d4560b81b60448201526001600160a01b0385169063bf40fac190606401602060405180830381865afa158015612750573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612774919061531d565b6101d780546001600160a01b0319166001600160a01b039290921691821790556127bc576066546101d780546001600160a01b0319166001600160a01b039092169190911790555b6127c96065600130611d86565b6127d7607d61a4ec30611d86565b6127e4608a607a30611d86565b6127f261016d603230611d86565b80156112b1576000805461ff001916905560405160018152600080516020615b338339815191529060200160405180910390a150505050565b60008061288e5a60966366ad5c8a60e01b898989896040516024016128539493929190615717565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152309291906132e5565b9150915081610eb857610eb8868686868561336f565b336128ad611abe565b6001600160a01b0316146119d65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e39565b6101c5546001600160a01b031633148061292757506066546001600160a01b031633145b80612941575033612936611abe565b6001600160a01b0316145b6119d6573360405163b63b5ad960e01b8152600401610e39919061477e565b6101c85460ff161561299e5760405163c5426f8d60e01b815260206004820152600660248201526518db1bdcd95960d21b6044820152606401610e39565b6129a66122d3565b6001600160a01b03166379cc679088866040518363ffffffff1660e01b81526004016129d39291906156b6565b600060405180830381600087803b1580156129ed57600080fd5b505af1158015612a01573d6000803e3d6000fd5b50505050600073dEE49F247c8B567273437F41CC326A2fA1e9cC3D63aac673c386612a2a6122d3565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8b9190615755565b6040516001600160e01b031960e085901b168152600481019290925260ff166024820152604401602060405180830381865af4158015612acf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af3919061569d565b905034612b1357604051630ba4e53360e21b815260040160405180910390fd5b600030466101d58054906000612b28836155c0565b90915550604080516001600160a01b039094166020850152830191909152606082015260800160408051808303601f1901815282825280516020918201206001600160a01b03808e1692850192909252908b16918301919091526060820184905260808201819052915060009060a00160408051601f1981840301815291905290506000866001811115612bbe57612bbe615778565b1415612c1d576000612bcf89611acd565b9050805160001415612bf75760405163068a505360e01b8152600481018a9052602401610e39565b612c1782826001600160a01b03881615612c11578761340d565b3361340d565b50612ce9565b6001866001811115612c3157612c31615778565b1415612ce9578451612c6857604051600160f01b602082015262061a80602282015260420160405160208183030381529060405294505b6000612c73896118d9565b905061ffff8116612c9a5760405163068a505360e01b8152600481018a9052602401610e39565b6000612cab828d8d8860008c610ec0565b50905034811115612cd8576040516324a89fab60e21b815260048101829052346024820152604401610e39565b612ce683838e60008b61351f565b50505b81896001600160a01b03168b6001600160a01b03167fabeeb7182c7294cd8efcd40e9ff952c1b759c2165b3634aac589429de5d55ad08b87428c604051612d3394939291906157b0565b60405180910390a450505050505050505050565b600080516020615b13833981519152546001600160a01b031690565b6114836128a4565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615612d9e57611d998361352d565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612df8575060408051601f3d908101601f19168201909252612df59181019061569d565b60015b612e5b5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610e39565b600080516020615b138339815191528114612eca5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610e39565b50611d998383836135c7565b6000612f1785858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506135ec92505050565b90506000808080612f2a868801886157d2565b935093509350935061115e8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250899250889150879050868661376b565b60008060008084806020019051810190612f929190615818565b60148b015193975091955093509150611efa898289888888886137fc565b60cc80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60608161301081601f615860565b101561304f5760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610e39565b6130598284615860565b8451101561309d5760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610e39565b6060821580156130bc5760405191506000825260208201604052613106565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156130f55780518352602092830192016130dd565b5050858452601f01601f1916604052505b50949350505050565b61ffff831660009081526101d96020526040902054156131415760405162dc149f60e41b815260040160405180910390fd5b61ffff831660008181526101d9602090815260408083208690558583526101d6825291829020805461ffff191690931790925551613183918391309101615878565b60408051601f1981840301815291815261ffff8516600090815260ff602090815291902082516112b193919290910190614567565b60655460408051632d77bef360e11b8152905133926001600160a01b031691635aef7de69160048083019260209291908290030181865afa158015613201573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613225919061531d565b6001600160a01b0316146119d65760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206176617461722063616e2063616c6c2074686973206d6574686f646044820152606401610e39565b6001600160a01b03163b151590565b606780546001600160a01b0319166001600160a01b03831617905561148361116b565b600054610100900460ff166132d45760405162461bcd60e51b8152600401610e399061589a565b6132dc613819565b61148381613849565b6000606060008060008661ffff166001600160401b0381111561330a5761330a6147b5565b6040519080825280601f01601f191660200182016040528015613334576020820181803683370190505b50905060008087516020890160008d8df191503d925086831115613356578692505b828152826000602083013e909890975095505050505050565b818051906020012061013060008761ffff1661ffff168152602001908152602001600020856040516133a191906158e5565b9081526040805191829003602090810183206001600160401b0388166000908152915220919091557fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c906133fe9087908790879087908790615901565b60405180910390a15050505050565b600061341830613892565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630c93e3bb3430868589886040518763ffffffff1660e01b815260040161346f959493929190615953565b6000604051808303818588803b15801561348857600080fd5b505af115801561349c573d6000803e3d6000fd5b5050604051631c92115f60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169350631c92115f92506134f191508690859089906004016159b1565b600060405180830381600087803b15801561350b57600080fd5b505af11580156116c3573d6000803e3d6000fd5b610ff6848685858534613ad7565b6135368161327b565b6135985760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610e39565b600080516020615b1383398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6135d083613c61565b6000825111806135dd5750805b15611d99576112b18383613ca1565b6000808290506000808251602a14158061362c575082600081518110613614576136146155aa565b6020910101516001600160f81b031916600360fc1b14155b8061365d575082600181518110613645576136456155aa565b6020910101516001600160f81b031916600f60fb1b14155b1561367b57604051636fa478cf60e11b815260040160405180910390fd5b60025b602a81101561376157838181518110613699576136996155aa565b016020015160f81c9150606182108015906136b8575060668260ff1611155b156136cf576136c86057836159f4565b9150613738565b60418260ff16101580156136e7575060468260ff1611155b156136f7576136c86037836159f4565b60308260ff161015801561370f575060398260ff1611155b1561371f576136c86030836159f4565b604051636fa478cf60e11b815260040160405180910390fd5b6002613745826029615572565b60ff8416911b1b929092179161375a816155c0565b905061367e565b5090949350505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316600114156137df5760405163c5426f8d60e01b8152602060048201526016602482015275185e195b185c8819d85d195dd85e481b9bdd081cd95d60521b6044820152606401610e39565b60006137ea87611835565b90506115dc858585848a876000613d8a565b600061380788611055565b90506116c3858585848b876001613d8a565b600054610100900460ff166138405760405162461bcd60e51b8152600401610e399061589a565b6119d633612fb0565b600054610100900460ff166138705760405162461bcd60e51b8152600401610e399061589a565b60fe80546001600160a01b0319166001600160a01b0392909216919091179055565b604051606082811b6001600160601b03191660208301529060009060340160408051601f198184030181528282528051838301909252601083526f181899199a1a9b1b9c1cb0b131b232b360811b602084015280519093509091906000906138fb906002615a17565b613906906002615860565b6001600160401b0381111561391d5761391d6147b5565b6040519080825280601f01601f191660200182016040528015613947576020820181803683370190505b509050600360fc1b81600081518110613962576139626155aa565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110613991576139916155aa565b60200101906001600160f81b031916908160001a90535060005b83811015613acd578260048683815181106139c8576139c86155aa565b016020015182516001600160f81b031990911690911c60f81c9081106139f0576139f06155aa565b01602001516001600160f81b03191682613a0b836002615a17565b613a16906002615860565b81518110613a2657613a266155aa565b60200101906001600160f81b031916908160001a90535082858281518110613a5057613a506155aa565b602091010151815160f89190911c600f16908110613a7057613a706155aa565b01602001516001600160f81b03191682613a8b836002615a17565b613a96906003615860565b81518110613aa657613aa66155aa565b60200101906001600160f81b031916908160001a905350613ac6816155c0565b90506139ab565b5095945050505050565b61ffff8616600090815260ff602052604081208054613af5906154c8565b80601f0160208091040260200160405190810160405280929190818152602001828054613b21906154c8565b8015613b6e5780601f10613b4357610100808354040283529160200191613b6e565b820191906000526020600020905b815481529060010190602001808311613b5157829003601f168201915b50505050509050805160001415613be05760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b6064820152608401610e39565b613beb878751614273565b60fe5460405162c5803160e81b81526001600160a01b039091169063c5803100908490613c26908b9086908c908c908c908c90600401615a36565b6000604051808303818588803b158015613c3f57600080fd5b505af1158015613c53573d6000803e3d6000fd5b505050505050505050505050565b613c6a8161352d565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060613cac8361327b565b613d075760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610e39565b600080846001600160a01b031684604051613d2291906158e5565b600060405180830381855af49150503d8060008114613d5d576040519150601f19603f3d011682016040523d82523d6000602084013e613d62565b606091505b50915091506125d38282604051806060016040528060278152602001615b53602791396142e2565b613d93846118d9565b61ffff16613db75760405163068a505360e01b815260048101859052602401610e39565b6101c760008583604051602001613dcf929190615a9d565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff1615613e385760405163c5426f8d60e01b815260206004820152600f60248201526e1cdbdd5c98d948191a5cd8589b1959608a1b6044820152606401610e39565b60008281526101c6602052604090205460ff1615613e6c57604051636e91c2f160e11b815260048101839052602401610e39565b600060ff6000613e7b876118d9565b61ffff1661ffff1681526020019081526020016000208054613e9c906154c8565b80601f0160208091040260200160405190810160405280929190818152602001828054613ec8906154c8565b8015613f155780601f10613eea57610100808354040283529160200191613f15565b820191906000526020600020905b815481529060010190602001808311613ef857829003601f168201915b5050505050905060008430604051602001613f31929190615878565b604051602081830303815290604052905081518151141580613f5257508151155b80613f6b57508180519060200120818051906020012014155b15613fb857604080518781526001600160a01b03871660208201527f1eafb58197ea0dc76b9278ccad47f61a239f00b017d89a19081a89321cce213d910160405180910390a150506115dc565b60008481526101d8602052604090205460ff16613fdb57613fdb898989466142fb565b600073dEE49F247c8B567273437F41CC326A2fA1e9cC3D63e62381b6896140006122d3565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561403d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140619190615755565b6040516001600160e01b031960e085901b168152600481019290925260ff166024820152604401602060405180830381865af41580156140a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140c9919061569d565b905060006140d682614428565b60008781526101c660205260409020805460ff1916600117905590506140fb8a61444d565b6065546001600160a01b0316636407e4326141168385615572565b6066546040516001600160e01b031960e085901b16815261414892918f916001600160a01b0390911690600401615ab1565b6020604051808303816000875af1158015614167573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061418b9190615300565b508015614214576065546101d754606654604051633203f21960e11b81526001600160a01b0393841693636407e432936141cf938793918316921690600401615ab1565b6020604051808303816000875af11580156141ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142129190615300565b505b858a6001600160a01b03168c6001600160a01b03167f6cf712ce908185c8c38a073b7315f79687e7440fb057d9d1ca76a2509a1282ee8c858d8b60405161425e94939291906157b0565b60405180910390a45050505050505050505050565b61ffff8216600090815261010160205260409020548061429257506127105b80821115611d995760405162461bcd60e51b815260206004820181905260248201527f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c617267656044820152606401610e39565b606083156142f157508161154c565b61154c838361453d565b6001600160a01b038316158061430f575080155b156143315782816040516314b2a5c360e31b8152600401610e399291906156b6565b61433e6201518042615572565b6101d154101561435457426101d15560006101d2555b6143616201518042615572565b6001600160a01b03851660009081526101d3602052604090205410156143a2576001600160a01b03841660009081526101d360205260408120428155600101555b6000806143af86856112f8565b9092509050816143d4578060405163c5426f8d60e01b8152600401610e399190614e31565b836101d160010160008282546143ea9190615860565b90915550506001600160a01b03861660009081526101d360205260408120600101805486929061441b908490615860565b9091555050505050505050565b6101cb546000906127109061443d9084615a17565b6144479190615ad0565b92915050565b6101d4546001600160a01b0316158015906144d557506101d4546040516374bf77e960e11b81526001600160a01b039091169063e97eefd29061449490849060040161477e565b602060405180830381865afa1580156144b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144d59190615300565b15611483576101d4546040516306ee3b9f60e31b81526001600160a01b0390911690633771dcf89061450b90849060040161477e565b600060405180830381600087803b15801561452557600080fd5b505af1925050508015614536575060015b6114835750565b81511561454d5781518083602001fd5b8060405162461bcd60e51b8152600401610e399190614e31565b828054614573906154c8565b90600052602060002090601f01602090048101928261459557600085556145db565b82601f106145ae57805160ff19168380011785556145db565b828001600101855582156145db579182015b828111156145db5782518255916020019190600101906145c0565b506145e792915061465f565b5090565b8280546145f7906154c8565b90600052602060002090601f01602090048101928261461957600085556145db565b82601f106146325782800160ff198235161785556145db565b828001600101855582156145db579182015b828111156145db578235825591602001919060010190614644565b5b808211156145e75760008155600101614660565b803561ffff81168114611b7f57600080fd5b60008083601f84011261469857600080fd5b5081356001600160401b038111156146af57600080fd5b6020830191508360208285010111156113b657600080fd5b80356001600160401b0381168114611b7f57600080fd5b600080600080600080608087890312156146f757600080fd5b61470087614674565b955060208701356001600160401b038082111561471c57600080fd5b6147288a838b01614686565b909750955085915061473c60408a016146c7565b9450606089013591508082111561475257600080fd5b5061475f89828a01614686565b979a9699509497509295939492505050565b6001600160a01b03169052565b6001600160a01b0391909116815260200190565b6001600160a01b038116811461148357600080fd5b801515811461148357600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156147f3576147f36147b5565b604052919050565b60006001600160401b03821115614814576148146147b5565b50601f01601f191660200190565b6000614835614830846147fb565b6147cb565b905082815283838301111561484957600080fd5b828260208301376000602084830101529392505050565b600082601f83011261487157600080fd5b61154c83833560208501614822565b60008060008060008060c0878903121561489957600080fd5b6148a287614674565b955060208701356148b281614792565b945060408701356148c281614792565b93506060870135925060808701356148d9816147a7565b915060a08701356001600160401b038111156148f457600080fd5b61490089828a01614860565b9150509295509295509295565b60006020828403121561491f57600080fd5b61154c82614674565b60006020828403121561493a57600080fd5b5035919050565b6000806040838503121561495457600080fd5b61495d83614674565b946020939093013593505050565b60006020828403121561497d57600080fd5b813561154c816147a7565b60008060008060008060008060008060c08b8d0312156149a757600080fd5b8a35995060208b01356001600160401b03808211156149c557600080fd5b6149d18e838f01614686565b909b50995060408d01359150808211156149ea57600080fd5b6149f68e838f01614686565b909950975060608d0135915080821115614a0f57600080fd5b614a1b8e838f01614686565b909750955060808d0135915080821115614a3457600080fd5b50614a418d828e01614686565b9150809450508092505060a08b013590509295989b9194979a5092959850565b60008060008060808587031215614a7757600080fd5b8435614a8281614792565b93506020850135925060408501359150606085013560028110614aa457600080fd5b939692955090935050565b600060a08284031215614ac157600080fd5b60405160a081016001600160401b0381118282101715614ae357614ae36147b5565b8060405250809150823581526020830135602082015260408301356040820152606083013560608201526080830135614b1b816147a7565b6080919091015292915050565b600060a08284031215614b3a57600080fd5b61154c8383614aaf565b60008060408385031215614b5757600080fd5b823561495d81614792565b60005b83811015614b7d578181015183820152602001614b65565b838111156112b15750506000910152565b60008151808452614ba6816020860160208601614b62565b601f01601f19169290920160200192915050565b8215158152604060208201526000614bd56040830184614b8e565b949350505050565b600060208284031215614bef57600080fd5b813561154c81614792565b600080600060408486031215614c0f57600080fd5b614c1884614674565b925060208401356001600160401b03811115614c3357600080fd5b614c3f86828701614686565b9497909650939450505050565b60008060008060808587031215614c6257600080fd5b8435614c6d81614792565b935060208501359250604085013591506060850135614aa481614792565b60008060008060008060006080888a031215614ca657600080fd5b8735965060208801356001600160401b0380821115614cc457600080fd5b614cd08b838c01614686565b909850965060408a0135915080821115614ce957600080fd5b614cf58b838c01614686565b909650945060608a0135915080821115614d0e57600080fd5b50614d1b8a828b01614686565b989b979a50959850939692959293505050565b60008060408385031215614d4157600080fd5b8235614d4c81614792565b915060208301356001600160401b03811115614d6757600080fd5b614d7385828601614860565b9150509250929050565b600060208284031215614d8f57600080fd5b81356001600160401b03811115614da557600080fd5b8201601f81018413614db657600080fd5b614bd584823560208401614822565b61ffff91909116815260200190565b600080600060608486031215614de957600080fd5b614df284614674565b925060208401356001600160401b03811115614e0d57600080fd5b614e1986828701614860565b925050614e28604085016146c7565b90509250925092565b60208152600061154c6020830184614b8e565b600060608284031215614e5657600080fd5b604051606081016001600160401b0381118282101715614e7857614e786147b5565b80604052508091508235815260208301356020820152604083013560408201525092915050565b600060608284031215614eb157600080fd5b61154c8383614e44565b60008060408385031215614ece57600080fd5b614ed783614674565b9150614ee560208401614674565b90509250929050565b600080600060608486031215614f0357600080fd5b614f0c84614674565b9250602084013591506040840135614f2381614792565b809150509250925092565b600080600080600060808688031215614f4657600080fd5b8535614f5181614792565b9450602086013593506040860135925060608601356001600160401b03811115614f7a57600080fd5b614f8688828901614686565b969995985093965092949392505050565b60006001600160401b03821115614fb057614fb06147b5565b5060051b60200190565b600082601f830112614fcb57600080fd5b81356020614fdb61483083614f97565b82815260059290921b84018101918181019086841115614ffa57600080fd5b8286015b8481101561501e578035615011816147a7565b8352918301918301614ffe565b509695505050505050565b6000806040838503121561503c57600080fd5b82356001600160401b038082111561505357600080fd5b818501915085601f83011261506757600080fd5b8135602061507761483083614f97565b82815260059290921b8401810191818101908984111561509657600080fd5b948201945b838610156150b45785358252948201949082019061509b565b965050860135925050808211156150ca57600080fd5b50614d7385828601614fba565b6000806000806000608086880312156150ef57600080fd5b6150f886614674565b945061510660208701614674565b93506040860135925060608601356001600160401b03811115614f7a57600080fd5b60008060006060848603121561513d57600080fd5b61514684614674565b925061515460208501614674565b9150604084013590509250925092565b6000806000806080858703121561517a57600080fd5b61518385614674565b935061519160208601614674565b925060408501356151a181614792565b9396929550929360600135925050565b600080600061012084860312156151c757600080fd5b83356151d281614792565b92506151e18560208601614aaf565b9150614e288560c08601614e44565b61ffff861681526001600160a01b038516602082015260a06040820181905260009061521e90830186614b8e565b841515606084015282810360808401526152388185614b8e565b98975050505050505050565b6000806040838503121561525757600080fd5b505080516020909101519092909150565b8183823760009101908152919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b89815260c0602082015260006152bb60c083018a8c615278565b82810360408401526152ce81898b615278565b905086606084015282810360808401526152e9818688615278565b9150508260a08301529a9950505050505050505050565b60006020828403121561531257600080fd5b815161154c816147a7565b60006020828403121561532f57600080fd5b815161154c81614792565b8754815260018089015460208301526002890154604083015260038901546060830152600489015460ff1615156080830152875460a083015287015460c08201526101a08101865460e083015260018701546101008301526153a0610120830187614771565b8415156101408301526153b7610160830185614771565b8261018083015298975050505050505050565b60006153d8614830846147fb565b90508281528383830111156153ec57600080fd5b61154c836020830184614b62565b6000806040838503121561540d57600080fd5b8251615418816147a7565b60208401519092506001600160401b0381111561543457600080fd5b8301601f8101851361544557600080fd5b614d73858251602084016153ca565b6020808252602c90820152600080516020615af383398151915260408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c90820152600080516020615af383398151915260408201526b6163746976652070726f787960a01b606082015260800190565b600181811c908216806154dc57607f821691505b602082108114156118d357634e487b7160e01b600052602260045260246000fd5b61ffff841681526040602082015260006125d3604083018486615278565b868152608060208201526000615535608083018789615278565b8281036040840152615548818688615278565b915050826060830152979650505050505050565b634e487b7160e01b600052601160045260246000fd5b6000828210156155845761558461555c565b500390565b8284823760609190911b6001600160601b0319169101908152601401919050565b634e487b7160e01b600052603260045260246000fd5b60006000198214156155d4576155d461555c565b5060010190565b600061ffff808816835280871660208401525084604083015260806060830152615609608083018486615278565b979650505050505050565b61ffff86168152608060208201526000615632608083018688615278565b6001600160401b0394909416604083015250606001529392505050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156156af57600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b6000602082840312156156e157600080fd5b81516001600160401b038111156156f757600080fd5b8201601f8101841361570857600080fd5b614bd5848251602084016153ca565b61ffff851681526080602082015260006157346080830186614b8e565b6001600160401b038516604084015282810360608401526156098185614b8e565b60006020828403121561576757600080fd5b815160ff8116811461154c57600080fd5b634e487b7160e01b600052602160045260246000fd5b600281106157ac57634e487b7160e01b600052602160045260246000fd5b9052565b8481526020810184905260408101839052608081016125d3606083018461578e565b600080600080608085870312156157e857600080fd5b84356157f381614792565b9350602085013561580381614792565b93969395505050506040820135916060013590565b6000806000806080858703121561582e57600080fd5b845161583981614792565b602086015190945061584a81614792565b6040860151606090960151949790965092505050565b600082198211156158735761587361555c565b500190565b6001600160601b0319606093841b811682529190921b16601482015260280190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600082516158f7818460208701614b62565b9190910192915050565b61ffff8616815260a06020820152600061591e60a0830187614b8e565b6001600160401b0386166040840152828103606084015261593f8186614b8e565b905082810360808401526152388185614b8e565b600060018060a01b03808816835260a0602084015261597560a0840188614b8e565b83810360408501526159878188614b8e565b9050838103606085015261599b8187614b8e565b9250508084166080840152509695505050505050565b6060815260006159c46060830186614b8e565b82810360208401526159d68186614b8e565b905082810360408401526159ea8185614b8e565b9695505050505050565b600060ff821660ff841680821015615a0e57615a0e61555c565b90039392505050565b6000816000190483118215151615615a3157615a3161555c565b500290565b61ffff8716815260c060208201526000615a5360c0830188614b8e565b8281036040840152615a658188614b8e565b6001600160a01b0387811660608601528616608085015283810360a08501529050615a908185614b8e565b9998505050505050505050565b8281526040810161154c602083018461578e565b9283526001600160a01b03918216602084015216604082015260600190565b600082615aed57634e487b7160e01b600052601260045260246000fd5b50049056fe46756e6374696f6e206d7573742062652063616c6c6564207468726f75676820360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220074469714023f1f6a6733f055ecc495de1be7fc1b548740e175f36f3a0764c4864736f6c634300080a0033",
  "deployedBytecode": "0x60806040526004361061034b5760003560e01c80621d356714610350578063020051cf1461037257806305fead15146103bc57806307e0db17146103f15780630dce292e146104115780630df374831461045257806310ddb13714610472578063116191b61461049257806316ad5512146104c65780631a394795146104f45780631a98b2e0146105145780631b3c90a8146105345780631fec5c5c1461054957806329b708721461055c5780633095634a1461057c5780633659cfe6146105aa5780633d8b38f6146105ca5780633e6326fc146105ea5780633f1f4fa41461060a57806340a00aaf146106385780634162169f1461064b578063425cfb531461066b57806342d65a8d1461069c578063452a9320146106bc57806346904840146106dd57806349160658146106fe5780634f1ef2861461071e57806352d1902d1461073157806356026f37146107465780635aef7de6146107665780635b23a990146107865780635b8c41e6146107b357806366ad5c8a1461080357806369c20d36146108235780636a22d8cc14610854578063715018a61461088857806373800fc41461089d5780637533d788146108cb5780637b0240c0146108f857806382dc737d146109355780638a0dac4a146109555780638cfd8f5c146109755780638da5cb5b146109ae5780638f65be85146109c3578063950c8a7414610a0c5780639a9ee08114610a2d5780639f38369a14610a4d578063a6c3d16514610a6d578063b2f7667f14610a8d578063b353aaa714610aaa578063b5569f1814610aca578063baf3292d14610afc578063c01c812314610b1c578063c2b6b58c14610b3c578063c446183414610b57578063c56bbdd914610b6d578063c612f9ea14610b80578063c6dd812f14610ba0578063c78ab88214610bf9578063cbed8b9c14610c19578063d1deba1f14610c39578063d422794714610c4c578063d55ec69714610c81578063d7d1bbdb14610c96578063d8b31c7714610cb6578063de5f72fd14610cd6578063df2a5b3b14610cf7578063e00dd16114610d17578063e1758bd814610d2e578063e74b981b14610d43578063eb8d72b714610d63578063f2fde38b14610d83578063f3fef3a314610da3578063f5ecbdbc14610dc3578063fad16abe14610de3575b600080fd5b34801561035c57600080fd5b5061037061036b3660046146de565b610e03565b005b34801561037e57600080fd5b506103a67f000000000000000000000000000000000000000000000000000000000000000081565b6040516103b3919061477e565b60405180910390f35b3480156103c857600080fd5b506103dc6103d7366004614880565b610ec0565b604080519283526020830191909152016103b3565b3480156103fd57600080fd5b5061037061040c36600461490d565b610f90565b34801561041d57600080fd5b5061044261042c366004614928565b6101d86020526000908152604090205460ff1681565b60405190151581526020016103b3565b34801561045e57600080fd5b5061037061046d366004614941565b610ffd565b34801561047e57600080fd5b5061037061048d36600461490d565b61101d565b34801561049e57600080fd5b506103a67f000000000000000000000000000000000000000000000000000000000000000081565b3480156104d257600080fd5b506104e66104e136600461490d565b611055565b6040519081526020016103b3565b34801561050057600080fd5b5061037061050f36600461496b565b61106c565b34801561052057600080fd5b5061037061052f366004614988565b611088565b34801561054057600080fd5b5061037061116b565b610370610557366004614a61565b611292565b34801561056857600080fd5b50610370610577366004614b28565b6112b7565b34801561058857600080fd5b5061059c610597366004614b44565b6112f8565b6040516103b3929190614bba565b3480156105b657600080fd5b506103706105c5366004614bdd565b6113bd565b3480156105d657600080fd5b506104426105e5366004614bfa565b611486565b3480156105f657600080fd5b506067546103a6906001600160a01b031681565b34801561061657600080fd5b506104e661062536600461490d565b6101016020526000908152604090205481565b610370610646366004614c4c565b611553565b34801561065757600080fd5b506065546103a6906001600160a01b031681565b34801561067757600080fd5b50610442610686366004614928565b6101c66020526000908152604090205460ff1681565b3480156106a857600080fd5b506103706106b7366004614bfa565b611572565b3480156106c857600080fd5b506101c5546103a6906001600160a01b031681565b3480156106e957600080fd5b506101d7546103a6906001600160a01b031681565b34801561070a57600080fd5b50610370610719366004614c8b565b6115e5565b61037061072c366004614d2e565b6116cd565b34801561073d57600080fd5b506104e6611787565b34801561075257600080fd5b506104e6610761366004614d7d565b611835565b34801561077257600080fd5b506066546103a6906001600160a01b031681565b34801561079257600080fd5b506107a66107a1366004614928565b6118d9565b6040516103b39190614dc5565b3480156107bf57600080fd5b506104e66107ce366004614dd4565b610130602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b34801561080f57600080fd5b5061037061081e3660046146de565b6118f0565b34801561082f57600080fd5b5061044261083e366004614928565b6101c76020526000908152604090205460ff1681565b34801561086057600080fd5b506103a67f000000000000000000000000000000000000000000000000000000000000000081565b34801561089457600080fd5b506103706119c4565b3480156108a957600080fd5b506104e66108b836600461490d565b6101d96020526000908152604090205481565b3480156108d757600080fd5b506108eb6108e636600461490d565b6119d8565b6040516103b39190614e31565b34801561090457600080fd5b506101c9546101ca546101cb5461091a92919083565b604080519384526020840192909252908201526060016103b3565b34801561094157600080fd5b50610370610950366004614e9f565b611a72565b34801561096157600080fd5b50610370610970366004614bdd565b611a93565b34801561098157600080fd5b506104e6610990366004614ebb565b61010060209081526000928352604080842090915290825290205481565b3480156109ba57600080fd5b506103a6611abe565b3480156109cf57600080fd5b506109f77f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103b3565b348015610a1857600080fd5b50610102546103a6906001600160a01b031681565b348015610a3957600080fd5b506108eb610a48366004614928565b611acd565b348015610a5957600080fd5b506108eb610a6836600461490d565b611b84565b348015610a7957600080fd5b50610370610a88366004614bfa565b611c94565b348015610a9957600080fd5b506101d1546101d2546103dc919082565b348015610ab657600080fd5b5060fe546103a6906001600160a01b031681565b348015610ad657600080fd5b506107a6610ae5366004614928565b6101d66020526000908152604090205461ffff1681565b348015610b0857600080fd5b50610370610b17366004614bdd565b611d27565b348015610b2857600080fd5b50610370610b37366004614eee565b611d86565b348015610b4857600080fd5b506101c8546104429060ff1681565b348015610b6357600080fd5b506104e661271081565b610370610b7b366004614f2e565b611d9e565b348015610b8c57600080fd5b50610370610b9b366004614928565b611de3565b348015610bac57600080fd5b506101cc546101cd546101ce546101cf546101d054610bcf949392919060ff1685565b6040805195865260208601949094529284019190915260608301521515608082015260a0016103b3565b348015610c0557600080fd5b50610370610c14366004615029565b611e07565b348015610c2557600080fd5b50610370610c343660046150d7565b611e8c565b610370610c473660046146de565b611f05565b348015610c5857600080fd5b506103dc610c67366004614bdd565b6101d3602052600090815260409020805460019091015482565b348015610c8d57600080fd5b5061037061211d565b348015610ca257600080fd5b50610370610cb1366004614928565b6121d1565b348015610cc257600080fd5b50610370610cd1366004614bdd565b6121f5565b348015610ce257600080fd5b506101d4546103a6906001600160a01b031681565b348015610d0357600080fd5b50610370610d12366004615128565b612220565b348015610d2357600080fd5b506104e66101d55481565b348015610d3a57600080fd5b506103a66122d3565b348015610d4f57600080fd5b50610370610d5e366004614bdd565b612360565b348015610d6f57600080fd5b50610370610d7e366004614bfa565b61238b565b348015610d8f57600080fd5b50610370610d9e366004614bdd565b6123e5565b348015610daf57600080fd5b50610370610dbe366004614b44565b61245b565b348015610dcf57600080fd5b506108eb610dde366004615164565b612549565b348015610def57600080fd5b50610370610dfe3660046151b1565b6125dc565b60fe546001600160a01b0316336001600160a01b031614610e425733604051634a43969960e11b8152600401610e39919061477e565b60405180910390fd5b610eb88686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f89018190048102820181019092528781528993509150879087908190840183828082843760009201919091525061282b92505050565b505050505050565b604080516001600160a01b0387811660208301528681168284015260608201869052600060808084018290528451808503909101815260a084019485905260fe5463040a7bb160e41b90955290938493919216906340a7bb1090610f30908c90309086908b908b9060a4016151f0565b6040805180830381865afa925050508015610f68575060408051601f3d908101601f19168201909252610f6591810190615244565b60015b610f79576000809250925050610f85565b9093509150610f859050565b965096945050505050565b610f986128a4565b60fe546040516307e0db1760e01b81526001600160a01b03909116906307e0db1790610fc8908490600401614dc5565b600060405180830381600087803b158015610fe257600080fd5b505af1158015610ff6573d6000803e3d6000fd5b5050505050565b6110056128a4565b61ffff90911660009081526101016020526040902055565b6110256128a4565b60fe546040516310ddb13760e01b81526001600160a01b03909116906310ddb13790610fc8908490600401614dc5565b61ffff1660009081526101d9602052604090205490565b611074612903565b6101c8805460ff1916911515919091179055565b6000858560405161109a929190615268565b604051908190038120631876eed960e01b825291506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631876eed9906110fe908e908e908e908e908e9089908d908d908d906004016152a1565b6020604051808303816000875af115801561111d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111419190615300565b61115e57604051631403112d60e21b815260040160405180910390fd5b5050505050505050505050565b60675460405163bf40fac160e01b815260206004820152600a60248201526921a7a72a2927a62622a960b11b60448201526001600160a01b039091169063bf40fac190606401602060405180830381865afa1580156111ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f2919061531d565b606580546001600160a01b0319166001600160a01b0392909216918217905560408051632d77bef360e11b81529051635aef7de6916004808201926020929091908290030181865afa15801561124c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611270919061531d565b606680546001600160a01b0319166001600160a01b0392909216919091179055565b6112b13385858585604051806020016040528060008152506000612960565b50505050565b6112bf612903565b80516101cc5560208101516101cd5560408101516101ce5560608101516101cf55608001516101d0805460ff1916911515919091179055565b6001600160a01b0380831660009081526101d360205260408082206067546101c8549251633de4799760e11b8152939460609473__$a63bfe16b493dd64599c9f3a1d32f7e383$__94637bc8f32e9461136c946101cc9491936101d193919092169160ff909116908c908c9060040161533a565b600060405180830381865af4158015611389573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113b191908101906153fa565b915091505b9250929050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156114065760405162461bcd60e51b8152600401610e3990615454565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611438612d47565b6001600160a01b03161461145e5760405162461bcd60e51b8152600401610e399061548e565b61146781612d63565b6040805160008082526020820190925261148391839190612d6b565b50565b61ffff8316600090815260ff6020526040812080548291906114a7906154c8565b80601f01602080910402602001604051908101604052809291908181526020018280546114d3906154c8565b80156115205780601f106114f557610100808354040283529160200191611520565b820191906000526020600020905b81548152906001019060200180831161150357829003601f168201915b505050505090508383604051611537929190615268565b60405180910390208180519060200120149150505b9392505050565b6112b13385858560006040518060200160405280600081525087612960565b61157a6128a4565b60fe546040516342d65a8d60e01b81526001600160a01b03909116906342d65a8d906115ae908690869086906004016154fd565b600060405180830381600087803b1580156115c857600080fd5b505af11580156115dc573d6000803e3d6000fd5b50505050505050565b600082826040516115f7929190615268565b604051908190038120635f6970c360e01b825291506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635f6970c390611655908b908b908b908b908b90899060040161551b565b6020604051808303816000875af1158015611674573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116989190615300565b6116b557604051631403112d60e21b815260040160405180910390fd5b6116c3878787878787612ed6565b5050505050505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156117165760405162461bcd60e51b8152600401610e3990615454565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611748612d47565b6001600160a01b03161461176e5760405162461bcd60e51b8152600401610e399061548e565b61177782612d63565b61178382826001612d6b565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146118225760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c6044820152771b1959081d1a1c9bdd59da0819195b1959d85d1958d85b1b60421b6064820152608401610e39565b50600080516020615b1383398151915290565b805160208201206000907f564ccaf7594d66b1eaaea24fe01f0585bf52ee70852af4eac0cc4b04711cd0e28114156118705750600192915050565b7f43ab905ae53adfdd46d0850022d385a6c09c15bfde5206c98fa0fc8dc340c3f88114156118a15750600592915050565b7f2ab2bf4c5cabc3000e2502e33470a863db2755809d7561237424a0eb373154c28114156118d3575061a4ec92915050565b50919050565b60009081526101d6602052604090205461ffff1690565b33301461194e5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b6064820152608401610e39565b610eb88686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f890181900481028201810190925287815289935091508790879081908401838280828437600092019190915250612f7892505050565b6119cc6128a4565b6119d66000612fb0565b565b60ff60205260009081526040902080546119f1906154c8565b80601f0160208091040260200160405190810160405280929190818152602001828054611a1d906154c8565b8015611a6a5780601f10611a3f57610100808354040283529160200191611a6a565b820191906000526020600020905b815481529060010190602001808311611a4d57829003601f168201915b505050505081565b611a7a612903565b80516101c95560208101516101ca55604001516101cb55565b611a9b612903565b6101c580546001600160a01b0319166001600160a01b0392909216919091179055565b60cc546001600160a01b031690565b60608160011415611afc575050604080518082019091526008815267457468657265756d60c01b602082015290565b8160051415611b2b57505060408051808201909152600a81526932ba3432b932bab6969960b11b602082015290565b8161a4ec1415611b5557505060408051808201909152600481526363656c6f60e01b602082015290565b8161aef31415611b7f57505060408051808201909152600481526363656c6f60e01b602082015290565b919050565b61ffff8116600090815260ff6020526040812080546060929190611ba7906154c8565b80601f0160208091040260200160405190810160405280929190818152602001828054611bd3906154c8565b8015611c205780601f10611bf557610100808354040283529160200191611c20565b820191906000526020600020905b815481529060010190602001808311611c0357829003601f168201915b50505050509050805160001415611c795760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f72640000006044820152606401610e39565b61154c600060148351611c8c9190615572565b839190613002565b611c9c6128a4565b818130604051602001611cb193929190615589565b60408051601f1981840301815291815261ffff8516600090815260ff60209081529190208251611ce693919290910190614567565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce838383604051611d1a939291906154fd565b60405180910390a1505050565b611d2f6128a4565b61010280546001600160a01b0319166001600160a01b0383161790556040517f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b90611d7b90839061477e565b60405180910390a150565b611d8e612903565b611d9983838361310f565b505050565b610ff633868686600187878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509250612960915050565b611deb612903565b60009081526101c660205260409020805460ff19166001179055565b611e0f612903565b60005b8251811015611d9957818181518110611e2d57611e2d6155aa565b60200260200101516101c76000858481518110611e4c57611e4c6155aa565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611e84906155c0565b915050611e12565b611e946128a4565b60fe546040516332fb62e760e21b81526001600160a01b039091169063cbed8b9c90611ecc90889088908890889088906004016155db565b600060405180830381600087803b158015611ee657600080fd5b505af1158015611efa573d6000803e3d6000fd5b505050505050505050565b61ffff8616600090815261013060205260408082209051611f299088908890615268565b90815260408051602092819003830190206001600160401b03871660009081529252902054905080611fa95760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b6064820152608401610e39565b808383604051611fba929190615268565b6040518091039020146120195760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b6064820152608401610e39565b61ffff871660009081526101306020526040808220905161203d9089908990615268565b90815260408051602092819003830181206001600160401b038916600090815290845282902093909355601f880182900482028301820190528682526120d5918991899089908190840183828082843760009201919091525050604080516020601f8a018190048102820181019092528881528a935091508890889081908401838280828437600092019190915250612f7892505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e5878787878560405161210c959493929190615614565b60405180910390a150505050505050565b600054600290610100900460ff1615801561213f575060005460ff8083169116105b61215b5760405162461bcd60e51b8152600401610e399061564f565b6000805461ffff191660ff83161761010017905561217c606560013061310f565b61218a607d61a4ec3061310f565b612197608a607a3061310f565b6121a561016d60323061310f565b6000805461ff001916905560405160ff82168152600080516020615b3383398151915290602001611d7b565b6121d9612903565b60009081526101d860205260409020805460ff19166001179055565b6121fd612903565b6101d480546001600160a01b0319166001600160a01b0392909216919091179055565b6122286128a4565b600081116122705760405162461bcd60e51b81526020600482015260156024820152744c7a4170703a20696e76616c6964206d696e47617360581b6044820152606401610e39565b61ffff8381166000818152610100602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac090606001611d1a565b60675460405163bf40fac160e01b815260206004820152600a60248201526923a7a7a22227a62620a960b11b60448201526000916001600160a01b03169063bf40fac190606401602060405180830381865afa158015612337573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235b919061531d565b905090565b612368612903565b6101d780546001600160a01b0319166001600160a01b0392909216919091179055565b6123936128a4565b61ffff8316600090815260ff602052604090206123b19083836145eb565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab838383604051611d1a939291906154fd565b6123ed6128a4565b6001600160a01b0381166124525760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e39565b61148381612fb0565b6124636131b8565b806124d8576040516370a0823160e01b81526001600160a01b038316906370a082319061249490309060040161477e565b602060405180830381865afa1580156124b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124d5919061569d565b90505b60405163a9059cbb60e01b81526001600160a01b0383169063a9059cbb9061250690339085906004016156b6565b6020604051808303816000875af1158015612525573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d999190615300565b60fe54604051633d7b2f6f60e21b815261ffff808716600483015285166024820152306044820152606481018390526060916001600160a01b03169063f5ecbdbc90608401600060405180830381865afa1580156125ab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526125d391908101906156cf565b95945050505050565b600054610100900460ff16158080156125fc5750600054600160ff909116105b8061261d575061260b3061327b565b15801561261d575060005460ff166001145b6126395760405162461bcd60e51b8152600401610e399061564f565b6000805460ff19166001179055801561265c576000805461ff0019166101001790555b6126658461328a565b61268e7f00000000000000000000000000000000000000000000000000000000000000006132ad565b6101c58054336001600160a01b031990911617905582516101cc556020808401516101cd556040808501516101ce5560608501516101cf5560808501516101d0805460ff191691151591909117905583516101c955838201516101ca55838101516101cb555163bf40fac160e01b815260048101919091526009602482015268554249534348454d4560b81b60448201526001600160a01b0385169063bf40fac190606401602060405180830381865afa158015612750573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612774919061531d565b6101d780546001600160a01b0319166001600160a01b039290921691821790556127bc576066546101d780546001600160a01b0319166001600160a01b039092169190911790555b6127c96065600130611d86565b6127d7607d61a4ec30611d86565b6127e4608a607a30611d86565b6127f261016d603230611d86565b80156112b1576000805461ff001916905560405160018152600080516020615b338339815191529060200160405180910390a150505050565b60008061288e5a60966366ad5c8a60e01b898989896040516024016128539493929190615717565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152309291906132e5565b9150915081610eb857610eb8868686868561336f565b336128ad611abe565b6001600160a01b0316146119d65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e39565b6101c5546001600160a01b031633148061292757506066546001600160a01b031633145b80612941575033612936611abe565b6001600160a01b0316145b6119d6573360405163b63b5ad960e01b8152600401610e39919061477e565b6101c85460ff161561299e5760405163c5426f8d60e01b815260206004820152600660248201526518db1bdcd95960d21b6044820152606401610e39565b6129a66122d3565b6001600160a01b03166379cc679088866040518363ffffffff1660e01b81526004016129d39291906156b6565b600060405180830381600087803b1580156129ed57600080fd5b505af1158015612a01573d6000803e3d6000fd5b50505050600073__$a63bfe16b493dd64599c9f3a1d32f7e383$__63aac673c386612a2a6122d3565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8b9190615755565b6040516001600160e01b031960e085901b168152600481019290925260ff166024820152604401602060405180830381865af4158015612acf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af3919061569d565b905034612b1357604051630ba4e53360e21b815260040160405180910390fd5b600030466101d58054906000612b28836155c0565b90915550604080516001600160a01b039094166020850152830191909152606082015260800160408051808303601f1901815282825280516020918201206001600160a01b03808e1692850192909252908b16918301919091526060820184905260808201819052915060009060a00160408051601f1981840301815291905290506000866001811115612bbe57612bbe615778565b1415612c1d576000612bcf89611acd565b9050805160001415612bf75760405163068a505360e01b8152600481018a9052602401610e39565b612c1782826001600160a01b03881615612c11578761340d565b3361340d565b50612ce9565b6001866001811115612c3157612c31615778565b1415612ce9578451612c6857604051600160f01b602082015262061a80602282015260420160405160208183030381529060405294505b6000612c73896118d9565b905061ffff8116612c9a5760405163068a505360e01b8152600481018a9052602401610e39565b6000612cab828d8d8860008c610ec0565b50905034811115612cd8576040516324a89fab60e21b815260048101829052346024820152604401610e39565b612ce683838e60008b61351f565b50505b81896001600160a01b03168b6001600160a01b03167fabeeb7182c7294cd8efcd40e9ff952c1b759c2165b3634aac589429de5d55ad08b87428c604051612d3394939291906157b0565b60405180910390a450505050505050505050565b600080516020615b13833981519152546001600160a01b031690565b6114836128a4565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615612d9e57611d998361352d565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612df8575060408051601f3d908101601f19168201909252612df59181019061569d565b60015b612e5b5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610e39565b600080516020615b138339815191528114612eca5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610e39565b50611d998383836135c7565b6000612f1785858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506135ec92505050565b90506000808080612f2a868801886157d2565b935093509350935061115e8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250899250889150879050868661376b565b60008060008084806020019051810190612f929190615818565b60148b015193975091955093509150611efa898289888888886137fc565b60cc80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60608161301081601f615860565b101561304f5760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610e39565b6130598284615860565b8451101561309d5760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610e39565b6060821580156130bc5760405191506000825260208201604052613106565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156130f55780518352602092830192016130dd565b5050858452601f01601f1916604052505b50949350505050565b61ffff831660009081526101d96020526040902054156131415760405162dc149f60e41b815260040160405180910390fd5b61ffff831660008181526101d9602090815260408083208690558583526101d6825291829020805461ffff191690931790925551613183918391309101615878565b60408051601f1981840301815291815261ffff8516600090815260ff602090815291902082516112b193919290910190614567565b60655460408051632d77bef360e11b8152905133926001600160a01b031691635aef7de69160048083019260209291908290030181865afa158015613201573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613225919061531d565b6001600160a01b0316146119d65760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206176617461722063616e2063616c6c2074686973206d6574686f646044820152606401610e39565b6001600160a01b03163b151590565b606780546001600160a01b0319166001600160a01b03831617905561148361116b565b600054610100900460ff166132d45760405162461bcd60e51b8152600401610e399061589a565b6132dc613819565b61148381613849565b6000606060008060008661ffff166001600160401b0381111561330a5761330a6147b5565b6040519080825280601f01601f191660200182016040528015613334576020820181803683370190505b50905060008087516020890160008d8df191503d925086831115613356578692505b828152826000602083013e909890975095505050505050565b818051906020012061013060008761ffff1661ffff168152602001908152602001600020856040516133a191906158e5565b9081526040805191829003602090810183206001600160401b0388166000908152915220919091557fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c906133fe9087908790879087908790615901565b60405180910390a15050505050565b600061341830613892565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630c93e3bb3430868589886040518763ffffffff1660e01b815260040161346f959493929190615953565b6000604051808303818588803b15801561348857600080fd5b505af115801561349c573d6000803e3d6000fd5b5050604051631c92115f60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169350631c92115f92506134f191508690859089906004016159b1565b600060405180830381600087803b15801561350b57600080fd5b505af11580156116c3573d6000803e3d6000fd5b610ff6848685858534613ad7565b6135368161327b565b6135985760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610e39565b600080516020615b1383398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6135d083613c61565b6000825111806135dd5750805b15611d99576112b18383613ca1565b6000808290506000808251602a14158061362c575082600081518110613614576136146155aa565b6020910101516001600160f81b031916600360fc1b14155b8061365d575082600181518110613645576136456155aa565b6020910101516001600160f81b031916600f60fb1b14155b1561367b57604051636fa478cf60e11b815260040160405180910390fd5b60025b602a81101561376157838181518110613699576136996155aa565b016020015160f81c9150606182108015906136b8575060668260ff1611155b156136cf576136c86057836159f4565b9150613738565b60418260ff16101580156136e7575060468260ff1611155b156136f7576136c86037836159f4565b60308260ff161015801561370f575060398260ff1611155b1561371f576136c86030836159f4565b604051636fa478cf60e11b815260040160405180910390fd5b6002613745826029615572565b60ff8416911b1b929092179161375a816155c0565b905061367e565b5090949350505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316600114156137df5760405163c5426f8d60e01b8152602060048201526016602482015275185e195b185c8819d85d195dd85e481b9bdd081cd95d60521b6044820152606401610e39565b60006137ea87611835565b90506115dc858585848a876000613d8a565b600061380788611055565b90506116c3858585848b876001613d8a565b600054610100900460ff166138405760405162461bcd60e51b8152600401610e399061589a565b6119d633612fb0565b600054610100900460ff166138705760405162461bcd60e51b8152600401610e399061589a565b60fe80546001600160a01b0319166001600160a01b0392909216919091179055565b604051606082811b6001600160601b03191660208301529060009060340160408051601f198184030181528282528051838301909252601083526f181899199a1a9b1b9c1cb0b131b232b360811b602084015280519093509091906000906138fb906002615a17565b613906906002615860565b6001600160401b0381111561391d5761391d6147b5565b6040519080825280601f01601f191660200182016040528015613947576020820181803683370190505b509050600360fc1b81600081518110613962576139626155aa565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110613991576139916155aa565b60200101906001600160f81b031916908160001a90535060005b83811015613acd578260048683815181106139c8576139c86155aa565b016020015182516001600160f81b031990911690911c60f81c9081106139f0576139f06155aa565b01602001516001600160f81b03191682613a0b836002615a17565b613a16906002615860565b81518110613a2657613a266155aa565b60200101906001600160f81b031916908160001a90535082858281518110613a5057613a506155aa565b602091010151815160f89190911c600f16908110613a7057613a706155aa565b01602001516001600160f81b03191682613a8b836002615a17565b613a96906003615860565b81518110613aa657613aa66155aa565b60200101906001600160f81b031916908160001a905350613ac6816155c0565b90506139ab565b5095945050505050565b61ffff8616600090815260ff602052604081208054613af5906154c8565b80601f0160208091040260200160405190810160405280929190818152602001828054613b21906154c8565b8015613b6e5780601f10613b4357610100808354040283529160200191613b6e565b820191906000526020600020905b815481529060010190602001808311613b5157829003601f168201915b50505050509050805160001415613be05760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b6064820152608401610e39565b613beb878751614273565b60fe5460405162c5803160e81b81526001600160a01b039091169063c5803100908490613c26908b9086908c908c908c908c90600401615a36565b6000604051808303818588803b158015613c3f57600080fd5b505af1158015613c53573d6000803e3d6000fd5b505050505050505050505050565b613c6a8161352d565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060613cac8361327b565b613d075760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610e39565b600080846001600160a01b031684604051613d2291906158e5565b600060405180830381855af49150503d8060008114613d5d576040519150601f19603f3d011682016040523d82523d6000602084013e613d62565b606091505b50915091506125d38282604051806060016040528060278152602001615b53602791396142e2565b613d93846118d9565b61ffff16613db75760405163068a505360e01b815260048101859052602401610e39565b6101c760008583604051602001613dcf929190615a9d565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff1615613e385760405163c5426f8d60e01b815260206004820152600f60248201526e1cdbdd5c98d948191a5cd8589b1959608a1b6044820152606401610e39565b60008281526101c6602052604090205460ff1615613e6c57604051636e91c2f160e11b815260048101839052602401610e39565b600060ff6000613e7b876118d9565b61ffff1661ffff1681526020019081526020016000208054613e9c906154c8565b80601f0160208091040260200160405190810160405280929190818152602001828054613ec8906154c8565b8015613f155780601f10613eea57610100808354040283529160200191613f15565b820191906000526020600020905b815481529060010190602001808311613ef857829003601f168201915b5050505050905060008430604051602001613f31929190615878565b604051602081830303815290604052905081518151141580613f5257508151155b80613f6b57508180519060200120818051906020012014155b15613fb857604080518781526001600160a01b03871660208201527f1eafb58197ea0dc76b9278ccad47f61a239f00b017d89a19081a89321cce213d910160405180910390a150506115dc565b60008481526101d8602052604090205460ff16613fdb57613fdb898989466142fb565b600073__$a63bfe16b493dd64599c9f3a1d32f7e383$__63e62381b6896140006122d3565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561403d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140619190615755565b6040516001600160e01b031960e085901b168152600481019290925260ff166024820152604401602060405180830381865af41580156140a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140c9919061569d565b905060006140d682614428565b60008781526101c660205260409020805460ff1916600117905590506140fb8a61444d565b6065546001600160a01b0316636407e4326141168385615572565b6066546040516001600160e01b031960e085901b16815261414892918f916001600160a01b0390911690600401615ab1565b6020604051808303816000875af1158015614167573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061418b9190615300565b508015614214576065546101d754606654604051633203f21960e11b81526001600160a01b0393841693636407e432936141cf938793918316921690600401615ab1565b6020604051808303816000875af11580156141ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142129190615300565b505b858a6001600160a01b03168c6001600160a01b03167f6cf712ce908185c8c38a073b7315f79687e7440fb057d9d1ca76a2509a1282ee8c858d8b60405161425e94939291906157b0565b60405180910390a45050505050505050505050565b61ffff8216600090815261010160205260409020548061429257506127105b80821115611d995760405162461bcd60e51b815260206004820181905260248201527f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c617267656044820152606401610e39565b606083156142f157508161154c565b61154c838361453d565b6001600160a01b038316158061430f575080155b156143315782816040516314b2a5c360e31b8152600401610e399291906156b6565b61433e6201518042615572565b6101d154101561435457426101d15560006101d2555b6143616201518042615572565b6001600160a01b03851660009081526101d3602052604090205410156143a2576001600160a01b03841660009081526101d360205260408120428155600101555b6000806143af86856112f8565b9092509050816143d4578060405163c5426f8d60e01b8152600401610e399190614e31565b836101d160010160008282546143ea9190615860565b90915550506001600160a01b03861660009081526101d360205260408120600101805486929061441b908490615860565b9091555050505050505050565b6101cb546000906127109061443d9084615a17565b6144479190615ad0565b92915050565b6101d4546001600160a01b0316158015906144d557506101d4546040516374bf77e960e11b81526001600160a01b039091169063e97eefd29061449490849060040161477e565b602060405180830381865afa1580156144b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144d59190615300565b15611483576101d4546040516306ee3b9f60e31b81526001600160a01b0390911690633771dcf89061450b90849060040161477e565b600060405180830381600087803b15801561452557600080fd5b505af1925050508015614536575060015b6114835750565b81511561454d5781518083602001fd5b8060405162461bcd60e51b8152600401610e399190614e31565b828054614573906154c8565b90600052602060002090601f01602090048101928261459557600085556145db565b82601f106145ae57805160ff19168380011785556145db565b828001600101855582156145db579182015b828111156145db5782518255916020019190600101906145c0565b506145e792915061465f565b5090565b8280546145f7906154c8565b90600052602060002090601f01602090048101928261461957600085556145db565b82601f106146325782800160ff198235161785556145db565b828001600101855582156145db579182015b828111156145db578235825591602001919060010190614644565b5b808211156145e75760008155600101614660565b803561ffff81168114611b7f57600080fd5b60008083601f84011261469857600080fd5b5081356001600160401b038111156146af57600080fd5b6020830191508360208285010111156113b657600080fd5b80356001600160401b0381168114611b7f57600080fd5b600080600080600080608087890312156146f757600080fd5b61470087614674565b955060208701356001600160401b038082111561471c57600080fd5b6147288a838b01614686565b909750955085915061473c60408a016146c7565b9450606089013591508082111561475257600080fd5b5061475f89828a01614686565b979a9699509497509295939492505050565b6001600160a01b03169052565b6001600160a01b0391909116815260200190565b6001600160a01b038116811461148357600080fd5b801515811461148357600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156147f3576147f36147b5565b604052919050565b60006001600160401b03821115614814576148146147b5565b50601f01601f191660200190565b6000614835614830846147fb565b6147cb565b905082815283838301111561484957600080fd5b828260208301376000602084830101529392505050565b600082601f83011261487157600080fd5b61154c83833560208501614822565b60008060008060008060c0878903121561489957600080fd5b6148a287614674565b955060208701356148b281614792565b945060408701356148c281614792565b93506060870135925060808701356148d9816147a7565b915060a08701356001600160401b038111156148f457600080fd5b61490089828a01614860565b9150509295509295509295565b60006020828403121561491f57600080fd5b61154c82614674565b60006020828403121561493a57600080fd5b5035919050565b6000806040838503121561495457600080fd5b61495d83614674565b946020939093013593505050565b60006020828403121561497d57600080fd5b813561154c816147a7565b60008060008060008060008060008060c08b8d0312156149a757600080fd5b8a35995060208b01356001600160401b03808211156149c557600080fd5b6149d18e838f01614686565b909b50995060408d01359150808211156149ea57600080fd5b6149f68e838f01614686565b909950975060608d0135915080821115614a0f57600080fd5b614a1b8e838f01614686565b909750955060808d0135915080821115614a3457600080fd5b50614a418d828e01614686565b9150809450508092505060a08b013590509295989b9194979a5092959850565b60008060008060808587031215614a7757600080fd5b8435614a8281614792565b93506020850135925060408501359150606085013560028110614aa457600080fd5b939692955090935050565b600060a08284031215614ac157600080fd5b60405160a081016001600160401b0381118282101715614ae357614ae36147b5565b8060405250809150823581526020830135602082015260408301356040820152606083013560608201526080830135614b1b816147a7565b6080919091015292915050565b600060a08284031215614b3a57600080fd5b61154c8383614aaf565b60008060408385031215614b5757600080fd5b823561495d81614792565b60005b83811015614b7d578181015183820152602001614b65565b838111156112b15750506000910152565b60008151808452614ba6816020860160208601614b62565b601f01601f19169290920160200192915050565b8215158152604060208201526000614bd56040830184614b8e565b949350505050565b600060208284031215614bef57600080fd5b813561154c81614792565b600080600060408486031215614c0f57600080fd5b614c1884614674565b925060208401356001600160401b03811115614c3357600080fd5b614c3f86828701614686565b9497909650939450505050565b60008060008060808587031215614c6257600080fd5b8435614c6d81614792565b935060208501359250604085013591506060850135614aa481614792565b60008060008060008060006080888a031215614ca657600080fd5b8735965060208801356001600160401b0380821115614cc457600080fd5b614cd08b838c01614686565b909850965060408a0135915080821115614ce957600080fd5b614cf58b838c01614686565b909650945060608a0135915080821115614d0e57600080fd5b50614d1b8a828b01614686565b989b979a50959850939692959293505050565b60008060408385031215614d4157600080fd5b8235614d4c81614792565b915060208301356001600160401b03811115614d6757600080fd5b614d7385828601614860565b9150509250929050565b600060208284031215614d8f57600080fd5b81356001600160401b03811115614da557600080fd5b8201601f81018413614db657600080fd5b614bd584823560208401614822565b61ffff91909116815260200190565b600080600060608486031215614de957600080fd5b614df284614674565b925060208401356001600160401b03811115614e0d57600080fd5b614e1986828701614860565b925050614e28604085016146c7565b90509250925092565b60208152600061154c6020830184614b8e565b600060608284031215614e5657600080fd5b604051606081016001600160401b0381118282101715614e7857614e786147b5565b80604052508091508235815260208301356020820152604083013560408201525092915050565b600060608284031215614eb157600080fd5b61154c8383614e44565b60008060408385031215614ece57600080fd5b614ed783614674565b9150614ee560208401614674565b90509250929050565b600080600060608486031215614f0357600080fd5b614f0c84614674565b9250602084013591506040840135614f2381614792565b809150509250925092565b600080600080600060808688031215614f4657600080fd5b8535614f5181614792565b9450602086013593506040860135925060608601356001600160401b03811115614f7a57600080fd5b614f8688828901614686565b969995985093965092949392505050565b60006001600160401b03821115614fb057614fb06147b5565b5060051b60200190565b600082601f830112614fcb57600080fd5b81356020614fdb61483083614f97565b82815260059290921b84018101918181019086841115614ffa57600080fd5b8286015b8481101561501e578035615011816147a7565b8352918301918301614ffe565b509695505050505050565b6000806040838503121561503c57600080fd5b82356001600160401b038082111561505357600080fd5b818501915085601f83011261506757600080fd5b8135602061507761483083614f97565b82815260059290921b8401810191818101908984111561509657600080fd5b948201945b838610156150b45785358252948201949082019061509b565b965050860135925050808211156150ca57600080fd5b50614d7385828601614fba565b6000806000806000608086880312156150ef57600080fd5b6150f886614674565b945061510660208701614674565b93506040860135925060608601356001600160401b03811115614f7a57600080fd5b60008060006060848603121561513d57600080fd5b61514684614674565b925061515460208501614674565b9150604084013590509250925092565b6000806000806080858703121561517a57600080fd5b61518385614674565b935061519160208601614674565b925060408501356151a181614792565b9396929550929360600135925050565b600080600061012084860312156151c757600080fd5b83356151d281614792565b92506151e18560208601614aaf565b9150614e288560c08601614e44565b61ffff861681526001600160a01b038516602082015260a06040820181905260009061521e90830186614b8e565b841515606084015282810360808401526152388185614b8e565b98975050505050505050565b6000806040838503121561525757600080fd5b505080516020909101519092909150565b8183823760009101908152919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b89815260c0602082015260006152bb60c083018a8c615278565b82810360408401526152ce81898b615278565b905086606084015282810360808401526152e9818688615278565b9150508260a08301529a9950505050505050505050565b60006020828403121561531257600080fd5b815161154c816147a7565b60006020828403121561532f57600080fd5b815161154c81614792565b8754815260018089015460208301526002890154604083015260038901546060830152600489015460ff1615156080830152875460a083015287015460c08201526101a08101865460e083015260018701546101008301526153a0610120830187614771565b8415156101408301526153b7610160830185614771565b8261018083015298975050505050505050565b60006153d8614830846147fb565b90508281528383830111156153ec57600080fd5b61154c836020830184614b62565b6000806040838503121561540d57600080fd5b8251615418816147a7565b60208401519092506001600160401b0381111561543457600080fd5b8301601f8101851361544557600080fd5b614d73858251602084016153ca565b6020808252602c90820152600080516020615af383398151915260408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c90820152600080516020615af383398151915260408201526b6163746976652070726f787960a01b606082015260800190565b600181811c908216806154dc57607f821691505b602082108114156118d357634e487b7160e01b600052602260045260246000fd5b61ffff841681526040602082015260006125d3604083018486615278565b868152608060208201526000615535608083018789615278565b8281036040840152615548818688615278565b915050826060830152979650505050505050565b634e487b7160e01b600052601160045260246000fd5b6000828210156155845761558461555c565b500390565b8284823760609190911b6001600160601b0319169101908152601401919050565b634e487b7160e01b600052603260045260246000fd5b60006000198214156155d4576155d461555c565b5060010190565b600061ffff808816835280871660208401525084604083015260806060830152615609608083018486615278565b979650505050505050565b61ffff86168152608060208201526000615632608083018688615278565b6001600160401b0394909416604083015250606001529392505050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156156af57600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b6000602082840312156156e157600080fd5b81516001600160401b038111156156f757600080fd5b8201601f8101841361570857600080fd5b614bd5848251602084016153ca565b61ffff851681526080602082015260006157346080830186614b8e565b6001600160401b038516604084015282810360608401526156098185614b8e565b60006020828403121561576757600080fd5b815160ff8116811461154c57600080fd5b634e487b7160e01b600052602160045260246000fd5b600281106157ac57634e487b7160e01b600052602160045260246000fd5b9052565b8481526020810184905260408101839052608081016125d3606083018461578e565b600080600080608085870312156157e857600080fd5b84356157f381614792565b9350602085013561580381614792565b93969395505050506040820135916060013590565b6000806000806080858703121561582e57600080fd5b845161583981614792565b602086015190945061584a81614792565b6040860151606090960151949790965092505050565b600082198211156158735761587361555c565b500190565b6001600160601b0319606093841b811682529190921b16601482015260280190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600082516158f7818460208701614b62565b9190910192915050565b61ffff8616815260a06020820152600061591e60a0830187614b8e565b6001600160401b0386166040840152828103606084015261593f8186614b8e565b905082810360808401526152388185614b8e565b600060018060a01b03808816835260a0602084015261597560a0840188614b8e565b83810360408501526159878188614b8e565b9050838103606085015261599b8187614b8e565b9250508084166080840152509695505050505050565b6060815260006159c46060830186614b8e565b82810360208401526159d68186614b8e565b905082810360408401526159ea8185614b8e565b9695505050505050565b600060ff821660ff841680821015615a0e57615a0e61555c565b90039392505050565b6000816000190483118215151615615a3157615a3161555c565b500290565b61ffff8716815260c060208201526000615a5360c0830188614b8e565b8281036040840152615a658188614b8e565b6001600160a01b0387811660608601528616608085015283810360a08501529050615a908185614b8e565b9998505050505050505050565b8281526040810161154c602083018461578e565b9283526001600160a01b03918216602084015216604082015260600190565b600082615aed57634e487b7160e01b600052601260045260246000fd5b50049056fe46756e6374696f6e206d7573742062652063616c6c6564207468726f75676820360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220074469714023f1f6a6733f055ecc495de1be7fc1b548740e175f36f3a0764c4864736f6c634300080a0033",
  "libraries": {
    "BridgeHelperLibrary": "0xdEE49F247c8B567273437F41CC326A2fA1e9cC3D"
  },
  "devdoc": {
    "details": "A contract for bridging assets between chains",
    "kind": "dev",
    "methods": {
      "addLzChainSupport(uint16,uint256,address)": {
        "details": "function for adding lz chaind support"
      },
      "approveRequest(uint256)": {
        "details": "Function for approving requests above limits",
        "params": {
          "id": "The bridgerequest id"
        }
      },
      "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"
        }
      },
      "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"
        }
      },
      "preventRequest(uint256)": {
        "details": "Function for prevent a request by marking it as executed",
        "params": {
          "id": "The bridgerequest id"
        }
      },
      "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"
        }
      },
      "setFeeRecipient(address)": {
        "details": "Function for setting the fee recipient",
        "params": {
          "recipient": "The fee recipient 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": 5096,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "_initialized",
        "offset": 0,
        "slot": "0",
        "type": "t_uint8"
      },
      {
        "astId": 5099,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "_initializing",
        "offset": 1,
        "slot": "0",
        "type": "t_bool"
      },
      {
        "astId": 5078,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "__gap",
        "offset": 0,
        "slot": "1",
        "type": "t_array(t_uint256)50_storage"
      },
      {
        "astId": 5393,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "__gap",
        "offset": 0,
        "slot": "51",
        "type": "t_array(t_uint256)50_storage"
      },
      {
        "astId": 2571,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "dao",
        "offset": 0,
        "slot": "101",
        "type": "t_contract(Controller)1248"
      },
      {
        "astId": 2573,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "avatar",
        "offset": 0,
        "slot": "102",
        "type": "t_address"
      },
      {
        "astId": 2576,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "nameService",
        "offset": 0,
        "slot": "103",
        "type": "t_contract(INameService)2296"
      },
      {
        "astId": 2644,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "gap",
        "offset": 0,
        "slot": "104",
        "type": "t_array(t_uint256)50_storage"
      },
      {
        "astId": 5719,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "__gap",
        "offset": 0,
        "slot": "154",
        "type": "t_array(t_uint256)50_storage"
      },
      {
        "astId": 4579,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "_owner",
        "offset": 0,
        "slot": "204",
        "type": "t_address"
      },
      {
        "astId": 4699,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "__gap",
        "offset": 0,
        "slot": "205",
        "type": "t_array(t_uint256)49_storage"
      },
      {
        "astId": 2918,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "lzEndpoint",
        "offset": 0,
        "slot": "254",
        "type": "t_contract(ILayerZeroEndpointUpgradeable)2849"
      },
      {
        "astId": 2922,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "trustedRemoteLookup",
        "offset": 0,
        "slot": "255",
        "type": "t_mapping(t_uint16,t_bytes_storage)"
      },
      {
        "astId": 2928,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "minDstGasLookup",
        "offset": 0,
        "slot": "256",
        "type": "t_mapping(t_uint16,t_mapping(t_uint16,t_uint256))"
      },
      {
        "astId": 2932,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "payloadSizeLimitLookup",
        "offset": 0,
        "slot": "257",
        "type": "t_mapping(t_uint16,t_uint256)"
      },
      {
        "astId": 2934,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "precrime",
        "offset": 0,
        "slot": "258",
        "type": "t_address"
      },
      {
        "astId": 3466,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "__gap",
        "offset": 0,
        "slot": "259",
        "type": "t_array(t_uint256)45_storage"
      },
      {
        "astId": 3509,
        "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": 3728,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "__gap",
        "offset": 0,
        "slot": "305",
        "type": "t_array(t_uint256)49_storage"
      },
      {
        "astId": 12613,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "__gap",
        "offset": 0,
        "slot": "354",
        "type": "t_array(t_uint256)49_storage"
      },
      {
        "astId": 11773,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "_gap",
        "offset": 0,
        "slot": "403",
        "type": "t_array(t_uint256)50_storage"
      },
      {
        "astId": 12750,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "guardian",
        "offset": 0,
        "slot": "453",
        "type": "t_address"
      },
      {
        "astId": 12754,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "executedRequests",
        "offset": 0,
        "slot": "454",
        "type": "t_mapping(t_uint256,t_bool)"
      },
      {
        "astId": 12758,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "disabledSourceBridges",
        "offset": 0,
        "slot": "455",
        "type": "t_mapping(t_bytes32,t_bool)"
      },
      {
        "astId": 12760,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "isClosed",
        "offset": 0,
        "slot": "456",
        "type": "t_bool"
      },
      {
        "astId": 12763,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "bridgeFees",
        "offset": 0,
        "slot": "457",
        "type": "t_struct(BridgeFees)12223_storage"
      },
      {
        "astId": 12766,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "bridgeLimits",
        "offset": 0,
        "slot": "460",
        "type": "t_struct(BridgeLimits)12234_storage"
      },
      {
        "astId": 12769,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "bridgeDailyLimit",
        "offset": 0,
        "slot": "465",
        "type": "t_struct(BridgeDailyLimit)12216_storage"
      },
      {
        "astId": 12774,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "accountsDailyLimit",
        "offset": 0,
        "slot": "467",
        "type": "t_mapping(t_address,t_struct(AccountLimit)12211_storage)"
      },
      {
        "astId": 12777,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "faucet",
        "offset": 0,
        "slot": "468",
        "type": "t_contract(IFaucet)12649"
      },
      {
        "astId": 12779,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "currentId",
        "offset": 0,
        "slot": "469",
        "type": "t_uint256"
      },
      {
        "astId": 12783,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "lzChainIdsMapping",
        "offset": 0,
        "slot": "470",
        "type": "t_mapping(t_uint256,t_uint16)"
      },
      {
        "astId": 12785,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "feeRecipient",
        "offset": 0,
        "slot": "471",
        "type": "t_address"
      },
      {
        "astId": 12789,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "approvedRequests",
        "offset": 0,
        "slot": "472",
        "type": "t_mapping(t_uint256,t_bool)"
      },
      {
        "astId": 12793,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "lzChainToIdsMapping",
        "offset": 0,
        "slot": "473",
        "type": "t_mapping(t_uint16,t_uint256)"
      }
    ],
    "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)12649": {
        "encoding": "inplace",
        "label": "contract IFaucet",
        "numberOfBytes": "20"
      },
      "t_contract(ILayerZeroEndpointUpgradeable)2849": {
        "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)12211_storage)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => struct IMessagePassingBridge.AccountLimit)",
        "numberOfBytes": "32",
        "value": "t_struct(AccountLimit)12211_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)12211_storage": {
        "encoding": "inplace",
        "label": "struct IMessagePassingBridge.AccountLimit",
        "members": [
          {
            "astId": 12208,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "lastTransferReset",
            "offset": 0,
            "slot": "0",
            "type": "t_uint256"
          },
          {
            "astId": 12210,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "bridged24Hours",
            "offset": 0,
            "slot": "1",
            "type": "t_uint256"
          }
        ],
        "numberOfBytes": "64"
      },
      "t_struct(BridgeDailyLimit)12216_storage": {
        "encoding": "inplace",
        "label": "struct IMessagePassingBridge.BridgeDailyLimit",
        "members": [
          {
            "astId": 12213,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "lastTransferReset",
            "offset": 0,
            "slot": "0",
            "type": "t_uint256"
          },
          {
            "astId": 12215,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "bridged24Hours",
            "offset": 0,
            "slot": "1",
            "type": "t_uint256"
          }
        ],
        "numberOfBytes": "64"
      },
      "t_struct(BridgeFees)12223_storage": {
        "encoding": "inplace",
        "label": "struct IMessagePassingBridge.BridgeFees",
        "members": [
          {
            "astId": 12218,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "minFee",
            "offset": 0,
            "slot": "0",
            "type": "t_uint256"
          },
          {
            "astId": 12220,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "maxFee",
            "offset": 0,
            "slot": "1",
            "type": "t_uint256"
          },
          {
            "astId": 12222,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "fee",
            "offset": 0,
            "slot": "2",
            "type": "t_uint256"
          }
        ],
        "numberOfBytes": "96"
      },
      "t_struct(BridgeLimits)12234_storage": {
        "encoding": "inplace",
        "label": "struct IMessagePassingBridge.BridgeLimits",
        "members": [
          {
            "astId": 12225,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "dailyLimit",
            "offset": 0,
            "slot": "0",
            "type": "t_uint256"
          },
          {
            "astId": 12227,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "txLimit",
            "offset": 0,
            "slot": "1",
            "type": "t_uint256"
          },
          {
            "astId": 12229,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "accountDailyLimit",
            "offset": 0,
            "slot": "2",
            "type": "t_uint256"
          },
          {
            "astId": 12231,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "minAmount",
            "offset": 0,
            "slot": "3",
            "type": "t_uint256"
          },
          {
            "astId": 12233,
            "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"
      }
    }
  }
}