1 tx
5 calls
constructor
constructor(address _owner, address _rewardsToken, address _stakingToken, address _rewardsTokenRateAggregator)
functions
allowance
viewfunction allowance(address owner, address spender) view returns (uint256)
balanceOf
viewfunction balanceOf(address account) view returns (uint256)
decimals
viewfunction decimals() view returns (uint8)
earned
viewfunction earned(address account) view returns (uint256)
getRewardForDuration
viewfunction getRewardForDuration() view returns (uint256)
isWhitelisted
viewfunction isWhitelisted(address account) view returns (bool)
lastUpdateTime
viewfunction lastUpdateTime() view returns (uint256)
name
viewfunction name() view returns (string)
owner
viewfunction owner() view returns (address)
paused
viewfunction paused() view returns (bool)
rewardPerToken
viewfunction rewardPerToken() view returns (uint256)
rewardPerTokenStored
viewfunction rewardPerTokenStored() view returns (uint256)
rewardRate
viewfunction rewardRate() view returns (uint256)
rewards
viewfunction rewards(address) view returns (uint256)
rewardsAvailableDate
viewfunction rewardsAvailableDate() view returns (uint256)
rewardsToken
viewfunction rewardsToken() view returns (address)
rewardsTokenRateAggregator
viewfunction rewardsTokenRateAggregator() view returns (address)
rewardsTokenRateDecimals
viewfunction rewardsTokenRateDecimals() view returns (uint256)
stakingToken
viewfunction stakingToken() view returns (address)
symbol
viewfunction symbol() view returns (string)
targetRewardApy
viewfunction targetRewardApy() view returns (uint256)
totalSupply
viewfunction totalSupply() view returns (uint256)
userRewardPerTokenPaid
viewfunction userRewardPerTokenPaid(address) view returns (uint256)
whitelist
viewfunction whitelist(address) view returns (bool)
addToWhitelist
nonpayablefunction addToWhitelist(address account)
approve
nonpayablefunction approve(address spender, uint256 value) returns (bool)
exit
nonpayablefunction exit()
getReward
nonpayablefunction getReward()
pause
nonpayablefunction pause()
rebalance
nonpayablefunction rebalance()
reclaim
nonpayablefunction reclaim()
recoverERC20
nonpayablefunction recoverERC20(address tokenAddress, uint256 tokenAmount)
releaseRewards
nonpayablefunction releaseRewards()
removeFromWhitelist
nonpayablefunction removeFromWhitelist(address account)
renounceOwnership
nonpayablefunction renounceOwnership()
setRewardYieldForYear
nonpayablefunction setRewardYieldForYear(uint256 rewardApy)
stake
nonpayablefunction stake(uint256 amount)
supplyRewards
nonpayablefunction supplyRewards(uint256 reward)
transfer
nonpayablefunction transfer(address to, uint256 value) returns (bool)
transferFrom
nonpayablefunction transferFrom(address from, address to, uint256 value) returns (bool)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
unpause
nonpayablefunction unpause()
withdraw
nonpayablefunction withdraw(uint256 amount)
events
Approval
event Approval(address indexed owner, address indexed spender, uint256 value)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
Paused
event Paused(address account)
Recovered
event Recovered(address token, uint256 amount)
RewardAdded
event RewardAdded(uint256 reward)
RewardPaid
event RewardPaid(address indexed user, uint256 reward)
RewardsMadeAvailable
event RewardsMadeAvailable(uint256 timestampAvailable)
RewardYieldSet
event RewardYieldSet(uint256 apy)
Staked
event Staked(address indexed user, uint256 amount)
Transfer
event Transfer(address indexed from, address indexed to, uint256 value)
Unpaused
event Unpaused(address account)
WhitelistAdded
event WhitelistAdded(address indexed account)
WhitelistRemoved
event WhitelistRemoved(address indexed account)
Withdrawn
event Withdrawn(address indexed user, uint256 amount)
errors
CannotStakeZero
error CannotStakeZero()
CannotWithdrawStakingToken
error CannotWithdrawStakingToken(address attemptedToken)
CannotWithdrawZero
error CannotWithdrawZero()
EnforcedPause
error EnforcedPause()
ERC20InsufficientAllowance
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed)
ERC20InsufficientBalance
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed)
ERC20InvalidApprover
error ERC20InvalidApprover(address approver)
ERC20InvalidReceiver
error ERC20InvalidReceiver(address receiver)
ERC20InvalidSender
error ERC20InvalidSender(address sender)
ERC20InvalidSpender
error ERC20InvalidSpender(address spender)
ExpectedPause
error ExpectedPause()
InvalidPriceFeed
error InvalidPriceFeed(uint256 updateTime, int256 currentRewardTokenRate)
NotEnoughRewards
error NotEnoughRewards(uint256 available, uint256 required)
NotWhitelisted
error NotWhitelisted(address account)
OwnableInvalidOwner
error OwnableInvalidOwner(address owner)
OwnableUnauthorizedAccount
error OwnableUnauthorizedAccount(address account)
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
RewardsNotAvailableYet
error RewardsNotAvailableYet(uint256 currentTime, uint256 availableTime)
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
creation bytecode
0x6101006040525f6008555f600955348015610018575f5ffd5b50604051613ed4380380613ed4833981810160405281019061003a91906103a6565b836040518060400160405280601381526020017f46697865645374616b696e6752657761726473000000000000000000000000008152506040518060400160405280600381526020017f465352000000000000000000000000000000000000000000000000000000000081525081600390816100b69190610647565b5080600490816100c69190610647565b50505060016006819055505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610141575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016101389190610725565b60405180910390fd5b6101508161028560201b60201c565b508273ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505060c05173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610238573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061025c9190610774565b60ff1660e081815250506301e133804261027691906107cc565b600c81905550505050506107ff565b5f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6103758261034c565b9050919050565b6103858161036b565b811461038f575f5ffd5b50565b5f815190506103a08161037c565b92915050565b5f5f5f5f608085870312156103be576103bd610348565b5b5f6103cb87828801610392565b94505060206103dc87828801610392565b93505060406103ed87828801610392565b92505060606103fe87828801610392565b91505092959194509250565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061048557607f821691505b60208210810361049857610497610441565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026104fa7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826104bf565b61050486836104bf565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61054861054361053e8461051c565b610525565b61051c565b9050919050565b5f819050919050565b6105618361052e565b61057561056d8261054f565b8484546104cb565b825550505050565b5f5f905090565b61058c61057d565b610597818484610558565b505050565b5b818110156105ba576105af5f82610584565b60018101905061059d565b5050565b601f8211156105ff576105d08161049e565b6105d9846104b0565b810160208510156105e8578190505b6105fc6105f4856104b0565b83018261059c565b50505b505050565b5f82821c905092915050565b5f61061f5f1984600802610604565b1980831691505092915050565b5f6106378383610610565b9150826002028217905092915050565b6106508261040a565b67ffffffffffffffff81111561066957610668610414565b5b610673825461046e565b61067e8282856105be565b5f60209050601f8311600181146106af575f841561069d578287015190505b6106a7858261062c565b86555061070e565b601f1984166106bd8661049e565b5f5b828110156106e4578489015182556001820191506020850194506020810190506106bf565b8683101561070157848901516106fd601f891682610610565b8355505b6001600288020188555050505b505050505050565b61071f8161036b565b82525050565b5f6020820190506107385f830184610716565b92915050565b5f60ff82169050919050565b6107538161073e565b811461075d575f5ffd5b50565b5f8151905061076e8161074a565b92915050565b5f6020828403121561078957610788610348565b5b5f61079684828501610760565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6107d68261051c565b91506107e18361051c565b92508282019050808211156107f9576107f861079f565b5b92915050565b60805160a05160c05160e05161365561087f5f395f8181611e6001526120af01525f818161125a0152611faa01525f8181610e4a015281816112d6015281816115050152611b0401525f8181610b3d015281816111920152818161140b015281816114a30152818161197f01528181611a1e0152611c6301526136555ff3fe608060405234801561000f575f5ffd5b5060043610610266575f3560e01c80637d7c2a1c1161014f578063b1fff635116100c1578063dd62ed3e11610085578063dd62ed3e146106ca578063df136d65146106fa578063e43252d714610718578063e9fad8ee14610734578063ef8a81061461073e578063f2fde38b1461075c57610266565b8063b1fff63514610648578063c8f33c9114610666578063cd3daf9d14610684578063d0fab3ca146106a2578063d1af0c7d146106ac57610266565b80638b876347116101135780638b876347146105605780638da5cb5b1461059057806395d89b41146105ae5780639b19251a146105cc578063a694fc3a146105fc578063a9059cbb1461061857610266565b80637d7c2a1c1461050a57806380e9071b146105145780638456cb591461051e5780638980f11f146105285780638ab1d6811461054457610266565b80632e1a7d4d116101e85780635c975abb116101ac5780635c975abb146104585780635eac3aea1461047657806370a0823114610494578063715018a6146104c457806372f702f3146104ce5780637b0a47ee146104ec57610266565b80632e1a7d4d146103da578063313ce567146103f65780633af32abf146104145780633d18b912146104445780633f4ba83a1461044e57610266565b8063166389bd1161022f578063166389bd1461033657806318160ddd146103525780631c1f78eb146103705780632377b2a81461038e57806323b872dd146103aa57610266565b80628cc2621461026a578063013e9dd41461029a57806306fdde03146102b85780630700037d146102d6578063095ea7b314610306575b5f5ffd5b610284600480360381019061027f9190612db9565b610778565b6040516102919190612dfc565b60405180910390f35b6102a261083e565b6040516102af9190612dfc565b60405180910390f35b6102c0610844565b6040516102cd9190612e85565b60405180910390f35b6102f060048036038101906102eb9190612db9565b6108d4565b6040516102fd9190612dfc565b60405180910390f35b610320600480360381019061031b9190612ecf565b6108e9565b60405161032d9190612f27565b60405180910390f35b610350600480360381019061034b9190612f40565b61090b565b005b61035a610a35565b6040516103679190612dfc565b60405180910390f35b610378610a3e565b6040516103859190612dfc565b60405180910390f35b6103a860048036038101906103a39190612f40565b610a55565b005b6103c460048036038101906103bf9190612f6b565b610bbd565b6040516103d19190612f27565b60405180910390f35b6103f460048036038101906103ef9190612f40565b610beb565b005b6103fe610ee8565b60405161040b9190612fd6565b60405180910390f35b61042e60048036038101906104299190612db9565b610ef0565b60405161043b9190612f27565b60405180910390f35b61044c610f42565b005b610456611231565b005b610460611243565b60405161046d9190612f27565b60405180910390f35b61047e611258565b60405161048b919061304a565b60405180910390f35b6104ae60048036038101906104a99190612db9565b61127c565b6040516104bb9190612dfc565b60405180910390f35b6104cc6112c1565b005b6104d66112d4565b6040516104e39190613083565b60405180910390f35b6104f46112f8565b6040516105019190612dfc565b60405180910390f35b6105126112fe565b005b61051c6113e1565b005b6105266114e9565b005b610542600480360381019061053d9190612ecf565b6114fb565b005b61055e60048036038101906105599190612db9565b611602565b005b61057a60048036038101906105759190612db9565b6116a4565b6040516105879190612dfc565b60405180910390f35b6105986116b9565b6040516105a591906130ab565b60405180910390f35b6105b66116e1565b6040516105c39190612e85565b60405180910390f35b6105e660048036038101906105e19190612db9565b611771565b6040516105f39190612f27565b60405180910390f35b61061660048036038101906106119190612f40565b61178e565b005b610632600480360381019061062d9190612ecf565b611ba4565b60405161063f9190612f27565b60405180910390f35b610650611bc6565b60405161065d9190612dfc565b60405180910390f35b61066e611bcc565b60405161067b9190612dfc565b60405180910390f35b61068c611bd2565b6040516106999190612dfc565b60405180910390f35b6106aa611c19565b005b6106b4611c61565b6040516106c19190613083565b60405180910390f35b6106e460048036038101906106df91906130c4565b611c85565b6040516106f19190612dfc565b60405180910390f35b610702611d07565b60405161070f9190612dfc565b60405180910390f35b610732600480360381019061072d9190612db9565b611d0d565b005b61073c611db0565b005b610746611e5e565b6040516107539190612dfc565b60405180910390f35b61077660048036038101906107719190612db9565b611e82565b005b5f600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054670de0b6b3a7640000600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610806611bd2565b610810919061312f565b6108198561127c565b6108239190613162565b61082d91906131d0565b6108379190613200565b9050919050565b600c5481565b60606003805461085390613260565b80601f016020809104026020016040519081016040528092919081815260200182805461087f90613260565b80156108ca5780601f106108a1576101008083540402835291602001916108ca565b820191905f5260205f20905b8154815290600101906020018083116108ad57829003601f168201915b5050505050905090565b600e602052805f5260405f205f915090505481565b5f5f6108f3611f06565b9050610900818585611f0d565b600191505092915050565b610913611f1f565b5f61091c611bd2565b600b8190555042600a819055505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109eb5761096581610778565b600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550600b54600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b816008819055506109fa611fa6565b7f2d079d959082c236f32b99b2f3d3cb8677b13df3f5043cf7853588901036765282604051610a299190612dfc565b60405180910390a15050565b5f600254905090565b5f62127500600954610a509190613162565b905090565b610a5d611f1f565b5f610a66611bd2565b600b8190555042600a819055505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b3557610aaf81610778565b600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550600b54600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b610b823330847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612125909392919063ffffffff16565b7fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d82604051610bb19190612dfc565b60405180910390a15050565b5f5f610bc7611f06565b9050610bd48582856121a7565b610bdf85858561223a565b60019150509392505050565b610bf361232a565b33610bfc611bd2565b600b8190555042600a819055505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ccb57610c4581610778565b600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550600b54600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16610d5657336040517fdf17e316000000000000000000000000000000000000000000000000000000008152600401610d4d91906130ab565b60405180910390fd5b610d5e612370565b600c54421015610da95742600c546040517fbfae9338000000000000000000000000000000000000000000000000000000008152600401610da0929190613290565b60405180910390fd5b5f8203610de2576040517fc377136000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16637d7c2a1c6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610e27575f5ffd5b505af1925050508015610e38575060015b50610e4333836123b1565b610e8e33837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166124309092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d583604051610ed49190612dfc565b60405180910390a250610ee56124af565b50565b5f6012905090565b5f600f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b610f4a61232a565b33610f53611bd2565b600b8190555042600a819055505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461102257610f9c81610778565b600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550600b54600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166110ad57336040517fdf17e3160000000000000000000000000000000000000000000000000000000081526004016110a491906130ab565b60405180910390fd5b6110b5612370565b600c544210156111005742600c546040517fbfae93380000000000000000000000000000000000000000000000000000000081526004016110f7929190613290565b60405180910390fd5b5f600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f811115611225575f600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506111d633827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166124309092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e04868260405161121c9190612dfc565b60405180910390a25b505061122f6124af565b565b611239611f1f565b6112416124b9565b565b5f60055f9054906101000a900460ff16905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6112c9611f1f565b6112d25f61251a565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b60095481565b5f611307611bd2565b600b8190555042600a819055505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146113d65761135081610778565b600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550600b54600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b6113de611fa6565b50565b6113e9611f1f565b42600c819055505f6008819055505f6009819055506114e76114096116b9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161146291906130ab565b602060405180830381865afa15801561147d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114a191906132cb565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166124309092919063ffffffff16565b565b6114f1611f1f565b6114f96125dd565b565b611503611f1f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361159357816040517f6659d08300000000000000000000000000000000000000000000000000000000815260040161158a91906130ab565b60405180910390fd5b6115c561159e6116b9565b828473ffffffffffffffffffffffffffffffffffffffff166124309092919063ffffffff16565b7f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa2882826040516115f69291906132f6565b60405180910390a15050565b61160a611f1f565b5f600f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167fde8cf212af7ce38b2840785a2768d97ff2dbf3c21b516961cec0061e134c2a1e60405160405180910390a250565b600d602052805f5260405f205f915090505481565b5f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546116f090613260565b80601f016020809104026020016040519081016040528092919081815260200182805461171c90613260565b80156117675780601f1061173e57610100808354040283529160200191611767565b820191905f5260205f20905b81548152906001019060200180831161174a57829003601f168201915b5050505050905090565b600f602052805f5260405f205f915054906101000a900460ff1681565b61179661232a565b3361179f611bd2565b600b8190555042600a819055505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461186e576117e881610778565b600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550600b54600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166118f957336040517fdf17e3160000000000000000000000000000000000000000000000000000000081526004016118f091906130ab565b60405180910390fd5b611901612370565b5f820361193a576040517f6a76ff9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611942611fa6565b5f670de0b6b3a7640000611954610a3e565b8461195d610a35565b6119679190613200565b6119719190613162565b61197b91906131d0565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016119d691906130ab565b602060405180830381865afa1580156119f1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a1591906132cb565b811115611af2577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a7591906130ab565b602060405180830381865afa158015611a90573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ab491906132cb565b816040517fe28fc21b000000000000000000000000000000000000000000000000000000008152600401611ae9929190613290565b60405180910390fd5b611afc338461263f565b611b493330857f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612125909392919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d84604051611b8f9190612dfc565b60405180910390a25050611ba16124af565b50565b5f5f611bae611f06565b9050611bbb81858561223a565b600191505092915050565b60085481565b600a5481565b5f5f611bdc610a35565b03611beb57600b549050611c16565b600954600a5442611bfc919061312f565b611c069190613162565b600b54611c139190613200565b90505b90565b611c21611f1f565b42600c819055507fb1f66464dbcdff719b019d202c2f522fe22df6b88ad534b702917f068907138442604051611c579190612dfc565b60405180910390a1565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b600b5481565b611d15611f1f565b6001600f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f4790a4adb426ca2345bb5108f6e454eae852a7bf687544cd66a7270dff3a41d660405160405180910390a250565b600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611e3b57336040517fdf17e316000000000000000000000000000000000000000000000000000000008152600401611e3291906130ab565b60405180910390fd5b611e43612370565b611e54611e4f3361127c565b610beb565b611e5c610f42565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b611e8a611f1f565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611efa575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611ef191906130ab565b60405180910390fd5b611f038161251a565b50565b5f33905090565b611f1a83838360016126be565b505050565b611f27611f06565b73ffffffffffffffffffffffffffffffffffffffff16611f456116b9565b73ffffffffffffffffffffffffffffffffffffffff1614611fa457611f68611f06565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611f9b91906130ab565b60405180910390fd5b565b5f5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015612011573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612035919061338f565b509350509250505f8214806120645750610e106201518042612057919061312f565b612061919061312f565b81105b156120a85780826040517f30bd298700000000000000000000000000000000000000000000000000000000815260040161209f929190613415565b60405180910390fd5b6301e133807f000000000000000000000000000000000000000000000000000000000000000060126120da919061312f565b600a6120e6919061356b565b836120f19190613162565b670de0b6b3a76400006008546121079190613162565b61211191906131d0565b61211b91906131d0565b6009819055505050565b6121a1848573ffffffffffffffffffffffffffffffffffffffff166323b872dd86868660405160240161215a939291906135b5565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061288d565b50505050565b5f6121b28484611c85565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156122345781811015612225578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161221c939291906135ea565b60405180910390fd5b61223384848484035f6126be565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036122aa575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016122a191906130ab565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361231a575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161231191906130ab565b60405180910390fd5b612325838383612928565b505050565b600260065403612366576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600681905550565b612378611243565b156123af576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612421575f6040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040161241891906130ab565b60405180910390fd5b61242c825f83612928565b5050565b6124aa838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040516024016124639291906132f6565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061288d565b505050565b6001600681905550565b6124c1612aea565b5f60055f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612503611f06565b60405161251091906130ab565b60405180910390a1565b5f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6125e5612370565b600160055f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612628611f06565b60405161263591906130ab565b60405180910390a1565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126af575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016126a691906130ab565b60405180910390fd5b6126ba5f8383612928565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361272e575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161272591906130ab565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361279e575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040161279591906130ab565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015612887578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161287e9190612dfc565b60405180910390a35b50505050565b5f5f60205f8451602086015f885af1806128ac576040513d5f823e3d81fd5b3d92505f519150505f82146128c55760018114156128e0565b5f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561292257836040517f5274afe700000000000000000000000000000000000000000000000000000000815260040161291991906130ab565b60405180910390fd5b50505050565b82612931611bd2565b600b8190555042600a819055505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612a005761297a81610778565b600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550600b54600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b82612a09611bd2565b600b8190555042600a819055505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612ad857612a5281610778565b600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550600b54600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b612ae3858585612b2a565b5050505050565b612af2611243565b612b28576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b612b32612370565b612b3d838383612b42565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612b92578060025f828254612b869190613200565b92505081905550612c60565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612c1b578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401612c12939291906135ea565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ca7578060025f8282540392505081905550612cf1565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612d4e9190612dfc565b60405180910390a3505050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612d8882612d5f565b9050919050565b612d9881612d7e565b8114612da2575f5ffd5b50565b5f81359050612db381612d8f565b92915050565b5f60208284031215612dce57612dcd612d5b565b5b5f612ddb84828501612da5565b91505092915050565b5f819050919050565b612df681612de4565b82525050565b5f602082019050612e0f5f830184612ded565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f612e5782612e15565b612e618185612e1f565b9350612e71818560208601612e2f565b612e7a81612e3d565b840191505092915050565b5f6020820190508181035f830152612e9d8184612e4d565b905092915050565b612eae81612de4565b8114612eb8575f5ffd5b50565b5f81359050612ec981612ea5565b92915050565b5f5f60408385031215612ee557612ee4612d5b565b5b5f612ef285828601612da5565b9250506020612f0385828601612ebb565b9150509250929050565b5f8115159050919050565b612f2181612f0d565b82525050565b5f602082019050612f3a5f830184612f18565b92915050565b5f60208284031215612f5557612f54612d5b565b5b5f612f6284828501612ebb565b91505092915050565b5f5f5f60608486031215612f8257612f81612d5b565b5b5f612f8f86828701612da5565b9350506020612fa086828701612da5565b9250506040612fb186828701612ebb565b9150509250925092565b5f60ff82169050919050565b612fd081612fbb565b82525050565b5f602082019050612fe95f830184612fc7565b92915050565b5f819050919050565b5f61301261300d61300884612d5f565b612fef565b612d5f565b9050919050565b5f61302382612ff8565b9050919050565b5f61303482613019565b9050919050565b6130448161302a565b82525050565b5f60208201905061305d5f83018461303b565b92915050565b5f61306d82613019565b9050919050565b61307d81613063565b82525050565b5f6020820190506130965f830184613074565b92915050565b6130a581612d7e565b82525050565b5f6020820190506130be5f83018461309c565b92915050565b5f5f604083850312156130da576130d9612d5b565b5b5f6130e785828601612da5565b92505060206130f885828601612da5565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61313982612de4565b915061314483612de4565b925082820390508181111561315c5761315b613102565b5b92915050565b5f61316c82612de4565b915061317783612de4565b925082820261318581612de4565b9150828204841483151761319c5761319b613102565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6131da82612de4565b91506131e583612de4565b9250826131f5576131f46131a3565b5b828204905092915050565b5f61320a82612de4565b915061321583612de4565b925082820190508082111561322d5761322c613102565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061327757607f821691505b60208210810361328a57613289613233565b5b50919050565b5f6040820190506132a35f830185612ded565b6132b06020830184612ded565b9392505050565b5f815190506132c581612ea5565b92915050565b5f602082840312156132e0576132df612d5b565b5b5f6132ed848285016132b7565b91505092915050565b5f6040820190506133095f83018561309c565b6133166020830184612ded565b9392505050565b5f69ffffffffffffffffffff82169050919050565b61333b8161331d565b8114613345575f5ffd5b50565b5f8151905061335681613332565b92915050565b5f819050919050565b61336e8161335c565b8114613378575f5ffd5b50565b5f8151905061338981613365565b92915050565b5f5f5f5f5f60a086880312156133a8576133a7612d5b565b5b5f6133b588828901613348565b95505060206133c68882890161337b565b94505060406133d7888289016132b7565b93505060606133e8888289016132b7565b92505060806133f988828901613348565b9150509295509295909350565b61340f8161335c565b82525050565b5f6040820190506134285f830185612ded565b6134356020830184613406565b9392505050565b5f8160011c9050919050565b5f5f8291508390505b60018511156134915780860481111561346d5761346c613102565b5b600185161561347c5780820291505b808102905061348a8561343c565b9450613451565b94509492505050565b5f826134a95760019050613564565b816134b6575f9050613564565b81600181146134cc57600281146134d657613505565b6001915050613564565b60ff8411156134e8576134e7613102565b5b8360020a9150848211156134ff576134fe613102565b5b50613564565b5060208310610133831016604e8410600b841016171561353a5782820a90508381111561353557613534613102565b5b613564565b6135478484846001613448565b9250905081840481111561355e5761355d613102565b5b81810290505b9392505050565b5f61357582612de4565b915061358083612de4565b92506135ad7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461349a565b905092915050565b5f6060820190506135c85f83018661309c565b6135d5602083018561309c565b6135e26040830184612ded565b949350505050565b5f6060820190506135fd5f83018661309c565b61360a6020830185612ded565b6136176040830184612ded565b94935050505056fea26469706673582212207315f4b86ff99617ecce8c8f8bb527f2b1ed2ddce77a3626c14994f53ab9b6f964736f6c634300081e0033000000000000000000000000eb3107117fead7de89cd14d463d340a2e6917769000000000000000000000000c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f00000000000000000000000057ab1ec28d129707052df4df418d58a2d46d5f51000000000000000000000000dc3ea94cd0ac27d9a86c180091e7f78c683d3699