0 txs
734 calls
constructor
constructor(address _fxUSD, address _fxBASE, address _counterparty, address _configuration)
functions
accumulatedPoolCloseFees
viewfunction accumulatedPoolCloseFees(address) view returns (uint256)
accumulatedPoolMiscFees
viewfunction accumulatedPoolMiscFees(address) view returns (uint256)
accumulatedPoolOpenFees
viewfunction accumulatedPoolOpenFees(address) view returns (uint256)
allocations
viewfunction allocations(address) view returns (address strategy, uint96 capacity)
ASSET_MANAGER_ROLE
viewfunction ASSET_MANAGER_ROLE() view returns (bytes32)
closeRevenuePool
viewfunction closeRevenuePool() view returns (address)
configuration
viewfunction configuration() view returns (address)
counterparty
viewfunction counterparty() view returns (address)
DEBT_REDUCER_ROLE
viewfunction DEBT_REDUCER_ROLE() view returns (bytes32)
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
EMERGENCY_ROLE
viewfunction EMERGENCY_ROLE() view returns (bytes32)
flashFee
viewfunction flashFee(address, uint256 amount) view returns (uint256)
fxBASE
viewfunction fxBASE() view returns (address)
fxUSD
viewfunction fxUSD() view returns (address)
getFlashLoanFeeRatio
viewfunction getFlashLoanFeeRatio() view returns (uint256)
getFundingExpenseRatio
viewfunction getFundingExpenseRatio() view returns (uint256)
getHarvesterRatio
viewfunction getHarvesterRatio() view returns (uint256)
getLiquidationExpenseRatio
viewfunction getLiquidationExpenseRatio() view returns (uint256)
getPoolInfo
viewfunction getPoolInfo(address pool) view returns (uint256 collateralCapacity, uint256 collateralBalance, uint256 rawCollateral, uint256 debtCapacity, uint256 debtBalance)
getRedeemFeeRatio
viewfunction getRedeemFeeRatio() view returns (uint256)
getRewardsExpenseRatio
viewfunction getRewardsExpenseRatio() view returns (uint256)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
HARVESTER_ROLE
viewfunction HARVESTER_ROLE() view returns (bytes32)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
maxFlashLoan
viewfunction maxFlashLoan(address token) view returns (uint256)
miscRevenuePool
viewfunction miscRevenuePool() view returns (address)
openRevenuePool
viewfunction openRevenuePool() view returns (address)
paused
viewfunction paused() view returns (bool)
permissionedLiquidationThreshold
viewfunction permissionedLiquidationThreshold() view returns (uint256)
reservePool
viewfunction reservePool() view returns (address)
rewardSplitter
viewfunction rewardSplitter(address) view returns (address)
shortBorrowCapacityRatio
viewfunction shortBorrowCapacityRatio(address) view returns (uint256)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
tokenRates
viewfunction tokenRates(address) view returns (uint96 scalar, address rateProvider)
treasury
viewfunction treasury() view returns (address)
alloc
nonpayablefunction alloc(address asset, address strategy, uint96 capacity)
borrow
nonpayablefunction borrow(address longPool, address shortPool, uint256 amount)
flashLoan
nonpayablefunction flashLoan(address receiver, address token, uint256 amount, bytes data) returns (bool)
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
harvest
nonpayablefunction harvest(address pool) returns (uint256 amountRewards, uint256 amountFunding)
initialize
nonpayablefunction initialize(address admin, uint256 _expenseRatio, uint256 _harvesterRatio, uint256 _flashLoanFeeRatio, address _treasury, address _revenuePool, address _reservePool)
kill
nonpayablefunction kill(address asset)
liquidate
nonpayablefunction liquidate(address pool, address receiver, uint256 maxFxUSD, uint256 maxStable) returns (uint256 colls, uint256 fxUSDUsed, uint256 stableUsed)
liquidateShortPool
nonpayablefunction liquidateShortPool(address longPool, address shortPool, uint256 amountFxUSD, uint256 totalBorrowed) returns (uint256 shortfall)
manage
nonpayablefunction manage(address asset, uint256 amount)
operate
nonpayablefunction operate(address pool, uint256 positionId, int256 newColl, int256 newDebt, bool useStable) returns (uint256)
operate
nonpayablefunction operate(address pool, uint256 positionId, int256 newColl, int256 newDebt) returns (uint256)
rebalance
nonpayablefunction rebalance(address pool, address receiver, int16 tick, uint256 maxFxUSD, uint256 maxStable) returns (uint256 colls, uint256 fxUSDUsed, uint256 stableUsed)
rebalance
nonpayablefunction rebalance(address pool, address receiver, uint256 maxFxUSD, uint256 maxStable) returns (uint256 colls, uint256 fxUSDUsed, uint256 stableUsed)
redeem
nonpayablefunction redeem(address pool, uint256 debts, uint256 minColls) returns (uint256 actualDebts, uint256 colls)
reduceDebt
nonpayablefunction reduceDebt(address pool, uint256 amount)
registerPool
nonpayablefunction registerPool(address pool, uint96 collateralCapacity, uint96 debtCapacity)
renounceRole
nonpayablefunction renounceRole(bytes32 role, address callerConfirmation)
repay
nonpayablefunction repay(address longPool, address shortPool, uint256 amount)
repayByCreditNote
nonpayablefunction repayByCreditNote(address longPool, address shortPool, uint256 amount)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
setPause
nonpayablefunction setPause(bool status)
updateCloseRevenuePool
nonpayablefunction updateCloseRevenuePool(address _newPool)
updateExpenseRatio
nonpayablefunction updateExpenseRatio(uint32 newRewardsRatio, uint32 newFundingRatio, uint32 newLiquidationRatio)
updateFlashLoanFeeRatio
nonpayablefunction updateFlashLoanFeeRatio(uint32 newRatio)
updateHarvesterRatio
nonpayablefunction updateHarvesterRatio(uint32 newRatio)
updateMiscRevenuePool
nonpayablefunction updateMiscRevenuePool(address _newPool)
updateOpenRevenuePool
nonpayablefunction updateOpenRevenuePool(address _newPool)
updatePoolCapacity
nonpayablefunction updatePoolCapacity(address pool, uint96 collateralCapacity, uint96 debtCapacity)
updateRateProvider
nonpayablefunction updateRateProvider(address token, address provider)
updateRedeemFeeRatio
nonpayablefunction updateRedeemFeeRatio(uint32 newRatio)
updateReservePool
nonpayablefunction updateReservePool(address _newReservePool)
updateShortBorrowCapacityRatio
nonpayablefunction updateShortBorrowCapacityRatio(address longPool, uint256 newRatio)
updateThreshold
nonpayablefunction updateThreshold(uint256 newThreshold)
updateTreasury
nonpayablefunction updateTreasury(address _newTreasury)
withdrawAccumulatedPoolFee
nonpayablefunction withdrawAccumulatedPoolFee(address[] pools)
events
Harvest
event Harvest(address indexed caller, address indexed pool, uint256 amountRewards, uint256 amountFunding, uint256 performanceFee, uint256 harvestBounty)
Initialized
event Initialized(uint64 version)
Liquidate
event Liquidate(address indexed pool, uint256 colls, uint256 fxUSDDebts, uint256 stableDebts)
Operate
event Operate(address indexed pool, uint256 indexed position, int256 deltaColls, int256 deltaDebts, uint256 protocolFees)
Paused
event Paused(address account)
Rebalance
event Rebalance(address indexed pool, uint256 colls, uint256 fxUSDDebts, uint256 stableDebts)
RebalanceTick
event RebalanceTick(address indexed pool, int16 indexed tick, uint256 colls, uint256 fxUSDDebts, uint256 stableDebts)
Redeem
event Redeem(address indexed pool, uint256 colls, uint256 debts, uint256 protocolFees)
ReduceDebt
event ReduceDebt(address indexed pool, uint256 amount)
RegisterPool
event RegisterPool(address indexed pool)
RoleAdminChanged
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)
RoleGranted
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)
RoleRevoked
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)
Unpaused
event Unpaused(address account)
UpdateCloseRevenuePool
event UpdateCloseRevenuePool(address indexed oldPool, address indexed newPool)
UpdateFlashLoanFeeRatio
event UpdateFlashLoanFeeRatio(uint256 oldRatio, uint256 newRatio)
UpdateFundingExpenseRatio
event UpdateFundingExpenseRatio(uint256 oldRatio, uint256 newRatio)
UpdateHarvesterRatio
event UpdateHarvesterRatio(uint256 oldRatio, uint256 newRatio)
UpdateLiquidationExpenseRatio
event UpdateLiquidationExpenseRatio(uint256 oldRatio, uint256 newRatio)
UpdateMiscRevenuePool
event UpdateMiscRevenuePool(address indexed oldPool, address indexed newPool)
UpdateOpenRevenuePool
event UpdateOpenRevenuePool(address indexed oldPool, address indexed newPool)
UpdatePermissionedLiquidationThreshold
event UpdatePermissionedLiquidationThreshold(uint256 oldThreshold, uint256 newThreshold)
UpdatePoolCapacity
event UpdatePoolCapacity(address indexed pool, uint256 collateralCapacity, uint256 debtCapacity)
UpdateRedeemFeeRatio
event UpdateRedeemFeeRatio(uint256 oldRatio, uint256 newRatio)
UpdateReservePool
event UpdateReservePool(address indexed oldReservePool, address indexed newReservePool)
UpdateRewardsExpenseRatio
event UpdateRewardsExpenseRatio(uint256 oldRatio, uint256 newRatio)
UpdateRewardSplitter
event UpdateRewardSplitter(address indexed pool, address indexed oldSplitter, address indexed newSplitter)
UpdateShortBorrowCapacityRatio
event UpdateShortBorrowCapacityRatio(address indexed longPool, uint256 oldRatio, uint256 newRatio)
UpdateTokenRate
event UpdateTokenRate(address indexed token, uint256 scalar, address provider)
UpdateTreasury
event UpdateTreasury(address indexed oldTreasury, address indexed newTreasury)
errors
AccessControlBadConfirmation
error AccessControlBadConfirmation()
AccessControlUnauthorizedAccount
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)
AddressEmptyCode
error AddressEmptyCode(address target)
AddressInsufficientBalance
error AddressInsufficientBalance(address account)
EnforcedPause
error EnforcedPause()
ErrorBorrowExceedCapacity
error ErrorBorrowExceedCapacity()
ErrorCallerNotCounterparty
error ErrorCallerNotCounterparty()
ErrorCallerNotFxUSDSave
error ErrorCallerNotFxUSDSave()
ErrorCollateralExceedCapacity
error ErrorCollateralExceedCapacity()
ErrorDebtExceedCapacity
error ErrorDebtExceedCapacity()
ErrorERC3156CallbackFailed
error ErrorERC3156CallbackFailed()
ErrorInsufficientFlashLoanReturn
error ErrorInsufficientFlashLoanReturn()
ErrorInsufficientRedeemedCollateral
error ErrorInsufficientRedeemedCollateral()
ErrorInvalidLongShortPair
error ErrorInvalidLongShortPair()
ErrorInvalidOperation
error ErrorInvalidOperation()
ErrorInvalidPool
error ErrorInvalidPool()
ErrorLiquidateDebtsTooSmall
error ErrorLiquidateDebtsTooSmall()
ErrorPoolNotRegistered
error ErrorPoolNotRegistered()
ErrorRebalanceDebtsTooSmall
error ErrorRebalanceDebtsTooSmall()
ErrorRedeemDebtsTooSmall
error ErrorRedeemDebtsTooSmall()
ErrorRedeemExceedBalance
error ErrorRedeemExceedBalance()
ErrorRedeemNotAllowed
error ErrorRedeemNotAllowed()
ErrorStableRepayNotAllowed
error ErrorStableRepayNotAllowed()
ErrorValueTooLarge
error ErrorValueTooLarge()
ErrorZeroAddress
error ErrorZeroAddress()
ExpectedPause
error ExpectedPause()
FailedInnerCall
error FailedInnerCall()
InvalidInitialization
error InvalidInitialization()
NotInitializing
error NotInitializing()
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
creation bytecode
0x610100604052348015610010575f80fd5b50604051615f6d380380615f6d83398101604081905261002f9161006c565b6001600160a01b0393841660805291831660e052821660a0521660c0526100bd565b80516001600160a01b0381168114610067575f80fd5b919050565b5f805f806080858703121561007f575f80fd5b61008885610051565b935061009660208601610051565b92506100a460408601610051565b91506100b260608601610051565b905092959194509250565b60805160a05160c05160e051615d7a6101f35f395f81816107d3015281816117d201528181611804015281816125bf015281816125f101528181612bf601528181612c280152818161335401528181613ee3015281816141830152614cf801525f818161067801528181610db201528181610f61015281816114ab015281816132820152818161344e01526140e301525f81816108b60152818161104b01528181611124015281816112490152818161132901528181611ae501528181611d0801528181611fb8015261223601525f818161069f015281816113e3015281816116cd01528181611cdb015281816128500152818161406e015281816142040152818161422b01528181614ada01528181614b5201528181614c0a01528181614c8201528181614d960152614dd20152615d7a5ff3fe608060405234801561000f575f80fd5b506004361061032b575f3560e01c806301ffc9a71461032f5780630266f0441461035757806303018c111461037757806306bfa938146103995780630b0eee30146103d45780630c932dc8146103e95780630e5c011e146103fc578063153f7cd01461041d5780631ace9a7c146104305780631da649cf1461044357806320df43591461045657806322e7d89e1461046a5780632354d83f1461047d578063248a9ca314610485578063269ef79314610498578063285ab4c3146104ab5780632b83cccd146104ca5780632bb6bc15146104dd5780632f2ff15d146104ff57806334c63d3e1461051257806336568abe146105255780633eb9c694146105385780633f0292c21461054b578063421ff4621461055457806349bc779b146105675780634ac6f0e01461057a5780635224372c146105a257806352a9039c146105b55780635c975abb146106165780635cb3ccaa1461061e5780635cffe9de14610626578063613255ab1461063957806361d027b31461064c57806363a560ec1461065f5780636c70bee9146106735780636dbe4bb91461069a5780636e49db1c146106c157806372838c91146106d45780637f51bb1f146106e7578063807d3f1d146106fa57806385184db71461070d57806386403125146107205780638e57338d1461078157806391d148541461079457806393014f46146107a75780639bd3bd38146107c65780639d8c2910146107ce578063a217fddf146107f5578063a4b32de8146107fc578063a69f493514610810578063aa05d03d14610818578063acdd515a1461082b578063b754d58d14610833578063ba4bf7d014610846578063bedb86fb14610865578063bf6f5b0014610878578063c13425741461088b578063c1c8f15b1461089e578063c3df6546146108b1578063c52d087b146108d8578063cbf0b0c0146108eb578063d2001124146108fe578063d547741f14610911578063d7d7442f14610924578063d890cba914610937578063d9d98ce41461094a578063eedfb05f1461095d578063f03577fa14610970578063f415afd714610983578063f899980a14610996578063f9260a8d1461099e575b5f80fd5b61034261033d366004615279565b6109bd565b60405190151581526020015b60405180910390f35b60035461036a906001600160a01b031681565b60405161034e91906152a0565b61038b5f80516020615d0583398151915281565b60405190815260200161034e565b6103ac6103a73660046152c8565b6109f3565b604080519586526020860194909452928401919091526060830152608082015260a00161034e565b6103e76103e23660046152e3565b610a84565b005b6103e76103f73660046152c8565b610bcf565b61040f61040a3660046152c8565b610be6565b60405161034e92919061530d565b6103e761042b3660046152c8565b611036565b60055461036a906001600160a01b031681565b6103e761045136600461531b565b611049565b61038b5f80516020615ce583398151915281565b6103e7610478366004615371565b6111d7565b61038b611214565b61038b6104933660046153b1565b611229565b6103e76104a636600461531b565b611247565b61038b6104b93660046152c8565b60046020525f908152604090205481565b61040f6104d83660046153c8565b611399565b6104f06104eb3660046153fa565b611793565b60405161034e93929190615457565b6103e761050d36600461546d565b6119f1565b6103e76105203660046154b1565b611a0d565b6103e761053336600461546d565b611a65565b6103e76105463660046154b1565b611a9d565b61038b609b5481565b61038b6105623660046154ea565b611ae2565b6103e761057536600461552d565b611ea2565b61036a6105883660046152c8565b60996020525f90815260409020546001600160a01b031681565b6103e76105b036600461531b565b611fb6565b6105ef6105c33660046152c8565b60646020525f90815260409020546001600160a01b03811690600160a01b90046001600160601b031682565b604080516001600160a01b0390931683526001600160601b0390911660208301520161034e565b6103426122be565b61038b6122d2565b6103426106343660046155a3565b6122e2565b61038b6106473660046152c8565b612513565b60015461036a906001600160a01b031681565b61038b5f80516020615cc583398151915281565b61036a7f000000000000000000000000000000000000000000000000000000000000000081565b61036a7f000000000000000000000000000000000000000000000000000000000000000081565b6104f06106cf3660046154ea565b612580565b6103e76106e236600461563a565b6127cd565b6103e76106f53660046152c8565b6127e6565b6103e76107083660046152e3565b6127f9565b6103e761071b366004615653565b61296a565b61075a61072e3660046152c8565b609a6020525f90815260409020546001600160601b03811690600160601b90046001600160a01b031682565b604080516001600160601b0390931683526001600160a01b0390911660208301520161034e565b6103e761078f3660046156c3565b612a7d565b6103426107a236600461546d565b612ab2565b61038b6107b53660046152c8565b60086020525f908152604090205481565b61038b612ae6565b61036a7f000000000000000000000000000000000000000000000000000000000000000081565b61038b5f81565b61038b5f80516020615d2583398151915281565b61038b612af6565b6103e76108263660046152e3565b612b05565b61038b612b62565b60025461036a906001600160a01b031681565b61038b6108543660046152c8565b609c6020525f908152604090205481565b6103e7610873366004615782565b612b71565b6103e761088636600461563a565b612b9e565b6104f06108993660046154ea565b612bb7565b61038b6108ac36600461579d565b612fb8565b61036a7f000000000000000000000000000000000000000000000000000000000000000081565b60075461036a906001600160a01b031681565b6103e76108f93660046152c8565b612fc6565b6103e761090c3660046152c8565b6130ac565b6103e761091f36600461546d565b6130bf565b6103e76109323660046153b1565b6130db565b6103e76109453660046157d5565b6130ee565b61038b6109583660046152e3565b613196565b6103e761096b36600461563a565b6131bf565b6103e761097e3660046152c8565b6131d8565b61038b610991366004615802565b6131eb565b61038b6136d8565b61038b6109ac3660046152c8565b60066020525f908152604090205481565b5f6001600160e01b03198216637965db0b60e01b14806109ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6001600160a01b0381165f908152609860205260408120548190819081908190610a1f818360556136e4565b9550610a2d816055806136e4565b9450610a3c8160aa60566136e4565b6001600160a01b0388165f90815260986020526040812060010154919550909150610a6a90829060606136e4565b9250610a78816060806136e4565b91505091939590929450565b5f80516020615d25833981519152610a9b816136f2565b6001600160a01b038381165f908152606460209081526040808320815180830183529054948516808252600160a01b9095046001600160601b03168184015281516318160ddd60e01b815291519094926318160ddd92600480820193918290030181865afa158015610b0f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b339190615854565b60208301519091506001600160601b0316610b4e858361587f565b1115610b58575f80fd5b8151610b6f906001600160a01b03871690866136ff565b815160405163b6b55f2560e01b8152600481018690526001600160a01b039091169063b6b55f25906024015b5f604051808303815f87803b158015610bb2575f80fd5b505af1158015610bc4573d5f803e3d5ffd5b505050505050505050565b5f610bd9816136f2565b610be282613757565b5050565b5f8082610bf46096826137b1565b610c115760405163aaaf1ba760e01b815260040160405180910390fd5b5f80516020615cc5833981519152610c28816136f2565b610c306137c5565b5f856001600160a01b031663b2016bd46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c6d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c919190615892565b90505f610c9d826137fa565b6001600160a01b0388165f90815260986020526040812054919250908190610cc7816055806136e4565b9250610cd68160aa60566136e4565b9150505f805f8b6001600160a01b031663ee65a03c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d18573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d3c9190615854565b905080841115610e9957610d52818503876138aa565b9950610d658c8b5f038387035f036138be565b633b9aca008a610d73611214565b0281610d8157610d816158ad565b049250633b9aca008a610d92612af6565b0281610da057610da06158ad565b0491508282018a039950610e628c888c7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637ef502987ffc3e964b6f9d1c4d43e30c57b170a183d35f574c0854a499e0c90f8fa253d5bd6040518263ffffffff1660e01b8152600401610e1e91815260200190565b602060405180830381865afa158015610e39573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e5d9190615892565b61397a565b6001600160a01b038c165f90815260986020526040902054610e86816055806136e4565b9550610e958160aa60566136e4565b9450505b610ea38587613ab2565b905083811115610f9057610eb9848203876138aa565b9a50610ec88c8c5f035f6138be565b5f633b9aca008c610ed7612b62565b0281610ee557610ee56158ad565b0490505f633b9aca008d610ef7612af6565b0281610f0557610f056158ad565b604051630fdea05360e31b81527ff7670fa3906d826444885d9b61a4246afaf9f48a2f7a2ec4cd843e23dcf7d2da6004820152919004838101909e039d9590920194939093019250610f90908d9089908e906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637ef5029890602401610e1e565b8215610fb157600154610fb1908d90899086906001600160a01b031661397a565b610fba8c613ac6565b8115610fcc57610fcc8c88843361397a565b604080518c8152602081018c90528082018590526060810184905290516001600160a01b038e169133917fb97aa24214e8edbddacca4eccaa3910b760a7aa10a284e8b782d12f1137a75619181900360800190a35050505050505061102f613c24565b5050915091565b5f611040816136f2565b610be282613c34565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461109257604051637f02477f60e11b815260040160405180910390fd5b8261109e6096826137b1565b6110bb5760405163aaaf1ba760e01b815260040160405180910390fd5b5f846001600160a01b031663b2016bd46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061111c9190615892565b905061114a817f00000000000000000000000000000000000000000000000000000000000000003086613c8e565b836001600160a01b031663ecf1a3a66040518163ffffffff1660e01b8152600401602060405180830381865afa158015611186573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111aa9190615892565b6001600160a01b0316639dc29fac30856040518363ffffffff1660e01b8152600401610b9b9291906158c1565b5f6111e1816136f2565b6111f08463ffffffff16613ca9565b6111ff8363ffffffff16613d03565b61120e8263ffffffff16613d52565b50505050565b5f8054611224906078601e6136e4565b905090565b5f80611233613da1565b5f9384526020525050604090206001015490565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461129057604051637f02477f60e11b815260040160405180910390fd5b8261129c6096826137b1565b6112b95760405163aaaf1ba760e01b815260040160405180910390fd5b826001600160a01b031663ecf1a3a66040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112f5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113199190615892565b6001600160a01b0316639dc29fac7f0000000000000000000000000000000000000000000000000000000000000000846040518363ffffffff1660e01b81526004016113669291906158c1565b5f604051808303815f87803b15801561137d575f80fd5b505af115801561138f573d5f803e3d5ffd5b5050505050505050565b5f80846113a76096826137b1565b6113c45760405163aaaf1ba760e01b815260040160405180910390fd5b6113cc6137c5565b6113d4613dc5565b6040516370a0823160e01b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a08231906114209033906004016152a0565b602060405180830381865afa15801561143b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061145f9190615854565b85111561147f576040516307889a5d60e21b815260040160405180910390fd5b68056bc75e2d631000008510156114a9576040516326d643e360e11b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c00c2ceb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611505573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061152991906158da565b611546576040516321e6770560e11b815260040160405180910390fd5b60405163db006a7560e01b8152600481018690525f906001600160a01b0388169063db006a759060240160408051808303815f875af115801561158b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115af91906158f5565b80925081955050508395505f876001600160a01b031663b2016bd46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061161b9190615892565b90505f611627826137fa565b905061163383826138aa565b94506116508961164287615917565b61164b86615917565b6138be565b6116628961165d8a615917565b613ded565b5f633b9aca006116706122d2565b87028161167f5761167f6158ad565b04905061168c8a82613e84565b8086039550878610156116b257604051630f29910b60e31b815260040160405180910390fd5b6116be8a84883361397a565b604051632770a7eb60e21b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639dc29fac9061170c9033908d906004016158c1565b5f604051808303815f87803b158015611723575f80fd5b505af1158015611735573d5f803e3d5ffd5b50505050896001600160a01b03167fbd5034ffbd47e4e72a94baa2cdb74c6fad73cb3bcdc13036b72ec8306f5a7646878b8460405161177693929190615457565b60405180910390a25050505061178a613c24565b50935093915050565b5f8080876117a26096826137b1565b6117bf5760405163aaaf1ba760e01b815260040160405180910390fd5b6117c76137c5565b6117cf613dc5565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146118a057609b547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118829190615854565b106118a057604051639544786b60e01b815260040160405180910390fd5b5f6118aa8a613ea5565b90505f6118ba87835f0151613ab2565b88019050670de0b6b3a76400008110156118e75760405163880cbfe760e01b815260040160405180910390fd5b604051630723d57160e01b815260018a900b6004820152602481018290525f906001600160a01b038d1690630723d571906044016060604051808303815f875af1158015611937573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061195b9190615931565b60408101805182510160608601525160808501526020015160a08401525061198790508a88838c613fec565b8095508196508297505050508760010b8a6001600160a01b03167ff8cdb1f9af03fbf36ddb1d43fce878a63592deba4f09a82777616f3019aa6c4d8787876040516119d493929190615457565b60405180910390a3506119e5613c24565b50955095509592505050565b6119fa82611229565b611a03816136f2565b61120e8383614309565b5f611a17816136f2565b611a226096856143a7565b1561120e576040516001600160a01b038516907fdfc596fabc6581c887262c97695176a79e3c8fc6ab7aaf14700820f3436b8fb9905f90a261120e8484846143bb565b6001600160a01b0381163314611a8e5760405163334bd91960e11b815260040160405180910390fd5b611a988282614492565b505050565b5f611aa7816136f2565b83611ab36096826137b1565b611ad05760405163aaaf1ba760e01b815260040160405180910390fd5b611adb8585856143bb565b5050505050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163314611b2c57604051637f02477f60e11b815260040160405180910390fd5b84611b386096826137b1565b611b555760405163aaaf1ba760e01b815260040160405180910390fd5b5f866001600160a01b031663b2016bd46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bb69190615892565b90505f611bc2826137fa565b60405163db006a7560e01b8152600481018890529091505f906001600160a01b038a169063db006a759060240160408051808303815f875af1158015611c0a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c2e91906158f5565b9150505f611c3c82846138aa565b9050611c488188615989565b95505f611c558785613ab2565b60405163e273fa8760e01b8152600481018290529091506001600160a01b038c169063e273fa87906024015f604051808303815f87803b158015611c97575f80fd5b505af1158015611ca9573d5f803e3d5ffd5b50505050611cc48b88611cbb90615917565b61164b84615917565b604051632770a7eb60e21b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639dc29fac90611d32907f0000000000000000000000000000000000000000000000000000000000000000908d906004016158c1565b5f604051808303815f87803b158015611d49575f80fd5b505af1158015611d5b573d5f803e3d5ffd5b505050505f8a6001600160a01b031663ecf1a3a66040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d9c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dc09190615892565b90505f816001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401611def91906152a0565b602060405180830381865afa158015611e0a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e2e9190615854565b90508015611e9257604051632770a7eb60e21b81526001600160a01b03831690639dc29fac90611e6490309085906004016158c1565b5f604051808303815f87803b158015611e7b575f80fd5b505af1158015611e8d573d5f803e3d5ffd5b505050505b5050505050505050949350505050565b5f611eab614508565b805490915060ff600160401b82041615906001600160401b03165f81158015611ed15750825b90505f826001600160401b03166001148015611eec5750303b155b905081158015611efa575080155b15611f185760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b03191660011785558315611f4157845460ff60401b1916600160401b1785555b611f4b5f8d614309565b50611f5a8b8b8b8b8b8b61452c565b611f62614596565b8315611fa857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163314611fff57604051637f02477f60e11b815260040160405180910390fd5b8261200b6096826137b1565b6120285760405163aaaf1ba760e01b815260040160405180910390fd5b5f836001600160a01b031663ecf1a3a66040518163ffffffff1660e01b8152600401602060405180830381865afa158015612065573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120899190615892565b90505f856001600160a01b031663b2016bd46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120ec9190615892565b90505f6120f8826137fa565b90505f876001600160a01b031663ee65a03c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612137573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061215b9190615854565b90505f61216882846138aa565b90505f856001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121cb9190615854565b90506121d7888261587f565b6001600160a01b038b165f908152609c6020526040902054670de0b6b3a764000090612203908561599c565b61220d91906159b3565b101561222c576040516319d5157560e31b815260040160405180910390fd5b50505061225a82867f000000000000000000000000000000000000000000000000000000000000000061459e565b6040516340c10f1960e01b81526001600160a01b038416906340c10f199061228890309089906004016158c1565b5f604051808303815f87803b15801561229f575f80fd5b505af11580156122b1573d5f803e3d5ffd5b5050505050505050505050565b5f806122c86146f7565b5460ff1692915050565b5f805461122490605a601e6136e4565b5f6122eb6137c5565b6122f3613dc5565b5f6122fe8686613196565b90506123146001600160a01b03871688876136ff565b6040516370a0823160e01b81525f906001600160a01b038816906370a08231906123429030906004016152a0565b602060405180830381865afa15801561235d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123819190615854565b90507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd96001600160a01b0389166323e30c8b338a8a878b8b6040518763ffffffff1660e01b81526004016123da969594939291906159c6565b6020604051808303815f875af11580156123f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061241a9190615854565b1461243857604051634cb150b560e11b815260040160405180910390fd5b5f81886001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161246691906152a0565b602060405180830381865afa158015612481573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124a59190615854565b6124af9190615989565b90506124bb838861587f565b8110156124db57604051634680cba960e11b815260040160405180910390fd5b82156124fb576001546124fb906001600160a01b038a81169116856136ff565b6001935050505061250a613c24565b95945050505050565b6040516370a0823160e01b81525f906001600160a01b038316906370a08231906125419030906004016152a0565b602060405180830381865afa15801561255c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109ed9190615854565b5f80808661258f6096826137b1565b6125ac5760405163aaaf1ba760e01b815260040160405180910390fd5b6125b46137c5565b6125bc613dc5565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461268d57609b547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561264b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061266f9190615854565b1061268d57604051639544786b60e01b815260040160405180910390fd5b5f61269789613ea5565b90505f6126a787835f0151613ab2565b88019050670de0b6b3a76400008110156126d45760405163880cbfe760e01b815260040160405180910390fd5b604051631e93260360e31b8152600481018290525f906001600160a01b038c169063f4993018906024016060604051808303815f875af115801561271a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061273e9190615931565b60408101805182510160608601525160808501526020015160a08401525061276a90508988838b613fec565b60405192975090955093506001600160a01b038a16907f2ee87fe08e822e20d39eb53e4cfe022c750e0b72e3dfafa2413b41b61f3dacc5906127b190889088908890615457565b60405180910390a2506127c2613c24565b509450945094915050565b5f6127d7816136f2565b610be28263ffffffff1661471b565b5f6127f0816136f2565b610be28261476a565b816128056096826137b1565b6128225760405163aaaf1ba760e01b815260040160405180910390fd5b5f80516020615d05833981519152612839816136f2565b6128416137c5565b604051632770a7eb60e21b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639dc29fac9061288f90339087906004016158c1565b5f604051808303815f87803b1580156128a6575f80fd5b505af11580156128b8573d5f803e3d5ffd5b505060405163193cefdd60e31b8152600481018690526001600160a01b038716925063c9e77ee891506024015f604051808303815f87803b1580156128fb575f80fd5b505af115801561290d573d5f803e3d5ffd5b5050505061291f848461165d90615917565b836001600160a01b03167f243d60a280579accabafa82109d7f67f7ce230d575b0ff7a301e8dabf3a3f5058460405161295a91815260200190565b60405180910390a261120e613c24565b5f612974816136f2565b5f836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129d59190615a1e565b6129e0906012615a3e565b6129eb90600a615b3a565b6040805180820182526001600160601b0380841682526001600160a01b0380881660208085019182528a83165f818152609a9092529086902094519151909216600160601b029216919091179091559051919250907f5eae3446f897bd3bbec9c0c4bfa76e39caf18a7b1a0ed8e89de3aea8a297acae90612a6f9084908790615b48565b60405180910390a250505050565b5f5b8151811015610be257612aaa828281518110612a9d57612a9d615b5f565b6020026020010151613ac6565b600101612a7f565b5f80612abc613da1565b5f948552602090815260408086206001600160a01b03959095168652939052505090205460ff1690565b5f8054611224906096601e6136e4565b5f805461122490601e806136e4565b5f612b0f816136f2565b6001600160a01b0383165f818152609c60205260409081902080549085905590519091907fb5905b07f0c450b4bfc9df549639d6d41a561c63f983efb2d22b6710a147d9c090612a6f908490879061530d565b5f80546112249082601e6136e4565b5f80516020615ce5833981519152612b88816136f2565b8115612b9657610be26147c4565b610be2614822565b5f612ba8816136f2565b610be28263ffffffff16614864565b5f808086612bc66096826137b1565b612be35760405163aaaf1ba760e01b815260040160405180910390fd5b612beb6137c5565b612bf3613dc5565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614612cc457609b547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c82573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ca69190615854565b10612cc457604051639544786b60e01b815260040160405180910390fd5b5f612cce89613ea5565b90505f612cde87835f0151613ab2565b612ce8908961587f565b9050670de0b6b3a7640000811015612d13576040516307a1b46360e01b815260040160405180910390fd5b612d3a60405180608001604052805f81526020015f81526020015f81526020015f81525090565b600354604080850151905163f8b2cb4f60e01b81525f926001600160a01b03169163f8b2cb4f91612d6e91906004016152a0565b602060405180830381865afa158015612d89573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dad9190615854565b9050612dbd818560200151613ab2565b60405163d296d1f160e01b81529091506001600160a01b038d169063d296d1f190612dee908690859060040161530d565b6080604051808303815f875af1158015612e0a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e2e9190615b73565b60408101805182510160608088019190915290516080870152602082015160a08701528101519092508015612f5057612e6f836060015186602001516138aa565b905060035f9054906101000a90046001600160a01b03166001600160a01b031663565659ea8e6001600160a01b031663b2016bd46040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ed0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ef49190615892565b30846040518463ffffffff1660e01b8152600401612f1493929190615bd5565b5f604051808303815f87803b158015612f2b575f80fd5b505af1158015612f3d573d5f803e3d5ffd5b50505050612f508d8285606001516138be565b505050612f5f8a89848c613fec565b60405192985090965094506001600160a01b038b16907f158ba9ab7bbbd08eeffa4753bad41f4d450e24831d293427308badf3eadd8c7690612fa690899089908990615457565b60405180910390a250506127c2613c24565b5f61250a858585855f6131eb565b5f612fd0816136f2565b6001600160a01b038281165f90815260646020908152604091829020825180840190935254928316808352600160a01b9093046001600160601b0316908201529015611a9857805f01516001600160a01b03166341c0e1b56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613051575f80fd5b505af1158015613063573d5f803e3d5ffd5b50505f80845260208085018281526001600160a01b03888116845260649092526040909220855192516001600160601b0316600160a01b02929091169190911790555050505050565b5f6130b6816136f2565b610be2826148b2565b6130c882611229565b6130d1816136f2565b61120e8383614492565b5f6130e5816136f2565b610be28261490c565b5f6130f8816136f2565b6001600160a01b038481165f90815260646020908152604091829020825180840190935254928316808352600160a01b9093046001600160601b03169082015290156131475761314785612fc6565b50506040805180820182526001600160a01b0393841681526001600160601b0392831660208083019182529585165f90815260649096529190942093519051909116600160a01b029116179055565b5f633b9aca006131a46136d8565b6131ae908461599c565b6131b891906159b3565b9392505050565b5f6131c9816136f2565b610be28263ffffffff16614946565b5f6131e2816136f2565b610be282614995565b5f856131f86096826137b1565b6132155760405163aaaf1ba760e01b815260040160405180910390fd5b61321d6137c5565b613225613dc5565b61327a6040518061014001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f6001600160a01b031681526020015f81526020015f81526020015f81526020015f81525090565b83156133d5577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639db4a5536040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132dc573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061330091906158da565b61331d576040516378bcd3ab60e11b815260040160405180910390fd5b5f86138061332b57505f8512155b80613334575086155b1561335257604051630549b09160e31b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633fd7ebe96040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133d29190615854565b81525b5f886001600160a01b031663b2016bd46040518163ffffffff1660e01b8152600401602060405180830381865afa158015613412573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134369190615892565b90505f613442826137fa565b90506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016631a4a400f8b336040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401608060405180830381865afa1580156134be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134e29190615bf9565b60808701526060860152604085015260208401525f8813156135115761350e8a838a86602001516149ef565b97505b8787600160ff1b821461352b576135288284614a2e565b91505b87801561353c5750600160ff1b8114155b156135515761354e81865f0151614a2e565b90505b6001600160a01b038c1663032d22768c8484336040516001600160e01b031960e087901b1681526004810194909452602484019290925260448301526001600160a01b031660648201526084016080604051808303815f875af11580156135ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135de9190615bf9565b50919c50925090506135f08284614a4c565b99506135fc8c82613ded565b5f8213156136145761360f8c8b846138be565b61363d565b5f82121561363d5761363d8c8561362a8d615917565b61363386615917565b8960400151614a60565b5f81131561365857613653818660600151614ab1565b613678565b5f8112156136785761367861366c82615917565b60808701518751614bc5565b8a8c6001600160a01b03167f9a243f0f02273a4b80be965697988a178f95cd11863de2122e69f811445dff448c845f6040516136b693929190615457565b60405180910390a38a965050505050506136ce613c24565b5095945050505050565b5f805461122490603c601e5b6001901b5f190191901c1690565b6136fc8133614e09565b50565b611a9883846001600160a01b031663a9059cbb85856040516024016137259291906158c1565b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614e3d565b61376081614e95565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907fe5110bb0e516861a91fc6865f2b0c0540cceff8cec2bfaaa5b032979e13c7e41905f90a35050565b5f6131b8836001600160a01b038416614ebc565b5f6137ce614ed3565b8054909150600119016137f457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b6001600160a01b038082165f908152609a60205260409020546001600160601b03811691600160601b90910416801561389657806001600160a01b031663679aefce6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613869573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061388d9190615854565b820291506138a4565b670de0b6b3a7640000820291505b50919050565b5f816131ae670de0b6b3a76400008561599c565b6001600160a01b0383165f90815260986020526040812054906138e3828260556136e4565b90505f846138f3846055806136e4565b6138fd9190615c2c565b9050818111156139205760405163f646f2f960e01b815260040160405180910390fd5b61392d8382605580614ef7565b92508361393d8460aa60566136e4565b6139479190615c2c565b9050613957838260aa6056614ef7565b6001600160a01b039096165f908152609860205260409020959095555050505050565b5f846001600160a01b031663c3df65466040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139db9190615892565b90506001600160a01b03811615613aa7575f6139f685614f0b565b9050808411613a0f57613a0a85858561459e565b613aa1565b5f826001600160a01b031663ecf1a3a66040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a709190615892565b90505f613a7d8387615989565b9050613a936001600160a01b03831686836136ff565b613a9e87848761459e565b50505b50611adb565b611adb84848461459e565b5f670de0b6b3a76400006131ae838561599c565b5f816001600160a01b031663b2016bd46040518163ffffffff1660e01b8152600401602060405180830381865afa158015613b03573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b279190615892565b6001600160a01b0383165f908152600460205260409020549091508015613b7c57600254613b63908490849084906001600160a01b031661397a565b6001600160a01b0383165f908152600460205260408120555b506001600160a01b0382165f908152600660205260409020548015613bcf57600554613bb6908490849084906001600160a01b031661397a565b6001600160a01b0383165f908152600660205260408120555b506001600160a01b0382165f908152600860205260409020548015611a9857600754613c09908490849084906001600160a01b031661397a565b50506001600160a01b03165f90815260086020526040812055565b5f613c2d614ed3565b6001905550565b613c3d81614e95565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f3ed91ef70e6e7c6a805523d1a95ddc27851b8f620524b5def16053d07bc33c32905f90a35050565b801561120e5761120e6001600160a01b038516848484615013565b613cb781631dcd650061503b565b5f613cc4825f601e61505c565b90507f77cf0faf60882cf7bf063a7308f5b2f7acc4c4cf6118126dc6f45a3fc19a05d18183604051613cf792919061530d565b60405180910390a15050565b613d1181631dcd650061503b565b5f613d1f826078601e61505c565b90507f38a939f96f90bf373822856f3ca5959e9f2fa4d92dfd22cc236d692ac15c80ff8183604051613cf792919061530d565b613d6081631dcd650061503b565b5f613d6e826096601e61505c565b90507fc47c244bb9022fbfd61c1961e43c3f6100aba94a7196cca3e6743b6ec04f7d098183604051613cf792919061530d565b7f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680090565b613dcd6122be565b15613deb5760405163d93c066560e01b815260040160405180910390fd5b565b6001600160a01b0382165f9081526098602052604081206001015490613e15828260606136e4565b90505f83613e25846060806136e4565b613e2f9190615c2c565b905081811115613e5257604051631b2f832360e21b815260040160405180910390fd5b613e5f8382606080614ef7565b6001600160a01b039095165f9081526098602052604090206001019490945550505050565b6001600160a01b039091165f90815260086020526040902080549091019055565b613ee16040518060c001604052805f81526020015f81526020015f6001600160a01b031681526020015f81526020015f81526020015f81525090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633fd7ebe96040518163ffffffff1660e01b8152600401602060405180830381865afa158015613f3d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f619190615854565b815f018181525050816001600160a01b031663b2016bd46040518163ffffffff1660e01b8152600401602060405180830381865afa158015613fa5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613fc99190615892565b6001600160a01b031660408201819052613fe2906137fa565b6020820152919050565b5f805f614001856060015186602001516138aa565b925061401e8761401085615917565b876060015161164b90615917565b614030878660a0015161165d90615917565b8460a001519150858211156140595761405361404c8784615989565b8651615082565b90508591505b81156140db57604051632770a7eb60e21b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639dc29fac906140ad90339086906004016158c1565b5f604051808303815f87803b1580156140c4575f80fd5b505af11580156140d6573d5f803e3d5ffd5b505050505b80156142b4577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639db4a5536040518163ffffffff1660e01b8152600401602060405180830381865afa15801561413d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061416191906158da565b61417e576040516378bcd3ab60e11b815260040160405180910390fd5b6142297f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9d75b2b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156141dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142019190615892565b337f000000000000000000000000000000000000000000000000000000000000000084613c8e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631ae94cde82888860a001516142699190615989565b6040518363ffffffff1660e01b815260040161428692919061530d565b5f604051808303815f87803b15801561429d575f80fd5b505af11580156142af573d5f803e3d5ffd5b505050505b5f633b9aca006142c2612ae6565b6142d4886080015189602001516138aa565b6142de919061599c565b6142e891906159b3565b90506142f48882613e84565b80840393506127c2888760400151868861397a565b5f80614313613da1565b905061431f8484612ab2565b61439e575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556143543390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506109ed565b5f9150506109ed565b5f6131b8836001600160a01b0384166150ad565b6001600160a01b0383165f908152609860205260408120546143e9916001600160601b038516906055614ef7565b6001600160a01b0384165f90815260986020526040812091825560019091015461441f916001600160601b038416906060614ef7565b6001600160a01b0384165f81815260986020526040908190206001019290925590517fe02c6e99b21daa3ddf5404c5d54ac9c919fe91ab12e1e72665dc1fd8bc8654679061448590859085906001600160601b0392831681529116602082015260400190565b60405180910390a2505050565b5f8061449c613da1565b90506144a88484612ab2565b1561439e575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506109ed565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0090565b6145346150f4565b61453d86613d03565b61454686613ca9565b61454f86613d52565b61455885614864565b6145618461471b565b61456a8361476a565b61457382614995565b61457c82613757565b614585826148b2565b61458e81613c34565b505050505050565b613deb6150f4565b6040516370a0823160e01b81525f906001600160a01b038516906370a08231906145cc9030906004016152a0565b602060405180830381865afa1580156145e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061460b9190615854565b905082811061462d576146286001600160a01b03851683856136ff565b61120e565b8015614647576146476001600160a01b03851683836136ff565b6001600160a01b038481165f90815260646020908152604091829020825180840190935254928316808352600160a01b9093046001600160601b03169082015282850391614693575f80fd5b8051604051627b8a6760e11b81526001600160a01b039091169062f714ce906146c29085908890600401615b48565b5f604051808303815f87803b1580156146d9575f80fd5b505af11580156146eb573d5f803e3d5ffd5b50505050505050505050565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330090565b614729816305f5e10061503b565b5f61473782603c601e61505c565b90507f6435b9a85963bf02d1ea1c96162e6e48e3cf1112e4b029810eba42e10532e5a98183604051613cf792919061530d565b61477381614e95565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907fd101a15f9e9364a1c0a7c4cc8eb4cd9220094e83353915b0c74e09f72ec73edb905f90a35050565b6147cc613dc5565b5f6147d56146f7565b805460ff1916600117815590507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861480a3390565b60405161481791906152a0565b60405180910390a150565b61482a615119565b5f6148336146f7565b805460ff1916815590507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3361480a565b61487281630bebc20061503b565b5f61487f82601e8061505c565b90507f2c3b971a5011a057ee9b96ea2aa1504d93d268e5c9cfdee7581d31435b24435e8183604051613cf792919061530d565b6148bb81614e95565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907fbcfa1f4a44edd726cc4f3c7dca57d46a5a8e8adb14b1eaae01bc3576059ddd42905f90a35050565b609b8054908290556040517f87b7851a3d0ea68ea4815a7d26786f79a1395130f36977b4cae075de129f3cbd90613cf7908390859061530d565b614954816305f5e10061503b565b5f61496282605a601e61505c565b90507fbf5383b9e422a4efef091bed41e294217b4a7c7adfbed0dc4d48588bac69afa88183604051613cf792919061530d565b61499e81614e95565b600280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f731b9ea4fb17ff346b10938712cc430bfa7ba2198f0d2d66a9594804ddf56bc2905f90a35050565b6001600160a01b0384165f9081526004602052604081208054633b9aca0084860204908101909155614a2385333087613c8e565b909203949350505050565b5f670de0b6b3a7640000614a428385615c53565b6131b89190615c82565b5f81614a42670de0b6b3a764000085615c53565b614a7685614a6d85615917565b61164b85615917565b633b9aca00818402048015614aa3576001600160a01b0386165f9081526006602052604090208054820190555b61458e86868387033361397a565b633b9aca00818302048015614b43576002546040516340c10f1960e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116926340c10f1992614b1592919091169085906004016158c1565b5f604051808303815f87803b158015614b2c575f80fd5b505af1158015614b3e573d5f803e3d5ffd5b505050505b6040516340c10f1960e01b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906340c10f1990614b93903390858803906004016158c1565b5f604051808303815f87803b158015614baa575f80fd5b505af1158015614bbc573d5f803e3d5ffd5b50505050505050565b828115614bd957614bd684836138aa565b90505b633b9aca00838202045f839003614cf5578015614c73576005546040516340c10f1960e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116926340c10f1992614c4592919091169085906004016158c1565b5f604051808303815f87803b158015614c5c575f80fd5b505af1158015614c6e573d5f803e3d5ffd5b505050505b604051632770a7eb60e21b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639dc29fac90614cc3903390868601906004016158c1565b5f604051808303815f87803b158015614cda575f80fd5b505af1158015614cec573d5f803e3d5ffd5b50505050611adb565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9d75b2b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614d52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614d769190615892565b9050614d8f81336005546001600160a01b031685613c8e565b614dbb81337f000000000000000000000000000000000000000000000000000000000000000086613c8e565b604051630d74a66f60e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631ae94cde906146c29086908a9060040161530d565b614e138282612ab2565b610be257808260405163e2517d3f60e01b8152600401614e349291906158c1565b60405180910390fd5b5f614e516001600160a01b0384168361513e565b905080515f14158015614e75575080806020019051810190614e7391906158da565b155b15611a985782604051635274afe760e01b8152600401614e3491906152a0565b6001600160a01b0381166136fc5760405163a7f9319d60e01b815260040160405180910390fd5b5f9081526001919091016020526040902054151590565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0090565b6001901b5f1901811b1992909216911b1790565b5f80826001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401614f3991906152a0565b602060405180830381865afa158015614f54573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614f789190615854565b6001600160a01b038085165f908152606460205260409020549192501680614fa1575092915050565b806001600160a01b031663ba5d30786040518163ffffffff1660e01b8152600401602060405180830381865afa158015614fdd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906150019190615854565b61500b908361587f565b949350505050565b61120e84856001600160a01b03166323b872dd86868660405160240161372593929190615bd5565b80821115610be257604051634df52d2560e11b815260040160405180910390fd5b5f805461506a8185856136e4565b915061507881868686614ef7565b5f55509392505050565b5f81600181615099670de0b6b3a76400008761599c565b6150a3919061587f565b6131ae9190615989565b5f6150b88383614ebc565b6150ed57508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556109ed565b505f6109ed565b6150fc61514b565b613deb57604051631afcd79f60e31b815260040160405180910390fd5b6151216122be565b613deb57604051638dfc202b60e01b815260040160405180910390fd5b60606131b883835f615164565b5f615154614508565b54600160401b900460ff16919050565b606081471015615189573060405163cd78605960e01b8152600401614e3491906152a0565b5f80856001600160a01b031684866040516151a49190615cae565b5f6040518083038185875af1925050503d805f81146151de576040519150601f19603f3d011682016040523d82523d5f602084013e6151e3565b606091505b50915091506151f38683836151fd565b9695505050505050565b6060826152125761520d82615250565b6131b8565b815115801561522957506001600160a01b0384163b155b156152495783604051639996b31560e01b8152600401614e3491906152a0565b50806131b8565b8051156152605780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f60208284031215615289575f80fd5b81356001600160e01b0319811681146131b8575f80fd5b6001600160a01b0391909116815260200190565b6001600160a01b03811681146136fc575f80fd5b5f602082840312156152d8575f80fd5b81356131b8816152b4565b5f80604083850312156152f4575f80fd5b82356152ff816152b4565b946020939093013593505050565b918252602082015260400190565b5f805f6060848603121561532d575f80fd5b8335615338816152b4565b92506020840135615348816152b4565b929592945050506040919091013590565b803563ffffffff8116811461536c575f80fd5b919050565b5f805f60608486031215615383575f80fd5b61538c84615359565b925061539a60208501615359565b91506153a860408501615359565b90509250925092565b5f602082840312156153c1575f80fd5b5035919050565b5f805f606084860312156153da575f80fd5b83356153e5816152b4565b95602085013595506040909401359392505050565b5f805f805f60a0868803121561540e575f80fd5b8535615419816152b4565b94506020860135615429816152b4565b93506040860135600181900b811461543f575f80fd5b94979396509394606081013594506080013592915050565b9283526020830191909152604082015260600190565b5f806040838503121561547e575f80fd5b823591506020830135615490816152b4565b809150509250929050565b80356001600160601b038116811461536c575f80fd5b5f805f606084860312156154c3575f80fd5b83356154ce816152b4565b92506154dc6020850161549b565b91506153a86040850161549b565b5f805f80608085870312156154fd575f80fd5b8435615508816152b4565b93506020850135615518816152b4565b93969395505050506040820135916060013590565b5f805f805f805f60e0888a031215615543575f80fd5b873561554e816152b4565b96506020880135955060408801359450606088013593506080880135615573816152b4565b925060a0880135615583816152b4565b915060c0880135615593816152b4565b8091505092959891949750929550565b5f805f805f608086880312156155b7575f80fd5b85356155c2816152b4565b945060208601356155d2816152b4565b93506040860135925060608601356001600160401b038111156155f3575f80fd5b8601601f81018813615603575f80fd5b80356001600160401b03811115615618575f80fd5b886020828401011115615629575f80fd5b959894975092955050506020019190565b5f6020828403121561564a575f80fd5b6131b882615359565b5f8060408385031215615664575f80fd5b823561566f816152b4565b91506020830135615490816152b4565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156156bb576156bb61567f565b604052919050565b5f602082840312156156d3575f80fd5b81356001600160401b038111156156e8575f80fd5b8201601f810184136156f8575f80fd5b80356001600160401b038111156157115761571161567f565b8060051b61572160208201615693565b9182526020818401810192908101908784111561573c575f80fd5b6020850194505b8385101561576a5784359250615758836152b4565b82825260209485019490910190615743565b979650505050505050565b80151581146136fc575f80fd5b5f60208284031215615792575f80fd5b81356131b881615775565b5f805f80608085870312156157b0575f80fd5b84356157bb816152b4565b966020860135965060408601359560600135945092505050565b5f805f606084860312156157e7575f80fd5b83356157f2816152b4565b925060208401356154dc816152b4565b5f805f805f60a08688031215615816575f80fd5b8535615821816152b4565b9450602086013593506040860135925060608601359150608086013561584681615775565b809150509295509295909350565b5f60208284031215615864575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156109ed576109ed61586b565b5f602082840312156158a2575f80fd5b81516131b8816152b4565b634e487b7160e01b5f52601260045260245ffd5b6001600160a01b03929092168252602082015260400190565b5f602082840312156158ea575f80fd5b81516131b881615775565b5f8060408385031215615906575f80fd5b505080516020909101519092909150565b5f600160ff1b820161592b5761592b61586b565b505f0390565b5f6060828403128015615942575f80fd5b50604051606081016001600160401b03811182821017156159655761596561567f565b60409081528351825260208085015190830152928301519281019290925250919050565b818103818111156109ed576109ed61586b565b80820281158282048414176109ed576109ed61586b565b5f826159c1576159c16158ad565b500490565b6001600160a01b03878116825286166020820152604081018590526060810184905260a0608082018190528101829052818360c08301375f81830160c090810191909152601f909201601f1916010195945050505050565b5f60208284031215615a2e575f80fd5b815160ff811681146131b8575f80fd5b60ff82811682821603908111156109ed576109ed61586b565b6001815b6001841115615a9257808504811115615a7657615a7661586b565b6001841615615a8457908102905b60019390931c928002615a5b565b935093915050565b5f82615aa8575060016109ed565b81615ab457505f6109ed565b8160018114615aca5760028114615ad457615af0565b60019150506109ed565b60ff841115615ae557615ae561586b565b50506001821b6109ed565b5060208310610133831016604e8410600b8410161715615b13575081810a6109ed565b615b1f5f198484615a57565b805f1904821115615b3257615b3261586b565b029392505050565b5f6131b860ff841683615a9a565b9182526001600160a01b0316602082015260400190565b634e487b7160e01b5f52603260045260245ffd5b5f6080828403128015615b84575f80fd5b50604051608081016001600160401b0381118282101715615ba757615ba761567f565b6040908152835182526020808501519083015283810151908201526060928301519281019290925250919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f805f8060808587031215615c0c575f80fd5b505082516020840151604085015160609095015191969095509092509050565b8082018281125f831280158216821582161715615c4b57615c4b61586b565b505092915050565b8082025f8212600160ff1b84141615615c6e57615c6e61586b565b81810583148215176109ed576109ed61586b565b5f82615c9057615c906158ad565b600160ff1b82145f1984141615615ca957615ca961586b565b500590565b5f82518060208501845e5f92019182525091905056fe3fc733b4d20d27a28452ddf0e9351aced28242fe03389a653cdb783955316b9bbf233dd2aafeb4d50879c4aa5c81e96d92f6e6945c906a58f9f2d1c1631b4b261be5d1ebf823e636f9019a4a28b5fb56a6c9c490fea63cb140cde243b9045b53b1fadd3142ab2ad7f1337ea4d97112bcc8337fc11ce5b20cb04ad038adf99819a2646970667358221220d99175976f5ece52bb950070d4498d0b906497c85a40168236a436d7cd91816764736f6c634300081a0033000000000000000000000000085780639cc2cacd35e474e71f4d000e2405d8f600000000000000000000000065c9a641afceb9c0e6034e558a319488fa0fa3be000000000000000000000000acdc0ab51178d0ae8f70c1ead7d3cf5421fdd66d00000000000000000000000016b334f2644cc00b85db1a1eff0c2c395e00c28d