546 txs
538 calls
constructor
constructor(uint32 _startTimestamp, address _v3PositionManager, address _shaolin, address _weth, address _wbtc, address _vrfCoordinator, uint256 _subscriptionId, bytes32 _keyHash, (address _v3Router, address _v3Factory, address _owner) _params, (uint256 initialMinerCost, uint256 initialShaolinMintable, uint64 shaolinMintableDailyDecrease) _miningStats)
functions
calculateERankBonus
purefunction calculateERankBonus(uint256 _amountMined, uint8 _numOfDays) pure returns (uint256 eRankBonus)
currentShaolinMintable
viewfunction currentShaolinMintable(uint32 timeOfCreation) view returns (uint256 mintable)
getCurrentMinerCostByPower
viewfunction getCurrentMinerCostByPower(uint256 _power) view returns (uint256 cost)
getCurrentShaolinMintableByPower
viewfunction getCurrentShaolinMintableByPower(uint256 _power, uint32 timeOfCreation) view returns (uint256 mintable)
getTwapAmount
viewfunction getTwapAmount(address tokenIn, address tokenOut, uint24 poolTier, uint256 amount) view returns (uint256 twapAmount, uint224 slippage)
lamboPool
viewfunction lamboPool() view returns (address)
miners
viewfunction miners(address user, uint64 id) view returns (uint32 startTs, uint32 maturityTs, uint8 numOfDays, uint256 mintable, uint256 cost, uint8 status)
owner
viewfunction owner() view returns (address)
pendingOwner
viewfunction pendingOwner() view returns (address)
shaolin
viewfunction shaolin() view returns (address)
slippageAdmin
viewfunction slippageAdmin() view returns (address)
slippageConfigs
viewfunction slippageConfigs(address pool) view returns (uint224 slippage, uint32 twapLookback)
startTimestamp
viewfunction startTimestamp() view returns (uint32)
stats
viewfunction stats() view returns (uint256 initialMinerCost, uint256 initialShaolinMintable, uint64 shaolinMintableDailyDecrease)
totalMined
viewfunction totalMined(address user) view returns (uint256 totalAmountMined)
uniswapV3Router
viewfunction uniswapV3Router() view returns (address)
userMiners
viewfunction userMiners(address user) view returns (uint64 minerId)
v3Factory
viewfunction v3Factory() view returns (address)
v3PositionManager
viewfunction v3PositionManager() view returns (address)
wbtcPool
viewfunction wbtcPool() view returns (address)
weth
viewfunction weth() view returns (address)
acceptOwnership
nonpayablefunction acceptOwnership()
addLiquidityToWETHShaolinPool
nonpayablefunction addLiquidityToWETHShaolinPool(uint32 _deadline, uint64 slippage)
batchClaim
nonpayablefunction batchClaim(uint64[] _ids) returns (uint256 totalMinedAmount)
changeSlippageAdmin
nonpayablefunction changeSlippageAdmin(address _new)
changeSlippageConfig
nonpayablefunction changeSlippageConfig(address pool, uint224 _newSlippage, uint32 _newLookBack)
claimMiner
nonpayablefunction claimMiner(uint64 _id) returns (uint256 totalMinedAmount)
collectFees
nonpayablefunction collectFees() returns (uint256 amount0, uint256 amount1)
renounceOwnership
nonpayablefunction renounceOwnership()
startMining
payablefunction startMining(uint32 _duration, uint256 _power) payable returns (uint256 toMine)
startMiningBatch
payablefunction startMiningBatch(uint32 _duration, uint256 _power, uint256 _count) payable returns (uint256 toMine)
toggleBlackListed
nonpayablefunction toggleBlackListed(address _user, bool _value)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
events
Distributed
event Distributed(uint256 indexed toBuyAndBurn, uint256 indexed toGenesis)
MinerClaimed
event MinerClaimed(address indexed _user, uint256 indexed _id, uint256 indexed shaolinMined, uint256 lRankBonus)
MinerCreated
event MinerCreated(address indexed user, uint256 indexed power, uint256 indexed cost, uint32 startTs, uint32 maturityTs, uint64 id)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
OwnershipTransferStarted
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner)
SlippageAdminChanged
event SlippageAdminChanged(address indexed oldAdmin, address indexed newAdmin)
SlippageConfigChanged
event SlippageConfigChanged(address indexed pool, uint224 indexed newSlippage, uint32 indexed newLookback)
errors
Address0
error Address0()
Amount0
error Amount0()
Bytes0
error Bytes0()
Expired
error Expired()
GreaterThan
error GreaterThan(uint256 a, uint256 b)
OwnableInvalidOwner
error OwnableInvalidOwner(address owner)
OwnableUnauthorizedAccount
error OwnableUnauthorizedAccount(address account)
ShaolinMining__Blacklisted
error ShaolinMining__Blacklisted(address)
ShaolinMining__InvalidDuration
error ShaolinMining__InvalidDuration()
ShaolinMining__InvalidLadderParams
error ShaolinMining__InvalidLadderParams()
ShaolinMining__LiquidityAlreadyAdded
error ShaolinMining__LiquidityAlreadyAdded()
ShaolinMining__MaxLadderEndExceeded
error ShaolinMining__MaxLadderEndExceeded()
ShaolinMining__MinerAlreadyClaimed
error ShaolinMining__MinerAlreadyClaimed()
ShaolinMining__MinerNotMatureYet
error ShaolinMining__MinerNotMatureYet()
ShaolinMining__MiningIsOver
error ShaolinMining__MiningIsOver()
ShaolinMining__NotEnoughETH
error ShaolinMining__NotEnoughETH()
ShaolinMining__NotEnoughWETHForLiquidity
error ShaolinMining__NotEnoughWETHForLiquidity()
ShaolinMining__NotStartedYet
error ShaolinMining__NotStartedYet()
ShaolinMining__OnlyWETH
error ShaolinMining__OnlyWETH()
ShaolinMining__TransferFailed
error ShaolinMining__TransferFailed()
SwapActions__InvalidLookBack
error SwapActions__InvalidLookBack()
SwapActions__InvalidSlippage
error SwapActions__InvalidSlippage()
SwapActions__OnlySlippageAdmin
error SwapActions__OnlySlippageAdmin()
T
error T()
creation bytecode
0x610180604052348015610010575f5ffd5b50604051616f8d380380616f8d83398101604081905261002f91610364565b604082015182906001600160a01b03811661006357604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b61006c81610243565b5080516001600160a01b039081166080526020820151811660a052604091820151600280546001600160a01b03191691831691909117905589811661016052881661010052518a90879030906100c1906102ae565b63ffffffff90931683526001600160a01b039182166020840152166040820152606001604051809103905ff0801580156100fd573d5f5f3e3d5ffd5b506001600160a01b0316610120816001600160a01b031681525050308585898686604001518f60405161012f906102bb565b6001600160a01b039788168152958716602087015260408601949094529185166060850152608084015290921660a082015263ffffffff90911660c082015260e001604051809103905ff08015801561018a573d5f5f3e3d5ffd5b506001600160a01b03908116610140819052604084810151905163f2fde38b60e01b8152921660048301529063f2fde38b906024015f604051808303815f87803b1580156101d6575f5ffd5b505af11580156101e8573d5f5f3e3d5ffd5b50505063ffffffff909a1660c0526001600160a01b0390981660e052505085516005555050506020830151600655505060400151600780546001600160401b039092166001600160401b03199092169190911790555061045b565b600180546001600160a01b031916905561025c8161025f565b50565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610dc780614a0d83390190565b6117b9806157d483390190565b80516001600160a01b03811681146102de575f5ffd5b919050565b604051606081016001600160401b038111828210171561031157634e487b7160e01b5f52604160045260245ffd5b60405290565b5f60608284031215610327575f5ffd5b61032f6102e3565b825181526020808401519082015260408301519091506001600160401b0381168114610359575f5ffd5b604082015292915050565b5f5f5f5f5f5f5f5f5f5f6101c08b8d03121561037e575f5ffd5b8a5163ffffffff81168114610391575f5ffd5b995061039f60208c016102c8565b98506103ad60408c016102c8565b97506103bb60608c016102c8565b96506103c960808c016102c8565b95506103d760a08c016102c8565b94505f60c08c015190508094505060e08b015192506101008b015f6060828f031215610401575f5ffd5b6104096102e3565b9050610414826102c8565b8152610422602083016102c8565b6020820152610433604083016102c8565b6040820152925061044a90508c6101608d01610317565b90509295989b9194979a5092959850565b60805160a05160c05160e051610100516101205161014051610160516144466105c75f395f818161078901528181611252015281816117a301528181612016015281816129ef01528181612c5901528181612d3801528181612e4101528181612f20015281816130290152818161310801528181613335015261341401525f81816105f401528181611da80152818161322401526132a501525f818161026c0152611d0c01525f81816102f1015281816109e101528181610b1d0152818161119c015281816129ce01528181612ad501528181612c2a01528181612e1201528181612ffa015281816131f50152818161330601528181613501015281816135a6015261364901525f818161029f01528181610f18015281816112f501528181611397015281816114b70152818161155901526115fb01525f81816106d6015281816108a4015281816119dd0152611a8701525f818161045a0152610f9701525f61021c01526144465ff3fe6080604052600436106101e6575f3560e01c80639f47f04811610108578063d949f4f71161009d578063e6fd48bc1161006d578063e6fd48bc146106c5578063f0836b441461070d578063f2fde38b14610759578063fa0b7de714610778578063fd792698146107ab575f5ffd5b8063d949f4f7146105e3578063dd6a4a7f14610616578063e121ce4114610641578063e30c3978146106a8575f5ffd5b8063c68455f1116100d8578063c68455f114610514578063c879657214610533578063d1837eca1461055c578063d80528ae14610598575f5ffd5b80639f47f04814610498578063a3e0fc80146104b7578063b1a7162a146104d6578063b817ca0b146104f5575f5ffd5b80634d2a99d91161017e578063715018a61161014e578063715018a61461042157806379ba5097146104355780637c887c59146104495780638da5cb5b1461047c575f5ffd5b80634d2a99d91461035f57806350c043f7146103725780636caa4874146103915780636dec9da71461040e575f5ffd5b80633a237aa0116101b95780633a237aa0146102c15780633fc8cef3146102e0578063457c7afa146103135780634964461d14610332575f5ffd5b806315e7f5f7146101ea5780632c76d7a61461020b5780632f30dc7a1461025b57806339406c501461028e575b5f5ffd5b3480156101f5575f5ffd5b50610209610204366004613818565b6107ca565b005b348015610216575f5ffd5b5061023e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610266575f5ffd5b5061023e7f000000000000000000000000000000000000000000000000000000000000000081565b348015610299575f5ffd5b5061023e7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102cc575f5ffd5b5060025461023e906001600160a01b031681565b3480156102eb575f5ffd5b5061023e7f000000000000000000000000000000000000000000000000000000000000000081565b34801561031e575f5ffd5b5061020961032d36600461384f565b6107fc565b34801561033d575f5ffd5b5061035161034c36600461387b565b61086a565b604051908152602001610252565b61035161036d366004613896565b610984565b34801561037d575f5ffd5b5061035161038c3660046138c8565b610ace565b34801561039c575f5ffd5b506103fc6103ab3660046138fa565b600960209081525f9283526040808420909152908252902080546001820154600283015460039093015463ffffffff8084169464010000000085049091169360ff600160401b909104811693921686565b60405161025296959493929190613941565b61035161041c36600461399a565b610ae3565b34801561042c575f5ffd5b50610209610beb565b348015610440575f5ffd5b50610209610bfe565b348015610454575f5ffd5b5061023e7f000000000000000000000000000000000000000000000000000000000000000081565b348015610487575f5ffd5b505f546001600160a01b031661023e565b3480156104a3575f5ffd5b506102096104b23660046139c4565b610c47565b3480156104c2575f5ffd5b506103516104d1366004613a17565b610d53565b3480156104e1575f5ffd5b506103516104f0366004613a94565b610dc3565b348015610500575f5ffd5b5061035161050f366004613ab7565b610e3a565b34801561051f575f5ffd5b5061035161052e366004613ada565b610e4d565b34801561053e575f5ffd5b50610547610e58565b60408051928352602083019190915201610252565b348015610567575f5ffd5b5061057b610576366004613af3565b610f8f565b604080519283526001600160e01b03909116602083015201610252565b3480156105a3575f5ffd5b506005546006546007546105bf9291906001600160401b031683565b6040805193845260208401929092526001600160401b031690820152606001610252565b3480156105ee575f5ffd5b5061023e7f000000000000000000000000000000000000000000000000000000000000000081565b348015610621575f5ffd5b5061035161063036600461384f565b600a6020525f908152604090205481565b34801561064c575f5ffd5b5061068461065b36600461384f565b60036020525f90815260409020546001600160e01b03811690600160e01b900463ffffffff1682565b604080516001600160e01b03909316835263ffffffff909116602083015201610252565b3480156106b3575f5ffd5b506001546001600160a01b031661023e565b3480156106d0575f5ffd5b506106f87f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff9091168152602001610252565b348015610718575f5ffd5b5061074161072736600461384f565b60086020525f90815260409020546001600160401b031681565b6040516001600160401b039091168152602001610252565b348015610764575f5ffd5b5061020961077336600461384f565b6110d7565b348015610783575f5ffd5b5061023e7f000000000000000000000000000000000000000000000000000000000000000081565b3480156107b6575f5ffd5b506102096107c5366004613b48565b611147565b6107d261181e565b6001600160a01b03919091165f908152600b60205260409020805460ff1916911515919091179055565b806108068161184a565b61080e61181e565b6002546040516001600160a01b038085169216907fe29b0c9a6487aafa3c3ceb89f97f492476d5d1b3c03dbbdd4e1c004d8bd83ef4905f90a350600280546001600160a01b0319166001600160a01b0392909216919091179055565b60408051606081018252600554815260065460208201526007546001600160401b031681830152905163e091ed9f60e01b815263ffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152831660248201525f91908290735dcd2315a462f0046641b2118e106fbb47d133d39063e091ed9f90604401602060405180830381865af4158015610910573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109349190613b64565b905061097c82602001516109778460400151670de0b6b3a76400006109599190613b93565b6001600160401b031663ffffffff8516670de0b6b3a7640000611871565b611929565b949350505050565b5f3361098f81611954565b606483811184821802189250345f4290505f6109aa87610ace565b90505f5b86816001600160401b03161015610a8457818410156109df57604051625cda8760e51b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004015f604051808303818588803b158015610a38575f5ffd5b505af1158015610a4a573d5f5f3e3d5ffd5b50505050508184610a5b9190613bb2565b9350610a68838a8a61199f565b610a729087613bc5565b9550610a7d81613bd8565b90506109ae565b50335f908152600a602052604081208054879290610aa3908490613bc5565b90915550610ab2905085611cf5565b610aba611d73565b610ac383611ddf565b505050509392505050565b5f610add60055f015483611929565b92915050565b5f33610aee81611954565b425f610af985610ace565b905080341015610b1b57604051625cda8760e51b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b158015610b74575f5ffd5b505af1158015610b86573d5f5f3e3d5ffd5b5050505050610b9682878761199f565b335f908152600a6020526040812080549296508692909190610bb9908490613bc5565b90915550610bc8905084611cf5565b610bd0611d73565b610be2610bdd8234613bb2565b611ddf565b50505092915050565b610bf361181e565b610bfc5f611e4b565b565b60015433906001600160a01b03168114610c3b5760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b610c4481611e4b565b50565b8063ffffffff16610c5781611e64565b610c5f611e84565b60148263ffffffff161115610c87576040516330c067a960e01b815260040160405180910390fd5b670de0b6b3a76400006001600160e01b0384161115610cb9576040516338fd8f3960e21b815260040160405180910390fd5b8163ffffffff16836001600160e01b0316856001600160a01b03167f6b866971e730de54469a032413d79dc0037a7da3f92641b3a839ecc013a9c73e60405160405180910390a4506040805180820182526001600160e01b03938416815263ffffffff92831660208083019182526001600160a01b039096165f90815260039096529190942093519051909116600160e01b029116179055565b5f5f5b6001600160401b038116831115610dbc57610da0338585846001600160401b0316818110610d8657610d86613c02565b9050602002016020810190610d9b9190613ada565b611ec3565b610daa9083613bc5565b9150610db581613bd8565b9050610d56565b5092915050565b5f60198260ff1611610de757610de083666a94d74f430000611929565b9050610add565b60328260ff1611610e0457610de08367011c37937e080000611929565b604b8260ff1611610e2157610de0836701cdda4faccd0000611929565b610e338367027f7d0bdb920000611929565b9392505050565b5f610e33610e478361086a565b84611929565b5f610add3383611ec3565b60408051606080820183526004805460ff808216151585526101008204161515602080860191909152620100009091046001600160f01b0390811685870190815286516080810188529051909116815273248da8895eeda78f41611e4d0960962e74518e939181019182526001600160801b03818701818152948201818152965163fc6f786560e01b815282519481019490945291516001600160a01b03908116602485015293518216604484015294511660648201525f9384939290917f0000000000000000000000000000000000000000000000000000000000000000919091169063fc6f78659060840160408051808303815f875af1158015610f60573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f849190613c16565b909590945092505050565b5f5f5f610fc67f0000000000000000000000000000000000000000000000000000000000000000610fc1898989612083565b6120ed565b6001600160a01b0381165f908152600360209081526040918290208251808401909352546001600160e01b0381168352600160e01b900463ffffffff1690820181905291925090158015611022575080516001600160e01b0316155b156110645760405180604001604052806702c68af0bb140000670de0b6b3a764000061104e9190613b93565b6001600160401b03168152600f60209091015290505b5f8160200151603c6110769190613c38565b90505f611082846121d3565b90508163ffffffff168163ffffffff16101561109c578091505b5f6110a7858461238b565b5090505f6110b4826125ba565b8551975090506110c6818a8e8e6128d5565b975050505050505094509492505050565b6110df61181e565b600180546001600160a01b0383166001600160a01b0319909116811790915561110f5f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b61114f61181e565b816111598161299f565b60045460ff161561117d57604051633d04306560e21b815260040160405180910390fd5b6040516370a0823160e01b815230600482015267153ba6e4ca590000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156111e9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061120d9190613c57565b101561122c57604051631663004d60e11b815260040160405180910390fd5b604051630798111560e21b81523060048201526a018ffcd2db52767ee0000060248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631e604454906044015f604051808303815f87803b15801561129b575f5ffd5b505af11580156112ad573d5f5f3e3d5ffd5b505f92508291508190508080806112d86a018ffcd2db52767ee0000067153ba6e4ca5900008a6129c6565b955095509550955095509550816001600160a01b031663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000886040518363ffffffff1660e01b8152600401611332929190613c6e565b6020604051808303815f875af115801561134e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113729190613c87565b5060405163095ea7b360e01b81526001600160a01b0382169063095ea7b3906113c1907f0000000000000000000000000000000000000000000000000000000000000000908990600401613c6e565b6020604051808303815f875af11580156113dd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114019190613c87565b5060408051610160810182526001600160a01b03808516825283166020820152612710918101919091525f906060810160c861144181620d89e719613cb6565b61144b9190613cee565b60020b815260200160c880611463620d89e719613d0d565b61146d9190613cb6565b6114779190613cee565b60020b8152602001888152602001878152602001868152602001858152602001306001600160a01b031681526020018b63ffffffff1681525090505f5f5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166388316456856040518263ffffffff1660e01b81526004016115019190613d2d565b6080604051808303815f875af115801561151d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115419190613df1565b93509350509250856001600160a01b031663095ea7b37f00000000000000000000000000000000000000000000000000000000000000005f6040518363ffffffff1660e01b8152600401611596929190613c6e565b6020604051808303815f875af11580156115b2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115d69190613c87565b5060405163095ea7b360e01b81526001600160a01b0386169063095ea7b390611625907f0000000000000000000000000000000000000000000000000000000000000000905f90600401613c6e565b6020604051808303815f875af1158015611641573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116659190613c87565b50898210156116fb576001600160a01b03861663a9059cbb733eb390ec0816c8adc22a29379050bec45caf9aed61169c858e613bb2565b6040518363ffffffff1660e01b81526004016116b9929190613c6e565b6020604051808303815f875af11580156116d5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116f99190613c87565b505b88811015611790576001600160a01b03851663a9059cbb733eb390ec0816c8adc22a29379050bec45caf9aed611731848d613bb2565b6040518363ffffffff1660e01b815260040161174e929190613c6e565b6020604051808303815f875af115801561176a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061178e9190613c87565b505b50506040805160608101825260018082527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03908116971696909614602082018190526001600160f01b039390931691018190526004805461ffff19166101009093029290921790941761ffff166201000090940293909317909255505050505050505050565b5f546001600160a01b03163314610bfc5760405163118cdaa760e01b8152336004820152602401610c32565b6001600160a01b038116610c44576040516359c662df60e11b815260040160405180910390fd5b5f82801561191d578480156119135760018516801561189257869350611896565b8493505b50600284046002860495505b851561190d578687028760801c156118b8575f5ffd5b818101818110156118c7575f5ffd5b86900497505060018616156119025786840284888204141588151516156118ec575f5ffd5b818101818110156118fb575f5ffd5b8690049450505b6002860495506118a2565b50611917565b5f92505b50611921565b8291505b509392505050565b5f815f190483118202156119445763c4c5d7f55f526004601cfd5b50670de0b6b3a764000091020490565b6001600160a01b0381165f908152600b6020526040902054819060ff161561199b57604051631bc59e4f60e21b81526001600160a01b039091166004820152602401610c32565b5050565b5f816119aa81611e64565b4263ffffffff168563ffffffff166119c28282612a8c565b84670de0b6b3a76400006119d68282612a8c565b63ffffffff7f0000000000000000000000000000000000000000000000000000000000000000164263ffffffff161015611a2357604051632d3d6f0360e11b815260040160405180910390fd5b63ffffffff88166201518011801590611a4557506283d60063ffffffff891611155b8015611a615750611a596201518089613e38565b63ffffffff16155b611a7e5760405163234b28fb60e21b815260040160405180910390fd5b62740400611aac7f000000000000000000000000000000000000000000000000000000000000000042613e5f565b63ffffffff161115611ad157604051633d913bd560e11b815260040160405180910390fd5b5f611adb88610ace565b335f908152600860205260408120805492935090918290611b04906001600160401b0316613bd8565b91906101000a8154816001600160401b0302191690836001600160401b03160217905590505f6040518060c001604052808d63ffffffff1681526020018c8e611b4d9190613e7b565b63ffffffff168152602001611b65620151808e613e97565b60ff168152602001611b778c8f610e3a565b81526020810185905260400160019052335f9081526009602090815260408083206001600160401b038716845282529182902083518154928501519385015163ffffffff91821667ffffffffffffffff199094169390931764010000000091909416029290921768ff00000000000000001916600160401b60ff9092169190910217815560608201516001808301919091556080830151600283015560a083015160038301805494955085949192909160ff1916908381811115611c3d57611c3d61392d565b02179055508493508b92503391507f8eb8c1cf1114682f4a5681e8ad102e3eda495943d3c8bd299e45694d2a35c4f390508d611c798e82613e7b565b335f9081526008602090815260409182902054825163ffffffff958616815294909316908401526001600160401b039091169082015260600160405180910390a4611cc381612abe565b611cd0620151808a613e97565b60ff16611cdd898c610e3a565b611ce79190613ebe565b9a9950505050505050505050565b6040516353f1714560e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a7e2e28a90611d439033908590600401613c6e565b5f604051808303815f87803b158015611d5a575f5ffd5b505af1158015611d6c573d5f5f3e3d5ffd5b5050505050565b335f908152600a6020526040902054694f68ca6d8cd91c6000008110610c445760405163b91038c760e01b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b91038c790602401611d43565b8015610c44576040515f90339083908381818185875af1925050503d805f8114611e24576040519150601f19603f3d011682016040523d82523d5f602084013e611e29565b606091505b505090508061199b576040516304ee71eb60e21b815260040160405180910390fd5b600180546001600160a01b0319169055610c44816136e1565b805f03610c4457604051635a53a6e960e01b815260040160405180910390fd5b6002546001600160a01b0316331480611ea657505f546001600160a01b031633145b610bfc576040516371dd489b60e11b815260040160405180910390fd5b6001600160a01b0382165f9081526009602090815260408083206001600160401b038516845290915281206001600382015460ff166001811115611f0957611f0961392d565b14611f27576040516372af9fbf60e11b815260040160405180910390fd5b8054640100000000900463ffffffff164263ffffffff161015611f5d57604051631624e96760e11b815260040160405180910390fd5b60038101805460ff19169055805460018201545f91611f8791600160401b90910460ff1690613ebe565b82549091505f90611fa3908390600160401b900460ff16610dc3565b9050611faf8183613bc5565b935081856001600160401b0316876001600160a01b03167f7fc1048718c3bf3e867b3deec87b5074c97c9ef3b0fcba8ee593b769c1c9f43f84604051611ff791815260200190565b60405180910390a4604051630798111560e21b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631e6044549061204d9089908890600401613c6e565b5f604051808303815f87803b158015612064575f5ffd5b505af1158015612076573d5f5f3e3d5ffd5b5050505050505092915050565b604080516060810182525f8082526020820181905291810191909152826001600160a01b0316846001600160a01b031611156120bd579192915b50604080516060810182526001600160a01b03948516815292909316602083015262ffffff169181019190915290565b5f81602001516001600160a01b0316825f01516001600160a01b031610612112575f5ffd5b815160208084015160408086015181516001600160a01b0395861681860152949092168482015262ffffff90911660608085019190915281518085038201815260808501909252815191909201206001600160f81b031960a08401529085901b6bffffffffffffffffffffffff191660a183015260b58201527fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5460d582015260f50160408051601f1981840301815291905280516020909101209392505050565b5f5f5f836001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa158015612212573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122369190613ee6565b5050509350935050505f8161ffff16116122775760405162461bcd60e51b81526020600482015260026024820152614e4960f01b6044820152606401610c32565b5f806001600160a01b03861663252c09d784612294876001613f79565b61229e9190613f93565b6040516001600160e01b031960e084901b16815261ffff9091166004820152602401608060405180830381865afa1580156122db573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122ff9190613fc7565b935050509150806123775760405163252c09d760e01b81525f60048201526001600160a01b0387169063252c09d790602401608060405180830381865afa15801561234c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123709190613fc7565b5091935050505b6123818242613e5f565b9695505050505050565b5f5f8263ffffffff165f036123c75760405162461bcd60e51b8152602060048201526002602482015261042560f41b6044820152606401610c32565b6040805160028082526060820183525f9260208301908036833701905050905083815f815181106123fa576123fa613c02565b602002602001019063ffffffff16908163ffffffff16815250505f8160018151811061242857612428613c02565b602002602001019063ffffffff16908163ffffffff16815250505f5f866001600160a01b031663883bdbfd846040518263ffffffff1660e01b81526004016124709190614033565b5f60405180830381865afa15801561248a573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124b19190810190614140565b915091505f825f815181106124c8576124c8613c02565b6020026020010151836001815181106124e3576124e3613c02565b60200260200101516124f59190614203565b90505f825f8151811061250a5761250a613c02565b60200260200101518360018151811061252557612525613c02565b602090810291909101015103905063ffffffff88166125448184614230565b97505f8360060b128015612563575061255d8184614263565b60060b15155b15612576578761257281614284565b9850505b63ffffffff8916640100000000600160c01b03602084901b166125a06001600160a01b03836142a5565b6125aa91906142d6565b9750505050505050509250929050565b5f5f5f8360020b126125cf578260020b6125d6565b8260020b5f035b9050620d89e88111156125fc576040516315e4079d60e11b815260040160405180910390fd5b5f816001165f0361261157600160801b612623565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612657576ffff97272373d413259a46990580e213a0260801c5b6004821615612676576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612695576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b60108216156126b4576fffcb9843d60f6159c9db58835c9266440260801c5b60208216156126d3576fff973b41fa98c081472e6896dfb254c00260801c5b60408216156126f2576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612711576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612731576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612751576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612771576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612791576fe7159475a2c29b7443b29c7fa6e889d90260801c5b6110008216156127b1576fd097f3bdfd2022b8845ad8f792aa58250260801c5b6120008216156127d1576fa9f746462d870fdf8a65dc1f90e061e50260801c5b6140008216156127f1576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612811576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612832576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612852576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612871576d2216e584f5fa1ea926041bedfe980260801c5b6208000082161561288e576b048a170391f7dc42444e8fa20260801c5b5f8460020b13156128ad57805f19816128a9576128a9613ca2565b0490505b6401000000008106156128c15760016128c3565b5f5b60ff16602082901c0192505050919050565b5f6001600160801b036001600160a01b03861611612948575f61290260026001600160a01b0388166143e7565b9050826001600160a01b0316846001600160a01b0316106129315761292c600160c01b8683613730565b612940565b6129408186600160c01b613730565b91505061097c565b5f6129616001600160a01b03871680600160401b613730565b9050826001600160a01b0316846001600160a01b0316106129905761298b600160801b8683613730565b612381565b6123818186600160801b613730565b8063ffffffff16421115610c4457604051630407b05b60e31b815260040160405180910390fd5b5f80808080807f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0380821690831610612a28578082612a2b565b81815b90945092506001600160a01b0380851690831614612a4a578a8a612a4d565b898b5b9098509650612a65886001600160401b038b16611929565b612a78888b6001600160401b0316611929565b989c979b5099509697509195509392505050565b818181811015612ab85760405163f5c38b6160e01b815260048101929092526024820152604401610c32565b50505050565b6040516370a0823160e01b81523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015612b22573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b469190613c57565b60045490915060ff16612b845767153ba6e4ca5900008111612b66575050565b612b7867153ba6e4ca59000082613bb2565b6001600160c01b031691505b5f612b97836704db732547630000611929565b90505f612bac846702c68af0bb140000611929565b90505f612bc185670214e8348c4f0000611929565b90505f612bd586668e1bc9bf040000611929565b90505f612bea876701f161421c8e0000611929565b90505f612bfe88668e1bc9bf040000611929565b90505f612c128966d529ae9e860000611929565b90505f612c268a66470de4df820000611929565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663095ea7b37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663aa6df2996040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cb3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cd791906143f5565b8a6040518363ffffffff1660e01b8152600401612cf5929190613c6e565b6020604051808303815f875af1158015612d11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d359190613c87565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663aa6df2996040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d92573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612db691906143f5565b6001600160a01b03166375039309896040518263ffffffff1660e01b8152600401612de391815260200190565b5f604051808303815f87803b158015612dfa575f5ffd5b505af1158015612e0c573d5f5f3e3d5ffd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663095ea7b37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634cf088d96040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ebf91906143f5565b896040518363ffffffff1660e01b8152600401612edd929190613c6e565b6020604051808303815f875af1158015612ef9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f1d9190613c87565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634cf088d96040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f7a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f9e91906143f5565b6001600160a01b03166391c05b0b886040518263ffffffff1660e01b8152600401612fcb91815260200190565b5f604051808303815f87803b158015612fe2575f5ffd5b505af1158015612ff4573d5f5f3e3d5ffd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663095ea7b37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663365d007e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613083573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130a791906143f5565b886040518363ffffffff1660e01b81526004016130c5929190613c6e565b6020604051808303815f875af11580156130e1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131059190613c87565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663365d007e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613162573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061318691906143f5565b6001600160a01b0316636d4014e8876040518263ffffffff1660e01b81526004016131b391815260200190565b5f604051808303815f87803b1580156131ca575f5ffd5b505af11580156131dc573d5f5f3e3d5ffd5b505060405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016925063a9059cbb915061324e907f0000000000000000000000000000000000000000000000000000000000000000908990600401613c6e565b6020604051808303815f875af115801561326a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061328e9190613c87565b50604051630b32e9c760e31b8152600481018690527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906359974e38906024015f604051808303815f87803b1580156132ee575f5ffd5b505af1158015613300573d5f5f3e3d5ffd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663095ea7b37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663738153076040518163ffffffff1660e01b8152600401602060405180830381865afa15801561338f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133b391906143f5565b866040518363ffffffff1660e01b81526004016133d1929190613c6e565b6020604051808303815f875af11580156133ed573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134119190613c87565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663738153076040518163ffffffff1660e01b8152600401602060405180830381865afa15801561346e573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061349291906143f5565b6001600160a01b0316636d4014e8856040518263ffffffff1660e01b81526004016134bf91815260200190565b5f604051808303815f87803b1580156134d6575f5ffd5b505af11580156134e8573d5f5f3e3d5ffd5b505060405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016925063a9059cbb915061354e90738881243728be21c9df8804b527fb33085d59cfbf908690600401613c6e565b6020604051808303815f875af115801561356a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061358e9190613c87565b5060405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906135f190733eb390ec0816c8adc22a29379050bec45caf9aed908790600401613c6e565b6020604051808303815f875af115801561360d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136319190613c87565b5060405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906136949073e2a8315e1219361f7fcd2de5872e457bc6a804fe908590600401613c6e565b6020604051808303815f875af11580156136b0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136d49190613c87565b5050505050505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f838302815f1985870982811083820303915050805f036137645783828161375a5761375a613ca2565b0492505050610e33565b80841161377b5761377b60038515026011186137e6565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b634e487b715f52806020526024601cfd5b6001600160a01b0381168114610c44575f5ffd5b8015158114610c44575f5ffd5b5f5f60408385031215613829575f5ffd5b8235613834816137f7565b915060208301356138448161380b565b809150509250929050565b5f6020828403121561385f575f5ffd5b8135610e33816137f7565b63ffffffff81168114610c44575f5ffd5b5f6020828403121561388b575f5ffd5b8135610e338161386a565b5f5f5f606084860312156138a8575f5ffd5b83356138b38161386a565b95602085013595506040909401359392505050565b5f602082840312156138d8575f5ffd5b5035919050565b80356001600160401b03811681146138f5575f5ffd5b919050565b5f5f6040838503121561390b575f5ffd5b8235613916816137f7565b9150613924602084016138df565b90509250929050565b634e487b7160e01b5f52602160045260245ffd5b63ffffffff87811682528616602082015260ff85166040820152606081018490526080810183905260c081016002831061398957634e487b7160e01b5f52602160045260245ffd5b8260a0830152979650505050505050565b5f5f604083850312156139ab575f5ffd5b82356139b68161386a565b946020939093013593505050565b5f5f5f606084860312156139d6575f5ffd5b83356139e1816137f7565b925060208401356001600160e01b03811681146139fc575f5ffd5b91506040840135613a0c8161386a565b809150509250925092565b5f5f60208385031215613a28575f5ffd5b82356001600160401b03811115613a3d575f5ffd5b8301601f81018513613a4d575f5ffd5b80356001600160401b03811115613a62575f5ffd5b8560208260051b8401011115613a76575f5ffd5b6020919091019590945092505050565b60ff81168114610c44575f5ffd5b5f5f60408385031215613aa5575f5ffd5b82359150602083013561384481613a86565b5f5f60408385031215613ac8575f5ffd5b8235915060208301356138448161386a565b5f60208284031215613aea575f5ffd5b610e33826138df565b5f5f5f5f60808587031215613b06575f5ffd5b8435613b11816137f7565b93506020850135613b21816137f7565b9250604085013562ffffff81168114613b38575f5ffd5b9396929550929360600135925050565b5f5f60408385031215613b59575f5ffd5b82356139168161386a565b5f60208284031215613b74575f5ffd5b8151610e338161386a565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390811115610add57610add613b7f565b81810381811115610add57610add613b7f565b80820180821115610add57610add613b7f565b5f6001600160401b0382166001600160401b038103613bf957613bf9613b7f565b60010192915050565b634e487b7160e01b5f52603260045260245ffd5b5f5f60408385031215613c27575f5ffd5b505080516020909101519092909150565b63ffffffff8181168382160290811690818114610dbc57610dbc613b7f565b5f60208284031215613c67575f5ffd5b5051919050565b6001600160a01b03929092168252602082015260400190565b5f60208284031215613c97575f5ffd5b8151610e338161380b565b634e487b7160e01b5f52601260045260245ffd5b5f8160020b8360020b80613ccc57613ccc613ca2565b627fffff1982145f1982141615613ce557613ce5613b7f565b90059392505050565b5f8260020b8260020b028060020b9150808214610dbc57610dbc613b7f565b5f8160020b627fffff198103613d2557613d25613b7f565b5f0392915050565b81516001600160a01b0316815261016081016020830151613d5960208401826001600160a01b03169052565b506040830151613d70604084018262ffffff169052565b506060830151613d85606084018260020b9052565b506080830151613d9a608084018260020b9052565b5060a083015160a083015260c083015160c083015260e083015160e0830152610100830151610100830152610120830151613de16101208401826001600160a01b03169052565b5061014092830151919092015290565b5f5f5f5f60808587031215613e04575f5ffd5b845160208601519094506001600160801b0381168114613e22575f5ffd5b6040860151606090960151949790965092505050565b5f63ffffffff831680613e4d57613e4d613ca2565b8063ffffffff84160691505092915050565b63ffffffff8281168282160390811115610add57610add613b7f565b63ffffffff8181168382160190811115610add57610add613b7f565b5f63ffffffff831680613eac57613eac613ca2565b8063ffffffff84160491505092915050565b8082028115828204841417610add57610add613b7f565b805161ffff811681146138f5575f5ffd5b5f5f5f5f5f5f5f60e0888a031215613efc575f5ffd5b8751613f07816137f7565b8097505060208801518060020b8114613f1e575f5ffd5b9550613f2c60408901613ed5565b9450613f3a60608901613ed5565b9350613f4860808901613ed5565b925060a0880151613f5881613a86565b60c0890151909250613f698161380b565b8091505092959891949750929550565b61ffff8181168382160190811115610add57610add613b7f565b5f61ffff831680613fa657613fa6613ca2565b8061ffff84160691505092915050565b8051600681900b81146138f5575f5ffd5b5f5f5f5f60808587031215613fda575f5ffd5b8451613fe58161386a565b9350613ff360208601613fb6565b92506040850151614003816137f7565b60608601519092506140148161380b565b939692955090935050565b634e487b7160e01b5f52604160045260245ffd5b602080825282518282018190525f918401906040840190835b8181101561407057835163ffffffff1683526020938401939092019160010161404c565b509095945050505050565b604051601f8201601f191681016001600160401b03811182821017156140a3576140a361401f565b604052919050565b5f6001600160401b038211156140c3576140c361401f565b5060051b60200190565b5f82601f8301126140dc575f5ffd5b81516140ef6140ea826140ab565b61407b565b8082825260208201915060208360051b860101925085831115614110575f5ffd5b602085015b83811015614136578051614128816137f7565b835260209283019201614115565b5095945050505050565b5f5f60408385031215614151575f5ffd5b82516001600160401b03811115614166575f5ffd5b8301601f81018513614176575f5ffd5b80516141846140ea826140ab565b8082825260208201915060208360051b8501019250878311156141a5575f5ffd5b6020840193505b828410156141ce576141bd84613fb6565b8252602093840193909101906141ac565b8095505050505060208301516001600160401b038111156141ed575f5ffd5b6141f9858286016140cd565b9150509250929050565b600682810b9082900b03667fffffffffffff198112667fffffffffffff82131715610add57610add613b7f565b5f8160060b8360060b8061424657614246613ca2565b667fffffffffffff1982145f1982141615613ce557613ce5613b7f565b5f8260060b8061427557614275613ca2565b808360060b0791505092915050565b5f8160020b627fffff19810361429c5761429c613b7f565b5f190192915050565b6001600160c01b038181168382168181029092169181830481148215176142ce576142ce613b7f565b505092915050565b5f6001600160c01b038316806142ee576142ee613ca2565b6001600160c01b03929092169190910492915050565b6001815b600184111561433f5780850481111561432357614323613b7f565b600184161561433157908102905b60019390931c928002614308565b935093915050565b5f8261435557506001610add565b8161436157505f610add565b816001811461437757600281146143815761439d565b6001915050610add565b60ff84111561439257614392613b7f565b50506001821b610add565b5060208310610133831016604e8410600b84101617156143c0575081810a610add565b6143cc5f198484614304565b805f19048211156143df576143df613b7f565b029392505050565b5f610e3360ff841683614347565b5f60208284031215614405575f5ffd5b8151610e33816137f756fea264697066735822122066b108e66076a8c5c943139b3418633ce0b38696b783df3a950283040616af6164736f6c634300081b003360e060405234801561000f575f5ffd5b50604051610dc7380380610dc783398101604081905261002e91610069565b6001600160a01b039081166080521660a05263ffffffff1660c0526100b3565b80516001600160a01b0381168114610064575f5ffd5b919050565b5f5f5f6060848603121561007b575f5ffd5b835163ffffffff8116811461008e575f5ffd5b925061009c6020850161004e565b91506100aa6040850161004e565b90509250925092565b60805160a05160c051610ccf6100f85f395f818161022d0152818161088b01526108d801525f818160e001528181610405015261074701525f6108410152610ccf5ff3fe608060405234801561000f575f5ffd5b50600436106100b1575f3560e01c8063a7e2e28a1161006e578063a7e2e28a14610193578063b3ca61a8146101a6578063be26ed7f146101d0578063bff73c01146101ed578063c6a5699014610215578063e6fd48bc14610228575f5ffd5b806335e7531e146100b55780633cdc5389146100db578063728abc2f1461011a5780637453b7411461012f57806391c05b0b14610142578063a57701af14610155575b5f5ffd5b6100c86100c3366004610a35565b61024f565b6040519081526020015b60405180910390f35b6101027f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100d2565b61012d610128366004610a6a565b6102f2565b005b6100c861013d366004610a6a565b61034b565b61012d610150366004610aeb565b6103b3565b6100c8610163366004610b02565b63ffffffff82165f908152602081815260408083206001600160a01b038516845260020190915290205492915050565b61012d6101a1366004610b35565b610431565b6100c86101b4366004610b02565b600160209081525f928352604080842090915290825290205481565b6101d8610636565b60405163ffffffff90911681526020016100d2565b6100c86101fb366004610b5d565b63ffffffff165f9081526020819052604090206001015490565b61012d610223366004610a35565b61065e565b6101d87f000000000000000000000000000000000000000000000000000000000000000081565b63ffffffff81165f908152602081815260408083206001600160a01b03861684526002810190925282205481548390810361028f575f93505050506102ec565b610297610636565b63ffffffff168563ffffffff1610156102b1575060018201545b8254670de0b6b3a764000090816102c88486610b93565b6102d29190610b93565b6102dc9190610bbe565b6102e69190610bbe565b93505050505b92915050565b5f5b63ffffffff8116821115610345576103338484848463ffffffff1681811061031e5761031e610bd1565b90506020020160208101906102239190610b5d565b8061033d81610be5565b9150506102f4565b50505050565b5f5f5b63ffffffff81168311156103ab5761038d8585858463ffffffff1681811061037857610378610bd1565b90506020020160208101906100c39190610b5d565b6103979083610c09565b9150806103a381610be5565b91505061034e565b509392505050565b806103bd816107b9565b815f5f6103c8610636565b63ffffffff1663ffffffff1681526020019081526020015f206001015f8282546103f29190610c09565b9091555061042d90506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163330856107dc565b5050565b610439610836565b5f610442610636565b63ffffffff81165f908152602081815260408083206001600160a01b0388168452600281019092529091205491925090801561050157838363ffffffff16866001600160a01b03167fef4b476d4e19ccb68df9e83854b2960d8f1dde2ae8dabcbba1f435aac26c3d5260405160405180910390a483825f015f8282546104c89190610c09565b90915550506001600160a01b0385165f908152600283016020526040812080548692906104f6908490610c09565b9091555061062f9050565b63ffffffff83165f9081526001602090815260408083206001600160a01b038916845290915281208054869290610539908490610c09565b909155505063ffffffff83165f9081526001602090815260408083206001600160a01b0389168452909152902054691a784379d99db420000081101561058157505050505050565b848463ffffffff16876001600160a01b03167fef4b476d4e19ccb68df9e83854b2960d8f1dde2ae8dabcbba1f435aac26c3d5260405160405180910390a480835f015f8282546105d19190610c09565b90915550506001600160a01b0386165f908152600284016020526040812080548392906105ff908490610c09565b90915550505063ffffffff83165f9081526001602090815260408083206001600160a01b03891684529091528120555b5050505050565b5f5f610640610881565b905061064d601c82610c1c565b610658906001610c43565b91505090565b8161066881610972565b610670610636565b63ffffffff168263ffffffff161061069b57604051630afec14b60e31b815260040160405180910390fd5b63ffffffff82165f908152602081905260408120906106ba338561024f565b90505f81116106dc57604051634dd4d30560e01b815260040160405180910390fd5b335f81815260028401602052604080822082905551839263ffffffff88169290917f0d26a00dfd91636328b46a49a079c1612a57c89258f2fea78c7469ec0b5f80479190a460405163a9059cbb60e01b81526001600160a01b038681166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af115801561078d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b19190610c5f565b505050505050565b805f036107d957604051635a53a6e960e01b815260040160405180910390fd5b50565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610345908590610999565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461087f57604051636f9ce36960e11b815260040160405180910390fd5b565b5f4263ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611156108bc5750600190565b735dcd2315a462f0046641b2118e106fbb47d133d363e091ed9f7f0000000000000000000000000000000000000000000000000000000000000000426040516001600160e01b031960e085901b16815263ffffffff928316600482015291166024820152604401602060405180830381865af415801561093e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109629190610c7e565b61096d906001610c43565b905090565b6001600160a01b0381166107d9576040516359c662df60e11b815260040160405180910390fd5b5f5f60205f8451602086015f885af1806109b8576040513d5f823e3d81fd5b50505f513d915081156109cf5780600114156109dc565b6001600160a01b0384163b155b1561034557604051635274afe760e01b81526001600160a01b038516600482015260240160405180910390fd5b80356001600160a01b0381168114610a1f575f5ffd5b919050565b63ffffffff811681146107d9575f5ffd5b5f5f60408385031215610a46575f5ffd5b610a4f83610a09565b91506020830135610a5f81610a24565b809150509250929050565b5f5f5f60408486031215610a7c575f5ffd5b610a8584610a09565b9250602084013567ffffffffffffffff811115610aa0575f5ffd5b8401601f81018613610ab0575f5ffd5b803567ffffffffffffffff811115610ac6575f5ffd5b8660208260051b8401011115610ada575f5ffd5b939660209190910195509293505050565b5f60208284031215610afb575f5ffd5b5035919050565b5f5f60408385031215610b13575f5ffd5b8235610b1e81610a24565b9150610b2c60208401610a09565b90509250929050565b5f5f60408385031215610b46575f5ffd5b610b4f83610a09565b946020939093013593505050565b5f60208284031215610b6d575f5ffd5b8135610b7881610a24565b9392505050565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176102ec576102ec610b7f565b634e487b7160e01b5f52601260045260245ffd5b5f82610bcc57610bcc610baa565b500490565b634e487b7160e01b5f52603260045260245ffd5b5f63ffffffff821663ffffffff8103610c0057610c00610b7f565b60010192915050565b808201808211156102ec576102ec610b7f565b5f63ffffffff831680610c3157610c31610baa565b8063ffffffff84160491505092915050565b63ffffffff81811683821601908111156102ec576102ec610b7f565b5f60208284031215610c6f575f5ffd5b81518015158114610b78575f5ffd5b5f60208284031215610c8e575f5ffd5b8151610b7881610a2456fea2646970667358221220e76289b2417e2b4170834fb450ee1fd0f28358f623c5bc94c3b3b4df814fa51064736f6c634300081b003360e06040526005805465ffffffffffff1916640aae600003179055348015610025575f5ffd5b506040516117b93803806117b98339810160408190526100449161021a565b8533805f8161009a5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b5f80546001600160a01b0319166001600160a01b03848116919091179091558116156100c9576100c981610157565b5050506001600160a01b0381166100f35760405163d92e233d60e01b815260040160405180910390fd5b600280546001600160a01b03199081166001600160a01b039384161790915597811660805293841660a0526008805463ffffffff191663ffffffff9290921691909117905560049190915560c0929092526003805490941691161790915550610299565b336001600160a01b038216036101af5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610091565b600180546001600160a01b0319166001600160a01b038381169182179092555f8054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0381168114610215575f5ffd5b919050565b5f5f5f5f5f5f5f60e0888a031215610230575f5ffd5b610239886101ff565b9650610247602089016101ff565b95506040880151945061025c606089016101ff565b93506080880151925061027160a089016101ff565b915060c088015163ffffffff81168114610289575f5ffd5b8091505092959891949750929550565b60805160a05160c0516114da6102df5f395f8181610190015261054c01525f818161022601528181610b900152610f4901525f818161028901526109f601526114da5ff3fe608060405234801561000f575f5ffd5b5060043610610187575f3560e01c80638da5cb5b116100d9578063bb20995a11610093578063f50d390d1161006e578063f50d390d146103bc578063f851a440146103cf578063fc2a88c3146103e2578063fee439d8146103eb575f5ffd5b8063bb20995a14610386578063de5b24c914610396578063f2fde38b146103a9575f5ffd5b80638da5cb5b146102f95780638ea9811714610309578063929066f51461031c5780639eccacf61461033f578063b0fb162f14610352578063b91038c714610373575f5ffd5b806359974e3811610144578063662fac391161011f578063662fac391461028457806379ba5097146102ab5780637d234e22146102b357806381d12c58146102bb575f5ffd5b806359974e38146102605780635d495aea1461027357806361728f391461027b575f5ffd5b806309c1ba2e1461018b5780631df47acc146101c55780631fe543e3146101ce57806324f74697146101e35780632f68f4821461020e5780633fc8cef314610221575b5f5ffd5b6101b27f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b6101b260095481565b6101e16101dc3660046111d3565b6103f5565b005b6005546101f99062010000900463ffffffff1681565b60405163ffffffff90911681526020016101bc565b6101e161021c36600461124d565b61044a565b6102487f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101bc565b6101e161026e36600461124d565b610457565b6101b2610478565b6101b260045481565b6102487f000000000000000000000000000000000000000000000000000000000000000081565b6101e1610667565b6101e1610710565b6102e46102c936600461124d565b60076020525f90815260409020805460019091015460ff1682565b604080519283529015156020830152016101bc565b5f546001600160a01b0316610248565b6101e1610317366004611264565b61073a565b61032f61032a366004611264565b61082a565b60405190151581526020016101bc565b600254610248906001600160a01b031681565b6005546103609061ffff1681565b60405161ffff90911681526020016101bc565b6101e1610381366004611264565b61083c565b6008546101f99063ffffffff1681565b6101e16103a436600461128a565b61086b565b6101e16103b7366004611264565b6108d2565b6101e16103ca3660046112ad565b6108e3565b600354610248906001600160a01b031681565b6101b260065481565b6101b26212750081565b6002546001600160a01b0316331461043a5760025460405163073e64fd60e21b81523360048201526001600160a01b0390911660248201526044015b60405180910390fd5b61044583838361093a565b505050565b6104526109be565b600455565b61045f6109eb565b8060095f82825461047091906112e2565b909155505050565b5f610481610a34565b6009545f036104a357604051633372d42d60e21b815260040160405180910390fd5b60085463ffffffff428116916104be916212750091166112e2565b11156104dd57604051635ded5d6b60e01b815260040160405180910390fd5b6104e7600a610a8c565b5f0361050657604051632ac217f560e11b815260040160405180910390fd5b6005610512600a610a8c565b116105385761051f610a95565b61053460095461052f600a610a8c565b610afe565b5090565b6002546040805160c08101825260045481527f00000000000000000000000000000000000000000000000000000000000000006020808301919091526005805461ffff81168486015262010000900463ffffffff166060840152608083015282519081019092525f82526001600160a01b0390921691639b1c385e9160a08201906105c290610c39565b8152506040518263ffffffff1660e01b81526004016105e191906112f5565b6020604051808303815f875af11580156105fd573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610621919061138e565b600681905560408051808201825260095481525f602080830182815285835260079091529290209051815590516001909101805460ff1916911515919091179055919050565b6001546001600160a01b031633146106ba5760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b6044820152606401610431565b5f8054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6107186109be565b6006545f9081526007602052604090206001908101805460ff19169091179055565b5f546001600160a01b0316331480159061075f57506002546001600160a01b03163314155b156107af57336107765f546001600160a01b031690565b60025460405163061db9c160e01b81526001600160a01b0393841660048201529183166024830152919091166044820152606401610431565b6001600160a01b0381166107d65760405163d92e233d60e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527fd1a6a14209a385a964d036e404cb5cfb71f4000cdb03c9366292430787261be69060200160405180910390a150565b5f610836600a83610caa565b92915050565b6108446109eb565b61084c610a34565b610857600a82610caa565b61086857610866600a82610cce565b505b50565b6108736109be565b8063ffffffff1661088381610ce2565b6206ddd08263ffffffff1610156108ad576040516304c5ed9760e51b815260040160405180910390fd5b506005805463ffffffff909216620100000265ffffffff000019909216919091179055565b6108da610d02565b61086881610d54565b6108eb6109be565b60038161ffff16101580156109055750600a8161ffff1611155b61092257604051637f5e576160e11b815260040160405180910390fd5b6005805461ffff191661ffff92909216919091179055565b5f838152600760205260409020600181015460ff161561095a5750505050565b610962610a95565b5f6109a2825f01548585808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250610dfc92505050565b600192909201805460ff19169215159290921790915550505050565b6003546001600160a01b031633146109e957604051634755657960e01b815260040160405180910390fd5b565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109e9576040516366b35e3960e01b815260040160405180910390fd5b6006545f818152600760209081526040918290208251808401909352805483526001015460ff16151590820152901580610a6f575080602001515b61086857604051639ce4cccf60e01b815260040160405180910390fd5b5f610836825490565b6008545f906212750090610aaf9063ffffffff16426113a5565b63ffffffff16610abf91906113d5565b9050610ace81621275006113e8565b600854610ae1919063ffffffff166112e2565b6008805463ffffffff191663ffffffff9290921691909117905550565b5f80610b0a83856113d5565b90505f5b838163ffffffff161015610c0f575f610b31600a63ffffffff8085169061103416565b905082816001600160a01b03167f75060f9e79552df167b73353fee6237a75bb5ba8ea022f77224e32f152138bcb60405160405180910390a360405163a9059cbb60e01b81526001600160a01b038281166004830152602482018590527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af1158015610bd6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bfa91906113ff565b50508080610c079061141e565b915050610b0e565b50610c1a83826113e8565b60095f828254610c2a9190611442565b90915550600195945050505050565b60607f92fd13387c7fe7befbc38d303d6468778fb9731bc4583f17d92989c6fcfdeaaa82604051602401610c7291511515815260200190565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915292915050565b6001600160a01b0381165f90815260018301602052604081205415155b9392505050565b5f610cc7836001600160a01b03841661103f565b805f0361086857604051635a53a6e960e01b815260040160405180910390fd5b5f546001600160a01b031633146109e95760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b6044820152606401610431565b336001600160a01b03821603610dac5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610431565b600180546001600160a01b0319166001600160a01b038381169182179092555f8054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b5f5f825167ffffffffffffffff811115610e1857610e18611455565b604051908082528060200260200182016040528015610e41578160200160208202803683370190505b5090505f5b83518163ffffffff161015610fca575f848263ffffffff1681518110610e6e57610e6e611469565b602002602001015190505f610e98610e86600a610a8c565b610e90908461147d565b600a90611034565b90505f610ead886702c68af0bb14000061108b565b905080826001600160a01b03167f75060f9e79552df167b73353fee6237a75bb5ba8ea022f77224e32f152138bcb60405160405180910390a381858563ffffffff1681518110610eff57610eff611469565b6001600160a01b0390921660209283029190910190910152610f22600a836110b6565b5060405163a9059cbb60e01b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af1158015610f8f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fb391906113ff565b505050508080610fc29061141e565b915050610e46565b505f5b81518163ffffffff1610156110225761100f828263ffffffff1681518110610ff757610ff7611469565b6020026020010151600a610cce90919063ffffffff16565b508061101a8161141e565b915050610fcd565b508360095f828254610c2a9190611442565b5f610cc783836110ca565b5f81815260018301602052604081205461108457508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610836565b505f610836565b5f815f190483118202156110a65763c4c5d7f55f526004601cfd5b50670de0b6b3a764000091020490565b5f610cc7836001600160a01b0384166110f0565b5f825f0182815481106110df576110df611469565b905f5260205f200154905092915050565b5f81815260018301602052604081205480156111ca575f611112600183611442565b85549091505f9061112590600190611442565b9050808214611184575f865f01828154811061114357611143611469565b905f5260205f200154905080875f01848154811061116357611163611469565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061119557611195611490565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610836565b5f915050610836565b5f5f5f604084860312156111e5575f5ffd5b83359250602084013567ffffffffffffffff811115611202575f5ffd5b8401601f81018613611212575f5ffd5b803567ffffffffffffffff811115611228575f5ffd5b8660208260051b840101111561123c575f5ffd5b939660209190910195509293505050565b5f6020828403121561125d575f5ffd5b5035919050565b5f60208284031215611274575f5ffd5b81356001600160a01b0381168114610cc7575f5ffd5b5f6020828403121561129a575f5ffd5b813563ffffffff81168114610cc7575f5ffd5b5f602082840312156112bd575f5ffd5b813561ffff81168114610cc7575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115610836576108366112ce565b60208152815160208201526020820151604082015261ffff604083015116606082015263ffffffff606083015116608082015263ffffffff60808301511660a08201525f60a083015160c08084015280518060e08501525f5b8181101561136c57602081840181015161010087840101520161134e565b505f6101008286010152610100601f19601f8301168501019250505092915050565b5f6020828403121561139e575f5ffd5b5051919050565b63ffffffff8281168282160390811115610836576108366112ce565b634e487b7160e01b5f52601260045260245ffd5b5f826113e3576113e36113c1565b500490565b8082028115828204841417610836576108366112ce565b5f6020828403121561140f575f5ffd5b81518015158114610cc7575f5ffd5b5f63ffffffff821663ffffffff8103611439576114396112ce565b60010192915050565b81810381811115610836576108366112ce565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f8261148b5761148b6113c1565b500690565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220513d5129a1c33d771615d60a3cb44238baf3f81a4567dbaecb3b4a90923342a064736f6c634300081b003300000000000000000000000000000000000000000000000000000000679e6120000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe88000000000000000000000000af0db65b7296c02ab043f5cb17300c8ee949f247000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599000000000000000000000000d7f86b4b8cae7d942340ff628f82735b7a20893aff69e45a452760adf8bbae506631197cc41f0e2d83580febb35bc2548a878dc08077df514608a09f83e4e8d300645594e5d7234665448ba83f51a50f842bd3d9000000000000000000000000e592427a0aece92de3edee1f18e0157c058615640000000000000000000000001f98431c8ad98523631ae4a59f267346ea31f9840000000000000000000000005da227386e0fd73329fe3923394913eca3a624f700000000000000000000000000000000000000000000000001f161421c8e0000000000000000000000000000000000000000000000000043c33c193756480000000000000000000000000000000000000000000000000000002386f26fc10000