Loading
[ { "inputs": [ { "internalType": "address", "name": "_token", "type": "address" }, { "internalType": "address", "name": "_bouncer", "type": "address" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Approval", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "user", "type": "address" } ], "name": "LogAddToWhitelist", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256[]", "name": "strategyRetios", "type": "uint256[]" } ], "name": "LogDebtRatios", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "_amount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "shares", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "allowance", "type": "uint256" } ], "name": "LogDeposit", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "newLimit", "type": "uint256" } ], "name": "LogDepositLimit", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "parent", "type": "address" }, { "indexed": false, "internalType": "address", "name": "child", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "LogMigrate", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "user", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "LogNewAllowance", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "bouncer", "type": "address" } ], "name": "LogNewBouncer", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "strategy", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "debtRatio", "type": "uint256" } ], "name": "LogNewDebtRatio", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "rewards", "type": "address" } ], "name": "LogNewRewards", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "bool", "name": "loss", "type": "bool" }, { "indexed": false, "internalType": "uint256", "name": "change", "type": "uint256" } ], "name": "LogNewStrategyHarvest", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "vaultFee", "type": "uint256" } ], "name": "LogNewVaultFee", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "user", "type": "address" } ], "name": "LogRemoveFromWhitelist", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "strategy", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "debtRatio", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "minDebtPerHarvest", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "maxDebtPerHarvest", "type": "uint256" } ], "name": "LogStrategyAdded", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "strategy", "type": "address" } ], "name": "LogStrategyAddedToQueue", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "newStrategy", "type": "address" }, { "indexed": true, "internalType": "address", "name": "oldStrategy", "type": "address" } ], "name": "LogStrategyMigrated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "strategy", "type": "address" } ], "name": "LogStrategyRemovedFromQueue", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "strategy", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "gain", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "loss", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "debtPaid", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "totalGain", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "totalLoss", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "totalDebt", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "debtAdded", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "debtRatio", "type": "uint256" } ], "name": "LogStrategyReported", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "strategy", "type": "address" } ], "name": "LogStrategyRevoked", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "strategy", "type": "address" }, { "indexed": false, "internalType": "bool", "name": "status", "type": "bool" } ], "name": "LogStrategyStatusUpdate", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "strategy", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "maxDebtPerHarvest", "type": "uint256" } ], "name": "LogStrategyUpdateMaxDebtPerHarvest", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "strategy", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "minDebtPerHarvest", "type": "uint256" } ], "name": "LogStrategyUpdateMinDebtPerHarvest", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address[]", "name": "queue", "type": "address[]" } ], "name": "LogUpdateWithdrawalQueue", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "shares", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "totalLoss", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "allowance", "type": "uint256" } ], "name": "LogWithdrawal", "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": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Transfer", "type": "event" }, { "inputs": [], "name": "MAXIMUM_STRATEGIES", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "activation", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_strategy", "type": "address" }, { "internalType": "uint256", "name": "_debtRatio", "type": "uint256" }, { "internalType": "uint256", "name": "_minDebtPerHarvest", "type": "uint256" }, { "internalType": "uint256", "name": "_maxDebtPerHarvest", "type": "uint256" } ], "name": "addStrategy", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_strategy", "type": "address" } ], "name": "addStrategyToQueue", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "user", "type": "address" } ], "name": "addToWhitelist", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "spender", "type": "address" } ], "name": "allowance", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "approve", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "bouncer", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "creditAvailable", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_strategy", "type": "address" } ], "name": "creditAvailable", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_strategy", "type": "address" } ], "name": "debtOutstanding", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "debtOutstanding", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "debtRatio", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "decimals", "outputs": [ { "internalType": "uint8", "name": "", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "subtractedValue", "type": "uint256" } ], "name": "decreaseAllowance", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], "name": "deposit", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "depositLimit", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getPricePerShare", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getStrategiesLength", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_index", "type": "uint256" } ], "name": "getStrategyAssets", "outputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "addedValue", "type": "uint256" } ], "name": "increaseAllowance", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "lastReport", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_oldVersion", "type": "address" }, { "internalType": "address", "name": "_newVersion", "type": "address" } ], "name": "migrateStrategy", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "user", "type": "address" } ], "name": "removeFromWhitelist", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_strategy", "type": "address" } ], "name": "removeStrategyFromQueue", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_gain", "type": "uint256" }, { "internalType": "uint256", "name": "_loss", "type": "uint256" }, { "internalType": "uint256", "name": "_debtPayment", "type": "uint256" } ], "name": "report", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "revokeStrategy", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "rewards", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_bouncer", "type": "address" } ], "name": "setBouncer", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_strategy", "type": "address" }, { "internalType": "uint256", "name": "_debtRatio", "type": "uint256" } ], "name": "setDebtRatio", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256[]", "name": "_strategyDebtRatios", "type": "uint256[]" } ], "name": "setDebtRatios", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_newLimit", "type": "uint256" } ], "name": "setDepositLimit", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_rewards", "type": "address" } ], "name": "setRewards", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_user", "type": "address" }, { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], "name": "setUserAllowance", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_fee", "type": "uint256" } ], "name": "setVaultFee", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "_queue", "type": "address[]" } ], "name": "setWithdrawalQueue", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "strategies", "outputs": [ { "internalType": "uint256", "name": "activation", "type": "uint256" }, { "internalType": "bool", "name": "active", "type": "bool" }, { "internalType": "uint256", "name": "debtRatio", "type": "uint256" }, { "internalType": "uint256", "name": "minDebtPerHarvest", "type": "uint256" }, { "internalType": "uint256", "name": "maxDebtPerHarvest", "type": "uint256" }, { "internalType": "uint256", "name": "lastReport", "type": "uint256" }, { "internalType": "uint256", "name": "totalDebt", "type": "uint256" }, { "internalType": "uint256", "name": "totalGain", "type": "uint256" }, { "internalType": "uint256", "name": "totalLoss", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "strategyDebt", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_index", "type": "uint256" }, { "internalType": "address[]", "name": "_tokens", "type": "address[]" }, { "internalType": "uint256[]", "name": "_minAmounts", "type": "uint256[]" } ], "name": "strategyHarvest", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_index", "type": "uint256" }, { "internalType": "uint256", "name": "_callCost", "type": "uint256" } ], "name": "strategyHarvestTrigger", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_token", "type": "address" }, { "internalType": "address", "name": "_recipient", "type": "address" } ], "name": "sweep", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "token", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalAssets", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalDebt", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalEstimatedAssets", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "transfer", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "transferFrom", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_strategy", "type": "address" }, { "internalType": "uint256", "name": "_maxDebtPerHarvest", "type": "uint256" } ], "name": "updateStrategyMaxDebtPerHarvest", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_strategy", "type": "address" }, { "internalType": "uint256", "name": "_minDebtPerHarvest", "type": "uint256" } ], "name": "updateStrategyMinDebtPerHarvest", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "userAllowance", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "vaultFee", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "whitelist", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_shares", "type": "uint256" }, { "internalType": "uint256", "name": "_maxLoss", "type": "uint256" } ], "name": "withdraw", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "withdrawalQueue", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" } ]
60c06040523480156200001157600080fd5b50604051620055bc380380620055bc833981016040819052620000349162000379565b816001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b1580156200006e57600080fd5b505afa15801562000083573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620000ad9190810190620003b0565b604051602001620000bf9190620004bb565b604051602081830303815290604052826001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b1580156200010857600080fd5b505afa1580156200011d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620001479190810190620003b0565b6040516020016200015991906200048e565b60408051808303601f19018152919052620001743362000266565b815162000189906005906020850190620002b6565b5080516200019f906006906020840190620002b6565b50506001600755506001600160601b0319606083901b16608052426012556040805163313ce56760e01b815290516001600160a01b0384169163313ce567916004808301926020929190829003018186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000239919062000464565b60ff1660a052601480546001600160a01b0319166001600160a01b0392909216919091179055506200057d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620002c4906200052a565b90600052602060002090601f016020900481019282620002e8576000855562000333565b82601f106200030357805160ff191683800117855562000333565b8280016001018555821562000333579182015b828111156200033357825182559160200191906001019062000316565b506200034192915062000345565b5090565b5b8082111562000341576000815560010162000346565b80516001600160a01b03811681146200037457600080fd5b919050565b600080604083850312156200038c578182fd5b62000397836200035c565b9150620003a7602084016200035c565b90509250929050565b600060208284031215620003c2578081fd5b81516001600160401b0380821115620003d9578283fd5b818401915084601f830112620003ed578283fd5b81518181111562000402576200040262000567565b604051601f8201601f19908116603f011681019083821181831017156200042d576200042d62000567565b8160405282815287602084870101111562000446578586fd5b62000459836020830160208801620004f7565b979650505050505050565b60006020828403121562000476578081fd5b815160ff8116811462000487578182fd5b9392505050565b6267726f60e81b815260008251620004ae816003850160208701620004f7565b9190910160030192915050565b63023b937960e51b815260008251620004dc816004850160208701620004f7565b63102630b160e11b6004939091019283015250600801919050565b60005b8381101562000514578181015183820152602001620004fa565b8381111562000524576000848401525b50505050565b600181811c908216806200053f57607f821691505b602082108114156200056157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60805160601c60a051614fd7620005e56000396000818161048201528181610f0701526137150152600081816108b1015281816110a6015281816121a401528181612a3001528181612b1001528181612cce015281816137dc0152613bd40152614fd76000f3fe608060405234801561001057600080fd5b50600436106103af5760003560e01c80639ec5a894116101f4578063cab208081161011a578063ec38a862116100ad578063f76e4caa1161007c578063f76e4caa14610886578063fb0fc07614610899578063fc0c546a146108ac578063fc7b9c18146108d357600080fd5b8063ec38a86214610844578063ecf7085814610857578063f2fde38b14610860578063f6bad0e31461087357600080fd5b8063e04e7341116100e9578063e04e7341146107f8578063e43252d71461080b578063e438c4b71461081e578063e722befe1461083157600080fd5b8063cab208081461079b578063cea55f57146107a3578063d7648013146107ac578063dd62ed3e146107bf57600080fd5b8063b6b55f2511610192578063bf3759b511610161578063bf3759b514610764578063c3535b521461076c578063c533683514610775578063c822adda1461078857600080fd5b8063b6b55f2514610718578063b8dc491b1461072b578063bdc8144b1461073e578063bdcf36bb1461075157600080fd5b8063a457c2d7116101ce578063a457c2d7146106cc578063a9059cbb146106df578063ac579b77146106f2578063b22439f51461070557600080fd5b80639ec5a8941461069e578063a0e4af9a146106b1578063a1d9bafc146106b957600080fd5b80633e9dc762116102d9578063772d2312116102775780638da5cb5b116102465780638da5cb5b1461064657806395d89b411461066b5780639666b83b146106735780639b19251a1461067b57600080fd5b8063772d2312146106055780637a73964c1461060d5780638ab1d681146106205780638c3d78191461063357600080fd5b80635cb44e25116102b35780635cb44e25146105ae5780636cb56d19146105c157806370a08231146105d4578063715018a6146105fd57600080fd5b80633e9dc76214610570578063441a3e70146105885780634757a1561461059b57600080fd5b806315712216116103515780633629c8de116103205780633629c8de146104ac57806339509351146104b557806339ebf823146104c85780633d68175c1461056857600080fd5b8063157122161461044d57806318160ddd1461046057806323b872dd14610468578063313ce5671461047b57600080fd5b8063095ea7b31161038d578063095ea7b3146103ed5780630c6b2cbf146104105780630dd21b6c14610430578063112c1f9b1461044557600080fd5b806301ac145b146103b457806301e1d114146103d057806306fdde03146103d8575b600080fd5b6103bd60165481565b6040519081526020015b60405180910390f35b6103bd6108dc565b6103e06108eb565b6040516103c79190614c87565b6104006103fb3660046149ab565b61097d565b60405190151581526020016103c7565b6103bd61041e3660046148fb565b60096020526000908152604090205481565b61044361043e3660046149d6565b610994565b005b6103bd610d8b565b61044361045b3660046148fb565b610d96565b6004546103bd565b61040061047636600461496b565b610e15565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016103c7565b6103bd60125481565b6104006104c33660046149ab565b610ec1565b6105246104d63660046148fb565b6008602081905260009182526040909120805460018201546002830154600384015460048501546005860154600687015460078801549790980154959760ff90951696939592949193909289565b60408051998a5297151560208a0152968801959095526060870193909352608086019190915260a085015260c084015260e0830152610100820152610120016103c7565b6103bd610efd565b336000908152600860205260409020600601546103bd565b6103bd610596366004614bd1565b610f32565b6104436105a93660046149ab565b6115d3565b6104006105bc366004614bd1565b611750565b6104436105cf366004614933565b611834565b6103bd6105e23660046148fb565b6001600160a01b031660009081526002602052604090205490565b610443611bfc565b6103bd600581565b61044361061b366004614b03565b611c32565b61044361062e3660046148fb565b611f51565b610443610641366004614ad3565b61200a565b6000546001600160a01b03165b6040516001600160a01b0390911681526020016103c7565b6103e06120ba565b6103bd6120c9565b6104006106893660046148fb565b60016020526000908152604090205460ff1681565b601554610653906001600160a01b031681565b6104436120d3565b6103bd6106c7366004614bf2565b61214a565b6104006106da3660046149ab565b612541565b6104006106ed3660046149ab565b6125da565b610443610700366004614a10565b6125e7565b6104436107133660046148fb565b612793565b6103bd610726366004614ad3565b6128f5565b610443610739366004614933565b612ae4565b61044361074c366004614ad3565b612c17565b6103bd61075f3660046148fb565b612c76565b6103bd612c81565b6103bd60115481565b601454610653906001600160a01b031681565b610653610796366004614ad3565b612c8c565b6103bd612cac565b6103bd600f5481565b6103bd6107ba3660046148fb565b612d89565b6103bd6107cd366004614933565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b6103bd610806366004614ad3565b612d94565b6104436108193660046148fb565b612d9f565b61044361082c3660046149ab565b612e5e565b61044361083f3660046149ab565b612f9c565b6104436108523660046148fb565b61310d565b6103bd60135481565b61044361086e3660046148fb565b613185565b610443610881366004614a80565b613220565b6104436108943660046148fb565b6133dd565b6104436108a73660046149ab565b6136a6565b6106537f000000000000000000000000000000000000000000000000000000000000000081565b6103bd60105481565b60006108e66137b8565b905090565b6060600580546108fa90614f10565b80601f016020809104026020016040519081016040528092919081815260200182805461092690614f10565b80156109735780601f1061094857610100808354040283529160200191610973565b820191906000526020600020905b81548152906001019060200180831161095657829003601f168201915b5050505050905090565b600061098a338484613860565b5060015b92915050565b6000546001600160a01b031633146109c75760405162461bcd60e51b81526004016109be90614cba565b60405180910390fd5b6000600a6109d760016005614ecd565b600581106109f557634e487b7160e01b600052603260045260246000fd5b01546001600160a01b031614610a575760405162461bcd60e51b815260206004820152602160248201527f61646453747261746567793a203e204d4158494d554d5f5354524154454749456044820152605360f81b60648201526084016109be565b6001600160a01b038416610aad5760405162461bcd60e51b815260206004820152601860248201527f61646453747261746567793a206164647265737328307829000000000000000060448201526064016109be565b6001600160a01b03841660009081526008602052604090206001015460ff1615610b195760405162461bcd60e51b815260206004820152601760248201527f61646453747261746567793a202161637469766174656400000000000000000060448201526064016109be565b836001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b5257600080fd5b505afa158015610b66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8a9190614917565b6001600160a01b0316306001600160a01b031614610be05760405162461bcd60e51b815260206004820152601360248201527218591914dd1c985d1959de4e88085d985d5b1d606a1b60448201526064016109be565b610bec6004600a614e02565b83600f54610bfa9190614d7b565b1115610c485760405162461bcd60e51b815260206004820152601d60248201527f61646453747261746567793a2064656274526174696f203e203130302500000060448201526064016109be565b80821115610c915760405162461bcd60e51b81526020600482015260166024820152750c2c8c8a6e8e4c2e8cacef27440dad2dc407c40dac2f60531b60448201526064016109be565b6001600160a01b038416600081815260086020908152604091829020428082556001808301805460ff19169091179055600282018890556003820187905560048201869055600582015582518781529182018690529181018490529091907f3586d47464d021baa33927385fac3386971b58ccfe7f5dfe4c837d38f8910c759060600160405180910390a283600f6000828254610d2e9190614d7b565b90915550859050600a610d3f613984565b60058110610d5d57634e487b7160e01b600052603260045260246000fd5b0180546001600160a01b0319166001600160a01b0392909216919091179055610d846139e4565b5050505050565b60006108e633613ade565b6000546001600160a01b03163314610dc05760405162461bcd60e51b81526004016109be90614cba565b601480546001600160a01b0319166001600160a01b0383169081179091556040519081527f37fc88d041ee44a8c99855f5123550d8063586b8943d755664fe21853a37ded6906020015b60405180910390a150565b6000610e22848484613cef565b6001600160a01b038416600090815260036020908152604080832033845290915290205482811015610ea75760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016109be565b610eb48533858403613860565b60019150505b9392505050565b3360008181526003602090815260408083206001600160a01b0387168452909152812054909161098a918590610ef8908690614d7b565b613860565b60006108e6610f2d7f0000000000000000000000000000000000000000000000000000000000000000600a614df6565b613ebf565b600060026007541415610f575760405162461bcd60e51b81526004016109be90614cef565b6002600755610f686004600a614e02565b821115610fb75760405162461bcd60e51b815260206004820152601960248201527f77697468647261773a205f6d61784c6f7373203e20313030250000000000000060448201526064016109be565b600083116110005760405162461bcd60e51b8152602060048201526016602482015275077697468647261773a205f736861726573203d3d20360541b60448201526064016109be565b336000908152600260205260408120549060001985146110205784611031565b336000908152600260205260409020545b9050818111156110835760405162461bcd60e51b815260206004820152601e60248201527f77697468647261772c20736861726573203e207573657242616c616e6365000060448201526064016109be565b600061108e82613ebf565b6040516370a0823160e01b81523060048201529091507f0000000000000000000000000000000000000000000000000000000000000000906000906001600160a01b038316906370a082319060240160206040518083038186803b1580156110f557600080fd5b505afa158015611109573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112d9190614aeb565b83111561151f576040805160a0810191829052600091600a9060059082845b81546001600160a01b0316815260019091019060200180831161114c575050505050905060005b600581101561140657600082826005811061119e57634e487b7160e01b600052603260045260246000fd5b602002015190506001600160a01b0381166111b95750611406565b6040516370a0823160e01b81523060048201526000906001600160a01b038716906370a082319060240160206040518083038186803b1580156111fb57600080fd5b505afa15801561120f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112339190614aeb565b9050808711611243575050611406565b600061124f8289614ecd565b6001600160a01b038416600090815260086020526040902060068101549192509061127b908390613ef6565b91508161128b57505050506113f4565b604051632e1a7d4d60e01b8152600481018390526000906001600160a01b03861690632e1a7d4d90602401602060405180830381600087803b1580156112d057600080fd5b505af11580156112e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113089190614aeb565b6040516370a0823160e01b815230600482015290915060009085906001600160a01b038c16906370a082319060240160206040518083038186803b15801561134f57600080fd5b505afa158015611363573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113879190614aeb565b6113919190614ecd565b905081156113bb576113a3828c614ecd565b9a506113af828a614d7b565b98506113bb8683613f0c565b808360060160008282546113cf9190614ecd565b9250508190555080601060008282546113e89190614ecd565b90915550505050505050505b806113fe81614f45565b915050611173565b506040516370a0823160e01b81523060048201526000906001600160a01b038516906370a082319060240160206040518083038186803b15801561144957600080fd5b505afa15801561145d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114819190614aeb565b9050808511156114a3579350836114a061149b8483614d7b565b613fca565b95505b6114af6004600a614e02565b6114b98487614d7b565b6114c3908b614eae565b6114cd9190614d93565b83111561151c5760405162461bcd60e51b815260206004820152601860248201527f77697468647261773a206c6f7373203e206d61786c6f7373000000000000000060448201526064016109be565b50505b6115293385613ff0565b61153d6001600160a01b038316338561413e565b60006115498285614d7b565b336000908152600960205260409020546115639190614d7b565b33600081815260096020908152604091829020849055815188815290810189905290810185905260608101839052919250907fab0db1f1d6053f0c5e9e0333bd02e8e46a6996df63ddf355481cf233cea5ae279060800160405180910390a2505060016007555095945050505050565b6000546001600160a01b031633146115fd5760405162461bcd60e51b81526004016109be90614cba565b6001600160a01b0382166000908152600860205260409020546116765760405162461bcd60e51b815260206004820152602b60248201527f75706461746553747261746567794d617844656274506572486172766573743a60448201526a08085858dd1a5d985d195960aa1b60648201526084016109be565b6001600160a01b0382166000908152600860205260409020600301548110156116f45760405162461bcd60e51b815260206004820152602a60248201527f75706461746553747261746567794d617844656274506572486172766573743a604482015269040dad2dc407c40dac2f60b31b60648201526084016109be565b6001600160a01b03821660008181526008602052604090819020600401839055517fd57caa6337591e8c2fe908a4fb0bb9c4bcaf42a657ee20be2717ef81aa4f19aa906117449084815260200190565b60405180910390a25050565b600061175a613984565b83106117985760405162461bcd60e51b815260206004820152600d60248201526c0d2dcecc2d8d2c840d2dcc8caf609b1b60448201526064016109be565b600a83600581106117b957634e487b7160e01b600052603260045260246000fd5b015460405163ed882c2b60e01b8152600481018490526001600160a01b039091169063ed882c2b9060240160206040518083038186803b1580156117fc57600080fd5b505afa158015611810573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eba9190614ab3565b6000546001600160a01b0316331461185e5760405162461bcd60e51b81526004016109be90614cba565b6001600160a01b0381166118aa5760405162461bcd60e51b81526020600482015260136024820152720dad2cee4c2e8caa6e8e4c2e8cacef2744060f606b1b60448201526064016109be565b6001600160a01b03821660009081526008602052604090205461191e5760405162461bcd60e51b815260206004820152602660248201527f6d69677261746553747261746567793a206f6c6456657273696f6e20216163746044820152651a5d985d195960d21b60648201526084016109be565b6001600160a01b03821660009081526008602052604090206001015460ff166119955760405162461bcd60e51b815260206004820152602360248201527f6d69677261746553747261746567793a206f6c6456657273696f6e202161637460448201526269766560e81b60648201526084016109be565b6001600160a01b03811660009081526008602052604090205415611a095760405162461bcd60e51b815260206004820152602560248201527f6d69677261746553747261746567793a206e657756657273696f6e20616374696044820152641d985d195960da1b60648201526084016109be565b6001600160a01b03821660009081526008602052604081206002810154600f805492939192909190611a3c908490614d7b565b90915550506001600160a01b0382811660008181526008602081905260408083204281556001808201805460ff19169091179055600287810154908201556003808801549082015560048088015481830155600580890154908301556006820185905560078201859055928101939093555163ce5494bb60e01b8152908101929092529185169063ce5494bb90602401600060405180830381600087803b158015611ae657600080fd5b505af1158015611afa573d6000803e3d6000fd5b505060006006850181905560038501819055600485018190556040516001600160a01b038088169450881692507feb6703dc9f9bdf90f637c0ef7b9dd7a08c095983cf29923c90d98f345dd95caf9190a3611b54846141a1565b60005b6005811015610d8457846001600160a01b0316600a8260058110611b8b57634e487b7160e01b600052603260045260246000fd5b01546001600160a01b03161415611be65783600a8260058110611bbe57634e487b7160e01b600052603260045260246000fd5b0180546001600160a01b0319166001600160a01b039290921691909117905550611bf8915050565b80611bf081614f45565b915050611b57565b5050565b6000546001600160a01b03163314611c265760405162461bcd60e51b81526004016109be90614cba565b611c306000614228565b565b60026007541415611c555760405162461bcd60e51b81526004016109be90614cef565b60026007553360009081526001602052604090205460ff16611caa5760405162461bcd60e51b815260206004820152600e60248201526d1bdb9b1e481dda1a5d195b1a5cdd60921b60448201526064016109be565b611cb2613984565b8310611cf05760405162461bcd60e51b815260206004820152600d60248201526c0d2dcecc2d8d2c840d2dcc8caf609b1b60448201526064016109be565b6000600a8460058110611d1357634e487b7160e01b600052603260045260246000fd5b01546001600160a01b031690506000611d2a6137b8565b905060005b8451811015611e7657826001600160a01b0316637f0c8027868381518110611d6757634e487b7160e01b600052603260045260246000fd5b6020026020010151868481518110611d8f57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b8152600401611dc89291906001600160a01b03929092168252602082015260400190565b60206040518083038186803b158015611de057600080fd5b505afa158015611df4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e189190614ab3565b611e645760405162461bcd60e51b815260206004820152601a60248201527f7374726174656779486172766573743a2021616d6d436865636b00000000000060448201526064016109be565b80611e6e81614f45565b915050611d2f565b50816001600160a01b0316634641257d6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611eb257600080fd5b505af1158015611ec6573d6000803e3d6000fd5b505050506000611ed46137b8565b905060008082841115611ef657611eeb8385614ecd565b905060019150611f07565b611f008484614ecd565b9050600091505b604080518315158152602081018390527f563299b3cea13d0c7eaf34be3ef046674da9c4515ccb7168d0b6b76ee51de999910160405180910390a150506001600755505050505050565b6000546001600160a01b03163314611f7b5760405162461bcd60e51b81526004016109be90614cba565b6001600160a01b038116611fc15760405162461bcd60e51b815260206004820152600d60248201526c0aed0d2e8ca98d2e6e8744060f609b1b60448201526064016109be565b6001600160a01b038116600081815260016020526040808220805460ff19169055517f9e9499495e2efd848d33cb197bde94612c1ec36f30605b60d445511e056069e19190a250565b6000546001600160a01b031633146120345760405162461bcd60e51b81526004016109be90614cba565b610bb881106120855760405162461bcd60e51b815260206004820152601760248201527f7365745661756c744665653a205f666565203e2033302500000000000000000060448201526064016109be565b60168190556040518181527f01fa6949e7a4e70ebcf603589526b183cfd84c0023e87018cf99f1d661a72bbc90602001610e0a565b6060600680546108fa90614f10565b60006108e6613984565b3360009081526008602052604090206001015460ff166121415760405162461bcd60e51b815260206004820152602360248201527f7265766f6b6553747261746567793a207374726174656779206e6f742061637460448201526269766560e81b60648201526084016109be565b611c30336141a1565b336000908152600860205260408120600181015460ff166121a25760405162461bcd60e51b81526020600482015260126024820152711c995c1bdc9d0e88085858dd1a5d985d195960721b60448201526064016109be565b7f00000000000000000000000000000000000000000000000000000000000000006121cd8487614d7b565b6040516370a0823160e01b81523360048201526001600160a01b038316906370a082319060240160206040518083038186803b15801561220c57600080fd5b505afa158015612220573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122449190614aeb565b10156122ab5760405162461bcd60e51b815260206004820152603060248201527f7265706f72743a2062616c616e636528737472617465677929203c205f67616960448201526f1b880ac817d919589d14185e5b595b9d60821b60648201526084016109be565b84156122bb576122bb3386613f0c565b60006016541180156122cd5750600086115b1561230c5760155461230a906001600160a01b03166122ee6004600a614e02565b6016546122fb908a614eae565b6123059190614d93565b614278565b505b85826007015461231c9190614d7b565b6007830155600061232c3361431e565b9050600061233a8683613ef6565b9050801561237f578084600601546123529190614ecd565b8460060181905550806010600082825461236c9190614ecd565b9091555061237c90508183614ecd565b91505b600061238a33613ade565b905080156123c557808560060160008282546123a69190614d7b565b9250508190555080601060008282546123bf9190614d7b565b90915550505b60006123d1838b614d7b565b9050818110156123ff576123fa336123e98385614ecd565b6001600160a01b038816919061413e565b612428565b818111156124285761242833306124168585614ecd565b6001600160a01b038916929190614391565b42601181905560058701556007860154600887015460068801546002890154604080518f8152602081018f90529081018890526060810194909452608084019290925260a083015260c0820184905260e082015233907fdd2147c7c786ce7a36d0010e0b96b77cafac9d0a6802f882d2c2255777d744b4906101000160405180910390a2600286015461253357336001600160a01b031663efbb5cb06040518163ffffffff1660e01b815260040160206040518083038186803b1580156124ee57600080fd5b505afa158015612502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125269190614aeb565b9650505050505050610eba565b839650505050505050610eba565b3360009081526003602090815260408083206001600160a01b0386168452909152812054828110156125c35760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016109be565b6125d03385858403613860565b5060019392505050565b600061098a338484613cef565b6000546001600160a01b031633146126115760405162461bcd60e51b81526004016109be90614cba565b60058111156126735760405162461bcd60e51b815260206004820152602860248201527f7365745769746864726177616c51756575653a203e204d4158494d554d5f5354604482015267524154454749455360c01b60648201526084016109be565b60005b600581101561278e578181106126cd576000600a82600581106126a957634e487b7160e01b600052603260045260246000fd5b0180546001600160a01b0319166001600160a01b0392909216919091179055612743565b8282828181106126ed57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061270291906148fb565b600a826005811061272357634e487b7160e01b600052603260045260246000fd5b0180546001600160a01b0319166001600160a01b03929092169190911790555b7fc24e80a5fd747b0bbfa6f9a1d7c50f98ab024556c97d3bd6a5cf651445e6b3dd8383604051612774929190614c39565b60405180910390a18061278681614f45565b915050612676565b505050565b6000546001600160a01b03163314806127bb57503360009081526001602052604090205460ff165b6128195760405162461bcd60e51b815260206004820152602960248201527f72656d6f7665537472617465677946726f6d51756575653a20216f776e65727c6044820152681dda1a5d195b1a5cdd60ba1b60648201526084016109be565b60005b6005811015611bf857816001600160a01b0316600a826005811061285057634e487b7160e01b600052603260045260246000fd5b01546001600160a01b031614156128e3576000600a826005811061288457634e487b7160e01b600052603260045260246000fd5b0180546001600160a01b0319166001600160a01b03929092169190911790556128ab6139e4565b6040516001600160a01b038316907fdb6049adb19dec12ff8b7422e722c7d155939bb8080c2ba3f9c8a3b0443c7ad490600090a25050565b806128ed81614f45565b91505061281c565b60006002600754141561291a5760405162461bcd60e51b81526004016109be90614cef565b6002600755816129645760405162461bcd60e51b815260206004820152601560248201527406465706f7369743a205f616d6f756e7420213e203605c1b60448201526064016109be565b601354826129706137b8565b61297a9190614d7b565b11156129c15760405162461bcd60e51b815260206004820152601660248201527519195c1bdcda5d0e880859195c1bdcda5d131a5b5a5d60521b60448201526064016109be565b33600090815260096020526040902054821115612a205760405162461bcd60e51b815260206004820152601760248201527f6465706f7369743a202175736572416c6c6f77616e636500000000000000000060448201526064016109be565b6000612a2c3384614278565b90507f0000000000000000000000000000000000000000000000000000000000000000612a646001600160a01b038216333087614391565b33600090815260096020526040812054612a7f908690614ecd565b336000818152600960209081526040918290208490558151898152908101879052908101839052919250907f4b2bcb0ca50531683faa51870e1018aa0d7272c7f2acc5399389b0c0493865d99060600160405180910390a25050600160075592915050565b6000546001600160a01b03163314612b0e5760405162461bcd60e51b81526004016109be90614cba565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612b875760405162461bcd60e51b81526020600482015260146024820152731cddd9595c0e881d1bdad95b880f4f481dd85b9d60621b60448201526064016109be565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a082319060240160206040518083038186803b158015612bc957600080fd5b505afa158015612bdd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c019190614aeb565b905061278e6001600160a01b038416838361413e565b6000546001600160a01b03163314612c415760405162461bcd60e51b81526004016109be90614cba565b60138190556040518181527f90ab2effdb5b095500fdf80ad1d4c418e957095fb6e475ff03576beefc97cae790602001610e0a565b600061098e8261431e565b60006108e63361431e565b600a8160058110612c9c57600080fd5b01546001600160a01b0316905081565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a082319060240160206040518083038186803b158015612d1057600080fd5b505afa158015612d24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d489190614aeb565b905060005b612d55613984565b811015612d8357612d65816143c9565b612d6f9083614d7b565b915080612d7b81614f45565b915050612d4d565b50919050565b600061098e82613ade565b600061098e82614471565b6000546001600160a01b03163314612dc95760405162461bcd60e51b81526004016109be90614cba565b6001600160a01b038116612e0f5760405162461bcd60e51b815260206004820152600d60248201526c0aed0d2e8ca98d2e6e8744060f609b1b60448201526064016109be565b6001600160a01b0381166000818152600160208190526040808320805460ff1916909217909155517f4e3d8c117d484081f7268ed79cded71ad42979b92feb5f8f7f9824ac5cbfe3759190a250565b6001600160a01b03821660009081526008602052604090206001015460ff16612ec15760405162461bcd60e51b815260206004820152601560248201527473657444656274526174696f3a202161637469766560581b60448201526064016109be565b6000546001600160a01b0316331480612ee957503360009081526001602052604090205460ff165b612f355760405162461bcd60e51b815260206004820152601860248201527f73657444656274526174696f3a202177686974656c697374000000000000000060448201526064016109be565b612f3f82826144bf565b612f4b6004600a614e02565b600f541115611bf85760405162461bcd60e51b815260206004820152601e60248201527f73657444656274526174696f3a2064656274526174696f203e2031303025000060448201526064016109be565b6000546001600160a01b03163314612fc65760405162461bcd60e51b81526004016109be90614cba565b6001600160a01b03821660009081526008602052604090205461303f5760405162461bcd60e51b815260206004820152602b60248201527f75706461746553747261746567794d696e44656274506572486172766573743a60448201526a08085858dd1a5d985d195960aa1b60648201526084016109be565b6001600160a01b0382166000908152600860205260409020600401548111156130bd5760405162461bcd60e51b815260206004820152602a60248201527f75706461746553747261746567794d696e44656274506572486172766573743a604482015269040dad2dc407c40dac2f60b31b60648201526084016109be565b6001600160a01b03821660008181526008602052604090819020600301839055517f97d937f34d1eadd7b324f774a47165e95470edd473866a60d2162850ca578237906117449084815260200190565b6000546001600160a01b031633146131375760405162461bcd60e51b81526004016109be90614cba565b601580546001600160a01b0319166001600160a01b0383169081179091556040519081527f47d7c5d0e54dad44a791a37aaafbe848a5b4e4fb8c64462d67fa949c7e10622290602001610e0a565b6000546001600160a01b031633146131af5760405162461bcd60e51b81526004016109be90614cba565b6001600160a01b0381166132145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109be565b61321d81614228565b50565b6000546001600160a01b031633148061324857503360009081526001602052604090205460ff165b6132945760405162461bcd60e51b815260206004820152601960248201527f73657444656274526174696f733a202177686974656c6973740000000000000060448201526064016109be565b6005815111156132f25760405162461bcd60e51b815260206004820152602360248201527f73657444656274526174696f733a203e204d4158494d554d5f5354524154454760448201526249455360e81b60648201526084016109be565b60008060005b600581101561337f57600a816005811061332257634e487b7160e01b600052603260045260246000fd5b01546001600160a01b03169250826133395761337f565b83818151811061335957634e487b7160e01b600052603260045260246000fd5b6020026020010151915061336d83836144bf565b8061337781614f45565b9150506132f8565b5061338c6004600a614e02565b600f54111561278e5760405162461bcd60e51b815260206004820152601f60248201527f73657444656274526174696f733a2064656274526174696f203e20313030250060448201526064016109be565b6000546001600160a01b031633148061340557503360009081526001602052604090205460ff165b61345d5760405162461bcd60e51b8152602060048201526024808201527f6164645374726174656779546f51756575653a20216f776e65727c77686974656044820152631b1a5cdd60e21b60648201526084016109be565b6001600160a01b0381166000908152600860205260409020546134c25760405162461bcd60e51b815260206004820152601e60248201527f6164645374726174656779546f51756575653a2021616374697661746564000060448201526064016109be565b6000600a6134d260016005614ecd565b600581106134f057634e487b7160e01b600052603260045260246000fd5b01546001600160a01b0316146135485760405162461bcd60e51b815260206004820152601e60248201527f6164645374726174656779546f51756575653a2071756575652066756c6c000060448201526064016109be565b60005b600581101561361a576000600a826005811061357757634e487b7160e01b600052603260045260246000fd5b01546001600160a01b031690508061358f575061361a565b806001600160a01b0316836001600160a01b031614156136075760405162461bcd60e51b815260206004820152602d60248201527f6164645374726174656779546f51756575653a20737472617465677920616c7260448201526c6561647920696e20717565756560981b60648201526084016109be565b508061361281614f45565b91505061354b565b5080600a61362a60016005614ecd565b6005811061364857634e487b7160e01b600052603260045260246000fd5b0180546001600160a01b0319166001600160a01b039290921691909117905561366f6139e4565b6040516001600160a01b038216907f9bc825e07ecd66a8b4fa4d5a982ca78e22dce2099ea4348ff8b5297b4afac26a90600090a250565b6014546001600160a01b031633146137105760405162461bcd60e51b815260206004820152602760248201527f73657455736572416c6c6f77616e63653a206d73672e73656e64657220213d206044820152663137bab731b2b960c91b60648201526084016109be565b61373b7f0000000000000000000000000000000000000000000000000000000000000000600a614df6565b6137459082614eae565b6001600160a01b0383166000908152600960205260408120805490919061376d908490614d7b565b9091555050604080516001600160a01b0384168152602081018390527f9028c777fc890e3be2f623e0bc932c51e841f34385fcd65571a2e744e5f63e8e910160405180910390a15050565b6010546040516370a0823160e01b8152306004820152600091906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a082319060240160206040518083038186803b15801561381e57600080fd5b505afa158015613832573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138569190614aeb565b6108e69190614d7b565b6001600160a01b0383166138c25760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016109be565b6001600160a01b0382166139235760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016109be565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000805b60058110156139dc576000600a82600581106139b457634e487b7160e01b600052603260045260246000fd5b01546001600160a01b031614156139ca57919050565b806139d481614f45565b915050613988565b506005905090565b6000805b6005811015611bf8576000600a8260058110613a1457634e487b7160e01b600052603260045260246000fd5b01546001600160a01b0316905080613a3857613a31600184614d7b565b9250613acb565b8215613acb5780600a613a4b8585614ecd565b60058110613a6957634e487b7160e01b600052603260045260246000fd5b0180546001600160a01b0319166001600160a01b03929092169190911790556000600a8360058110613aab57634e487b7160e01b600052603260045260246000fd5b0180546001600160a01b0319166001600160a01b03929092169190911790555b5080613ad681614f45565b9150506139e8565b6001600160a01b038116600090815260086020818152604080842081516101208101835281548152600182015460ff161515938101939093526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301529091015461010082015281613b686137b8565b90506000613b786004600a614e02565b82600f54613b869190614eae565b613b909190614d93565b6010549091506000613ba46004600a614e02565b848660400151613bb49190614eae565b613bbe9190614d93565b60c08601516060870151608088015192935090917f00000000000000000000000000000000000000000000000000000000000000008385111580613c025750858711155b15613c18575060009a9950505050505050505050565b6000613c248587614ecd565b9050613c3981613c34898b614ecd565b613ef6565b6040516370a0823160e01b8152306004820152909150613cb99082906001600160a01b038516906370a082319060240160206040518083038186803b158015613c8157600080fd5b505afa158015613c95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c349190614aeb565b905083811015613cd5575060009b9a5050505050505050505050565b613cdf8184613ef6565b9c9b505050505050505050505050565b6001600160a01b038316613d535760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016109be565b6001600160a01b038216613db55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016109be565b6001600160a01b03831660009081526002602052604090205481811015613e2d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016109be565b6001600160a01b03808516600090815260026020526040808220858503905591851681529081208054849290613e64908490614d7b565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613eb091815260200190565b60405180910390a35b50505050565b600080613ecb60045490565b905080613ed9575090919050565b80613ee26137b8565b613eec9085614eae565b610eba9190614d93565b6000818310613f055781610eba565b5090919050565b6001600160a01b03821660009081526008602052604090206006810154821115613f785760405162461bcd60e51b815260206004820152601e60248201527f5f7265706f72744c6f73733a20746f74616c44656274203e3d206c6f7373000060448201526064016109be565b81816008016000828254613f8c9190614d7b565b9250508190555081816006016000828254613fa79190614ecd565b925050819055508160106000828254613fc09190614ecd565b9091555050505050565b600080613fd56137b8565b90508015613fe75780613ee260045490565b50600092915050565b6001600160a01b0382166140505760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016109be565b6001600160a01b038216600090815260026020526040902054818110156140c45760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016109be565b6001600160a01b03831660009081526002602052604081208383039055600480548492906140f3908490614ecd565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6040516001600160a01b03831660248201526044810182905261278e90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614563565b6001600160a01b038116600090815260086020526040812060020154600f8054919290916141d0908490614ecd565b90915550506001600160a01b03811660008181526008602052604080822060028101839055600101805460ff19169055517fc3445f0d5a9ec5b7494384e18eb737b20cc1f3ab475b478e10b8739e4cd436e59190a250565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000808061428560045490565b905080156142b0576142956137b8565b61429f8286614eae565b6142a99190614d93565b91506142b4565b8391505b8161430c5760405162461bcd60e51b815260206004820152602260248201527f5f6973737565536861726573466f72416d6f756e743a20736861726573203d3d604482015261020360f41b60648201526084016109be565b6143168583614635565b509392505050565b6001600160a01b0381166000908152600860205260408120816143436004600a614e02565b61434b6137b8565b836002015461435a9190614eae565b6143649190614d93565b600683015490915081811161437e57506000949350505050565b6143888282614ecd565b95945050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052613eb99085906323b872dd60e01b9060840161416a565b6000600a82600581106143ec57634e487b7160e01b600052603260045260246000fd5b0160009054906101000a90046001600160a01b03166001600160a01b031663efbb5cb06040518163ffffffff1660e01b815260040160206040518083038186803b15801561443957600080fd5b505afa15801561444d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098e9190614aeb565b60008060086000600a856005811061449957634e487b7160e01b600052603260045260246000fd5b01546001600160a01b031681526020810191909152604001600020600601549392505050565b6001600160a01b038216600090815260086020526040812060020154600f8054919290916144ee908490614ecd565b90915550506001600160a01b0382166000908152600860205260408120600201829055600f8054839290614523908490614d7b565b90915550506040518181526001600160a01b038316907f20026fcfbe8b4c825d73835e062d785add204e5b6dc6c7672c82edfb48195e8190602001611744565b60006145b8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166147149092919063ffffffff16565b80519091501561278e57808060200190518101906145d69190614ab3565b61278e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016109be565b6001600160a01b03821661468b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016109be565b806004600082825461469d9190614d7b565b90915550506001600160a01b038216600090815260026020526040812080548392906146ca908490614d7b565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6060614723848460008561472b565b949350505050565b60608247101561478c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016109be565b843b6147da5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109be565b600080866001600160a01b031685876040516147f69190614c1d565b60006040518083038185875af1925050503d8060008114614833576040519150601f19603f3d011682016040523d82523d6000602084013e614838565b606091505b5091509150614848828286614853565b979650505050505050565b60608315614862575081610eba565b8251156148725782518084602001fd5b8160405162461bcd60e51b81526004016109be9190614c87565b600082601f83011261489c578081fd5b813560206148b16148ac83614d57565b614d26565b80838252828201915082860187848660051b89010111156148d0578586fd5b855b858110156148ee578135845292840192908401906001016148d2565b5090979650505050505050565b60006020828403121561490c578081fd5b8135610eba81614f8c565b600060208284031215614928578081fd5b8151610eba81614f8c565b60008060408385031215614945578081fd5b823561495081614f8c565b9150602083013561496081614f8c565b809150509250929050565b60008060006060848603121561497f578081fd5b833561498a81614f8c565b9250602084013561499a81614f8c565b929592945050506040919091013590565b600080604083850312156149bd578182fd5b82356149c881614f8c565b946020939093013593505050565b600080600080608085870312156149eb578081fd5b84356149f681614f8c565b966020860135965060408601359560600135945092505050565b60008060208385031215614a22578182fd5b823567ffffffffffffffff80821115614a39578384fd5b818501915085601f830112614a4c578384fd5b813581811115614a5a578485fd5b8660208260051b8501011115614a6e578485fd5b60209290920196919550909350505050565b600060208284031215614a91578081fd5b813567ffffffffffffffff811115614aa7578182fd5b6147238482850161488c565b600060208284031215614ac4578081fd5b81518015158114610eba578182fd5b600060208284031215614ae4578081fd5b5035919050565b600060208284031215614afc578081fd5b5051919050565b600080600060608486031215614b17578283fd5b8335925060208085013567ffffffffffffffff80821115614b36578485fd5b818701915087601f830112614b49578485fd5b8135614b576148ac82614d57565b8082825285820191508585018b878560051b8801011115614b76578889fd5b8895505b83861015614ba1578035614b8d81614f8c565b835260019590950194918601918601614b7a565b50965050506040870135925080831115614bb9578384fd5b5050614bc78682870161488c565b9150509250925092565b60008060408385031215614be3578182fd5b50508035926020909101359150565b600080600060608486031215614c06578081fd5b505081359360208301359350604090920135919050565b60008251614c2f818460208701614ee4565b9190910192915050565b60208082528181018390526000908460408401835b86811015614c7c578235614c6181614f8c565b6001600160a01b031682529183019190830190600101614c4e565b509695505050505050565b6020815260008251806020840152614ca6816040850160208701614ee4565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715614d4f57614d4f614f76565b604052919050565b600067ffffffffffffffff821115614d7157614d71614f76565b5060051b60200190565b60008219821115614d8e57614d8e614f60565b500190565b600082614dae57634e487b7160e01b81526012600452602481fd5b500490565b600181815b80851115614dee578160001904821115614dd457614dd4614f60565b80851615614de157918102915b93841c9390800290614db8565b509250929050565b6000610eba8383614e0d565b6000610eba60ff8416835b600082614e1c5750600161098e565b81614e295750600061098e565b8160018114614e3f5760028114614e4957614e65565b600191505061098e565b60ff841115614e5a57614e5a614f60565b50506001821b61098e565b5060208310610133831016604e8410600b8410161715614e88575081810a61098e565b614e928383614db3565b8060001904821115614ea657614ea6614f60565b029392505050565b6000816000190483118215151615614ec857614ec8614f60565b500290565b600082821015614edf57614edf614f60565b500390565b60005b83811015614eff578181015183820152602001614ee7565b83811115613eb95750506000910152565b600181811c90821680614f2457607f821691505b60208210811415612d8357634e487b7160e01b600052602260045260246000fd5b6000600019821415614f5957614f59614f60565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461321d57600080fdfea26469706673582212209d379538344648dab857e8abf39d5e40eda4bc45dd20558f10d37632961bc96664736f6c63430008040033000000000000000000000000c7198437980c041c805a1edcba50c1ce5db9511800000000000000000000000060861b5afdf4b6e449dd194a6b54d6a64dfe2d81