{
  "_format": "hh-sol-artifact-1",
  "contractName": "SwapsExternal",
  "sourceName": "contracts/modules/SwapsExternal.sol",
  "abi": [
    {
      "inputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "loanId",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "feeRebatePercent",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "basisPoint",
          "type": "uint256"
        }
      ],
      "name": "EarnReward",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "loanId",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "feeRebatePercent",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "basisPoint",
          "type": "uint256"
        }
      ],
      "name": "EarnRewardFail",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sourceToken",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "destToken",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "sourceAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "destAmount",
          "type": "uint256"
        }
      ],
      "name": "ExternalSwap",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "loanId",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sourceToken",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "destToken",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "borrower",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "sourceAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "destAmount",
          "type": "uint256"
        }
      ],
      "name": "LoanSwap",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "payer",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "loanId",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "PayBorrowingFee",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "payer",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "PayLendingFee",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "payer",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "loanId",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "PayTradingFee",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "prevModuleContractAddress",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newModuleContractAddress",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "module",
          "type": "bytes32"
        }
      ],
      "name": "ProtocolModuleContractReplaced",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "asset",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "VaultDeposit",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "asset",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "VaultWithdraw",
      "type": "event"
    },
    {
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "fallback"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "admin",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "affiliateFeePercent",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "affiliateRewardsHeld",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "affiliateTradingTokenFeePercent",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "affiliatesReferrerBalances",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "affiliatesUserReferrer",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "borrowerNonce",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "borrowerOrders",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "lockedAmount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "interestRate",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "minLoanTerm",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "maxLoanTerm",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "createdTimestamp",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "expirationTimestamp",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "borrowingFeePercent",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "borrowingFeeTokensHeld",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "borrowingFeeTokensPaid",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "sourceToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "destToken",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "sourceTokenAmount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "minReturn",
          "type": "uint256"
        }
      ],
      "name": "checkPriceDivergence",
      "outputs": [],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "delegatedManagers",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "feeRebatePercent",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "feesController",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "sourceToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "destToken",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "sourceTokenAmount",
          "type": "uint256"
        }
      ],
      "name": "getSwapExpectedReturn",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "isOwner",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "lenderInterest",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "principalTotal",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "owedPerDay",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "owedTotal",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "paidTotal",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "updatedTimestamp",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "lenderOrders",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "lockedAmount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "interestRate",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "minLoanTerm",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "maxLoanTerm",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "createdTimestamp",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "expirationTimestamp",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "lendingFeePercent",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "lendingFeeTokensHeld",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "lendingFeeTokensPaid",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "liquidationIncentivePercent",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "loanInterest",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "owedPerDay",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "depositTotal",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "updatedTimestamp",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "loanParams",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "id",
          "type": "bytes32"
        },
        {
          "internalType": "bool",
          "name": "active",
          "type": "bool"
        },
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "loanToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "collateralToken",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "minInitialMargin",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "maintenanceMargin",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "maxLoanTerm",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "loanPoolToUnderlying",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "loans",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "id",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "loanParamsId",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "pendingTradesId",
          "type": "bytes32"
        },
        {
          "internalType": "bool",
          "name": "active",
          "type": "bool"
        },
        {
          "internalType": "uint256",
          "name": "principal",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "collateral",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "startTimestamp",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "endTimestamp",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "startMargin",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "startRate",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "borrower",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "lender",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "lockedSOVAddress",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "",
          "type": "bytes4"
        }
      ],
      "name": "logicTargets",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "maxDisagreement",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "maxSwapSize",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "minReferralsToPayout",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "pause",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "priceFeeds",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "protocolAddress",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "protocolTokenAddress",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "protocolTokenHeld",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "protocolTokenPaid",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "rolloverBaseReward",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "rolloverFlexFeePercent",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "sourceBuffer",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "sovTokenAddress",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "sovrynSwapContractRegistryAddress",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "specialRebates",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "supportedTokens",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "sourceToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "destToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "returnToSender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "sourceTokenAmount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "requiredDestTokenAmount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "minReturn",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "swapData",
          "type": "bytes"
        }
      ],
      "name": "swapExternal",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "destTokenAmountReceived",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "sourceTokenAmountUsed",
          "type": "uint256"
        }
      ],
      "payable": true,
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "swapsImpl",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "tradingFeePercent",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "tradingFeeTokensHeld",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "tradingFeeTokensPaid",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "underlyingToLoanPool",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "userNotFirstTradeFlag",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "wrbtcToken",
      "outputs": [
        {
          "internalType": "contract IWrbtcERC20",
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x60806040526001600055678ac7230489e80000601555670214e8348c4f000060185567013fbe85edc90000601b55674563918244f40000602055674563918244f40000602155674563918244f400006027556127106028556802b5e3af16b1880000602955650f478e084000602b5567016345785d8a0000602c556802b5e3af16b1880000602f5560036035556801158e460913d000006039553480156100a557600080fd5b5060006100b96001600160e01b0361010c16565b600180546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350610110565b3390565b61303180620001206000396000f3fe60806040526004361061036b5760003560e01c80638f32d59b116101c6578063cb6eacd1116100f7578063edab119f11610095578063f589a3e71161006f578063f589a3e7146109af578063f6ddc8b3146109c4578063f706b1f2146109d9578063f851a440146109ee5761036b565b8063edab119f14610965578063f0e085f51461097a578063f2fde38b1461098f5761036b565b8063d473c2da116100d1578063d473c2da146108fa578063d485045e1461090f578063e321b5401461092f578063e8f62764146109505761036b565b8063cb6eacd114610891578063cd5d808d146108c5578063d288208c146108e55761036b565b8063b30643d911610164578063ba4861e91161013e578063ba4861e914610804578063bdee453c14610819578063c4a9081514610839578063c4d66de8146108715761036b565b8063b30643d9146107af578063b7e15241146107cf578063b9cffa3e146107ef5761036b565b8063acc04348116101a0578063acc0434814610741578063ae0a853014610756578063afe840091461076b578063b17da56e1461078d5761036b565b80638f32d59b146106f757806392d894f81461070c578063959083d31461072c5761036b565b80634f28cac2116102a05780637420ca3e1161023e5780637a8faeb8116102185780637a8faeb8146106985780638456cb59146106ad5780638da5cb5b146106c25780638dc48ba5146106d75761036b565b80637420ca3e14610659578063742e67981461066e57806378d849ed146106835761036b565b806362fff3f61161027a57806362fff3f6146105c857806368c4ac26146105f957806369455ddc146106195780636e663730146106395761036b565b80634f28cac21461056f578063569fc1fb14610584578063574442cc146105b35761036b565b80632f4707641161030d5780633fca506e116102e75780633fca506e146104fa5780634115a2b61461051a5780634203e3951461053a5780634699f8461461055a5761036b565b80632f470764146104a55780633432423c146104ba5780633452d2d4146104da5761036b565b80631b7bde74116103495780631b7bde7414610416578063218b39c61461044357806324cc5749146104635780632a324027146104905761036b565b8063065d810f146103995780630676c1b7146103d457806317548b79146103f6575b34801561037757600080fd5b5060405162461bcd60e51b815260040161039090612d95565b60405180910390fd5b3480156103a557600080fd5b506103b96103b4366004612428565b610a03565b6040516103cb96959493929190612e8b565b60405180910390f35b3480156103e057600080fd5b506103e9610a43565b6040516103cb9190612a27565b34801561040257600080fd5b506103e96104113660046124b3565b610a52565b34801561042257600080fd5b50610436610431366004612278565b610a6d565b6040516103cb9190612e15565b34801561044f57600080fd5b506103e961045e36600461225a565b610a8a565b34801561046f57600080fd5b5061048361047e36600461225a565b610aa5565b6040516103cb9190612b6e565b34801561049c57600080fd5b50610436610aba565b3480156104b157600080fd5b50610436610ac0565b3480156104c657600080fd5b506103b96104d5366004612428565b610ac6565b3480156104e657600080fd5b506104366104f536600461225a565b610b06565b34801561050657600080fd5b5061043661051536600461225a565b610b18565b34801561052657600080fd5b50610483610535366004612494565b610b2a565b34801561054657600080fd5b5061043661055536600461225a565b610b4a565b34801561056657600080fd5b50610436610b5c565b34801561057b57600080fd5b50610436610b62565b34801561059057600080fd5b506105a461059f366004612476565b610b68565b6040516103cb93929190612e31565b3480156105bf57600080fd5b50610436610b89565b3480156105d457600080fd5b506105e86105e3366004612278565b610b8f565b6040516103cb959493929190612e3f565b34801561060557600080fd5b5061048361061436600461225a565b610bc9565b34801561062557600080fd5b5061043661063436600461237a565b610bde565b34801561064557600080fd5b506103e961065436600461225a565b610bf5565b34801561066557600080fd5b506103e9610c10565b34801561067a57600080fd5b50610436610c1f565b34801561068f57600080fd5b506103e9610c25565b3480156106a457600080fd5b50610436610c34565b3480156106b957600080fd5b50610483610c3a565b3480156106ce57600080fd5b506103e9610c43565b3480156106e357600080fd5b506103e96106f236600461225a565b610c52565b34801561070357600080fd5b50610483610c6d565b34801561071857600080fd5b5061043661072736600461225a565b610c93565b34801561073857600080fd5b50610436610ca5565b34801561074d57600080fd5b50610436610cab565b34801561076257600080fd5b50610436610cb1565b34801561077757600080fd5b50610780610cb7565b6040516103cb9190612ca6565b34801561079957600080fd5b506107ad6107a83660046123c7565b610cc6565b005b3480156107bb57600080fd5b506104366107ca36600461225a565b610cfc565b3480156107db57600080fd5b506104366107ea36600461225a565b610d0e565b3480156107fb57600080fd5b506103e9610d20565b34801561081057600080fd5b506103e9610d2f565b34801561082557600080fd5b5061043661083436600461225a565b610d3e565b34801561084557600080fd5b50610859610854366004612476565b610d50565b6040516103cb9c9b9a99989796959493929190612bf3565b34801561087d57600080fd5b506107ad61088c36600461225a565b610dc2565b34801561089d57600080fd5b506108b16108ac366004612476565b610ea5565b6040516103cb989796959493929190612b7c565b3480156108d157600080fd5b506104366108e0366004612278565b610ef7565b3480156108f157600080fd5b506103e9610f14565b34801561090657600080fd5b50610436610f23565b34801561091b57600080fd5b5061043661092a36600461225a565b610f29565b61094261093d3660046122b2565b610f3b565b6040516103cb929190612e23565b34801561095c57600080fd5b506103e9611291565b34801561097157600080fd5b506104366112a0565b34801561098657600080fd5b506104366112a6565b34801561099b57600080fd5b506107ad6109aa36600461225a565b6112ac565b3480156109bb57600080fd5b506104366112dc565b3480156109d057600080fd5b506104366112e2565b3480156109e557600080fd5b506103e96112e8565b3480156109fa57600080fd5b506103e96112f7565b6009602090815260009283526040808420909152908252902080546001820154600283015460038401546004850154600590950154939492939192909186565b6031546001600160a01b031681565b6005602052600090815260409020546001600160a01b031681565b603b60209081526000928352604080842090915290825290205481565b6023602052600090815260409020546001600160a01b031681565b60326020526000908152604090205460ff1681565b60185481565b601f5481565b6008602090815260009283526040808420909152908252902080546001820154600283015460038401546004850154600590950154939492939192909186565b601a6020526000908152604090205481565b602a6020526000908152604090205481565b600a60209081526000928352604080842090915290825290205460ff1681565b60166020526000908152604090205481565b60155481565b60295481565b600c6020526000908152604090208054600182015460029092015490919083565b602b5481565b600b602090815260009283526040808420909152908252902080546001820154600283015460038401546004909401549293919290919085565b60266020526000908152604090205460ff1681565b6000610beb848484611306565b90505b9392505050565b6033602052600090815260409020546001600160a01b031681565b6003546001600160a01b031681565b60355481565b6002546001600160a01b031681565b601e5481565b603d5460ff1681565b6001546001600160a01b031690565b6022602052600090815260409020546001600160a01b031681565b6001546000906001600160a01b0316610c84611393565b6001600160a01b031614905090565b60176020526000908152604090205481565b602c5481565b602f5481565b60205481565b602d546001600160a01b031681565b6000610cd3858585611306565b905081811015610cf55760405162461bcd60e51b815260040161039090612d45565b5050505050565b601d6020526000908152604090205481565b601c6020526000908152604090205481565b6037546001600160a01b031681565b6004546001600160a01b031681565b60366020526000908152604090205481565b600660208190526000918252604090912080546001820154600283015460038401546004850154600586015496860154600787015460088801546009890154600a8a0154600b909a0154989a9799969860ff909616979496949593949293919290916001600160a01b0391821691168c565b610dca610c6d565b610de65760405162461bcd60e51b815260040161039090612d75565b63038c86d560e61b600081905260056020527fe705b9be7ab1128120df187531812b4c979d3ce42ed227d7df3b23e95341849e546001600160a01b031690610e2e9083611397565b610e3f631a51577760e21b83611397565b610e506358bed2b760e11b83611397565b6c14ddd85c1cd15e1d195c9b985b609a1b826001600160a01b0316826001600160a01b03167f1420e3a2094d671bc2eb897941fa3d94ffa37f0cb6d530651946250a2151cb7f60405160405180910390a45050565b6007602052600090815260409020805460018201546002830154600384015460048501546005860154600690960154949560ff8516956101009095046001600160a01b03908116959481169493169288565b603c60209081526000928352604080842090915290825290205481565b6038546001600160a01b031681565b60275481565b60196020526000908152604090205481565b600080600160005414610f605760405162461bcd60e51b815260040161039090612db5565b6002600055603d5460ff1615610f885760405162461bcd60e51b815260040161039090612cc5565b85610fa55760405162461bcd60e51b815260040161039090612cd5565b610fb18a8a8887610cc6565b341561108e576001600160a01b038a16610fd457602d546001600160a01b031699505b602d546001600160a01b038b81169116146110015760405162461bcd60e51b815260040161039090612d55565b8534146110205760405162461bcd60e51b815260040161039090612d85565b602d60009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0876040518263ffffffff1660e01b81526004016000604051808303818588803b15801561107057600080fd5b505af1158015611084573d6000803e3d6000fd5b50505050506111bd565b6040516370a0823160e01b81528a906000906001600160a01b038316906370a08231906110bf903090600401612a27565b60206040518083038186803b1580156110d757600080fd5b505afa1580156110eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061110f91908101906124d1565b905061112c6001600160a01b038d1633308b63ffffffff61141316565b6111b881836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161115c9190612a27565b60206040518083038186803b15801561117457600080fd5b505afa158015611188573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111ac91908101906124d1565b9063ffffffff61147416565b975050505b6040805160a0810182526001600160a01b03808d1682528b81166020808401919091528b821683850152908a166060808401919091523360808401528351908101845289815290810189905291820187905261121e916000808760016114bf565b8092508193505050886001600160a01b03168a6001600160a01b0316336001600160a01b03167f03d3f38d1a433bb469c160c1704d282fe2b74819ba8ec9c223e685dd2a0b05478486604051611275929190612e23565b60405180910390a4600160005590999098509650505050505050565b6014546001600160a01b031681565b601b5481565b60285481565b6112b4610c6d565b6112d05760405162461bcd60e51b815260040161039090612d75565b6112d9816116e4565b50565b60395481565b60215481565b602e546001600160a01b031681565b6030546001600160a01b031681565b60035460048054604051633f24927360e21b81526000936001600160a01b039081169363fc9249cc93611343938a938a938a939091169101612b03565b60206040518083038186803b15801561135b57600080fd5b505afa15801561136f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610beb91908101906124d1565b3390565b6001600160e01b03198216600090815260056020526040902080546001600160a01b0319166001600160a01b038316908117909155156113f2576113ec600d6001600160e01b0319841663ffffffff61176616565b5061140f565b61140d600d6001600160e01b0319841663ffffffff6117ae16565b505b5050565b60405161146e9085906323b872dd60e01b9061143790879087908790602401612adb565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261186f565b50505050565b60006114b683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611954565b90505b92915050565b845160009081901515806114d65750602087015115155b6114f25760405162461bcd60e51b815260040161039090612da5565b602087015161150357865160208801525b6020870151875111156115285760405162461bcd60e51b815260040161039090612d35565b6000806000876115e55760408a01516115a4578515611559576115528a60005b6020020151611980565b905061156d565b61156a8a60005b60200201516119b0565b90505b801561159f5760808b01518b5161159091908b908e60015b6020020151856119d4565b895161159c9082611474565b8a525b6115e5565b85156115bc576115b58a6002611548565b90506115ca565b6115c78a6002611560565b90505b80156115e55760408a01516115df9082611b24565b60408b01525b8651156116045760405162461bcd60e51b815260040161039090612dc5565b61160e8b8b611b49565b60408c0151919450925061165a578951821461163c5760405162461bcd60e51b815260040161039090612df5565b801561165557611652828263ffffffff611b2416565b91505b6116d4565b60208a015182111561167e5760405162461bcd60e51b815260040161039090612d25565b60408a01518310156116a25760405162461bcd60e51b815260040161039090612ce5565b80156116d45760808b015160208c01516116c191908b908e6000611585565b6116d1838263ffffffff61147416565b92505b5090999098509650505050505050565b6001600160a01b03811661170a5760405162461bcd60e51b815260040161039090612cf5565b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b60006117728383611c5b565b6117a657506001808301805480830180835560009283526020808420909201859055848352908590526040909120556114b9565b5060006114b9565b60006117ba8383611c5b565b156117a657600082815260208490526040902054600184015460001991820191018082146118325760008560010182815481106117f357fe5b906000526020600020015490508086600101848154811061181057fe5b6000918252602080832090910192909255918252869052604090206001830190555b6000848152602086905260408120556001850180548061184e57fe5b600190038181906000526020600020016000905590556001925050506114b9565b611881826001600160a01b0316611c70565b61189d5760405162461bcd60e51b815260040161039090612e05565b60006060836001600160a01b0316836040516118b99190612a1b565b6000604051808303816000865af19150503d80600081146118f6576040519150601f19603f3d011682016040523d82523d6000602084013e6118fb565b606091505b50915091508161191d5760405162461bcd60e51b815260040161039090612d15565b80511561146e57808060200190516119389190810190612458565b61146e5760405162461bcd60e51b815260040161039090612dd5565b600081848411156119785760405162461bcd60e51b81526004016103909190612cb4565b505050900390565b60006114b968056bc75e2d631000006119a4603e5485611cac90919063ffffffff16565b9063ffffffff611ce616565b60006114b968056bc75e2d631000006119a460185485611cac90919063ffffffff16565b808015611b1c576001600160a01b038681166000908152603360205260409020541615611a8a576001600160a01b03808716600090815260336020526040902054611a229116878684611d28565b5050611a87611a5568056bc75e2d63100000611a4960395485611cac90919063ffffffff16565b9063ffffffff611dc116565b6111ac611a7a68056bc75e2d63100000611a4960205487611cac90919063ffffffff16565b849063ffffffff61147416565b90505b6001600160a01b038416600090815260196020526040902054611ab3908263ffffffff611b2416565b6001600160a01b03808616600081815260196020526040908190209390935591518792918916907fb23479169712c443e6b00fb0cec3506a5f5926f541df4243d313e11c8c5c71ed90611b07908690612e15565b60405180910390a4611b1c8686868686611e03565b505050505050565b6000828201838110156114b65760405162461bcd60e51b815260040161039090612d05565b815160208084015160408086015160608781015187519588015188850151945160009889989497630957ba1160e21b97611b90979296919592949293919291602401612a35565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925260035491519092506000916001600160a01b031690611be2908490612a1b565b600060405180830381855af49150503d8060008114611c1d576040519150601f19603f3d011682016040523d82523d6000602084013e611c22565b606091505b509250905080611c445760405162461bcd60e51b815260040161039090612de5565b602082015193506040820151925050509250929050565b60009081526020919091526040902054151590565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611ca457508115155b949350505050565b600082611cbb575060006114b9565b82820282848281611cc857fe5b04146114b65760405162461bcd60e51b815260040161039090612d65565b60006114b683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061214e565b6031546040516306a688ff60e11b815260009182916001600160a01b0390911690630d4d11fe90611d63908990899089908990600401612a9d565b6040805180830381600087803b158015611d7c57600080fd5b505af1158015611d90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611db491908101906124ef565b9097909650945050505050565b60006114b683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612198565b602f546002546001600160a01b038581166000908152603c602090815260408083208885168452909152812054909392919091169015611e66576001600160a01b038087166000908152603c602090815260408083209389168352929052205491505b6037546000906060906001600160a01b038085169163d138f9a160e01b918b9116611ea468056bc75e2d63100000611a498c8b63ffffffff611cac16565b604051602401611eb693929190612adb565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611ef49190612a1b565b600060405180830381855afa9150503d8060008114611f2f576040519150601f19603f3d011682016040523d82523d6000602084013e611f34565b606091505b50915091506001821415611f4a57602081015194505b84156121425760375460385460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611f86929116908990600401612b38565b602060405180830381600087803b158015611fa057600080fd5b505af1158015611fb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611fd89190810190612458565b50603854603f546040516000926001600160a01b031691611fff918e918a91602401612b53565b60408051601f198184030181529181526020820180516001600160e01b0316630efe6a8b60e01b179052516120349190612a1b565b6000604051808303816000865af19150503d8060008114612071576040519150601f19603f3d011682016040523d82523d6000602084013e612076565b606091505b5050905080156120ed57601f54612093908763ffffffff611b2416565b601f55603754603f546040518c926001600160a01b0390811692908f16917ff41c644671512f1cda76abfe6038e3d7d526c1377a5a8c692f81703901db2150916120e0918b918d91612e31565b60405180910390a4612140565b603754603f546040518c926001600160a01b0390811692908f16917f483f67ea49f76ac15e15bbad68b52788ca47d50aef1e4acfe95e5e307e71081291612137918b918d91612e31565b60405180910390a45b505b50505050505050505050565b6000818361216f5760405162461bcd60e51b81526004016103909190612cb4565b508361217d57506000610bee565b600083600186038161218b57fe5b0460010195945050505050565b600081836121b95760405162461bcd60e51b81526004016103909190612cb4565b5060008385816121c557fe5b0495945050505050565b80356114b981612fbf565b80516114b981612fd3565b80356114b981612fdc565b80356114b981612fe5565b600082601f83011261220c57600080fd5b813561221f61221a82612f0c565b612ee5565b9150808252602083016020830185838301111561223b57600080fd5b612246838284612f7d565b50505092915050565b80516114b981612fdc565b60006020828403121561226c57600080fd5b6000611ca484846121cf565b6000806040838503121561228b57600080fd5b600061229785856121cf565b92505060206122a8858286016121cf565b9150509250929050565b600080600080600080600080610100898b0312156122cf57600080fd5b60006122db8b8b6121cf565b98505060206122ec8b828c016121cf565b97505060406122fd8b828c016121cf565b965050606061230e8b828c016121cf565b955050608061231f8b828c016121e5565b94505060a06123308b828c016121e5565b93505060c06123418b828c016121e5565b92505060e089013567ffffffffffffffff81111561235e57600080fd5b61236a8b828c016121fb565b9150509295985092959890939650565b60008060006060848603121561238f57600080fd5b600061239b86866121cf565b93505060206123ac868287016121cf565b92505060406123bd868287016121e5565b9150509250925092565b600080600080608085870312156123dd57600080fd5b60006123e987876121cf565b94505060206123fa878288016121cf565b935050604061240b878288016121e5565b925050606061241c878288016121e5565b91505092959194509250565b6000806040838503121561243b57600080fd5b600061244785856121cf565b92505060206122a8858286016121e5565b60006020828403121561246a57600080fd5b6000611ca484846121da565b60006020828403121561248857600080fd5b6000611ca484846121e5565b600080604083850312156124a757600080fd5b600061229785856121e5565b6000602082840312156124c557600080fd5b6000611ca484846121f0565b6000602082840312156124e357600080fd5b6000611ca4848461224f565b6000806040838503121561250257600080fd5b600061250e858561224f565b92505060206122a88582860161224f565b61252881612f46565b82525050565b61252881612f51565b61252881612f56565b600061254b82612f34565b6125558185612f38565b9350612565818560208601612f89565b9290920192915050565b61252881612f72565b600061258382612f34565b61258d8185612f3d565b935061259d818560208601612f89565b6125a681612fb5565b9093019392505050565b60006125bd600683612f3d565b6514185d5cd95960d21b815260200192915050565b60006125df601683612f3d565b750736f75726365546f6b656e416d6f756e74203d3d20360541b815260200192915050565b6000612611601b83612f3d565b7f696e73756666696369656e742073776170206c69717569646974790000000000815260200192915050565b600061264a602683612f3d565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b6000612692601b83612f3d565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b60006126cb602083612f3d565b7f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815260200192915050565b6000612704601383612f3d565b72737761702066696c6c20746f6f206c6172676560681b815260200192915050565b6000612733601c83612f3d565b7f736f75726365416d6f756e74206c6172676572207468616e206d617800000000815260200192915050565b600061276c601f83612f3d565b7f64657374546f6b656e416d6f756e74526563656976656420746f6f206c6f7700815260200192915050565b60006127a5601483612f3d565b730e6deeae4c6caa8ded6cadc40dad2e6dac2e8c6d60631b815260200192915050565b60006127d5602183612f3d565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b6000612818600c83612f3d565b6b1d5b985d5d1a1bdc9a5e995960a21b815260200192915050565b6000612840601a83612f3d565b7f736f75726365546f6b656e416d6f756e74206d69736d61746368000000000000815260200192915050565b6000612879601483612f3d565b7319985b1b189858dac81b9bdd08185b1b1bddd95960621b815260200192915050565b60006128a9602e83612f3d565b7f6d696e206f72206d617820736f7572636520746f6b656e20616d6f756e74206e81526d1959591cc81d1bc81899481cd95d60921b602082015260400192915050565b60006128f9600c83612f3d565b6b1b9bdb9499595b9d1c985b9d60a21b815260200192915050565b6000612921600d83612f3d565b6c696e76616c696420737461746560981b815260200192915050565b600061294a602a83612f3d565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e8152691bdd081cdd58d8d9595960b21b602082015260400192915050565b6000612996600b83612f3d565b6a1cddd85c0819985a5b195960aa1b815260200192915050565b60006129bd601683612f3d565b751cddd85c081d1bdbc81b185c99d9481d1bc8199a5b1b60521b815260200192915050565b60006129ef601f83612f3d565b7f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400815260200192915050565b6000610bee8284612540565b602081016114b9828461251f565b60e08101612a43828a61251f565b612a50602083018961251f565b612a5d604083018861251f565b612a6a606083018761251f565b612a776080830186612537565b612a8460a0830185612537565b612a9160c0830184612537565b98975050505050505050565b60808101612aab828761251f565b612ab8602083018661251f565b612ac5604083018561251f565b612ad26060830184612537565b95945050505050565b60608101612ae9828661251f565b612af6602083018561251f565b611ca46040830184612537565b60808101612b11828761251f565b612b1e602083018661251f565b612b2b6040830185612537565b612ad2606083018461251f565b60408101612b46828561251f565b610bee6020830184612537565b60608101612b61828661251f565b612af66020830185612537565b602081016114b9828461252e565b6101008101612b8b828b612537565b612b98602083018a61252e565b612ba5604083018961251f565b612bb2606083018861251f565b612bbf608083018761251f565b612bcc60a0830186612537565b612bd960c0830185612537565b612be660e0830184612537565b9998505050505050505050565b6101808101612c02828f612537565b612c0f602083018e612537565b612c1c604083018d612537565b612c29606083018c61252e565b612c36608083018b612537565b612c4360a083018a612537565b612c5060c0830189612537565b612c5d60e0830188612537565b612c6b610100830187612537565b612c79610120830186612537565b612c8761014083018561251f565b612c9561016083018461251f565b9d9c50505050505050505050505050565b602081016114b9828461256f565b602080825281016114b68184612578565b602080825281016114b9816125b0565b602080825281016114b9816125d2565b602080825281016114b981612604565b602080825281016114b98161263d565b602080825281016114b981612685565b602080825281016114b9816126be565b602080825281016114b9816126f7565b602080825281016114b981612726565b602080825281016114b98161275f565b602080825281016114b981612798565b602080825281016114b9816127c8565b602080825281016114b98161280b565b602080825281016114b981612833565b602080825281016114b98161286c565b602080825281016114b98161289c565b602080825281016114b9816128ec565b602080825281016114b981612914565b602080825281016114b98161293d565b602080825281016114b981612989565b602080825281016114b9816129b0565b602080825281016114b9816129e2565b602081016114b98284612537565b60408101612b468285612537565b60608101612b618286612537565b60a08101612e4d8288612537565b612e5a6020830187612537565b612e676040830186612537565b612e746060830185612537565b612e816080830184612537565b9695505050505050565b60c08101612e998289612537565b612ea66020830188612537565b612eb36040830187612537565b612ec06060830186612537565b612ecd6080830185612537565b612eda60a0830184612537565b979650505050505050565b60405181810167ffffffffffffffff81118282101715612f0457600080fd5b604052919050565b600067ffffffffffffffff821115612f2357600080fd5b506020601f91909101601f19160190565b5190565b919050565b90815260200190565b60006114b982612f66565b151590565b90565b6001600160e01b03191690565b6001600160a01b031690565b60006114b982612f46565b82818337506000910152565b60005b83811015612fa4578181015183820152602001612f8c565b8381111561146e5750506000910152565b601f01601f191690565b612fc881612f46565b81146112d957600080fd5b612fc881612f51565b612fc881612f56565b612fc881612f5956fea365627a7a7231582032c9ec4eaced0eacddcd9254ec8cf2d4e04c7e54a3d0d4726fe9202ee73454936c6578706572696d656e74616cf564736f6c63430005110040",
  "deployedBytecode": "0x60806040526004361061036b5760003560e01c80638f32d59b116101c6578063cb6eacd1116100f7578063edab119f11610095578063f589a3e71161006f578063f589a3e7146109af578063f6ddc8b3146109c4578063f706b1f2146109d9578063f851a440146109ee5761036b565b8063edab119f14610965578063f0e085f51461097a578063f2fde38b1461098f5761036b565b8063d473c2da116100d1578063d473c2da146108fa578063d485045e1461090f578063e321b5401461092f578063e8f62764146109505761036b565b8063cb6eacd114610891578063cd5d808d146108c5578063d288208c146108e55761036b565b8063b30643d911610164578063ba4861e91161013e578063ba4861e914610804578063bdee453c14610819578063c4a9081514610839578063c4d66de8146108715761036b565b8063b30643d9146107af578063b7e15241146107cf578063b9cffa3e146107ef5761036b565b8063acc04348116101a0578063acc0434814610741578063ae0a853014610756578063afe840091461076b578063b17da56e1461078d5761036b565b80638f32d59b146106f757806392d894f81461070c578063959083d31461072c5761036b565b80634f28cac2116102a05780637420ca3e1161023e5780637a8faeb8116102185780637a8faeb8146106985780638456cb59146106ad5780638da5cb5b146106c25780638dc48ba5146106d75761036b565b80637420ca3e14610659578063742e67981461066e57806378d849ed146106835761036b565b806362fff3f61161027a57806362fff3f6146105c857806368c4ac26146105f957806369455ddc146106195780636e663730146106395761036b565b80634f28cac21461056f578063569fc1fb14610584578063574442cc146105b35761036b565b80632f4707641161030d5780633fca506e116102e75780633fca506e146104fa5780634115a2b61461051a5780634203e3951461053a5780634699f8461461055a5761036b565b80632f470764146104a55780633432423c146104ba5780633452d2d4146104da5761036b565b80631b7bde74116103495780631b7bde7414610416578063218b39c61461044357806324cc5749146104635780632a324027146104905761036b565b8063065d810f146103995780630676c1b7146103d457806317548b79146103f6575b34801561037757600080fd5b5060405162461bcd60e51b815260040161039090612d95565b60405180910390fd5b3480156103a557600080fd5b506103b96103b4366004612428565b610a03565b6040516103cb96959493929190612e8b565b60405180910390f35b3480156103e057600080fd5b506103e9610a43565b6040516103cb9190612a27565b34801561040257600080fd5b506103e96104113660046124b3565b610a52565b34801561042257600080fd5b50610436610431366004612278565b610a6d565b6040516103cb9190612e15565b34801561044f57600080fd5b506103e961045e36600461225a565b610a8a565b34801561046f57600080fd5b5061048361047e36600461225a565b610aa5565b6040516103cb9190612b6e565b34801561049c57600080fd5b50610436610aba565b3480156104b157600080fd5b50610436610ac0565b3480156104c657600080fd5b506103b96104d5366004612428565b610ac6565b3480156104e657600080fd5b506104366104f536600461225a565b610b06565b34801561050657600080fd5b5061043661051536600461225a565b610b18565b34801561052657600080fd5b50610483610535366004612494565b610b2a565b34801561054657600080fd5b5061043661055536600461225a565b610b4a565b34801561056657600080fd5b50610436610b5c565b34801561057b57600080fd5b50610436610b62565b34801561059057600080fd5b506105a461059f366004612476565b610b68565b6040516103cb93929190612e31565b3480156105bf57600080fd5b50610436610b89565b3480156105d457600080fd5b506105e86105e3366004612278565b610b8f565b6040516103cb959493929190612e3f565b34801561060557600080fd5b5061048361061436600461225a565b610bc9565b34801561062557600080fd5b5061043661063436600461237a565b610bde565b34801561064557600080fd5b506103e961065436600461225a565b610bf5565b34801561066557600080fd5b506103e9610c10565b34801561067a57600080fd5b50610436610c1f565b34801561068f57600080fd5b506103e9610c25565b3480156106a457600080fd5b50610436610c34565b3480156106b957600080fd5b50610483610c3a565b3480156106ce57600080fd5b506103e9610c43565b3480156106e357600080fd5b506103e96106f236600461225a565b610c52565b34801561070357600080fd5b50610483610c6d565b34801561071857600080fd5b5061043661072736600461225a565b610c93565b34801561073857600080fd5b50610436610ca5565b34801561074d57600080fd5b50610436610cab565b34801561076257600080fd5b50610436610cb1565b34801561077757600080fd5b50610780610cb7565b6040516103cb9190612ca6565b34801561079957600080fd5b506107ad6107a83660046123c7565b610cc6565b005b3480156107bb57600080fd5b506104366107ca36600461225a565b610cfc565b3480156107db57600080fd5b506104366107ea36600461225a565b610d0e565b3480156107fb57600080fd5b506103e9610d20565b34801561081057600080fd5b506103e9610d2f565b34801561082557600080fd5b5061043661083436600461225a565b610d3e565b34801561084557600080fd5b50610859610854366004612476565b610d50565b6040516103cb9c9b9a99989796959493929190612bf3565b34801561087d57600080fd5b506107ad61088c36600461225a565b610dc2565b34801561089d57600080fd5b506108b16108ac366004612476565b610ea5565b6040516103cb989796959493929190612b7c565b3480156108d157600080fd5b506104366108e0366004612278565b610ef7565b3480156108f157600080fd5b506103e9610f14565b34801561090657600080fd5b50610436610f23565b34801561091b57600080fd5b5061043661092a36600461225a565b610f29565b61094261093d3660046122b2565b610f3b565b6040516103cb929190612e23565b34801561095c57600080fd5b506103e9611291565b34801561097157600080fd5b506104366112a0565b34801561098657600080fd5b506104366112a6565b34801561099b57600080fd5b506107ad6109aa36600461225a565b6112ac565b3480156109bb57600080fd5b506104366112dc565b3480156109d057600080fd5b506104366112e2565b3480156109e557600080fd5b506103e96112e8565b3480156109fa57600080fd5b506103e96112f7565b6009602090815260009283526040808420909152908252902080546001820154600283015460038401546004850154600590950154939492939192909186565b6031546001600160a01b031681565b6005602052600090815260409020546001600160a01b031681565b603b60209081526000928352604080842090915290825290205481565b6023602052600090815260409020546001600160a01b031681565b60326020526000908152604090205460ff1681565b60185481565b601f5481565b6008602090815260009283526040808420909152908252902080546001820154600283015460038401546004850154600590950154939492939192909186565b601a6020526000908152604090205481565b602a6020526000908152604090205481565b600a60209081526000928352604080842090915290825290205460ff1681565b60166020526000908152604090205481565b60155481565b60295481565b600c6020526000908152604090208054600182015460029092015490919083565b602b5481565b600b602090815260009283526040808420909152908252902080546001820154600283015460038401546004909401549293919290919085565b60266020526000908152604090205460ff1681565b6000610beb848484611306565b90505b9392505050565b6033602052600090815260409020546001600160a01b031681565b6003546001600160a01b031681565b60355481565b6002546001600160a01b031681565b601e5481565b603d5460ff1681565b6001546001600160a01b031690565b6022602052600090815260409020546001600160a01b031681565b6001546000906001600160a01b0316610c84611393565b6001600160a01b031614905090565b60176020526000908152604090205481565b602c5481565b602f5481565b60205481565b602d546001600160a01b031681565b6000610cd3858585611306565b905081811015610cf55760405162461bcd60e51b815260040161039090612d45565b5050505050565b601d6020526000908152604090205481565b601c6020526000908152604090205481565b6037546001600160a01b031681565b6004546001600160a01b031681565b60366020526000908152604090205481565b600660208190526000918252604090912080546001820154600283015460038401546004850154600586015496860154600787015460088801546009890154600a8a0154600b909a0154989a9799969860ff909616979496949593949293919290916001600160a01b0391821691168c565b610dca610c6d565b610de65760405162461bcd60e51b815260040161039090612d75565b63038c86d560e61b600081905260056020527fe705b9be7ab1128120df187531812b4c979d3ce42ed227d7df3b23e95341849e546001600160a01b031690610e2e9083611397565b610e3f631a51577760e21b83611397565b610e506358bed2b760e11b83611397565b6c14ddd85c1cd15e1d195c9b985b609a1b826001600160a01b0316826001600160a01b03167f1420e3a2094d671bc2eb897941fa3d94ffa37f0cb6d530651946250a2151cb7f60405160405180910390a45050565b6007602052600090815260409020805460018201546002830154600384015460048501546005860154600690960154949560ff8516956101009095046001600160a01b03908116959481169493169288565b603c60209081526000928352604080842090915290825290205481565b6038546001600160a01b031681565b60275481565b60196020526000908152604090205481565b600080600160005414610f605760405162461bcd60e51b815260040161039090612db5565b6002600055603d5460ff1615610f885760405162461bcd60e51b815260040161039090612cc5565b85610fa55760405162461bcd60e51b815260040161039090612cd5565b610fb18a8a8887610cc6565b341561108e576001600160a01b038a16610fd457602d546001600160a01b031699505b602d546001600160a01b038b81169116146110015760405162461bcd60e51b815260040161039090612d55565b8534146110205760405162461bcd60e51b815260040161039090612d85565b602d60009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0876040518263ffffffff1660e01b81526004016000604051808303818588803b15801561107057600080fd5b505af1158015611084573d6000803e3d6000fd5b50505050506111bd565b6040516370a0823160e01b81528a906000906001600160a01b038316906370a08231906110bf903090600401612a27565b60206040518083038186803b1580156110d757600080fd5b505afa1580156110eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061110f91908101906124d1565b905061112c6001600160a01b038d1633308b63ffffffff61141316565b6111b881836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161115c9190612a27565b60206040518083038186803b15801561117457600080fd5b505afa158015611188573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111ac91908101906124d1565b9063ffffffff61147416565b975050505b6040805160a0810182526001600160a01b03808d1682528b81166020808401919091528b821683850152908a166060808401919091523360808401528351908101845289815290810189905291820187905261121e916000808760016114bf565b8092508193505050886001600160a01b03168a6001600160a01b0316336001600160a01b03167f03d3f38d1a433bb469c160c1704d282fe2b74819ba8ec9c223e685dd2a0b05478486604051611275929190612e23565b60405180910390a4600160005590999098509650505050505050565b6014546001600160a01b031681565b601b5481565b60285481565b6112b4610c6d565b6112d05760405162461bcd60e51b815260040161039090612d75565b6112d9816116e4565b50565b60395481565b60215481565b602e546001600160a01b031681565b6030546001600160a01b031681565b60035460048054604051633f24927360e21b81526000936001600160a01b039081169363fc9249cc93611343938a938a938a939091169101612b03565b60206040518083038186803b15801561135b57600080fd5b505afa15801561136f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610beb91908101906124d1565b3390565b6001600160e01b03198216600090815260056020526040902080546001600160a01b0319166001600160a01b038316908117909155156113f2576113ec600d6001600160e01b0319841663ffffffff61176616565b5061140f565b61140d600d6001600160e01b0319841663ffffffff6117ae16565b505b5050565b60405161146e9085906323b872dd60e01b9061143790879087908790602401612adb565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261186f565b50505050565b60006114b683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611954565b90505b92915050565b845160009081901515806114d65750602087015115155b6114f25760405162461bcd60e51b815260040161039090612da5565b602087015161150357865160208801525b6020870151875111156115285760405162461bcd60e51b815260040161039090612d35565b6000806000876115e55760408a01516115a4578515611559576115528a60005b6020020151611980565b905061156d565b61156a8a60005b60200201516119b0565b90505b801561159f5760808b01518b5161159091908b908e60015b6020020151856119d4565b895161159c9082611474565b8a525b6115e5565b85156115bc576115b58a6002611548565b90506115ca565b6115c78a6002611560565b90505b80156115e55760408a01516115df9082611b24565b60408b01525b8651156116045760405162461bcd60e51b815260040161039090612dc5565b61160e8b8b611b49565b60408c0151919450925061165a578951821461163c5760405162461bcd60e51b815260040161039090612df5565b801561165557611652828263ffffffff611b2416565b91505b6116d4565b60208a015182111561167e5760405162461bcd60e51b815260040161039090612d25565b60408a01518310156116a25760405162461bcd60e51b815260040161039090612ce5565b80156116d45760808b015160208c01516116c191908b908e6000611585565b6116d1838263ffffffff61147416565b92505b5090999098509650505050505050565b6001600160a01b03811661170a5760405162461bcd60e51b815260040161039090612cf5565b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b60006117728383611c5b565b6117a657506001808301805480830180835560009283526020808420909201859055848352908590526040909120556114b9565b5060006114b9565b60006117ba8383611c5b565b156117a657600082815260208490526040902054600184015460001991820191018082146118325760008560010182815481106117f357fe5b906000526020600020015490508086600101848154811061181057fe5b6000918252602080832090910192909255918252869052604090206001830190555b6000848152602086905260408120556001850180548061184e57fe5b600190038181906000526020600020016000905590556001925050506114b9565b611881826001600160a01b0316611c70565b61189d5760405162461bcd60e51b815260040161039090612e05565b60006060836001600160a01b0316836040516118b99190612a1b565b6000604051808303816000865af19150503d80600081146118f6576040519150601f19603f3d011682016040523d82523d6000602084013e6118fb565b606091505b50915091508161191d5760405162461bcd60e51b815260040161039090612d15565b80511561146e57808060200190516119389190810190612458565b61146e5760405162461bcd60e51b815260040161039090612dd5565b600081848411156119785760405162461bcd60e51b81526004016103909190612cb4565b505050900390565b60006114b968056bc75e2d631000006119a4603e5485611cac90919063ffffffff16565b9063ffffffff611ce616565b60006114b968056bc75e2d631000006119a460185485611cac90919063ffffffff16565b808015611b1c576001600160a01b038681166000908152603360205260409020541615611a8a576001600160a01b03808716600090815260336020526040902054611a229116878684611d28565b5050611a87611a5568056bc75e2d63100000611a4960395485611cac90919063ffffffff16565b9063ffffffff611dc116565b6111ac611a7a68056bc75e2d63100000611a4960205487611cac90919063ffffffff16565b849063ffffffff61147416565b90505b6001600160a01b038416600090815260196020526040902054611ab3908263ffffffff611b2416565b6001600160a01b03808616600081815260196020526040908190209390935591518792918916907fb23479169712c443e6b00fb0cec3506a5f5926f541df4243d313e11c8c5c71ed90611b07908690612e15565b60405180910390a4611b1c8686868686611e03565b505050505050565b6000828201838110156114b65760405162461bcd60e51b815260040161039090612d05565b815160208084015160408086015160608781015187519588015188850151945160009889989497630957ba1160e21b97611b90979296919592949293919291602401612a35565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925260035491519092506000916001600160a01b031690611be2908490612a1b565b600060405180830381855af49150503d8060008114611c1d576040519150601f19603f3d011682016040523d82523d6000602084013e611c22565b606091505b509250905080611c445760405162461bcd60e51b815260040161039090612de5565b602082015193506040820151925050509250929050565b60009081526020919091526040902054151590565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611ca457508115155b949350505050565b600082611cbb575060006114b9565b82820282848281611cc857fe5b04146114b65760405162461bcd60e51b815260040161039090612d65565b60006114b683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061214e565b6031546040516306a688ff60e11b815260009182916001600160a01b0390911690630d4d11fe90611d63908990899089908990600401612a9d565b6040805180830381600087803b158015611d7c57600080fd5b505af1158015611d90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611db491908101906124ef565b9097909650945050505050565b60006114b683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612198565b602f546002546001600160a01b038581166000908152603c602090815260408083208885168452909152812054909392919091169015611e66576001600160a01b038087166000908152603c602090815260408083209389168352929052205491505b6037546000906060906001600160a01b038085169163d138f9a160e01b918b9116611ea468056bc75e2d63100000611a498c8b63ffffffff611cac16565b604051602401611eb693929190612adb565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611ef49190612a1b565b600060405180830381855afa9150503d8060008114611f2f576040519150601f19603f3d011682016040523d82523d6000602084013e611f34565b606091505b50915091506001821415611f4a57602081015194505b84156121425760375460385460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611f86929116908990600401612b38565b602060405180830381600087803b158015611fa057600080fd5b505af1158015611fb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611fd89190810190612458565b50603854603f546040516000926001600160a01b031691611fff918e918a91602401612b53565b60408051601f198184030181529181526020820180516001600160e01b0316630efe6a8b60e01b179052516120349190612a1b565b6000604051808303816000865af19150503d8060008114612071576040519150601f19603f3d011682016040523d82523d6000602084013e612076565b606091505b5050905080156120ed57601f54612093908763ffffffff611b2416565b601f55603754603f546040518c926001600160a01b0390811692908f16917ff41c644671512f1cda76abfe6038e3d7d526c1377a5a8c692f81703901db2150916120e0918b918d91612e31565b60405180910390a4612140565b603754603f546040518c926001600160a01b0390811692908f16917f483f67ea49f76ac15e15bbad68b52788ca47d50aef1e4acfe95e5e307e71081291612137918b918d91612e31565b60405180910390a45b505b50505050505050505050565b6000818361216f5760405162461bcd60e51b81526004016103909190612cb4565b508361217d57506000610bee565b600083600186038161218b57fe5b0460010195945050505050565b600081836121b95760405162461bcd60e51b81526004016103909190612cb4565b5060008385816121c557fe5b0495945050505050565b80356114b981612fbf565b80516114b981612fd3565b80356114b981612fdc565b80356114b981612fe5565b600082601f83011261220c57600080fd5b813561221f61221a82612f0c565b612ee5565b9150808252602083016020830185838301111561223b57600080fd5b612246838284612f7d565b50505092915050565b80516114b981612fdc565b60006020828403121561226c57600080fd5b6000611ca484846121cf565b6000806040838503121561228b57600080fd5b600061229785856121cf565b92505060206122a8858286016121cf565b9150509250929050565b600080600080600080600080610100898b0312156122cf57600080fd5b60006122db8b8b6121cf565b98505060206122ec8b828c016121cf565b97505060406122fd8b828c016121cf565b965050606061230e8b828c016121cf565b955050608061231f8b828c016121e5565b94505060a06123308b828c016121e5565b93505060c06123418b828c016121e5565b92505060e089013567ffffffffffffffff81111561235e57600080fd5b61236a8b828c016121fb565b9150509295985092959890939650565b60008060006060848603121561238f57600080fd5b600061239b86866121cf565b93505060206123ac868287016121cf565b92505060406123bd868287016121e5565b9150509250925092565b600080600080608085870312156123dd57600080fd5b60006123e987876121cf565b94505060206123fa878288016121cf565b935050604061240b878288016121e5565b925050606061241c878288016121e5565b91505092959194509250565b6000806040838503121561243b57600080fd5b600061244785856121cf565b92505060206122a8858286016121e5565b60006020828403121561246a57600080fd5b6000611ca484846121da565b60006020828403121561248857600080fd5b6000611ca484846121e5565b600080604083850312156124a757600080fd5b600061229785856121e5565b6000602082840312156124c557600080fd5b6000611ca484846121f0565b6000602082840312156124e357600080fd5b6000611ca4848461224f565b6000806040838503121561250257600080fd5b600061250e858561224f565b92505060206122a88582860161224f565b61252881612f46565b82525050565b61252881612f51565b61252881612f56565b600061254b82612f34565b6125558185612f38565b9350612565818560208601612f89565b9290920192915050565b61252881612f72565b600061258382612f34565b61258d8185612f3d565b935061259d818560208601612f89565b6125a681612fb5565b9093019392505050565b60006125bd600683612f3d565b6514185d5cd95960d21b815260200192915050565b60006125df601683612f3d565b750736f75726365546f6b656e416d6f756e74203d3d20360541b815260200192915050565b6000612611601b83612f3d565b7f696e73756666696369656e742073776170206c69717569646974790000000000815260200192915050565b600061264a602683612f3d565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b6000612692601b83612f3d565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b60006126cb602083612f3d565b7f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815260200192915050565b6000612704601383612f3d565b72737761702066696c6c20746f6f206c6172676560681b815260200192915050565b6000612733601c83612f3d565b7f736f75726365416d6f756e74206c6172676572207468616e206d617800000000815260200192915050565b600061276c601f83612f3d565b7f64657374546f6b656e416d6f756e74526563656976656420746f6f206c6f7700815260200192915050565b60006127a5601483612f3d565b730e6deeae4c6caa8ded6cadc40dad2e6dac2e8c6d60631b815260200192915050565b60006127d5602183612f3d565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b6000612818600c83612f3d565b6b1d5b985d5d1a1bdc9a5e995960a21b815260200192915050565b6000612840601a83612f3d565b7f736f75726365546f6b656e416d6f756e74206d69736d61746368000000000000815260200192915050565b6000612879601483612f3d565b7319985b1b189858dac81b9bdd08185b1b1bddd95960621b815260200192915050565b60006128a9602e83612f3d565b7f6d696e206f72206d617820736f7572636520746f6b656e20616d6f756e74206e81526d1959591cc81d1bc81899481cd95d60921b602082015260400192915050565b60006128f9600c83612f3d565b6b1b9bdb9499595b9d1c985b9d60a21b815260200192915050565b6000612921600d83612f3d565b6c696e76616c696420737461746560981b815260200192915050565b600061294a602a83612f3d565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e8152691bdd081cdd58d8d9595960b21b602082015260400192915050565b6000612996600b83612f3d565b6a1cddd85c0819985a5b195960aa1b815260200192915050565b60006129bd601683612f3d565b751cddd85c081d1bdbc81b185c99d9481d1bc8199a5b1b60521b815260200192915050565b60006129ef601f83612f3d565b7f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400815260200192915050565b6000610bee8284612540565b602081016114b9828461251f565b60e08101612a43828a61251f565b612a50602083018961251f565b612a5d604083018861251f565b612a6a606083018761251f565b612a776080830186612537565b612a8460a0830185612537565b612a9160c0830184612537565b98975050505050505050565b60808101612aab828761251f565b612ab8602083018661251f565b612ac5604083018561251f565b612ad26060830184612537565b95945050505050565b60608101612ae9828661251f565b612af6602083018561251f565b611ca46040830184612537565b60808101612b11828761251f565b612b1e602083018661251f565b612b2b6040830185612537565b612ad2606083018461251f565b60408101612b46828561251f565b610bee6020830184612537565b60608101612b61828661251f565b612af66020830185612537565b602081016114b9828461252e565b6101008101612b8b828b612537565b612b98602083018a61252e565b612ba5604083018961251f565b612bb2606083018861251f565b612bbf608083018761251f565b612bcc60a0830186612537565b612bd960c0830185612537565b612be660e0830184612537565b9998505050505050505050565b6101808101612c02828f612537565b612c0f602083018e612537565b612c1c604083018d612537565b612c29606083018c61252e565b612c36608083018b612537565b612c4360a083018a612537565b612c5060c0830189612537565b612c5d60e0830188612537565b612c6b610100830187612537565b612c79610120830186612537565b612c8761014083018561251f565b612c9561016083018461251f565b9d9c50505050505050505050505050565b602081016114b9828461256f565b602080825281016114b68184612578565b602080825281016114b9816125b0565b602080825281016114b9816125d2565b602080825281016114b981612604565b602080825281016114b98161263d565b602080825281016114b981612685565b602080825281016114b9816126be565b602080825281016114b9816126f7565b602080825281016114b981612726565b602080825281016114b98161275f565b602080825281016114b981612798565b602080825281016114b9816127c8565b602080825281016114b98161280b565b602080825281016114b981612833565b602080825281016114b98161286c565b602080825281016114b98161289c565b602080825281016114b9816128ec565b602080825281016114b981612914565b602080825281016114b98161293d565b602080825281016114b981612989565b602080825281016114b9816129b0565b602080825281016114b9816129e2565b602081016114b98284612537565b60408101612b468285612537565b60608101612b618286612537565b60a08101612e4d8288612537565b612e5a6020830187612537565b612e676040830186612537565b612e746060830185612537565b612e816080830184612537565b9695505050505050565b60c08101612e998289612537565b612ea66020830188612537565b612eb36040830187612537565b612ec06060830186612537565b612ecd6080830185612537565b612eda60a0830184612537565b979650505050505050565b60405181810167ffffffffffffffff81118282101715612f0457600080fd5b604052919050565b600067ffffffffffffffff821115612f2357600080fd5b506020601f91909101601f19160190565b5190565b919050565b90815260200190565b60006114b982612f66565b151590565b90565b6001600160e01b03191690565b6001600160a01b031690565b60006114b982612f46565b82818337506000910152565b60005b83811015612fa4578181015183820152602001612f8c565b8381111561146e5750506000910152565b601f01601f191690565b612fc881612f46565b81146112d957600080fd5b612fc881612f51565b612fc881612f56565b612fc881612f5956fea365627a7a7231582032c9ec4eaced0eacddcd9254ec8cf2d4e04c7e54a3d0d4726fe9202ee73454936c6578706572696d656e74616cf564736f6c63430005110040",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
