4.4k txs
16.1k calls
constructor
constructor(uint256 maxTolerance, uint256 maxInitiatorFee, uint256 minLiquidityRatio)
functions
accountToInitiator
viewfunction accountToInitiator(address account) view returns (address initiator)
getPositionState
viewfunction getPositionState(address positionManager, uint256 oldId, int24 tickLower, int24 tickUpper, address initiator) view returns (tuple position)
initiatorInfo
viewfunction initiatorInfo(address initiator) view returns (uint64 upperSqrtPriceDeviation, uint64 lowerSqrtPriceDeviation, uint64 fee, uint64 minLiquidityRatio)
isPoolUnbalanced
purefunction isPoolUnbalanced(tuple position) pure returns (bool isPoolUnbalanced_)
MAX_INITIATOR_FEE
viewfunction MAX_INITIATOR_FEE() view returns (uint256)
MAX_TOLERANCE
viewfunction MAX_TOLERANCE() view returns (uint256)
MIN_LIQUIDITY_RATIO
viewfunction MIN_LIQUIDITY_RATIO() view returns (uint256)
onERC721Received
purefunction onERC721Received(address, address, uint256, bytes) pure returns (bytes4)
strategyHook
viewfunction strategyHook(address account) view returns (address hook)
executeAction
nonpayablefunction executeAction(bytes rebalanceData) returns (tuple depositData)
rebalance
nonpayablefunction rebalance(address account_, address positionManager, uint256 oldId, int24 tickLower, int24 tickUpper, bytes swapData)
setAccountInfo
nonpayablefunction setAccountInfo(address account_, address initiator, address hook)
setInitiatorInfo
nonpayablefunction setInitiatorInfo(uint256 tolerance, uint256 fee, uint256 minLiquidityRatio)
uniswapV3SwapCallback
nonpayablefunction uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes data)
events
AccountInfoSet
event AccountInfoSet(address indexed account, address indexed initiator, address indexed strategyHook)
Rebalance
event Rebalance(address indexed account, address indexed positionManager, uint256 oldId, uint256 newId)
errors
InitiatorNotValid
error InitiatorNotValid()
InsufficientLiquidity
error InsufficientLiquidity()
InvalidValue
error InvalidValue()
NotAnAccount
error NotAnAccount()
OnlyAccount
error OnlyAccount()
OnlyAccountOwner
error OnlyAccountOwner()
OnlyPool
error OnlyPool()
OnlyPositionManager
error OnlyPositionManager()
Reentered
error Reentered()
UnbalancedPool
error UnbalancedPool()
creation bytecode
0x60e060405234801562000010575f80fd5b506040516200537c3803806200537c833981016040819052620000339162000045565b60809290925260a05260c05262000071565b5f805f6060848603121562000058575f80fd5b8351925060208401519150604084015190509250925092565b60805160a05160c0516152cb620000b15f395f8181610203015261089b01525f8181610315015261084801525f8181610348015261087101526152cb5ff3fe6080604052600436106100dc575f3560e01c80635a1c94c21161007c578063830e703f11610057578063830e703f1461036a5780639583aef014610389578063a129568d146103bd578063fa461e33146103e9575f80fd5b80635a1c94c2146102e55780635f1bbfc21461030457806370cd8d2714610337575f80fd5b806326473274116100b757806326473274146101a6578063304e0270146101f25780634d3b3985146102335780634df8604a1461025f575f80fd5b80630ace53951461011b5780630f59b86a1461014f578063150b7a021461016e575f80fd5b36610117573373827922686190790b37229fd06084350e74485b721461011557604051637b7524c960e01b815260040160405180910390fd5b005b5f80fd5b348015610126575f80fd5b5061013a610135366004613e40565b610408565b60405190151581526020015b60405180910390f35b34801561015a575f80fd5b50610115610169366004613f6d565b610432565b348015610179575f80fd5b5061018d610188366004613ffe565b610533565b6040516001600160e01b03199091168152602001610146565b3480156101b1575f80fd5b506101da6101c036600461406b565b60036020525f90815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610146565b3480156101fd575f80fd5b506102257f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610146565b34801561023e575f80fd5b5061025261024d366004614086565b610545565b60405161014691906140ea565b34801561026a575f80fd5b506102b261027936600461406b565b60016020525f90815260409020546001600160401b0380821691600160401b8104821691600160801b8204811691600160c01b90041684565b604080516001600160401b0395861681529385166020850152918416918301919091529091166060820152608001610146565b3480156102f0575f80fd5b506101156102ff3660046141f9565b610707565b34801561030f575f80fd5b506102257f000000000000000000000000000000000000000000000000000000000000000081565b348015610342575f80fd5b506102257f000000000000000000000000000000000000000000000000000000000000000081565b348015610375575f80fd5b50610115610384366004614222565b6109ad565b348015610394575f80fd5b506101da6103a336600461406b565b60026020525f90815260409020546001600160a01b031681565b3480156103c8575f80fd5b506103dc6103d736600461426a565b610b72565b6040516101469190614376565b3480156103f4575f80fd5b50610115610403366004614388565b611029565b5f81610160015182610140015111158061042c575081610180015182610140015110155b92915050565b5f546001600160a01b03161561045b5760405163b5dfd9e560e01b815260040160405180910390fd5b6001600160a01b038781165f908152600260205260409020541633146104945760405163fde6c87960e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b0389161781556104bd87873388888888611120565b60405162b9252f60e41b81529091506001600160a01b03891690630b9252f0906104ed9030908590600401614423565b5f604051808303815f87803b158015610504575f80fd5b505af1158015610516573d5f803e3d5ffd5b50505f80546001600160a01b031916905550505050505050505050565b630a85bd0160e11b5b95945050505050565b61054d613cd1565b5f806001600160a01b0388167303a520b32c04bf3beef7beb72e919cf822ed34f1146105825761057d8388611315565b610595565b61059583888760020b8960020b146114ec565b915091508460020b8660020b036106125760808301516105b5818461446e565b6105bf91906144a6565b60808401519092506105d28160026144a6565b6105dc908361446e565b6105e691906144a6565b6105f090836144cc565b60020b60c084018190526106059082906144f1565b60020b60a0840152610625565b600285810b60a085015286900b60c08401525b6106328360c00151611716565b6001600160a01b031661010084015260a083015161064f90611716565b6001600160a01b031661012084015282515f9061066b906119ce565b90505f61067782611716565b6001600160a01b038781165f90815260016020526040902054911691506106b8908290600160401b90046001600160401b0316670de0b6b3a7640000611ae6565b6101608601526001600160a01b0386165f908152600160205260409020546106f39082906001600160401b0316670de0b6b3a7640000611ae6565b610180860152509298975050505050505050565b5f546001600160a01b0316156107305760405163b5dfd9e560e01b815260040160405180910390fd5b335f908152600160209081526040808320815160808101835290546001600160401b038082168352600160401b8204811694830194909452600160801b8104841692820192909252600160c01b9091049091166060820152906107b561079e86670de0b6b3a7640000614516565b6107b090670de0b6b3a7640000614529565b611b01565b60608301519091506001600160401b0316156108465781604001516001600160401b03168411806107fa5750815f01516001600160401b0316816001600160401b0316115b80610811575081606001516001600160401b031683105b806108235750670de0b6b3a764000083115b1561084157604051632a9ffab760e21b815260040160405180910390fd5b6108ed565b7f000000000000000000000000000000000000000000000000000000000000000084118061089357507f000000000000000000000000000000000000000000000000000000000000000085115b806108bd57507f000000000000000000000000000000000000000000000000000000000000000083105b806108cf5750670de0b6b3a764000083115b156108ed57604051632a9ffab760e21b815260040160405180910390fd5b6001600160401b0380851660408401528316606083015261091961079e86670de0b6b3a7640000614540565b6001600160401b0390811660208085019182529282168452335f9081526001909352604092839020845181549251948601516060909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03958516600160401b026fffffffffffffffffffffffffffffffff199094169190941617919091179290921617919091179055505050565b5f546001600160a01b0316156109d65760405163b5dfd9e560e01b815260040160405180910390fd5b604051630972932760e21b81526001600160a01b038416600482015273da14fdd72345c4d2511357214c5b89a919768e59906325ca4c9c90602401602060405180830381865afa158015610a2c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a509190614562565b610a6d57604051630ea8370b60e41b815260040160405180910390fd5b826001600160a01b0316638da5cb5b6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015610aaa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ace919061457b565b6001600160a01b0316336001600160a01b031614610aff576040516312272fd360e11b815260040160405180910390fd5b6001600160a01b038084165f81815260026020908152604080832080548689166001600160a01b0319918216811790925560039093528184208054968816969093168617909255519092917f343ef5cc595144359c9db657cd7fcef6ecc88d06d17651a8292e553ab73b1c7091a4505050565b610b9d6040518060800160405280606081526020016060815260200160608152602001606081525090565b5f546001600160a01b03163314610bc75760405163f3f6425d60e01b815260040160405180910390fd5b335f908152600360205260408120546001600160a01b0316906060908080610bed613cd1565b5f610c196040518060800160405280606081526020016060815260200160608152602001606081525090565b5f80610c278c8e018e6146fc565b84518051919e509398509396509094509250905f90610c4857610c48614820565b6020026020010151975082602001515f81518110610c6857610c68614820565b60200260200101519650610c7f8888848488610545565b94505050506001600160a01b03871615610d135760c082015160a083015160405163bd5d93c960e01b81523360048201526001600160a01b03888116602483015260448201889052600293840b60648301529190920b608483015288169063bd5d93c99060a4015f6040518083038186803b158015610cfc575f80fd5b505afa158015610d0e573d5f803e3d5ffd5b505050505b610d1c82610408565b15610d3a57604051633a8bf65960e01b815260040160405180910390fd5b5f805f610d48888887611ba5565b6001600160a01b038088165f9081526001602052604081205460608b01516101408c01516101008d01516101208e0151989b5096995094975091958695869586958695610dc0956001600160401b03600160c01b820481169662ffffff90931695600160801b90920416939290811691168e8e611ec6565b94509450945094509450610ddb8e8e8c878787878f8f611f84565b9098509650610de98a610408565b15610e0757604051633a8bf65960e01b815260040160405180910390fd5b5f610e148e8c8b8b61208e565b929e509a50909850905085811015610e3f5760405163bb55fd2760e01b815260040160405180910390fd5b610e568a86868e602001518f604001518e8e61248d565b60405163095ea7b360e01b8152336004820152602481018f9052919a509850600196506001600160a01b038f16955063095ea7b394506044019250610e99915050565b5f604051808303815f87803b158015610eb0575f80fd5b505af1158015610ec2573d5f803e3d5ffd5b505050505f841115610eeb576020860151610ee7906001600160a01b0316338661250a565b5060025b8215610f16576040860151610f0a906001600160a01b0316338561250a565b610f1381614834565b90505b8115610f4757610f3b73940181a94a35a4569e4529a3cdfb74e38fd98631338461250a565b610f4481614834565b90505b610f568988888488888861257f565b9b50506001600160a01b038a1615610fd357604051636ae9e26760e11b81523360048201526001600160a01b03898116602483015260448201899052606482018890528b169063d5d3c4ce906084015f604051808303815f87803b158015610fbc575f80fd5b505af1158015610fce573d5f803e3d5ffd5b505050505b60408051888152602081018890526001600160a01b038a169133917ffea7a9a6e25cd0bbbfa80ce0c7646e61ee5e0551b3fdaaff0642e6f6adcc72e2910160405180910390a35050505050505050505092915050565b5f8080806110398587018761484c565b93509350935093507303a520b32c04bf3beef7beb72e919cf822ed34f16001600160a01b0316846001600160a01b0316036110a6573361107a848484612925565b6001600160a01b0316146110a157604051634b60273560e01b815260040160405180910390fd5b6110d9565b336110b2848484612946565b6001600160a01b0316146110d957604051634b60273560e01b815260040160405180910390fd5b5f8813156110fa576110f56001600160a01b038416338a61297c565b611116565b5f871315611116576111166001600160a01b038316338961297c565b5050505050505050565b6040805160018082528183019092526060915f91906020808301908036833701905050905088815f8151811061115857611158614820565b6001600160a01b0392909216602092830291909101909101526040805160018082528183019092525f9181602001602082028036833701905050905088815f815181106111a7576111a7614820565b60209081029190910101526040805160018082528183019092525f918160200160208202803683370190505090506001815f815181106111e9576111e9614820565b60209081029190910101526040805160018082528183019092525f918160200160208202803683370190505090506002815f8151811061122b5761122b614820565b6020026020010181815250505f604051806080016040528086815260200185815260200184815260200183815250905060606112886040518060800160405280606081526020016060815260200160608152602001606081525090565b6112aa6040518060600160405280606081526020015f81526020015f81525090565b5f848f8f8f8f8f6040516020016112c6969594939291906148a5565b604051602081830303815290604052905084838386846040516020016112f095949392919061490c565b6040516020818303038152906040529950505050505050505050979650505050505050565b60405163133f757160e31b8152600481018290525f9081908190819073827922686190790b37229fd06084350e74485b72906399fbab889060240161018060405180830381865afa15801561136c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061139091906149fe565b505050506001600160801b031660e08e015260029290920b60808d01526001600160a01b0392831660408d01529290911660208b015290945092506113d99150839050826144cc565b92506113f2866020015187604001518860800151612946565b6001600160a01b031680875260408051633850c7bd60e01b81529051633850c7bd9160048082019260c0929091908290030181865afa158015611437573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061145b9190614ae7565b5050506001600160a01b039283166101408a01525087516040805163ddca3f4360e01b8152905192975092169163ddca3f439160048083019260209291908290030181865afa1580156114b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114d49190614b5c565b62ffffff166060909601959095525090939092509050565b60405163133f757160e31b8152600481018390525f908190819081907303a520b32c04bf3beef7beb72e919cf822ed34f1906399fbab889060240161018060405180830381865afa158015611543573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115679190614b77565b909192939495969798999a509091929394959697989950909192509091509050508c6020018d6040018e6060018f60e001846001600160801b03166001600160801b0316815250849950859a508662ffffff1662ffffff16815250866001600160a01b03166001600160a01b0316815250866001600160a01b03166001600160a01b0316815250505050505050818161160091906144cc565b9250611619876020015188604001518960600151612925565b6001600160a01b031680885260408051633850c7bd60e01b81529051633850c7bd9160048082019260e0929091908290030181865afa15801561165e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116829190614bdf565b5050506001600160a01b039093166101408b015250945050841561170c57865f01516001600160a01b031663d0c93a7c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116df573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117039190614c6c565b60020b60808801525b5050935093915050565b60020b5f60ff82901d80830118620d89e881111561173f5761173f6345c3193d60e11b84612a04565b7001fffcb933bd6fad37aa2d162d1a5940016001821602600160801b18600282161561177b576ffff97272373d413259a46990580e213a0260801c5b600482161561179a576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b60088216156117b9576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b60108216156117d8576fffcb9843d60f6159c9db58835c9266440260801c5b60208216156117f7576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615611816576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615611835576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615611855576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615611875576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615611895576ff3392b0822b70005940c7a398e4b70f30260801c5b6108008216156118b5576fe7159475a2c29b7443b29c7fa6e889d90260801c5b6110008216156118d5576fd097f3bdfd2022b8845ad8f792aa58250260801c5b6120008216156118f5576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615611915576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615611935576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615611956576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615611976576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615611995576d2216e584f5fa1ea926041bedfe980260801c5b620800008216156119b2576b048a170391f7dc42444e8fa20260801c5b5f8413156119be575f19045b63ffffffff0160201c9392505050565b6040805160028082526060820183525f928392919060208301908036833701905050905061012c81600181518110611a0857611a08614820565b63ffffffff9092166020928302919091019091015260405163883bdbfd60e01b81525f906001600160a01b0385169063883bdbfd90611a4b908590600401614c87565b5f60405180830381865afa158015611a65573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a8c9190810190614d35565b50905061012c60030b81600181518110611aa857611aa8614820565b6020026020010151825f81518110611ac257611ac2614820565b6020026020010151611ad49190614df8565b611ade9190614e25565b949350505050565b5f825f190484118302158202611afa575f80fd5b5091020490565b60b581600160881b8110611b1a5760409190911b9060801c5b69010000000000000000008110611b365760209190911b9060401c5b650100000000008110611b4e5760109190911b9060201c5b63010000008110611b645760089190911b9060101c5b62010000010260121c80820401600190811c80830401811c80830401811c80830401811c80830401811c80830401811c80830401901c908190048111900390565b5f8080806001600160a01b038716731dc7a0f5336f52724b650e39174cfcbbedd67bf11480611bf057506001600160a01b03871673d74339e0f10fce96894916b93e5cc7de89c98272145b15611c7b57604051630852cd8d60e31b8152600481018790526001600160a01b038816906342966c68906024016020604051808303815f875af1158015611c39573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c5d9190614e58565b915073827922686190790b37229fd06084350e74485b729650600190505b6040805160a08101825287815260e08701516001600160801b03908116602083019081525f8385018181526060850191825242608086019081529551630624e65f60e11b81529451600486015291519092166024840152516044830152516064820152905160848201526001600160a01b03881690630c49ccbe9060a40160408051808303815f875af1158015611d14573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d389190614e6f565b50506040805160808101825287815230602082019081526001600160801b0382840181815260608401828152945163fc6f786560e01b81529351600485015291516001600160a01b039081166024850152915181166044840152925190921660648201529088169063fc6f78659060840160408051808303815f875af1158015611dc4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de89190614e6f565b604051630852cd8d60e31b81526004810189905291955093506001600160a01b038816906342966c68906024015f604051808303815f87803b158015611e2c575f80fd5b505af1158015611e3e573d5f803e3d5ffd5b505050508015611ebc5760208501516001600160a01b031673940181a94a35a4569e4529a3cdfb74e38fd9863103611e8457611e7a8285614516565b93505f9150611ebc565b60408501516001600160a01b031673940181a94a35a4569e4529a3cdfb74e38fd9863103611ebc57611eb68284614516565b92505f91505b5093509350939050565b5f8080808064e8d4a510008c028b01611ee38b8b8b8b8b86612a13565b919650935091505f611f2d8c8c8c89611f0557611f00878e614516565b611f0f565b611f0f888e614540565b8a611f2357611f1e898e614540565b612b34565b611f1e888e614516565b6001600160801b03169050611f558f670de0b6b3a764000083611ae69092919063ffffffff16565b9650611f6c9050838d670de0b6b3a7640000611ae6565b93508383039250509850985098509850989350505050565b5f80855f03611f97575082905081612080565b8a515f0361206e57612054888a6060015162ffffff168b5f01516001600160a01b0316631a6865026040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fec573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120109190614e91565b8c61014001518d61010001518e61012001518e61202d578a612037565b6120378e8c614540565b8f61204b576120468f8c614540565b61204d565b8a5b8e8e612bf3565b94506120648a8a8a888888612cbc565b9092509050612080565b61207a8a8a8a8e612ed5565b90925090505b995099975050505050505050565b5f808080806001600160a01b038916731dc7a0f5336f52724b650e39174cfcbbedd67bf114806120da57506001600160a01b03891673d74339e0f10fce96894916b93e5cc7de89c98272145b156120f7575073827922686190790b37229fd06084350e74485b72975b6020880151612110906001600160a01b03168a8961250a565b6040880151612129906001600160a01b03168a8861250a565b5f806001600160a01b038b167303a520b32c04bf3beef7beb72e919cf822ed34f1146122665773827922686190790b37229fd06084350e74485b726001600160a01b031663b5007d1f6040518061018001604052808d602001516001600160a01b031681526020018d604001516001600160a01b031681526020018d6080015160020b81526020018d60c0015160020b81526020018d60a0015160020b81526020018c81526020018b81526020015f81526020015f8152602001306001600160a01b031681526020014281526020015f6001600160a01b03168152506040518263ffffffff1660e01b81526004016122219190614eac565b6080604051808303815f875af115801561223d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122619190614f85565b61236b565b7303a520b32c04bf3beef7beb72e919cf822ed34f16001600160a01b031663883164566040518061016001604052808d602001516001600160a01b031681526020018d604001516001600160a01b031681526020018d6060015162ffffff1681526020018d60c0015160020b81526020018d60a0015160020b81526020018c81526020018b81526020015f81526020015f8152602001306001600160a01b03168152602001428152506040518263ffffffff1660e01b815260040161232b9190614fc0565b6080604051808303815f875af1158015612347573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061236b9190614f85565b9299506001600160801b03909116975092509050612389828a614540565b94506123958189614540565b93506001600160a01b0383161561247f5760405163095ea7b360e01b81526001600160a01b03841660048201526024810188905273827922686190790b37229fd06084350e74485b729063095ea7b3906044015f604051808303815f87803b1580156123ff575f80fd5b505af1158015612411573d5f803e3d5ffd5b505060405163140e25ad60e31b8152600481018a90526001600160a01b038616925063a0712d6891506024016020604051808303815f875af1158015612459573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061247d9190614e58565b505b505050945094509450949050565b5f8087156124cb578684116124a3575f846124a8565b868403875b9750935086156124c6576124c66001600160a01b0387168a8961297c565b6124fc565b8683116124d9575f836124de565b868303875b9750925086156124fc576124fc6001600160a01b0386168a8961297c565b509197909650945050505050565b816014528060345263095ea7b360601b5f5260205f604460105f875af13d1560015f51141716612576575f60345263095ea7b360601b5f525f38604460105f875af1508060345260205f604460105f875af13d1560015f5114171661257657633e3f8f735f526004601cfd5b5f603452505050565b6125aa6040518060800160405280606081526020016060815260200160608152602001606081525090565b846001600160401b038111156125c2576125c2613d3c565b6040519080825280602002602001820160405280156125eb578160200160208202803683370190505b508152846001600160401b0381111561260657612606613d3c565b60405190808252806020026020018201604052801561262f578160200160208202803683370190505b506020820152846001600160401b0381111561264d5761264d613d3c565b604051908082528060200260200182016040528015612676578160200160208202803683370190505b506040820152846001600160401b0381111561269457612694613d3c565b6040519080825280602002602001820160405280156126bd578160200160208202803683370190505b506060820152805180518991905f906126d8576126d8614820565b60200260200101906001600160a01b031690816001600160a01b0316815250508681602001515f8151811061270f5761270f614820565b602002602001018181525050600181604001515f8151811061273357612733614820565b602002602001018181525050600281606001515f8151811061275757612757614820565b6020908102919091010152600184156127f057602087015182518051600190811061278457612784614820565b60200260200101906001600160a01b031690816001600160a01b0316815250508482604001516001815181106127bc576127bc614820565b602002602001018181525050600182606001516001815181106127e1576127e1614820565b60209081029190910101525060025b8315612881576040870151825180518390811061280f5761280f614820565b60200260200101906001600160a01b031690816001600160a01b031681525050838260400151828151811061284657612846614820565b60200260200101818152505060018260600151828151811061286a5761286a614820565b602090810291909101015261287e81614834565b90505b82156129195773940181a94a35a4569e4529a3cdfb74e38fd98631825f015182815181106128b1576128b1614820565b60200260200101906001600160a01b031690816001600160a01b03168152505082826040015182815181106128e8576128e8614820565b60200260200101818152505060018260600151828151811061290c5761290c614820565b6020026020010181815250505b50979650505050505050565b5f611ade7333128a8fc17869897dce68ed026d694621f6fdfd8585856131a7565b5f611ade73ec8e5342b19977b4ef8892e02d8daecfa1315831735e7bb104d84c7cb9b682aac2f3d509f5f406809a86868661328e565b5f60405163a9059cbb60e01b81526001600160a01b038416600482015282602482015260205f6044835f895af13d15601f3d1160015f5114161716915050806129fe5760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b60448201526064015b60405180910390fd5b50505050565b815f528060020b60045260245ffd5b5f805f868910612a385760019250859150612a318960018887613351565b9050612b28565b878911612a4e57849150612a31895f8787613351565b5f612a5a8a8a8a6133ad565b90505f612a698b60018a6133f5565b90505f612a768289614516565b90505f612a8c89670de0b6b3a764000084611ae6565b905083811015612ae157600196505f612ab1858a670de0b6b3a7640000819003611ae6565b670de0b6b3a7640000019050612aca8286038483611ae6565b955050612ada8d6001878b613441565b9550612b23565b5f965086612af8858a670de0b6b3a7640000611ae6565b670de0b6b3a7640000039050612b118583038483611ae6565b965050612b208d5f888b613351565b94505b505050505b96509650969350505050565b5f836001600160a01b0316856001600160a01b03161115612b53579293925b846001600160a01b0316866001600160a01b031611612b8657612b7f612b7a86868661349b565b6134ff565b905061053c565b836001600160a01b0316866001600160a01b03161015612bdb575f612bac87868661349b565b90505f612bba878986613519565b9050612bd2818310612bcc57816134ff565b826134ff565b9250505061053c565b612be9612b7a868685613519565b9695505050505050565b5f8080805b6064811015612ca757612c0f8e8e8e8e8a8a613552565b9250886001600160a01b0316836001600160a01b031610612c4057612c368d8d8d8b6135fb565b9350505050612cae565b896001600160a01b0316836001600160a01b031611612c6557612c368d8d8d8a613637565b612c728e8e8e8e87613668565b9096509450612c878e8b8b8b8b8b8b8a6136e2565b909750955091508115612c9f57849350505050612cae565b600101612bf8565b5083925050505b9a9950505050505050505050565b5f805f86612ccf57876101800151612cd6565b8761016001515b90505f6001600160a01b038a167303a520b32c04bf3beef7beb72e919cf822ed34f114612d5c578989602001518a604001518b60800151604051602001612d4894939291906001600160a01b03948516815292841660208401529216604082015260029190910b606082015260800190565b604051602081830303815290604052612db9565b8989602001518a604001518b60600151604051602001612da994939291906001600160a01b03948516815292841660208401529216604082015262ffffff91909116606082015260800190565b6040516020818303038152906040525b90505f808a5f01516001600160a01b031663128acb08308c8c612ddb90615084565b88886040518663ffffffff1660e01b8152600401612dfd95949392919061509e565b60408051808303815f875af1158015612e18573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e3c9190614e6f565b9150915089612e5357612e4e82615084565b612e5c565b612e5c81615084565b891115612e74576001600160a01b0384166101408c01525b89612e9157612e8282615084565b612e8c9089614516565b612e9b565b612e9b8289614540565b955089612eb157612eac8188614540565b612ec4565b612eba81615084565b612ec49088614516565b945050505050965096945050505050565b5f805f805f85806020019051810190612eee91906150d8565b9250925092505f87612f04578860400151612f0a565b88602001515b9050612f206001600160a01b038216858561250a565b5f80856001600160a01b031684604051612f3a9190615167565b5f604051808303815f865af19150503d805f8114612f73576040519150601f19603f3d011682016040523d82523d5f602084013e612f78565b606091505b5091509150818190612f9d5760405162461bcd60e51b81526004016129f59190615182565b507303a520b32c04bf3beef7beb72e919cf822ed34f0196001600160a01b038d1601613043578a5f01516001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa158015613002573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130269190614bdf565b5050506001600160a01b039093166101408f0152506130bd915050565b8a5f01516001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160c060405180830381865afa158015613082573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130a69190614ae7565b5050506001600160a01b039092166101408e015250505b60208b01516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015613105573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131299190614e58565b6040808d015190516370a0823160e01b81523060048201529199506001600160a01b0316906370a0823190602401602060405180830381865afa158015613172573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131969190614e58565b965050505050505094509492505050565b5f826001600160a01b0316846001600160a01b0316106131c5575f80fd5b604080516001600160a01b03808716602083015285169181019190915262ffffff83166060820152859060800160408051601f1981840301815290829052805160209182012061326d939290917fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5491016001600160f81b0319815260609390931b6bffffffffffffffffffffffff191660018401526015830191909152603582015260550190565b60408051601f19818403018152919052805160209091012095945050505050565b5f826001600160a01b0316846001600160a01b0316106132ac575f80fd5b604080516001600160a01b038087166020830152851691810191909152600283900b6060820152612be99087906080016040516020818303038152906040528051906020012087604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b8152606093841b60148201526f5af43d82803e903d91602b57fd5bf3ff60801b6028820152921b6038830152604c8201526037808220606c830152605591012090565b5f6001600160801b03851115613365575f80fd5b5f61337d670de0b6b3a7640000848103908690611ae6565b90508461339b5761339681600160c01b6002890a613847565b612be9565b612be9816002880a600160c01b613847565b5f6001600160801b038411156133c1575f80fd5b8284035f836002870a816133d7576133d7614446565b0460028702869003039050612be982670de0b6b3a764000083611ae6565b5f826134235761341e8261340e6002600160601b615274565b613419600288615274565b613847565b611ade565b611ade82613432600287615274565b6134196002600160601b615274565b5f6001600160801b03851115613455575f80fd5b5f846134725761346d846002880a600160c01b613847565b613484565b61348484600160c01b6002890a613847565b9050612be981670de0b6b3a7640000858103611ae6565b5f826001600160a01b0316846001600160a01b031611156134ba579192915b5f6134dc856001600160a01b0316856001600160a01b0316600160601b6138e3565b90506134f483828787036001600160a01b03166138e3565b9150505b9392505050565b806001600160801b0381168114613514575f80fd5b919050565b5f826001600160a01b0316846001600160a01b03161115613538579192915b611ade82600160601b8686036001600160a01b03166138e3565b5f8061356584620f424089810390611ae6565b90505f8089156135a35761357c8789856001613989565b6001600160a01b031691506135938789875f613a78565b6001600160a01b031690506135d3565b6135af8789875f613989565b6001600160a01b031691506135c78789856001613a78565b6001600160a01b031690505b896135f0576135eb8183016002808206151591040190565b612cae565b600282820104612cae565b5f8061360e83620f424088810390613b56565b90505f61361e8587846001613989565b905061362c8186885f613b79565b979650505050505050565b5f8061364a83620f424088810390613b56565b90505f61365a8587846001613a78565b905061362c8582885f613bc5565b5f8086156136a6575f61367e8486886001613bc5565b905061369081620f4240898103613b56565b925061369e8486885f613b79565b9150506136d8565b5f6136b48585886001613b79565b90506136c681620f4240898103613b56565b92506136d48585885f613bc5565b9150505b9550959350505050565b5f805f805f8c1561371d57613707868c8a8d116136ff575f61349b565b8a8d0361349b565b91506137168c87898c01613519565b9050613749565b61372a868c898d0161349b565b91506137468c878a8c1161373e575f613519565b8a8c03613519565b90505b5f8183106137695761376482670de0b6b3a764000085611ae6565b61377c565b61377c83670de0b6b3a764000084611ae6565b670de0b6b3a7640000039050620f42408110828410156137e6575f6137ac8f8a6137a5886134ff565b6001613b79565b90508f6137be57808c039a508a6137df565b8b81116137d7576137d28a6009600a611ae6565b6137db565b8b81035b9950895b5050613832565b5f6137fc898f6137f5876134ff565b6001613bc5565b90508f613828578c811161381c576138178a6009600a611ae6565b613820565b8c81035b99508961382f565b808d039a508a5b50505b9e989d50969b50969950505050505050505050565b5f838302815f1985870982811083820303915050808411613866575f80fd5b805f03613878575082900490506134f8565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b5f80805f19858709858702925082811083820303915050805f03613917575f841161390c575f80fd5b5082900490506134f8565b808411613922575f80fd5b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f825f03613998575083611ade565b600160601b600160e01b03606085901b168215613a32576001600160a01b038616848102908582816139cc576139cc614446565b04036139fc578181018281106139fa576139f083896001600160a01b031683613c7d565b9350505050611ade565b505b50613a2a8185613a156001600160a01b038a1683615282565b613a1f9190614516565b808204910615150190565b915050611ade565b6001600160a01b038616848102908582041481831116613a595763f5c787f15f526004601cfd5b8082036139f0613a73846001600160a01b038b1684613c7d565b613cad565b5f8115613adb575f6001600160a01b03841115613aac57613aa784600160601b876001600160801b0316613847565b613ac3565b613ac36001600160801b038616606086901b615282565b9050613a2a613a73826001600160a01b038916614516565b5f6001600160a01b03841115613b0857613b0384600160601b876001600160801b0316613c7d565b613b25565b613b25606085901b6001600160801b038716808204910615150190565b9050806001600160a01b03871611613b4457634323a5555f526004601cfd5b6001600160a01b038616039050611ade565b5f825f190484118302158202613b6a575f80fd5b50910281810615159190040190565b5f6001600160a01b038481169086160360ff81901d90810118600160601b6001600160801b038516613bac818484613847565b9350845f83858409111684019350505050949350505050565b5f836001600160a01b0316856001600160a01b03161115613be4579293925b6001600160a01b038516613bfe5762bfc9215f526004601cfd5b600160601b600160e01b03606084901b166001600160a01b038686031683613c5157866001600160a01b0316613c3e8383896001600160a01b0316613847565b81613c4b57613c4b614446565b0461362c565b61362c613c688383896001600160a01b0316613c7d565b886001600160a01b0316808204910615150190565b5f613c89848484613847565b90508180613c9957613c99614446565b838509156134f857600101806134f8575f80fd5b806001600160a01b0381168114613514576135146393dafdf160e01b805f5260045ffd5b604080516101a0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081019190915290565b634e487b7160e01b5f52604160045260245ffd5b6040516101a081016001600160401b0381118282101715613d7357613d73613d3c565b60405290565b604051608081016001600160401b0381118282101715613d7357613d73613d3c565b604051601f8201601f191681016001600160401b0381118282101715613dc357613dc3613d3c565b604052919050565b6001600160a01b0381168114613ddf575f80fd5b50565b803561351481613dcb565b62ffffff81168114613ddf575f80fd5b803561351481613ded565b8060020b8114613ddf575f80fd5b803561351481613e08565b6001600160801b0381168114613ddf575f80fd5b803561351481613e21565b5f6101a08284031215613e51575f80fd5b613e59613d50565b613e6283613de2565b8152613e7060208401613de2565b6020820152613e8160408401613de2565b6040820152613e9260608401613dfd565b6060820152613ea360808401613e16565b6080820152613eb460a08401613e16565b60a0820152613ec560c08401613e16565b60c0820152613ed660e08401613e35565b60e0820152610100613ee9818501613de2565b90820152610120613efb848201613de2565b9082015261014083810135908201526101608084013590820152610180928301359281019290925250919050565b5f8083601f840112613f39575f80fd5b5081356001600160401b03811115613f4f575f80fd5b602083019150836020828501011115613f66575f80fd5b9250929050565b5f805f805f805f60c0888a031215613f83575f80fd5b8735613f8e81613dcb565b96506020880135613f9e81613dcb565b9550604088013594506060880135613fb581613e08565b93506080880135613fc581613e08565b925060a08801356001600160401b03811115613fdf575f80fd5b613feb8a828b01613f29565b989b979a50959850939692959293505050565b5f805f805f60808688031215614012575f80fd5b853561401d81613dcb565b9450602086013561402d81613dcb565b93506040860135925060608601356001600160401b0381111561404e575f80fd5b61405a88828901613f29565b969995985093965092949392505050565b5f6020828403121561407b575f80fd5b81356134f881613dcb565b5f805f805f60a0868803121561409a575f80fd5b85356140a581613dcb565b94506020860135935060408601356140bc81613e08565b925060608601356140cc81613e08565b915060808601356140dc81613dcb565b809150509295509295909350565b81516001600160a01b031681526101a08101602083015161411660208401826001600160a01b03169052565b50604083015161413160408401826001600160a01b03169052565b506060830151614148606084018262ffffff169052565b50608083015161415d608084018260020b9052565b5060a083015161417260a084018260020b9052565b5060c083015161418760c084018260020b9052565b5060e08301516141a260e08401826001600160801b03169052565b50610100838101516001600160a01b038116848301525050610120838101516001600160a01b0381168483015250506101408381015190830152610160808401519083015261018092830151929091019190915290565b5f805f6060848603121561420b575f80fd5b505081359360208301359350604090920135919050565b5f805f60608486031215614234575f80fd5b833561423f81613dcb565b9250602084013561424f81613dcb565b9150604084013561425f81613dcb565b809150509250925092565b5f806020838503121561427b575f80fd5b82356001600160401b03811115614290575f80fd5b61429c85828601613f29565b90969095509350505050565b5f815180845260208085019450602084015f5b838110156142d7578151875295820195908201906001016142bb565b509495945050505050565b8051608080845281519084018190525f916020919082019060a0860190845b818110156143265783516001600160a01b031683529284019291840191600101614301565b505060208501519250858103602087015261434181846142a8565b925050506040830151848203604086015261435c82826142a8565b9150506060830151848203606086015261053c82826142a8565b602081525f6134f860208301846142e2565b5f805f806060858703121561439b575f80fd5b843593506020850135925060408501356001600160401b038111156143be575f80fd5b6143ca87828801613f29565b95989497509550505050565b5f5b838110156143f05781810151838201526020016143d8565b50505f910152565b5f815180845261440f8160208601602086016143d6565b601f01601f19169290920160200192915050565b6001600160a01b03831681526040602082018190525f90611ade908301846143f8565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f8160020b8360020b8061448457614484614446565b627fffff1982145f198214161561449d5761449d61445a565b90059392505050565b5f8260020b8260020b028060020b91508082146144c5576144c561445a565b5092915050565b600282810b9082900b03627fffff198112627fffff8213171561042c5761042c61445a565b600281810b9083900b01627fffff8113627fffff198212171561042c5761042c61445a565b8082018082111561042c5761042c61445a565b808202811582820484141761042c5761042c61445a565b8181038181111561042c5761042c61445a565b80518015158114613514575f80fd5b5f60208284031215614572575f80fd5b6134f882614553565b5f6020828403121561458b575f80fd5b81516134f881613dcb565b5f6001600160401b038211156145ae576145ae613d3c565b5060051b60200190565b5f82601f8301126145c7575f80fd5b813560206145dc6145d783614596565b613d9b565b8083825260208201915060208460051b8701019350868411156145fd575f80fd5b602086015b8481101561462257803561461581613dcb565b8352918301918301614602565b509695505050505050565b5f82601f83011261463c575f80fd5b8135602061464c6145d783614596565b8083825260208201915060208460051b87010193508684111561466d575f80fd5b602086015b848110156146225780358352918301918301614672565b5f6001600160401b038211156146a1576146a1613d3c565b50601f01601f191660200190565b5f82601f8301126146be575f80fd5b81356146cc6145d782614689565b8181528460208386010111156146e0575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f60a08688031215614710575f80fd5b85356001600160401b0380821115614726575f80fd5b908701906080828a031215614739575f80fd5b614741613d79565b82358281111561474f575f80fd5b61475b8b8286016145b8565b82525060208301358281111561476f575f80fd5b61477b8b82860161462d565b602083015250604083013582811115614792575f80fd5b61479e8b82860161462d565b6040830152506060830135828111156147b5575f80fd5b6147c18b82860161462d565b60608301525096506147d560208901613de2565b95506147e360408901613e16565b94506147f160608901613e16565b93506080880135915080821115614806575f80fd5b50614813888289016146af565b9150509295509295909350565b634e487b7160e01b5f52603260045260245ffd5b5f600182016148455761484561445a565b5060010190565b5f805f806080858703121561485f575f80fd5b843561486a81613dcb565b9350602085013561487a81613dcb565b9250604085013561488a81613dcb565b9150606085013561489a81613ded565b939692955090935050565b60a081525f6148b760a08301896142e2565b60018060a01b03881660208401528660020b60408401528560020b60608401528281036080840152838152838560208301375f602085830101526020601f19601f860116820101915050979650505050505050565b60a081525f61491e60a08301886142e2565b60208382038185015261493182896142e2565b9150604084830360408601526060830188516060855281815180845260808701915085830193505f92505b8083101561498e57835180516001600160a01b031683528601518683015292850192600192909201919084019061495c565b50848b01518587015260408b0151604087015287810360608901526149b3818b6143f8565b9550505050505082810360808401526149cc81856143f8565b98975050505050505050565b80516bffffffffffffffffffffffff81168114613514575f80fd5b805161351481613e21565b5f805f805f805f805f805f806101808d8f031215614a1a575f80fd5b614a238d6149d8565b9b5060208d0151614a3381613dcb565b60408e0151909b50614a4481613dcb565b60608e0151909a50614a5581613dcb565b60808e0151909950614a6681613e08565b60a08e0151909850614a7781613e08565b60c08e0151909750614a8881613e08565b9550614a9660e08e016149f3565b94506101008d015193506101208d01519250614ab56101408e016149f3565b9150614ac46101608e016149f3565b90509295989b509295989b509295989b565b805161ffff81168114613514575f80fd5b5f805f805f8060c08789031215614afc575f80fd5b8651614b0781613dcb565b6020880151909650614b1881613e08565b9450614b2660408801614ad6565b9350614b3460608801614ad6565b9250614b4260808801614ad6565b9150614b5060a08801614553565b90509295509295509295565b5f60208284031215614b6c575f80fd5b81516134f881613ded565b5f805f805f805f805f805f806101808d8f031215614b93575f80fd5b614b9c8d6149d8565b9b5060208d0151614bac81613dcb565b60408e0151909b50614bbd81613dcb565b60608e0151909a50614bce81613dcb565b60808e0151909950614a6681613ded565b5f805f805f805f60e0888a031215614bf5575f80fd5b8751614c0081613dcb565b6020890151909750614c1181613e08565b9550614c1f60408901614ad6565b9450614c2d60608901614ad6565b9350614c3b60808901614ad6565b925060a088015160ff81168114614c50575f80fd5b9150614c5e60c08901614553565b905092959891949750929550565b5f60208284031215614c7c575f80fd5b81516134f881613e08565b602080825282518282018190525f9190848201906040850190845b81811015614cc457835163ffffffff1683529284019291840191600101614ca2565b50909695505050505050565b5f82601f830112614cdf575f80fd5b81516020614cef6145d783614596565b8083825260208201915060208460051b870101935086841115614d10575f80fd5b602086015b84811015614622578051614d2881613dcb565b8352918301918301614d15565b5f8060408385031215614d46575f80fd5b82516001600160401b0380821115614d5c575f80fd5b818501915085601f830112614d6f575f80fd5b81516020614d7f6145d783614596565b82815260059290921b84018101918181019089841115614d9d575f80fd5b948201945b83861015614dc95785518060060b8114614dba575f80fd5b82529482019490820190614da2565b91880151919650909350505080821115614de1575f80fd5b50614dee85828601614cd0565b9150509250929050565b600682810b9082900b03667fffffffffffff198112667fffffffffffff8213171561042c5761042c61445a565b5f8160060b8360060b80614e3b57614e3b614446565b667fffffffffffff1982145f198214161561449d5761449d61445a565b5f60208284031215614e68575f80fd5b5051919050565b5f8060408385031215614e80575f80fd5b505080516020909101519092909150565b5f60208284031215614ea1575f80fd5b81516134f881613e21565b81516001600160a01b0316815261018081016020830151614ed860208401826001600160a01b03169052565b506040830151614eed604084018260020b9052565b506060830151614f02606084018260020b9052565b506080830151614f17608084018260020b9052565b5060a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151614f5d828501826001600160a01b03169052565b50506101408381015190830152610160928301516001600160a01b0316929091019190915290565b5f805f8060808587031215614f98575f80fd5b845193506020850151614faa81613e21565b6040860151606090960151949790965092505050565b81516001600160a01b0316815261016081016020830151614fec60208401826001600160a01b03169052565b506040830151615003604084018262ffffff169052565b506060830151615018606084018260020b9052565b50608083015161502d608084018260020b9052565b5060a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151615073828501826001600160a01b03169052565b505061014092830151919092015290565b5f600160ff1b82016150985761509861445a565b505f0390565b6001600160a01b0386811682528515156020830152604082018590528316606082015260a0608082018190525f9061362c908301846143f8565b5f805f606084860312156150ea575f80fd5b83516150f581613dcb565b6020850151604086015191945092506001600160401b03811115615117575f80fd5b8401601f81018613615127575f80fd5b80516151356145d782614689565b818152876020838501011115615149575f80fd5b61515a8260208301602086016143d6565b8093505050509250925092565b5f82516151788184602087016143d6565b9190910192915050565b602081525f6134f860208301846143f8565b600181815b808511156151ce57815f19048211156151b4576151b461445a565b808516156151c157918102915b93841c9390800290615199565b509250929050565b5f826151e45750600161042c565b816151f057505f61042c565b816001811461520657600281146152105761522c565b600191505061042c565b60ff8411156152215761522161445a565b50506001821b61042c565b5060208310610133831016604e8410600b841016171561524f575081810a61042c565b6152598383615194565b805f190482111561526c5761526c61445a565b029392505050565b5f6134f860ff8416836151d6565b5f8261529057615290614446565b50049056fea2646970667358221220a1e3ced5eb9000142ed04bf1577a9483a84c813afc2cb9d8600b6b25c387a3a064736f6c63430008160033000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000002c68af0bb1400000000000000000000000000000000000000000000000000000d99a8cec7e20000