28 txs
48 calls
constructor
constructor()
functions
contractBalance
viewfunction contractBalance(address token) view returns (uint256 balance)
controller
viewfunction controller() view returns (address)
correctPriceDirection
purefunction correctPriceDirection(address base, address quote, uint160 sqrtPriceX96) pure returns (uint160 sqrtPriceX96Corrected)
factory
viewfunction factory() view returns (address)
funder
viewfunction funder() view returns (address)
getController
viewfunction getController() view returns (address _controller)
getFunder
viewfunction getFunder() view returns (address _funder)
getSqrtPriceX96FromPrice
purefunction getSqrtPriceX96FromPrice(int8 decimalDiff, uint80 price_12Decimals) pure returns (uint160 sqrtPriceX96)
getTotalValueEth12
viewfunction getTotalValueEth12() view returns (uint128 valueEth12)
getTotalValueUsd12
viewfunction getTotalValueUsd12() view returns (uint128 valueUsd12)
getUsd12ValueIn
viewfunction getUsd12ValueIn(address token) view returns (uint128 valueUsd12)
indexFromPositionId
viewfunction indexFromPositionId(uint256) view returns (uint8)
indexFromTokenAddress
viewfunction indexFromTokenAddress(address) view returns (uint8)
isTokenApprovedForSwap
viewfunction isTokenApprovedForSwap(address) view returns (bool)
liquidityPositions
viewfunction liquidityPositions(uint256) view returns (uint256)
nLiquidityPositions
viewfunction nLiquidityPositions() view returns (uint8)
nTokensHeld
viewfunction nTokensHeld() view returns (uint8)
numLiquidityPositionsByToken
viewfunction numLiquidityPositionsByToken(address) view returns (uint16)
owner
viewfunction owner() view returns (address)
sqrt
purefunction sqrt(uint256 x) pure returns (uint128)
swapRouter
viewfunction swapRouter() view returns (address)
tokensHeld
viewfunction tokensHeld(uint256) view returns (address)
utils
viewfunction utils() view returns (address)
v4PoolManager
viewfunction v4PoolManager() view returns (address)
v4PositionIdToBase
viewfunction v4PositionIdToBase(uint256) view returns (address)
v4PositionIdToQuote
viewfunction v4PositionIdToQuote(uint256) view returns (address)
v4PositionManager
viewfunction v4PositionManager() view returns (address)
validEmergencyTokens
viewfunction validEmergencyTokens(address) view returns (bool)
addEmergencyTokens
nonpayablefunction addEmergencyTokens(address[] tokens)
collectFees
nonpayablefunction collectFees(uint256 positionId)
createPosition
nonpayablefunction createPosition(tuple key, address quote, uint80 lowPrice12, uint80 highPrice12, uint256 toAdd) returns (uint256 positionId)
depositEth
payablefunction depositEth() payable
depositToken
nonpayablefunction depositToken(address token, uint256 amount)
destroyPosition
nonpayablefunction destroyPosition(uint256 positionId)
emergencyCircuitBreaker
nonpayablefunction emergencyCircuitBreaker(address storeOfValueToken)
lockEmergencyTokens
nonpayablefunction lockEmergencyTokens()
modifyLiquidity
nonpayablefunction modifyLiquidity(uint256 positionId, uint256 newBaseBal, uint256 newQuoteBal)
obtainTokens
nonpayablefunction obtainTokens(address token0, address token1, uint256 amount0, uint256 amount1)
renounceOwnership
nonpayablefunction renounceOwnership()
rescueTokens
nonpayablefunction rescueTokens(address token)
setController
nonpayablefunction setController(address newController)
setFunder
nonpayablefunction setFunder(address newFunder)
setUtils
nonpayablefunction setUtils(address utilsAdr)
swapTokens
nonpayablefunction swapTokens(address from, address to, uint256 maxIn, uint256 maxOut, uint24 slippageE6) returns (uint256 amountIn, uint256 amountOut)
swapTokensInto
nonpayablefunction swapTokensInto(address tokenFrom, address tokenTo, uint256 maxIn, uint256 maxOut) returns (uint256 tokensIn, uint256 tokensOut)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
withdrawEth
nonpayablefunction withdrawEth(address destination, uint256 amount)
withdrawToken
nonpayablefunction withdrawToken(address token, address destination, uint256 amount)
events
ControllerSet
event ControllerSet(address newController, address oldController)
Deposited
event Deposited(address token, uint256 amount)
EmergencyCircuitBreakerFlipped
event EmergencyCircuitBreakerFlipped(address storeOfValueToken)
FunderSet
event FunderSet(address newController, address oldController)
LiquidityFeesCollected
event LiquidityFeesCollected(uint256 poolPosition, address base, address quote, uint256 baseTaken, uint256 quoteTaken)
LiquidityModified
event LiquidityModified(uint256 poolPosition, address base, address quote, int128 liquidityChange)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
PositionBurned
event PositionBurned(uint256 poolPosition, address base, address quote, uint256 baseTaken, uint256 quoteTaken)
PositionMinted
event PositionMinted(uint256 poolPosition, address base, address quote, uint80 minPrice, uint80 maxPrice, uint256 toAdd)
TokensSwapped
event TokensSwapped(address from, address to, uint256 fromAmt, uint256 toAmt)
Withdrawn
event Withdrawn(address token, uint256 amount)
errors
No errors.
creation bytecode
0x60e060405273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4860805273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260a0527388e6a0c2ddd26feeb64f039a2c41296fcb3f564060c052600e805460ff199081169091556018805482169055601d80549091169055348015610075575f80fd5b5061007f33610202565b6080516001600160a01b039081165f908152600160208190526040808320805460ff19908116841790915560a05190941680845281842080548616841790559280527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb498054909416909117909255905163095ea7b360e01b815273e592427a0aece92de3edee1f18e0157c0586156460048201525f19602482015263095ea7b3906044016020604051808303815f875af115801561013f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101639190610377565b5060805160405163095ea7b360e01b815273e592427a0aece92de3edee1f18e0157c0586156460048201525f1960248201526001600160a01b039091169063095ea7b3906044016020604051808303815f875af11580156101c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ea9190610377565b506101f433610251565b6101fd336102b8565b61039d565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610259610318565b600280546001600160a01b038381166001600160a01b03198316811790935560408051938452911660208301819052917e7582b62407f53d49cfc72e7ddab574c06ef3b8aced104b54b7bed4681ee54a91015b60405180910390a15050565b6102c0610318565b600380546001600160a01b038381166001600160a01b03198316811790935560408051938452911660208301819052917f9fb5233a5c1113ee4f5aafa72ecf995c4c5bc0c057ecbcad707ea04ebc829c6691016102ac565b5f546001600160a01b031633146103755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b565b5f60208284031215610387575f80fd5b81518015158114610396575f80fd5b9392505050565b60805160a05160c051615fe761048f5f395f50505f8181610e0501528181610ea201528181610ef1015281816110900152818161147e01528181611a070152818161203801528181612183015281816125580152818161261901528181612a1a015281816137d10152818161380001528181613ef101528181613f6601528181614ddd01528181614e1801528181614e8d0152614f0701525f818161144c01528181611ad3015281816120160152818161296501528181612abf01528181612da201528181612e630152818161382a0152818161393501528181613c6f01528181613d9d0152613e120152615fe75ff3fe6080604052600436106102e5575f3560e01c80638172047911610181578063bf0e622b116100d4578063df2a558b11610083578063f2fde38b11610060578063f2fde38b14610932578063f60b36e314610951578063f77c47911461097057005b8063df2a558b146108a9578063e2f4dd43146108d7578063ed4ab0f8146108fe57005b8063c45a0155116100b1578063c45a015514610844578063c4b19b541461086b578063c53b77021461088a57005b8063bf0e622b146107b9578063c0c8eca6146107fb578063c31c9c071461081d57005b8063a9e88b8f11610130578063b1df47d81161010d578063b1df47d814610762578063b3a5794314610781578063bc329198146107a057005b8063a9e88b8f146106e8578063ac75886f14610716578063b17acdcd1461074357005b806392eefe9b1161015e57806392eefe9b146106965780639a7fe3a1146106b55780639ba69249146106d457005b8063817204791461063e5780638abb98451461065d5780638da5cb5b1461067a57005b806339040ed1116102395780634a2539c3116101e8578063677342ce116101c5578063677342ce146105ec578063699535011461060b578063715018a61461062a57005b80634a2539c3146105795780635a29638d1461059857806363011d1a146105b757005b8063483e0cd711610216578063483e0cd7146104fd578063495915d31461051c57806349c69fd81461053b57005b806339040ed11461049c57806342d9843e146104c7578063439370b1146104f557005b806319cc3357116102955780633018205f116102725780633018205f1461044157806332c4171d1461045e578063338b5dea1461047d57005b806319cc3357146103ef5780631b9a91a4146104035780631fba9eda1461042257005b8063041ae880116102c3578063041ae8801461037d57806308092e9a1461039c5780630acc8cd1146103d057005b8062ae3bf8146102ee57806301e336671461030d57806302c512ca1461032c57005b366102ec57005b005b3480156102f9575f80fd5b506102ec610308366004615532565b61098f565b348015610318575f80fd5b506102ec61032736600461554d565b610b0d565b348015610337575f80fd5b5061036061034636600461558b565b601b6020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610388575f80fd5b50600354610360906001600160a01b031681565b3480156103a7575f80fd5b506103bb6103b63660046155b2565b610cc0565b60408051928352602083019190915201610374565b3480156103db575f80fd5b506102ec6103ea366004615532565b61115c565b3480156103fa575f80fd5b506102ec6111dc565b34801561040e575f80fd5b506102ec61041d36600461560d565b611211565b34801561042d575f80fd5b5061036061043c36600461564e565b6112ef565b34801561044c575f80fd5b506002546001600160a01b0316610360565b348015610469575f80fd5b506102ec610478366004615689565b611351565b348015610488575f80fd5b506102ec61049736600461560d565b611539565b3480156104a7575f80fd5b50600e546104b59060ff1681565b60405160ff9091168152602001610374565b3480156104d2575f80fd5b506104b56104e136600461558b565b60196020525f908152604090205460ff1681565b6102ec6116e8565b348015610508575f80fd5b506102ec6105173660046156cc565b611722565b348015610527575f80fd5b506102ec6105363660046156f5565b6118cc565b348015610546575f80fd5b50610569610555366004615532565b601a6020525f908152604090205460ff1681565b6040519015158152602001610374565b348015610584575f80fd5b506102ec61059336600461558b565b611b55565b3480156105a3575f80fd5b50600454610360906001600160a01b031681565b3480156105c2575f80fd5b506105cb611fbf565b6040516fffffffffffffffffffffffffffffffff9091168152602001610374565b3480156105f7575f80fd5b506105cb61060636600461558b565b6126b1565b348015610616575f80fd5b506102ec610625366004615532565b612832565b348015610635575f80fd5b506102ec612874565b348015610649575f80fd5b506103bb610658366004615689565b612887565b348015610668575f80fd5b506003546001600160a01b0316610360565b348015610685575f80fd5b505f546001600160a01b0316610360565b3480156106a1575f80fd5b506102ec6106b0366004615532565b6128a5565b3480156106c0575f80fd5b506105cb6106cf366004615532565b61291c565b3480156106df575f80fd5b506105cb6129e6565b3480156106f3575f80fd5b50610569610702366004615532565b60016020525f908152604090205460ff1681565b348015610721575f80fd5b5061073561073036600461558b565b612ef7565b604051908152602001610374565b34801561074e575f80fd5b506102ec61075d36600461558b565b612f0d565b34801561076d575f80fd5b5061073561077c366004615766565b612f1a565b34801561078c575f80fd5b5061036061079b3660046157cd565b613418565b3480156107ab575f80fd5b506018546104b59060ff1681565b3480156107c4575f80fd5b506107e86107d3366004615532565b60056020525f908152604090205461ffff1681565b60405161ffff9091168152602001610374565b348015610806575f80fd5b506103606e04444c5dc75cb358380d2e3de08a9081565b348015610828575f80fd5b5061036073e592427a0aece92de3edee1f18e0157c0586156481565b34801561084f575f80fd5b50610360731f98431c8ad98523631ae4a59f267346ea31f98481565b348015610876575f80fd5b5061036061088536600461558b565b61346e565b348015610895575f80fd5b506107356108a4366004615532565b61348d565b3480156108b4575f80fd5b506104b56108c3366004615532565b600f6020525f908152604090205460ff1681565b3480156108e2575f80fd5b5061036073bd216513d74c8cf14cf4747e6aaa6420ff64ee9e81565b348015610909575f80fd5b5061036061091836600461558b565b601c6020525f90815260409020546001600160a01b031681565b34801561093d575f80fd5b506102ec61094c366004615532565b613528565b34801561095c575f80fd5b506102ec61096b366004615532565b6135cf565b34801561097b575f80fd5b50600254610360906001600160a01b031681565b6109976138c0565b6001600160a01b0381165f908152600f6020526040902054600e5460ff9182169116811015806109f05750816001600160a01b031660068260ff16600881106109e2576109e2615815565b01546001600160a01b031614155b610a5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f43616e6e6f74202772657363756527206465706f73697473000000000000000060448201526064015b60405180910390fd5b816001600160a01b031663a9059cbb610a7b5f546001600160a01b031690565b610a848561348d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015610ae4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b089190615842565b505050565b6003546001600160a01b03163314610b81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a656400000000000000000000000000000000000000006044820152606401610a52565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af1158015610be6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c0a9190615842565b610c70576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5472616e73666572206661696c656400000000000000000000000000000000006044820152606401610a52565b610c7983613933565b604080516001600160a01b0385168152602081018390527f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5910160405180910390a1505050565b6002545f9081906001600160a01b0316331480610cdc57503330145b610d42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a656400000000000000000000000000000000000000006044820152606401610a52565b600480546040517f64aa79a30000000000000000000000000000000000000000000000000000000081526001600160a01b038a8116938201939093528883166024820152604481018890526064810187905262ffffff861660848201525f92839216906364aa79a39060a401606060405180830381865afa158015610dc9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ded9190615861565b90955090925090506001600160a01b038916610e74577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004015f604051808303818588803b158015610e5c575f80fd5b505af1158015610e6e573d5f803e3d5ffd5b50505050505b5f6040518061010001604052805f6001600160a01b03168c6001600160a01b031614610ea0578b610ec2565b7f00000000000000000000000000000000000000000000000000000000000000005b6001600160a01b031681526020015f6001600160a01b03168b6001600160a01b031614610eef578a610f11565b7f00000000000000000000000000000000000000000000000000000000000000005b6001600160a01b03168152602001846001600160a01b031663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f5b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f7f9190615895565b62ffffff168152602001306001600160a01b031681526020014281526020018681526020018381526020015f6001600160a01b0316815250905073e592427a0aece92de3edee1f18e0157c058615646001600160a01b031663414bf389826040518263ffffffff1660e01b8152600401610ff991906158b0565b6020604051808303815f875af1158015611015573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110399190615941565b93506001600160a01b038a1615611053576110538a613933565b6001600160a01b0389166110f4576040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d906024015f604051808303815f87803b1580156110d9575f80fd5b505af11580156110eb573d5f803e3d5ffd5b505050506110fd565b6110fd89613b29565b604080516001600160a01b03808d1682528b166020820152908101869052606081018590527f25f1d03755df23c30e25db2dbd3891e31ce084bdfbfc46f9fe5e446ee5f9b2d49060800160405180910390a15050509550959350505050565b6111646138c0565b600380546001600160a01b038381167fffffffffffffffffffffffff00000000000000000000000000000000000000008316811790935560408051938452911660208301819052917f9fb5233a5c1113ee4f5aafa72ecf995c4c5bc0c057ecbcad707ea04ebc829c6691015b60405180910390a15050565b6111e46138c0565b601d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6003546001600160a01b03163314611285576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a656400000000000000000000000000000000000000006044820152606401610a52565b6040516001600160a01b0383169082156108fc029083905f818181858888f193505050501580156112b8573d5f803e3d5ffd5b50604080515f8152602081018390527f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d591016111d0565b5f8061132a8369ffffffffffffffffffff16780100000000000000000000000000000000000000000000000086600c0160ff16600a0a6140ae565b9050611335816126b1565b6fffffffffffffffffffffffffffffffff169150505b92915050565b5f61135b8561348d565b90505f6113678561348d565b90508382101580156113795750828110155b15611385575050611533565b5f805f84871061139757848703611399565b5f5b91508386106113aa578386036113ac565b5f5b905086851080156113bc57508584115b156113fe5785840392505f6113e1898b86620f4240620f7cd888025b04613a98610cc0565b915050808311156113f4578083036113f6565b5f5b925050611445565b858410801561140c57508685115b156114455786850392505f61142c8a8a86620f4240620f7cd887026113d8565b9150508082111561143f57808203611441565b5f5b9150505b61147289897f00000000000000000000000000000000000000000000000000000000000000008585614177565b90925090506114a489897f00000000000000000000000000000000000000000000000000000000000000008585614177565b90925090506114b689895f8585614177565b9092509050811580156114c7575080155b61152d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f556e64657266756e6465640000000000000000000000000000000000000000006044820152606401610a52565b50505050505b50505050565b6003546001600160a01b031633146115ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a656400000000000000000000000000000000000000006044820152606401610a52565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018290526001600160a01b038316906323b872dd906064016020604051808303815f875af1158015611616573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061163a9190615842565b6116a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5472616e73666572206661696c656400000000000000000000000000000000006044820152606401610a52565b6116a982613b29565b604080516001600160a01b0384168152602081018390527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c491016111d0565b604080515f81523460208201527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4910160405180910390a1565b6002546001600160a01b03163314611796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a656400000000000000000000000000000000000000006044820152606401610a52565b5f838152601b6020908152604080832054601c9092528220546001600160a01b03918216929116906117c78361348d565b90505f6117d38361348d565b600480546040517f080085220000000000000000000000000000000000000000000000000000000081529182018a90526001600160a01b0387811660248401528681166044840152606483018690526084830184905260a483018a905260c483018990529293505f9283928392919091169063080085229060e401606060405180830381865afa158015611869573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061188d9190615985565b9250925092505f83600f0b13156118aa576118aa87878484611351565b6118b48a84614276565b6118c087878b8b611351565b50505050505050505050565b6118d46138c0565b601d5460ff1615611941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f6c6f636b656400000000000000000000000000000000000000000000000000006044820152606401610a52565b5f61194a6129e6565b600802662386f26fc100000190505f5b60ff8116831115611533575f84848360ff1681811061197b5761197b615815565b90506020020160208101906119909190615532565b6001600160a01b038181165f8181526001602081905260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690911790556004805491517f7afd0a86000000000000000000000000000000000000000000000000000000008152908101929092527f0000000000000000000000000000000000000000000000000000000000000000831660248301526fffffffffffffffffffffffffffffffff87166044830152929350911690637afd0a86906064016020604051808303815f875af1158015611a70573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a9491906159a7565b50600480546040517f7afd0a860000000000000000000000000000000000000000000000000000000081526001600160a01b03848116938201939093527f0000000000000000000000000000000000000000000000000000000000000000831660248201525f6044820152911690637afd0a86906064016020604051808303815f875af1158015611b27573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b4b91906159a7565b505060010161195a565b6002546001600160a01b03163314611bc9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a656400000000000000000000000000000000000000006044820152606401610a52565b5f818152601b6020908152604080832054601c9092528220546001600160a01b0391821692911690611bfa8361348d565b90505f611c068361348d565b90505f60036011604051602001611c27929190918252602082015260400190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815260028084526060840190925292505f9190816020015b6060815260200190600190039081611c685790505060408051602081018a90525f9181018290526060810182905260808082015260a081019190915290915060c001604051602081830303815290604052815f81518110611ccb57611ccb615815565b602090810291909101810191909152604080516001600160a01b03808a16938201939093529187169082015230606082015260800160405160208183030381529060405281600181518110611d2257611d22615815565b602002602001018190525073bd216513d74c8cf14cf4747e6aaa6420ff64ee9e6001600160a01b031663dd46508f8383604051602001611d63929190615a0e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052611d9c42603c615ace565b6040518363ffffffff1660e01b8152600401611db9929190615ae1565b5f604051808303815f87803b158015611dd0575f80fd5b505af1158015611de2573d5f803e3d5ffd5b505050505f84611df18861348d565b611dfb9190615b02565b90505f84611e088861348d565b611e129190615b02565b6001600160a01b0389165f908152600560205260408120805492935061ffff9092169190611e3f83615b15565b82546101009290920a61ffff8181021990931691831602179091556001600160a01b0389165f90815260056020526040812080549092169250611e8183615b15565b825461ffff9182166101009390930a9283029190920219909116179055506018805460ff16905f611eb183615b50565b82546101009290920a60ff81810219909316918316021790915560185416159050611f5d575f8981526019602052604090205460185460ff918216916010911660088110611f0157611f01615815565b015460108260ff1660088110611f1957611f19615815565b01558060195f601060ff841660088110611f3557611f35615815565b015481526020019081526020015f205f6101000a81548160ff021916908360ff160217905550505b604080518a81526001600160a01b038a81166020830152891681830152606081018490526080810183905290517f5501b833962ceaf131361ff8d59683c382ab00f523035d0fc4c2ffc19bef3a459181900360a00190a1505050505050505050565b5f611fcd620f424047615b62565b600480546040517f70a0823100000000000000000000000000000000000000000000000000000000815230928101929092529192506001600160a01b03918216916365a5e8d2917f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091908316906370a0823190602401602060405180830381865afa158015612080573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120a49190615941565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401602060405180830381865afa15801561210c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121309190615b9a565b61213a9082615bc9565b90505f5b600e5460ff90811690821610156122d2576004546001600160a01b03166365a5e8d2600660ff84166008811061217657612176615815565b01546001600160a01b03167f0000000000000000000000000000000000000000000000000000000000000000600660ff8616600881106121b8576121b8615815565b01546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612216573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061223a9190615941565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401602060405180830381865afa1580156122a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122c69190615b9a565b9091019060010161213e565b505f5b60185460ff90811690821610156126ad575f73bd216513d74c8cf14cf4747e6aaa6420ff64ee9e631efeed33601060ff85166008811061231757612317615815565b01546040518263ffffffff1660e01b815260040161233791815260200190565b602060405180830381865afa158015612352573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123769190615b9a565b90505f8073bd216513d74c8cf14cf4747e6aaa6420ff64ee9e637ba03aad601060ff8716600881106123aa576123aa615815565b01546040518263ffffffff1660e01b81526004016123ca91815260200190565b60c060405180830381865afa1580156123e5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124099190615c4d565b915091505f61243261241c8460a0902090565b6e04444c5dc75cb358380d2e3de08a909061452d565b50506004549192505f918291506001600160a01b031663c72e160b8461246361245e8860081c60020b90565b6145f8565b61247361245e8960201c60020b90565b60405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039384166004820152918316602483015290911660448201526fffffffffffffffffffffffffffffffff891660648201526084016040805180830381865afa1580156124f4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125189190615cde565b6004805488516040517f65a5e8d20000000000000000000000000000000000000000000000000000000081526001600160a01b03918216938101939093527f000000000000000000000000000000000000000000000000000000000000000081166024840152604483018590529395509193509116906365a5e8d290606401602060405180830381865afa1580156125b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125d69190615b9a565b6004805460208801516040517f65a5e8d20000000000000000000000000000000000000000000000000000000081526001600160a01b03918216938101939093527f000000000000000000000000000000000000000000000000000000000000000081166024840152604483018590529a90920199909116906365a5e8d290606401602060405180830381865afa158015612673573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126979190615b9a565b909701965050600190940193506122d592505050565b5090565b5f815f036126c057505f919050565b81600170010000000000000000000000000000000082106126e65760809190911c9060401b5b6801000000000000000082106127015760409190911c9060201b5b64010000000082106127185760209190911c9060101b5b62010000821061272d5760109190911c9060081b5b61010082106127415760089190911c9060041b5b601082106127545760049190911c9060021b5b600882106127605760011b5b600181858161277157612771615958565b048201901c9050600181858161278957612789615958565b048201901c905060018185816127a1576127a1615958565b048201901c905060018185816127b9576127b9615958565b048201901c905060018185816127d1576127d1615958565b048201901c905060018185816127e9576127e9615958565b048201901c9050600181858161280157612801615958565b0491909101901c5f6128138286615b62565b90508082106128225780612824565b815b95945050505050565b919050565b61283a6138c0565b600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b61287c6138c0565b6128855f6148f5565b565b5f8061289886868686613a98610cc0565b9150915094509492505050565b6128ad6138c0565b600280546001600160a01b038381167fffffffffffffffffffffffff00000000000000000000000000000000000000008316811790935560408051938452911660208301819052917e7582b62407f53d49cfc72e7ddab574c06ef3b8aced104b54b7bed4681ee54a91016111d0565b5f806129278361348d565b600480546040517f65a5e8d20000000000000000000000000000000000000000000000000000000081526001600160a01b03878116938201939093527f0000000000000000000000000000000000000000000000000000000000000000831660248201526044810184905292935016906365a5e8d290606401602060405180830381865afa1580156129bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129df9190615b9a565b9392505050565b600480546040517fea4bc51c0000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116938201939093525f92670de0b6b3a764000092169063ea4bc51c90602401602060405180830381865afa158015612a74573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a989190615d00565b612aae9069ffffffffffffffffffff1647615d1b565b612ab89190615b62565b9050612ae37f000000000000000000000000000000000000000000000000000000000000000061291c565b612aed9082615bc9565b90505f5b600e5460ff9081169082161015612b3757612b2b60068260ff1660088110612b1b57612b1b615815565b01546001600160a01b031661291c565b90910190600101612af1565b505f5b60185460ff90811690821610156126ad575f73bd216513d74c8cf14cf4747e6aaa6420ff64ee9e631efeed33601060ff851660088110612b7c57612b7c615815565b01546040518263ffffffff1660e01b8152600401612b9c91815260200190565b602060405180830381865afa158015612bb7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bdb9190615b9a565b90505f8073bd216513d74c8cf14cf4747e6aaa6420ff64ee9e637ba03aad601060ff871660088110612c0f57612c0f615815565b01546040518263ffffffff1660e01b8152600401612c2f91815260200190565b60c060405180830381865afa158015612c4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c6e9190615c4d565b915091505f612c8161241c8460a0902090565b50506004549192505f918291506001600160a01b031663c72e160b84612cad61245e8860081c60020b90565b612cbd61245e8960201c60020b90565b60405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039384166004820152918316602483015290911660448201526fffffffffffffffffffffffffffffffff891660648201526084016040805180830381865afa158015612d3e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d629190615cde565b6004805488516040517f65a5e8d20000000000000000000000000000000000000000000000000000000081526001600160a01b03918216938101939093527f000000000000000000000000000000000000000000000000000000000000000081166024840152604483018590529395509193509116906365a5e8d290606401602060405180830381865afa158015612dfc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e209190615b9a565b6004805460208801516040517f65a5e8d20000000000000000000000000000000000000000000000000000000081526001600160a01b03918216938101939093527f000000000000000000000000000000000000000000000000000000000000000081166024840152604483018590529a90920199909116906365a5e8d290606401602060405180830381865afa158015612ebd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ee19190615b9a565b90970196505060019094019350612b3a92505050565b60108160088110612f06575f80fd5b0154905081565b612f17815f614276565b50565b6002545f906001600160a01b03163314612f90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a656400000000000000000000000000000000000000006044820152606401610a52565b601854600860ff90911610613001576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4f7574206f66206d656d6f7279000000000000000000000000000000000000006044820152606401610a52565b73bd216513d74c8cf14cf4747e6aaa6420ff64ee9e6001600160a01b03166375794a3c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613051573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130759190615941565b90505f6001600160a01b03861661308f6020890189615532565b6001600160a01b0316146130af576130aa6020880188615532565b6130bf565b6130bf6040880160208901615532565b90505f866001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130fe573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131229190615d32565b826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561315e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131829190615d32565b61318c9190615d52565b90505f61319e838961079b858b6112ef565b90505f6131b0848a61079b868b6112ef565b90505f6131cf61241c6131c8368e90038e018e615d90565b60a0902090565b5050509050816001600160a01b0316836001600160a01b031611156131f2579091905b5f6131fe84848a61495c565b905061320d8c838686856149c6565b85601b5f8981526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508a601c5f8981526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060055f876001600160a01b03166001600160a01b031681526020019081526020015f205f81819054906101000a900461ffff16809291906132b790615e0a565b82546101009290920a61ffff8181021990931691831602179091556001600160a01b038d165f908152600560205260408120805490921692506132f983615e0a565b825461ffff9182166101009390930a928302919092021990911617905550601854879060109060ff166008811061333257613332615815565b0155601880545f89815260196020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff9384161790558254909116919061338183615e2a565b82546101009290920a60ff81810219909316919092169190910217905550604080518881526001600160a01b0388811660208301528d168183015269ffffffffffffffffffff8c811660608301528b16608082015260a081018a905290517f29cd472535c058e9f744cc9cead6f8c38cbe5ea230674d825060f275884bdd729181900360c00190a150505050505095945050505050565b5f826001600160a01b0316846001600160a01b0316101561343a5750806129df565b6134666001600160a01b0383167801000000000000000000000000000000000000000000000000615b62565b949350505050565b6006816008811061347d575f80fd5b01546001600160a01b0316905081565b5f6001600160a01b03821615613521576040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa1580156134f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061351c9190615941565b61134b565b4792915050565b6135306138c0565b6001600160a01b0381166135c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a52565b612f17816148f5565b6002546001600160a01b03163314806135f157505f546001600160a01b031633145b613657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4163636573732064656e696564000000000000000000000000000000000000006044820152606401610a52565b6001600160a01b0381165f9081526001602052604090205460ff166136d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c696420746f6b656e000000000000000000000000000000000000006044820152606401610a52565b60185460ff165b60ff811615613778577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0130634a2539c3601060ff84166008811061372657613726615815565b01546040518263ffffffff1660e01b815260040161374691815260200190565b5f604051808303815f87803b15801561375d575f80fd5b505af115801561376f573d5f803e3d5ffd5b505050506136df565b50600e5460ff165b60ff8116156137fa577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016137f5600660ff8316600881106137c4576137c4615815565b01546001600160a01b03167f0000000000000000000000000000000000000000000000000000000000000000614dbd565b613780565b506138257f000000000000000000000000000000000000000000000000000000000000000082614dbd565b61384f7f000000000000000000000000000000000000000000000000000000000000000082614dbd565b6138595f82614dbd565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556040516001600160a01b03821681527f2cc79b200fc7fdf7af6be005fc77813bfacedb82066816356eed5b7df46194709060200160405180910390a150565b5f546001600160a01b03163314612885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a52565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316148061397a57506001600160a01b038116155b156139825750565b6001600160a01b0381165f908152600f6020526040902054600e5460ff9182169116811080156139da5750816001600160a01b031660068260ff16600881106139cd576139cd615815565b01546001600160a01b0316145b80156139ee575060646139ec8361348d565b105b8015613a1357506001600160a01b0382165f9081526005602052604090205461ffff16155b15613b2557600e805460ff16905f613a2a83615b50565b82546101009290920a60ff818102199093169183160217909155600e5416159050613b2557600e5460069060ff1660088110613a6857613a68615815565b01546001600160a01b0316600660ff831660088110613a8957613a89615815565b0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905580600f5f600660ff841660088110613ada57613ada615815565b01546001600160a01b0316815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff929092169190911790555b5050565b6001600160a01b03811615801590613b5957506001600160a01b0381165f908152601a602052604090205460ff16155b15613c5a576040517f095ea7b300000000000000000000000000000000000000000000000000000000815273e592427a0aece92de3edee1f18e0157c0586156460048201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60248201526001600160a01b0382169063095ea7b3906044016020604051808303815f875af1158015613bf4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c189190615842565b506001600160a01b0381165f908152601a6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555b6001600160a01b03811615801590613ca457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614155b15612f17576001600160a01b0381165f818152600f602052604090205460069060ff1660088110613cd757613cd7615815565b01546001600160a01b0316141580613d0f5750600e546001600160a01b0382165f908152600f602052604090205460ff918216911610155b15612f1757600e54600860ff90911610613d85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4f7574206f66206d656d6f7279000000000000000000000000000000000000006044820152606401610a52565b5f613d8e6129e6565b613d99906002615e3f565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614613eef57600480546040517f7afd0a860000000000000000000000000000000000000000000000000000000081526001600160a01b03858116938201939093527f0000000000000000000000000000000000000000000000000000000000000000831660248201526fffffffffffffffffffffffffffffffff84166044820152911690637afd0a86906064016020604051808303815f875af1925050508015613eb4575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252613eb1918101906159a7565b60015b613eed573d808015613ee1576040519150601f19603f3d011682016040523d82523d5f602084013e613ee6565b606091505b5050613eef565b505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614613ff257600480546040517f7afd0a860000000000000000000000000000000000000000000000000000000081526001600160a01b03858116938201939093527f0000000000000000000000000000000000000000000000000000000000000000831660248201526fffffffffffffffffffffffffffffffff84166044820152911690637afd0a86906064016020604051808303815f875af1158015613fcc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ff091906159a7565b505b600e54829060069060ff166008811061400d5761400d615815565b0180546001600160a01b039283167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179055600e80549184165f908152600f6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff94851617905581549092169161409183615e2a565b91906101000a81548160ff021916908360ff160217905550505050565b5f80807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858709858702925082811083820303915050805f03614101575f84116140f6575f80fd5b5082900490506129df565b80841161410c575f80fd5b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b5f80846001600160a01b0316876001600160a01b0316141580156141ad5750846001600160a01b0316866001600160a01b031614155b1561426a575f6141bc8661348d565b9050620f424081101580156141d057505f85115b15614220575f80614200888b85620f42406141ee8c620f7cd8615d1b565b6141f89190615b62565b613a98610cc0565b915091508183039250868110156142195780870361421b565b5f5b965050505b620f4240811015801561423257505f84115b15614268575f61424f878984620f42406141ee8a620f7cd8615d1b565b9150508481101561426257808503614264565b5f5b9450505b505b50919590945092505050565b5f8082600f0b1315614288575f61428b565b60015b5f83600f0b131561429d57600d6142a0565b60115b604080516020810193909352820152606001604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815260028084526060840190925292505f9190816020015b60608152602001906001900390816142f3579050509050835f84600f0b1261431b5783614324565b61432484615e6a565b6040805160208101939093526fffffffffffffffffffffffffffffffff909116908201525f606082018190526080820181905260a08083015260c082015260e001604051602081830303815290604052815f8151811061438657614386615815565b6020908102919091018101919091525f858152601b8252604080822054601c8452918190205481516001600160a01b03938416948101949094529190911690820152306060820152608001604051602081830303815290604052816001815181106143f3576143f3615815565b602002602001018190525073bd216513d74c8cf14cf4747e6aaa6420ff64ee9e6001600160a01b031663dd46508f8383604051602001614434929190615a0e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905261446d42603c615ace565b6040518363ffffffff1660e01b815260040161448a929190615ae1565b5f604051808303815f87803b1580156144a1575f80fd5b505af11580156144b3573d5f803e3d5ffd5b5050505f858152601b6020908152604080832054601c8352928190205481518981526001600160a01b03948516938101939093529290921681830152600f86900b606082015290517f1172e6c2fa5b068f7396efd2ed20f26bf1ce7899860acd635416a62a99bb975c92509081900360800190a150505050565b5f805f805f61453b86615092565b6040517f1e2eaeaf000000000000000000000000000000000000000000000000000000008152600481018290529091505f906001600160a01b03891690631e2eaeaf90602401602060405180830381865afa15801561459c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145c09190615941565b90506001600160a01b03811695508060a01c60020b945062ffffff8160b81c16935062ffffff8160d01c169250505092959194509250565b60020b5f60ff82901d80830118620d89e881111561463a5761463a7f8b86327a00000000000000000000000000000000000000000000000000000000846150ce565b7001fffcb933bd6fad37aa2d162d1a5940016001821602700100000000000000000000000000000000186002821615614683576ffff97272373d413259a46990580e213a0260801c5b60048216156146a2576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b60088216156146c1576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b60108216156146e0576fffcb9843d60f6159c9db58835c9266440260801c5b60208216156146ff576fff973b41fa98c081472e6896dfb254c00260801c5b604082161561471e576fff2ea16466c96a3843ec78b326b528610260801c5b608082161561473d576ffe5dee046a99a2a811c461f1969c30530260801c5b61010082161561475d576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b61020082161561477d576ff987a7253ac413176f2b074cf7815e540260801c5b61040082161561479d576ff3392b0822b70005940c7a398e4b70f30260801c5b6108008216156147bd576fe7159475a2c29b7443b29c7fa6e889d90260801c5b6110008216156147dd576fd097f3bdfd2022b8845ad8f792aa58250260801c5b6120008216156147fd576fa9f746462d870fdf8a65dc1f90e061e50260801c5b61400082161561481d576f70d869a156d2a1b890bb3df62baf32f70260801c5b61800082161561483d576f31be135f97d08fd981231505542fcfa60260801c5b6201000082161561485e576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b6202000082161561487e576e5d6af8dedb81196699c329225ee6040260801c5b6204000082161561489d576d2216e584f5fa1ea926041bedfe980260801c5b620800008216156148ba576b048a170391f7dc42444e8fa20260801c5b5f8413156148e5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff045b63ffffffff0160201c9392505050565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f826001600160a01b0316846001600160a01b0316111561497b579192915b5f6149a6856001600160a01b0316856001600160a01b03166c010000000000000000000000006150dd565b90506128246149c184838888036001600160a01b03166150dd565b61512d565b600480546040517fc72e160b0000000000000000000000000000000000000000000000000000000081526001600160a01b0387811693820193909352858316602482015284831660448201526fffffffffffffffffffffffffffffffff841660648201525f928392169063c72e160b906084016040805180830381865afa158015614a53573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a779190615cde565b9092509050614aa3614a8c6020890189615532565b614a9c60408a0160208b01615532565b8484611351565b6040517f020000000000000000000000000000000000000000000000000000000000000060208201527f0d0000000000000000000000000000000000000000000000000000000000000060218201525f90602201604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815260028084526060840190925292505f9190816020015b6060815260200190600190039081614b3857905050905088614b606080820160608301615ea6565b614b7060808c0160608d01615ea6565b60020b614b7c8a615170565b60020b81614b8c57614b8c615958565b0502614b9e60808c0160608d01615ea6565b614bae60808d0160608e01615ea6565b60020b614bba8a615170565b60020b81614bca57614bca615958565b0502600a886103ff026fffffffffffffffffffffffffffffffff16901c87873030604051602001614c0a91906001600160a01b0391909116815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052614c4c9897969594939291602001615ec1565b604051602081830303815290604052815f81518110614c6d57614c6d615815565b6020026020010181905250885f016020810190614c8a9190615532565b614c9a60408b0160208c01615532565b604080516001600160a01b039384166020820152929091169082015260600160405160208183030381529060405281600181518110614cdb57614cdb615815565b60200260200101819052505f42603c0190505f614d108b5f016020810190614d039190615532565b6001600160a01b03161590565b614d1a575f614d1c565b855b905073bd216513d74c8cf14cf4747e6aaa6420ff64ee9e6001600160a01b031663dd46508f828686604051602001614d55929190615a0e565b604051602081830303815290604052856040518463ffffffff1660e01b8152600401614d82929190615ae1565b5f604051808303818588803b158015614d99575f80fd5b505af1158015614dab573d5f803e3d5ffd5b50505050505050505050505050505050565b5f614dc78361348d565b90506001600160a01b038316158015614e1157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b15614e8b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b158015614e6f575f80fd5b505af1158015614e81573d5f803e3d5ffd5b5050505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316148015614ed357506001600160a01b038216155b15614f6b576040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d906024015f604051808303815f87803b158015614f50575f80fd5b505af1158015614f62573d5f803e3d5ffd5b50505050505050565b816001600160a01b0316836001600160a01b031614610b08576040517f08092e9a0000000000000000000000000000000000000000000000000000000081526001600160a01b03808516600483015283166024820152604481018290527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6064820152620124f8608482015230906308092e9a9060a40160408051808303815f875af1925050508015615059575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261505691810190615cde565b60015b61508b573d808015615086576040519150601f19603f3d011682016040523d82523d5f602084013e61508b565b606091505b5050505050565b6040515f906150b1908390600690602001918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b815f528060020b60045260245ffd5b5f838302817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8587098281108382030391505080841161511b575f80fd5b805f0361410c575082900490506129df565b806fffffffffffffffffffffffffffffffff8116811461282d5761282d7f93dafdf10000000000000000000000000000000000000000000000000000000061546d565b5f73fffd8963efd1fc6a506488495d951d51639616827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffd895d83016001600160a01b031611156151e2576151e27f614875240000000000000000000000000000000000000000000000000000000083615475565b77ffffffffffffffffffffffffffffffffffffffff00000000602083901b16805f61520c8261548a565b60ff1690506080811061522757607f810383901c9150615231565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c670100000000000000161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581027ffffffffffffffffffffffffffffffffffd709b7e5480fba5a50fed5e62ffc5568101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b1461545e57886001600160a01b0316615443826145f8565b6001600160a01b031611156154585781615460565b80615460565b815b9998505050505050505050565b805f5260045ffd5b815f526001600160a01b03811660045260245ffd5b5f808211615496575f80fd5b507f0706060506020500060203020504000106050205030304010505030400000000601f6f8421084210842108cc6318c6db6d54be6fffffffffffffffffffffffffffffffff841160071b84811c67ffffffffffffffff1060061b1784811c63ffffffff1060051b1784811c61ffff1060041b1784811c60ff1060031b1793841c1c161a1790565b6001600160a01b0381168114612f17575f80fd5b5f60208284031215615542575f80fd5b81356129df8161551e565b5f805f6060848603121561555f575f80fd5b833561556a8161551e565b9250602084013561557a8161551e565b929592945050506040919091013590565b5f6020828403121561559b575f80fd5b5035919050565b62ffffff81168114612f17575f80fd5b5f805f805f60a086880312156155c6575f80fd5b85356155d18161551e565b945060208601356155e18161551e565b9350604086013592506060860135915060808601356155ff816155a2565b809150509295509295909350565b5f806040838503121561561e575f80fd5b82356156298161551e565b946020939093013593505050565b69ffffffffffffffffffff81168114612f17575f80fd5b5f806040838503121561565f575f80fd5b8235805f0b811461566e575f80fd5b9150602083013561567e81615637565b809150509250929050565b5f805f806080858703121561569c575f80fd5b84356156a78161551e565b935060208501356156b78161551e565b93969395505050506040820135916060013590565b5f805f606084860312156156de575f80fd5b505081359360208301359350604090920135919050565b5f8060208385031215615706575f80fd5b823567ffffffffffffffff81111561571c575f80fd5b8301601f8101851361572c575f80fd5b803567ffffffffffffffff811115615742575f80fd5b8560208260051b8401011115615756575f80fd5b6020919091019590945092505050565b5f805f805f85870361012081121561577c575f80fd5b60a0811215615789575f80fd5b5085945060a086013561579b8161551e565b935060c08601356157ab81615637565b925060e08601356157bb81615637565b94979396509194610100013592915050565b5f805f606084860312156157df575f80fd5b83356157ea8161551e565b925060208401356157fa8161551e565b9150604084013561580a8161551e565b809150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215615852575f80fd5b815180151581146129df575f80fd5b5f805f60608486031215615873575f80fd5b835161587e8161551e565b602085015160409095015190969495509392505050565b5f602082840312156158a5575f80fd5b81516129df816155a2565b5f610100820190506001600160a01b0383511682526001600160a01b03602084015116602083015262ffffff6040840151166040830152606083015161590160608401826001600160a01b03169052565b506080830151608083015260a083015160a083015260c083015160c083015260e083015161593a60e08401826001600160a01b03169052565b5092915050565b5f60208284031215615951575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f805f60608486031215615997575f80fd5b835180600f0b811461587e575f80fd5b5f602082840312156159b7575f80fd5b81516129df8161551e565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b604081525f615a2060408301856159c2565b828103602084015280845180835260208301915060208160051b840101602087015f5b83811015615a93577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018552615a7d8383516159c2565b6020958601959093509190910190600101615a43565b509098975050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561134b5761134b615aa1565b604081525f615af360408301856159c2565b90508260208301529392505050565b8181038181111561134b5761134b615aa1565b5f61ffff821680615b2857615b28615aa1565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b5f60ff821680615b2857615b28615aa1565b5f82615b95577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b5f60208284031215615baa575f80fd5b81516fffffffffffffffffffffffffffffffff811681146129df575f80fd5b6fffffffffffffffffffffffffffffffff818116838216019081111561134b5761134b615aa1565b60405160a0810167ffffffffffffffff81118282101715615c39577f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60405290565b8060020b8114612f17575f80fd5b5f8082840360c0811215615c5f575f80fd5b60a0811215615c6c575f80fd5b50615c75615bf1565b8351615c808161551e565b81526020840151615c908161551e565b60208201526040840151615ca3816155a2565b60408201526060840151615cb681615c3f565b60608201526080840151615cc98161551e565b608082015260a0939093015192949293505050565b5f8060408385031215615cef575f80fd5b505080516020909101519092909150565b5f60208284031215615d10575f80fd5b81516129df81615637565b808202811582820484141761134b5761134b615aa1565b5f60208284031215615d42575f80fd5b815160ff811681146129df575f80fd5b5f82810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808112607f8213171561134b5761134b615aa1565b5f60a0828403128015615da1575f80fd5b50615daa615bf1565b8235615db58161551e565b81526020830135615dc58161551e565b60208201526040830135615dd8816155a2565b60408201526060830135615deb81615c3f565b60608201526080830135615dfe8161551e565b60808201529392505050565b5f61ffff821661ffff8103615e2157615e21615aa1565b60010192915050565b5f60ff821660ff8103615e2157615e21615aa1565b6fffffffffffffffffffffffffffffffff818116838216029081169081811461593a5761593a615aa1565b5f81600f0b7fffffffffffffffffffffffffffffffff800000000000000000000000000000008103615e9e57615e9e615aa1565b5f0392915050565b5f60208284031215615eb6575f80fd5b81356129df81615c3f565b5f8935615ecd8161551e565b6001600160a01b0316825260208a0135615ee68161551e565b6001600160a01b0316602083015260408a0135615f02816155a2565b62ffffff16604083015260608a0135615f1a81615c3f565b60020b606083015260808a0135615f308161551e565b6001600160a01b03166080830152600289810b60a084015288900b60c08301526fffffffffffffffffffffffffffffffff871660e08301528561010083015284610120830152615f8c6101408301856001600160a01b03169052565b610180610160830152615fa36101808301846159c2565b9a995050505050505050505056fea2646970667358221220b71fda11993ed809a534b3b1a9d6b02c5f4ab1d708c4815d541ebeeab958467064736f6c634300081a0033