17 txs
18 calls
constructor
constructor(address swapConfig)
functions
getDelegateCount
viewfunction getDelegateCount(address user) view returns (uint256)
getDelegates
viewfunction getDelegates(address user, uint256 index) view returns (address)
getDelegates
viewfunction getDelegates(address user) view returns (address[])
getJoinedPoolAt
viewfunction getJoinedPoolAt(address user, address token, uint256 index) view returns (address)
getJoinedPoolCount
viewfunction getJoinedPoolCount(address user, address token) view returns (uint256)
getJoinedPools
viewfunction getJoinedPools(address user, address token) view returns (address[])
getListedPoolAt
viewfunction getListedPoolAt(address token, uint256 index) view returns (address)
getListedPoolCount
viewfunction getListedPoolCount(address token) view returns (uint256)
getListedPools
viewfunction getListedPools(address token) view returns (address[])
getListedTokenAt
viewfunction getListedTokenAt(uint256 index) view returns (address)
getListedTokenCount
viewfunction getListedTokenCount() view returns (uint256)
getListedTokens
viewfunction getListedTokens() view returns (address[])
getPool
viewfunction getPool(address pool) view returns (tuple)
getPoolAddress
viewfunction getPoolAddress(address stakeToken, address rewardToken, uint256 rewardDurationDays) view returns (address)
getPoolAddressUnchecked
viewfunction getPoolAddressUnchecked(address stakeToken, address rewardToken, uint256 rewardDurationDays) view returns (address)
getPoolDestructured
viewfunction getPoolDestructured(address pool) view returns (address stakeToken, address rewardToken, uint256 rewardDuration, uint256 stakes, bool errors)
getPoolTemplate
viewfunction getPoolTemplate() view returns (address)
getStake
viewfunction getStake(address user, address token) view returns (uint256)
getStakeAt
viewfunction getStakeAt(address user, uint256 index) view returns (address, uint256)
getStakeCount
viewfunction getStakeCount(address user) view returns (uint256)
getStakeCredit
viewfunction getStakeCredit(address token) view returns (address)
getStakeCreditTemplate
viewfunction getStakeCreditTemplate() view returns (address)
getStakerAt
viewfunction getStakerAt(address token, uint256 index) view returns (address)
getStakerCount
viewfunction getStakerCount(address token) view returns (uint256)
getStakers
viewfunction getStakers(address token) view returns (address[])
getStakes
viewfunction getStakes(address user) view returns (address[] tokens, uint256[] stakes)
hasJoinedPool
viewfunction hasJoinedPool(address user, address token, address pool) view returns (bool)
isDelegate
viewfunction isDelegate(address user, address delegate) view returns (bool)
isListedPool
viewfunction isListedPool(address token, address pool) view returns (bool)
isListedToken
viewfunction isListedToken(address token) view returns (bool)
isStaker
viewfunction isStaker(address token, address user) view returns (bool)
owner
viewfunction owner() view returns (address)
SWAP_CONFIG
viewfunction SWAP_CONFIG() view returns (address)
WETH
viewfunction WETH() view returns (address)
addDelegate
nonpayablefunction addDelegate(address delegate)
claimPoolRewards
nonpayablefunction claimPoolRewards(address user, address[] pools, bool useGasCap)
claimRewards
nonpayablefunction claimRewards(address user, address token)
createPool
nonpayablefunction createPool(address stakeToken, address rewardToken, uint256 rewardDurationDays) returns (address)
createStakeCredit
nonpayablefunction createStakeCredit(address token) returns (address)
delistPool
nonpayablefunction delistPool(address pool)
forceClaimRewards
nonpayablefunction forceClaimRewards(address user, address token)
forceUnstake
nonpayablefunction forceUnstake(address user, address token)
joinPools
nonpayablefunction joinPools(address user, address[] pools)
leavePools
nonpayablefunction leavePools(address user, address[] pools, bool useGasCap)
listPool
nonpayablefunction listPool(address pool)
removeDelegate
nonpayablefunction removeDelegate(address delegate)
renounceOwnership
nonpayablefunction renounceOwnership()
setPoolTemplate
nonpayablefunction setPoolTemplate(address poolTemplate)
setStakeCreditTemplate
nonpayablefunction setStakeCreditTemplate(address stakeCreditTemplate)
stake
nonpayablefunction stake(address user, address token, uint256 quantity, bool customize, address[] customPools)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
unstake
nonpayablefunction unstake(address user, address token, uint256 quantity)
events
AddDelegate
event AddDelegate(address indexed user, address indexed delegate, uint256 timestamp)
ClaimReward
event ClaimReward(address indexed account, address indexed pool, address indexed token, uint256 quantity, uint256 timestamp)
CreatePool
event CreatePool(address indexed stakeToken, address indexed rewardToken, address indexed pool, uint256 rewardDurationDays, uint256 timestamp)
DelistPool
event DelistPool(address indexed token, address indexed pool, uint256 timestamp)
ListPool
event ListPool(address indexed token, address indexed pool, uint256 timestamp)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
RemoveDelegate
event RemoveDelegate(address indexed user, address indexed delegate, uint256 timestamp)
Stake
event Stake(address indexed user, address indexed token, uint256 quantity, uint256 timestamp)
Unstake
event Unstake(address indexed user, address indexed token, uint256 quantity, uint256 timestamp)
errors
No errors.
creation bytecode
0x60a060405234801561000f575f80fd5b5060405161608738038061608783398101604081905261002e91610170565b61003733610107565b600180556001600160a01b0381166080526040513090829061005890610156565b6001600160a01b03928316815291166020820152604001604051809103905ff080158015610088573d5f803e3d5ffd5b50600280546001600160a01b0319166001600160a01b039290921691909117905560405130906100b790610163565b6001600160a01b039091168152602001604051809103905ff0801580156100e0573d5f803e3d5ffd5b50600380546001600160a01b0319166001600160a01b03929092169190911790555061019d565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61193e806130ff83390190565b61164a80614a3d83390190565b5f60208284031215610180575f80fd5b81516001600160a01b0381168114610196575f80fd5b9392505050565b608051612f4a6101b55f395f6106220152612f4a5ff3fe608060405234801561000f575f80fd5b50600436106102fe575f3560e01c806383139e5411610195578063cf57ee69116100e4578063ebd6bb851161009e578063f4e0e09b11610079578063f4e0e09b14610822578063f5846fb61461084d578063f60b0d5c14610860578063f712e12e14610873575f80fd5b8063ebd6bb85146107e9578063f1e42ccd146107fc578063f2fde38b1461080f575f80fd5b8063cf57ee6914610774578063d1a163e214610787578063d6ba1e5d1461079a578063d9e7f932146107bb578063e3ae9f6e146107ce578063e71bdf41146107d6575f80fd5b8063ad5c46481161014f578063b9ae67911161012a578063b9ae679114610657578063bb1b611e14610668578063bbe4f6db1461067b578063c0f5eae214610761575f80fd5b8063ad5c46481461060f578063b1c9f7cd1461061d578063b5e363b714610644575f80fd5b806383139e54146105a0578063843da3f9146105b35780638c309135146105c65780638da5cb5b146105d95780639cf31c60146105e9578063ad475a7b146105fc575f80fd5b80635a25dcb21161025157806367e7646f1161020b57806379193610116101e657806379193610146105465780637ba6f458146105595780637f855ff01461057a57806382dda22d1461058d575f80fd5b806367e7646f14610518578063715018a61461052b57806376c1db2c14610533575f80fd5b80635a25dcb2146104985780635fec5d0b146104a957806360829f8a146104cc578063638c5da9146104df57806365a2404f146104f257806367529f7314610505575f80fd5b80631cdf2a07116102bc578063306faf4a11610297578063306faf4a1461043e5780633b971c11146104515780633fbd253c1461047257806351810fb514610485575f80fd5b80631cdf2a07146104105780631d765732146104235780632ba996a514610436575f80fd5b806216361814610302578063129e30f9146103175780631571d2941461032a578063169db77d1461035a57806318b787541461037a5780631a11c2e81461038d575b5f80fd5b610315610310366004612a6d565b610886565b005b610315610325366004612a88565b6108b0565b61033d610338366004612abf565b61096f565b6040516001600160a01b0390911681526020015b60405180910390f35b61036d610368366004612a6d565b610999565b6040516103519190612b2c565b61033d610388366004612abf565b6109bc565b6103db61039b366004612a6d565b6001600160a01b039081165f908152600b602052604090208054600182015460028301546003840154600490940154928516959190941693929160ff1690565b604080516001600160a01b0396871681529590941660208601529284019190915260608301521515608082015260a001610351565b61031561041e366004612bf5565b6109dd565b61033d610431366004612c42565b610b6b565b61036d610b77565b61031561044c366004612a6d565b610b88565b61046461045f366004612a6d565b610c86565b604051908152602001610351565b610315610480366004612a88565b610ca6565b61033d610493366004612c59565b610cec565b6003546001600160a01b031661033d565b6104bc6104b7366004612a88565b611017565b6040519015158152602001610351565b6103156104da366004612c59565b611038565b6104bc6104ed366004612a6d565b611426565b61033d610500366004612abf565b611432565b610464610513366004612a88565b611453565b610315610526366004612a6d565b611486565b610315611527565b6104bc610541366004612a88565b61153a565b61036d610554366004612a6d565b61155b565b61056c610567366004612a6d565b61157e565b604051610351929190612c97565b61033d610588366004612c59565b611651565b61046461059b366004612a88565b61168d565b61033d6105ae366004612a6d565b6116bc565b6104646105c1366004612a6d565b6116c6565b6103156105d4366004612cfc565b6116e6565b5f546001600160a01b031661033d565b61036d6105f7366004612a88565b611992565b61031561060a366004612a6d565b6119c6565b61033d6006602160991b0181565b61033d7f000000000000000000000000000000000000000000000000000000000000000081565b610315610652366004612a6d565b6119f0565b6002546001600160a01b031661033d565b610464610676366004612a6d565b611b04565b610714610689366004612a6d565b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152506001600160a01b039081165f908152600b6020908152604091829020825160a081018452815485168152600182015490941691840191909152600281015491830191909152600381015460608301526004015460ff161515608082015290565b604051610351919081516001600160a01b03908116825260208084015190911690820152604080830151908201526060808301519082015260809182015115159181019190915260a00190565b61033d61076f366004612c59565b611b24565b610464610782366004612a6d565b611b51565b61036d610795366004612a6d565b611b74565b6107ad6107a8366004612abf565b611b97565b604051610351929190612d5c565b6103156107c9366004612cfc565b611bc9565b610464611e15565b6103156107e4366004612a6d565b611e20565b61033d6107f7366004612c59565b611eba565b61031561080a366004612a88565b611f1f565b61031561081d366004612a6d565b611f5f565b61033d610830366004612a6d565b6001600160a01b039081165f908152600760205260409020541690565b6104bc61085b366004612d75565b611fd8565b6104bc61086e366004612a88565b61200c565b610315610881366004612db2565b61202d565b61088e6123d6565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382165f908152600a602052604081206108d4906002018361242f565b90505f811161091d5760405162461bcd60e51b815260206004820152601060248201526f151bdad95b881b9bdd081cdd185ad95960821b60448201526064015b60405180910390fd5b6001600160a01b038084165f908152600a6020908152604080832093861683526005909301905290812061095090612443565b905061095e84826001611bc9565b610969848484611038565b50505050565b6001600160a01b0382165f9081526008602052604081206109909083612456565b90505b92915050565b6001600160a01b0381165f908152600a6020526040902060609061099390612443565b6001600160a01b0382165f9081526009602052604081206109909083612456565b816001600160a01b038116331480610a1157506001600160a01b0381165f908152600a60205260409020610a119033612461565b610a2d5760405162461bcd60e51b815260040161091490612e2c565b6001600160a01b0383165f908152600a60205260408120905b8351811015610b64575f848281518110610a6257610a62612e54565b6020908102919091018101516001600160a01b038082165f908152600b90935260408320549193501690610a996002860183612482565b9150505f81118015610ac957506001600160a01b0382165f9081526005860160205260409020610ac990846124a6565b15610b59576001600160a01b0383165f908152600b602052604081206003018054839290610af8908490612e7c565b90915550506040516356e4bb9760e11b81526001600160a01b0384169063adc9772e90610b2b908b908590600401612d5c565b5f604051808303815f87803b158015610b42575f80fd5b505af1158015610b54573d5f803e3d5ffd5b505050505b505050600101610a46565b5050505050565b5f610993600483612456565b6060610b836004612443565b905090565b610b906123d6565b6001600160a01b038082165f908152600b60209081526040808320549093168083526008909152919020610bc490836124ba565b610c025760405162461bcd60e51b815260206004820152600f60248201526e141bdbdb081b9bdd081b1a5cdd1959608a1b6044820152606401610914565b6001600160a01b0381165f908152600860205260409020610c22906124ce565b5f03610c3557610c336004826124ba565b505b816001600160a01b0316816001600160a01b03167f487ce0fae614e3314927cbc3e761f8e768309fa72c3587206b7ba6e17c1d08ed42604051610c7a91815260200190565b60405180910390a35050565b6001600160a01b0381165f908152600a60205260408120610993906124ce565b6001600160a01b038083165f908152600a60209081526040808320938516835260059093019052908120610cd990612443565b9050610ce7838260016116e6565b505050565b5f6001600160a01b038416610d395760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21039ba30b5b2903a37b5b2b760691b6044820152606401610914565b5f610d43856116bc565b6001600160a01b031603610d995760405162461bcd60e51b815260206004820152601d60248201527f556e61626c6520746f20637265617465207374616b65206372656469740000006044820152606401610914565b6001600160a01b038316610db2576006602160991b0192505b5f610dbe8585856124d7565b5f818152600660205260409020549091506001600160a01b031615610e1b5760405162461bcd60e51b8152602060048201526013602482015272506f6f6c20616c72656164792065786973747360681b6044820152606401610914565b6002545f90610e32906001600160a01b0316612537565b90506001600160a01b03811663399ae72486610e518762015180612e8f565b6040518363ffffffff1660e01b8152600401610e6e929190612d5c565b5f604051808303815f87803b158015610e85575f80fd5b505af1158015610e97573d5f803e3d5ffd5b50506040516356e4bb9760e11b81526001600160a01b038416925063adc9772e9150610eca903090600190600401612d5c565b5f604051808303815f87803b158015610ee1575f80fd5b505af1158015610ef3573d5f803e3d5ffd5b5050305f908152600a602090815260408083206001600160a01b038c1684526005019091529020610f2792509050826124a6565b505f82815260066020908152604080832080546001600160a01b03199081166001600160a01b03878116918217909355835160a0810185528c84168082528c85168288018181528388018e8152606085018b8152608086018c8152878d52600b8c529b8a9020955186548916908a161786559151600186018054909816981697909717909555945160028301559251600382015595516004909601805460ff19169615159690961790955582518981524294810194909452909290917f5cd70696d5fd0b84b3fb228b1cb6142d8d3bd7cae269a4a94c0786e60f8f5591910160405180910390a495945050505050565b6001600160a01b0382165f908152600a602052604081206109909083612461565b6110406125ce565b826001600160a01b03811633148061107457506001600160a01b0381165f908152600a602052604090206110749033612461565b6110905760405162461bcd60e51b815260040161091490612e2c565b6001600160a01b0384165f908152600a60205260408120906110b5600283018661242f565b9050838114846111005760405162461bcd60e51b8152602060048201526016602482015275496e76616c696420746f6b656e207175616e7469747960501b6044820152606401610914565b818511156111505760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e207175616e746974792065786365656473207374616b65000000006044820152606401610914565b61115986612627565b6001600160a01b0316639dc29fac88876040518363ffffffff1660e01b8152600401611186929190612d5c565b5f604051808303815f87803b15801561119d575f80fd5b505af11580156111af573d5f803e3d5ffd5b505050506001600160a01b0386165f90815260058401602052604081206111d590612443565b9050811561120f576111e888825f611bc9565b6001600160a01b0387165f90815260096020526040902061120990896124ba565b506112fc565b5f5b81518110156112fa575f82828151811061122d5761122d612e54565b6020026020010151905087600b5f836001600160a01b03166001600160a01b031681526020019081526020015f206003015f82825461126c9190612ea6565b9091555050604051630615339760e51b81526001600160a01b0382169063c2a672e09061129f908d908c90600401612d5c565b5f604051808303815f87803b1580156112b6575f80fd5b505af19250505080156112c7575060015b6112f1576001600160a01b0381165f908152600b60205260409020600401805460ff191660011790555b50600101611211565b505b6113158761130a8886612ea6565b6002870191906126ea565b5060405163a9059cbb60e01b81526001600160a01b0388169063a9059cbb90611344908b908a90600401612d5c565b6020604051808303815f875af1158015611360573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113849190612eb9565b6113d05760405162461bcd60e51b815260206004820152601960248201527f556e61626c6520746f207472616e7366657220746f6b656e73000000000000006044820152606401610914565b604080518781524260208201526001600160a01b03808a1692908b16917f18edd09e80386cd99df397e2e0d87d2bb259423eae08645e776321a36fe680ef910160405180910390a35050505050610ce760018055565b5f610993600483612461565b6001600160a01b0382165f908152600a602052604081206109909083612456565b6001600160a01b038083165f908152600a60209081526040808320938516835260059093019052908120610990906124ce565b335f908152600a6020526040902061149e90826124ba565b6114e35760405162461bcd60e51b815260206004820152601660248201527541646472657373206e6f7420612064656c656761746560501b6044820152606401610914565b6040514281526001600160a01b0382169033907fa90dff5df3373db26d6691fed3913787ac703676cd51a8fd5ecd48b62c53cf23906020015b60405180910390a350565b61152f6123d6565b6115385f6126ff565b565b6001600160a01b0382165f9081526008602052604081206109909083612461565b6001600160a01b0381165f90815260096020526040902060609061099390612443565b6001600160a01b0381165f908152600a6020526040902060609081906002016115a68161274e565b9250825167ffffffffffffffff8111156115c2576115c2612b3e565b6040519080825280602002602001820160405280156115eb578160200160208202803683370190505b5091505f5b835181101561164a5761162584828151811061160e5761160e612e54565b60200260200101518361242f90919063ffffffff16565b83828151811061163757611637612e54565b60209081029190910101526001016115f0565b5050915091565b6001600160a01b038084165f908152600a602090815260408083209386168352600590930190529081206116859083612456565b949350505050565b6001600160a01b0382165f908152600a6020526040812081906116b39060020184612482565b95945050505050565b5f61099382612627565b6001600160a01b0381165f908152600860205260408120610993906124ce565b826001600160a01b03811633148061171a57506001600160a01b0381165f908152600a6020526040902061171a9033612461565b8061174157506001600160a01b0381163014801561174157505f546001600160a01b031633145b61175d5760405162461bcd60e51b815260040161091490612e2c565b5f5b8351811015610b64575f84828151811061177b5761177b612e54565b60200260200101519050831561188f5760405163d279c19160e01b81526001600160a01b03878116600483015282169063d279c19190620f42409060240160408051808303815f8887f1935050505080156117f3575060408051601f3d908101601f191682019092526117f091810190612ed4565b60015b611821576001600160a01b0381165f908152600b60205260409020600401805460ff19166001179055611989565b801561188857816001600160a01b0316836001600160a01b0316896001600160a01b03167f5851a97698094c5d791e338d27e18159e3f87a49ccfa02aa6c16d16e4e2f5238844260405161187f929190918252602082015260400190565b60405180910390a45b5050611989565b60405163d279c19160e01b81526001600160a01b03878116600483015282169063d279c1919060240160408051808303815f875af19250505080156118f1575060408051601f3d908101601f191682019092526118ee91810190612ed4565b60015b61191f576001600160a01b0381165f908152600b60205260409020600401805460ff19166001179055611989565b801561198657816001600160a01b0316836001600160a01b0316896001600160a01b03167f5851a97698094c5d791e338d27e18159e3f87a49ccfa02aa6c16d16e4e2f5238844260405161197d929190918252602082015260400190565b60405180910390a45b50505b5060010161175f565b6001600160a01b038083165f908152600a602090815260408083209385168352600590930190522060609061099090612443565b6119ce6123d6565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6119f86123d6565b6001600160a01b038082165f908152600b60205260409020541680611a505760405162461bcd60e51b815260206004820152600e60248201526d141bdbdb081b9bdd08199bdd5b9960921b6044820152606401610914565b6001600160a01b0381165f908152600860205260409020611a7190836124a6565b611ab35760405162461bcd60e51b8152602060048201526013602482015272141bdbdb08185b1c9958591e481b1a5cdd1959606a1b6044820152606401610914565b611abe6004826124a6565b50816001600160a01b0316816001600160a01b03167f2dc8d40911b79712e8e7fabd874877f7511fbd9cd008b425f1c8043c5195e87742604051610c7a91815260200190565b6001600160a01b0381165f908152600960205260408120610993906124ce565b5f80611b318585856124d7565b5f908152600660205260409020546001600160a01b031695945050505050565b6001600160a01b0381165f908152600a602052604081206109939060020161275a565b6001600160a01b0381165f90815260086020526040902060609061099390612443565b6001600160a01b0382165f908152600a602052604081208190611bbd9060020184612764565b915091505b9250929050565b826001600160a01b038116331480611bfd57506001600160a01b0381165f908152600a60205260409020611bfd9033612461565b611c195760405162461bcd60e51b815260040161091490612e2c565b6001600160a01b0384165f908152600a60205260408120905b8451811015611e09575f858281518110611c4e57611c4e612e54565b6020908102919091018101516001600160a01b038082165f908152600b90935260408320549193501690611c856002860183612482565b9150505f81118015611cb557506001600160a01b0382165f9081526005860160205260409020611cb590846124ba565b15611dfe576001600160a01b0383165f908152600b602052604081206003018054839290611ce4908490612ea6565b90915550508615611d7e57604051630615339760e51b81526001600160a01b0384169063c2a672e090620f424090611d22908d908690600401612d5c565b5f604051808303815f88803b158015611d39575f80fd5b5087f193505050508015611d4b575060015b611d79576001600160a01b0383165f908152600b60205260409020600401805460ff19166001179055611dfe565b611dfe565b604051630615339760e51b81526001600160a01b0384169063c2a672e090611dac908c908590600401612d5c565b5f604051808303815f87803b158015611dc3575f80fd5b505af1925050508015611dd4575060015b611dfe576001600160a01b0383165f908152600b60205260409020600401805460ff191660011790555b505050600101611c32565b50610b648585856116e6565b5f610b8360046124ce565b335f908152600a60205260409020611e3890826124a6565b611e7d5760405162461bcd60e51b815260206004820152601660248201527511195b1959d85d1948185b1c9958591e48185919195960521b6044820152606401610914565b6040514281526001600160a01b0382169033907f20a7022f915e24dc20cc41f4b179f1103ba0b13cdebdfd31ac3901baf7e95e149060200161151c565b5f80611ec78585856124d7565b5f818152600660205260409020549091506001600160a01b0316806116b35760405162461bcd60e51b815260206004820152600e60248201526d141bdbdb081b9bdd08199bdd5b9960921b6044820152606401610914565b6001600160a01b038083165f908152600a60209081526040808320938516835260059093019052908120611f5290612443565b9050610ce783825f6116e6565b611f676123d6565b6001600160a01b038116611fcc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610914565b611fd5816126ff565b50565b6001600160a01b038084165f908152600a602090815260408083209386168352600590930190529081206116859083612461565b6001600160a01b0382165f9081526009602052604081206109909083612461565b6120356125ce565b846001600160a01b03811633148061206957506001600160a01b0381165f908152600a602052604090206120699033612461565b6120855760405162461bcd60e51b815260040161091490612e2c565b5f84116120cd5760405162461bcd60e51b8152602060048201526016602482015275496e76616c696420746f6b656e207175616e7469747960501b6044820152606401610914565b6040516323b872dd60e01b81526001600160a01b038781166004830152306024830152604482018690528616906323b872dd906064016020604051808303815f875af115801561211f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121439190612eb9565b6121875760405162461bcd60e51b81526020600482015260156024820152742ab730b13632903a379039ba30b5b2903a37b5b2b760591b6044820152606401610914565b61219085612627565b6001600160a01b03166340c10f1987866040518363ffffffff1660e01b81526004016121bd929190612d5c565b5f604051808303815f87803b1580156121d4575f80fd5b505af11580156121e6573d5f803e3d5ffd5b5050506001600160a01b0387165f908152600a602052604081209150806122106002840189612482565b909250905061222e886122238984612e7c565b6002860191906126ea565b50811561231b576001600160a01b0388165f908152600584016020526040812061225790612443565b90505f5b8151811015612314575f82828151811061227757612277612e54565b60200260200101519050806001600160a01b031663adc9772e8d8c6040518363ffffffff1660e01b81526004016122af929190612d5c565b5f604051808303815f87803b1580156122c6575f80fd5b505af11580156122d8573d5f803e3d5ffd5b505050506001600160a01b0381165f908152600b6020526040812060030180548c9290612306908490612e7c565b90915550505060010161225b565b505061233e565b6001600160a01b0388165f90815260096020526040902061233c908a6124a6565b505b85156123535761234e89866109dd565b612381565b6001600160a01b0388165f90815260086020526040812061237390612443565b905061237f8a826109dd565b505b604080518881524260208201526001600160a01b03808b1692908c16917f63602d0ecc7b3a0ef7ff1a116e23056662d64280355ba8031b6d0d767c4b4458910160405180910390a350505050610b6460018055565b5f546001600160a01b031633146115385760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610914565b5f610990836001600160a01b038416612772565b60605f61244f836127e1565b9392505050565b5f610990838361283a565b6001600160a01b0381165f9081526001830160205260408120541515610990565b5f808080612499866001600160a01b038716612860565b9097909650945050505050565b5f610990836001600160a01b038416612898565b5f610990836001600160a01b0384166128e4565b5f610993825490565b5f6001600160a01b0383166124f1576006602160991b0192505b604080516001600160a01b038087166020830152851691810191909152606081018390526080016040516020818303038152906040528051906020012090509392505050565b5f763d602d80600a3d3981f3363d3d373d3d3d363d730000008260601b60e81c175f526e5af43d82803e903d91602b57fd5bf38260781b17602052603760095ff090506001600160a01b0381166125c95760405162461bcd60e51b8152602060048201526016602482015275115490cc4c4d8dce8818dc99585d194819985a5b195960521b6044820152606401610914565b919050565b6002600154036126205760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610914565b6002600155565b6001600160a01b038082165f90815260076020526040812054909116806109935760035461265d906001600160a01b0316612537565b60405163189acdbd60e31b81526001600160a01b0385811660048301529192509082169063c4d66de8906024015f604051808303815f87803b1580156126a1575f80fd5b505af11580156126b3573d5f803e3d5ffd5b505050506001600160a01b038381165f90815260076020526040902080546001600160a01b03191691831691909117905592915050565b5f611685846001600160a01b038516846129c7565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60605f61244f836129e3565b5f610993826129ee565b5f80808061249986866129f8565b5f8181526002830160205260408120548015158061279557506127958484612a21565b6109905760405162461bcd60e51b815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610914565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561282e57602002820191905f5260205f20905b81548152602001906001019080831161281a575b50505050509050919050565b5f825f01828154811061284f5761284f612e54565b905f5260205f200154905092915050565b5f81815260028301602052604081205481908061288d576128818585612a21565b92505f9150611bc29050565b600192509050611bc2565b5f8181526001830160205260408120546128dd57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610993565b505f610993565b5f81815260018301602052604081205480156129be575f612906600183612ea6565b85549091505f9061291990600190612ea6565b9050818114612978575f865f01828154811061293757612937612e54565b905f5260205f200154905080875f01848154811061295757612957612e54565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061298957612989612f00565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610993565b5f915050610993565b5f82815260028401602052604081208290556116858484612a2c565b606061099382612443565b5f610993826124ce565b5f8080612a058585612456565b5f81815260029690960160205260409095205494959350505050565b5f6109908383612a37565b5f6109908383612898565b5f8181526001830160205260408120541515610990565b6001600160a01b0381168114611fd5575f80fd5b80356125c981612a4e565b5f60208284031215612a7d575f80fd5b813561099081612a4e565b5f8060408385031215612a99575f80fd5b8235612aa481612a4e565b91506020830135612ab481612a4e565b809150509250929050565b5f8060408385031215612ad0575f80fd5b8235612adb81612a4e565b946020939093013593505050565b5f8151808452602084019350602083015f5b82811015612b225781516001600160a01b0316865260209586019590910190600101612afb565b5093949350505050565b602081525f6109906020830184612ae9565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112612b61575f80fd5b813567ffffffffffffffff811115612b7b57612b7b612b3e565b8060051b604051601f19603f830116810181811067ffffffffffffffff82111715612ba857612ba8612b3e565b604052918252602081850181019290810186841115612bc5575f80fd5b6020860192505b83831015612beb57612bdd83612a62565b815260209283019201612bcc565b5095945050505050565b5f8060408385031215612c06575f80fd5b8235612c1181612a4e565b9150602083013567ffffffffffffffff811115612c2c575f80fd5b612c3885828601612b52565b9150509250929050565b5f60208284031215612c52575f80fd5b5035919050565b5f805f60608486031215612c6b575f80fd5b8335612c7681612a4e565b92506020840135612c8681612a4e565b929592945050506040919091013590565b604081525f612ca96040830185612ae9565b82810360208401528084518083526020830191506020860192505f5b81811015612ce3578351835260209384019390920191600101612cc5565b50909695505050505050565b8015158114611fd5575f80fd5b5f805f60608486031215612d0e575f80fd5b8335612d1981612a4e565b9250602084013567ffffffffffffffff811115612d34575f80fd5b612d4086828701612b52565b9250506040840135612d5181612cef565b809150509250925092565b6001600160a01b03929092168252602082015260400190565b5f805f60608486031215612d87575f80fd5b8335612d9281612a4e565b92506020840135612da281612a4e565b91506040840135612d5181612a4e565b5f805f805f60a08688031215612dc6575f80fd5b8535612dd181612a4e565b94506020860135612de181612a4e565b9350604086013592506060860135612df881612cef565b9150608086013567ffffffffffffffff811115612e13575f80fd5b612e1f88828901612b52565b9150509295509295909350565b6020808252600e908201526d139bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561099357610993612e68565b808202811582820484141761099357610993612e68565b8181038181111561099357610993612e68565b5f60208284031215612ec9575f80fd5b815161099081612cef565b5f8060408385031215612ee5575f80fd5b8251612ef081612a4e565b6020939093015192949293505050565b634e487b7160e01b5f52603160045260245ffdfea26469706673582212204b5d53cf6634c4471b6dcf1b457c6cadc4fec3bdd16972d1904c182ecfe1d6a064736f6c634300081a003360e06040525f6003555f600455348015610017575f80fd5b5060405161193e38038061193e83398101604081905261003691610068565b3060a0526001600160a01b039182166080521660c0526100a0565b6001600160a01b0381168114610065575f80fd5b50565b5f8060408385031215610079575f80fd5b825161008481610051565b602084015190925061009581610051565b809150509250929050565b60805160a05160c0516118436100fb5f395f81816102de01528181610aae0152610ee501525f61033001525f81816102ab01528181610583015281816107f401528181610ca401528181610e0c0152610ea601526118435ff3fe608060405260043610610164575f3560e01c8063bdf16036116100cd578063df136d6511610087578063f520e7e511610062578063f520e7e514610469578063f7c618c11461047e578063fcb4da911461049c578063feca3900146104b1575f80fd5b8063df136d651461042c578063ebe2b12b14610441578063f2c5db1714610456575f80fd5b8063bdf1603614610352578063bf2e595014610386578063bf9befb1146103a5578063c2a672e0146103ba578063c8f33c91146103d9578063d279c191146103ee575f80fd5b8063ad5c46481161011e578063ad5c464814610249578063adc9772e1461027b578063b0df4cab1461029a578063b1c9f7cd146102cd578063b93e34db14610300578063bba3b1881461031f575f80fd5b80631c1f78eb14610190578063399ae724146101b75780636b2741ff146101d65780637b0a47ee146101ea5780638da7ad23146101ff578063aada9c381461022a575f80fd5b3661018c57600c5460ff1661018a57604080515f81526020810190915261018a906104c5565b005b5f80fd5b34801561019b575f80fd5b506101a4610555565b6040519081526020015b60405180910390f35b3480156101c2575f80fd5b5061018a6101d1366004611459565b610578565b3480156101e1575f80fd5b506101a4610747565b3480156101f5575f80fd5b506101a460045481565b34801561020a575f80fd5b506101a4610219366004611483565b60086020525f908152604090205481565b348015610235575f80fd5b506101a4610244366004611483565b61075d565b348015610254575f80fd5b506102636006602160991b0181565b6040516001600160a01b0390911681526020016101ae565b348015610286575f80fd5b5061018a610295366004611459565b6107e9565b3480156102a5575f80fd5b506102637f000000000000000000000000000000000000000000000000000000000000000081565b3480156102d8575f80fd5b506102637f000000000000000000000000000000000000000000000000000000000000000081565b34801561030b575f80fd5b5061018a61031a366004611530565b610956565b34801561032a575f80fd5b506102637f000000000000000000000000000000000000000000000000000000000000000081565b34801561035d575f80fd5b506101a461036c366004611483565b6001600160a01b03165f908152600a602052604090205490565b348015610391575f80fd5b5061018a6103a0366004611530565b610a3f565b3480156103b0575f80fd5b506101a460075481565b3480156103c5575f80fd5b5061018a6103d4366004611459565b610c99565b3480156103e4575f80fd5b506101a460055481565b3480156103f9575f80fd5b5061040d610408366004611483565b610dff565b604080516001600160a01b0390931683526020830191909152016101ae565b348015610437575f80fd5b506101a460065481565b34801561044c575f80fd5b506101a460035481565b61018a610464366004611585565b6104c5565b348015610474575f80fd5b506101a460025481565b348015610489575f80fd5b505f54610263906001600160a01b031681565b3480156104a7575f80fd5b506101a460015481565b3480156104bc575f80fd5b506101a4611191565b6006602160991b016001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b158015610505575f80fd5b505af1158015610517573d5f803e3d5ffd5b50505f546001600160a01b03166005602160991b011901925061054391505057610540346111f0565b50565b6105406006602160991b013483610a3f565b5f60015460025460045461056991906115d3565b61057391906115ea565b905090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105c95760405162461bcd60e51b81526004016105c090611609565b60405180910390fd5b6002541561060f5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e48125b9a5d1a585b1a5e9959606a1b60448201526064016105c0565b6001600160a01b0382166106555760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b60448201526064016105c0565b5f81116106975760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b210223ab930ba34b7b760811b60448201526064016105c0565b60028190555f80546001600160a01b0319166001600160a01b03841690811782556040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa1580156106f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610715919061162e565b60ff1690506012811061072957600161073f565b61073481601261164e565b61073f90600a611744565b600155505050565b5f6003544210610758575060035490565b504290565b6001600160a01b0381165f908152600b6020908152604080832054600154600990935290832054909190670de0b6b3a764000090610799611191565b6107a3919061164e565b6001600160a01b0386165f908152600860205260409020546107c591906115d3565b6107cf91906115ea565b6107d991906115ea565b6107e3919061174f565b92915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108315760405162461bcd60e51b81526004016105c090611609565b8161083a611191565b600655610845610747565b6005556001600160a01b0381161561088b576108608161075d565b6001600160a01b0382165f908152600b60209081526040808320939093556006546009909152919020555b5f82116108cb5760405162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b60448201526064016105c0565b8160075f8282546108dc919061174f565b90915550506001600160a01b0383165f908152600860205260408120805484929061090890849061174f565b9091555050604080518381524260208201526001600160a01b038516917f5af417134f72a9d41143ace85b0a26dce6f550f894f2cbc1eeee8810603d91b691015b60405180910390a2505050565b6040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b038416906323b872dd906064016020604051808303815f875af11580156109a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109ca9190611762565b610a165760405162461bcd60e51b815260206004820152601860248201527f556e61626c6520746f207472616e7366657220746f6b656e000000000000000060448201526064016105c0565b5f546001600160a01b03808516911603610a3857610a33826111f0565b505050565b610a338383835b5f80546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610a85573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa99190611781565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b0f479a16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b08573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b2c9190611798565b60405163095ea7b360e01b81526001600160a01b038083166004830152602482018790529192509086169063095ea7b3906044016020604051808303815f875af1158015610b7c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba09190611762565b506040516321d053f960e11b81526001600160a01b038216906343a0a7f290610bd39030908990899089906004016117b3565b6020604051808303815f875af1158015610bef573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c139190611781565b505f546040516370a0823160e01b8152306004820152610c929184916001600160a01b03909116906370a0823190602401602060405180830381865afa158015610c5f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c839190611781565b610c8d919061164e565b6111f0565b5050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ce15760405162461bcd60e51b81526004016105c090611609565b81610cea611191565b600655610cf5610747565b6005556001600160a01b03811615610d3b57610d108161075d565b6001600160a01b0382165f908152600b60209081526040808320939093556006546009909152919020555b5f8211610d7d5760405162461bcd60e51b815260206004820152601060248201526f043616e6e6f7420756e7374616b6520360841b60448201526064016105c0565b8160075f828254610d8e919061164e565b90915550506001600160a01b0383165f9081526008602052604081208054849290610dba90849061164e565b9091555050604080518381524260208201526001600160a01b038516917ff960dbf9e5d0682f7a298ed974e33a28b4464914b7a2bfac12ae419a9afeb2809101610949565b5f80336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e495760405162461bcd60e51b81526004016105c090611609565b82610e52611191565b600655610e5d610747565b6005556001600160a01b03811615610ea357610e788161075d565b6001600160a01b0382165f908152600b60209081526040808320939093556006546009909152919020555b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614610ee35784610f05565b7f00000000000000000000000000000000000000000000000000000000000000005b6001600160a01b0386165f908152600b6020526040902054909150801561117b576001600160a01b0386165f908152600b60209081526040808320839055600a90915281208054839290610f5a90849061174f565b90915550505f546001600160a01b03166005602160991b01190161107857600c805460ff19166001179055604051632e1a7d4d60e01b8152600481018290526006602160991b0190632e1a7d4d906024015f604051808303815f87803b158015610fc2575f80fd5b505af1158015610fd4573d5f803e3d5ffd5b5050600c805460ff1916905550506040515f906001600160a01b0384169083908381818185875af1925050503d805f811461102a576040519150601f19603f3d011682016040523d82523d5f602084013e61102f565b606091505b50509050806110725760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016105c0565b50611137565b5f5460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb906044016020604051808303815f875af11580156110c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110eb9190611762565b6111375760405162461bcd60e51b815260206004820152601960248201527f556e61626c6520746f207472616e7366657220746f6b656e730000000000000060448201526064016105c0565b604080518281524260208201526001600160a01b038816917fe74e5c9d4ac1fc33412485f18c159a0a391efe287ab3fd271123f30e6bacf4e3910160405180910390a25b5f546001600160a01b0316945092505050915091565b5f6007545f036111a2575060065490565b6007546004546005546111b3610747565b6111bd919061164e565b6111c791906115d3565b6111d990670de0b6b3a76400006115d3565b6111e391906115ea565b600654610573919061174f565b5f6111f9611191565b600655611204610747565b6005556001600160a01b0381161561124a5761121f8161075d565b6001600160a01b0382165f908152600b60209081526040808320939093556006546009909152919020555b5f821161128a5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a59081c995dd85c9960921b60448201526064016105c0565b60015461129790836115d3565b915060035442106112b7576002546112af90836115ea565b6004556112f7565b5f426003546112c6919061164e565b90505f600454826112d791906115d3565b6002549091506112e7828661174f565b6112f191906115ea565b60045550505b6001545f80546040516370a0823160e01b81523060048201529192916001600160a01b03909116906370a0823190602401602060405180830381865afa158015611343573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113679190611781565b61137191906115d3565b90506002548161138191906115ea565b60045411156113d25760405162461bcd60e51b815260206004820152601860248201527f50726f76696465642072657761726420746f6f2068696768000000000000000060448201526064016105c0565b4260058190556002546113e49161174f565b6003556001547ff397555a45e165ae1e67ccf80e2333d5e8905c4bad48a3127dc9373df80698599061141690856115ea565b604080519182524260208301520160405180910390a1505050565b634e487b7160e01b5f52604160045260245ffd5b6001600160a01b0381168114610540575f80fd5b5f806040838503121561146a575f80fd5b823561147581611445565b946020939093013593505050565b5f60208284031215611493575f80fd5b813561149e81611445565b9392505050565b5f82601f8301126114b4575f80fd5b813567ffffffffffffffff8111156114ce576114ce611431565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156114fd576114fd611431565b604052818152838201602001851015611514575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f60608486031215611542575f80fd5b833561154d81611445565b925060208401359150604084013567ffffffffffffffff81111561156f575f80fd5b61157b868287016114a5565b9150509250925092565b5f60208284031215611595575f80fd5b813567ffffffffffffffff8111156115ab575f80fd5b6115b7848285016114a5565b949350505050565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176107e3576107e36115bf565b5f8261160457634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252600b908201526a27b7363c9029ba30b5b2b960a91b604082015260600190565b5f6020828403121561163e575f80fd5b815160ff8116811461149e575f80fd5b818103818111156107e3576107e36115bf565b6001815b600184111561169c57808504811115611680576116806115bf565b600184161561168e57908102905b60019390931c928002611665565b935093915050565b5f826116b2575060016107e3565b816116be57505f6107e3565b81600181146116d457600281146116de576116fa565b60019150506107e3565b60ff8411156116ef576116ef6115bf565b50506001821b6107e3565b5060208310610133831016604e8410600b841016171561171d575081810a6107e3565b6117295f198484611661565b805f190482111561173c5761173c6115bf565b029392505050565b5f61149e83836116a4565b808201808211156107e3576107e36115bf565b5f60208284031215611772575f80fd5b8151801515811461149e575f80fd5b5f60208284031215611791575f80fd5b5051919050565b5f602082840312156117a8575f80fd5b815161149e81611445565b60018060a01b038516815260018060a01b0384166020820152826040820152608060608201525f8251806080840152806020850160a085015e5f60a0828501015260a0601f19601f8301168401019150509594505050505056fea26469706673582212201ec019b1456f49524b6366a51583eb704567c349e5cd26c446bca11c7789786c64736f6c634300081a003360c060405234801561000f575f80fd5b5060405161164a38038061164a83398101604081905261002e9161007a565b60408051602080820183525f8083528351918201909352918252906003610055838261013f565b506004610062828261013f565b505030608052506001600160a01b031660a0526101f9565b5f6020828403121561008a575f80fd5b81516001600160a01b03811681146100a0575f80fd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806100cf57607f821691505b6020821081036100ed57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561013a57805f5260205f20601f840160051c810160208510156101185750805b601f840160051c820191505b81811015610137575f8155600101610124565b50505b505050565b81516001600160401b03811115610158576101586100a7565b61016c8161016684546100bb565b846100f3565b6020601f82116001811461019e575f83156101875750848201515b5f19600385901b1c1916600184901b178455610137565b5f84815260208120601f198516915b828110156101cd57878501518255602094850194600190920191016101ad565b50848210156101ea57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b60805160a05161141b61022f5f395f81816102d9015281816104aa0152818161062e015261070701525f6102b2015261141b5ff3fe608060405234801561000f575f80fd5b506004361061013d575f3560e01c806395d89b41116100b4578063a9059cbb11610079578063a9059cbb1461029a578063b07b4e37146102ad578063b0df4cab146102d4578063c4d66de8146102fb578063dd62ed3e1461030e578063eb5710d814610321575f80fd5b806395d89b41146102515780639711715a14610259578063981b24d0146102615780639dc29fac14610274578063a457c2d714610287575f80fd5b8063313ce56711610105578063313ce567146101cc57806339509351146101e657806340c10f19146101f95780634ee2cd7e1461020e5780635439ad861461022157806370a0823114610229575f80fd5b806306fdde0314610141578063095ea7b31461015f57806318160ddd1461018257806321df0da71461019457806323b872dd146101b9575b5f80fd5b610149610340565b6040516101569190611116565b60405180910390f35b61017261016d366004611161565b6103d2565b6040519015158152602001610156565b6002545b604051908152602001610156565b6009546001600160a01b03165b6040516001600160a01b039091168152602001610156565b6101726101c7366004611189565b6103eb565b6101d461040e565b60405160ff9091168152602001610156565b6101726101f4366004611161565b61047e565b61020c610207366004611161565b61049f565b005b61018661021c366004611161565b6104fe565b610186610555565b6101866102373660046111c3565b6001600160a01b03165f9081526020819052604090205490565b61014961055e565b6101866105dc565b61018661026f3660046111dc565b6105fa565b61020c610282366004611161565b610623565b610172610295366004611161565b610675565b6101726102a8366004611161565b6106ef565b6101a17f000000000000000000000000000000000000000000000000000000000000000081565b6101a17f000000000000000000000000000000000000000000000000000000000000000081565b61020c6103093660046111c3565b6106fc565b61018661031c3660046111f3565b610803565b61018661032f3660046111dc565b5f908152600a602052604090205490565b600954604080516306fdde0360e01b815290516060926001600160a01b0316916306fdde03916004808301925f9291908290030181865afa158015610387573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526103ae9190810190611238565b6040516020016103be9190611302565b604051602081830303815290604052905090565b5f336103df81858561082d565b60019150505b92915050565b5f336103f8858285610951565b6104038585856109c9565b506001949350505050565b6009546040805163313ce56760e01b815290515f926001600160a01b03169163313ce5679160048083019260209291908290030181865afa158015610455573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610479919061131d565b905090565b5f336103df8185856104908383610803565b61049a9190611351565b61082d565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104f05760405162461bcd60e51b81526004016104e790611364565b60405180910390fd5b6104fa8282610b76565b5050565b6001600160a01b0382165f90815260056020526040812081908190610524908590610c3e565b915091508161054a576001600160a01b0385165f9081526020819052604090205461054c565b805b95945050505050565b5f610479610d2e565b600954604080516395d89b4160e01b815290516060926001600160a01b0316916395d89b41916004808301925f9291908290030181865afa1580156105a5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105cc9190810190611238565b6040516020016103be9190611389565b5f6105e5610d38565b5f818152600a60205260409020429055919050565b5f805f610608846006610c3e565b91509150816106195760025461061b565b805b949350505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461066b5760405162461bcd60e51b81526004016104e790611364565b6104fa8282610d90565b5f33816106828286610803565b9050838110156106e25760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104e7565b610403828686840361082d565b5f336103df8185856109c9565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107445760405162461bcd60e51b81526004016104e790611364565b6009546001600160a01b0316156107935760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b60448201526064016104e7565b6001600160a01b0381166107e15760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b60448201526064016104e7565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661088f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104e7565b6001600160a01b0382166108f05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104e7565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b5f61095c8484610803565b90505f1981146109c357818110156109b65760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104e7565b6109c3848484840361082d565b50505050565b6001600160a01b038316610a2d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104e7565b6001600160a01b038216610a8f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104e7565b610a9a838383610ec8565b6001600160a01b0383165f9081526020819052604090205481811015610b115760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104e7565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36109c3565b6001600160a01b038216610bcc5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104e7565b610bd75f8383610ec8565b8060025f828254610be89190611351565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b5f805f8411610c885760405162461bcd60e51b815260206004820152601660248201527504552433230536e617073686f743a20696420697320360541b60448201526064016104e7565b610c90610d2e565b841115610cdf5760405162461bcd60e51b815260206004820152601d60248201527f4552433230536e617073686f743a206e6f6e6578697374656e7420696400000060448201526064016104e7565b5f610cea8486610f35565b84549091508103610d01575f809250925050610d27565b6001846001018281548110610d1857610d1861139f565b905f5260205f20015492509250505b9250929050565b5f61047960085490565b5f610d47600880546001019055565b5f610d50610d2e565b90507f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb6781604051610d8391815260200190565b60405180910390a1919050565b6001600160a01b038216610df05760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104e7565b610dfb825f83610ec8565b6001600160a01b0382165f9081526020819052604090205481811015610e6e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104e7565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610944565b505050565b610ed3838383610fdb565b6001600160a01b03831615801590610ef357506001600160a01b03821615155b15610ec35760405162461bcd60e51b8152602060048201526012602482015271151c985b9cd9995c9cc8191a5cd8589b195960721b60448201526064016104e7565b81545f908103610f4657505f6103e5565b82545f905b80821015610f90575f610f5e8383611023565b5f8781526020902090915085908201541115610f7c57809150610f8a565b610f87816001611351565b92505b50610f4b565b5f82118015610fba575083610fb786610faa6001866113b3565b5f91825260209091200190565b54145b15610fd357610fca6001836113b3565b925050506103e5565b5090506103e5565b6001600160a01b038316610ffa57610ff282611044565b610ec3611078565b6001600160a01b03821661101157610ff283611044565b61101a83611044565b610ec382611044565b5f61103160028484186113c6565b61103d90848416611351565b9392505050565b6001600160a01b0381165f90815260056020908152604080832091839052909120546110759190611088565b611088565b50565b611086600661107060025490565b565b5f611091610d2e565b90508061109d846110d0565b1015610ec3578254600180820185555f858152602080822090930193909355938401805494850181558252902090910155565b80545f9081036110e157505f919050565b815482906110f1906001906113b3565b815481106111015761110161139f565b905f5260205f2001549050919050565b919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b0381168114611111575f80fd5b5f8060408385031215611172575f80fd5b61117b8361114b565b946020939093013593505050565b5f805f6060848603121561119b575f80fd5b6111a48461114b565b92506111b26020850161114b565b929592945050506040919091013590565b5f602082840312156111d3575f80fd5b61103d8261114b565b5f602082840312156111ec575f80fd5b5035919050565b5f8060408385031215611204575f80fd5b61120d8361114b565b915061121b6020840161114b565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215611248575f80fd5b815167ffffffffffffffff81111561125e575f80fd5b8201601f8101841361126e575f80fd5b805167ffffffffffffffff81111561128857611288611224565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156112b7576112b7611224565b6040528181528282016020018610156112ce575f80fd5b8160208401602083015e5f91810160200191909152949350505050565b5f81518060208401855e5f93019283525090919050565b66029ba30b5b2b2160cd1b81525f61103d60078301846112eb565b5f6020828403121561132d575f80fd5b815160ff8116811461103d575f80fd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156103e5576103e561133d565b6020808252600b908201526a27b7363c9029ba30b5b2b960a91b604082015260600190565b611cdd60f21b81525f61103d60028301846112eb565b634e487b7160e01b5f52603260045260245ffd5b818103818111156103e5576103e561133d565b5f826113e057634e487b7160e01b5f52601260045260245ffd5b50049056fea26469706673582212209834592fe3a5581f38416327cafd8cffbffd2a22dbba611e92d949b2e8b71fc764736f6c634300081a00330000000000000000000000007c4299647e3fbd9f7f40a2b39372fedd7ced3f4d